/**
* @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
});
}
}());