show_map.html.twig 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748
  1. {% extends 'SonataAdminBundle:CRUD:base_list.html.twig' %}
  2. {% block stylesheets %}
  3. {{ parent() }}
  4. <style>
  5. .no_checkbox>i.jstree-checkbox
  6. {
  7. display:none
  8. }
  9. </style>
  10. <link rel="stylesheet" href="/css/tree/proton/style.css" />
  11. {% endblock %}
  12. {% block actions %}
  13. {% endblock %}
  14. {% block tab_menu %}
  15. {#{{ knp_menu_render(admin.sidemenu(action), {'currentClass' : 'active', 'template': sonata_admin.adminPool.getTemplate('tab_menu_template')}, 'twig') }}#}
  16. {% endblock %}
  17. {% block list_filters_actions %}
  18. {% endblock %}
  19. {% block list_filters %}
  20. {% endblock %}
  21. {% block list_table %}
  22. {% include 'LeafletBundle:Leaflet:resources.html.twig' %}
  23. <script type="text/javascript">
  24. window.SONATA_CONFIG.USE_ICHECK = false;
  25. window.currentLayer = null; // Almacena el ID del layer actualmente seleccionado.
  26. var osmUrl = 'http://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png',
  27. osmAttrib = '&copy; <a href="http://openstreetmap.org/copyright">OpenStreetMap</a> contributors',
  28. osm = L.tileLayer(osmUrl, { maxZoom: 18, attribution: osmAttrib }),
  29. map = new L.Map('map', { center: new L.LatLng({{map['lat']}}, {{map['lng']}}), zoom: {{map['zoom']}} });
  30. var controlLayers = L.control.layers({
  31. 'OSM': osm.addTo(map),
  32. "Google": L.tileLayer('http://www.google.cn/maps/vt?lyrs=s@189&gl=cn&x={x}&y={y}&z={z}', {
  33. attribution: 'google'
  34. })
  35. }, {}, { position: 'topleft', collapsed: false });
  36. addLayersMap();
  37. controlLayers.addTo(map);
  38. // Agregar Clase para dibujo de vectores
  39. window.drawControl = new L.Control.Draw();
  40. map.on(L.Draw.Event.CREATED, function (event) {
  41. /* Se dispara tras creación de vector */
  42. var uuid = guid();
  43. var layer = event.layer;
  44. var currentLayer = layers[window.currentLayer];
  45. layer.layerType = event.layerType;
  46. layer.layerClass = "vector";
  47. currentLayer.addLayer(layer);
  48. currentLayer.eachLayer(function(layer) {
  49. if (typeof layer._uuid === 'undefined') {
  50. layer._uuid = uuid + "_" + layer._leaflet_id;
  51. }
  52. });
  53. saveData();
  54. refresh();
  55. });
  56. map.on(L.Draw.Event.DELETED, function (event) {
  57. /* Se dispara tras borrado de vector */
  58. var layers = event.layers;
  59. var deleteLayers = new Array();
  60. layers.eachLayer(function(layer) {
  61. deleteLayers.push(layer._uuid);
  62. });
  63. sendData = {'layerId' : layerId, 'vectors' : deleteLayers};
  64. var json = JSON.stringify(sendData);
  65. saveData();
  66. refresh()
  67. });
  68. function saveData() {
  69. /*
  70. * Guarda todos los layers presentes en window.layers
  71. * y a sus correspondientes vectores
  72. */
  73. $.each(window.layers, function(id, myLayer) {
  74. var vectorData = new Array();
  75. if (myLayer) {
  76. myLayer.eachLayer(function(layer) {
  77. if(layer.layerType == "marker") {
  78. data = [layer._latlng];
  79. } else if (layer.layerType == "circle") {
  80. data = [layer._latlng, layer._mRadius];
  81. } else if (layer.layerType == "polyline") {
  82. data = [layer._latlngs];
  83. } else {
  84. data = [layer._latlngs[0]];
  85. }
  86. object = {'_uuid': layer._uuid, 'layerType': layer.layerType, 'data': data, 'layerId': layer._id};
  87. vectorData.push(object);
  88. });
  89. sendData = {'layerId' : id, 'vectors' : vectorData};
  90. var json = JSON.stringify(sendData);
  91. $.ajax({
  92. type: "POST",
  93. url: "{{ path('admin_map_vector_create_ajax') }}",
  94. data: json,
  95. contentType: "application/json; charset=utf-8",
  96. dataType: "json",
  97. error: function(msg) {
  98. console.log(msg.msg);
  99. }
  100. });
  101. }
  102. });
  103. }
  104. function addLayersMap() {
  105. /*
  106. * Obtiene todos los layers y vectores de un mapa.
  107. * Luego los agrega al control Leaflet
  108. */
  109. window.layers = new Array();
  110. var url = window.location.pathname;
  111. var id = url.substring(url.lastIndexOf('/') + 1);
  112. var mapData = getData('maps', id );
  113. for(var i=0; i < mapData.layers.length; i++) {
  114. var layer = mapData.layers[i];
  115. newLayer = L.featureGroup();
  116. for(var j=0; j < layer.vectors.length; j++ ) {
  117. var vector = layer.vectors[j];
  118. _id = vector.id;
  119. name = vector.name;
  120. type = vector.type;
  121. _uuid = vector.uuid;
  122. data = JSON.parse(vector.data);
  123. style = JSON.parse(vector.style);
  124. if(type == "marker") {
  125. if (typeof style.icon !== 'undefined') {
  126. icon = style.icon;
  127. } else {
  128. icon = "miniBubbleBlueIcon";
  129. }
  130. object = new L.marker([data[0]['lat'], data[0]['lng']],{icon: eval(icon)});
  131. } else if (type == "circle") {
  132. object = new L.circle([data[0]['lat'], data[0]['lng']], data[1], style);
  133. } else if (type == "polyline") {
  134. object = new L.Polyline(data[0], style);
  135. } else if (type == "rectangle"){
  136. object = new L.Rectangle(data[0], style);
  137. } else {
  138. object = new L.Polygon(data[0], style);
  139. }
  140. object._id = _id;
  141. object.name = name;
  142. object._uuid = _uuid;
  143. object.layerType = type;
  144. object.layerClass = "vector";
  145. var desc = $("#desc_vector_" + vector.id).html();
  146. object.on("click", function (e) {
  147. var layer = e.target
  148. if (layer.class = 'vector') {
  149. // Deseleccionar todos los elementos.
  150. $('#jstree').jstree('deselect_all');
  151. $('#overlay_tree').jstree('deselect_all');
  152. for (key in layer._eventParents) {
  153. var leafletId = key; // Debería iterar una sola vez
  154. }
  155. // Seleccionar elementos:
  156. for (key in window.layers) {
  157. if (window.layers[key]._leaflet_id == leafletId) {
  158. $('#jstree').jstree('select_node', key);
  159. }
  160. }
  161. /* Dar 200ms de espera, ya que esta instrucción puede ejecutarse
  162. incluso antes de que el árbol de vectores haya
  163. recibido la instrucción de recargarse. */
  164. setTimeout(function() { selectElement(layer._id) }, 200);
  165. }
  166. });
  167. newLayer.class = 'layer';
  168. newLayer.addLayer(object);
  169. }
  170. window.layers[layer.id] = newLayer.addTo(map);
  171. }
  172. }
  173. </script>
  174. {% endblock %}
  175. {% block content %}
  176. <div class="col-md-10">
  177. <div class="cms-block cms-block-element">
  178. <div class="box">
  179. <div class="box-body">
  180. <div id="map" style="margin:0 auto; width: 100%; height: calc(100vh - 190px); border: 1px solid #ccc"></div>
  181. </div>
  182. </div>
  183. </div>
  184. </div>
  185. <div class="col-md-2">
  186. <div class="box">
  187. <div class="box-header">
  188. <h4>Capas</h4>
  189. <div class="box-body">
  190. <div class="jstree-proton" id="jstree" style="max-height: calc(100vh - 250px); overflow-y: auto; overflow-x: hidden;"></div>
  191. </div>
  192. <button class="btn btn-default btn-xs" id="btnNewLayer"><i class="fa fa-file-o" data-toggle="modal" data-target="#modalNewLayer"></i></button>
  193. <button onclick="refresh()" class="btn btn-default btn-xs"><i class="fa fa-refresh" aria-hidden="true"></i></button>
  194. <button id="btnSave" class="btn btn-default btn-xs"><i class="fa fa-floppy-o" aria-hidden="true"></i></button>
  195. </div>
  196. </div>
  197. <div class="box">
  198. <div class="box-header">
  199. <h4>Elementos</h4>
  200. <br/>
  201. <div class="btn-group">
  202. <button class="btn btn-default btn-xs" onclick="new L.Draw.Polyline(map, drawControl.options.polyline).enable();"><i class="fa fa-share-alt" aria-hidden="true"></i></button>
  203. <button class="btn btn-default btn-xs" onclick="new L.Draw.Polygon(map, drawControl.options.polygon).enable();"><i class="fa fa-star-o" aria-hidden="true"></i></button>
  204. <button class="btn btn-default btn-xs" onclick="new L.Draw.Rectangle(map, drawControl.options.rectangle).enable();"><i class="fa fa-stop" aria-hidden="true"></i></button>
  205. <button class="btn btn-default btn-xs" onclick="new L.Draw.Circle(map, drawControl.options.circle).enable();"><i class="fa fa-circle-o" aria-hidden="true"></i></button>
  206. <button class="btn btn-default btn-xs" onclick="new L.Draw.Marker(map, drawControl.options.marker).enable();"><i class="fa fa-map-marker" aria-hidden="true"></i></button>
  207. </div>
  208. </div>
  209. <div class="box-body">
  210. <div class="jstree-proton" id="overlay_tree" style="max-height: calc(100vh - 450px); overflow-y: auto; overflow-x: hidden;"></div>
  211. </div>
  212. </div>
  213. </div>
  214. <!-- Modal Nueva Capa -->
  215. <div class="modal fade" id="modalNewLayer" tabindex="-1" role="dialog" aria-labelledby="myModalLabel">
  216. <div class="modal-dialog" role="document">
  217. <div class="modal-content">
  218. <div class="modal-header">
  219. <button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">&times;</span></button>
  220. <h4 class="modal-title" id="myModalLabel">Nueva Capa</h4>
  221. </div>
  222. <div class="modal-body">
  223. <div class="container-fluid">
  224. <label class="control-label col-md-3">Nombre</label>
  225. <input class="form-control col-md-9" name="name" id="newLayerName"></input>
  226. </div>
  227. </div>
  228. <div class="modal-footer">
  229. <button type="button" class="btn btn-default" data-dismiss="modal">Cancelar</button>
  230. <button onclick="createNewLayer()" type="submit" class="btn btn-primary">Crear</button>
  231. </div>
  232. </div>
  233. </div>
  234. </div>
  235. <!-- Fin - Modal Nueva Capa -->
  236. <!-- Modal Renombrar -->
  237. <div class="modal fade" id="modalRename" tabindex="-1" role="dialog" aria-labelledby="myModalLabel">
  238. <div class="modal-dialog" role="document">
  239. <div class="modal-content">
  240. <div class="modal-header">
  241. <button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">&times;</span></button>
  242. <h4 class="modal-title" id="myModalLabel">Renombrar</h4>
  243. </div>
  244. <div class="modal-body">
  245. <div class="container-fluid">
  246. <label class="control-label col-md-3">Nombre</label>
  247. <input class="form-control col-md-9" name="name" id="newName"></input>
  248. </div>
  249. </div>
  250. <div class="modal-footer">
  251. <button type="button" class="btn btn-default" data-dismiss="modal">Cancelar</button>
  252. <button onclick="renameItem()" type="submit" class="btn btn-primary">Renombrar</button>
  253. </div>
  254. </div>
  255. </div>
  256. </div>
  257. <!-- Fin - Modal Renombrar -->
  258. <!-- Modal Renombrar -->
  259. <div class="modal fade" id="modalDelete" tabindex="-1" role="dialog" aria-labelledby="myModalLabel">
  260. <div class="modal-dialog modal-danger" role="document">
  261. <div class="modal-content">
  262. <div class="modal-header">
  263. <button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">&times;</span></button>
  264. <h4 class="modal-title" id="myModalLabel">Borrar</h4>
  265. </div>
  266. <div class="modal-body">
  267. <p>¿Está seguro de que desea borrar <span id="elementTypeCaption"?></span> "<span id="elementName"></span>"?</p>
  268. </div>
  269. <div class="modal-footer">
  270. <button type="button" class="btn btn-danger" data-dismiss="modal">Cancelar</button>
  271. <button onclick="deleteItem()" type="submit" class="btn btn-danger">Borrar</button>
  272. </div>
  273. </div>
  274. </div>
  275. </div>
  276. <!-- Fin - Modal Renombrar -->
  277. {% endblock %}
  278. {% block javascripts %}
  279. {{ parent() }}
  280. <script src="https://cdnjs.cloudflare.com/ajax/libs/jstree/3.3.4/jstree.min.js"></script>
  281. <script>
  282. $(document).ready(function() {
  283. $('#btnSave').click(function() {
  284. /*
  285. * Desactiva la edición en todas las capas,
  286. * luego postea los datos existentes.
  287. */
  288. $.each(window.layers, function(id, myLayer) {
  289. if (myLayer) {
  290. myLayer.eachLayer(function(layer) {
  291. layer.editing.disable();
  292. });
  293. }
  294. });
  295. saveData();
  296. });
  297. // Defaults para el plugin JSTree
  298. $.jstree.defaults.core.dblclick_toggle = false;
  299. $.jstree.defaults.core.multiple = false;
  300. $.jstree.defaults.checkbox.three_state = false;
  301. $.jstree.defaults.checkbox.whole_node = false;
  302. $.jstree.defaults.checkbox.tie_selection = false;
  303. $.jstree.defaults.contextmenu.select_node = true;
  304. $('#jstree').on('check_node.jstree uncheck_node.jstree', function (e, data) {
  305. if (data.node.type == 'layer') {
  306. if (data.node.state.checked) {
  307. map.addLayer(layers[data.node.id]);
  308. } else {
  309. map.removeLayer(layers[data.node.id]);
  310. }
  311. }
  312. });
  313. $('#jstree').on('select_node.jstree', function (e, data) {
  314. if (data.node.type == 'layer') {
  315. window.currentLayer = data.selected;
  316. $('#overlay_tree').jstree(true).settings.core.data = makeOverlayTree(layers[data.selected]);
  317. $('#overlay_tree').jstree(true).refresh();
  318. }
  319. toggleControls();
  320. });
  321. $('#overlay_tree').on('select_node.jstree', function (e, data) {
  322. var vectorData = getData('vectors', data.node.id);
  323. map.eachLayer(function(layer){
  324. if (layer._id == data.node.id) {
  325. var popupContent = "<b>" + vectorData.name + "</b><br/>" + vectorData.description + " <div style='text-align:center;margin-top:5px'><a target='_blank' href='/admin/map/vector/" + vectorData.id + "/edit'>EDITAR</a></div>";
  326. layer.bindPopup(popupContent);
  327. if (!layer._popup.isOpen()) {
  328. layer.openPopup();
  329. }
  330. }
  331. });
  332. })
  333. initializeTrees();
  334. });
  335. function getData(entity, id=null) {
  336. /*
  337. * Dadas una entidad y opcionalmente un id, devuelve un JSON obtenido
  338. * mediante una llamada AJAX a la API REST.
  339. */
  340. var result = null;
  341. if (id == null) {
  342. var url = "/api/" + entity
  343. } else {
  344. var url = "/api/" + entity + "/" + id
  345. }
  346. $.ajax({
  347. type: "GET",
  348. dataType: "json",
  349. async: false,
  350. cache: false,
  351. url: url,
  352. success: function(data){
  353. result = data;
  354. },
  355. error: function(XMLHttpRequest, textStatus, errorThrown) {
  356. console.log("Status: " + textStatus); alert("Error: " + errorThrown);
  357. }
  358. });
  359. return result;
  360. }
  361. function makeTree() {
  362. /*
  363. * Función que obtiene la información de las capas y se la entrega
  364. * procesada al JSTree de capas.
  365. */
  366. var url = window.location.pathname;
  367. var id = url.substring(url.lastIndexOf('/') + 1);
  368. var mapData = getData('maps', id );
  369. var result = [];
  370. result.push({ "id" : "map_" + mapData.id, "parent" : "#", "text" : mapData.name,
  371. "type": "map", a_attr: {class: "no_checkbox"}, state: { opened : true } });
  372. for(var i = 0; i < mapData.layers.length; i++) {
  373. var layer = mapData.layers[i];
  374. result.push({ "id" : layer.id, "parent" : "map_" + mapData.id,
  375. "text" : layer.name, "type" : "layer", state: { checked : true } });
  376. }
  377. return result;
  378. }
  379. function makeOverlayTree(layer) {
  380. /*
  381. * Función que obtiene los vectores dentro de una capa y se los
  382. * entrega procesados al JSTree de elementos.
  383. */
  384. result = [];
  385. if (layer) {
  386. var layerss = layer.getLayers();
  387. for(var j = 0; j < layerss.length; j++) {
  388. var vector = layerss[j];
  389. result.push({ "id" :vector._id, "parent" : "#", "text" : vector.name,
  390. "type": vector.layerType, a_attr: {class: "no_checkbox"} });
  391. };
  392. }
  393. return result;
  394. }
  395. function customMenu(node) {
  396. var items = {
  397. editItem: {
  398. label: "Editar",
  399. action: function () { treeMenuEdit(node) } // No pasar la función directamente, sino la ejecuta al hacer click.
  400. },
  401. renameItem: {
  402. label: "Renombrar",
  403. action: function () {
  404. if (node.type == 'layer') {
  405. window.activeType = 'layer';
  406. } else {
  407. window.activeType = 'vector';
  408. }
  409. window.activeId = node.id;
  410. $("#newName").val(node.text);
  411. $("#modalRename").modal();
  412. }
  413. },
  414. deleteItem: {
  415. label: "Borrar",
  416. action: function () {
  417. if (node.type == 'layer') {
  418. $("#elementTypeCaption").text('la capa');
  419. window.activeType = 'layer';
  420. } else {
  421. $("#elementTypeCaption").text('el elemento');
  422. window.activeType = 'vector';
  423. }
  424. window.activeId = node.id;
  425. $("#elementName").text(node.text);
  426. $("#modalDelete").modal();
  427. }
  428. }
  429. };
  430. return items;
  431. }
  432. function treeMenuEdit(node) {
  433. if (node.type == "layer") {
  434. var editor = new L.EditToolbar.Edit(map, {
  435. featureGroup: drawControl.options.featureGroup,
  436. selectedPathOptions: drawControl.options.edit.selectedPathOptions
  437. })
  438. } else {
  439. var currentlayer = layers[[$('#jstree').jstree(true).get_selected()[0]]];
  440. currentlayer.eachLayer(function(layer) {
  441. if (layer._id == node.id) {
  442. var vector = layer;
  443. vector.editing.enable();
  444. }
  445. });
  446. }
  447. }
  448. function guid() {
  449. return s4() + s4() + '-' + s4() + '-' + s4() + '-' +
  450. s4() + '-' + s4() + s4() + s4();
  451. }
  452. function s4() {
  453. return Math.floor((1 + Math.random()) * 0x10000)
  454. .toString(16)
  455. .substring(1);
  456. }
  457. function initializeTrees() {
  458. /*
  459. * Inicializa los controles JSTree
  460. */
  461. $('#jstree').jstree({
  462. 'core' : {
  463. "animation" : 200,
  464. "check_callback" : true,
  465. "data" : makeTree(),
  466. "strings" : { 'Loading ...' : 'Cargando...' },
  467. },
  468. "types" : {
  469. "map" : {
  470. "icon" : "/images/tree/16x16/Map.png",
  471. "valid_children" : ["layer"]
  472. },
  473. "layer" : {
  474. "icon" : "/images/tree/16x16/Layers.png",
  475. "valid_children" : ["vector","object"]
  476. },
  477. "#" : {
  478. "valid_children" : []
  479. }
  480. },
  481. "plugins" : [ "dnd", "contextmenu", "checkbox", "types", "changed", "wholerow" ],
  482. contextmenu: {items: customMenu}
  483. });
  484. $('#overlay_tree').jstree({
  485. 'core' : {
  486. "animation" : 0,
  487. "check_callback" : false,
  488. "data" : makeOverlayTree(),
  489. "themes" : { "dots": false },
  490. "strings" : { 'Loading ...' : 'Cargando...' },
  491. },
  492. "types" : {
  493. "polygon" : {
  494. "icon" : "/images/tree/16x16/Polygon.png",
  495. "valid_children" : []
  496. },
  497. "circle" : {
  498. "icon" : "/images/tree/16x16/Circle.png",
  499. "valid_children" : []
  500. },
  501. "rectangle" : {
  502. "icon" : "/images/tree/16x16/Rectangle.png",
  503. "valid_children" : []
  504. },
  505. "polyline" : {
  506. "icon" : "/images/tree/16x16/Polyline.png",
  507. "valid_children" : []
  508. },
  509. "marker" : {
  510. "icon" : "/images/tree/16x16/Marker.png",
  511. "valid_children" : []
  512. },
  513. "#" : {
  514. "valid_children" : []
  515. }
  516. },
  517. "plugins" : [ "dnd", "contextmenu", "checkbox", "types", "changed", "wholerow" ],
  518. contextmenu: {items: customMenu}
  519. });
  520. }
  521. function createNewLayer() {
  522. var url = window.location.pathname;
  523. var mapid = parseInt(url.substring(url.lastIndexOf('/') + 1));
  524. var name = $('#newLayerName').val();
  525. sendData = {name: name, map: mapid};
  526. $.ajax({
  527. type: "POST",
  528. url: "{{ path('post_layer') }}",
  529. async: false,
  530. data: JSON.stringify(sendData),
  531. contentType: "application/json; charset=utf-8",
  532. dataType: "json",
  533. error: function(msg) {
  534. console.log(msg.msg);
  535. }
  536. });
  537. $('#modalNewLayer').modal('hide');
  538. refresh();
  539. }
  540. function deleteItem() {
  541. /*
  542. * Dados el tipo de elemento y el id del mismo, realiza una petición HTTP
  543. * a la API para que realice el borrado del mismo.
  544. */
  545. var itemId = window.activeId
  546. var itemType = window.activeType
  547. if (itemType == 'layer') {
  548. var url = '/api/layers/' + itemId;
  549. } else if (itemType == 'vector') {
  550. var url = '/api/vectors/' + itemId;
  551. }
  552. $.ajax({
  553. type: "DELETE",
  554. url: url,
  555. async: false,
  556. contentType: "application/json; charset=utf-8",
  557. dataType: "json",
  558. error: function(msg) {
  559. console.log(msg.msg);
  560. }
  561. });
  562. $('#modalDelete').modal('hide');
  563. refresh();
  564. }
  565. function renameItem() {
  566. /*
  567. * Dados el tipo de elemento y el id del mismo, realiza una petición HTTP
  568. * a la API para cambiar el nombre.
  569. */
  570. var itemId = window.activeId
  571. var itemType = window.activeType
  572. if (itemType == 'layer') {
  573. var url = '/api/layers/' + itemId;
  574. } else if (itemType == 'vector') {
  575. var url = '/api/vectors/' + itemId;
  576. }
  577. sendData = {id: itemId, name: $('#newName').val()};
  578. $.ajax({
  579. type: "PATCH",
  580. url: url,
  581. async: false,
  582. data: JSON.stringify(sendData),
  583. contentType: "application/json; charset=utf-8",
  584. dataType: "json",
  585. error: function(msg) {
  586. console.log(msg.msg);
  587. }
  588. });
  589. $('#modalRename').modal('hide');
  590. refresh();
  591. }
  592. function refresh() {
  593. /* Recarga todos los elementos */
  594. map.eachLayer(function (layer) {
  595. if (layer._url != "http://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png") { //TODO: Buscar otra manera de matchear el mapa base.
  596. map.removeLayer(layer);
  597. }
  598. });
  599. window.layers = null; /* Destruir global */
  600. addLayersMap();
  601. $('#jstree').jstree(true).settings.core.data = makeTree();
  602. $('#overlay_tree').jstree(true).settings.core.data = makeOverlayTree(null);
  603. $('#jstree').jstree(true).refresh();
  604. }
  605. function selectElement(elementId) {
  606. /*
  607. * Espera (preventivamente) a que los elementos se carguen e intenta
  608. * seleccionar el elemento en cuestión
  609. */
  610. if ($('#overlay_tree').jstree().is_loading()) {
  611. window.setTimeout(waitForLoad, 100); /* Reintenta en 100ms si está cargando */
  612. } else {
  613. $('#overlay_tree').jstree('select_node', elementId);
  614. }
  615. }
  616. function toggleControls() {
  617. if ($('#overlay_tree').jstree('get_selected') == '[]') {
  618. $('#btnSave').prop('disabled', 'disabled');
  619. } else {
  620. $('#btnSave').removeProp('disabled');
  621. }
  622. }
  623. </script>
  624. {% endblock %}