Source: directives/barra-busca/barra-busca.js

/**
 * @ngdoc directives
 * @name BarraBusca
 * @module s4c.directives.barra-busca.Barra-Busca
 *
 * @description
 * `barraBuscaCtrl` é a diretiva que controla a barra superior de busca,
 * ela controla os filtros de busca e o período.
 *
 * @example
 *   <s4c-barra-busca>
 *   </s4c-barra-busca>
 *
 */
(function () {
    'use strict';

    barraBuscaCtrl.$inject = [
        '$scope',
        '$rootScope',
        '$mdDialog',
        '$window',
        'MainState',
        'BuscaManager',
        'localize',
        'PermissoesService',
        'AuthService'
    ];

    function barraBuscaCtrl(
        $scope,
        $rootScope,
        $mdDialog,
        $window,
        MainState,
        BuscaManager,
        localize,
        PermissoesService,
        AuthService) {

        PermissoesService.getPermissoes().then(function (perms) {
            $scope.permissoesVisualizacao = perms.permissoesVisualizacao;
            $scope.permissoesCriacao = perms.permissoesCriacao;
            $scope.permissoesEdicao = perms.permissoesEdicao;
            $scope.permissoesRemocao = perms.permissoesRemocao;
        });

        $scope.res = $rootScope.res;

       /**
        * Define o funcionamento no evento de onClick na barra de busca
        *
        * @method onclick
        * @param e {Object} Evento
		*        
        *
        */   
        $window.onclick = function (e) {
            if (BuscaManager.active) {
                var target = $(e.target);

                if (!target) {
                    return;
                }

                var isStayOpen = true;
                var parents = target.parents();

                parents = _.filter(parents, function (parent) {
                    if ($(parent).hasClass('barStayOpen')) {
                        return true;
                    }

                    return false;
                });

                if (parents.length <= 0 && !target.hasClass('barStayOpen')) {
                    isStayOpen = false;
                }

                if (!isStayOpen) {
                    BuscaManager.active = false;
                    $scope.$apply();
                }

            }
        };

        var periodos = [localize.getLocalizedString('BARRABUSCA_HOJE'), localize.getLocalizedString('BARRABUSCA_ULTIMAHORA'), localize.getLocalizedString('BARRABUSCA_ULTIMODIA'), localize.getLocalizedString('BARRABUSCA_ULTIMASEMANA'), localize.getLocalizedString('BARRABUSCA_ULTIMOMES'), localize.getLocalizedString('BARRABUSCA_QUALQUERDIA')];
        var itensBusca = [{
            name: localize.getLocalizedString('COMUM_LOCALIZACAO'),
            icon_active: '/assets/images/Consulta/Blue/ic_busca_blue_24px.svg',
            icon_inactive: '/assets/images/Consulta/Blue/ic_busca_white_24px.svg',
            active: true,
            indice: '0'
        }, {
            name: localize.getLocalizedString('BASECONHECIMENTO_TITULO'),
            icon_active: '/assets/images/Consulta/Blue/ic_base_conhecimento_blue_24px.svg',
            icon_inactive: '/assets/images/Consulta/Blue/ic_base_conhecimento_white_24px.svg',
            active: true,
            indice: '1'
        }, {
            name: localize.getLocalizedString('PLANEJAMENTO_TITULO'),
            icon_active: '/assets/images/Consulta/Blue/ic_planejamento_blue_24px.svg',
            icon_inactive: '/assets/images/Consulta/Blue/ic_planejamento_white_24px.svg',
            active: true,
            indice: '2'
        }, {
            name: localize.getLocalizedString('ZONAOBSERVACAO_TITULO'),
            icon_active: '/assets/images/Consulta/Blue/ic_zona_observacao_blue_24px.svg',
            icon_inactive: '/assets/images/Consulta/Blue/ic_zona_observacao_white_24px.svg',
            active: true,
            indice: '3'
        }, {
            name: localize.getLocalizedString('ROTA_TITULO_PLURAL'),
            icon_active: '/assets/images/Consulta/Blue/ic_rotas_blue_24px.svg',
            icon_inactive: '/assets/images/Consulta/Blue/ic_rotas_white_24px.svg',
            active: true,
            indice: '4'
        }, {
            name: localize.getLocalizedString('INCIDENTES_TITULO'),
            icon_active: '/assets/images/Consulta/Blue/ic_incidente_blue_24px.svg',
            icon_inactive: '/assets/images/Consulta/Blue/ic_incidente_white_24px.svg',
            active: true,
            indice: '5'
        }, {
            name: localize.getLocalizedString('PONTOSDEINTERESSE_TITULO'),
            icon_active: '/assets/images/Consulta/Blue/ic_ponto_interesse_blue_24px.svg',
            icon_inactive: '/assets/images/Consulta/Blue/ic_ponto_interesse_white_24px.svg',
            active: true,
            indice: '6'
        }, {
            name: localize.getLocalizedString('CAMERAS_TITULO'),
            icon_active: '/assets/images/Consulta/Blue/s4c_ic_camera_blue_24px.svg',
            icon_inactive: '/assets/images/Consulta/Blue/s4c_ic_camera_white_24px.svg',
            active: true,
            indice: '7'
        }, {
            name: localize.getLocalizedString('COMUM_ATIVOSMOVEIS'),
            icon_active: '/assets/images/Consulta/Blue/s4c_ic_ativo_movel_blue_24px.svg',
            icon_inactive: '/assets/images/Consulta/Blue/s4c_ic_ativo_movel_white_24px.svg',
            active: true,
            indice: '8'
        }];


       /**
        * Remove da busca itens referentes ao S4S
        *
        * @method removeItensforS4S
        * 
		*        
        *
        */  
        function removeItensforS4S() {
            if (AuthService.user.info.showS4S) {
                itensBusca.splice(1, 1);
                itensBusca.splice(1, 1);
                itensBusca.splice(1, 1);
                itensBusca.splice(1, 1);
                itensBusca.splice(1, 1);
                itensBusca.splice(2, 1);
                itensBusca.splice(2, 1);
            }
        }

        removeItensforS4S();

       /**
        * Marca todos os itens da barra de busca
        *
        * @method marcarTodos
        * 
		*        
        *
        */  
        function marcarTodos() {
            _.each($scope.itensBusca, function (item) {
                item.active = true;
            });
        }

       /**
        * Desmarca todos os itens da barra de busca
        *
        * @method desmarcarTodos
        * 
		*        
        *
        */  
        function desmarcarTodos() {
            _.each($scope.itensBusca, function (item) {
                item.active = false;
            });
        }

       /**
        * Verifica se houve alteração no atributo itensBusca
        *
        * @method watch
        * 
		*        
        *
        */  
        $scope.$watch('itensBusca', function () {

            var itensAtivos = _.filter($scope.itensBusca, 'active');

            if (itensAtivos.length == 0) {
                $scope.acervo = localize.getLocalizedString('COMUM_NENHUM');
            } else if (itensAtivos.length == 1) {
                $scope.acervo = itensAtivos[0].name;
            } else if (itensAtivos.length == $scope.itensBusca.length) {
                $scope.acervo = localize.getLocalizedString('COMUM_TODOS');
            } else {
                $scope.acervo = localize.getLocalizedString('COMUM_VARIOS');
            }
        }, true);

       /**
        * Obtem os itens a serem buscados
        *
        * @method watch
        * 
		*        
        *
        */  
        function getFilters() {
            return $scope.itensBusca;
        }

       /**
        * Obtem o periodo a ser usado na busca
        *
        * @method getTimeFilters
        * 
		*        
        *
        */ 
        function getTimeFilters() {
            return $scope.timeFilter;
        }

       /**
        * Obtem a cor do ícone
        *
        * @method getIconColor
        * @param active {String} 
		*        
        *
        */ 
        function getIconColor(active) {
            return (active) ? 'blue' : 'white';
        }


       /**
        * Muda o período do filtro
        *
        * @method changeTimeFilter
        * @param periodo {Object} 
		*        
        *
        */ 
        function changeTimeFilter(periodo) {
            $scope.timeFilter = periodo;
        }

       /**
        * Customiza o período do Filtro
        *
        * @method customizeTimeFilter
        *
		*        
        *
        */ 
        function customizeTimeFilter() {
            $mdDialog.show({
                templateUrl: 'app/directives/barra-busca/dialog.html',
                controller: function ($scope, inicio, fim) {

                    function cancelar() {
                        $mdDialog.cancel();
                    }

                    function saveCustomTime() {
                        $mdDialog.hide({
                            inicio: $scope.dataInicio,
                            fim: $scope.dataFim
                        });
                    }

                    angular.extend($scope, {
                        saveCustomTime: saveCustomTime,
                        cancelar: cancelar,
                        dataInicio: inicio,
                        dataFim: fim,
                        res: $scope.$parent.res
                    });
                },
                locals: {
                    inicio: $scope.customInicio,
                    fim: $scope.customFim
                }
            }).then(function (res) {
                if (res.inicio || res.fim) {
                    $scope.customInicio = res.inicio ? res.inicio : '*';
                    $scope.customFim = res.fim ? res.fim : '*';
                    $scope.timeFilter = $scope.customInicio + ' - ' + $scope.customFim;
                }
            });
        }

       /**
        * Verifica as permissões do item 
        *
        * @method hasPermission
        * @param item {Object} 
		*        
        *
        */ 
        function hasPermission(item) {

            if (!$scope.permissoesVisualizacao) {
                return false;
            }

            if (item.name == $scope.res('BASECONHECIMENTO_TITULO')) {
                if (!$scope.permissoesVisualizacao.baseConhecimentoPublica) {
                    item.active = false;
                    return false;
                }
            }

            if (item.name == $scope.res('PLANEJAMENTO_TITULO')) {
                if (!$scope.permissoesVisualizacao.planejamentoPublico) {
                    item.active = false;
                    return false;
                }
            }

            if (item.name == $scope.res('ROTA_TITULO_PLURAL')) {
                if (!$scope.permissoesVisualizacao.rotaPublica) {
                    item.active = false;
                    return false;
                }
            }

            if (item.name == $scope.res('ZONAOBSERVACAO_TITULO')) {
                if (!$scope.permissoesVisualizacao.zonaObservacaoPublica) {
                    item.active = false;
                    return false;
                }
            }

            return true;
        }

        angular.extend($scope, {
            marcarTodos: marcarTodos,
            desmarcarTodos: desmarcarTodos,
            hasPermission: hasPermission,
            $apiBarraBusca: {
                getIconColor: getIconColor,
                getFilters: getFilters,
                getTimeFilters: getTimeFilters,
                customizeTimeFilter: customizeTimeFilter,
                changeTimeFilter: changeTimeFilter
            },
            timeFilter: localize.getLocalizedString('BARRABUSCA_HOJE'),
            acervo: localize.getLocalizedString('COMUM_TODOS'),
            itensBusca: itensBusca,
            periodos: periodos
        });

        $scope.$watch('timeFilter', function (newVal, oldVal) {
            if (newVal.split('-').length < 2 && oldVal.split('-').length === 2) {
                $scope.customInicio = '';
                $scope.customFim = '';
            }
        });

        MainState.registerDirective('barraBusca', $scope.$apiBarraBusca);

        $scope.$on('$destroy', function () {
            MainState.unregisterDirective('barraBusca');
        });
    }

    function s4cBarraBusca() {

        return {
            restrict: 'E',
            templateUrl: 'app/directives/barra-busca/barra-busca.html',
            replace: true,
            scope: {},
            controller: barraBuscaCtrl
        };
    }

    /**
     * @ngdoc overview
     * @name s4c.components.barraBusca
     */
    angular.module('s4c.components.busca', [])
        .directive('s4cBarraBusca', s4cBarraBusca);
}());