ol-wfst 4.2.0 → 4.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (87) hide show
  1. package/LICENSE.md +1 -1
  2. package/README.md +72 -22
  3. package/dist/@enums.d.ts +17 -0
  4. package/dist/@enums.d.ts.map +1 -0
  5. package/dist/@types.d.ts +206 -0
  6. package/dist/@types.d.ts.map +1 -0
  7. package/dist/Geoserver.d.ts +275 -0
  8. package/dist/Geoserver.d.ts.map +1 -0
  9. package/dist/WfsLayer.d.ts +51 -0
  10. package/dist/WfsLayer.d.ts.map +1 -0
  11. package/dist/WmsLayer.d.ts +69 -0
  12. package/dist/WmsLayer.d.ts.map +1 -0
  13. package/dist/css/ol-wfst.bootstrap5.css +18 -18
  14. package/dist/css/ol-wfst.bootstrap5.min.css +1 -1
  15. package/dist/css/ol-wfst.css +26 -39
  16. package/dist/css/ol-wfst.min.css +1 -1
  17. package/dist/defaults.d.ts +4 -0
  18. package/dist/defaults.d.ts.map +1 -0
  19. package/dist/index-umd.d.ts +3 -0
  20. package/dist/index-umd.d.ts.map +1 -0
  21. package/dist/modules/EditControlChanges.d.ts +18 -0
  22. package/dist/modules/EditControlChanges.d.ts.map +1 -0
  23. package/dist/modules/EditFieldsModal.d.ts +19 -0
  24. package/dist/modules/EditFieldsModal.d.ts.map +1 -0
  25. package/dist/modules/EditOverlay.d.ts +8 -0
  26. package/dist/modules/EditOverlay.d.ts.map +1 -0
  27. package/dist/modules/LayersControl.d.ts +38 -0
  28. package/dist/modules/LayersControl.d.ts.map +1 -0
  29. package/dist/modules/Uploads.d.ts +50 -0
  30. package/dist/modules/Uploads.d.ts.map +1 -0
  31. package/dist/modules/base/BaseLayer.d.ts +62 -0
  32. package/dist/modules/base/BaseLayer.d.ts.map +1 -0
  33. package/dist/modules/base/WfsSource.d.ts +49 -0
  34. package/dist/modules/base/WfsSource.d.ts.map +1 -0
  35. package/dist/modules/base/WmsSource.d.ts +47 -0
  36. package/dist/modules/base/WmsSource.d.ts.map +1 -0
  37. package/dist/modules/editLayer.d.ts +4 -0
  38. package/dist/modules/editLayer.d.ts.map +1 -0
  39. package/dist/modules/errors.d.ts +12 -0
  40. package/dist/modules/errors.d.ts.map +1 -0
  41. package/dist/modules/helpers.d.ts +7 -0
  42. package/dist/modules/helpers.d.ts.map +1 -0
  43. package/dist/modules/i18n/en.d.ts +3 -0
  44. package/dist/modules/i18n/en.d.ts.map +1 -0
  45. package/dist/modules/i18n/es.d.ts +3 -0
  46. package/dist/modules/i18n/es.d.ts.map +1 -0
  47. package/dist/modules/i18n/index.d.ts +15 -0
  48. package/dist/modules/i18n/index.d.ts.map +1 -0
  49. package/dist/modules/i18n/zh.d.ts +3 -0
  50. package/dist/modules/i18n/zh.d.ts.map +1 -0
  51. package/dist/modules/loading.d.ts +3 -0
  52. package/dist/modules/loading.d.ts.map +1 -0
  53. package/dist/modules/state.d.ts +22 -0
  54. package/dist/modules/state.d.ts.map +1 -0
  55. package/dist/modules/styleFunction.d.ts +13 -0
  56. package/dist/modules/styleFunction.d.ts.map +1 -0
  57. package/dist/myPragma.d.ts +2 -0
  58. package/dist/myPragma.d.ts.map +1 -0
  59. package/dist/ol-wfst.d.ts +340 -0
  60. package/dist/ol-wfst.d.ts.map +1 -0
  61. package/dist/ol-wfst.js +99 -56
  62. package/dist/ol-wfst.js.map +1 -1
  63. package/dist/ol-wfst.min.js +3 -3
  64. package/dist/ol-wfst.min.js.map +1 -1
  65. package/lib/@types.d.ts +14 -9
  66. package/lib/@types.d.ts.map +1 -1
  67. package/lib/Geoserver.d.ts.map +1 -1
  68. package/lib/WfsLayer.d.ts +2 -4
  69. package/lib/WfsLayer.d.ts.map +1 -1
  70. package/lib/WmsLayer.d.ts +2 -2
  71. package/lib/WmsLayer.d.ts.map +1 -1
  72. package/lib/modules/EditFieldsModal.d.ts +2 -2
  73. package/lib/modules/EditFieldsModal.d.ts.map +1 -1
  74. package/lib/modules/LayersControl.d.ts +8 -4
  75. package/lib/modules/LayersControl.d.ts.map +1 -1
  76. package/lib/modules/base/WfsSource.d.ts +2 -1
  77. package/lib/modules/base/WfsSource.d.ts.map +1 -1
  78. package/lib/ol-wfst.d.ts +25 -22
  79. package/lib/ol-wfst.d.ts.map +1 -1
  80. package/lib/ol-wfst.js +99 -56
  81. package/lib/ol-wfst.js.map +1 -1
  82. package/lib/style/css/ol-gisify.css +26 -39
  83. package/lib/style/css/ol-wfst.bootstrap5.css +18 -18
  84. package/lib/style/scss/ol-wfst.scss +82 -58
  85. package/package.json +5 -5
  86. package/dist/tsconfig.tsbuildinfo +0 -1
  87. package/lib/tsconfig.tsbuildinfo +0 -1
package/lib/ol-wfst.js CHANGED
@@ -1,7 +1,7 @@
1
1
  /*!
2
- * ol-wfst - v4.2.0
2
+ * ol-wfst - v4.4.0
3
3
  * https://github.com/GastonZalba/ol-wfst#readme
4
- * Built: Sat Sep 30 2023 12:32:25 GMT-0300 (Argentina Standard Time)
4
+ * Built: Sun May 05 2024 21:49:12 GMT-0300 (Argentina Standard Time)
5
5
  */
6
6
  import CircleStyle from 'ol/style/Circle.js';
7
7
  import Fill$1 from 'ol/style/Fill.js';
@@ -657,6 +657,9 @@ class WmsLayer extends Mixin(BaseLayer, (TileLayer)) {
657
657
  if (options.beforeTransactFeature) {
658
658
  this.beforeTransactFeature = options.beforeTransactFeature;
659
659
  }
660
+ if (options.beforeShowFieldsModal) {
661
+ this.beforeShowFieldsModal = options.beforeShowFieldsModal;
662
+ }
660
663
  this._formatGeoJSON = new GeoJSON();
661
664
  const geoserver = options.geoserver;
662
665
  const source = new WmsSource({
@@ -724,6 +727,9 @@ class WmsLayer extends Mixin(BaseLayer, (TileLayer)) {
724
727
  const data = await response.json();
725
728
  let features = this._parseFeaturesFromResponse(data);
726
729
  const featuresId = features.map((f) => f.getId());
730
+ if (!featuresId.length) {
731
+ return;
732
+ }
727
733
  const fullResList = await this._getFullResGeometryById(featuresId);
728
734
  if (fullResList) {
729
735
  features = fullResList;
@@ -947,17 +953,21 @@ class LayersControl extends Observable {
947
953
  layer.setVisible(false);
948
954
  }
949
955
  }
956
+ /**
957
+ * Called when a layer is selected in the widget
958
+ * @param evt
959
+ * @param layer
960
+ */
950
961
  _layerChangeHandler(evt, layer) {
951
- const radioInput = evt.currentTarget;
952
- const parentDiv = radioInput.closest('.wfst--layer-control');
953
- // Deselect DOM previous layer
954
962
  const selected = document.querySelector('.ol-wfst--selected-on');
955
- if (selected)
956
- selected.classList.remove('ol-wfst--selected-on');
963
+ const parentDiv = evt.currentTarget.closest('.wfst--layer-control');
964
+ // Deselect DOM previous layer
965
+ selected.classList.remove('ol-wfst--selected-on');
957
966
  // Select this layer
958
967
  parentDiv.classList.add('ol-wfst--selected-on');
959
968
  setActiveLayerToInsertEls(layer);
960
969
  this._changeStateSelect(layer);
970
+ this.dispatchEvent('changeLayer');
961
971
  }
962
972
  render() {
963
973
  return (createElement(null, null,
@@ -1416,23 +1426,37 @@ class EditFieldsModal extends Observable {
1416
1426
  constructor(options) {
1417
1427
  super();
1418
1428
  this._options = options;
1419
- const footer = `
1420
- <button type="button" class="btn btn-sm btn-link btn-third" data-action="delete" data-dismiss="modal">
1421
- ${I18N.labels.delete}
1422
- </button>
1423
- <button type="button" class="btn btn-sm btn-secondary" data-dismiss="modal">
1424
- ${I18N.labels.cancel}
1425
- </button>
1426
- <button type="button" class="btn btn-sm btn-primary" data-action="save" data-dismiss="modal">
1427
- ${I18N.labels.save}
1428
- </button>
1429
- `;
1430
- this._modal = new Modal(Object.assign(Object.assign({}, this._options), { header: true, headerClose: true, title: '', content: '<div></div>', footer: footer }));
1429
+ this._modal = new Modal(Object.assign(Object.assign({}, this._options.modal), { header: true, headerClose: true, title: '', content: createElement("div", null), footer: `
1430
+ <button
1431
+ type="button"
1432
+ class="btn btn-sm btn-link btn-third"
1433
+ data-action="delete"
1434
+ data-dismiss="modal"
1435
+ >
1436
+ ${I18N.labels.delete}
1437
+ </button>
1438
+ <button
1439
+ type="button"
1440
+ class="btn btn-sm btn-secondary"
1441
+ data-dismiss="modal"
1442
+ >
1443
+ ${I18N.labels.cancel}
1444
+ </button>
1445
+ <button
1446
+ type="button"
1447
+ class="btn btn-sm btn-primary"
1448
+ data-action="save"
1449
+ data-dismiss="modal"
1450
+ >
1451
+ ${I18N.labels.save}
1452
+ </button>
1453
+ ` }));
1431
1454
  this._modal.on('dismiss', (modal, event) => {
1432
1455
  // On saving changes
1433
1456
  if (event.target.dataset.action === 'save') {
1434
- const inputs = modal.el.querySelectorAll('input');
1435
- inputs.forEach((el) => {
1457
+ const formElements = modal.el.querySelector('form')
1458
+ .elements;
1459
+ Array.from(formElements).forEach((el) => {
1436
1460
  const value = el.value;
1437
1461
  const field = el.name;
1438
1462
  this._feature.set(field, value, /*isSilent = */ true);
@@ -1448,45 +1472,55 @@ class EditFieldsModal extends Observable {
1448
1472
  }
1449
1473
  show(feature) {
1450
1474
  this._feature = feature;
1451
- const title = `${I18N.labels.editElement} ${feature.getId()} `;
1452
- const properties = feature.getProperties();
1475
+ const modalTitle = `${I18N.labels.editElement} ${feature.getId()} `;
1476
+ const featProperties = feature.getProperties();
1453
1477
  const layerName = feature.get('_layerName_');
1454
1478
  // Data schema from the geoserver
1455
1479
  const layer = getStoredLayer(layerName);
1456
1480
  const dataSchema = layer.getDescribeFeatureType()._parsed.properties;
1457
- let content = '<form autocomplete="false">';
1458
- Object.keys(properties).forEach((key) => {
1481
+ this._modal._html.body.innerHTML = '';
1482
+ this._modal._html.body.append(createElement("form", { autocomplete: "false" }, Object.keys(featProperties).flatMap((key) => {
1459
1483
  // If the feature field exists in the geoserver and is not added by openlayers
1460
1484
  const field = dataSchema.find((data) => data.name === key);
1461
- if (field) {
1462
- const typeXsd = field.type;
1463
- let type;
1464
- switch (typeXsd) {
1465
- case 'xsd:string':
1466
- type = 'text';
1467
- break;
1468
- case 'xsd:number':
1469
- case 'xsd:int':
1470
- type = 'number';
1471
- break;
1472
- case 'xsd:date-time':
1473
- type = 'datetime';
1474
- break;
1475
- default:
1476
- type = 'text';
1485
+ if (!field)
1486
+ return [];
1487
+ const typeXsd = field.type;
1488
+ const value = featProperties[key];
1489
+ let type;
1490
+ switch (typeXsd) {
1491
+ case 'xsd:double':
1492
+ case 'xsd:number':
1493
+ case 'xsd:int':
1494
+ type = 'number';
1495
+ break;
1496
+ case 'xsd:date':
1497
+ type = 'date';
1498
+ break;
1499
+ case 'xsd:date-time':
1500
+ type = 'datetime';
1501
+ break;
1502
+ case 'xsd:string':
1503
+ default:
1504
+ type = 'text';
1505
+ }
1506
+ let input = (createElement("input", { placeholder: "NULL", className: "ol-wfst--input-field-input", type: type, name: key, value: value || null }));
1507
+ if (layer.beforeShowFieldsModal) {
1508
+ const hookInput = layer.beforeShowFieldsModal(field, value, input);
1509
+ if (!hookInput) {
1510
+ return [];
1511
+ }
1512
+ if (typeof hookInput === 'string') {
1513
+ input = new DOMParser().parseFromString(hookInput, 'text/html').body.childNodes[0];
1477
1514
  }
1478
- if (type) {
1479
- content += `
1480
- <div class="ol-wfst--input-field-container">
1481
- <label class="ol-wfst--input-field-label" for="${key}">${key}</label>
1482
- <input placeholder="NULL" class="ol-wfst--input-field-input" type="${type}" name="${key}" value="${properties[key] || ''}">
1483
- </div>`;
1515
+ else {
1516
+ input = hookInput;
1484
1517
  }
1485
1518
  }
1486
- });
1487
- content += '</form>';
1488
- this._modal._html.body.innerHTML = content;
1489
- this._modal._html.header.innerHTML = title;
1519
+ return (createElement("div", { className: "ol-wfst--input-field-container" },
1520
+ createElement("label", { className: "ol-wfst--input-field-label", htmlFor: key }, key),
1521
+ input));
1522
+ })));
1523
+ this._modal._html.header.innerHTML = modalTitle;
1490
1524
  this._modal.show();
1491
1525
  }
1492
1526
  }
@@ -1831,9 +1865,12 @@ class Geoserver extends BaseObject {
1831
1865
  throw new Error(`${I18N.errors.layerNotFound}: "${layerName}"`);
1832
1866
  }
1833
1867
  const describeFeatureType = geoLayer.getDescribeFeatureType()._parsed;
1868
+ const layerNameClean = layerName.split(':').length > 1
1869
+ ? layerName.split(':').pop()
1870
+ : layerName;
1834
1871
  const options = {
1835
1872
  featureNS: describeFeatureType.namespace,
1836
- featureType: layerName,
1873
+ featureType: layerNameClean,
1837
1874
  srsName: srs,
1838
1875
  featurePrefix: null,
1839
1876
  nativeElements: null,
@@ -1861,7 +1898,7 @@ class Geoserver extends BaseObject {
1861
1898
  if (transactionType === TransactionType.Insert) {
1862
1899
  payload = payload.replace(/<(\/?)\bgeometry\b>/g, `<$1${geomField}>`);
1863
1900
  }
1864
- else {
1901
+ else if (transactionType === TransactionType.Update) {
1865
1902
  payload = payload.replace(/<Name>geometry<\/Name>/g, `<Name>${geomField}</Name>`);
1866
1903
  }
1867
1904
  // This has to be te same used before
@@ -2078,7 +2115,7 @@ class EditOverlay extends Overlay {
2078
2115
 
2079
2116
  const controlElement = document.createElement('div');
2080
2117
  /**
2081
- * Tiny WFST-T client to insert (drawing/uploading), modify and delete
2118
+ * Tiny WFS-T client to insert (drawing/uploading), modify and delete
2082
2119
  * features on GeoServers using OpenLayers. Layers with these types
2083
2120
  * of geometries are supported: "GeometryCollection" (in this case, you can
2084
2121
  * choose the geometry type of each element to draw), "Point", "MultiPoint",
@@ -2113,7 +2150,7 @@ class Wfst extends Control {
2113
2150
  this._controlWidgetToolsDiv = controlElement;
2114
2151
  this._controlWidgetToolsDiv.className = 'ol-wfst--tools-control';
2115
2152
  this._uploads = new Uploads(this._options);
2116
- this._editFields = new EditFieldsModal(this._options.modal);
2153
+ this._editFields = new EditFieldsModal(this._options);
2117
2154
  }
2118
2155
  /**
2119
2156
  * Get all the layers in the ol-wfst instance
@@ -2220,7 +2257,7 @@ class Wfst extends Control {
2220
2257
  this._collectionModify.remove(feature);
2221
2258
  });
2222
2259
  // @ts-expect-error
2223
- this._editFields.dispose('delete', ({ feature }) => {
2260
+ this._editFields.on('delete', ({ feature }) => {
2224
2261
  this._deleteFeature(feature, true);
2225
2262
  });
2226
2263
  this._addMapEvents();
@@ -2468,6 +2505,12 @@ class Wfst extends Control {
2468
2505
  this.activateDrawMode(getActiveLayerToInsertEls());
2469
2506
  }
2470
2507
  });
2508
+ // @ts-expect-error
2509
+ this._layersControl.on('changeLayer', () => {
2510
+ if (getMode() === Modes.Draw) {
2511
+ this.activateDrawMode(getActiveLayerToInsertEls());
2512
+ }
2513
+ });
2471
2514
  const controlEl = this._layersControl.render();
2472
2515
  this._selectDraw = controlEl.querySelector('.wfst--tools-control--select-draw');
2473
2516
  this._controlWidgetToolsDiv.append(controlEl);