Source: directives/calendario-olimpico-filter/calendario-olimpico-filter.js

/**
 * @ngdoc directives
 * @name calendarioOlimpicoFilter
 * @module s4c.directives.calendarioOlimpicoFilter.CalendarioOlimpicoFilter
 *
 * @description
 * `CalendarioOlimpicoFilter` Controller do Módulo de Filtro do Calendário Olímpico
 * 
 *
 */
(function () {
    'use strict';

    CalendarioOlimpicoFilter.$inject = [
        'CalendarioOlimpicoFilter'
    ];
    function CalendarioOlimpicoFilter(CalendarioOlimpicoFilter) {
        return {
            restrict: 'E',
            templateUrl: 'app/directives/calendario-olimpico-filter/calendario-olimpico-filter.html',
            replace: true,
            scope: {},
            link: function ($scope, $elem, $attrs) {
                $scope.res = $scope.$root.res;
                var filter = CalendarioOlimpicoFilter;
                var filterInstance = filter.getInstance($attrs.id);

                angular.extend($scope, {
                    modalidadesOlimpicas: [],
                    sexo: [],
                    fases: [],
                    applyFilter: applyFilter,
                    checkedAll: checkedAll,
                    res: $scope.$root.dataCalendarioOlimpico,
                    toogleMenu: toogleMenu,
                    modules: {}
                });

		       /**
		        * Abre e fecha a opção de filtro 
		        *
		        * @method toogleMenu
				*        
		        * @param module {String} module
				*               
		        */ 
                function toogleMenu(module) {
                    $scope.modules[module] = !$scope.modules[module];
                };

			   /**
		        * Transforma os dados da tabela de programacao para as opçoes de cada filtro
		        *
		        * @method parseObj
				*        
		        * @param obj {Object} obj
				*               
		        */
                function parseObj(obj) {
                    return _.chain($scope.res)
                        .uniqBy(obj)
                        .map(function (o) {
                            return { 'label': o[obj], 'value': false };
                        })
                        .value();
                }

			   /**
		        * Checkall - unckedAll das opcoes de filtro
		        *
		        * @method checkedAll
				*        
		        * @param modules {Object} Módulos
		        * @param boolChecked {Boolean} Boolean
				*               
		        */
                // 
                function checkedAll(modules, boolChecked) {
                    _.each($scope[modules], function (record) {
                        record.value = boolChecked;
                    });
                }

			   /**
		        * Aplica o filtro
		        *
		        * @method applyFilter
				*        
				*               
		        */
                function applyFilter() {
                    filterInstance.trigger('filterChanged', filterInstance);
                }

                $scope.modules = {
                    'ModalidadeOlimpica': false,
                    'FemininoMasculino': false,
                    'Fases': false
                };

                filterInstance.sexo = $scope.sexo = parseObj('ds_Genero');
                filterInstance.modalidadesOlimpicas = $scope.modalidadesOlimpicas = parseObj('nm_Modalidade');
                filterInstance.fases = $scope.fases = parseObj('ds_Prova_Fase');
                filterInstance.modules = $scope.modules;

                $scope.dataRange = {};
                $scope.dataRange.dataInicial = moment().startOf('Day').format('DD/MM');
                $scope.dataRange.dataFinal;

                filterInstance.dateRange = $scope.dataRange;

			   /**
		        * Listener do atributo modalidadesOlimpicas
		        *
		        * @method watch
				*  @param value {Object} value      
				*               
		        */
                $scope.$watch('modalidadesOlimpicas', function (value) {
                    $scope.exibeMarcarTodosModalidades = _.some($scope.modalidadesOlimpicas, function (record) { return record.value === false });
                }, true);

			   /**
		        * Listener do atributo sexo
		        *
		        * @method watch
				* @param value {Object} value       
				*               
		        */
                $scope.$watch('sexo', function (value) {
                    $scope.exibeMarcarTodosSexo = _.some($scope.sexo, function (record) { return record.value === false });
                }, true);

			   /**
		        * Listener do atributo fases
		        *
		        * @method watch
				*  @param value {Object} value      
				*               
		        */
                $scope.$watch('fases', function (value) {
                    $scope.exibeMarcarTodosFase = _.some($scope.fases, function (record) { return record.value === false });
                }, true);

            }
        }
    }
    angular.module('s4c.components.calendario', [])
        .directive('calendarioOlimpicoFilter', CalendarioOlimpicoFilter);
}());