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

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

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

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

      // alias
      var vm = this;

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

      // initialization
      vm.init();
    }

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

      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 = [];
      vm.orderCriteries = [
      { label: 'Título', name: 'title' },
      { label: 'Tema', name: 'category' }
      // , { label: 'Mais participações', name: 'more_participants' }
      ];

      vm.search = vm.$location.search();

      // Add initial values for the filter
      vm.query = (vm.search && vm.search.filtro) ? vm.search.filtro : null;
      vm.limitTo = (vm.search && vm.search.limite) ? parseInt(vm.search.limite, 10) : 4;
      vm.categoryFilter = (vm.search && vm.search.tema) ? vm.filterByCategorySlug(vm.search.tema) : null;

      // update window location params
      vm.$scope.$watch('vm.query', function(newValue, oldValue){
        vm.search.filtro = newValue;
        vm.$location.search(vm.search);
      });

      vm.$scope.$watch('vm.limitTo', function(newValue, oldValue){
        vm.search.limite = newValue;
        vm.$location.search(vm.search);
      });

      vm.$scope.$watch('vm.categoryFilter', function(newValue, oldValue){
        vm.search.tema = newValue ? newValue.slug : '';
        vm.$location.search(vm.search);
      });

    };

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

      vm.query = null;
      vm.limitTo = 4;
      vm.categoryFilter = null;
    };

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

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

    ProgramaListController.prototype.filterByCategorySlug = function (categorySlug) {
      var vm = this;
      var result = null;

      angular.forEach(vm.categories, function (value, key){
        if(value.slug === categorySlug){
          result = value;
        }
      })
      return result;
    }

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

      $event.stopPropagation();

      if(category !== vm.categoryFilter){

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

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

      $event.stopPropagation();

      vm.resetFilterValues();
    };

    // 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 || [];
      criteria = criteria || {};
      reverse = reverse || false;

      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);

          if(reverse){
            out = input.slice().reverse();
          }else{
            out = input;
          }
          break;
      }


      return out;
    };
  }


})();