Source: directives/adicionar-rotas/adicionar-rotas.js

/**
 * @ngdoc directives
 * @name adicionar-rotas
 * @module s4c.directive.adicionar-rotas
 * 
 * @description `adicionarRotasCtrl` mostra as informações de uma Rota
 *              existente no sistema ou informações de uma Rota sendo
 *              desenhada no momento.
 * 
 *@example <s4c-adicionar-rotas> </s4c-adicionar-rotas>
 */
(function () {
    'use strict';

    adicionarRotasCtrl.$inject = ['$scope',
        '$state',
        'RotasService',
        'MapaManager',
        'CamadasService',
        'IncidentesManager',
        '$mdDialog',
        'Base',
        '$q',
        'MainState',
        'RotasManager',
        'CommService',
        'RotasFilter',
        'PermissoesService',
        'toasty',
        'Departamento',
        'MapaService'];

    function adicionarRotasCtrl($scope,
        $state,
        RotasService,
        MapaManager,
        CamadasService,
        IncidentesManager,
        $mdDialog,
        Base,
        $q,
        MainState,
        RotasManager,
        CommService,
        RotasFilter,
        PermissoesService,
        toasty,
        Departamento,
        MapaService) {

       /**
        * Obtem a lista de Permissões
        *
        * @method getPermissoes
		*        
        *
        */   
        PermissoesService.getPermissoes().then(function (perms) {
            $scope.permissoesVisualizacao = perms.permissoesVisualizacao;
            $scope.permissoesCriacao = perms.permissoesCriacao;
            $scope.permissoesEdicao = perms.permissoesEdicao;
            $scope.permissoesRemocao = perms.permissoesRemocao;
            $scope.permissoesExtras = perms.permissoesExtras;
        });


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

        //Apenas para criação de rotas.
       /**
        * Verifica se há novos pontos na rota
        *
        * @method watch
        
        * @param newVal {String} novo valor 
        * @param oldVal {String} valor antigo
        *
        */           
        $scope.$watch('RotasManager.rotaAtiva.pontos', function (newArray, oldArray) {

            angular.forEach(newArray, function (ponto) {

                if (ponto.endereco && ponto.endereco.geometry) {
                    ponto.latLng.lat = ponto.endereco.geometry.location.lat();
                    ponto.latLng.lng = ponto.endereco.geometry.location.lng();
                    ponto.endereco = ponto.endereco.formatted_address;
                    atualizarMapa();
                    return;
                }
            });

        }, true);


        /**
         * Formulário com as informações da rota
         *
         * @property formRota
         * @type Object
         */
        $scope.formRota = {};
        
       /**
        * Verifica se o nome da rota foi alterado
        *
        * @method watch
        * @param newVal {String} novo valor 
        * @param oldVal {String} valor antigo
        *
        */       
        $scope.$watch('RotasManager.rotaAtiva.nome', function (newVal, oldVal) {
            if (newVal && newVal.length > 0) {
                if ($scope.formRota.nome) {
                    $scope.formRota.nome.error.required = false;
                    $scope.formRota.nome.touch = false;
                }
            }
        });

        /**
         * Lista de agências
         *
         * @property agencias
         * @type Array
         */
        $scope.agencias = [];
        
        /**
        * Obtem a lista de agências
        *
        * @method getAgencias
        *
        */
        Departamento.getAgencias()
            .then(function (agencias) {
                $scope.agencias = agencias;
            });

        $scope.ponto;

        /**
        * Atualiza o mapa
        *
        * @method atualizarMapa
        *
        */
        function atualizarMapa() {

            var rotaAtiva = MapaService.obterRotaAtiva();
            rotaAtiva.setWaypoints(RotasManager.rotaAtiva.pontos);

        }


        /**
        * Abre o mosaico de câmeras
        *
        * @method abrirCamerasMosaico
        * @param cameras {String} Json com as informações das cameras que serão exibidas
		*
        */
        function abrirCamerasMosaico(cameras) {
            cameras = cameras.filter(function (camera) {
                return camera.numero > 0;
            });

            if (cameras.length <= 0) {
                return;
            }

            var url = $state.href('mosaico', {
                cameras: JSON.stringify(cameras)
            }, {
                absolute: true
            });

            window.open(url, 'Mosaico', 'menubar=no,location=no,resizable=no,scrollbars=no,status=yes,width=1024,height=600');
        }

       /**
        * Voa para o incidente
        *
        * @method voarParaIncidente
        * @param incidente {String} Identificação do Incidente 
		*
        */
        $scope.voarParaIncidente = function (incidente) {
            CamadasService.reloadIncidentes(true);
            MapaManager.voarParaObjeto(incidente);
            //MapaManager.naoPiscar();
        }


		/**
        * Voa para a camera
        *
        * @method voarParaCamera
        * @param camera {String} Identificação da camera 
		*
        */
        $scope.voarParaCamera = function (camera) {
            CamadasService.ativarMenuDaCamera(camera);
            MapaManager.voarParaObjeto(camera);
            //MapaManager.naoPiscar();
        }
        
        $scope.abrirCamerasMosaico = abrirCamerasMosaico;

		/**
        * Salva a rota
        *
        * @method salvarRota
        * 
		*
        */
        $scope.salvarRota = function () {

            if (!RotasManager.rotaAtiva.hasOwnProperty('nome') || RotasManager.rotaAtiva.nome.length === 0) {
                $scope.formRota = {
                    nome: {
                        touched: true,
                        error: {
                            required: true
                        }
                    }
                };

                return false;
            }

            var waypoints = [];
            _.reduce(RotasManager.rotaAtiva.pontos, function (a, sum) {
                waypoints.push({
                    de: a.latLng,
                    para: sum.latLng
                });
                return sum;
            });


            if (!RotasManager.rotaAtiva.id) {
                MapaService
                    .salvarRota(
                        {
                            nome: RotasManager.rotaAtiva.nome,
                            descricao: RotasManager.rotaAtiva.descricao,
                            publico: true,
                            trechos: waypoints,
                            DepartamentoId: RotasManager.rotaAtiva.DepartamentoId
                                || user.Departamento.id
                        })
                    .then(
                        function (obj) {
                            if (mapa) {
                                MapaService.removerRotasUnificadasDoMapa();
                            }

                            RotasManager.rotaAtiva = undefined;
                            RotasManager.fechar();
                            $mdDialog.show($mdDialog.alert().title(
                                $scope.res('COMUM_SUCESSO')).content(
                                    $scope.res('MSG_ROTA_CRIADA_SUCESSO'))
                                .ok($scope.res('COMUM_OK')));
                            var rotas = MainState.getDirective('rotas');
                            if (rotas) {
                                rotas.atualizarRotas();
                            }
                        },
                        function (err) {
                            toasty({
                                msg: $scope.res('MSG_ERRO_ROTA_SALVAR')
                            });
                        });

            } else {

                MapaService
                    .updateRota(
                        {
                            id: RotasManager.rotaAtiva.id,
                            nome: RotasManager.rotaAtiva.nome,
                            descricao: RotasManager.rotaAtiva.descricao,
                            publico: true,
                            DepartamentoId: RotasManager.rotaAtiva.DepartamentoId
                                || user.Departamento.id
                        }).then(
                            function (obj) {
                                RotasManager.fechar();
                                $mdDialog.show($mdDialog.alert().title(
                                    $scope.res('COMUM_SUCESSO')).content(
                                        $scope.res('MSG_ROTA_ATUALIZADA'))
                                    .ok($scope.res('COMUM_OK')));
                                var rotas = MainState.getDirective('rotas');
                                if (rotas) {
                                    rotas.atualizarRotas();
                                }
                            },
                            function (err) {
                                toasty({
                                    msg: $scope.res('MSG_ERRO_ROTA_ATUALIZACAO')
                                });
                            });
            }
        };

        /**
        * Fecha a rota
        *
        * @method closeRota
        * 
        * 
        */
        $scope.closeRota = function () {
            $mdDialog.hide();
        };

    }


    function s4cAdicionarRotas() {
        return {
            restrict: 'E',
            templateUrl: 'app/directives/adicionar-rotas/adicionar-rotas.html',
            replace: true,
            controller: adicionarRotasCtrl,
            link: function ($scope) {
                $scope.res = $scope.$root.res;
                function converte(index) {
                    return ' ' + String.fromCharCode(65 + index);
                }

                angular.extend($scope, {
                    converte: converte
                });
            }
        };
    }

    /**
     * @ngdoc overview
     * @name s4c.components.rotas
     */
    angular.module('s4c.components.rotas', [
        's4c.filters.clockTime'
    ])
        .directive('s4cAdicionarRotas', s4cAdicionarRotas);

}());