Source: directives/deteccao-impacto/deteccao-impacto.js

/**
 * @ngdoc directives
 * @name DeteccaoImpacto
 * @module s4c.directives.deteccaoImpacto.deteccaoImpacto
 *
 * @description
 * 's4c-deteccao-impacto' janela flutuante que compara dois acervos e
 * mostra os pontos de interesse que estão próximos um do outro em uma
 * distância estipulada pelo usuário.
 *
 *@example
 *   <s4c-deteccao-impacto>
 *   </s4c-deteccao-impacto>
 */
(function () {
    'use strict';

    deteccaoImpactoCtrl.$inject = [
        '$scope',
        'DeteccaoImpactoService',
        'MainState',
        'DeteccaoImpactoManager',
        '$filter',
        'CamadasService',
        'localize'
    ];

    function deteccaoImpactoCtrl($scope, DeteccaoImpactoService, MainState, DeteccaoImpactoManager, $filter, CamadasService, localize) {

        $scope.res = $scope.$root.res;

        /**
         * Abre o módulo de detecção de impacto
         * 
         * @method abrirDeteccaoImpacto
         *
         *
         */
        function abrirDeteccaoImpacto() {
            $scope.ativo = true;
            $scope.deteccaoImpactoModel = {};
            DeteccaoImpactoService.pegarListaCategorias()
                .then(function (data) {
                    $scope.categorias = data;
                });
        }

        /**
         * Fecha o módulo de detecção de impacto
         * 
         * @method fecharDeteccaoImpacto
         *
         *
         */
        function fecharDeteccaoImpacto() {
            $scope.ativo = false;
            $scope.model = {};
            DeteccaoImpactoManager.fechar();
        }

        /**
         * Voa para o Objeto passado como parâmetro
         * 
         * @method fecharDeteccaoImpacto
         *
         * @param obj {Object}  Json com as informações de Detecção de Impacto
         *
         */
        function voarPara(obj) {
            $scope.$parent.DetalhamentoManager.voarParaObjeto(obj);
            CamadasService.ativarMenuCategoria($scope.model.referencia.id);
            CamadasService.ativarMenuCategoria($scope.model.alvo.id);
        }

        /**
         * Pesquisa por um termo específico
         * 
         * @method pesquisar
         *
         * @param termo {Object}  Texto a ser pesquisado
         *
         */
        function pesquisar(termo) {
            return _.filter($scope.categorias, function (categoria) {
                return _.includes($filter('latinize')(categoria.nome.toLowerCase()), termo.toLowerCase());
            });
        }

        $scope.nome;
        $scope.pathReferencia;
        /**
         * Seleciona uma referência para a Detecção de Impacto
         * 
         * @method selecionarReferencia
         *
         * @param item {Object}  
         *
         */
        function selecionarReferencia(item) {

            if (!item) {
                return;
            }

            $scope.nome = item.nome;
            DeteccaoImpactoService.pegarPathCategoria(item.id)
                .then(function (data) {
                    $scope.pathReferencia = data;
                });
        }

        $scope.pathAlvo;
        
        /**
         * Seleciona um alvo para a Detecção de Impacto
         * 
         * @method selecionarAlvo
         *
         * @param item {Object}  
         *
         */        
        function selecionarAlvo(item) {

            if (!item) {
                return;
            }

            DeteccaoImpactoService.pegarPathCategoria(item.id)
                .then(function (data) {
                    $scope.pathAlvo = data;
                });
        }

        /**
         * Faz a pesquisa por Detecção de Impacto
         * 
         * @method buscar
         *
         * 
         *
         */  
        function buscar() {

            DeteccaoImpactoService.capturar({
                categoriaId1: $scope.model.referencia.id,
                categoriaId2: $scope.model.alvo.id,
                distancia: $scope.model.distancia
            })
                .then(function (data) {

                    if (data.length === 0) {
                        $scope.semResultados = true;
                    } else {
                        $scope.semResultados = false;
                    }

                    var resultado = {};
                    _.each(data, function (_d) {
                        resultado[_d.id] = {
                            id: _d.id,
                            nome: _d.nome,
                            descricao: _d.descricao,
                            geojson: _d.geojson,
                            data: []
                        };
                    });

                    _.each(data, function (_d) {
                        resultado[_d.id].data.push({
                            id: _d.id2,
                            nome: _d.nome2,
                            descricao: _d.descricao2,
                            geojson: _d.geojson2,
                            urlIcone: _d.urlIcone2,
                            distancia: _d.distancia
                        });
                    });

                    $scope.resultado = resultado;
                });
        }

        angular.extend($scope, {
            ativo: false,
            model: {
                referencia: null,
                alvo: null,
                distancia: 500
            },
            categorias: {},
            resultado: {},
            voarPara: voarPara,
            pesquisar: pesquisar,
            selecionarReferencia: selecionarReferencia,
            selecionarAlvo: selecionarAlvo,

            $api: {
                abrirDeteccaoImpacto: abrirDeteccaoImpacto,
                fecharDeteccaoImpacto: fecharDeteccaoImpacto,
                buscar: buscar
            }
        });

        MainState.registerDirective('deteccaoImpacto', $scope.$api);

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

    function s4cDeteccaoImpacto() {

        return {
            restrict: 'EA',
            templateUrl: 'app/directives/deteccao-impacto/deteccao-impacto.html',
            replace: true,
            scope: {},
            controller: deteccaoImpactoCtrl
        };
    }

    /**
     * @ngdoc overview
     * @name s4c.components.deteccaoImpacto
     */
    angular.module('s4c.components.deteccaoImpacto', [])
        .directive('s4cDeteccaoImpacto', s4cDeteccaoImpacto);

}());