programas.directive.js 3.72 KB
(function() {
  'use strict';

  angular
    .module('dialoga')
    .filter('filterByCategory', filterByCategory)
    .filter('filterByCriteria', filterByCriteria)
    .directive('programaList', programaList);

  /** @ngInject */
  function programaList() {

    /** @ngInject */
    function ProgramaListController($scope, $log) {
      $log.debug('ProgramaListController');

      // alias
      var vm = this;

      // dependencies
      vm.$scope = $scope;
      vm.$log = $log;

      // initialization
      vm.init();
    }

    ProgramaListController.prototype.init = function () {
      var vm = this;

      vm.query = null;
      vm.categoryFilter = null;
      vm.orderCriteries = [
      { label: 'Título', name: 'title' },
      { label: 'Tema', name: 'category' },
      { label: 'Mais participações', name: 'more_participants' }
      ];

      if(!vm.article){
        vm.$log.warn('no article to display. Tip: use a ng-if before use this directive');
        return;
      }

      vm.categories = vm.article.categories;
      vm.programs = vm.article.children;
      vm.filtredProgramList = [];
    };

    ProgramaListController.prototype.getIconClasses = function (category) {
      var vm = this;

      vm.$log.debug('[TODO] getIconClasses of category:', category);
      return 'glyphicon glyphicon-exclamation-sign';
    };

    ProgramaListController.prototype.filterByCategory = function (category) {
      var vm = this;

      if(category !== vm.categoryFilter){
        // selected new filter
        vm.categoryFilter = category;
      }else{
        // already selected. Unselect.
        vm.showAll();
      }
    };

    ProgramaListController.prototype.showAll = function () {
      var vm = this;

      vm.query = null;
      vm.categoryFilter = null;
      vm.$log.debug('[TODO] showAll, no filter? ', vm.categoryFilter);
    };

    // function ProgramaListLinker (scope, element, attrs) {

    //   scope.$watch('article', function(newValue, oldValue){
    //     if(!newValue){
    //       return;
    //     }
    //     scope.vm.categories = scope.vm.article.categories;
    //     scope.vm.programs = scope.vm.article.children;
    //   });
    // }

    var directive = {
      restrict: 'E',
      templateUrl: 'app/components/programas/programas.html',
      scope: {
        article: '='
      },
      controller: ProgramaListController,
      controllerAs: 'vm',
      bindToController: true,
      // link: ProgramaListLinker
    };


    return directive;
  }

  function filterByCategory(){
    return function (input, category){
      input = input || [];

      if(!category){
        // no filter
        return input;
      }

      var out = [];
      for (var i = 0; i < input.length; i++) {
        var program = input[i];
        if(program.categories[0].slug === category.slug){
          out.push(program);
        }
      }

      return out;
    };
  }

  /** @ngInject */
  function filterByCriteria($filter, $log){
    var orderBy = $filter('orderBy');

    return function (input, criteria, reverse){
      input = input || [];
      reverse = reverse || false;

      if( !criteria ){
        return input;
      }

      var out = [];
      // for (var i = 0; i < input.length; i++) {
      //   var program = input[i];

      //   // todo ordering
      //   out.push(program);
      // }

      switch(criteria.name){
        case 'title':
          out = orderBy(input, 'title', reverse);
          break;
        case 'category':
          out = orderBy(input, 'categories[0].name', reverse);
          break;
        case 'more_participants':
          // break;
        default:
          $log.info('Criteria not handled yet: ', criteria);
          out = input;
          break;
      }

      return out;
    };
  }


})();