Source: components/admin/controllers/area_atuacao.controller.js

/**
 * @ngdoc controllers
 * @name AreaAtuacao.Controller
 * @module s4c.components.admin.controllers.areaAtuacao
 *
 * @description
 * `AdminAreaAtuacaoCtrl` Controller da tela de Area de Atuação do módulo de administração
 * 
 * 
 */
(function () {
    'use strict';

    AdminAreaAtuacaoCtrl.$inject = [
        '$scope',
        '$http',
        '$mdDialog',
        'API_ENDPOINT',
        'ngFileReader',
        'MapaAreaDeAtuacao',
        '$rootScope',
        'MainState',
        'AuthService'

    ];

    angular.module('s4c.controllers.AdminAreaAtuacaoCtrl', [
        's4c.directives.ngFileReader'
    ])
        .controller('AdminAreaAtuacaoCtrl', AdminAreaAtuacaoCtrl)
        .directive('focusOn', function () {
            return function (scope, elem, attr) {
                scope.$on(attr.focusOn, function (e) {
                    elem[0].focus();
                });
            };
        });

    function AdminAreaAtuacaoCtrl($scope, $http, $mdDialog, API_ENDPOINT,
        ngFileReader, MapaAreaDeAtuacao, $rootScope, MainState, AuthService) {

        $scope.res = $rootScope.res;
        $scope.selectedRows = [];
        $scope.editar = false;
        $scope.flagEditarRegiao = false;
        $scope.regioes = [];
        $scope.msgSalvandoHidden = true;
        carregarAreas();

        var basicColumns = [
            {
                headerName: '',
                width: 180,
                field: "label",
                editable: true
            }
        ];

        $scope.exibeMapa = false;

        /**
         * @method onFileSelected
         * @param {*} file 
         */
        function onFileSelected(file) {

            var confirm = $mdDialog.confirm()
                .title($scope.res('AREA_ATUACAO_MSG_IMPORTACAO'))
                .ok($scope.res('COMUM_SIM'))
                .cancel($scope.res('COMUM_NAO'));

            $mdDialog.show(confirm).then(function () {
                var json = KMLParser.loadKML(file.contents, ['GeometryCollection', 'Polygon', 'MultiPolygon']);
                var rows = [];

                var geojsonIndex = json.head.indexOf('geojson');
                var nameIndex = json.head.indexOf('name');
                var descriptionIndex = json.head.indexOf('description');
                var apagarDescricao = false;

                rows = rows.concat(_.map(json.body, function (row) {

                    var poiGeometrico = {
                        type: 'GeometryCollection',
                        geometries: []
                    };
                    var geojson = JSON.parse(row[geojsonIndex]);

                    if (geojson.type === 'GeometryCollection') {

                        poiGeometrico.geometries.push(new Terraformer.MultiPolygon(
                            _.map(geojson.geometries, 'coordinates')));

                    } else {
                        var feature = {
                            type: 'Feature',
                            geometry: geojson
                        };

                        var simplified = feature;
                        var geojson = simplified.geometry;

                        poiGeometrico.geometries.push(new Terraformer.MultiPolygon([geojson.coordinates]));
                    }

                    if (row[descriptionIndex] != null && row[descriptionIndex].length > 255) {
                        apagarDescricao = true;
                    }

                    return {
                        _id: _.uniqueId(),
                        nome: row[nameIndex],
                        descricao: row[descriptionIndex],
                        poiGeometrico: poiGeometrico
                    };
                }));

                //Se a descricao for maior que 255 caracteres, apago a informação.
                _.map(rows, function (row) {
                    if (apagarDescricao) {
                        row.descricao = '';
                    }
                });

                if (apagarDescricao) {
                    $mdDialog
                        .show($mdDialog.alert()
                            .title($scope.res('COMUM_AVISO'))
                            .content($scope.res('REGIAO_DESCRICAO_ACIMA'))
                            .ok($scope.res('COMUM_OK')));
                }

                $scope.regioes = rows;
                loadMap();
            });
        }

        ngFileReader.on('fileSelectedAREAATUACAO', onFileSelected);
        MapaAreaDeAtuacao.on('areaDeAtuacaoEditada', function (data) {
            $scope.regiao.poiGeometrico = data.geojson;
        });

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

            var selecionados = _.map($scope.gridOptions.api.getSelectedNodes(), 'data._id');

            _.remove($scope.gridOptions.rowData, function (row) {
                return _.includes(selecionados, row._id)
            });

            $scope.gridOptions.api.onNewRows();

        }

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

            if ($scope.areaAtuacao.nome == '') {
                $mdDialog
                    .show($mdDialog.alert()
                        .title($scope.res('COMUM_ERRO'))
                        .content($scope.res('AREA_ATUACAO_INFORMAR_NOME'))
                        .ok($scope.res('COMUM_OK')));
                return;
            }

            var areaAtuacao = $scope.areaAtuacao;
            areaAtuacao.regioes = _.map($scope.regioes, function (regiao) {
                regiao.poiGeometrico = JSON.stringify(regiao.poiGeometrico);

                return regiao;
            });

            $scope.msgSalvandoHidden = false;

            $http.post("/area_atuacao", areaAtuacao)
                .then(function (data) {
                    $mdDialog
                        .show($mdDialog.alert()
                            .title($scope.res('COMUM_SUCESSO'))
                            .content($scope.res('MENSAGEM_SUCESSO_ATUALIZACAO_AREA_DE_ATUACAO'))
                            .ok($scope.res('COMUM_OK')));
                    $scope.editar = false;
                    carregarAreas();
                    $scope.msgSalvandoHidden = true;

                    $http.get(API_ENDPOINT + 'area_atuacao/permissoes')
                        .then(function (permissoes) {

                            AuthService.user.info.permissoesAreaAtuacao = permissoes.data;

                        }, function (err) {
                            p.reject(err);
                        });


                }, function (err) {
                    $mdDialog
                        .show($mdDialog.alert()
                            .title($scope.res('COMUM_ERRO'))
                            .content(err.data.message)
                            .ok($scope.res('COMUM_OK')));
                    $scope.msgSalvandoHidden = true;
                });
        }

        $scope.$watch('areaAtuacao.cor', function (newVal) {
            loadMap();
        });

        /**
         * @method loadMap
         */
        function loadMap() {
            var mapa = MainState.getDirective('mapaAreaDeAtuacao');
            if (mapa != null && mapa != undefined) {
                mapa.buildMap(onMapaDone, $scope.areaAtuacao);
            }
        }

        /**
         * @method onMapaDone
         */
        function onMapaDone() {
            MapaAreaDeAtuacao.atualizarArea($scope.regioes, { desenhar: false, cor: $scope.areaAtuacao.cor });
        }

        /**
         * @method criarNovaRegiao
         */
        function criarNovaRegiao() {
            $scope.regiao = { _id: _.uniqueId(), nome: '', poiGeometrico: null, campos: [] };
            $scope.$broadcast('newItemAdded');
            MapaAreaDeAtuacao.editarRegiao($scope.regiao);
            $scope.flagEditarRegiao = true;
            $scope.desenhar = true;

            setTimeout(function () { loadMap(); }, 1500);
        }

        /**
         * @method abrirModalAdicionarCampoRegiao
         */
        function abrirModalAdicionarCampoRegiao() {
            $mdDialog.show({
                scope: $scope.$new(),
                template: '<md-dialog draggable style="width: 200px;">' +
                    '<md-title style="padding: 20px 0px 0px 20px;">' + $scope.res('REGIAO_ADICIONAR_CAMPO') + '</md-title>' +
                    '<br>' +
                    '<div flex>' +

                    ' <div style="height: 80px;" class="ag-fresh">' +

                    ' <md-input-container class="md-accent">' +
                    ' <label class="md-accent">' + $scope.res('REGIAO_NOME_CAMPO') + '</label>' +
                    ' <input class="md-accent" ng-model="nomeCampo">' +
                    ' </md-input-container>' +

                    ' </div>' +
                    '  <div class="md-actions">' +
                    '    <md-button ng-click="fechar()">' + $scope.res('COMUM_CANCELAR') + '</md-button>' +
                    '    <md-button ng-click="adicionar()">' + $scope.res('COMUM_OK') + '</md-button>' +
                    '  </div>' +

                    '  </div>' +
                    '</md-dialog>',
                controller: function ($scope, $mdDialog) {
                    $scope.fechar = function () {
                        $mdDialog.hide();
                    }
                    $scope.adicionar = function () {
                        var campoExiste = false;
                        _.each($scope.regiao.campos, function (campo) {
                            if (campo.nome.toUpperCase() == $scope.nomeCampo.toUpperCase()) {
                                campoExiste = true;
                            }
                        });
                        if (campoExiste) {
                            $mdDialog
                                .show($mdDialog.alert()
                                    .title($scope.res('COMUM_ERRO'))
                                    .content($scope.res('REGIAO_CAMPO_EXISTENTE'))
                                    .ok($scope.res('COMUM_OK')));
                            return;
                        }
                        else {
                            adicionarCampoRegiao($scope.nomeCampo);
                            $scope.fechar();
                        }
                    }
                }
            });
        }

        /**
         * @method adicionarCampoRegiao
         * @param {*} nomeCampo 
         */
        function adicionarCampoRegiao(nomeCampo) {
            if ($scope.regiao.campos == undefined) {
                $scope.regiao.campos = [];
            }
            $scope.regiao.campos.push({ nome: nomeCampo, valor: '' });
        }

        /**
         * @method removerCampoRegiao
         * @param {*} nomeCampo 
         */
        function removerCampoRegiao(nomeCampo) {
            var index = 0;
            var indexDelete = -1;

            _.each($scope.regiao.campos, function (campo) {
                if (campo.nome == nomeCampo) {
                    indexDelete = index;
                }

                index++;
            });

            if (indexDelete > -1) {
                $scope.regiao.campos.splice(indexDelete, 1);
            }
        }

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

            if ($scope.regiao.nome == '') {
                $mdDialog
                    .show($mdDialog.alert()
                        .title($scope.res('COMUM_ERRO'))
                        .content($scope.res('REGIAO_INFORMAR_NOME_REGIAO'))
                        .ok($scope.res('COMUM_OK')));
                return;
            }

            if ($scope.regiao.poiGeometrico == null) {
                $mdDialog
                    .show($mdDialog.alert()
                        .title($scope.res('COMUM_ERRO'))
                        .content($scope.res('REGIAO_INFORMAR_DESENHO_REGIAO'))
                        .ok($scope.res('COMUM_OK')));
                return;
            }
            var index = 0;
            var atualizou = false;

            _.each($scope.regioes, function (regiao) {
                if (regiao._id == $scope.regiao._id) {
                    $scope.regioes[index] = $scope.regiao;
                    atualizou = true;
                }

                index++;
            });

            if (!atualizou) {
                $scope.regioes.push($scope.regiao);
            }

            $scope.regiao = {};
            $scope.desenhar = false;
            $scope.focusInput = false;
            $scope.flagEditarRegiao = false;
        }

        /**
         * @method editarRegiao
         * @param {*} regiao 
         */
        function editarRegiao(regiao) {
            $scope.regiao = regiao;
            var poiGeometrico = regiao.poiGeometrico;
            if (typeof regiao.poiGeometrico === 'string' || regiao.poiGeometrico instanceof String) {
                poiGeometrico = JSON.parse(regiao.poiGeometrico);
            }
            if (poiGeometrico.geometries.length > 0 && (poiGeometrico.geometries[0].coordinates[0][0].length > 1000 || poiGeometrico.geometries[0].coordinates.length >= 10)) {
                $mdDialog
                    .show($mdDialog.alert()
                        .title($scope.res('COMUM_AVISO'))
                        .content($scope.res('REGIAO_DESENHO_GRANDE'))
                        .ok($scope.res('COMUM_OK')));
                MapaAreaDeAtuacao.desativarEdicao();
                return;
            }
            MapaAreaDeAtuacao.editarRegiao(regiao);
            $scope.flagEditarRegiao = true;
        }

        /**
         * @method deleteRegiao
         * 
         * @param {*} event 
         * @param {*} regiaoExcluir 
         */
        function deleteRegiao(event, regiaoExcluir) {
            var index = 0;
            var indexDelete = -1;

            _.each($scope.regioes, function (regiao) {
                if (regiao._id == regiaoExcluir._id) {
                    indexDelete = index;
                }

                index++;
            });

            if (indexDelete > -1) {
                $scope.regioes.splice(indexDelete, 1);
            }
            MapaAreaDeAtuacao.limparArea(regiaoExcluir);
            $scope.regiao = { _id: _.uniqueId(), nome: '', poiGeometrico: null };
        }

        /**
         * @method criarNovoLabel
         */
        function criarNovoLabel() {
            $scope.editar = true;
            $scope.flagEditarRegiao = false;
            $scope.areaAtuacao = { _id: _.uniqueId() };
            $scope.areaAtuacao.label = "";
            $scope.areaAtuacao.cor = "#000000";
            $scope.regioes = [];
            $scope.regiao = {};

            setTimeout(function () { loadMap(); }, 1500);
        }

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

            var index = 0;
            _.each($scope.areasAtuacao, function (areaAtuacao) {
                if ($scope.areaAtuacao._id == areaAtuacao._id) {
                    $scope.areasAtuacao.splice(index, 1);
                }
                index++;
            });

            if ($scope.areaAtuacao.id != undefined && $scope.areaAtuacao.id != null) {

                $http.post("/area_atuacao/" + $scope.areaAtuacao.id)
                    .then(function (data) {
                        $mdDialog
                            .show($mdDialog.alert()
                                .title($scope.res('COMUM_SUCESSO'))
                                .content($scope.res('MENSAGEM_SUCESSO_ATUALIZACAO_AREA_DE_ATUACAO'))
                                .ok($scope.res('COMUM_OK')));
                        carregarAreas();

                        $http.get(API_ENDPOINT + 'area_atuacao/permissoes')
                            .then(function (permissoes) {

                                AuthService.user.info.permissoesAreaAtuacao = permissoes.data;

                            }, function (err) {
                                p.reject(err);
                            });

                    }, function (err) {
                        $mdDialog
                            .show($mdDialog.alert()
                                .title($scope.res('COMUM_ERRO'))
                                .content(err.data.message)
                                .ok($scope.res('COMUM_OK')));
                    });
            }

            $scope.editar = false;
            $scope.areaAtuacao = null;
            MapaAreaDeAtuacao.limparArea(null);
        }

        /**
         * @method editarAreaAtuacao
         */
        function editarAreaAtuacao() {
            $scope.editar = !$scope.editar;
        }

        /**
         * 
         * @method ativarLabel
         * 
         * @param {*} element 
         */
        function ativarLabel(element) {

            if (typeof $scope.areaAtuacao === 'string' || $scope.areaAtuacao instanceof String) {
                $scope.areaAtuacao = JSON.parse($scope.areaAtuacao);
            }

            $http.get(API_ENDPOINT + "area_atuacao/" + $scope.areaAtuacao.id)
                .then(function (result) {

                    $scope.areaAtuacao = result.data;
                    if (typeof $scope.areaAtuacao === 'string' || $scope.areaAtuacao instanceof String) {
                        $scope.areaAtuacao = JSON.parse($scope.areaAtuacao);
                    }

                    _.each($scope.areaAtuacao.regioes, function (regiao) {
                        regiao._id = _.uniqueId();
                    });

                    $scope.regioes = $scope.areaAtuacao.regioes;
                    setTimeout(function () { loadMap(); }, 1500);
                    $scope.regiao = { _id: _.uniqueId(), nome: '', poiGeometrico: null };
                    $scope.flagEditarRegiao = false;

                }, function (err) {
                    $mdDialog
                        .show($mdDialog.alert()
                            .title($scope.res('COMUM_ERRO'))
                            .content(err.data.message)
                            .ok($scope.res('COMUM_OK')));
                });
        }

        /**
         * @method carregarAreas
         */
        function carregarAreas() {
            $http.get(API_ENDPOINT + "area_atuacao")
                .then(function (result) {
                    $scope.areasAtuacao = result.data;
                    _.each($scope.areasAtuacao, function (areaAtuacao) {
                        areaAtuacao._id = _.uniqueId();
                    });

                    $http.get(API_ENDPOINT + 'area_atuacao/permissoes')
                        .then(function (permissoes) {

                            AuthService.user.info.permissoesAreaAtuacao = permissoes.data;

                        }, function (err) {
                            p.reject(err);
                        });

                }, function (err) {
                    $mdDialog
                        .show($mdDialog.alert()
                            .title($scope.res('COMUM_ERRO'))
                            .content(err.data.message)
                            .ok($scope.res('COMUM_OK')));
                });
        }

        angular.extend($scope, {
            criarNovoLabel: criarNovoLabel,
            criarNovaRegiao: criarNovaRegiao,
            adicionarRegiao: adicionarRegiao,
            abrirModalAdicionarCampoRegiao: abrirModalAdicionarCampoRegiao,
            removerCampoRegiao: removerCampoRegiao,
            ativarLabel: ativarLabel,
            deletarSelecionados: deletarSelecionados,
            salvar: salvar,
            editarRegiao: editarRegiao,
            deleteRegiao: deleteRegiao,
            editarAreaAtuacao: editarAreaAtuacao,
            deletarAreaAtuacao: deletarAreaAtuacao
        });
    }

}());