/**
* @ngdoc directives
* @name area_Atuacao
* @module s4c.directives.area_Atuacao
*
* @description
* `areaAtuacaoCtrl` Responsável por exibir as funções da Area de Atuação na tela, bem como o seu funcionamento.
*
* @example
* <s4c-area-atuacao>
* </s4c-area-atuacao>
*/
(function () {
'use strict';
areaAtuacaoCtrl.$inject = [
'$scope',
'$q',
'DetalhamentoService',
'ZonaObservacaoService',
'RegiaoService',
'$state',
'AuthService',
'ParametrosS4C',
'$mdDialog',
'CommService',
'MainState',
'IncidentesService',
'MapaService',
'BotoesManager',
'DetalhamentoManager',
'ZonaDeObservacaoManager',
'IncidentesManager',
'FileUploader',
'RotasManager',
'$http',
'PermissoesService',
'LegendaIncidenteFilter',
'CamadasService',
'toasty',
'BlackList',
'Validate',
'localize',
'API_ENDPOINT',
'AreaAtuacaoManager'
];
function areaAtuacaoCtrl($scope,
$q,
DetalhamentoService,
ZonaObservacaoService,
RegiaoService,
$state,
AuthService,
ParametrosS4C,
$mdDialog,
CommService,
MainState,
IncidentesService,
MapaService,
BotoesManager,
DetalhamentoManager,
ZonaDeObservacaoManager,
IncidentesManager,
FileUploader,
RotasManager,
$http,
PermissoesService,
LegendaIncidenteFilter,
CamadasService,
toasty,
BlackList,
Validate,
localize,
API_ENDPOINT,
AreaAtuacaoManager) {
var usuarios = [];
$scope.hasError = Validate.hasError;
$scope.my_id = AuthService.user.info.id;
$scope.areaAtuacao = {};
$scope.censoHidden = true;
$scope.poiHidden = true;
$scope.cameraHidden = true;
$scope.subItens = new L.LayerGroup([]);
$scope.layerAnterior = null;
$scope.poisProximos = [];
$scope.camerasProximas = [];
$scope.categoriasPoi = [];
$scope.categoriasCamera = [];
$scope.dados = {};
/**
* 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.$botoes = BotoesManager;
$scope.openShare = false;
/**
* Busca uma região pelo id
*
* @method buscarRegiao
* @param id {Integer} Identificação da região
*
*
*/
function buscarRegiao(id) {
RegiaoService
.pegarRegiao(id)
.then(function (regiao) {
$scope.data = regiao;
removerLayers(regiao.idArea);
CamadasService.ativarMenuDaAreaAtuacao(regiao.idArea, regiao.id);
});
}
/**
* Carrega a camada da area de atuação
*
* @method carregarLayerAreaAtuacao
* @param regiao {Object} Região com os seus atributos
* @param node {Object} Camada do menu
*
*
*/
function carregarLayerAreaAtuacao(regiao, node) {
node.disabled = true;
$http.get(API_ENDPOINT + "area_atuacao/" + regiao.idArea)
.then(function (result) {
node.disabled = false;
$scope.areaAtuacao = result.data;
if (verificaExistenciaLayer($scope.areaAtuacao.id)) {
if (regiao.remover) {
removerLayers($scope.areaAtuacao.id);
}
}
else {
MapaService.desenharRegioes(result.data, regiao.id, abrirJanela).then(function (arrayLayers) {
_.each(arrayLayers, function (layer) {
$scope.subItens.addLayer(layer);
if (layer.idRegiao == regiao.id) {
$scope.layerAnterior = layer;
}
});
});
}
});
}
/**
* Abre uma região em uma camada do mapa já existente
*
* @method abrirJanela
*
* @param idRegiao {Object} Identificador da Região
* @param layer {Object} Camada do menu
*
*
*/
function abrirJanela(idRegiao, layer) {
AreaAtuacaoManager.ativo = true;
$scope.data = {};
//Verifica se já existe um layer ativo, caso exista desativa
fechar();
RegiaoService
.pegarRegiao(idRegiao)
.then(function (regiao) {
$scope.data = regiao;
layer.setStyle({
fillOpacity: 0.8
});
$scope.layerAnterior = layer;
});
}
/**
* Desativa uma camada
*
* @method desativarLayer
*
*
*/
function desativarLayer() {
if ($scope.layerAnterior != null) {
if ($scope.layerAnterior.setStyle) {
$scope.layerAnterior.setStyle({
fillOpacity: 0.4
});
}
}
}
/**
* Verifica se uma Area já está em alguma camada carregada
*
* @method verificaExistenciaLayer
*
* @param idArea {Object} Identificador da Area
*
*
*/
function verificaExistenciaLayer(idArea) {
var existe = false;
_.each($scope.subItens.getLayers(), function (layer) {
_.each(layer, function (region) {
if (region.idArea == idArea) {
existe = true;
}
});
});
return existe;
}
/**
* Remove a Area de uma determinada camada
*
* @method removerLayers
*
* @param idArea {Object} Identificador da Area
*
*
*/
function removerLayers(idArea) {
var layersToRemove = [];
_.each($scope.subItens.getLayers(), function (layer) {
_.each(layer, function (region) {
if (region != undefined && region.idArea == idArea) {
layersToRemove.push(region);
$scope.subItens.removeLayer(layer);
}
});
});
MapaService.removerLayers(layersToRemove);
fechar();
}
/**
* Remove todos os itens referente a Area de Atuação do mapa
*
* @method fechar
*
*
*/
function fechar() {
$scope.censoHidden = true;
$scope.poiHidden = true;
$scope.cameraHidden = true;
$scope.poisProximos = [];
$scope.camerasProximas = [];
desativarLayer();
}
/**
* Obtem dados refetente ao censo populacional
*
* @method pegarCenso
*
*
*/
function pegarCenso() {
$scope.ZO = {
censo: {
populacao: 0,
criancas: 0,
domicilios: 0,
idosos: 0
},
multidao: {
erro: false
}
};
if ($scope.censoHidden) {
var geometry = JSON.parse($scope.data.poiGeometricoBuffer);
ZonaObservacaoService
.pegarCenso(geometry)
.then(function (data) {
$scope.ZO.censo = {
populacao: data.populacao,
criancas: data.criancas,
domicilios: data.domicilios,
idosos: data.idosos
};
});
}
$scope.censoHidden = !$scope.censoHidden;
}
/**
* Obtem as cameras que estão proximas a uma determinada região
*
* @method pegarCameras
*
*
*/
function pegarCameras() {
if ($scope.cameraHidden) {
$scope.categoriasCamera = [];
$http.post(API_ENDPOINT + 'cameras/geojson', $scope.data.poiGeometricoBuffer)
.then(function (res) {
$scope.camerasProximas = res.data;
MapaService.removerLinhas();
$scope.camerasProximas = _.map($scope.camerasProximas, function (camera) {
var existeCategoria = false;
_.each($scope.categoriasCamera, function (categoriaCamera) {
if (categoriaCamera == camera.categoriaNome) {
existeCategoria = true;
}
});
if (!existeCategoria) {
$scope.categoriasCamera.push(camera.categoriaNome);
$scope.dados[camera.categoriaNome + '_hidden'] = true;
$scope.dados[camera.categoriaNome + '_camerasProximas'] = [];
}
$scope.dados[camera.categoriaNome + '_camerasProximas'].push(camera);
return camera;
});
if ($scope.camerasProximas.length > 0) {
_.chain($scope.camerasProximas)
.map('CategoriaCameraId')
.uniq()
.each(function (categoriaCameraId) {
CamadasService.ativarMenuCategoriaCamera(categoriaCameraId);
})
.value();
}
}, function (err) {
$mdDialog
.show($mdDialog.alert()
.title($scope.res('COMUM_ERRO'))
.content(err.data.message)
.ok($scope.res('COMUM_OK')));
});
}
$scope.cameraHidden = !$scope.cameraHidden;
}
/**
* Obtem os pois que estão proximas a uma determinada região
*
* @method pegarPOIs
*
*
*/
function pegarPOIs() {
if ($scope.poiHidden) {
$scope.categoriasPoi = [];
$http.post(API_ENDPOINT + 'datamining/geojson', $scope.data.poiGeometricoBuffer)
.then(function (res) {
$scope.poisProximos = res.data;
$scope.poisProximos = _.map($scope.poisProximos, function (poi) {
poi.tipo = 'poi';
var existeCategoria = false;
_.each($scope.categoriasPoi, function (categoriaPoi) {
if (categoriaPoi == poi.categoriaNome) {
existeCategoria = true;
}
});
if (!existeCategoria) {
$scope.categoriasPoi.push(poi.categoriaNome);
$scope.dados[poi.categoriaNome + '_hidden'] = true;
$scope.dados[poi.categoriaNome + '_poisProximos'] = [];
}
$scope.dados[poi.categoriaNome + '_poisProximos'].push(poi);
return poi;
});
}, function (err) {
$mdDialog
.show($mdDialog.alert()
.title($scope.res('COMUM_ERRO'))
.content(err.data.message)
.ok($scope.res('COMUM_OK')));
});
}
$scope.poiHidden = !$scope.poiHidden;
}
/**
* Exibe a categoria
*
* @method exibirCategoria
* @param categoria {String} codigo da categoria
*
*/
function exibirCategoria(categoria) {
$scope.dados[categoria + '_hidden'] = !$scope.dados[categoria + '_hidden'];
}
/**
* Voa para um item do mapa
*
* @method voarParaSubItem
* @param obj {Object} Objetos com as informações de lat e Lng
*
*/
function voarParaSubItem(obj) {
AreaAtuacaoManager.voarParaSubItem($scope.data, obj);
}
/**
* Ativa uma camada do mapa
*
* @method ativarLayer
* @param idRegiao {Integer} Identificador da Região
*
*/
function ativarLayer(idRegiao) {
_.each($scope.subItens.getLayers(), function (layer) {
if (layer != undefined && layer.idRegiao == idRegiao) {
layer.setStyle({
fillOpacity: 0.8
});
}
});
}
/**
* Carrega regiões da area de atuação na camada do mapa
*
* @method carregarLayerAreaAtuacaoNaoPermitida
* @param regioes {Object} Regiões
*
*/
function carregarLayerAreaAtuacaoNaoPermitida(regioes) {
var areasCarregadas = [];
//Remove os layers existentes para carregar novamente
_.each(regioes, function (regiao) {
if (verificaExistenciaLayer(regiao.idArea)) {
removerLayers(regiao.idArea);
}
});
_.each(regioes, function (regiao) {
if (!verificaAreaCarregada(areasCarregadas, regiao.idArea)) {
CamadasService.ativarMenuDaAreaAtuacao(regiao.idArea, regiao.id);
areasCarregadas.push(regiao.idArea);
}
else {
setTimeout(function () { ativarLayer(regiao.id); }, 1000);
}
});
}
/**
* Verifica as areas carregadas no mapa
*
* @method verificaAreaCarregada
* @param areasCarregadas {Object} Identificadores das areas carregadas
* @param idArea {Integer} Id da Area de Atuação
*
*/
function verificaAreaCarregada(areasCarregadas, idArea) {
var idAreaCarregada;
for (var i = 0; i < areasCarregadas.length; i++) {
idAreaCarregada = areasCarregadas[i];
if (idArea == idAreaCarregada) {
return true;
}
}
return false;
}
angular.extend($scope, {
data: {},
pegarCenso: pegarCenso,
pegarCameras: pegarCameras,
pegarPOIs: pegarPOIs,
voarParaSubItem: voarParaSubItem,
exibirCategoria: exibirCategoria,
$apiAreaAtuacao: {
buscarRegiao: buscarRegiao,
carregarLayerAreaAtuacao: carregarLayerAreaAtuacao,
removerLayers: removerLayers,
fechar: fechar,
desativarLayer: desativarLayer,
carregarLayerAreaAtuacaoNaoPermitida: carregarLayerAreaAtuacaoNaoPermitida
}
});
MainState.registerDirective('areaAtuacao', $scope.$apiAreaAtuacao);
$scope.$on('$destroy', function () {
MainState.unregisterDirective('areaAtuacao');
});
}
function s4cAreaAtuacao() {
return {
restrict: 'E',
replace: true,
scope: {},
templateUrl: 'app/directives/area-atuacao/area_atuacao.html',
controller: areaAtuacaoCtrl,
link: function ($scope, $elem) {
$scope.res = $scope.$root.res;
}
};
}
/**
* @ngdoc overview
* @name s4c.components.areaAtuacao
*/
angular.module('s4c.components.areaAtuacao', ['angularMoment'])
.directive('s4cAreaAtuacao', s4cAreaAtuacao);
}());