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

  1. /**
  2. * @ngdoc controllers
  3. * @name Cameras
  4. * @module s4c.components.admin.controllers.Cameras
  5. *
  6. * @description
  7. * `AdminCamerasCtrl` Controller da tela de Câmeras do módulo de administração
  8. *
  9. *
  10. */
  11. (function () {
  12. 'use strict';
  13. AdminCamerasCtrl.$inject = [
  14. '$scope',
  15. '$http',
  16. '$mdDialog',
  17. 'API_ENDPOINT',
  18. 'ngFileReader',
  19. 'MapaEndereco',
  20. '$rootScope',
  21. 'FileUploader'
  22. ];
  23. angular.module('s4c.controllers.AdminCamerasCtrl', [
  24. 's4c.services.Categoria',
  25. 's4c.directives.ngFileReader'
  26. ]).controller('AdminCamerasCtrl', AdminCamerasCtrl);
  27. function AdminCamerasCtrl($scope, $http, $mdDialog, API_ENDPOINT, ngFileReader, MapaEndereco, $rootScope, FileUploader) {
  28. $scope.res = $rootScope.res;
  29. function AdicionarCategoriaCtrl($scope, $mdDialog, categoriaCamera, res) {
  30. $scope.res = res;
  31. //$scope.ip = '';
  32. categoriaCamera ? $scope.categoriaCamera = categoriaCamera : null;
  33. categoriaCamera ? $scope.modo = $scope.res('COMUM_EDITAR') : $scope.modo = $scope.res('COMUM_NOVA');
  34. $scope.cancelar = $mdDialog.cancel;
  35. /**
  36. * @method ok
  37. */
  38. $scope.ok = function () {
  39. if ($scope.formCategoria.$valid) {
  40. //var atributos = {};
  41. //atributos.ip = $scope.ip;
  42. //$scope.categoriaCamera.atributos = atributos;
  43. $mdDialog.hide($scope.categoriaCamera);
  44. }
  45. };
  46. /**
  47. * @method exibirCamposTipoCategoria
  48. */
  49. $scope.exibirCamposTipoCategoria = function () {
  50. if ($scope.categoriaCamera.tipo == 'wowza') {
  51. $scope.visibleDivWowza = true;
  52. }
  53. else {
  54. $scope.visibleDivWowza = false;
  55. }
  56. };
  57. if ($scope.categoriaCamera != null && $scope.categoriaCamera.tipo == "wowza") {
  58. $scope.visibleDivWowza = true;
  59. //$scope.ip = $scope.categoriaCamera.atributos.ip;
  60. }
  61. else {
  62. $scope.visibleDivWowza = false;
  63. }
  64. }
  65. var basicColumns = [{
  66. headerName: '',
  67. width: 150,
  68. checkboxSelection: true,
  69. suppressSorting: true,
  70. suppressMenu: true
  71. }, {
  72. headerName: $scope.res('COMUM_NOME'),
  73. width: 500,
  74. field: "nome",
  75. editable: true,
  76. cellClicked: fecharMapa,
  77. volatile: true
  78. }, {
  79. headerName: $scope.res('COMUM_DESCRICAO'),
  80. width: 500,
  81. field: "descricao",
  82. editable: true,
  83. cellClicked: fecharMapa,
  84. volatile: true
  85. },
  86. {
  87. headerName: $scope.res('COMUM_BAIRRO'),
  88. width: 200,
  89. field: "bairro",
  90. editable: true,
  91. cellClicked: abrirMapa,
  92. volatile: true
  93. }, {
  94. headerName: $scope.res('COMUM_LATITUDE'),
  95. width: 300,
  96. field: "latitude",
  97. editable: true,
  98. cellClicked: abrirMapa,
  99. newValueHandler: atualizarLatitude,
  100. volatile: true
  101. }, {
  102. headerName: $scope.res('COMUM_LONGITUDE'),
  103. width: 300,
  104. field: "longitude",
  105. editable: true,
  106. cellClicked: abrirMapa,
  107. newValueHandler: atualizarLongitude,
  108. volatile: true
  109. }, {
  110. headerName: $scope.res('COMUM_NUMERO'),
  111. width: 300,
  112. field: "numero",
  113. editable: true,
  114. cellClicked: fecharMapa,
  115. volatile: true
  116. }, {
  117. headerName: $scope.res('COMUM_ALTURA'),
  118. width: 300,
  119. field: "altura",
  120. editable: true,
  121. suppressSorting: true,
  122. cellClicked: fecharMapa,
  123. volatile: true
  124. }, {
  125. headerName: $scope.res('COMUM_LARGURA'),
  126. width: 300,
  127. field: "largura",
  128. editable: true,
  129. suppressSorting: true,
  130. cellClicked: fecharMapa,
  131. volatile: true
  132. }, {
  133. headerName: "URL",
  134. width: 400,
  135. field: "url",
  136. editable: true,
  137. suppressSorting: true,
  138. cellClicked: fecharMapa,
  139. volatile: true
  140. }, {
  141. headerName: $scope.res('COMUM_IDENTIFICADOR'),
  142. width: 500,
  143. field: "chave_estrangeira",
  144. editable: true,
  145. cellClicked: fecharMapa,
  146. volatile: true
  147. }, {
  148. headerName: $scope.res('COMUM_URLICONE'),
  149. width: 400,
  150. field: "urlIcone",
  151. editable: true,
  152. suppressSorting: true,
  153. cellClicked: fecharMapa,
  154. volatile: true
  155. }, {
  156. headerName: $scope.res('GRAVACAO_CONTROLE'),
  157. width: 550,
  158. enableCellEdit: false,
  159. cellRenderer: controlRecord
  160. }, {
  161. headerName: $scope.res('GRAVACAO_CONTINUA'),
  162. width: 550,
  163. field: 'continuousRecording',
  164. cellRenderer: controlContinuousRecording
  165. }, {
  166. headerName: $scope.res('GRAVACAO_LIMITE_DVR'),
  167. width: 300,
  168. field: "limiteArmazenamentoDvr",
  169. editable: true,
  170. cellClicked: fecharMapa,
  171. volatile: true
  172. }
  173. ];
  174. /**
  175. * @method controlContinuousRecording
  176. * @param {*} params
  177. */
  178. function controlContinuousRecording(params) {
  179. var html;
  180. if ($scope.categoriaCamera.tipo != 'wowza') {
  181. html = '<div style="text-align: center;"><a>' + $scope.res('GRAVACAO_NAO_DISPONIVEL') + '</a></div>';
  182. }
  183. else {
  184. html = '<div style="text-align: right;"><input type="checkbox" ng-model="data.continuousRecording" style="display:inherit;"/></div>';
  185. }
  186. return html;
  187. }
  188. /**
  189. * @method controlRecord
  190. * @param {*} params
  191. */
  192. function controlRecord(params) {
  193. var camera = getCameraById(params.data.id);
  194. var html;
  195. if ($scope.categoriaCamera.tipo != 'wowza') {
  196. html = '<div style="text-align: center;"><a>' + $scope.res('GRAVACAO_NAO_DISPONIVEL') + '</a></div>';
  197. }
  198. else if (camera.recording) {
  199. html = '<div style="text-align: center;">' +
  200. '<a href="javascript:;" ng-click="stopRecord(' + camera.id + ',' + params.rowIndex + ');" ><img src="/assets/images/Camera/stop_24px.png"></img></a></div>';
  201. }
  202. else {
  203. html = '<div style="text-align: center;">' +
  204. '<a href="javascript:;" ng-click="startRecord(' + camera.id + ',' + params.rowIndex + ');" ><img src="/assets/images/Camera/rec_24px.png"></img></a></div>';
  205. }
  206. return html;
  207. }
  208. /**
  209. * @method getCameraById
  210. * @param {*} id
  211. */
  212. function getCameraById(id) {
  213. var camera;
  214. _.each($scope.gridOptions.rowData, function (row) {
  215. if (row.id == id) {
  216. camera = row;
  217. }
  218. });
  219. return camera;
  220. }
  221. /**
  222. * @method setRecordingCamera
  223. * @param {*} camera
  224. */
  225. function setRecordingCamera(camera) {
  226. var index = 0;
  227. _.each($scope.gridOptions.rowData, function (row) {
  228. if (row.id == camera.id) {
  229. $scope.gridOptions.rowData[index].recording = camera.recording;
  230. }
  231. index++;
  232. });
  233. }
  234. /**
  235. * @method startRecord
  236. * @param {*} id
  237. * @param {*} index
  238. */
  239. $scope.startRecord = function (id, index) {
  240. var camera = getCameraById(id);
  241. if (camera.recording) {
  242. $mdDialog.show($mdDialog.alert()
  243. .title($scope.res('COMUM_ERRO'))
  244. .content($scope.res('GRAVACAO_EM_ANDAMENTO'))
  245. .ok($scope.res('COMUM_OK')));
  246. return;
  247. }
  248. var recording = 'true';
  249. $.ajax({
  250. type: "GET",
  251. url: $scope.categoriaCamera.atributos.ip + "dvrstreamrecord?app=" + $scope.categoriaCamera.atributos.application
  252. + "&streamname=" + camera.nome + ".stream&action=start" + "&instancename=" + camera.nome,
  253. success: function (data) {
  254. $http.post(API_ENDPOINT + "cameras/record/" + camera.id, recording).then(function (response) {
  255. setRecordingCamera(response.data);
  256. $mdDialog
  257. .show($mdDialog.alert()
  258. .title($scope.res('COMUM_SUCESSO'))
  259. .content($scope.res('GRAVACAO_INICIADA'))
  260. .ok($scope.res('COMUM_OK')));
  261. $scope.gridOptions.api.refreshView();
  262. }, function (err) {
  263. $mdDialog
  264. .show($mdDialog.alert()
  265. .title($scope.res('COMUM_ERRO'))
  266. .content(err.data.message)
  267. .ok($scope.res('COMUM_OK')));
  268. });
  269. },
  270. error: function (data) {
  271. $mdDialog.show($mdDialog.alert()
  272. .title($scope.res('COMUM_ERRO'))
  273. .content($scope.res("GRAVACAO_ERRO_INICIAR"))
  274. .ok($scope.res('COMUM_OK')));
  275. }
  276. });
  277. }
  278. /**
  279. * @method stopRecord
  280. * @param {*} id
  281. * @param {*} index
  282. */
  283. $scope.stopRecord = function (id, index) {
  284. var camera = getCameraById(id);
  285. if (!camera.recording) {
  286. $mdDialog.show($mdDialog.alert()
  287. .title($scope.res('COMUM_ERRO'))
  288. .content($scope.res("GRAVACAO_EM_ANDAMENTO_ERRO"))
  289. .ok($scope.res('COMUM_OK')));
  290. return;
  291. }
  292. var recording = 'false';
  293. $.ajax({
  294. type: "GET",
  295. url: $scope.categoriaCamera.atributos.ip + "dvrstreamrecord?app=" + $scope.categoriaCamera.atributos.application
  296. + "&streamname=" + camera.nome + ".stream&action=stop" + "&instancename=" + camera.nome,
  297. success: function (data) {
  298. $http.post(API_ENDPOINT + "cameras/record/" + camera.id, recording).then(function (response) {
  299. setRecordingCamera(response.data);
  300. $mdDialog
  301. .show($mdDialog.alert()
  302. .title($scope.res('COMUM_SUCESSO'))
  303. .content($scope.res('GRAVACAO_PARADA'))
  304. .ok($scope.res('COMUM_OK')));
  305. $scope.gridOptions.api.refreshView();
  306. }, function (err) {
  307. $mdDialog
  308. .show($mdDialog.alert()
  309. .title($scope.res('COMUM_ERRO'))
  310. .content(err.data.message)
  311. .ok($scope.res('COMUM_OK')));
  312. });
  313. },
  314. error: function (data) {
  315. $mdDialog.show($mdDialog.alert()
  316. .title($scope.res('COMUM_ERRO'))
  317. .content($scope.res("GRAVACAO_ERRO_PARAR"))
  318. .ok($scope.res('COMUM_OK')));
  319. }
  320. });
  321. }
  322. $scope.gridOptions = {
  323. rowSelection: 'multiple',
  324. enableSorting: true,
  325. columnDefs: basicColumns,
  326. rowData: [],
  327. angularCompileHeaders: true,
  328. angularCompileRows: true,
  329. headerCellRenderer: headerCellRendererFunction,
  330. selectionChanged: onSelectionChanged,
  331. pinnedColumnCount: 1,
  332. enableColResize: true
  333. };
  334. /**
  335. * @method onFileSelected
  336. * @param {*} file
  337. */
  338. function onFileSelected(file) {
  339. var json = KMLParser.loadKML(file.contents);
  340. var rows = [];
  341. _.each(json.body, function (row) {
  342. var positionIndex = json.head.indexOf('geojson');
  343. if (positionIndex < 0) {
  344. return;
  345. }
  346. var data = {
  347. _id: _.uniqueId(row),
  348. nome: row[0],
  349. descricao: row[1],
  350. latitude: JSON.parse(row[positionIndex]).coordinates[1],
  351. longitude: JSON.parse(row[positionIndex]).coordinates[0],
  352. CategoriaCameraId: $scope.categoriaCamera.id
  353. };
  354. rows.push(data);
  355. });
  356. $scope.gridOptions.api.sizeColumnsToFit();
  357. $scope.gridOptions.rowData = rows;
  358. $scope.gridOptions.api.onNewRows();
  359. $scope.gridOptions.api.setSortModel([{
  360. field: 'nome',
  361. sort: 'asc'
  362. }]);
  363. }
  364. $scope.exibeMapa = false;
  365. $scope.lastSelectedRow = {};
  366. ngFileReader.on('fileSelectedCAMERAS', onFileSelected);
  367. $scope.$on('$destroy', function () {
  368. MapaEndereco.limparEventos();
  369. });
  370. MapaEndereco.on('atualizarCoordenadas', function (coordenadas) {
  371. if ($scope.gridOptions != null && $scope.gridOptions.selectedRows != null && $scope.gridOptions.selectedRows.length === 1) {
  372. var row = $scope.gridOptions.selectedRows[0];
  373. row.latitude = coordenadas.latitude;
  374. row.longitude = coordenadas.longitude;
  375. $scope.gridOptions.api.refreshView();
  376. }
  377. });
  378. /**
  379. * @method onSelectionChanged
  380. */
  381. function onSelectionChanged() {
  382. if ($scope.gridOptions != null && $scope.gridOptions.selectedRows != null && $scope.gridOptions.selectedRows.length === 1 && $scope.exibeMapa) {
  383. var row = $scope.gridOptions.selectedRows[0];
  384. if (row._id != $scope.lastSelectedRow._id) {
  385. MapaEndereco.atualizarCoordenadas(row.latitude, row.longitude);
  386. $scope.lastSelectedRow = row;
  387. }
  388. } else {
  389. fecharMapa();
  390. }
  391. }
  392. /**
  393. * @method abrirMapa
  394. */
  395. function abrirMapa() {
  396. $scope.exibeMapa = true;
  397. }
  398. /**
  399. * @method fecharMapa
  400. */
  401. function fecharMapa() {
  402. $scope.exibeMapa = false;
  403. }
  404. /**
  405. * @method atualizarLatitude
  406. */
  407. function atualizarLatitude(params) {
  408. var latitude = params.newValue;
  409. var longitude = params.data.longitude;
  410. MapaEndereco.atualizarCoordenadas(latitude, longitude);
  411. }
  412. /**
  413. * @method atualizarLongitude
  414. * @param {*} params
  415. */
  416. function atualizarLongitude(params) {
  417. var latitude = params.data.latitude;
  418. var longitude = params.newValue;
  419. MapaEndereco.atualizarCoordenadas(latitude, longitude);
  420. }
  421. /**
  422. * @method atualizarEndereco
  423. * @param {*} params
  424. */
  425. function atualizarEndereco(params) {
  426. MapaEndereco.atualizarEndereco(params.newValue);
  427. }
  428. /**
  429. * @method checkboxClick
  430. * @param {*} params
  431. */
  432. function checkboxClick(params) {
  433. angular.element(params.eventSource).find('input').click();
  434. params.event.stopPropagation();
  435. }
  436. /**
  437. * @method headerCellRendererFunction
  438. * @param {*} params
  439. */
  440. function headerCellRendererFunction(params) {
  441. var eHeader = document.createElement('span');
  442. var eTitle = document.createTextNode(params.colDef.headerName);
  443. eHeader.appendChild(eTitle);
  444. if (params.colDef.headerName == '') {
  445. eHeader.style.textAlign = 'center';
  446. eHeader.style.verticalAlign = 'center';
  447. } else {
  448. var eEdit = document.createElement('md-icon');
  449. eEdit.setAttribute('class', 'menu-icon');
  450. eEdit.setAttribute('style', 'float: right');
  451. eEdit.setAttribute('md-svg-icon', 'menu:edit');
  452. eEdit.setAttribute('alt', 'editar');
  453. eEdit.setAttribute('ng-click', 'definirValorDaColuna($event, this,"' + params.colDef.field + '")');
  454. eHeader.appendChild(eEdit);
  455. }
  456. return eHeader.outerHTML;
  457. }
  458. /**
  459. * @method definirValorDaColuna
  460. *
  461. * @param {*} event
  462. * @param {*} domNode
  463. * @param {*} field
  464. */
  465. function definirValorDaColuna(event, domNode, field) {
  466. event.stopPropagation();
  467. $mdDialog.show({
  468. controller: function ($scope, res) {
  469. $scope.res = res;
  470. $scope.ok = function () {
  471. $mdDialog.hide($scope.coluna.valor);
  472. };
  473. $scope.cancelar = $mdDialog.cancel;
  474. },
  475. templateUrl: 'app/components/admin/modulos/manutencao/pois/definirValorDaColuna.html',
  476. locals: {
  477. res: $scope.res
  478. },
  479. parent: domNode
  480. }).then(function (valor) {
  481. _.each($scope.gridOptions.rowData, function (row) {
  482. row[field] = valor;
  483. });
  484. $scope.gridOptions.api.refreshView();
  485. });
  486. }
  487. /**
  488. * @method deletarSelecionados
  489. */
  490. function deletarSelecionados() {
  491. var selecionados = _.map($scope.gridOptions.api.getSelectedNodes(), 'data._id');
  492. $scope.rowsDeleted.push(_.map($scope.gridOptions.api.getSelectedNodes(), 'data'));
  493. _.remove($scope.gridOptions.rowData, function (row) {
  494. return _.includes(selecionados, row._id)
  495. });
  496. $scope.gridOptions.api.onNewRows();
  497. }
  498. /**
  499. * @method adicionarNovaLinha
  500. */
  501. function adicionarNovaLinha() {
  502. $scope.gridOptions.rowData.unshift({
  503. CategoriaCameraId: $scope.categoriaCamera.id,
  504. _id: _.uniqueId()
  505. });
  506. $scope.gridOptions.api.onNewRows();
  507. $scope.gridOptions.api.setSortModel($scope.gridOptions.api.getSortModel());
  508. }
  509. /**
  510. * @method salvar
  511. */
  512. function salvar() {
  513. var rows = $scope.gridOptions.rowData;
  514. var _id = 1;
  515. rows = _.map(rows, function (row) {
  516. row._id = _id++;
  517. row.poiGeometrico = 'SRID=4326;POINT(' + row.longitude + ' ' + row.latitude + ')';
  518. if (!row.urlIcone) {
  519. row.urlIcone = $scope.categoriaCamera.urlIcone;
  520. }
  521. return row;
  522. });
  523. $http.post(API_ENDPOINT + "cameras/categoria_camera/" + $scope.categoriaCamera.id, rows)
  524. .then(function () {
  525. $mdDialog
  526. .show($mdDialog.alert()
  527. .title($scope.res('COMUM_SUCESSO'))
  528. .content($scope.res('MENSAGEM_SUCESSO_ATUALIZACAO_CAMERAS'))
  529. .ok($scope.res('COMUM_OK')));
  530. //Cria o stream no Wowza para cada câmera
  531. if ($scope.categoriaCamera.tipo == 'wowza') {
  532. _.each(rows, function (row) {
  533. $.ajax({
  534. type: "GET",
  535. url: $scope.categoriaCamera.atributos.ip + "createstream?streamname=" + row.nome + "&source=" + row.url
  536. + "&appname=" + $scope.categoriaCamera.atributos.application + "&instancename=" + row.nome,
  537. success: function (data) {
  538. $mdDialog
  539. .show($mdDialog.alert()
  540. .title($scope.res('COMUM_SUCESSO'))
  541. .content($scope.res('Stream da câmera ' + row.nome + ' criado com sucesso'))
  542. .ok($scope.res('COMUM_OK')));
  543. },
  544. error: function (data) {
  545. $mdDialog.show($mdDialog.alert()
  546. .title($scope.res('COMUM_ERRO'))
  547. .content("Erro na criação do stream da câmera " + row.nome)
  548. .ok($scope.res('COMUM_OK')));
  549. }
  550. });
  551. });
  552. _.each($scope.rowsDeleted, function (row) {
  553. $.ajax({
  554. type: "GET",
  555. url: $scope.categoriaCamera.atributos.ip + "deletestream?streamname=" + row.nome +
  556. "&appname=" + $scope.categoriaCamera.atributos.application + "&instancename=" + row.nome,
  557. success: function (data) {
  558. },
  559. error: function (data) {
  560. $mdDialog.show($mdDialog.alert()
  561. .title($scope.res('COMUM_ERRO'))
  562. .content("Erro na exclusão do stream da câmera " + row.nome)
  563. .ok($scope.res('COMUM_OK')));
  564. }
  565. });
  566. });
  567. }
  568. buscarCamerasPorCategoria();
  569. }, function (err) {
  570. $mdDialog
  571. .show($mdDialog.alert()
  572. .title($scope.res('COMUM_ERRO'))
  573. .content(err.data.message)
  574. .ok($scope.res('COMUM_OK')));
  575. });
  576. }
  577. /**
  578. * @method adicionarCategoria
  579. */
  580. function adicionarCategoria() {
  581. $mdDialog.show({
  582. controller: AdicionarCategoriaCtrl,
  583. templateUrl: 'app/components/admin/modulos/manutencao/cameras/dialogCategoriaCamera.html',
  584. parent: document.body,
  585. locals: {
  586. categoriaCamera: null,
  587. res: $scope.res
  588. }
  589. }).then(function (categoriaCamera) {
  590. $http.post(API_ENDPOINT + "categoria_camera/", categoriaCamera)
  591. .then(function (response) {
  592. var _categoriaCamera = response.data;
  593. _categoriaCamera.selected = true;
  594. $scope.categorias.push(_categoriaCamera);
  595. $scope.categoriaCamera = _categoriaCamera;
  596. $scope.gridOptions.rowData = [];
  597. $scope.gridOptions.api.onNewRows();
  598. $scope.gridOptions.api.sizeColumnsToFit();
  599. $scope.gridOptions.api.setSortModel([{
  600. field: 'nome',
  601. sort: 'asc'
  602. }]);
  603. });
  604. }, function (cancel) {
  605. _initCategoriaCamera();
  606. })
  607. }
  608. /**
  609. * @method editarCategoriaCamera
  610. */
  611. function editarCategoriaCamera() {
  612. $mdDialog.show({
  613. controller: AdicionarCategoriaCtrl,
  614. templateUrl: 'app/components/admin/modulos/manutencao/cameras/dialogCategoriaCamera.html',
  615. parent: document.body,
  616. locals: {
  617. categoriaCamera: $scope.categoriaCamera,
  618. res: $scope.res
  619. }
  620. }).then(function (categoriaCamera) {
  621. $http.put(API_ENDPOINT + "categoria_camera/" + categoriaCamera.id, categoriaCamera)
  622. .then(function (response) {
  623. $scope.categoriaCamera = response.data;
  624. $http.get(API_ENDPOINT + "categoria_camera")
  625. .then(function (result) {
  626. $scope.categorias = result.data;
  627. }, function (err) {
  628. $mdDialog
  629. .show($mdDialog.alert()
  630. .title($scope.res('COMUM_ERRO'))
  631. .content(err.data.message)
  632. .ok($scope.res('COMUM_OK')));
  633. });
  634. });
  635. })
  636. }
  637. /**
  638. * @method ativarCategoria
  639. */
  640. function ativarCategoria() {
  641. if (!$scope.categoriaCamera || $scope.categoriaCamera == 'nova') {
  642. adicionarCategoria();
  643. } else {
  644. buscarCamerasPorCategoria();
  645. }
  646. }
  647. /**
  648. * @method _initCategoriaCamera
  649. */
  650. function _initCategoriaCamera() {
  651. $scope.categoriaCamera = null;
  652. $scope.gridOptions.rowData = [];
  653. $scope.gridOptions.api.onNewRows();
  654. }
  655. /**
  656. * @method excluirCategoriaCamera
  657. */
  658. function excluirCategoriaCamera() {
  659. var confirm = $mdDialog.confirm()
  660. .title($scope.res('CATEGORIACAMERA_TITULO'))
  661. .content($scope.res('CATEGORIACAMERA_REMOVER'))
  662. .ok($scope.res('COMUM_SIM'))
  663. .cancel($scope.res('COMUM_CANCELAR'));
  664. $mdDialog.show(confirm)
  665. .then(function () {
  666. $http.delete(API_ENDPOINT + "categoria_camera/" + $scope.categoriaCamera.id)
  667. .then(function (response) {
  668. _initCategoriaCamera();
  669. carregarCategorias();
  670. $mdDialog
  671. .show($mdDialog.alert()
  672. .title($scope.res('COMUM_SUCESSO'))
  673. .content($scope.res('CATEGORIACAMERA_DELETE_SUCESSO'))
  674. .ok($scope.res('COMUM_OK')));
  675. }, function (err) {
  676. $mdDialog
  677. .show($mdDialog.alert()
  678. .title($scope.res('COMUM_ERRO'))
  679. .content(err.data.message)
  680. .ok($scope.res('COMUM_OK')));
  681. });
  682. }, function () {
  683. console.log('cancel');
  684. });
  685. }
  686. /**
  687. * @method buscarCamerasPorCategoria
  688. */
  689. function buscarCamerasPorCategoria() {
  690. if (!$scope.categoriaCamera.id) {
  691. $scope.categoriaCamera = JSON.parse($scope.categoriaCamera);
  692. }
  693. if (!$scope.rowsDeleted) {
  694. $scope.rowsDeleted = [];
  695. }
  696. $http.get(API_ENDPOINT + "cameras/categoria_camera/" + $scope.categoriaCamera.id)
  697. .then(function (result) {
  698. _.each(result.data, function (camera) {
  699. camera._id = _.uniqueId();
  700. camera.latitude = JSON.parse(camera.poiGeometrico).coordinates[1];
  701. camera.longitude = JSON.parse(camera.poiGeometrico).coordinates[0];
  702. });
  703. $scope.gridOptions.api.sizeColumnsToFit();
  704. $scope.gridOptions.rowData = result.data;
  705. $scope.gridOptions.api.onNewRows();
  706. $scope.gridOptions.api.setSortModel([{
  707. field: 'nome',
  708. sort: 'asc'
  709. }]);
  710. }, function (err) {
  711. $mdDialog
  712. .show($mdDialog.alert()
  713. .title($scope.res('COMUM_ERRO'))
  714. .content(err.data.message)
  715. .ok($scope.res('COMUM_OK')));
  716. });
  717. }
  718. /**
  719. * @method carregarCategorias
  720. */
  721. function carregarCategorias() {
  722. $http.get(API_ENDPOINT + "categoria_camera")
  723. .then(function (result) {
  724. $scope.categorias = result.data;
  725. }, function (err) {
  726. $mdDialog
  727. .show($mdDialog.alert()
  728. .title($scope.res('COMUM_ERRO'))
  729. .content(err.data.message)
  730. .ok($scope.res('COMUM_OK')));
  731. });
  732. }
  733. carregarCategorias();
  734. /**
  735. * @method exportarExcel
  736. */
  737. function exportarExcel() {
  738. var data = {};
  739. var rows = $scope.gridOptions.rowData;
  740. data.cameras = rows;
  741. data.headers = [];
  742. if ($scope.categoriaCamera.tipo == 'wowza') {
  743. for (var index in rows) {
  744. var camera = data.cameras[index];
  745. camera.controleGravacao = $scope.categoriaCamera.atributos.ip + "dvrstreamrecord?app=" + $scope.categoriaCamera.atributos.application
  746. + "&streamname=" + camera.nome + ".stream&action=start" + "&instancename=" + camera.nome;
  747. if (camera.recording) {
  748. camera.continuousRecording = "SIM";
  749. }
  750. else {
  751. camera.continuousRecording = "NÃO";
  752. }
  753. }
  754. }
  755. for (var index in $scope.gridOptions.columnDefs) {
  756. if ($scope.gridOptions.columnDefs[index].headerName != null && $scope.gridOptions.columnDefs[index].headerName != "" && $scope.gridOptions.columnDefs[index].headerName != "+") {
  757. data.headers.push($scope.gridOptions.columnDefs[index].headerName);
  758. }
  759. }
  760. $http
  761. .post(API_ENDPOINT + 'cameras/excel/download', data, { responseType: 'arraybuffer', })
  762. .then(function (res) {
  763. var a = document.createElement("a");
  764. document.body.appendChild(a);
  765. a.style = "display: none";
  766. var file = new Blob([res.data], { type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' });
  767. var fileURL = URL.createObjectURL(file);
  768. a.href = fileURL;
  769. a.download = $scope.categoriaCamera.nome + ".xlsx";
  770. a.click();
  771. $mdDialog
  772. .show($mdDialog.alert()
  773. .title($scope.res('COMUM_SUCESSO'))
  774. .content('Arquivo gerado com sucesso.')
  775. .ok($scope.res('COMUM_OK')));
  776. }, function (err) {
  777. console.log(err);
  778. });
  779. }
  780. $scope.input = angular.element('input.uploadArquivo');
  781. var uploader = $scope.uploader = new FileUploader(),
  782. uploadCallbackQueue = [];
  783. uploader.clearQueue();
  784. $scope.uploader.alias = 'arquivo';
  785. $scope.uploader.removeAfterUpload = true;
  786. $scope.uploader.filters.push({
  787. 'name': 'enforceMaxFileSize',
  788. 'fn': function (item, evt) {
  789. $scope.tamFile = item.size;
  790. return true;
  791. }
  792. });
  793. $scope.uploader.onCompleteItem = function (item, response) {
  794. $scope.mensagem = response;
  795. };
  796. $scope.uploader.onAfterAddingFile = function (item, evt, arquivo) {
  797. item.novoNome = item.file.name;
  798. enviarArquivo();
  799. }
  800. /**
  801. * @method enviarArquivo
  802. */
  803. function enviarArquivo() {
  804. if ($scope.tamFile > 35000) {
  805. $mdDialog
  806. .show($mdDialog.alert()
  807. .title($scope.res('COMUM_AVISO'))
  808. .content($scope.res('EXCEL_POI_EM_PROCESSAMENTO'))
  809. .ok($scope.res('COMUM_OK')));
  810. }
  811. $scope.isUploading = true;
  812. uploader.url = '/cameras/excel/addCamerasFromExcel/' + JSON.parse($scope.categoriaCamera.id);
  813. uploader.uploadAll();
  814. $scope.gridOptions.rowData = [];
  815. uploadCallbackQueue = [];
  816. uploadCallbackQueue.push(function () {
  817. $scope.isUploading = false;
  818. $scope.arquivosPraSubir = false;
  819. uploader.clearQueue();
  820. ativarCategoria();
  821. if ($scope.mensagem.status == "200") {
  822. $mdDialog
  823. .show($mdDialog.alert()
  824. .title($scope.res('COMUM_AVISO'))
  825. .content($scope.res('EXCEL_POI_PROCESSADO'))
  826. .ok($scope.res('COMUM_OK')));
  827. }
  828. else {
  829. $mdDialog
  830. .show($mdDialog.alert()
  831. .title($scope.res('COMUM_AVISO'))
  832. .content($scope.mensagem.message)
  833. .ok($scope.res('COMUM_OK')));
  834. }
  835. });
  836. }
  837. $scope.uploader.onBeforeUploadItem = function (item) {
  838. item.url = uploader.url;
  839. var token = window.sessionStorage.getItem('s4cToken');
  840. var tokenObj = JSON.parse(token);
  841. item.headers = {
  842. 'Authorization': 'Bearer ' + tokenObj.access_token
  843. };
  844. };
  845. $scope.uploader.onProgressItem = function (fileItem, progress) {
  846. console.info('onProgressItem', fileItem, progress);
  847. };
  848. $scope.uploader.onCompleteAll = function (result) {
  849. _.each(uploadCallbackQueue, function (callback) {
  850. callback();
  851. });
  852. };
  853. $scope.importFile = function () {
  854. $("#arquivo").click();
  855. };
  856. angular.extend($scope, {
  857. definirValorDaColuna: definirValorDaColuna,
  858. fecharMapa: fecharMapa,
  859. ativarCategoria: ativarCategoria,
  860. excluirCategoriaCamera: excluirCategoriaCamera,
  861. deletarSelecionados: deletarSelecionados,
  862. adicionarNovaLinha: adicionarNovaLinha,
  863. salvar: salvar,
  864. editarCategoriaCamera: editarCategoriaCamera,
  865. exportarExcel: exportarExcel
  866. });
  867. }
  868. }());