Source: directives/planejamento-tarefa/edit-planejamento-tarefa.js

/**
 * @ngdoc directives
 * @name editPlanejamentoTarefa
 * @module s4c.directives.PlanejamentoTarefa.editPlanejamentoTarefa
 *
 * @description
 * `PlanejamentoTarefa` Controller das tarefas do módulo de planejamento 
 * 
 * 
 */
(function () {
    'use strict';

    function s4cEditPlanejamentoTarefa() {

        return {
            restrict: 'EA',
            templateUrl: 'app/directives/planejamento-tarefa/edit-planejamento-tarefa.html',
            controller: editPlanejamentoTarefaCtrl,
            link: function ($scope, $elem, $attrs) {
                $scope.res = $scope.$root.res;
                $scope.timeStep = 30;
                $scope.startDatetimepicker = $elem.find('#startDatetimepicker');

                var language;
                if ($scope.res("COMUM_LOCALE") == "pt-BR") {
                    language = 'pt-BR';
                } else {
                    language = 'en';
                }
                $scope.startDatetimepicker.datetimepicker({
                    theme: 'dark',
                    format: 'd/m/Y H:i',
                    lang: language,
                    step: $scope.timeStep,
                    onChangeDateTime: function (dp, input) {
                        this.setOptions({
                            maxTime: $scope.pTarefaModel.dataFim ? (input.val().split(' ')[0] == $scope.pTarefaModel.dataFim.split(' ')[0] ? $scope.pTarefaModel.dataFim.split(' ')[1] : false) : false
                        });
                    },
                    onShow: function () {
                        this.setOptions({
                            maxDate: $scope.pTarefaModel.dataFim ? $scope.pTarefaModel.dataFim.split(' ')[0] : false,
                            formatDate: 'd.m.Y',
                        });
                    }
                });

                $scope.endDatetimepicker = $elem.find('#endDatetimepicker');
                $scope.endDatetimepicker.datetimepicker({
                    theme: 'dark',
                    format: 'd/m/Y H:i',
                    lang: language,
                    step: $scope.timeStep,
                    onChangeDateTime: function (dp, input) {
                        this.setOptions({
                            minTime: $scope.pTarefaModel.dataInicio ? (input.val().split(' ')[0] == $scope.pTarefaModel.dataInicio.split(' ')[0] ? $scope.pTarefaModel.dataInicio.split(' ')[1] : false) : false
                        });
                    },
                    onShow: function () {
                        this.setOptions({
                            minDate: $scope.pTarefaModel.dataInicio ? $scope.pTarefaModel.dataInicio.split(' ')[0] : false,
                            formatDate: 'd.m.Y'
                        });
                    }
                });

                $scope.$parent.$directives = $scope.$parent.$directives || {};

                if ($scope.$parent.$directives['pTarefa']) {
                    throw 'Directive name already in use!';
                }

                $scope.$parent.$directives['pTarefa'] = $scope.$api;

                $scope.$on('$destroy', function () {
                    $scope.$parent.$directives['pTarefa'] = undefined;
                });
            }
        };
    }


    function editPlanejamentoTarefaCtrl($rootScope,
        $scope,
        $q,
        PlanejamentoService,
        FileUploader,
        API_ENDPOINT,
        $mdDialog,
        PlanejamentoDesenhoService,
        ngTableParams,
        AuthService,
        CommService,
        TipoEvento,
        toasty,
        CamadasService,
        MainState,
        PlanejamentoManager,
        EditPTarefaManager,
        $http,
        $filter,
        MapaService) {

        CommService.on('tarefa:update', function (data) {
            var tarefaCopy = angular.copy(data);

            //Update planejamento popup
            var planejamento = MainState.getDirective('planejamento');
            planejamento.updateTarefa(tarefaCopy);

            //Update terminal popup
            var terminal = MainState.getDirective('terminal');
            terminal.updateTarefa(tarefaCopy);

            // Update tarefa popup
            if (editing
                && $scope.pTarefaModel.id == data.id) {
                if (data.dataInicio)
                    data.dataInicio = $filter('timestamp2datetime')(data.dataInicio);

                if (data.dataFim)
                    data.dataFim = $filter('timestamp2datetime')(data.dataFim);

                abrirTarefa(data, $scope.viewMode);
            }
        });

        var desenhando = false;
        var viewFileOnMap = false;
        var editing = false;

        /**
         * @method abrirTarefa
         * @param {*} tarefa 
         * @param {*} viewMode 
         */
        function abrirTarefa(tarefa, viewMode) {
            editing = true;
            desenhando = false;
            $scope.readonly = false;
            $scope.viewMode = viewMode ? true : false;
            $scope.dirty = false;
            perguntaOnEdition = null;
            $scope.editingPergunta = false;

            if (tarefa === undefined)
                $scope.pTarefaModel = {};
            else {
                $scope.pTarefaModel = tarefa;
                if (tarefa.estado != 'PENDENTE' || viewMode)
                    $scope.readonly = true;
                popularDesenho();
            }

            viewFileOnMap = false;
        }

        /**
         * @method fecharTarefa
         */
        function fecharTarefa() {
            editing = false;
            removerDesenhoAtivo();
            $scope.pTarefaModel = {};
            if (viewFileOnMap) {
                MapaService.removerPoiClicado();
            }

            return desenhando;
        }

        /**
         * @method changeColor
         * @param {*} pTarefaModel 
         */
        function changeColor(pTarefaModel) {
            function toUpperCase(val) {
                if (val)
                    return val.toUpperCase();
                else
                    return "";
            }
            var estadosFechada = ["FECHADA", "ENTREGUE", "EXECUTADA", "CONCLUIDA"];
            var estadosAberta = ["PENDENTE"];
            var estadosCancelada = ["CANCELADA"];

            if (estadosFechada.indexOf(toUpperCase(pTarefaModel.estado)) >= 0) {
                return { 'background-color': '#8AC249' };
            } else if (estadosAberta.indexOf(toUpperCase(pTarefaModel.estado)) >= 0) {
                return { 'background-color': '#F34235' };
            } else if (estadosCancelada.indexOf(toUpperCase(pTarefaModel.estado)) >= 0) {
                return { 'background-color': '#862490' };
            }
        }

        /**
         * @method salvarTarefa
         */
        function salvarTarefa() {
            $scope.dirty = true;

            if (!$scope.formTarefa.$valid) {
                return;
            }

            if (!$scope.pTarefaModel.Usuario) {
                return;
            }
            if (!$scope.pTarefaModel.Camada) {
                return;
            }

            var planejamento = MainState.getDirective('planejamento');
            planejamento.adicionarTarefa($scope.pTarefaModel);

            EditPTarefaManager.fechar();
        }

        /**
         * @method getUsuarioMatches
         * @param {*} query 
         */
        function getUsuarioMatches(query) {
            var deferred = $q.defer();
            $http.get(API_ENDPOINT + 'usuarios/find/' + query)
                .then(function (res) {
                    if (_.isEmpty(res.data)) {
                        deferred.resolve([]);
                    } else {
                        deferred.resolve($filter('filter')(res.data, { 'imei': '' }));
                    }
                });
            return deferred.promise;
        };

        /**
         * @method selecionarUsuario
         * @param {*} usuario 
         */
        function selecionarUsuario(usuario) {
            $scope.pTarefaModel.Usuario = usuario;
            $scope.searchText = '';
        }

        /**
         * @method removerUsuario
         */
        function removerUsuario() {
            $scope.pTarefaModel.Usuario = null;
        }

        /**
         * @method editarDesenho
         */
        function editarDesenho() {
            EditPTarefaManager.iniciarEditorDesenho();
            desenhando = true;
        }

        /* Salvar Camada */
        /**
         * @method salvarDesenho
         * @param {*} cb 
         */
        function salvarDesenho(cb) {
            var camada = {
                nome: 'Desenho'
            };

            camada.geoJSON = PlanejamentoManager.pegarGeometrias();
            //camada.pontosDaRota = PlanejamentoManager.pegarPontosDaRota();
            camada.tipo = 'DESENHO';
            camada.DepartamentoId = AuthService.user.info.DepartamentoId;
            $scope.pTarefaModel.Camada = camada;
            popularDesenho();
            desenhando = false;
            cb();
        }

        /**
         * @method popularDesenho
         */
        function popularDesenho() {
            var resultado = {};

            removerDesenhoAtivo();

            var camada = $scope.pTarefaModel.Camada;
            if (camada != undefined && camada.tipo === 'DESENHO') {
                camada.ativo = true;
                ativarDesenho(camada);

                resultado['novo'] = resultado['novo'] || {
                    id: null,
                    nome: 'Novo desenho',
                    data: []
                }
                resultado['novo'].data.push(camada);
            }

            $scope.desenhos = resultado;
        }

        /**
         * @method removerDesenhoAtivo
         */
        function removerDesenhoAtivo() {
            _.each(Object.keys($scope.desenhos), function (key) {
                var desenho = $scope.desenhos[key];
                var camadas = desenho.data;
                _.each(camadas, function (camada) {
                    if (camada.objmapa) {
                        camada.objmapa.clearLayers();
                    }

                    if (camada.pontosDaRota) {
                        camada.pontosDaRota.router.setWaypoints([]);
                    }
                });
            });

            $scope.desenhos = {};
        }

        /**
         * @method ativarDesenho
         * @param {*} camada 
         */
        function ativarDesenho(camada) {
            if (typeof camada.geoJSON === 'string') {
                camada.geoJSON = JSON.parse(camada.geoJSON);
            }

            EditPTarefaManager.ativarDesenho(camada, function (obj) {
                camada.objmapa = obj;
            });
        }

        var perguntaOnEdition = null;

        /**
         * @method newPergunta
         */
        function newPergunta() {
            $scope.pergunta = {};
            perguntaOnEdition = null;

            $scope.editingPergunta = true;
        }

        /**
         * @method adicionarPergunta
         */
        function adicionarPergunta() {
            if (!$scope.formPergunta.$valid) {
                return;
            }
            if ($scope.pergunta.tipo == 'TIPO_ENUM'
                && !$scope.pergunta.opcoes) {
                return;
            }

            if (!$scope.pTarefaModel.Questoes)
                $scope.pTarefaModel.Questoes = [];

            if (perguntaOnEdition != null)
                removerPergunta(perguntaOnEdition);

            $scope.pTarefaModel.Questoes.push(angular.copy($scope.pergunta));

            $scope.editingPergunta = false;
        }

        /**
         * @method editarPergunta
         * @param {*} pergunta 
         */
        function editarPergunta(pergunta) {
            $scope.tipoLabel = obtenerTipo(pergunta.tipo);

            $scope.pergunta = angular.copy(pergunta);
            perguntaOnEdition = pergunta;

            $scope.editingPergunta = true;
        }

        /**
         * @method removerPergunta
         * @param {*} pergunta 
         */
        function removerPergunta(pergunta) {
            var index = $scope.pTarefaModel.Questoes.indexOf(pergunta);
            if (index < 0) {
                return;
            }
            $scope.pTarefaModel.Questoes.splice(index, 1);
        }

        /**
         * @method voarParaLocalizacao
         * @param {*} geojson 
         */
        function voarParaLocalizacao(geojson) {

            MapaService.piscarAzul({
                lat: geojson.geometry.coordinates[1],
                lng: geojson.geometry.coordinates[0],
            });

            MapaService.flyTo(geojson);
            viewFileOnMap = true;
        }

        /**
         * @method abrirImagem
         * @param {*} url 
         */
        function abrirImagem(url) {
            $mdDialog.show({
                template:
                    '<md-dialog aria-label="Detalhes imagem" style="max-with: 500px; max-height: 870px; overflow: scroll;">' +
                    '<md-dialog-content>' +
                    '<img src="' + url + '" style="height:750px;" /> ' +
                    '</md-dialog-content>' +
                    '<div class="md-actions">' +
                    '<md-button ng-click="closeDialog()" class="md-primary">Fechar</md-button>' +
                    '</div>' +
                    '</md-dialog>',
                locals: {
                    items: $scope.items
                },
                controller: function ($scope, $mdDialog) {
                    $scope.closeDialog = function () {
                        $mdDialog.hide();
                    };
                }
            });
        };

        /**
         * @method abrirVideo
         * @param {*} url 
         */
        function abrirVideo(url) {
            $mdDialog.show({
                template:
                    '<md-dialog aria-label="Detalhes video" style="max-with: 660px; max-height: 600px; overflow: scroll;">' +
                    '<md-dialog-content>' +
                    '<video width="640" height="480" controls autoplay style="margin:10px;">' +
                    '<source src="' + url + '" type="video/mp4">' +
                    '<source src="' + url + '" type="video/ogg">' +
                    '<source src="' + url + '" type="video/webm">' +
                    'Your browser does not support the video tag.' +
                    '</video>' +
                    '</md-dialog-content>' +
                    '<div class="md-actions">' +
                    '<md-button ng-click="closeDialog()" class="md-primary">Fechar</md-button>' +
                    '</div>' +
                    '</md-dialog>',
                locals: {
                    items: $scope.items
                },
                controller: function ($scope, $mdDialog) {
                    $scope.closeDialog = function () {
                        $mdDialog.hide();
                    };
                }
            });
        };

        /**
         * @method obtenerTipo
         * @param {*} id 
         */
        function obtenerTipo(id) {
            var label = "";
            $scope.tiposPergunta.forEach(function (tipo) {
                if (tipo.id == id)
                    label = tipo.label;
            });
            return label;
        }

        angular.extend($scope, {
            pTarefaModel: {},
            pergunta: {},
            salvarTarefa: salvarTarefa,
            getUsuarioMatches: getUsuarioMatches,
            selecionarUsuario: selecionarUsuario,
            removerUsuario: removerUsuario,
            desenhos: [],
            editarDesenho: editarDesenho,
            newPergunta: newPergunta,
            adicionarPergunta: adicionarPergunta,
            removerPergunta: removerPergunta,
            editarPergunta: editarPergunta,
            voarParaLocalizacao: voarParaLocalizacao,
            abrirImagem: abrirImagem,
            abrirVideo: abrirVideo,
            changeColor: changeColor,
            $api: {
                abrirTarefa: abrirTarefa,
                fecharTarefa: fecharTarefa,
                salvarDesenho: salvarDesenho
            },
            editingPergunta: false,
            tiposPergunta: [
                { id: 'TIPO_TEXTO', label: 'Texto' },
                { id: 'TIPO_ENUM', label: 'Opções' },
                { id: 'TIPO_BOOLEANO', label: 'Booleano' },
                { id: 'TIPO_NUMERO', label: 'Numero' },
                { id: 'TIPO_TEXTO_LONGO', label: 'Texto longo' }
            ]
        });

        MainState.registerDirective('pTarefa', $scope.$api);
        $scope.$on('$destroy', function () {
            MainState.unregisterDirective('pTarefa');
        });
    }

    editPlanejamentoTarefaCtrl.$inject = [
        '$rootScope',
        '$scope',
        '$q',
        'PlanejamentoService',
        'FileUploader',
        'API_ENDPOINT',
        '$mdDialog',
        'PlanejamentoDesenhoService',
        'ngTableParams',
        'AuthService',
        'CommService',
        'TipoEvento',
        'toasty',
        'CamadasService',
        'MainState',
        'PlanejamentoManager',
        'EditPTarefaManager',
        '$http',
        '$filter',
        'MapaService'
    ];

    s4cEditPlanejamentoTarefa.$inject = [];

    angular.module('s4c.components.planejamento', ['angular-toasty'])
        .directive('s4cEditPlanejamentoTarefa', s4cEditPlanejamentoTarefa);

    function toUpperCase(val) {
        if (val)
            return val.toUpperCase();
        else
            return "";
    }
    var estadosFechada = ["FECHADA", "ENTREGUE", "EXECUTADA", "CONCLUIDA"];

    angular.module('s4c.components.planejamento')
        .filter('tarefaFechada', function () {
            return function (estado) {
                if (estadosFechada.indexOf(toUpperCase(estado)) >= 0)
                    return true;
                else return false;
            };
        });

    angular.module('s4c.components.planejamento')
        .filter('tarefasFechadas', function () {
            return function (tarefas) {
                var filtered = [];
                angular.forEach(tarefas, function (tarefa) {
                    if (estadosFechada.indexOf(toUpperCase(tarefa.estado)) >= 0) {
                        filtered.push(tarefa);
                    }
                });
                return filtered;
            };
        });

    angular.module('s4c.components.planejamento')
        .filter('tarefasAbiertas', function () {
            return function (tarefas) {
                var filtered = [];
                angular.forEach(tarefas, function (tarefa) {
                    if (estadosFechada.indexOf(toUpperCase(tarefa.estado)) < 0) {
                        filtered.push(tarefa);
                    }
                });
                return filtered;
            };
        });

}());