Source: directives/msi-filter/msiFilter.js

/**
 * @ngdoc directives
 * @name MsiFilter
 * @module s4c.directives.MsiFilter.MsiFilter
 *
 * @description
 * `MsiFilter` Controller do módulo do MsiFilter 
 * 
 * 
 */
(function () {
    'use strict';

    angular.module('s4c.components.msi', ['ngTable'])
        .directive('msiFilter', MsiFilter)
        .filter('join', function () {
            return function (array, property) {
                var filtered = _.chain(array)
                    .filter('ativo')
                    .map(property)
                    .value();

                if (filtered.length <= 0) {
                    return '-';
                }

                return filtered.join(', ');
            }
        });

    MsiFilter.$inject = [
        'MsiFilter',
        'Base',
        'IncidentesService',
        'MainState',
        'Preset',
        '$q',
        '$interval'
    ];

    function MsiFilter(MsiFilter, Base, IncidentesService, MainState, Preset, $q, $interval) {
        return {
            restrict: 'E',
            templateUrl: 'app/directives/msi-filter/msiFilter.html',
            replace: true,
            scope: {},
            link: function ($scope, $elem, $attrs) {

                angular.extend($scope, {
                    categorias: [],
                    prioridades: [],
                    tipoIncidentes: [],
                    statuses: [],
                    modulo: $scope.modulo,
                    criticidades: [],
                    gravidades: [],
                    exibirModuloAgencia: true,
                    exibirModuloTipoIncidente: true,
                    exibirModuloStatus: true,
                    exibirModuloGravidades: true,
                    exibirRange: true,
                    applyFilter: applyFilter,
                    exibirAgencias: exibirAgencias,
                    exibirDateRange: exibirDateRange,
                    exibirGravidades: exibirGravidades,
                    exibirStatus: exibirStatus,
                    exibirTipoIncidente: exibirTipoIncidente,
                    marcarTodasPrioridades: marcarTodasPrioridades,
                    desmarcarTodasPrioridades: desmarcarTodasPrioridades,
                    definirOrigem: definirOrigem,
                    preSelectCategorias: preSelectCategorias,
                    res: $scope.$root.res,
                    setFilter: setFilter,
                    verifyModulos: verifyModulos,
                    expand: expand,
                    collapse: collapse
                });

                $scope.expanded = true;
                MainState.registerDirective('msiFilter', $scope);

                $scope.isToShow = function (label) {
                    return MainState.isToShow(label);
                }

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

                var instance = MsiFilter.getInstance($attrs.id);

                instance.dataRange = _timeSet();
                function _timeSet() {
                    return {
                        start: moment().startOf('day').subtract(1, 'day').format(),
                        end: moment().endOf('day').format()
                    }
                };

                $scope.dateOptions = [];
                $scope.dateOptions['1'] = false;
                $scope.dateOptions['2'] = false;
                $scope.dateOptions['3'] = false;
                $scope.dateOptions['4'] = false;

                $scope.days = { qtdDays: 1 };
                $scope.periodRange = {
                    endDate: '',
                    startDate: '',
                };

                var verified = false;
                /**
                 * @method verifyModulos
                 */
                function verifyModulos() {
                    var modulos = Preset.obter().PresetModulos;
                    for (var index in modulos) {
                        if (((modulos[index].Face && modulos[index].Face.name == 'MODULO_MSI') || (modulos[index].name == 'Incidentes')) && !modulos[index].usado) {

                            modulos[index].usado = true;
                            $scope.modulo = modulos[index];
                            instance.modulo = $scope.modulo;

                            verified = true;
                            if ($scope.modulo.extras) {

                                instance.statuses = $scope.modulo.extras.statuses;
                                $scope.statuses = $scope.modulo.extras.statuses;

                                if ($scope.modulo.extras.categorias) {
                                    $scope.categorias = $scope.modulo.extras.categorias;
                                }

                                if ($scope.modulo.extras.gruposUsuarios) {
                                    $scope.gruposUsuarios = $scope.modulo.extras.gruposUsuarios;
                                }

                                if ($scope.modulo.extras.tipoIncidentes) {
                                    $scope.tipoIncidentes = $scope.modulo.extras.tipoIncidentes;
                                }

                                if ($scope.modulo.extras.gravidades) {
                                    $scope.gravidades = $scope.modulo.extras.gravidades;
                                }

                                if ($scope.modulo.extras.dataRange) {
                                    $scope.dataRange = {
                                        start: moment($scope.modulo.extras.dataRange.start).format('DD/MM/YYYY HH:mm'),
                                        end: moment($scope.modulo.extras.dataRange.end).format('DD/MM/YYYY HH:mm')
                                    };
                                } else {
                                    $scope.dataRange = {
                                        start: $scope.modulo.extras.date.start,
                                        end: $scope.modulo.extras.date.end
                                    };
                                }

                                if ($scope.modulo.extras.selectedCheck) {
                                    $scope.dateOptions[$scope.modulo.extras.selectedCheck] = true;
                                    loadDataRange();
                                }

                                if ($scope.modulo.extras.qtdDays) {
                                    $scope.days.qtdDays = $scope.modulo.extras.qtdDays;
                                }
                            } else {
                                instance.statuses = [
                                    { id: 1, nome: 'ABERTO', imgUrl: '/assets/images/IncidenteLegenda/s4c_ic_incident_open_fill_subtitle.svg', ativo: true },
                                    { id: 2, nome: 'FECHADO', imgUrl: '/assets/images/IncidenteLegenda/s4c_ic_incident_closed_fill_subtitle.svg', ativo: true }
                                ];
                                $scope.statuses = instance.statuses;

                                $scope.dataRange = {
                                    start: moment(instance.dataRange.start).format('DD/MM/YYYY HH:mm'),
                                    end: moment(instance.dataRange.end).format('DD/MM/YYYY HH:mm')
                                };
                                $scope.dateOptions['4'] = true;
                                loadDataRange();
                            }

                            break;
                        }
                    }
                }

                verifyModulos();
                /**
                 * @method initFilter
                 */
                $scope.initFilter = function () {

                    var deferred = $q.defer();
                    if (verified) {
                        deferred.resolve('');
                    }

                    IncidentesService.getCategoriasIncidente().then(function (categorias) {
                        var categorias = preSelectCategorias(categorias);

                        instance.categorias = categorias;
                        $scope.categorias = instance.categorias;

                        IncidentesService.getIncidenteTipos().then(function (tipoIncidentes) {
                            instance.tipoIncidentes = tipoIncidentes;
                            $scope.tipoIncidentes = instance.tipoIncidentes;

                            IncidentesService.getIncidenteGravidades().then(function (gravidades) {
                                instance.gravidades = gravidades;
                                $scope.gravidades = instance.gravidades;
                                verifyModulos();
                                deferred.resolve('');
                            });
                        });
                    });
                    return deferred.promise;
                }

                /**
                 * @method preSelectCategorias
                 * @param {*} categorias 
                 */
                function preSelectCategorias(categorias) {
                    var categoriasSelected = categorias.filter(function (categoria) {
                        if (categoria.nome.indexOf('Outros') > -1) return;

                        categoria.ativo = true;
                        return categoria;
                    });

                    return categoriasSelected;
                }

                Base.obter('grupo_usuarios/adm').then(function (gruposUsuarios) {
                    $scope.gruposUsuarios = gruposUsuarios;
                    instance.gruposUsuarios = gruposUsuarios;
                });


                for (var i = 0; i < 9; i++) {
                    instance.prioridades.push({
                        texto: i,
                        ativo: false
                    });
                    $scope.prioridades = instance.prioridades;
                }

                for (var i = 0; i < 4; i++) {
                    $scope.prioridades[i].ativo = true;
                }

                $scope.$watch('prioridades', function () {
                    $scope.exibeMarcarTodos = _.some($scope.prioridades, 'ativo', false);
                }, true);

                $scope.$watch('gruposUsuarios', function () {
                    definirOrigem();
                }, true);

                /**
                 * @method definirOrigem
                 */
                function definirOrigem() {
                    instance.origem = 'filtro';
                };

                /**
                 * @method exibirGravidades
                 */
                function exibirGravidades() {
                    $scope.exibirModuloGravidades = !$scope.exibirModuloGravidades;
                }

                /**
                 * @method exibirStatus
                 */
                function exibirStatus() {
                    $scope.exibirModuloStatus = !$scope.exibirModuloStatus;
                }

                /**
                 * @method exibirTipoIncidente
                 */
                function exibirTipoIncidente() {
                    $scope.exibirModuloTipoIncidente = !$scope.exibirModuloTipoIncidente;
                }

                /**
                 * @method exibirDateRange
                 */
                function exibirDateRange() {
                    $scope.exibirRange = !$scope.exibirRange;
                }

                /**
                 * @method exibirAgencias
                 */
                function exibirAgencias() {
                    $scope.exibirModuloAgencia = !$scope.exibirModuloAgencia;
                }

                /**
                 * @method expand
                 */
                function expand() {
                    $scope.exibirModuloAgencia = true;
                    $scope.exibirRange = true;
                    $scope.exibirModuloTipoIncidente = true;
                    $scope.exibirModuloStatus = true;
                    $scope.exibirModuloGravidades = true;
                    $scope.expanded = !$scope.expanded;
                }

                /**
                 * @method collapse
                 */
                function collapse() {
                    $scope.exibirModuloAgencia = false;
                    $scope.exibirRange = false;
                    $scope.exibirModuloTipoIncidente = false;
                    $scope.exibirModuloStatus = false;
                    $scope.exibirModuloGravidades = false;
                    $scope.expanded = !$scope.expanded;
                }

                /**
                 * @method selectCheckBox
                 */
                $scope.selectCheckBox = function (selected, index) {
                    $scope.dateOptions['1'] = false;
                    $scope.dateOptions['2'] = false;
                    $scope.dateOptions['3'] = false;
                    $scope.dateOptions['4'] = false;

                    if (!selected == false) {
                        $scope.dateOptions[index] = selected;
                        return;
                    }
                    $scope.dateOptions[index] = !selected;
                }

                /**
                 * @method loadDataRange
                 */
                function loadDataRange() {
                    if ($scope.dateOptions['4']) {
                        $scope.periodRange.endDate = angular.copy($scope.dataRange.end);
                        $scope.periodRange.startDate = angular.copy($scope.dataRange.start);
                        return;
                    }
                }

                /**
                 * @method calculateDataRange
                 */
                function calculateDataRange() {

                    if ($scope.dateOptions['1']) {
                        $scope.dataRange = {
                            start: moment().startOf('day').subtract(1, 'day').format('DD/MM/YYYY HH:mm'),
                            end: moment().endOf('day').format('DD/MM/YYYY HH:mm')
                        };
                        return;
                    }

                    if ($scope.dateOptions['2']) {
                        $scope.dataRange = {
                            start: moment().startOf('isoWeek').format('DD/MM/YYYY HH:mm'),
                            end: moment().endOf('day').format('DD/MM/YYYY HH:mm')
                        };
                        return;
                    }

                    if ($scope.dateOptions['3']) {
                        $scope.dataRange = {
                            start: moment().startOf('day').subtract($scope.days.qtdDays, 'day').format('DD/MM/YYYY HH:mm'),
                            end: moment().endOf('day').format('DD/MM/YYYY HH:mm')
                        };
                        return;
                    }

                    if ($scope.dateOptions['4']) {
                        $scope.dataRange.end = angular.copy($scope.periodRange.endDate);
                        $scope.dataRange.start = angular.copy($scope.periodRange.startDate);
                        return;
                    }
                }

                $interval(function () {
                    var now = moment();
                    if (now.hours() === 0 && now.minutes() === 0) {
                        applyFilter("");
                    }
                }, 60000);

                /**
                 * @method applyFilter
                 * @param {*} toggle 
                 */
                function applyFilter(toggle) {

                    calculateDataRange();
                    instance.trigger('filterChanged', instance.origem);

                    if (!toggle) {
                        $scope.$parent.toogleFilter();
                    }

                    if ($scope.modulo) {

                        var savedDate = {
                            start: moment($scope.dataRange.start, 'DD/MM/YYYY HH:mm').format(),
                            end: moment($scope.dataRange.end, 'DD/MM/YYYY HH:mm').format()
                        };

                        $scope.modulo.extras = {};
                        $scope.modulo.extras.categorias = $scope.categorias;
                        $scope.modulo.extras.gruposUsuarios = $scope.gruposUsuarios;
                        $scope.modulo.extras.tipoIncidentes = $scope.tipoIncidentes;
                        $scope.modulo.extras.statuses = $scope.statuses;
                        $scope.modulo.extras.gravidades = $scope.gravidades;
                        $scope.modulo.extras.dataRange = savedDate;
                        $scope.modulo.extras.selectedCheck = $scope.dateOptions.indexOf(true).toString();
                        $scope.modulo.extras.qtdDays = $scope.days.qtdDays;
                        Preset.salvar();
                    }
                }

                /**
                 * @method marcarTodasPrioridades
                 */
                function marcarTodasPrioridades() {
                    _.each($scope.prioridades, function (prioridade) {
                        prioridade.ativo = true;
                    });
                }

                /**
                 * @method desmarcarTodasPrioridades
                 */
                function desmarcarTodasPrioridades() {
                    _.each($scope.prioridades, function (prioridade) {
                        prioridade.ativo = false;
                    });
                }

                /**
                 * @method setFilter
                 * @param {*} filter 
                 */
                function setFilter(filter) {

                    if (filter.status) {
                        _.map($scope.statuses, function (status) {

                            status.ativo = false;
                            _.each(filter.status.$in, function (statusIn) {
                                if (status.nome == statusIn) {
                                    status.ativo = true;
                                }
                            });
                        });
                    }

                    if (filter.CategoriaIncidenteId) {
                        _.map($scope.categorias, function (categoria) {

                            categoria.ativo = false;
                            _.each(filter.CategoriaIncidenteId.$in, function (categoriaIn) {
                                if (categoria.id == categoriaIn) {
                                    categoria.ativo = true;
                                }
                            });
                        });
                    }

                    if (filter.TipoIncidenteId) {
                        _.map($scope.tipoIncidentes, function (tipoIncidente) {

                            tipoIncidente.ativo = false;
                            _.each(filter.TipoIncidenteId.$in, function (tipoIncidenteIn) {
                                if (tipoIncidente.id == tipoIncidenteIn) {
                                    tipoIncidente.ativo = true;
                                }
                            });
                        });
                    }

                    if (filter.GravidadeIncidenteId) {
                        _.map($scope.gravidades, function (gravidade) {

                            gravidade.ativo = false;
                            _.each(filter.GravidadeIncidenteId.$in, function (gravidadeIncidenteIn) {
                                if (gravidade.id == gravidadeIncidenteIn) {
                                    gravidade.ativo = true;
                                }
                            });
                        });
                    }
                }
            }
        }
    }
}());