egman24
12/19/2015 - 6:39 PM

static_buttons.js

/////////////////////
// assign buttons ///
/////////////////////

var ASSIGN_BUTTONS = (function(){
  var assignKeys = (function(){
    var handles = {
      assignKeysButtons: 'assign-keys'
    };

    return function(config){
      var formats = {
        'handle': handles[config.handle],
        'class': "." + handles[config.handle],
        '$': $("." + handles[config.handle]),
        'getElement': document.getElementsByClassName(handles[config.handle]),
        'clicks$': Rx.Observable.fromEvent($("." + handles[config.handle]), 'click')
      };

      return formats[config.format];
    }
  }());

  Rx.DOM.ready().subscribe(function(){
    assignKeys({ handle: 'assignKeysButtons', format: 'clicks$' })
        .map(function(event){ return $(event.target).data('name'); })
        .tap(function(productName){ DATA.access({ source: 'assignContext', method: 'update', params: { productName: productName } }) })
        .tap(function(productName){ ACTIONS.publish({ message: 'productPage::showAssignKeysModal', data: { keysToAssign: 1 } }) })
        .subscribe();
  });
}());

///////////////////
// list section ///
///////////////////

var ListSection = React.createClass({
  componentDidMount: function(){
    var frameDOM = $(React.findDOMNode(this)).contents();

    console.log(frameDOM)
  },
  render: function(){
    return <div className="ui raised segment">
      <div id="users">
        {/*
          <div className="ui input">
            <input className="search" type="text" placeholder="Search">
          </div>
          <button className="ui button sort" data-sort="product-name">Sort by name</button>
        */}
        <div className="ui middle aligned divided list"></div>
      </div>
    </div>;
  }
});

React.render(<ListSection />, document.getElementById('list-section-mount'));

var LIST_DISPLAY = (function(){

  var options = {
    valueNames: [ 'product-name' ],
    item: '<div class="ui segment">'+
    '<div class="ui grid">'+
    '<div class="two wide column product-image-section" style="background-size: cover; background-repeat: no-repeat; background-position: center center; cursor:pointer;"></div>'+
    '<div class="fourteen wide column product-action-section">' +
    '<div class="ui grid">'+
    '<div class="eight wide column product-title"><h3 class="product-name" style="cursor:pointer;"></h3></div>'+
    '<div class="eight wide column product-actions">'+
    '<button class="ui right floated button order-keys">Order More Keys</button>'+
    '<button class="ui blue right floated button assign-keys">Assign Keys <div class="ui active mini inline loader"></div></button>'+
    '</div>'+
    '<div class="sixteen wide column product-actions-buttons">'+
    '<div class="five ui basic buttons">'+
    '<button class="ui gray button state-filter-button list-filter-button-all">All <div class="ui active mini inline loader"></div></button>'+
    '<button class="ui gray button state-filter-button list-filter-button-assigned">Assigned <div class="ui active mini inline loader"></div></button>'+
    '<button class="ui gray button state-filter-button list-filter-button-progress">In Progress <div class="ui active mini inline loader"></div></button>'+
    '<button class="ui gray button state-filter-button list-filter-button-completed">Completed <div class="ui active mini inline loader"></div></button>'+
    '</div>'+
    '</div>'+
    '</div>'+
    '</div></div></div>'
    //item: '<div class="item"><div class="right floated content"><div class="ui button">Add</div></div><img class="ui avatar image" src="http://pngimg.com/upload/face_PNG5660.png"><div class="content"><h3 class="name"></h3><p class="born"></p></div></div>'
    //item: '<li><h3 class="name"></h3><p class="born"></p></li>'
  };

  var values = _.map(pageData.products, function(product){ return { 'product-name': product.name, 'product-id': product.id, 'product-image': product.background } });

  var userList = new List('users', options, values);

  userList.items.forEach(function(item){

    var DRAW_COUNTS = (function(){
      var drawCounts = function(){
        var product = item.values()['product-name'];
        var counts = DATA.access({ source: 'counts', method: 'get' })[product];
        var $assignKeysButton = $(item.elm).children().children('.product-action-section').children().children('.product-actions').children('.assign-keys');
        var $stateButtons = $(item.elm).children().children('.product-action-section').children().children('.product-actions-buttons').children().children();

        $assignKeysButton.html('Assign Keys (' + counts['available'] + ')').data('name', item.values()['product-name']);

        if(counts['available'] === 0){
          if(!$assignKeysButton.hasClass('disabled')){ $assignKeysButton.addClass('disabled') };
        } else {
          $assignKeysButton.removeClass('disabled');
        }

        $stateButtons.each(function(index, button){
          var $button = $(button);

          if($button.hasClass('list-filter-button-all')){ $button.html('All (' + counts['total'] + ')') }
          if($button.hasClass('list-filter-button-assigned')){ $button.html('Assigned (' + counts['assigned'] + ')') }
          if($button.hasClass('list-filter-button-progress')){ $button.html('In Progress (' + counts['activated'] + ')') }
          if($button.hasClass('list-filter-button-completed')){ $button.html('Completed (' + counts['completed'] + ')') }
        });
      };

      // initialize \\
      //TODO: remove with retries
      if(!R.isEmpty(DATA.access({ source: 'counts', method: 'get' }))){drawCounts();}

      // upkeep \\
      DATA.updates$
          .filter(function(payload){ return payload.message === 'keysUpdate' })
          .pluck('data')
          .filter(function(counts){ return R.compose(R.not, R.isEmpty)(counts) })
          .tap(drawCounts)
          .subscribe();

    }());

    var DRAW_IMAGES = (function(){
      var imageUrl = item.values()['product-image'];
      var $productImage = $(item.elm).children().children('.product-image-section');

      $productImage.css("background-image","url("+LOGIC.images.productImage(imageUrl)+")");
    }());

  });

  var pageTransition = function($button){
    $('.button').addClass('disabled');
    if($button){ $button.html('<div class="ui active mini inline loader"></div>') }
  };

  Rx.Observable.fromEvent($('.product-image-section'), 'click')
      .tap(function(event){ pageTransition(); })
      .map(function(event){ return { state: 'all', productTitle: $(event.target).parent().children('.product-action-section').children().children('.product-title').children('.product-name').html() } })
      .map(function(payload){ return R.compose(R.head, R.map(function(item){ return { state: 'all', id: item['product-id'], name: item['product-name'] } }), R.filter(function(items){ return items['product-name'] === payload.productTitle }), R.map(function(item){ return item.values() }))(userList.items) })
      .tap(function(payload){ ACTIONS.publish({ message: 'navigateToSingleProductPage', data: { state: payload.state, productId: payload.id, productName: payload.name } }) })
      .subscribe();

  Rx.Observable.fromEvent($('.product-name'), 'click')
      .tap(function(event){ pageTransition(); })
      .map(function(event){ return { state: 'all', productTitle: $(event.target).html() } })
      .map(function(payload){ return R.compose(R.head, R.map(function(item){ return { state: 'all', id: item['product-id'], name: item['product-name'] } }), R.filter(function(items){ return items['product-name'] === payload.productTitle }), R.map(function(item){ return item.values() }))(userList.items) })
      .tap(function(payload){ ACTIONS.publish({ message: 'navigateToSingleProductPage', data: { state: payload.state, productId: payload.id, productName: payload.name } }) })
      .subscribe();

  Rx.Observable.fromEvent($('.list-filter-button-all'), 'click')
      .tap(function(event){ pageTransition($(event.target)); })
      .map(function(event){ return { state: 'all', productTitle: $(event.target).parent().parent().siblings('.product-title').children().html() } })
      .map(function(payload){ return R.compose(R.head, R.map(function(item){ return { state: payload.state, id: item['product-id'], name: item['product-name'] } }), R.filter(function(items){ return items['product-name'] === payload.productTitle }), R.map(function(item){ return item.values() }))(userList.items) })
      .tap(function(payload){ ACTIONS.publish({ message: 'navigateToSingleProductPage', data: { state: payload.state, productId: payload.id, productName: payload.name } }) })
      .subscribe();

  Rx.Observable.fromEvent($('.list-filter-button-available'), 'click')
      .tap(function(event){ pageTransition($(event.target)); })
      .map(function(event){ return { state: 'available', productTitle: $(event.target).parent().parent().siblings('.product-title').children().html() } })
      .map(function(payload){ return R.compose(R.head, R.map(function(item){ return { state: payload.state, id: item['product-id'], name: item['product-name'] } }), R.filter(function(items){ return items['product-name'] === payload.productTitle }), R.map(function(item){ return item.values() }))(userList.items) })
      .tap(function(payload){ ACTIONS.publish({ message: 'navigateToSingleProductPage', data: { state: payload.state, productId: payload.id, productName: payload.name } }) })
      .subscribe();

  Rx.Observable.fromEvent($('.list-filter-button-assigned'), 'click')
      .tap(function(event){ pageTransition($(event.target)); })
      .map(function(event){ return { state: 'assigned', productTitle: $(event.target).parent().parent().siblings('.product-title').children().html() } })
      .map(function(payload){ return R.compose(R.head, R.map(function(item){ return { state: payload.state, id: item['product-id'], name: item['product-name'] } }), R.filter(function(items){ return items['product-name'] === payload.productTitle }), R.map(function(item){ return item.values() }))(userList.items) })
      .tap(function(payload){ ACTIONS.publish({ message: 'navigateToSingleProductPage', data: { state: payload.state, productId: payload.id, productName: payload.name } }) })
      .subscribe();

  Rx.Observable.fromEvent($('.list-filter-button-progress'), 'click')
      .tap(function(event){ pageTransition($(event.target)); })
      .map(function(event){ return { state: 'activated', productTitle: $(event.target).parent().parent().siblings('.product-title').children().html() } })
      .map(function(payload){ return R.compose(R.head, R.map(function(item){ return { state: payload.state, id: item['product-id'], name: item['product-name'] } }), R.filter(function(items){ return items['product-name'] === payload.productTitle }), R.map(function(item){ return item.values() }))(userList.items) })
      .tap(function(payload){ ACTIONS.publish({ message: 'navigateToSingleProductPage', data: { state: payload.state, productId: payload.id, productName: payload.name } }) })
      .subscribe();

  Rx.Observable.fromEvent($('.list-filter-button-completed'), 'click')
      .tap(function(event){ pageTransition($(event.target)); })
      .map(function(event){ return { state: 'completed', productTitle: $(event.target).parent().parent().siblings('.product-title').children().html() } })
      .map(function(payload){ return R.compose(R.head, R.map(function(item){ return { state: payload.state, id: item['product-id'], name: item['product-name'] } }), R.filter(function(items){ return items['product-name'] === payload.productTitle }), R.map(function(item){ return item.values() }))(userList.items) })
      .tap(function(payload){ ACTIONS.publish({ message: 'navigateToSingleProductPage', data: { state: payload.state, productId: payload.id, productName: payload.name } }) })
      .subscribe();

}());

///////////////////
// grid section ///
///////////////////

var GridSection = React.createClass({
  componentDidMount: function(){
    var frameDOM = $(React.findDOMNode(this)).contents();

    console.log(frameDOM)
  },
  render: function(){
    return <div className="ui raised segment">
      <div id="demo-grid" className="ui cards" height="100px;"></div>
    </div>;
  }
});

React.render(<GridSection />, document.getElementById('grid-section-mount'));

var GRID_DISPLAY = (function(){
  var demoGrid = $("#demo-grid");
  var grid = new Gridifier(demoGrid, {class: "grid-item"});

  var simulateDelayedAppends = function() {
    _.forEach(_.map(pageData.products, function(product){ return { name: product.name, id: product.id, image: product.background } }), function(product, i){
      var currentProduct = product;

      var gridItem = '<div class="card">' +
          '<div class="blurring dimmable image" ' +
          'style="background:url('+LOGIC.images.productImage(product.image)+') no-repeat center center; width:100%; height: 364px; background-size: cover;">' +
          '<div class="ui dimmer">' +
          '<div class="content">' +
          '<div class="center">' +
          '<button id="assign-keys-' + product.id + '" class="ui fluid button assign-keys" data-name="' + product.name + '">Assign Keys</button>'+
          '<button class="ui fluid button order-keys" style="margin-top:8px;">Order More Keys</button>'+

          '<div class="ui fluid selection dropdown" style="margin-top:8px;"><input class="ui left icon input" type="hidden" name="manage"><i class="setting icon"></i><i class="dropdown icon"></i><div class="default text">Manage</div><div class="menu">'+
          '<div id="all-keys-' + product.id + '" class="item" data-value="all">All</div>'+
          '<div id="assigned-keys-' + product.id + '" class="item" data-value="assigned">Assigned</div>'+
          '<div id="in-progress-keys-' + product.id + '" class="item" data-value="inProgress">In Progress</div>'+
          '<div id="completed-keys-' + product.id + '" class="item" data-value="completed">Completed</div>'+
          '</div></div>'+

          '</div>' +
          '</div>' +
          '</div>' +
          '</div>' +
          '<div class="content">'+
          '<div class="meta"><h2 class="ui">'+ product.name +'</h2></div></div>'+
          '</div>';

      demoGrid.append(gridItem);

      var DRAW_COUNTS = (function(){
        var product = currentProduct;
        var $assignKeysButton = $('#assign-keys-' + product.id);
        var $allButton = $('#all-keys-' + product.id);
        var $assignedButton = $('#assigned-keys-' + product.id);
        var $inProgressButton = $('#in-progress-keys-' + product.id);
        var $completedButton = $('#completed-keys-' + product.id);

        var drawCounts = function(){
          var counts = DATA.access({ source: 'counts', method: 'get' })[product.name];

          $assignKeysButton.html('Assign Keys (' + counts['available'] + ')');

          if(counts['available'] === 0){
            if(!$assignKeysButton.hasClass('disabled')){ $assignKeysButton.addClass('disabled') }
          } else {
            $assignKeysButton.removeClass('disabled');
          }

          $allButton.html('All (' + counts['total'] + ')');
          $assignedButton.html('Assigned (' + counts['assigned'] + ')');
          $inProgressButton.html('In Progress (' + counts['activated'] + ')');
          $completedButton.html('Completed (' + counts['completed'] + ')');
        };

        // initialize \\
        //TODO: remove with retries
        if(!R.isEmpty(DATA.access({ source: 'counts', method: 'get' }))){drawCounts();}

        // upkeep \\
        DATA.updates$
            .filter(function(payload){ return payload.message === 'keysUpdate' })
            .pluck('data')
            .filter(function(counts){ return R.compose(R.not, R.isEmpty)(counts) })
            .tap(drawCounts)
            .subscribe();

        var pageTransition = function($button){
          $button.html('<div class="ui active mini inline loader"></div>');
          $('.selection').addClass('disabled');
          $('.assign-keys').addClass('disabled');
          $('.order-keys').addClass('disabled');
        };

        Rx.Observable.fromEvent($allButton, 'click')
            .tap(function(event){ pageTransition($(event.target)); })
            .tap(function(){ ACTIONS.publish({ message: 'navigateToSingleProductPage', data: { state: 'all', productId: product.id, productName: product.name } }) })
            .subscribe();

        Rx.Observable.fromEvent($assignedButton, 'click')
            .tap(function(event){ pageTransition($(event.target)); })
            .tap(function(){ ACTIONS.publish({ message: 'navigateToSingleProductPage', data: { state: 'assigned', productId: product.id, productName: product.name } }) })
            .subscribe();

        Rx.Observable.fromEvent($inProgressButton, 'click')
            .tap(function(event){ pageTransition($(event.target)); })
            .tap(function(){ ACTIONS.publish({ message: 'navigateToSingleProductPage', data: { state: 'activated', productId: product.id, productName: product.name } }) })
            .subscribe();

        Rx.Observable.fromEvent($completedButton, 'click')
            .tap(function(event){ pageTransition($(event.target)); })
            .tap(function(){ ACTIONS.publish({ message: 'navigateToSingleProductPage', data: { state: 'completed', productId: product.id, productName: product.name } }) })
            .subscribe();
      }());

      (function(gridItem) {
        setTimeout(function(){
          //demoGrid.append(gridItem);
        }, i * 200);
      })(gridItem);
    });

    $('.card .image').dimmer({
      on: 'hover'
    });

  };

  var watchDemoGrid = function() {
    setTimeout(function() {
      // Alternatively, you can use a shorthand - grid.appendNew()
      grid.append(grid.collectNew());
      watchDemoGrid();
      $('.ui.dropdown').dropdown();
    }, 100);
  };

  simulateDelayedAppends();
  watchDemoGrid();
}());