Source: directives/area-atuacao/area_atuacao.js

  1. /**
  2. * @ngdoc directives
  3. * @name area_Atuacao
  4. * @module s4c.directives.area_Atuacao
  5. *
  6. * @description
  7. * `areaAtuacaoCtrl` Responsável por exibir as funções da Area de Atuação na tela, bem como o seu funcionamento.
  8. *
  9. * @example
  10. * <s4c-area-atuacao>
  11. * </s4c-area-atuacao>
  12. */
  13. (function () {
  14. 'use strict';
  15. areaAtuacaoCtrl.$inject = [
  16. '$scope',
  17. '$q',
  18. 'DetalhamentoService',
  19. 'ZonaObservacaoService',
  20. 'RegiaoService',
  21. '$state',
  22. 'AuthService',
  23. 'ParametrosS4C',
  24. '$mdDialog',
  25. 'CommService',
  26. 'MainState',
  27. 'IncidentesService',
  28. 'MapaService',
  29. 'BotoesManager',
  30. 'DetalhamentoManager',
  31. 'ZonaDeObservacaoManager',
  32. 'IncidentesManager',
  33. 'FileUploader',
  34. 'RotasManager',
  35. '$http',
  36. 'PermissoesService',
  37. 'LegendaIncidenteFilter',
  38. 'CamadasService',
  39. 'toasty',
  40. 'BlackList',
  41. 'Validate',
  42. 'localize',
  43. 'API_ENDPOINT',
  44. 'AreaAtuacaoManager'
  45. ];
  46. function areaAtuacaoCtrl($scope,
  47. $q,
  48. DetalhamentoService,
  49. ZonaObservacaoService,
  50. RegiaoService,
  51. $state,
  52. AuthService,
  53. ParametrosS4C,
  54. $mdDialog,
  55. CommService,
  56. MainState,
  57. IncidentesService,
  58. MapaService,
  59. BotoesManager,
  60. DetalhamentoManager,
  61. ZonaDeObservacaoManager,
  62. IncidentesManager,
  63. FileUploader,
  64. RotasManager,
  65. $http,
  66. PermissoesService,
  67. LegendaIncidenteFilter,
  68. CamadasService,
  69. toasty,
  70. BlackList,
  71. Validate,
  72. localize,
  73. API_ENDPOINT,
  74. AreaAtuacaoManager) {
  75. var usuarios = [];
  76. $scope.hasError = Validate.hasError;
  77. $scope.my_id = AuthService.user.info.id;
  78. $scope.areaAtuacao = {};
  79. $scope.censoHidden = true;
  80. $scope.poiHidden = true;
  81. $scope.cameraHidden = true;
  82. $scope.subItens = new L.LayerGroup([]);
  83. $scope.layerAnterior = null;
  84. $scope.poisProximos = [];
  85. $scope.camerasProximas = [];
  86. $scope.categoriasPoi = [];
  87. $scope.categoriasCamera = [];
  88. $scope.dados = {};
  89. /**
  90. * Obtem a lista de Permissões
  91. *
  92. * @method getPermissoes
  93. *
  94. *
  95. */
  96. PermissoesService.getPermissoes().then(function (perms) {
  97. $scope.permissoesVisualizacao = perms.permissoesVisualizacao;
  98. $scope.permissoesCriacao = perms.permissoesCriacao;
  99. $scope.permissoesEdicao = perms.permissoesEdicao;
  100. $scope.permissoesRemocao = perms.permissoesRemocao;
  101. $scope.permissoesExtras = perms.permissoesExtras;
  102. });
  103. $scope.$botoes = BotoesManager;
  104. $scope.openShare = false;
  105. /**
  106. * Busca uma região pelo id
  107. *
  108. * @method buscarRegiao
  109. * @param id {Integer} Identificação da região
  110. *
  111. *
  112. */
  113. function buscarRegiao(id) {
  114. RegiaoService
  115. .pegarRegiao(id)
  116. .then(function (regiao) {
  117. $scope.data = regiao;
  118. removerLayers(regiao.idArea);
  119. CamadasService.ativarMenuDaAreaAtuacao(regiao.idArea, regiao.id);
  120. });
  121. }
  122. /**
  123. * Carrega a camada da area de atuação
  124. *
  125. * @method carregarLayerAreaAtuacao
  126. * @param regiao {Object} Região com os seus atributos
  127. * @param node {Object} Camada do menu
  128. *
  129. *
  130. */
  131. function carregarLayerAreaAtuacao(regiao, node) {
  132. node.disabled = true;
  133. $http.get(API_ENDPOINT + "area_atuacao/" + regiao.idArea)
  134. .then(function (result) {
  135. node.disabled = false;
  136. $scope.areaAtuacao = result.data;
  137. if (verificaExistenciaLayer($scope.areaAtuacao.id)) {
  138. if (regiao.remover) {
  139. removerLayers($scope.areaAtuacao.id);
  140. }
  141. }
  142. else {
  143. MapaService.desenharRegioes(result.data, regiao.id, abrirJanela).then(function (arrayLayers) {
  144. _.each(arrayLayers, function (layer) {
  145. $scope.subItens.addLayer(layer);
  146. if (layer.idRegiao == regiao.id) {
  147. $scope.layerAnterior = layer;
  148. }
  149. });
  150. });
  151. }
  152. });
  153. }
  154. /**
  155. * Abre uma região em uma camada do mapa já existente
  156. *
  157. * @method abrirJanela
  158. *
  159. * @param idRegiao {Object} Identificador da Região
  160. * @param layer {Object} Camada do menu
  161. *
  162. *
  163. */
  164. function abrirJanela(idRegiao, layer) {
  165. AreaAtuacaoManager.ativo = true;
  166. $scope.data = {};
  167. //Verifica se já existe um layer ativo, caso exista desativa
  168. fechar();
  169. RegiaoService
  170. .pegarRegiao(idRegiao)
  171. .then(function (regiao) {
  172. $scope.data = regiao;
  173. layer.setStyle({
  174. fillOpacity: 0.8
  175. });
  176. $scope.layerAnterior = layer;
  177. });
  178. }
  179. /**
  180. * Desativa uma camada
  181. *
  182. * @method desativarLayer
  183. *
  184. *
  185. */
  186. function desativarLayer() {
  187. if ($scope.layerAnterior != null) {
  188. if ($scope.layerAnterior.setStyle) {
  189. $scope.layerAnterior.setStyle({
  190. fillOpacity: 0.4
  191. });
  192. }
  193. }
  194. }
  195. /**
  196. * Verifica se uma Area já está em alguma camada carregada
  197. *
  198. * @method verificaExistenciaLayer
  199. *
  200. * @param idArea {Object} Identificador da Area
  201. *
  202. *
  203. */
  204. function verificaExistenciaLayer(idArea) {
  205. var existe = false;
  206. _.each($scope.subItens.getLayers(), function (layer) {
  207. _.each(layer, function (region) {
  208. if (region.idArea == idArea) {
  209. existe = true;
  210. }
  211. });
  212. });
  213. return existe;
  214. }
  215. /**
  216. * Remove a Area de uma determinada camada
  217. *
  218. * @method removerLayers
  219. *
  220. * @param idArea {Object} Identificador da Area
  221. *
  222. *
  223. */
  224. function removerLayers(idArea) {
  225. var layersToRemove = [];
  226. _.each($scope.subItens.getLayers(), function (layer) {
  227. _.each(layer, function (region) {
  228. if (region != undefined && region.idArea == idArea) {
  229. layersToRemove.push(region);
  230. $scope.subItens.removeLayer(layer);
  231. }
  232. });
  233. });
  234. MapaService.removerLayers(layersToRemove);
  235. fechar();
  236. }
  237. /**
  238. * Remove todos os itens referente a Area de Atuação do mapa
  239. *
  240. * @method fechar
  241. *
  242. *
  243. */
  244. function fechar() {
  245. $scope.censoHidden = true;
  246. $scope.poiHidden = true;
  247. $scope.cameraHidden = true;
  248. $scope.poisProximos = [];
  249. $scope.camerasProximas = [];
  250. desativarLayer();
  251. }
  252. /**
  253. * Obtem dados refetente ao censo populacional
  254. *
  255. * @method pegarCenso
  256. *
  257. *
  258. */
  259. function pegarCenso() {
  260. $scope.ZO = {
  261. censo: {
  262. populacao: 0,
  263. criancas: 0,
  264. domicilios: 0,
  265. idosos: 0
  266. },
  267. multidao: {
  268. erro: false
  269. }
  270. };
  271. if ($scope.censoHidden) {
  272. var geometry = JSON.parse($scope.data.poiGeometricoBuffer);
  273. ZonaObservacaoService
  274. .pegarCenso(geometry)
  275. .then(function (data) {
  276. $scope.ZO.censo = {
  277. populacao: data.populacao,
  278. criancas: data.criancas,
  279. domicilios: data.domicilios,
  280. idosos: data.idosos
  281. };
  282. });
  283. }
  284. $scope.censoHidden = !$scope.censoHidden;
  285. }
  286. /**
  287. * Obtem as cameras que estão proximas a uma determinada região
  288. *
  289. * @method pegarCameras
  290. *
  291. *
  292. */
  293. function pegarCameras() {
  294. if ($scope.cameraHidden) {
  295. $scope.categoriasCamera = [];
  296. $http.post(API_ENDPOINT + 'cameras/geojson', $scope.data.poiGeometricoBuffer)
  297. .then(function (res) {
  298. $scope.camerasProximas = res.data;
  299. MapaService.removerLinhas();
  300. $scope.camerasProximas = _.map($scope.camerasProximas, function (camera) {
  301. var existeCategoria = false;
  302. _.each($scope.categoriasCamera, function (categoriaCamera) {
  303. if (categoriaCamera == camera.categoriaNome) {
  304. existeCategoria = true;
  305. }
  306. });
  307. if (!existeCategoria) {
  308. $scope.categoriasCamera.push(camera.categoriaNome);
  309. $scope.dados[camera.categoriaNome + '_hidden'] = true;
  310. $scope.dados[camera.categoriaNome + '_camerasProximas'] = [];
  311. }
  312. $scope.dados[camera.categoriaNome + '_camerasProximas'].push(camera);
  313. return camera;
  314. });
  315. if ($scope.camerasProximas.length > 0) {
  316. _.chain($scope.camerasProximas)
  317. .map('CategoriaCameraId')
  318. .uniq()
  319. .each(function (categoriaCameraId) {
  320. CamadasService.ativarMenuCategoriaCamera(categoriaCameraId);
  321. })
  322. .value();
  323. }
  324. }, function (err) {
  325. $mdDialog
  326. .show($mdDialog.alert()
  327. .title($scope.res('COMUM_ERRO'))
  328. .content(err.data.message)
  329. .ok($scope.res('COMUM_OK')));
  330. });
  331. }
  332. $scope.cameraHidden = !$scope.cameraHidden;
  333. }
  334. /**
  335. * Obtem os pois que estão proximas a uma determinada região
  336. *
  337. * @method pegarPOIs
  338. *
  339. *
  340. */
  341. function pegarPOIs() {
  342. if ($scope.poiHidden) {
  343. $scope.categoriasPoi = [];
  344. $http.post(API_ENDPOINT + 'datamining/geojson', $scope.data.poiGeometricoBuffer)
  345. .then(function (res) {
  346. $scope.poisProximos = res.data;
  347. $scope.poisProximos = _.map($scope.poisProximos, function (poi) {
  348. poi.tipo = 'poi';
  349. var existeCategoria = false;
  350. _.each($scope.categoriasPoi, function (categoriaPoi) {
  351. if (categoriaPoi == poi.categoriaNome) {
  352. existeCategoria = true;
  353. }
  354. });
  355. if (!existeCategoria) {
  356. $scope.categoriasPoi.push(poi.categoriaNome);
  357. $scope.dados[poi.categoriaNome + '_hidden'] = true;
  358. $scope.dados[poi.categoriaNome + '_poisProximos'] = [];
  359. }
  360. $scope.dados[poi.categoriaNome + '_poisProximos'].push(poi);
  361. return poi;
  362. });
  363. }, function (err) {
  364. $mdDialog
  365. .show($mdDialog.alert()
  366. .title($scope.res('COMUM_ERRO'))
  367. .content(err.data.message)
  368. .ok($scope.res('COMUM_OK')));
  369. });
  370. }
  371. $scope.poiHidden = !$scope.poiHidden;
  372. }
  373. /**
  374. * Exibe a categoria
  375. *
  376. * @method exibirCategoria
  377. * @param categoria {String} codigo da categoria
  378. *
  379. */
  380. function exibirCategoria(categoria) {
  381. $scope.dados[categoria + '_hidden'] = !$scope.dados[categoria + '_hidden'];
  382. }
  383. /**
  384. * Voa para um item do mapa
  385. *
  386. * @method voarParaSubItem
  387. * @param obj {Object} Objetos com as informações de lat e Lng
  388. *
  389. */
  390. function voarParaSubItem(obj) {
  391. AreaAtuacaoManager.voarParaSubItem($scope.data, obj);
  392. }
  393. /**
  394. * Ativa uma camada do mapa
  395. *
  396. * @method ativarLayer
  397. * @param idRegiao {Integer} Identificador da Região
  398. *
  399. */
  400. function ativarLayer(idRegiao) {
  401. _.each($scope.subItens.getLayers(), function (layer) {
  402. if (layer != undefined && layer.idRegiao == idRegiao) {
  403. layer.setStyle({
  404. fillOpacity: 0.8
  405. });
  406. }
  407. });
  408. }
  409. /**
  410. * Carrega regiões da area de atuação na camada do mapa
  411. *
  412. * @method carregarLayerAreaAtuacaoNaoPermitida
  413. * @param regioes {Object} Regiões
  414. *
  415. */
  416. function carregarLayerAreaAtuacaoNaoPermitida(regioes) {
  417. var areasCarregadas = [];
  418. //Remove os layers existentes para carregar novamente
  419. _.each(regioes, function (regiao) {
  420. if (verificaExistenciaLayer(regiao.idArea)) {
  421. removerLayers(regiao.idArea);
  422. }
  423. });
  424. _.each(regioes, function (regiao) {
  425. if (!verificaAreaCarregada(areasCarregadas, regiao.idArea)) {
  426. CamadasService.ativarMenuDaAreaAtuacao(regiao.idArea, regiao.id);
  427. areasCarregadas.push(regiao.idArea);
  428. }
  429. else {
  430. setTimeout(function () { ativarLayer(regiao.id); }, 1000);
  431. }
  432. });
  433. }
  434. /**
  435. * Verifica as areas carregadas no mapa
  436. *
  437. * @method verificaAreaCarregada
  438. * @param areasCarregadas {Object} Identificadores das areas carregadas
  439. * @param idArea {Integer} Id da Area de Atuação
  440. *
  441. */
  442. function verificaAreaCarregada(areasCarregadas, idArea) {
  443. var idAreaCarregada;
  444. for (var i = 0; i < areasCarregadas.length; i++) {
  445. idAreaCarregada = areasCarregadas[i];
  446. if (idArea == idAreaCarregada) {
  447. return true;
  448. }
  449. }
  450. return false;
  451. }
  452. angular.extend($scope, {
  453. data: {},
  454. pegarCenso: pegarCenso,
  455. pegarCameras: pegarCameras,
  456. pegarPOIs: pegarPOIs,
  457. voarParaSubItem: voarParaSubItem,
  458. exibirCategoria: exibirCategoria,
  459. $apiAreaAtuacao: {
  460. buscarRegiao: buscarRegiao,
  461. carregarLayerAreaAtuacao: carregarLayerAreaAtuacao,
  462. removerLayers: removerLayers,
  463. fechar: fechar,
  464. desativarLayer: desativarLayer,
  465. carregarLayerAreaAtuacaoNaoPermitida: carregarLayerAreaAtuacaoNaoPermitida
  466. }
  467. });
  468. MainState.registerDirective('areaAtuacao', $scope.$apiAreaAtuacao);
  469. $scope.$on('$destroy', function () {
  470. MainState.unregisterDirective('areaAtuacao');
  471. });
  472. }
  473. function s4cAreaAtuacao() {
  474. return {
  475. restrict: 'E',
  476. replace: true,
  477. scope: {},
  478. templateUrl: 'app/directives/area-atuacao/area_atuacao.html',
  479. controller: areaAtuacaoCtrl,
  480. link: function ($scope, $elem) {
  481. $scope.res = $scope.$root.res;
  482. }
  483. };
  484. }
  485. /**
  486. * @ngdoc overview
  487. * @name s4c.components.areaAtuacao
  488. */
  489. angular.module('s4c.components.areaAtuacao', ['angularMoment'])
  490. .directive('s4cAreaAtuacao', s4cAreaAtuacao);
  491. }());