ol-wfst 5.0.0 → 5.1.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.
- package/README.md +3 -3
- package/dist/@types.d.ts +4 -1
- package/dist/@types.d.ts.map +1 -1
- package/dist/css/ol-wfst.css +343 -305
- package/dist/css/ol-wfst.min.css +1 -1
- package/dist/modules/EditFieldsModal.d.ts +18 -3
- package/dist/modules/EditFieldsModal.d.ts.map +1 -1
- package/dist/modules/LayersControl.d.ts +3 -1
- package/dist/modules/LayersControl.d.ts.map +1 -1
- package/dist/modules/i18n/en.d.ts.map +1 -1
- package/dist/modules/i18n/es.d.ts.map +1 -1
- package/dist/modules/i18n/zh.d.ts.map +1 -1
- package/dist/ol-wfst.d.ts +15 -1
- package/dist/ol-wfst.d.ts.map +1 -1
- package/dist/ol-wfst.js +273 -95
- package/dist/ol-wfst.js.map +1 -1
- package/dist/ol-wfst.min.js +3 -3
- package/dist/ol-wfst.min.js.map +1 -1
- package/lib/@types.d.ts +4 -1
- package/lib/@types.d.ts.map +1 -1
- package/lib/modules/EditFieldsModal.d.ts +18 -3
- package/lib/modules/EditFieldsModal.d.ts.map +1 -1
- package/lib/modules/LayersControl.d.ts +3 -1
- package/lib/modules/LayersControl.d.ts.map +1 -1
- package/lib/modules/i18n/en.d.ts.map +1 -1
- package/lib/modules/i18n/es.d.ts.map +1 -1
- package/lib/modules/i18n/zh.d.ts.map +1 -1
- package/lib/ol-wfst.d.ts +15 -1
- package/lib/ol-wfst.d.ts.map +1 -1
- package/lib/ol-wfst.js +273 -95
- package/lib/ol-wfst.js.map +1 -1
- package/lib/style/css/ol-gisify.css +343 -305
- package/lib/style/scss/ol-wfst.scss +679 -561
- package/package.json +1 -1
package/dist/ol-wfst.min.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ol-wfst.min.js","sources":["../node_modules/modal-vanilla/lib/modal.js","../src/modules/errors.ts","../src/modules/i18n/en.ts","../src/modules/i18n/index.ts","../src/modules/i18n/es.ts","../src/modules/i18n/zh.ts","../src/modules/loading.ts","../node_modules/ts-mixer/dist/esm/index.js","../src/@enums.ts","../src/modules/state.ts","../src/modules/base/BaseLayer.ts","../src/modules/base/WfsSource.ts","../src/WfsLayer.ts","../node_modules/ol/TileState.js","../src/modules/base/WmsSource.ts","../src/WmsLayer.ts","../src/jsx-runtime.ts","../src/modules/LayersControl.tsx","../src/modules/editLayer.ts","../src/modules/Uploads.ts","../src/modules/helpers.ts","../src/modules/EditControlChanges.tsx","../src/modules/styleFunction.ts","../src/modules/EditFieldsModal.tsx","../node_modules/ol-wfs-capabilities/lib/WFSCapabilities.js","../src/Geoserver.ts","../src/modules/EditOverlay.tsx","../src/modules/ExtendLineOverlay.tsx","../src/modules/QueryOverlay.tsx","../src/ol-wfst.ts","../src/defaults.ts","../src/index-umd.ts"],"sourcesContent":["/**\n * Vanilla JS Modal compatible with Bootstrap\n * modal-vanilla 0.12.0 <https://github.com/KaneCohen/modal-vanilla>\n * Copyright 2020 Kane Cohen <https://github.com/KaneCohen>\n * Available under BSD-3-Clause license\n */\nimport EventEmitter from 'events';\n\nlet _factory = null;\n\nconst _defaults = Object.freeze({\n el: null, // Existing DOM element that will be 'Modal-ized'.\n animate: true, // Show Modal using animation.\n animateClass: 'fade', //\n animateInClass: 'show', //\n appendTo: 'body', // DOM element to which constructed Modal will be appended.\n backdrop: true, // Boolean or 'static', Show Modal backdrop blocking content.\n keyboard: true, // Close modal on esc key.\n title: false, // Content of the title in the constructed dialog.\n header: true, // Show header content.\n content: false, // Either string or an HTML element.\n footer: true, // Footer content. By default will use buttons.\n buttons: null, //\n headerClose: true, // Show close button in the header.\n construct: false, // Creates new HTML with a given content.\n transition: 300, //\n backdropTransition: 150 //\n});\n\nconst _buttons = deepFreeze({\n dialog: [\n {text: 'Cancel',\n value: false,\n attr: {\n 'class': 'btn btn-default',\n 'data-dismiss': 'modal'\n }\n },\n {text: 'OK',\n value: true,\n attr: {\n 'class': 'btn btn-primary',\n 'data-dismiss': 'modal'\n }\n }\n ],\n alert: [\n {text: 'OK',\n attr: {\n 'class': 'btn btn-primary',\n 'data-dismiss': 'modal'\n }\n }\n ],\n confirm: [\n {text: 'Cancel',\n value: false,\n attr: {\n 'class': 'btn btn-default',\n 'data-dismiss': 'modal'\n }\n },\n {text: 'OK',\n value: true,\n attr: {\n 'class': 'btn btn-primary',\n 'data-dismiss': 'modal'\n }\n }\n ]\n});\n\nconst _templates = {\n container: '<div class=\"modal\"></div>',\n dialog: '<div class=\"modal-dialog\"></div>',\n content: '<div class=\"modal-content\"></div>',\n header: '<div class=\"modal-header\"></div>',\n headerClose: '<button type=\"button\" class=\"close\" data-dismiss=\"modal\" aria-label=\"Close\"><span aria-hidden=\"true\">×</span></button>',\n body: '<div class=\"modal-body\"></div>',\n footer: '<div class=\"modal-footer\"></div>',\n backdrop: '<div class=\"modal-backdrop\"></div>'\n};\n\nfunction deepFreeze(obj) {\n for (let k in obj) {\n if (Array.isArray(obj[k])) {\n obj[k].forEach(v => {\n deepFreeze(v);\n });\n } else if (obj[k] !== null && typeof obj[k] === 'object') {\n Object.freeze(obj[k]);\n }\n }\n return Object.freeze(obj);\n}\n\nfunction guid() {\n return (((1 + Math.random()) * 0x10000) | 0).toString(16) +\n (((1 + Math.random()) * 0x10000) | 0).toString(16);\n}\n\nfunction data(el, prop, value) {\n let prefix = 'data';\n let elData = el[prefix] || {};\n if (typeof value === 'undefined') {\n if (el[prefix] && el[prefix][prop]) {\n return el[prefix][prop];\n } else {\n var dataAttr = el.getAttribute(`${prefix}-${prop}`);\n if (typeof dataAttr !== 'undefined') {\n return dataAttr;\n }\n return null;\n }\n } else {\n elData[prop] = value;\n el[prefix] = elData;\n return el;\n }\n}\n\nfunction build(html, all) {\n if (html.nodeName) return html;\n html = html.replace(/(\\t|\\n$)/g, '');\n\n if (!_factory) {\n _factory = document.createElement('div');\n }\n\n _factory.innerHTML = '';\n _factory.innerHTML = html;\n if (all === true) {\n return _factory.childNodes;\n } else {\n return _factory.childNodes[0];\n }\n}\n\nfunction calcScrollbarWidth() {\n let inner;\n let width;\n let outerWidth;\n let outer = document.createElement('div');\n Object.assign(outer.style, {\n visibility: 'hidden',\n width: '100px'\n });\n document.body.appendChild(outer);\n\n outerWidth = outer.offsetWidth;\n outer.style.overflow = 'scroll';\n\n inner = document.createElement('div');\n inner.style.width = '100%';\n outer.appendChild(inner);\n\n width = outerWidth - inner.offsetWidth;\n document.body.removeChild(outer);\n\n return width;\n}\n\nfunction getPath(node) {\n let nodes = [node];\n while (node.parentNode) {\n node = node.parentNode;\n nodes.push(node);\n }\n return nodes;\n}\n\nclass Modal extends EventEmitter {\n static set templates(templates) {\n this._baseTemplates = templates;\n }\n\n static get templates() {\n return Object.assign({}, _templates, Modal._baseTemplates || {});\n }\n\n static set buttons(buttons) {\n this._baseButtons = buttons;\n }\n\n static get buttons() {\n return Object.assign({}, _buttons, Modal._baseButtons || {});\n }\n\n static set options(options) {\n this._baseOptions = options;\n }\n\n static get options() {\n return Object.assign({}, _defaults, Modal._baseOptions || {});\n }\n\n static get version() {\n return '0.12.0';\n }\n\n static alert(message, _options = {}) {\n let options = Object.assign({},\n _defaults,\n {\n title: message,\n content: false,\n construct: true,\n headerClose: false,\n buttons: Modal.buttons.alert\n },\n _options\n );\n\n return new Modal(options);\n }\n\n static confirm(question, _options = {}) {\n let options = Object.assign({},\n _defaults,\n {\n title: question,\n content: false,\n construct: true,\n headerClose: false,\n buttons: Modal.buttons.confirm\n },\n _options\n );\n\n return new Modal(options);\n }\n\n constructor(options = {}) {\n super();\n\n this.id = guid();\n this.el = null;\n this._html = {};\n this._events = {};\n this._visible = false;\n this._pointerInContent = false;\n this._options = Object.assign({}, Modal.options, options);\n this._templates = Object.assign({}, Modal.templates, options.templates || {});\n this._html.appendTo = document.querySelector(this._options.appendTo);\n this._scrollbarWidth = calcScrollbarWidth();\n\n if (this._options.buttons === null) {\n this._options.buttons = Modal.buttons.dialog;\n }\n\n if (this._options.el) {\n let el = this._options.el;\n if (typeof this._options.el == 'string') {\n el = document.querySelector(this._options.el);\n if (! el) {\n throw new Error(`Selector: DOM Element ${this._options.el} not found.`);\n }\n }\n data(el, 'modal', this);\n this.el = el;\n } else {\n this._options.construct = true;\n }\n\n if (this._options.construct) {\n this._render();\n } else {\n this._mapDom();\n }\n }\n\n _render() {\n let html = this._html;\n let o = this._options;\n let t = this._templates;\n let animate = o.animate ? o.animateClass : false;\n\n html.container = build(t.container);\n html.dialog = build(t.dialog);\n html.content = build(t.content);\n html.header = build(t.header);\n html.headerClose = build(t.headerClose);\n html.body = build(t.body);\n html.footer = build(t.footer);\n if (animate) html.container.classList.add(animate);\n\n this._setHeader();\n this._setContent();\n this._setFooter();\n\n this.el = html.container;\n\n html.dialog.appendChild(html.content);\n html.container.appendChild(html.dialog);\n\n return this;\n }\n\n _mapDom() {\n let html = this._html;\n let o = this._options;\n\n if (this.el.classList.contains(o.animateClass)) {\n o.animate = true;\n }\n\n html.container = this.el;\n html.dialog = this.el.querySelector('.modal-dialog');\n html.content = this.el.querySelector('.modal-content');\n html.header = this.el.querySelector('.modal-header');\n html.headerClose = this.el.querySelector('.modal-header .close');\n html.body = this.el.querySelector('.modal-body');\n html.footer = this.el.querySelector('.modal-footer');\n\n this._setHeader();\n this._setContent();\n this._setFooter();\n\n return this;\n }\n\n _setHeader() {\n let html = this._html;\n let o = this._options;\n\n if (o.header && html.header) {\n if (o.title.nodeName) {\n html.header.innerHTML = o.title.outerHTML;\n } else if (typeof o.title === 'string') {\n html.header.innerHTML = `<h4 class=\"modal-title\">${o.title}</h4>`;\n }\n // Add header close button only to constructed modals.\n if (this.el === null && html.headerClose && o.headerClose) {\n html.header.appendChild(html.headerClose);\n }\n if (o.construct) {\n html.content.appendChild(html.header);\n }\n }\n }\n\n _setContent() {\n let html = this._html;\n let o = this._options;\n\n if (o.content && html.body) {\n if (typeof o.content === 'string') {\n html.body.innerHTML = o.content;\n } else {\n html.body.innerHTML = o.content.outerHTML;\n }\n if (o.construct) {\n html.content.appendChild(html.body);\n }\n }\n }\n\n _setFooter() {\n let html = this._html;\n let o = this._options;\n\n if (o.footer && html.footer) {\n if (o.footer.nodeName) {\n html.footer.ineerHTML = o.footer.outerHTML;\n } else if (typeof o.footer === 'string') {\n html.footer.innerHTML = o.footer;\n } else if (! html.footer.children.length) {\n o.buttons.forEach((button) => {\n let el = document.createElement('button');\n data(el, 'button', button);\n el.innerHTML = button.text;\n el.setAttribute('type', 'button');\n for (let j in button.attr) {\n el.setAttribute(j, button.attr[j]);\n }\n html.footer.appendChild(el);\n });\n }\n if (o.construct) {\n html.content.appendChild(html.footer);\n }\n }\n\n }\n\n _setEvents() {\n let o = this._options;\n let html = this._html;\n\n this._events.keydownHandler = this._handleKeydownEvent.bind(this);\n document.body.addEventListener('keydown',\n this._events.keydownHandler\n );\n\n this._events.mousedownHandler = this._handleMousedownEvent.bind(this);\n html.container.addEventListener('mousedown',\n this._events.mousedownHandler\n );\n\n this._events.clickHandler = this._handleClickEvent.bind(this);\n html.container.addEventListener('click',\n this._events.clickHandler\n );\n\n this._events.resizeHandler = this._handleResizeEvent.bind(this);\n window.addEventListener('resize',\n this._events.resizeHandler\n );\n }\n\n _handleMousedownEvent(e) {\n this._pointerInContent = false;\n let path = getPath(e.target);\n path.every(node => {\n if (node.classList && node.classList.contains('modal-content')) {\n this._pointerInContent = true;\n return false;\n }\n return true;\n });\n }\n\n _handleClickEvent(e) {\n let path = getPath(e.target);\n path.every(node => {\n if (node.tagName === 'HTML') {\n return false;\n }\n if (this._options.backdrop !== true && node.classList.contains('modal')) {\n return false;\n }\n if (node.classList.contains('modal-content')) {\n return false;\n }\n if (node.getAttribute('data-dismiss') === 'modal') {\n this.emit('dismiss', this, e, data(e.target, 'button'));\n this.hide();\n return false;\n }\n\n if (!this._pointerInContent && node.classList.contains('modal')) {\n this.emit('dismiss', this, e, null);\n this.hide();\n return false;\n }\n return true;\n });\n\n this._pointerInContent = false;\n }\n\n _handleKeydownEvent(e) {\n if (e.which === 27 && this._options.keyboard) {\n this.emit('dismiss', this, e, null);\n this.hide();\n }\n }\n\n _handleResizeEvent(e) {\n this._resize();\n }\n\n show() {\n let o = this._options;\n let html = this._html;\n this.emit('show', this);\n\n this._checkScrollbar();\n this._setScrollbar();\n document.body.classList.add('modal-open');\n\n if (o.construct) {\n html.appendTo.appendChild(html.container);\n }\n\n html.container.style.display = 'block';\n html.container.scrollTop = 0;\n\n if (o.backdrop !== false) {\n this.once('showBackdrop', () => {\n this._setEvents();\n\n if (o.animate) html.container.offsetWidth; // Force reflow\n\n html.container.classList.add(o.animateInClass);\n\n setTimeout(() => {\n this._visible = true;\n this.emit('shown', this);\n }, o.transition);\n });\n this._backdrop();\n } else {\n this._setEvents();\n\n if (o.animate) html.container.offsetWidth; // Force reflow\n\n html.container.classList.add(o.animateInClass);\n\n setTimeout(() => {\n this._visible = true;\n this.emit('shown', this);\n }, o.transition);\n }\n this._resize();\n\n return this;\n }\n\n toggle() {\n if (this._visible) {\n this.hide();\n } else {\n this.show();\n }\n }\n\n _resize() {\n var modalIsOverflowing =\n this._html.container.scrollHeight > document.documentElement.clientHeight;\n\n this._html.container.style.paddingLeft =\n ! this.bodyIsOverflowing && modalIsOverflowing ? this._scrollbarWidth + 'px' : '';\n\n this._html.container.style.paddingRight =\n this.bodyIsOverflowing && ! modalIsOverflowing ? this._scrollbarWidth + 'px' : '';\n }\n\n _backdrop() {\n let html = this._html;\n let t = this._templates;\n let o = this._options;\n let animate = o.animate ? o.animateClass : false;\n\n html.backdrop = build(t.backdrop);\n if (animate) html.backdrop.classList.add(animate);\n html.appendTo.appendChild(html.backdrop);\n\n if (animate) html.backdrop.offsetWidth;\n\n html.backdrop.classList.add(o.animateInClass);\n\n setTimeout(() => {\n this.emit('showBackdrop', this);\n }, this._options.backdropTransition);\n }\n\n hide() {\n let html = this._html;\n let o = this._options;\n let contCList = html.container.classList;\n this.emit('hide', this);\n\n contCList.remove(o.animateInClass);\n\n if (o.backdrop) {\n let backCList = html.backdrop.classList;\n backCList.remove(o.animateInClass);\n }\n\n this._removeEvents();\n\n setTimeout(() => {\n document.body.classList.remove('modal-open');\n document.body.style.paddingRight = this.originalBodyPad;\n }, o.backdropTransition);\n\n setTimeout(() => {\n if (o.backdrop) {\n html.backdrop.parentNode.removeChild(html.backdrop);\n }\n html.container.style.display = 'none';\n\n if (o.construct) {\n html.container.parentNode.removeChild(html.container);\n }\n\n this._visible = false;\n this.emit('hidden', this);\n }, o.transition);\n\n return this;\n }\n\n _removeEvents() {\n if (this._events.keydownHandler) {\n document.body.removeEventListener('keydown',\n this._events.keydownHandler\n );\n }\n\n this._html.container.removeEventListener('mousedown',\n this._events.mousedownHandler\n );\n\n this._html.container.removeEventListener('click',\n this._events.clickHandler\n );\n\n window.removeEventListener('resize',\n this._events.resizeHandler\n );\n }\n\n _checkScrollbar() {\n this.bodyIsOverflowing = document.body.clientWidth < window.innerWidth;\n }\n\n _setScrollbar() {\n this.originalBodyPad = document.body.style.paddingRight || '';\n if (this.bodyIsOverflowing) {\n let basePadding = parseInt(this.originalBodyPad || 0, 10);\n document.body.style.paddingRight = basePadding + this._scrollbarWidth + 'px';\n }\n }\n}\n\nexport default Modal;\n","// External\r\nimport Modal from 'modal-vanilla';\r\n\r\nimport { Options } from '../ol-wfst';\r\nimport { ExceptionGeoserver, IGeoserverDescribeFeatureType } from '../@types';\r\nlet options = {};\r\n\r\n// Store layerNames that has errors\r\nconst isError = new Set();\r\n\r\nexport const initModal = (opts: Options['modal']) => {\r\n options = opts;\r\n};\r\n\r\nexport const parseError = (\r\n geoserverResponse: IGeoserverDescribeFeatureType\r\n) => {\r\n if ('exceptions' in geoserverResponse) {\r\n return (geoserverResponse.exceptions as ExceptionGeoserver[])\r\n .map((e) => e.text)\r\n .join(',');\r\n } else {\r\n return '';\r\n }\r\n};\r\n\r\n/**\r\n * Show modal with errors\r\n *\r\n * @param msg\r\n * @private\r\n */\r\nexport const showError = (\r\n msg: string,\r\n originalError: Error = null,\r\n layerName = ''\r\n): void => {\r\n // Prevent multiples modals error in the same layer\r\n if (isError.has(layerName)) {\r\n return;\r\n }\r\n\r\n isError.add(layerName);\r\n\r\n let err_msg = `<b>Error: ${msg}</b>`;\r\n if (originalError && originalError.message !== msg) {\r\n err_msg += `. ${originalError.message}`;\r\n }\r\n\r\n const al = Modal.alert(err_msg, options);\r\n\r\n al.show();\r\n\r\n al.on('hidden', () => {\r\n isError.delete(layerName);\r\n });\r\n};\r\n","import { I18n } from '../../ol-wfst';\r\n\r\nexport const en: I18n = {\r\n labels: {\r\n select: 'Select',\r\n selectBox: 'Select features by drawing a box',\r\n selectFreehand: 'Select features by freehand drawing',\r\n query: 'Query feature info',\r\n featureInfo: 'Feature info',\r\n addElement: 'Toggle Draw mode',\r\n editElement: 'Edit feature',\r\n save: 'Save',\r\n delete: 'Delete',\r\n cancel: 'Cancel',\r\n apply: 'Apply changes',\r\n upload: 'Upload',\r\n editMode: 'Edit Mode',\r\n confirmDelete: 'Are you sure to delete the feature?',\r\n confirmDeleteElements: 'Delete the {} selected features?',\r\n geomTypeNotSupported: 'Geometry not supported by layer',\r\n editFields: 'Edit fields',\r\n editGeom: 'Edit geometry',\r\n continueLine: 'Continue drawing from here',\r\n selectDrawType: 'Geometry type to draw',\r\n uploadToLayer: 'Upload file to selected layer',\r\n uploadFeatures: 'Uploaded features to layer',\r\n validFeatures: 'Valid geometries',\r\n invalidFeatures: 'Invalid',\r\n loading: 'Loading...',\r\n toggleVisibility: 'Toggle layer visibility',\r\n fullscreen: 'Fullscreen',\r\n close: 'Close',\r\n multipleValues: 'Multiple values',\r\n editElements: 'Edit features ({})',\r\n multipleEditNotice:\r\n 'Multi-edit active. Changes will be applied to the {} selected features.',\r\n geoserverLayers: 'Geoserver Layers'\r\n },\r\n errors: {\r\n capabilities: 'GeoServer Capabilities could not be downloaded.',\r\n wfst: 'The GeoServer does not support Transactions',\r\n layer: 'Could not get data from layer',\r\n layerNotFound: 'Layer not found',\r\n layerNotVisible: 'Layer is not visible',\r\n noValidGeometry: 'No valid geometries found to add to this layer',\r\n geoserver: 'Failed to get data from GeoServer',\r\n badFormat: 'Unsupported format',\r\n badFile: 'Error reading items from file',\r\n lockFeature: 'Could not lock items on the GeoServer',\r\n transaction: 'Error when doing Transaction with GeoServer',\r\n getFeatures: 'Error getting elements from GeoServer'\r\n }\r\n};\r\n","import { I18n } from '../../@types';\r\nexport * from './es';\r\nexport * from './en';\r\nexport * from './zh';\r\n\r\nimport { es } from './es';\r\nimport { en } from './en';\r\nimport { zh } from './zh';\r\n\r\nconst langs = {\r\n es,\r\n en,\r\n zh\r\n};\r\n\r\n// Set default Language\r\nexport let I18N: I18n = en;\r\n\r\nexport const setLang = (lang = 'en', customI18n: I18n = null): void => {\r\n // Check if language exists\r\n if (lang in langs) {\r\n I18N = langs[lang];\r\n }\r\n\r\n // Check if customs translations are provided\r\n if (customI18n) {\r\n I18N = { ...I18N, ...customI18n };\r\n }\r\n};\r\n\r\n/**\r\n * /**\r\n * For translations thas has a variable \"{}\"\" to be replaced inside\r\n * @param string\r\n * @param args\r\n * @returns\r\n */\r\nexport const I18N_ = (string: string, ...args: any): string => {\r\n let text = (I18N.labels as Record<string, string>)?.[string];\r\n\r\n if (!text) {\r\n text = (I18N as Record<string, string>)[string];\r\n }\r\n\r\n if (!text) {\r\n console.error('Translation not found', string);\r\n text = string;\r\n }\r\n\r\n if (args.length) {\r\n args.forEach((arg) => {\r\n text = text.replace(/{}/, arg);\r\n });\r\n }\r\n\r\n return text;\r\n};\r\n","import { I18n } from '../../ol-wfst';\r\n\r\nexport const es: I18n = {\r\n labels: {\r\n select: 'Seleccionar',\r\n selectBox: 'Seleccionar elementos dibujando una caja',\r\n selectFreehand: 'Seleccionar elementos dibujando a mano alzada',\r\n query: 'Consultar información del elemento',\r\n featureInfo: 'Información del elemento',\r\n addElement: 'Modo dibujo',\r\n editElement: 'Editar elemento',\r\n save: 'Guardar',\r\n delete: 'Eliminar',\r\n cancel: 'Cancelar',\r\n apply: 'Aplicar cambios',\r\n upload: 'Subir',\r\n editMode: 'Modo Edición',\r\n confirmDelete: '¿Estás seguro de borrar el elemento?',\r\n confirmDeleteElements: '¿Borrar los {} elementos?',\r\n geomTypeNotSupported: 'Geometría no compatible con la capa',\r\n editFields: 'Editar campos',\r\n editGeom: 'Editar geometría',\r\n continueLine: 'Continuar dibujando desde aquí',\r\n selectDrawType: 'Tipo de geometría para dibujar',\r\n uploadToLayer: 'Subir archivo a la capa seleccionada',\r\n uploadFeatures: 'Subida de elementos a la capa',\r\n validFeatures: 'Válidas',\r\n invalidFeatures: 'Invalidas',\r\n loading: 'Cargando...',\r\n toggleVisibility: 'Cambiar visibilidad de la capa',\r\n fullscreen: 'Pantalla completa',\r\n close: 'Cerrar',\r\n multipleValues: 'Valores múltiples',\r\n editElements: 'Editar elementos ({})',\r\n multipleEditNotice:\r\n 'Edición múltiple activada. Los cambios se aplicarán a los {} elementos seleccionados.',\r\n geoserverLayers: 'Capas de GeoServer'\r\n },\r\n errors: {\r\n capabilities: 'No se pudieron obtener las Capabilidades del GeoServer',\r\n wfst: 'El GeoServer no tiene soporte a Transacciones',\r\n layer: 'No se pudieron obtener datos de la capa',\r\n layerNotFound: 'Capa no encontrada',\r\n layerNotVisible: 'La capa no está visible',\r\n noValidGeometry:\r\n 'No se encontraron geometrías válidas para agregar a esta capa',\r\n geoserver: 'No se pudieron obtener datos desde el GeoServer',\r\n badFormat: 'Formato no soportado',\r\n badFile: 'Error al leer elementos del archivo',\r\n lockFeature: 'No se pudieron bloquear elementos en el GeoServer',\r\n transaction: 'Error al hacer transacción con el GeoServer',\r\n getFeatures: 'Error al obtener elemento desde el GeoServer'\r\n }\r\n};\r\n","import { I18n } from '../../ol-wfst';\r\n\r\nexport const zh: I18n = {\r\n labels: {\r\n select: '选择',\r\n selectBox: '框选元素',\r\n selectFreehand: '手绘选择元素',\r\n query: '查询元素信息',\r\n featureInfo: '元素信息',\r\n addElement: '切换绘图类型',\r\n editElement: '编辑元素',\r\n save: '保存',\r\n delete: '删除',\r\n cancel: '取消',\r\n apply: '确认并应用改变',\r\n upload: '上传',\r\n editMode: '编辑模式',\r\n confirmDelete: '确认删除元素?',\r\n confirmDeleteElements: '确认删除选中的 {} 个元素?',\r\n geomTypeNotSupported: '图层不支持该几何',\r\n editFields: '编辑区域',\r\n editGeom: '编辑几何',\r\n continueLine: '从此处继续绘制',\r\n selectDrawType: '几何类型',\r\n uploadToLayer: '通过文件上传图层',\r\n uploadFeatures: '上传元素到图层',\r\n validFeatures: '合法的几何类型',\r\n invalidFeatures: '不合法',\r\n loading: '加载中...',\r\n toggleVisibility: '切换图层透明度',\r\n fullscreen: '全屏',\r\n close: '关闭',\r\n multipleValues: '多个值',\r\n editElements: '编辑元素({})',\r\n multipleEditNotice: '多选编辑已激活。更改将应用于所有 {} 个选定元素。',\r\n geoserverLayers: 'GeoServer 图层'\r\n },\r\n errors: {\r\n capabilities: '无法加载GeoServer服务所支持的能力.',\r\n wfst: 'GeoServer不支持事务',\r\n layer: '无法从图层获得数据',\r\n layerNotFound: 'Layer not found',\r\n layerNotVisible: 'Layer is not visible',\r\n noValidGeometry: '不支持的几何类型无法加载到图层',\r\n geoserver: '无法从GeoServer获取数据',\r\n badFormat: '不支持的格式',\r\n badFile: '读取文件数据出错',\r\n lockFeature: '无法锁定GeoServer上的元素.',\r\n transaction: 'GeoServer处理事务出错.',\r\n getFeatures: '从GeoServer获取元素出错.'\r\n }\r\n};\r\n","import { I18N } from './i18n';\r\n\r\nlet loadingDiv: HTMLDivElement;\r\n\r\nexport const initLoading = (): HTMLDivElement => {\r\n loadingDiv = document.createElement('div');\r\n loadingDiv.className = 'ol-wfst--tools-control--loading';\r\n loadingDiv.setAttribute('role', 'progressbar');\r\n loadingDiv.setAttribute('aria-label', I18N.labels.loading);\r\n return loadingDiv;\r\n};\r\n\r\nexport const showLoading = (bool: boolean = true) => {\r\n if (bool) {\r\n loadingDiv.classList.add('ol-wfst--tools-control--loading-show');\r\n } else {\r\n loadingDiv.classList.remove('ol-wfst--tools-control--loading-show');\r\n }\r\n};\r\n","/**\n * Utility function that works like `Object.apply`, but copies getters and setters properly as well. Additionally gives\n * the option to exclude properties by name.\n */\nconst copyProps = (dest, src, exclude = []) => {\n const props = Object.getOwnPropertyDescriptors(src);\n for (let prop of exclude)\n delete props[prop];\n Object.defineProperties(dest, props);\n};\n/**\n * Returns the full chain of prototypes up until Object.prototype given a starting object. The order of prototypes will\n * be closest to farthest in the chain.\n */\nconst protoChain = (obj, currentChain = [obj]) => {\n const proto = Object.getPrototypeOf(obj);\n if (proto === null)\n return currentChain;\n return protoChain(proto, [...currentChain, proto]);\n};\n/**\n * Identifies the nearest ancestor common to all the given objects in their prototype chains. For most unrelated\n * objects, this function should return Object.prototype.\n */\nconst nearestCommonProto = (...objs) => {\n if (objs.length === 0)\n return undefined;\n let commonProto = undefined;\n const protoChains = objs.map(obj => protoChain(obj));\n while (protoChains.every(protoChain => protoChain.length > 0)) {\n const protos = protoChains.map(protoChain => protoChain.pop());\n const potentialCommonProto = protos[0];\n if (protos.every(proto => proto === potentialCommonProto))\n commonProto = potentialCommonProto;\n else\n break;\n }\n return commonProto;\n};\n/**\n * Creates a new prototype object that is a mixture of the given prototypes. The mixing is achieved by first\n * identifying the nearest common ancestor and using it as the prototype for a new object. Then all properties/methods\n * downstream of this prototype (ONLY downstream) are copied into the new object.\n *\n * The resulting prototype is more performant than softMixProtos(...), as well as ES5 compatible. However, it's not as\n * flexible as updates to the source prototypes aren't captured by the mixed result. See softMixProtos for why you may\n * want to use that instead.\n */\nconst hardMixProtos = (ingredients, constructor, exclude = []) => {\n var _a;\n const base = (_a = nearestCommonProto(...ingredients)) !== null && _a !== void 0 ? _a : Object.prototype;\n const mixedProto = Object.create(base);\n // Keeps track of prototypes we've already visited to avoid copying the same properties multiple times. We init the\n // list with the proto chain below the nearest common ancestor because we don't want any of those methods mixed in\n // when they will already be accessible via prototype access.\n const visitedProtos = protoChain(base);\n for (let prototype of ingredients) {\n let protos = protoChain(prototype);\n // Apply the prototype chain in reverse order so that old methods don't override newer ones.\n for (let i = protos.length - 1; i >= 0; i--) {\n let newProto = protos[i];\n if (visitedProtos.indexOf(newProto) === -1) {\n copyProps(mixedProto, newProto, ['constructor', ...exclude]);\n visitedProtos.push(newProto);\n }\n }\n }\n mixedProto.constructor = constructor;\n return mixedProto;\n};\nconst unique = (arr) => arr.filter((e, i) => arr.indexOf(e) == i);\n\n/**\n * Finds the ingredient with the given prop, searching in reverse order and breadth-first if searching ingredient\n * prototypes is required.\n */\nconst getIngredientWithProp = (prop, ingredients) => {\n const protoChains = ingredients.map(ingredient => protoChain(ingredient));\n // since we search breadth-first, we need to keep track of our depth in the prototype chains\n let protoDepth = 0;\n // not all prototype chains are the same depth, so this remains true as long as at least one of the ingredients'\n // prototype chains has an object at this depth\n let protosAreLeftToSearch = true;\n while (protosAreLeftToSearch) {\n // with the start of each horizontal slice, we assume this is the one that's deeper than any of the proto chains\n protosAreLeftToSearch = false;\n // scan through the ingredients right to left\n for (let i = ingredients.length - 1; i >= 0; i--) {\n const searchTarget = protoChains[i][protoDepth];\n if (searchTarget !== undefined && searchTarget !== null) {\n // if we find something, this is proof that this horizontal slice potentially more objects to search\n protosAreLeftToSearch = true;\n // eureka, we found it\n if (Object.getOwnPropertyDescriptor(searchTarget, prop) != undefined) {\n return protoChains[i][0];\n }\n }\n }\n protoDepth++;\n }\n return undefined;\n};\n/**\n * \"Mixes\" ingredients by wrapping them in a Proxy. The optional prototype argument allows the mixed object to sit\n * downstream of an existing prototype chain. Note that \"properties\" cannot be added, deleted, or modified.\n */\nconst proxyMix = (ingredients, prototype = Object.prototype) => new Proxy({}, {\n getPrototypeOf() {\n return prototype;\n },\n setPrototypeOf() {\n throw Error('Cannot set prototype of Proxies created by ts-mixer');\n },\n getOwnPropertyDescriptor(_, prop) {\n return Object.getOwnPropertyDescriptor(getIngredientWithProp(prop, ingredients) || {}, prop);\n },\n defineProperty() {\n throw new Error('Cannot define new properties on Proxies created by ts-mixer');\n },\n has(_, prop) {\n return getIngredientWithProp(prop, ingredients) !== undefined || prototype[prop] !== undefined;\n },\n get(_, prop) {\n return (getIngredientWithProp(prop, ingredients) || prototype)[prop];\n },\n set(_, prop, val) {\n const ingredientWithProp = getIngredientWithProp(prop, ingredients);\n if (ingredientWithProp === undefined)\n throw new Error('Cannot set new properties on Proxies created by ts-mixer');\n ingredientWithProp[prop] = val;\n return true;\n },\n deleteProperty() {\n throw new Error('Cannot delete properties on Proxies created by ts-mixer');\n },\n ownKeys() {\n return ingredients\n .map(Object.getOwnPropertyNames)\n .reduce((prev, curr) => curr.concat(prev.filter(key => curr.indexOf(key) < 0)));\n },\n});\n/**\n * Creates a new proxy-prototype object that is a \"soft\" mixture of the given prototypes. The mixing is achieved by\n * proxying all property access to the ingredients. This is not ES5 compatible and less performant. However, any\n * changes made to the source prototypes will be reflected in the proxy-prototype, which may be desirable.\n */\nconst softMixProtos = (ingredients, constructor) => proxyMix([...ingredients, { constructor }]);\n\nconst settings = {\n initFunction: null,\n staticsStrategy: 'copy',\n prototypeStrategy: 'copy',\n decoratorInheritance: 'deep',\n};\n\n// Keeps track of constituent classes for every mixin class created by ts-mixer.\nconst mixins = new WeakMap();\nconst getMixinsForClass = (clazz) => mixins.get(clazz);\nconst registerMixins = (mixedClass, constituents) => mixins.set(mixedClass, constituents);\nconst hasMixin = (instance, mixin) => {\n if (instance instanceof mixin)\n return true;\n const constructor = instance.constructor;\n const visited = new Set();\n let frontier = new Set();\n frontier.add(constructor);\n while (frontier.size > 0) {\n // check if the frontier has the mixin we're looking for. if not, we can say we visited every item in the frontier\n if (frontier.has(mixin))\n return true;\n frontier.forEach((item) => visited.add(item));\n // build a new frontier based on the associated mixin classes and prototype chains of each frontier item\n const newFrontier = new Set();\n frontier.forEach((item) => {\n var _a;\n const itemConstituents = (_a = mixins.get(item)) !== null && _a !== void 0 ? _a : protoChain(item.prototype)\n .map((proto) => proto.constructor)\n .filter((item) => item !== null);\n if (itemConstituents)\n itemConstituents.forEach((constituent) => {\n if (!visited.has(constituent) && !frontier.has(constituent))\n newFrontier.add(constituent);\n });\n });\n // we have a new frontier, now search again\n frontier = newFrontier;\n }\n // if we get here, we couldn't find the mixin anywhere in the prototype chain or associated mixin classes\n return false;\n};\n\nconst mergeObjectsOfDecorators = (o1, o2) => {\n var _a, _b;\n const allKeys = unique([...Object.getOwnPropertyNames(o1), ...Object.getOwnPropertyNames(o2)]);\n const mergedObject = {};\n for (let key of allKeys)\n mergedObject[key] = unique([...((_a = o1 === null || o1 === void 0 ? void 0 : o1[key]) !== null && _a !== void 0 ? _a : []), ...((_b = o2 === null || o2 === void 0 ? void 0 : o2[key]) !== null && _b !== void 0 ? _b : [])]);\n return mergedObject;\n};\nconst mergePropertyAndMethodDecorators = (d1, d2) => {\n var _a, _b, _c, _d;\n return ({\n property: mergeObjectsOfDecorators((_a = d1 === null || d1 === void 0 ? void 0 : d1.property) !== null && _a !== void 0 ? _a : {}, (_b = d2 === null || d2 === void 0 ? void 0 : d2.property) !== null && _b !== void 0 ? _b : {}),\n method: mergeObjectsOfDecorators((_c = d1 === null || d1 === void 0 ? void 0 : d1.method) !== null && _c !== void 0 ? _c : {}, (_d = d2 === null || d2 === void 0 ? void 0 : d2.method) !== null && _d !== void 0 ? _d : {}),\n });\n};\nconst mergeDecorators = (d1, d2) => {\n var _a, _b, _c, _d, _e, _f;\n return ({\n class: unique([...(_a = d1 === null || d1 === void 0 ? void 0 : d1.class) !== null && _a !== void 0 ? _a : [], ...(_b = d2 === null || d2 === void 0 ? void 0 : d2.class) !== null && _b !== void 0 ? _b : []]),\n static: mergePropertyAndMethodDecorators((_c = d1 === null || d1 === void 0 ? void 0 : d1.static) !== null && _c !== void 0 ? _c : {}, (_d = d2 === null || d2 === void 0 ? void 0 : d2.static) !== null && _d !== void 0 ? _d : {}),\n instance: mergePropertyAndMethodDecorators((_e = d1 === null || d1 === void 0 ? void 0 : d1.instance) !== null && _e !== void 0 ? _e : {}, (_f = d2 === null || d2 === void 0 ? void 0 : d2.instance) !== null && _f !== void 0 ? _f : {}),\n });\n};\nconst decorators = new Map();\nconst findAllConstituentClasses = (...classes) => {\n var _a;\n const allClasses = new Set();\n const frontier = new Set([...classes]);\n while (frontier.size > 0) {\n for (let clazz of frontier) {\n const protoChainClasses = protoChain(clazz.prototype).map(proto => proto.constructor);\n const mixinClasses = (_a = getMixinsForClass(clazz)) !== null && _a !== void 0 ? _a : [];\n const potentiallyNewClasses = [...protoChainClasses, ...mixinClasses];\n const newClasses = potentiallyNewClasses.filter(c => !allClasses.has(c));\n for (let newClass of newClasses)\n frontier.add(newClass);\n allClasses.add(clazz);\n frontier.delete(clazz);\n }\n }\n return [...allClasses];\n};\nconst deepDecoratorSearch = (...classes) => {\n const decoratorsForClassChain = findAllConstituentClasses(...classes)\n .map(clazz => decorators.get(clazz))\n .filter(decorators => !!decorators);\n if (decoratorsForClassChain.length == 0)\n return {};\n if (decoratorsForClassChain.length == 1)\n return decoratorsForClassChain[0];\n return decoratorsForClassChain.reduce((d1, d2) => mergeDecorators(d1, d2));\n};\nconst directDecoratorSearch = (...classes) => {\n const classDecorators = classes.map(clazz => getDecoratorsForClass(clazz));\n if (classDecorators.length === 0)\n return {};\n if (classDecorators.length === 1)\n return classDecorators[0];\n return classDecorators.reduce((d1, d2) => mergeDecorators(d1, d2));\n};\nconst getDecoratorsForClass = (clazz) => {\n let decoratorsForClass = decorators.get(clazz);\n if (!decoratorsForClass) {\n decoratorsForClass = {};\n decorators.set(clazz, decoratorsForClass);\n }\n return decoratorsForClass;\n};\nconst decorateClass = (decorator) => ((clazz) => {\n const decoratorsForClass = getDecoratorsForClass(clazz);\n let classDecorators = decoratorsForClass.class;\n if (!classDecorators) {\n classDecorators = [];\n decoratorsForClass.class = classDecorators;\n }\n classDecorators.push(decorator);\n return decorator(clazz);\n});\nconst decorateMember = (decorator) => ((object, key, ...otherArgs) => {\n var _a, _b, _c;\n const decoratorTargetType = typeof object === 'function' ? 'static' : 'instance';\n const decoratorType = typeof object[key] === 'function' ? 'method' : 'property';\n const clazz = decoratorTargetType === 'static' ? object : object.constructor;\n const decoratorsForClass = getDecoratorsForClass(clazz);\n const decoratorsForTargetType = (_a = decoratorsForClass === null || decoratorsForClass === void 0 ? void 0 : decoratorsForClass[decoratorTargetType]) !== null && _a !== void 0 ? _a : {};\n decoratorsForClass[decoratorTargetType] = decoratorsForTargetType;\n let decoratorsForType = (_b = decoratorsForTargetType === null || decoratorsForTargetType === void 0 ? void 0 : decoratorsForTargetType[decoratorType]) !== null && _b !== void 0 ? _b : {};\n decoratorsForTargetType[decoratorType] = decoratorsForType;\n let decoratorsForKey = (_c = decoratorsForType === null || decoratorsForType === void 0 ? void 0 : decoratorsForType[key]) !== null && _c !== void 0 ? _c : [];\n decoratorsForType[key] = decoratorsForKey;\n // @ts-ignore: array is type `A[] | B[]` and item is type `A | B`, so technically a type error, but it's fine\n decoratorsForKey.push(decorator);\n // @ts-ignore\n return decorator(object, key, ...otherArgs);\n});\nconst decorate = (decorator) => ((...args) => {\n if (args.length === 1)\n return decorateClass(decorator)(args[0]);\n return decorateMember(decorator)(...args);\n});\n\nfunction Mixin(...constructors) {\n var _a, _b, _c;\n const prototypes = constructors.map(constructor => constructor.prototype);\n // Here we gather up the init functions of the ingredient prototypes, combine them into one init function, and\n // attach it to the mixed class prototype. The reason we do this is because we want the init functions to mix\n // similarly to constructors -- not methods, which simply override each other.\n const initFunctionName = settings.initFunction;\n if (initFunctionName !== null) {\n const initFunctions = prototypes\n .map(proto => proto[initFunctionName])\n .filter(func => typeof func === 'function');\n const combinedInitFunction = function (...args) {\n for (let initFunction of initFunctions)\n initFunction.apply(this, args);\n };\n const extraProto = { [initFunctionName]: combinedInitFunction };\n prototypes.push(extraProto);\n }\n function MixedClass(...args) {\n for (const constructor of constructors)\n // @ts-ignore: potentially abstract class\n copyProps(this, new constructor(...args));\n if (initFunctionName !== null && typeof this[initFunctionName] === 'function')\n this[initFunctionName].apply(this, args);\n }\n MixedClass.prototype = settings.prototypeStrategy === 'copy'\n ? hardMixProtos(prototypes, MixedClass)\n : softMixProtos(prototypes, MixedClass);\n Object.setPrototypeOf(MixedClass, settings.staticsStrategy === 'copy'\n ? hardMixProtos(constructors, null, ['prototype'])\n : proxyMix(constructors, Function.prototype));\n let DecoratedMixedClass = MixedClass;\n if (settings.decoratorInheritance !== 'none') {\n const classDecorators = settings.decoratorInheritance === 'deep'\n ? deepDecoratorSearch(...constructors)\n : directDecoratorSearch(...constructors);\n for (let decorator of (_a = classDecorators === null || classDecorators === void 0 ? void 0 : classDecorators.class) !== null && _a !== void 0 ? _a : []) {\n const result = decorator(DecoratedMixedClass);\n if (result) {\n DecoratedMixedClass = result;\n }\n }\n applyPropAndMethodDecorators((_b = classDecorators === null || classDecorators === void 0 ? void 0 : classDecorators.static) !== null && _b !== void 0 ? _b : {}, DecoratedMixedClass);\n applyPropAndMethodDecorators((_c = classDecorators === null || classDecorators === void 0 ? void 0 : classDecorators.instance) !== null && _c !== void 0 ? _c : {}, DecoratedMixedClass.prototype);\n }\n registerMixins(DecoratedMixedClass, constructors);\n return DecoratedMixedClass;\n}\nconst applyPropAndMethodDecorators = (propAndMethodDecorators, target) => {\n const propDecorators = propAndMethodDecorators.property;\n const methodDecorators = propAndMethodDecorators.method;\n if (propDecorators)\n for (let key in propDecorators)\n for (let decorator of propDecorators[key])\n decorator(target, key);\n if (methodDecorators)\n for (let key in methodDecorators)\n for (let decorator of methodDecorators[key])\n decorator(target, key, Object.getOwnPropertyDescriptor(target, key));\n};\n/**\n * A decorator version of the `Mixin` function. You'll want to use this instead of `Mixin` for mixing generic classes.\n */\nconst mix = (...ingredients) => decoratedClass => {\n // @ts-ignore\n const mixedClass = Mixin(...ingredients.concat([decoratedClass]));\n Object.defineProperty(mixedClass, 'name', {\n value: decoratedClass.name,\n writable: false,\n });\n return mixedClass;\n};\n\nexport { Mixin, decorate, hasMixin, mix, settings };\n","export enum GeometryType {\r\n Point = 'Point',\r\n LineString = 'LineString',\r\n LinearRing = 'LinearRing',\r\n Polygon = 'Polygon',\r\n MultiPoint = 'MultiPoint',\r\n MultiLineString = 'MultiLineString',\r\n MultiPolygon = 'MultiPolygon',\r\n GeometryCollection = 'GeometryCollection',\r\n Circle = 'Circle'\r\n}\r\n\r\nexport enum TransactionType {\r\n Insert = 'insert',\r\n Delete = 'delete',\r\n Update = 'update'\r\n}\r\n","import Map from 'ol/Map.js';\r\nimport { FeatureLike } from 'ol/Feature.js';\r\n\r\nimport WfsLayer from '../WfsLayer';\r\nimport WmsLayer from '../WmsLayer';\r\nimport { IWfstLayersList } from '../@types';\r\n\r\nlet map: Map;\r\nlet layerToInsertElements: WfsLayer | WmsLayer = null;\r\nlet mode = null;\r\n\r\nexport enum Modes {\r\n Edit = 'EDIT',\r\n Draw = 'DRAW',\r\n Query = 'QUERY'\r\n}\r\n\r\nexport enum SelectionMode {\r\n Single = 'SINGLE',\r\n Box = 'BOX',\r\n Freehand = 'FREEHAND'\r\n}\r\n\r\nlet selectionMode: SelectionMode = SelectionMode.Single;\r\n\r\nexport function activateMode(m: Modes = null) {\r\n mode = m;\r\n}\r\n\r\nexport function getMode() {\r\n return mode;\r\n}\r\n\r\nexport function setSelectionMode(m: SelectionMode) {\r\n selectionMode = m;\r\n}\r\n\r\nexport function getSelectionMode(): SelectionMode {\r\n return selectionMode;\r\n}\r\n\r\nconst editedFeatures: Set<string> = new Set();\r\nconst mapLayers: IWfstLayersList = {};\r\n\r\nexport function setMap(m: Map) {\r\n map = m;\r\n}\r\n\r\nexport function getMap(): Map {\r\n return map;\r\n}\r\n\r\nexport function setActiveLayerToInsertEls(layer: WmsLayer | WfsLayer) {\r\n layerToInsertElements = layer;\r\n}\r\n\r\nexport function getActiveLayerToInsertEls(): WmsLayer | WfsLayer {\r\n return layerToInsertElements;\r\n}\r\n\r\nexport function setMapLayers(data) {\r\n Object.assign(mapLayers, data);\r\n}\r\n\r\nexport function getStoredMapLayers(): IWfstLayersList {\r\n return mapLayers;\r\n}\r\n\r\nexport function getStoredLayer(layerName: string): WfsLayer | WmsLayer {\r\n return getStoredMapLayers()[layerName];\r\n}\r\n\r\nexport function addFeatureToEditedList(feature: FeatureLike): void {\r\n editedFeatures.add(String(feature.getId()));\r\n}\r\n\r\nexport function removeFeatureFromEditList(feature: FeatureLike): void {\r\n editedFeatures.delete(String(feature.getId()));\r\n}\r\n\r\nexport function isFeatureEdited(feature: FeatureLike): boolean {\r\n return editedFeatures.has(String(feature.getId()));\r\n}\r\n","import Feature from 'ol/Feature.js';\r\nimport Geometry from 'ol/geom/Geometry.js';\r\nimport { TransactionResponse } from 'ol/format/WFS.js';\r\nimport Layer from 'ol/layer/Base.js';\r\n\r\nimport Geoserver from '../../Geoserver';\r\nimport { IGeoserverDescribeFeatureType } from '../../@types';\r\nimport { GeometryType, TransactionType } from '../../@enums';\r\nimport { I18N } from '../i18n';\r\nimport { getMap } from '../state';\r\nimport { showError } from '../errors';\r\nimport { parseError } from '../errors';\r\n\r\n/**\r\n * Base class from which all layer types are derived.\r\n */\r\nexport default class BaseLayer extends Layer {\r\n /**\r\n * Initialize the layer: request DescribeFeatureType and resolve when it\r\n * finishes (whether successful or not).\r\n *\r\n * @private\r\n * @returns Promise that resolves when the layer is initialized\r\n */\r\n async _init(): Promise<void> {\r\n const geoserver = this.getGeoserver() as Geoserver;\r\n\r\n if (geoserver.isLoaded()) {\r\n await this.getAndUpdateDescribeFeatureType();\r\n } else {\r\n await new Promise<void>((resolve) => {\r\n geoserver.once('change:capabilities', async () => {\r\n await this.getAndUpdateDescribeFeatureType();\r\n resolve();\r\n });\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * Request and store data layers obtained by DescribeFeatureType\r\n *\r\n * @public\r\n */\r\n async getAndUpdateDescribeFeatureType(): Promise<void> {\r\n const layerName = this.get(BaseLayerProperty.NAME);\r\n const layerLabel = this.get(BaseLayerProperty.LABEL);\r\n\r\n try {\r\n const geoserver = this.getGeoserver() as Geoserver;\r\n\r\n const params = new URLSearchParams({\r\n service: 'wfs',\r\n version: geoserver.getAdvanced().describeFeatureTypeVersion,\r\n request: 'DescribeFeatureType',\r\n typeName: layerName,\r\n outputFormat: 'application/json',\r\n exceptions: 'application/json'\r\n });\r\n\r\n const url_fetch = geoserver.getUrl() + '?' + params.toString();\r\n\r\n const response = await fetch(url_fetch, {\r\n headers: geoserver.getHeaders(),\r\n credentials: geoserver.getCredentials()\r\n });\r\n\r\n if (!response.ok) {\r\n throw new Error('');\r\n }\r\n\r\n const data: IGeoserverDescribeFeatureType = await response.json();\r\n\r\n if (!data) {\r\n throw new Error('');\r\n }\r\n\r\n if (data.exceptions) {\r\n throw new Error(parseError(data));\r\n }\r\n\r\n const targetNamespace = data.targetNamespace;\r\n const properties = data.featureTypes[0].properties;\r\n\r\n // Find the geometry field\r\n const geom = properties.find((el) => el.type.indexOf('gml:') >= 0);\r\n\r\n data._parsed = {\r\n namespace: targetNamespace,\r\n properties: properties,\r\n geomType: geom.localType as GeometryType,\r\n geomField: geom.name\r\n };\r\n\r\n this.set(BaseLayerProperty.DESCRIBEFEATURETYPE, data);\r\n } catch (err) {\r\n console.error(err);\r\n showError(`${I18N.errors.layer} \"${layerLabel}\"`, err, layerName);\r\n }\r\n }\r\n\r\n /**\r\n * @public\r\n * @returns\r\n */\r\n isVisibleByZoom(): boolean {\r\n return getMap().getView().getZoom() > this.getMinZoom();\r\n }\r\n\r\n /**\r\n *\r\n * @param mode\r\n * @param features\r\n * @public\r\n */\r\n async transactFeatures(\r\n mode: TransactionType,\r\n features: Array<Feature<Geometry>> | Feature<Geometry>\r\n ): Promise<TransactionResponse | false> {\r\n const geoserver = this.getGeoserver() as Geoserver;\r\n return geoserver.transact(\r\n mode,\r\n features,\r\n this.get(BaseLayerProperty.NAME)\r\n );\r\n }\r\n\r\n async insertFeatures(\r\n features: Array<Feature<Geometry>> | Feature<Geometry>\r\n ): Promise<TransactionResponse | false> {\r\n return this.transactFeatures(TransactionType.Insert, features);\r\n }\r\n\r\n /**\r\n * @public\r\n * @param featureIds\r\n * @returns\r\n */\r\n async maybeLockFeature(\r\n featureIds: string | number | Array<string | number>\r\n ): Promise<string> {\r\n const geoserver = this.getGeoserver() as Geoserver;\r\n\r\n if (geoserver.getUseLockFeature() && geoserver.hasLockFeature()) {\r\n return await geoserver.lockFeature(\r\n featureIds,\r\n this.get(BaseLayerProperty.NAME)\r\n );\r\n }\r\n return null;\r\n }\r\n\r\n /**\r\n *\r\n * @returns\r\n * @public\r\n */\r\n getGeoserver(): Geoserver {\r\n return this.get(BaseLayerProperty.GEOSERVER);\r\n }\r\n\r\n /**\r\n *\r\n * @returns\r\n * @public\r\n */\r\n getDescribeFeatureType(): IGeoserverDescribeFeatureType {\r\n return this.get(BaseLayerProperty.DESCRIBEFEATURETYPE);\r\n }\r\n}\r\n\r\nexport enum BaseLayerProperty {\r\n NAME = 'name',\r\n LABEL = 'label',\r\n DESCRIBEFEATURETYPE = 'describeFeatureType',\r\n ISVISIBLE = 'isVisible',\r\n GEOSERVER = 'geoserver'\r\n}\r\n\r\nexport type BaseLayerEventTypes =\r\n | 'layerRendered'\r\n | `change:${BaseLayerProperty.DESCRIBEFEATURETYPE}`\r\n | `change:${BaseLayerProperty.ISVISIBLE}`;\r\n","import Feature from 'ol/Feature.js';\r\nimport GeoJSON from 'ol/format/GeoJSON.js';\r\nimport Geometry from 'ol/geom/Geometry.js';\r\nimport VectorSource, { Options as VSOptions } from 'ol/source/Vector.js';\r\nimport { transformExtent } from 'ol/proj.js';\r\nimport { bbox } from 'ol/loadingstrategy.js';\r\n\r\nimport { WfsGeoserverVendor } from '../../@types';\r\nimport { parseError, showError } from '../errors';\r\nimport { I18N } from '../i18n';\r\nimport { GeoServerAdvanced } from '../../Geoserver';\r\n\r\n/**\r\n * Layer source to retrieve WFS features from geoservers\r\n * https://docs.geoserver.org/stable/en/user/services/wfs/reference.html\r\n *\r\n * @extends {ol/source/Vector~VectorSource}\r\n * @param options\r\n */\r\nexport default class WfsSource extends VectorSource {\r\n public urlParams = new URLSearchParams({\r\n SERVICE: 'wfs',\r\n REQUEST: 'GetFeature',\r\n OUTPUTFORMAT: 'application/json',\r\n EXCEPTIONS: 'application/json'\r\n });\r\n\r\n constructor(options: WfsSourceOptions) {\r\n super({\r\n ...options,\r\n format: new GeoJSON(),\r\n loader: (extent, resolution, projection, success, failure) => {\r\n void (async () => {\r\n try {\r\n // If bbox, add extent to the request\r\n if (options.strategy == bbox) {\r\n const extentGeoServer = transformExtent(\r\n extent,\r\n projection.getCode(),\r\n options.geoServerAdvanced.projection\r\n );\r\n // https://docs.geoserver.org/stable/en/user/services/wfs/reference.html\r\n // request features using a bounding box with CRS maybe different from featureTypes native CRS\r\n this.urlParams.set(\r\n 'bbox',\r\n extentGeoServer.toString() +\r\n `,${options.geoServerAdvanced.projection}`\r\n );\r\n }\r\n\r\n const url_fetch =\r\n options.geoserverUrl +\r\n '?' +\r\n this.urlParams.toString();\r\n\r\n const response = await fetch(url_fetch, {\r\n headers: options.headers,\r\n credentials: options.credentials\r\n });\r\n\r\n if (!response.ok) {\r\n throw new Error('');\r\n }\r\n\r\n const data = await response.json();\r\n\r\n if (data.exceptions) {\r\n throw new Error(parseError(data));\r\n }\r\n\r\n const features = this.getFormat().readFeatures(data, {\r\n featureProjection: projection.getCode(),\r\n dataProjection: options.geoServerAdvanced.projection\r\n });\r\n\r\n features.forEach((feature: Feature<Geometry>) => {\r\n feature.set(\r\n '_layerName_',\r\n options.name,\r\n /* silent = */ true\r\n );\r\n });\r\n\r\n this.addFeatures(features as Feature<Geometry>[]);\r\n\r\n success(features as Feature<Geometry>[]);\r\n } catch (err) {\r\n this.removeLoadedExtent(extent);\r\n\r\n showError(I18N.errors.geoserver, err, options.name);\r\n\r\n failure();\r\n }\r\n })();\r\n }\r\n });\r\n\r\n this.urlParams.set(\r\n 'version',\r\n options.geoServerAdvanced.getFeatureVersion\r\n );\r\n\r\n this.urlParams.set('typename', options.name);\r\n\r\n this.urlParams.set(\r\n 'srsName',\r\n options.geoServerAdvanced.projection.toString()\r\n );\r\n }\r\n}\r\n\r\n/**\r\n * **_[interface]_** - Parameters to create a WfsSource\r\n *\r\n * @public\r\n */\r\nexport interface WfsSourceOptions extends VSOptions<Feature> {\r\n /**\r\n * Layer name in the GeoServer\r\n */\r\n name: string;\r\n\r\n /**\r\n * Url for OWS services. This endpoint will recive the WFS, WFST and WMS requests\r\n */\r\n geoserverUrl: string;\r\n\r\n /**\r\n * Advanced options for geoserver requests\r\n */\r\n geoServerAdvanced?: GeoServerAdvanced;\r\n\r\n /**\r\n *\r\n */\r\n geoserverVendor?: WfsGeoserverVendor;\r\n\r\n /**\r\n * Url headers for GeoServer requests. You can use it to add Authorization credentials\r\n * https://developer.mozilla.org/en-US/docs/Web/API/Request/headers\r\n */\r\n headers?: HeadersInit;\r\n\r\n /**\r\n * Credentials for fetch requests\r\n * https://developer.mozilla.org/en-US/docs/Web/API/Request/credentials\r\n */\r\n credentials?: RequestCredentials;\r\n}\r\n","import VectorLayer from 'ol/layer/Vector.js';\r\nimport BaseEvent from 'ol/events/Event.js';\r\nimport { CombinedOnSignature, EventTypes, OnSignature } from 'ol/Observable.js';\r\nimport { EventsKey } from 'ol/events.js';\r\nimport { LayerRenderEventTypes } from 'ol/render/EventType.js';\r\nimport { BaseLayerObjectEventTypes } from 'ol/layer/Base.js';\r\nimport { ObjectEvent } from 'ol/Object.js';\r\nimport RenderEvent from 'ol/render/Event.js';\r\n\r\nimport { Mixin } from 'ts-mixer';\r\n\r\nimport BaseLayer, { BaseLayerEventTypes } from './modules/base/BaseLayer';\r\nimport WfsSource from './modules/base/WfsSource';\r\nimport { LayerOptions } from './ol-wfst';\r\nimport { showLoading } from './modules/loading';\r\nimport { WfsGeoserverVendor } from './@types';\r\n\r\n/**\r\n * Layer to retrieve WFS features from geoservers\r\n * https://docs.geoserver.org/stable/en/user/services/wfs/reference.html\r\n *\r\n * @fires layerRendered\r\n * @extends {ol/layer/Vector~VectorLayer}\r\n * @param options\r\n */\r\nexport default class WfsLayer extends Mixin(BaseLayer, VectorLayer<WfsSource>) {\r\n private _loadingCount = 0;\r\n private _loadedCount = 0;\r\n\r\n public beforeTransactFeature: LayerOptions['beforeTransactFeature'];\r\n public beforeShowFieldsModal: LayerOptions['beforeShowFieldsModal'];\r\n\r\n declare on: OnSignature<EventTypes, BaseEvent, EventsKey> &\r\n OnSignature<\r\n | BaseLayerEventTypes\r\n | BaseLayerObjectEventTypes\r\n | 'change:source'\r\n | 'sourceready',\r\n ObjectEvent,\r\n EventsKey\r\n > &\r\n OnSignature<LayerRenderEventTypes, RenderEvent, EventsKey> &\r\n CombinedOnSignature<\r\n | EventTypes\r\n | BaseLayerEventTypes\r\n | BaseLayerObjectEventTypes\r\n | 'change:source'\r\n | 'sourceready'\r\n | LayerRenderEventTypes,\r\n EventsKey\r\n >;\r\n\r\n declare once: OnSignature<EventTypes, BaseEvent, EventsKey> &\r\n OnSignature<\r\n | BaseLayerEventTypes\r\n | BaseLayerObjectEventTypes\r\n | 'change:source'\r\n | 'sourceready',\r\n ObjectEvent,\r\n EventsKey\r\n > &\r\n OnSignature<LayerRenderEventTypes, RenderEvent, EventsKey> &\r\n CombinedOnSignature<\r\n | EventTypes\r\n | BaseLayerEventTypes\r\n | BaseLayerObjectEventTypes\r\n | 'change:source'\r\n | 'sourceready'\r\n | LayerRenderEventTypes,\r\n EventsKey\r\n >;\r\n\r\n declare un: OnSignature<EventTypes, BaseEvent, void> &\r\n OnSignature<\r\n | BaseLayerEventTypes\r\n | BaseLayerObjectEventTypes\r\n | 'change:source'\r\n | 'sourceready',\r\n ObjectEvent,\r\n void\r\n > &\r\n OnSignature<LayerRenderEventTypes, RenderEvent, void> &\r\n CombinedOnSignature<\r\n | EventTypes\r\n | BaseLayerEventTypes\r\n | BaseLayerObjectEventTypes\r\n | 'change:source'\r\n | 'sourceready'\r\n | LayerRenderEventTypes,\r\n void\r\n >;\r\n\r\n constructor(options: LayerOptions) {\r\n super({\r\n name: options.name,\r\n label: options.label || options.name,\r\n minZoom: options.minZoom,\r\n ...options\r\n });\r\n\r\n if (options.beforeTransactFeature) {\r\n this.beforeTransactFeature = options.beforeTransactFeature;\r\n }\r\n\r\n const geoserver = options.geoserver;\r\n\r\n const source = new WfsSource({\r\n name: options.name,\r\n headers: geoserver.getHeaders(),\r\n credentials: geoserver.getCredentials(),\r\n geoserverUrl: geoserver.getUrl(),\r\n geoServerAdvanced: geoserver.getAdvanced(),\r\n ...(options.strategy && { strategy: options.strategy }),\r\n geoserverVendor: options.geoserverVendor\r\n });\r\n\r\n this._loadingCount = 0;\r\n this._loadedCount = 0;\r\n\r\n source.on('featuresloadstart', () => {\r\n this._loadingCount++;\r\n if (this._loadingCount === 1 && this.isVisibleByZoom()) {\r\n showLoading();\r\n }\r\n });\r\n\r\n source.on(['featuresloadend', 'featuresloaderror'], () => {\r\n this._loadedCount++;\r\n if (this._loadingCount === this._loadedCount) {\r\n this._loadingCount = 0;\r\n this._loadedCount = 0;\r\n setTimeout(() => {\r\n this.dispatchEvent('layerRendered');\r\n }, 300);\r\n }\r\n });\r\n\r\n this.setSource(source);\r\n\r\n const geoserverOptions = options.geoserverVendor as WfsGeoserverVendor;\r\n\r\n Object.keys(geoserverOptions).forEach((param) => {\r\n source.urlParams.set(param, geoserverOptions[param]);\r\n });\r\n }\r\n\r\n /**\r\n * @public\r\n */\r\n refresh() {\r\n const source = this.getSource();\r\n // Refrescamos el wms\r\n source.refresh();\r\n }\r\n\r\n /**\r\n * Use this to update Geoserver Wms Vendors (https://docs.geoserver.org/latest/en/user/services/wms/vendor.html)\r\n * and other arguements (https://docs.geoserver.org/stable/en/user/services/wms/reference.html#getmap)\r\n * in all the getMap requests.\r\n *\r\n * Example: you can use this to change the style of the WMS, add a custom sld, set a cql_filter, etc.\r\n *\r\n * @public\r\n * @param paramName\r\n * @param value Use `undefined` or `null` to remove the param\r\n * @param refresh\r\n */\r\n setCustomParam(\r\n paramName: string,\r\n value: string = null,\r\n refresh = true\r\n ): URLSearchParams {\r\n const source = this.getSource();\r\n\r\n if (value === undefined || value === null) {\r\n source.urlParams.delete(paramName);\r\n } else {\r\n source.urlParams.set(paramName, value);\r\n }\r\n\r\n if (refresh) {\r\n this.refresh();\r\n }\r\n\r\n return source.urlParams;\r\n }\r\n}\r\n","/**\n * @module ol/TileState\n */\n\n/**\n * @enum {number}\n */\nexport default {\n IDLE: 0,\n LOADING: 1,\n LOADED: 2,\n /**\n * Indicates that tile loading failed\n * @type {number}\n */\n ERROR: 3,\n EMPTY: 4,\n};\n","import TileWMS, { Options as TSOptions } from 'ol/source/TileWMS.js';\r\nimport TileState from 'ol/TileState.js';\r\nimport ImageTile from 'ol/ImageTile.js';\r\n\r\nimport { WmsGeoserverVendor } from '../../@types';\r\nimport { parseError, showError } from '../errors';\r\nimport { I18N } from '../i18n';\r\nimport { GeoServerAdvanced } from '../../Geoserver';\r\n\r\n/**\r\n * Layer source to retrieve WMS information from geoservers\r\n * https://docs.geoserver.org/stable/en/user/services/wms/reference.html\r\n *\r\n * @extends {ol/source/TieWMS~TileWMS}\r\n * @param options\r\n */\r\nexport default class WmsSource extends TileWMS {\r\n constructor(options: WmsSourceOptions) {\r\n super({\r\n url: options.geoserverUrl,\r\n serverType: 'geoserver',\r\n params: {\r\n SERVICE: 'wms',\r\n TILED: true,\r\n LAYERS: options.name,\r\n EXCEPTIONS: 'application/json',\r\n ...(options.geoserverVendor && options.geoserverVendor)\r\n },\r\n tileLoadFunction: async (tile, src) => {\r\n const blobToJson = (blob: Blob): any => {\r\n return new Promise((resolve) => {\r\n const reader = new FileReader();\r\n reader.onloadend = () =>\r\n resolve(JSON.parse(reader.result as string));\r\n reader.readAsText(blob);\r\n });\r\n };\r\n\r\n try {\r\n const response = await fetch(src, {\r\n headers: options.headers,\r\n credentials: options.credentials\r\n });\r\n\r\n if (!response.ok) {\r\n throw new Error('');\r\n }\r\n\r\n let data = await response.blob();\r\n\r\n // Check if the response has an error\r\n if (data.type == 'application/json') {\r\n const parsedError = await blobToJson(data);\r\n throw new Error(parseError(parsedError));\r\n }\r\n\r\n ((tile as ImageTile).getImage() as HTMLImageElement).src =\r\n URL.createObjectURL(data);\r\n\r\n tile.setState(TileState.LOADED);\r\n } catch (err) {\r\n showError(I18N.errors.geoserver, err, options.name);\r\n tile.setState(TileState.ERROR);\r\n }\r\n },\r\n ...options\r\n });\r\n }\r\n}\r\n\r\n/**\r\n * **_[interface]_** - Parameters to create a WmsSource\r\n *\r\n * @public\r\n */\r\nexport interface WmsSourceOptions extends Omit<TSOptions, 'params'> {\r\n /**\r\n * Layer name in the GeoServer\r\n */\r\n name: string;\r\n\r\n /**\r\n * Url for OWS services. This endpoint will recive the WFS, WFST and WMS requests\r\n */\r\n geoserverUrl: string;\r\n\r\n /**\r\n * Advanced options for geoserver requests\r\n */\r\n geoServerAdvanced?: GeoServerAdvanced;\r\n\r\n /**\r\n *\r\n */\r\n geoserverVendor?: WmsGeoserverVendor;\r\n\r\n /**\r\n * Url headers for GeoServer requests. You can use it to add Authorization credentials\r\n * https://developer.mozilla.org/en-US/docs/Web/API/Request/headers\r\n */\r\n headers?: HeadersInit;\r\n\r\n /**\r\n * Credentials for fetch requests\r\n * https://developer.mozilla.org/en-US/docs/Web/API/Request/credentials\r\n */\r\n credentials?: RequestCredentials;\r\n}\r\n","import MapBrowserEvent from 'ol/MapBrowserEvent.js';\r\nimport TileLayer from 'ol/layer/Tile.js';\r\nimport Geometry from 'ol/geom/Geometry.js';\r\nimport Polygon from 'ol/geom/Polygon.js';\r\nimport Feature from 'ol/Feature.js';\r\nimport GeoJSON from 'ol/format/GeoJSON.js';\r\nimport BaseEvent from 'ol/events/Event.js';\r\nimport { CombinedOnSignature, EventTypes, OnSignature } from 'ol/Observable.js';\r\nimport { EventsKey } from 'ol/events.js';\r\nimport { LayerRenderEventTypes } from 'ol/render/EventType.js';\r\nimport { BaseLayerObjectEventTypes } from 'ol/layer/Base.js';\r\nimport { ObjectEvent } from 'ol/Object.js';\r\nimport RenderEvent from 'ol/render/Event.js';\r\n\r\nimport { Mixin } from 'ts-mixer';\r\n\r\nimport WmsSource from './modules/base/WmsSource';\r\nimport BaseLayer, { BaseLayerEventTypes } from './modules/base/BaseLayer';\r\nimport { LayerOptions } from './ol-wfst';\r\nimport { showLoading } from './modules/loading';\r\nimport { showError } from './modules/errors';\r\nimport { I18N } from './modules/i18n';\r\nimport { getMap } from './modules/state';\r\nimport { WmsGeoserverVendor } from './@types';\r\n\r\n/**\r\n * Layer to retrieve WMS information from geoservers\r\n * https://docs.geoserver.org/stable/en/user/services/wms/reference.html\r\n *\r\n * @fires layerRendered\r\n * @extends {ol/layer/Tile~TileLayer}\r\n * @param options\r\n */\r\nexport default class WmsLayer extends Mixin(BaseLayer, TileLayer<WmsSource>) {\r\n private _loadingCount = 0;\r\n private _loadedCount = 0;\r\n\r\n public beforeTransactFeature: LayerOptions['beforeTransactFeature'];\r\n public beforeShowFieldsModal: LayerOptions['beforeShowFieldsModal'];\r\n\r\n // Formats\r\n private _formatGeoJSON: GeoJSON;\r\n\r\n declare on: OnSignature<EventTypes, BaseEvent, EventsKey> &\r\n OnSignature<\r\n | BaseLayerEventTypes\r\n | BaseLayerObjectEventTypes\r\n | 'sourceready'\r\n | 'change:source'\r\n | 'change:preload'\r\n | 'change:useInterimTilesOnError',\r\n ObjectEvent,\r\n EventsKey\r\n > &\r\n OnSignature<LayerRenderEventTypes, RenderEvent, EventsKey> &\r\n CombinedOnSignature<\r\n | EventTypes\r\n | BaseLayerEventTypes\r\n | BaseLayerObjectEventTypes\r\n | 'sourceready'\r\n | 'change:source'\r\n | 'change:preload'\r\n | 'change:useInterimTilesOnError'\r\n | LayerRenderEventTypes,\r\n EventsKey\r\n >;\r\n declare once: OnSignature<EventTypes, BaseEvent, EventsKey> &\r\n OnSignature<\r\n | BaseLayerEventTypes\r\n | BaseLayerObjectEventTypes\r\n | 'sourceready'\r\n | 'change:source'\r\n | 'change:preload'\r\n | 'change:useInterimTilesOnError',\r\n ObjectEvent,\r\n EventsKey\r\n > &\r\n OnSignature<LayerRenderEventTypes, RenderEvent, EventsKey> &\r\n CombinedOnSignature<\r\n | EventTypes\r\n | BaseLayerEventTypes\r\n | BaseLayerObjectEventTypes\r\n | 'sourceready'\r\n | 'change:source'\r\n | 'change:preload'\r\n | 'change:useInterimTilesOnError'\r\n | LayerRenderEventTypes,\r\n EventsKey\r\n >;\r\n\r\n declare un: OnSignature<EventTypes, BaseEvent, void> &\r\n OnSignature<\r\n | BaseLayerEventTypes\r\n | BaseLayerObjectEventTypes\r\n | 'sourceready'\r\n | 'change:source'\r\n | 'change:preload'\r\n | 'change:useInterimTilesOnError',\r\n ObjectEvent,\r\n void\r\n > &\r\n OnSignature<LayerRenderEventTypes, RenderEvent, void> &\r\n CombinedOnSignature<\r\n | EventTypes\r\n | BaseLayerEventTypes\r\n | BaseLayerObjectEventTypes\r\n | 'sourceready'\r\n | 'change:source'\r\n | 'change:preload'\r\n | 'change:useInterimTilesOnError'\r\n | LayerRenderEventTypes,\r\n void\r\n >;\r\n\r\n constructor(options: LayerOptions) {\r\n super({\r\n name: options.name,\r\n label: options.label || options.name,\r\n minZoom: options.minZoom,\r\n ...options\r\n });\r\n\r\n if (options.beforeTransactFeature) {\r\n this.beforeTransactFeature = options.beforeTransactFeature;\r\n }\r\n\r\n if (options.beforeShowFieldsModal) {\r\n this.beforeShowFieldsModal = options.beforeShowFieldsModal;\r\n }\r\n\r\n this._formatGeoJSON = new GeoJSON();\r\n\r\n const geoserver = options.geoserver;\r\n\r\n const source = new WmsSource({\r\n name: options.name,\r\n headers: geoserver.getHeaders(),\r\n credentials: geoserver.getCredentials(),\r\n geoserverUrl: geoserver.getUrl(),\r\n geoServerAdvanced: geoserver.getAdvanced(),\r\n geoserverVendor: options.geoserverVendor as WmsGeoserverVendor\r\n });\r\n\r\n this._loadingCount = 0;\r\n this._loadedCount = 0;\r\n\r\n source.on('tileloadstart', () => {\r\n this._loadingCount++;\r\n if (this._loadingCount === 1 && this.isVisibleByZoom()) {\r\n showLoading();\r\n }\r\n });\r\n\r\n source.on(['tileloadend', 'tileloaderror'], () => {\r\n this._loadedCount++;\r\n if (this._loadingCount === this._loadedCount) {\r\n this._loadingCount = 0;\r\n this._loadedCount = 0;\r\n setTimeout(() => {\r\n this.dispatchEvent('layerRendered');\r\n }, 300);\r\n }\r\n });\r\n\r\n this.setSource(source);\r\n }\r\n\r\n /**\r\n * Get the features on the click area\r\n * @param evt\r\n * @returns\r\n * @private\r\n */\r\n async _getFeaturesByClickEvent(\r\n evt: MapBrowserEvent<PointerEvent>\r\n ): Promise<Feature<Geometry>[]> {\r\n const coordinate = evt.coordinate;\r\n\r\n const view = getMap().getView();\r\n\r\n // Si la vista es lejana, disminumos el buffer\r\n // Si es cercana, lo aumentamos, por ejemplo, para podeer clickear los vectores\r\n // y mejorar la sensibilidad en IOS\r\n const buffer = view.getZoom() > 10 ? 10 : 5;\r\n\r\n const source = this.getSource();\r\n\r\n // Fallback to support a bad name\r\n // https://openlayers.org/en/v5.3.0/apidoc/module-ol_source_ImageWMS-ImageWMS.html#getGetFeatureInfoUrl\r\n const fallbackOl5 =\r\n 'getFeatureInfoUrl' in source\r\n ? 'getFeatureInfoUrl'\r\n : 'getGetFeatureInfoUrl';\r\n\r\n const url = source[fallbackOl5](\r\n coordinate,\r\n view.getResolution(),\r\n view.getProjection().getCode(),\r\n {\r\n INFO_FORMAT: 'application/json',\r\n BUFFER: buffer,\r\n FEATURE_COUNT: 1,\r\n EXCEPTIONS: 'application/json'\r\n }\r\n );\r\n\r\n return this._requestFeatures(url);\r\n }\r\n\r\n /**\r\n * Request the WFS features that intersect the given geometry, selecting\r\n * them with a WFS GetFeature + CQL INTERSECTS filter. Used to select\r\n * features from a WMS layer with a box or a freehand lasso.\r\n *\r\n * @param geometry Geometry in the map view projection\r\n * @returns\r\n * @private\r\n */\r\n async _getFeaturesInGeometry(\r\n geometry: Geometry\r\n ): Promise<Feature<Geometry>[]> {\r\n // Make sure the DescribeFeatureType is loaded to get the geometry\r\n // field, waiting for it if the layer is still initializing\r\n if (!this.getDescribeFeatureType()) {\r\n await this.getAndUpdateDescribeFeatureType();\r\n }\r\n\r\n const geomField = this.getDescribeFeatureType()?._parsed?.geomField;\r\n\r\n if (!geomField) {\r\n showError(`${I18N.errors.layer} \"${this.get('name')}\"`);\r\n return [];\r\n }\r\n\r\n const viewProj = getMap().getView().getProjection().getCode();\r\n const nativeSrs = this._getNativeSrs();\r\n\r\n // Work on a copy transformed to the layer native projection so the\r\n // server evaluates the INTERSECTS filter against the proper SRID\r\n const polygon = geometry.clone() as Polygon;\r\n if (nativeSrs !== viewProj) {\r\n try {\r\n polygon.transform(viewProj, nativeSrs);\r\n } catch (err) {\r\n console.error(err);\r\n }\r\n }\r\n\r\n const ring = polygon.getCoordinates()[0] || [];\r\n const ringWkt = ring.map(([x, y]) => `${x} ${y}`).join(', ');\r\n\r\n // Force the filter geometry CRS with the EWKT SRID prefix so the\r\n // server evaluates the INTERSECTS against the layer projection\r\n // instead of its native storage SRS\r\n const sridMatch =\r\n nativeSrs.match(/(?:EPSG\\s*::?\\s*|EPSG\\/0\\/)(\\d+)/i) ??\r\n nativeSrs.match(/(\\d+)$/);\r\n\r\n const cql = sridMatch\r\n ? `INTERSECTS(${geomField}, SRID=${sridMatch[1]};POLYGON((${ringWkt})))`\r\n : `INTERSECTS(${geomField}, POLYGON((${ringWkt})))`;\r\n\r\n const queryParams = new URLSearchParams({\r\n SERVICE: 'wfs',\r\n VERSION: '2.0.0',\r\n REQUEST: 'GetFeature',\r\n TYPENAME: this.get('name'),\r\n OUTPUTFORMAT: 'application/json',\r\n SRSNAME: viewProj,\r\n CQL_FILTER: cql\r\n });\r\n\r\n const url =\r\n this.getSource().getUrls()[0] + '?' + queryParams.toString();\r\n\r\n // The server returns the features in the map view projection (same as\r\n // the full resolution request), so no further transformation is needed\r\n return this._requestFeatures(url);\r\n }\r\n\r\n /**\r\n * Resolve the layer native SRS so spatial filters are evaluated in the\r\n * correct projection. It reads the DefaultCRS from the WFS capabilities,\r\n * falling back to the geoserver advanced projection option and finally to\r\n * the map view projection.\r\n *\r\n * @returns\r\n * @private\r\n */\r\n private _getNativeSrs(): string {\r\n const geoserver = this.getGeoserver();\r\n\r\n const viewProj = getMap().getView().getProjection().getCode();\r\n\r\n const layerName = String(this.get('name') || '');\r\n const layerLocalName = layerName.split(':').pop();\r\n\r\n const featureTypeList =\r\n geoserver.getParsedCapabilities()?.FeatureTypeList;\r\n\r\n const featureType = Array.isArray(featureTypeList)\r\n ? featureTypeList.find((ft: any) => {\r\n const featureTypeName = String(ft?.Name || '');\r\n return (\r\n featureTypeName === layerName ||\r\n featureTypeName === layerLocalName ||\r\n featureTypeName.split(':').pop() === layerLocalName\r\n );\r\n })\r\n : undefined;\r\n\r\n const defaultCrs = featureType?.DefaultCRS\r\n ? String(featureType.DefaultCRS)\r\n : '';\r\n\r\n const epsgMatch = defaultCrs.match(/(?:EPSG\\s*::?\\s*|EPSG\\/0\\/)(\\d+)/i);\r\n\r\n if (epsgMatch) {\r\n return `EPSG:${epsgMatch[1]}`;\r\n }\r\n\r\n const advanced = geoserver.getAdvanced().projection;\r\n if (advanced) {\r\n return String(advanced);\r\n }\r\n\r\n return viewProj;\r\n }\r\n\r\n /**\r\n * Fetch and parse the features from a request url, replacing the\r\n * low resolution geometries (GetFeatureInfo) with the full resolution\r\n * ones requested by FEATUREID when possible.\r\n *\r\n * @param url\r\n * @returns\r\n * @private\r\n */\r\n private async _requestFeatures(\r\n url: string\r\n ): Promise<Feature<Geometry>[] | undefined> {\r\n const geoserver = this.getGeoserver();\r\n\r\n try {\r\n const response = await fetch(url, {\r\n headers: geoserver.getHeaders(),\r\n credentials: geoserver.getCredentials()\r\n });\r\n\r\n if (!response.ok) {\r\n throw new Error(\r\n `${I18N.errors.getFeatures} ${response.status}`\r\n );\r\n }\r\n\r\n const data = await response.json();\r\n let features = this._parseFeaturesFromResponse(data);\r\n\r\n const featuresId = features.map((f) => f.getId());\r\n\r\n if (!featuresId.length) {\r\n return [];\r\n }\r\n\r\n const fullResList = await this._getFullResGeometryById(featuresId);\r\n\r\n if (fullResList) {\r\n features = fullResList;\r\n }\r\n\r\n return features;\r\n } catch (err) {\r\n showError(err.message, err);\r\n }\r\n }\r\n\r\n private _parseFeaturesFromResponse(data: string): Feature<Geometry>[] {\r\n return this._formatGeoJSON.readFeatures(data);\r\n }\r\n\r\n /**\r\n * Return the full accuracy geometries to replace the features from GetFeatureInfo\r\n * @param featuresId\r\n * @returns\r\n */\r\n private _getFullResGeometryById = async (\r\n featuresId: Array<string | number>\r\n ): Promise<Feature<Geometry>[] | false> => {\r\n const queryParams = new URLSearchParams({\r\n SERVICE: 'wfs',\r\n VERSION: '2.0.0',\r\n INFO_FORMAT: 'application/json',\r\n REQUEST: 'GetFeature',\r\n TYPENAME: this.get('name'),\r\n MAXFEATURES: String(featuresId.length),\r\n OUTPUTFORMAT: 'application/json',\r\n SRSNAME: getMap().getView().getProjection().getCode(),\r\n FEATUREID: featuresId.join(',')\r\n });\r\n\r\n const url =\r\n this.getSource().getUrls()[0] + '?' + queryParams.toString();\r\n\r\n try {\r\n const geoserver = this.getGeoserver();\r\n\r\n const response = await fetch(url, {\r\n headers: geoserver.getHeaders(),\r\n credentials: geoserver.getCredentials()\r\n });\r\n\r\n if (!response.ok) {\r\n throw new Error(\r\n `${I18N.errors.getFeatures} ${response.status}`\r\n );\r\n }\r\n const data = await response.json();\r\n\r\n const fullById: { [key: string]: Feature<Geometry> } = {};\r\n this._parseFeaturesFromResponse(data).forEach((feature) => {\r\n fullById[String(feature.getId())] = feature;\r\n });\r\n\r\n return featuresId.map((id) => fullById[String(id)]).filter(Boolean);\r\n } catch (err) {\r\n console.error(err);\r\n return false;\r\n }\r\n };\r\n\r\n /**\r\n * @public\r\n */\r\n refresh() {\r\n const source = this.getSource();\r\n\r\n // Refrescamos el wms\r\n source.refresh();\r\n\r\n // Force refresh the tiles\r\n const params = source.getParams();\r\n params.t = new Date().getMilliseconds();\r\n source.updateParams(params);\r\n }\r\n\r\n /**\r\n * Use this to update Geoserver Wfs Vendors (https://docs.geoserver.org/latest/en/user/services/wfs/vendor.html)\r\n * and other arguements (https://docs.geoserver.org/stable/en/user/services/wfs/reference.html)\r\n * in all the getFeature requests.\r\n *\r\n * Example: you can use this to set a cql_filter, limit the numbers of features, etc.\r\n *\r\n * @public\r\n * @param paramName\r\n * @param value\r\n * @param refresh\r\n */\r\n setCustomParam(\r\n paramName: string,\r\n value: string = null,\r\n refresh = true\r\n ): URLSearchParams {\r\n const source = this.getSource();\r\n\r\n source.updateParams({\r\n [paramName]: value\r\n });\r\n\r\n if (refresh) {\r\n this.refresh();\r\n }\r\n\r\n return source.getParams();\r\n }\r\n}\r\n","function createElement(\r\n tagName: string | ((props, children) => HTMLElement),\r\n props: { [key: string]: any }\r\n): HTMLElement | DocumentFragment {\r\n props = props || {};\r\n\r\n let children = props.children || [];\r\n children = Array.isArray(children) ? children : [children];\r\n\r\n delete props.children;\r\n\r\n if (typeof tagName === 'function') {\r\n return tagName(props, children);\r\n }\r\n\r\n const elem: HTMLElement | DocumentFragment =\r\n tagName === 'fragment'\r\n ? document.createDocumentFragment()\r\n : document.createElement(tagName);\r\n\r\n if (elem instanceof HTMLElement) {\r\n Object.entries(props).forEach(([name, value]) => {\r\n if (value != null) {\r\n // listener\r\n if (name.startsWith('on') && typeof value === 'function') {\r\n elem.addEventListener(\r\n name\r\n .slice(2)\r\n .toLowerCase() as keyof HTMLElementEventMap,\r\n value as EventListenerOrEventListenerObject\r\n );\r\n } else if (name === 'className') {\r\n elem.setAttribute('class', value.toString());\r\n } else if (name === 'htmlFor') {\r\n elem.setAttribute('for', value.toString());\r\n } else {\r\n elem.setAttribute(name, value.toString());\r\n }\r\n }\r\n });\r\n }\r\n\r\n for (const child of children) {\r\n if (!child) {\r\n continue;\r\n }\r\n if (Array.isArray(child)) {\r\n elem.append(...child);\r\n } else if (child instanceof Node) {\r\n elem.appendChild(child);\r\n } else {\r\n (elem as HTMLElement).innerHTML += child;\r\n }\r\n }\r\n return elem;\r\n}\r\n\r\nexport function jsx(type: any, props: any) {\r\n return createElement(type, props) as HTMLElement;\r\n}\r\n\r\nexport function jsxs(type: any, props: any) {\r\n return createElement(type, props) as HTMLElement;\r\n}\r\n\r\nexport function Fragment(type: any, children) {\r\n return createElement('fragment', { children }) as DocumentFragment;\r\n}\r\n","import Observable from 'ol/Observable.js';\r\n\r\nimport { Options, WfsLayer, WmsLayer } from '../ol-wfst';\r\n\r\nimport uploadSvg from '../assets/images/upload.svg';\r\nimport drawSvg from '../assets/images/draw.svg';\r\nimport selectSvg from '../assets/images/select.svg';\r\nimport selectBoxSvg from '../assets/images/selectBox.svg';\r\nimport selectFreehandSvg from '../assets/images/selectFreehand.svg';\r\nimport infoSvg from '../assets/images/info.svg';\r\nimport visibilityOnSvg from '../assets/images/visibilityOn.svg';\r\nimport visibilityOffSvg from '../assets/images/visibilityOff.svg';\r\n\r\nimport { GeometryType } from '../@enums';\r\nimport {\r\n getActiveLayerToInsertEls,\r\n getStoredMapLayers,\r\n setActiveLayerToInsertEls,\r\n SelectionMode\r\n} from './state';\r\nimport { I18N } from './i18n';\r\nimport Uploads from './Uploads';\r\nimport { BaseLayerProperty } from './base/BaseLayer';\r\n\r\n/**\r\n * Removes in the DOM the class of the tools\r\n * @private\r\n */\r\nexport const resetStateButtons = (): void => {\r\n const activeBtn = document.querySelector(\r\n '.ol-wfst--tools-control-btn.wfst--active'\r\n );\r\n if (activeBtn) {\r\n activeBtn.classList.remove('wfst--active');\r\n }\r\n};\r\n\r\nexport const activateModeButtons = () => {\r\n const btn = document.querySelector('.ol-wfst--tools-control-btn-edit');\r\n if (btn) {\r\n btn.classList.add('wfst--active');\r\n }\r\n deactivateQueryButton();\r\n};\r\n\r\nexport const activateQueryButton = () => {\r\n const btn = document.querySelector('.ol-wfst--tools-control-btn-query');\r\n if (btn) {\r\n btn.classList.add('wfst--active');\r\n }\r\n};\r\n\r\nexport const deactivateQueryButton = (): void => {\r\n const btn = document.querySelector('.ol-wfst--tools-control-btn-query');\r\n if (btn) {\r\n btn.classList.remove('wfst--active');\r\n }\r\n};\r\n\r\nexport const activateDrawButton = () => {\r\n const btn = document.querySelector('.ol-wfst--tools-control-btn-draw');\r\n if (btn) {\r\n btn.classList.add('wfst--active');\r\n }\r\n};\r\n\r\nexport const activateSelectModeButton = (mode: SelectionMode) => {\r\n const activeBtn = document.querySelector(\r\n '.ol-wfst--tools-control-btn-select.wfst--active, .ol-wfst--tools-control-btn-select-box.wfst--active, .ol-wfst--tools-control-btn-select-freehand.wfst--active'\r\n );\r\n if (activeBtn) {\r\n activeBtn.classList.remove('wfst--active');\r\n }\r\n\r\n deactivateQueryButton();\r\n\r\n const btnMap = {\r\n [SelectionMode.Single]: '.ol-wfst--tools-control-btn-select',\r\n [SelectionMode.Box]: '.ol-wfst--tools-control-btn-select-box',\r\n [SelectionMode.Freehand]: '.ol-wfst--tools-control-btn-select-freehand'\r\n };\r\n\r\n const btn = document.querySelector(btnMap[mode]);\r\n if (btn) {\r\n btn.classList.add('wfst--active');\r\n }\r\n};\r\n\r\nexport const deactivateSelectModeButton = (): void => {\r\n const activeBtn = document.querySelector(\r\n '.ol-wfst--tools-control-btn-select.wfst--active, .ol-wfst--tools-control-btn-select-box.wfst--active, .ol-wfst--tools-control-btn-select-freehand.wfst--active'\r\n );\r\n if (activeBtn) {\r\n activeBtn.classList.remove('wfst--active');\r\n }\r\n\r\n deactivateQueryButton();\r\n};\r\n\r\nexport default class LayersControl extends Observable {\r\n protected _uploads: Uploads;\r\n protected _uploadFormats: Options['uploadFormats'];\r\n\r\n constructor(uploads: Uploads, uploadFormats: Options['uploadFormats']) {\r\n super();\r\n\r\n this._uploads = uploads;\r\n this._uploadFormats = uploadFormats;\r\n }\r\n\r\n /**\r\n *\r\n * @param layer\r\n * @public\r\n */\r\n addLayerEl(layer: WfsLayer | WmsLayer): HTMLElement {\r\n const container = document.querySelector(\r\n '.wfst--tools-control--select-layers-list'\r\n );\r\n\r\n const layerName = layer.get(BaseLayerProperty.NAME) as string;\r\n const checked =\r\n layer === getActiveLayerToInsertEls() ? { checked: true } : {};\r\n\r\n const input = (\r\n <input\r\n value={layerName}\r\n id={`wfst--${layerName}`}\r\n type=\"radio\"\r\n className=\"ol-wfst--tools-control-input\"\r\n name=\"wfst--select-layer\"\r\n {...checked}\r\n onChange={(evt: Event) => this._layerChangeHandler(evt, layer)}\r\n />\r\n );\r\n\r\n const layerDom = (\r\n <div\r\n className={`wfst--layer-control \r\n ${layer.getVisible() ? 'ol-wfst--visible-on' : ''}\r\n ${\r\n layer === getActiveLayerToInsertEls()\r\n ? 'ol-wfst--selected-on'\r\n : ''\r\n }`}\r\n data-layer={layerName}\r\n >\r\n <label htmlFor={`wfst--${layerName}`}>\r\n <div className=\"ol-wfst--tools-control-visible\">\r\n <span\r\n className=\"ol-wfst--tools-control-visible-btn ol-wfst--visible-btn-on\"\r\n title={I18N.labels.toggleVisibility}\r\n onClick={(evt: MouseEvent) =>\r\n this._visibilityClickHandler(evt)\r\n }\r\n >\r\n {visibilityOnSvg()}\r\n </span>\r\n <span\r\n className=\"ol-wfst--tools-control-visible-btn ol-wfst--visible-btn-off\"\r\n title={I18N.labels.toggleVisibility}\r\n onClick={(evt: MouseEvent) =>\r\n this._visibilityClickHandler(evt)\r\n }\r\n >\r\n {visibilityOffSvg()}\r\n </span>\r\n </div>\r\n {input}\r\n <span\r\n title={`${\r\n layer instanceof WfsLayer ? 'WFS' : 'WMS'\r\n } - ${layer.getDescribeFeatureType()._parsed.geomType}`}\r\n >\r\n {layer.get(BaseLayerProperty.LABEL)}\r\n </span>\r\n </label>\r\n </div>\r\n );\r\n\r\n container.appendChild(layerDom);\r\n\r\n if (layer === getActiveLayerToInsertEls()) {\r\n input.dispatchEvent(new Event('change'));\r\n }\r\n\r\n return layerDom;\r\n }\r\n\r\n /**\r\n * Update geom Types availibles to select for this layer\r\n *\r\n * @param layerName\r\n * @param geomDrawTypeSelected\r\n * @private\r\n */\r\n private _changeStateSelect(\r\n layer: WmsLayer | WfsLayer,\r\n geomDrawTypeSelected: GeometryType = null\r\n ): GeometryType {\r\n /**\r\n * Set the geometry type in the select according to the geometry of\r\n * the layer in the geoserver and disable what does not correspond.\r\n *\r\n * @param value\r\n * @param options\r\n * @private\r\n */\r\n const setSelectState = (\r\n value: GeometryType,\r\n options: Array<string> | 'all'\r\n ): void => {\r\n Array.from(selectDraw.options).forEach(\r\n (option: HTMLOptionElement) => {\r\n option.selected = option.value === value ? true : false;\r\n option.disabled =\r\n options === 'all'\r\n ? false\r\n : options.includes(option.value)\r\n ? false\r\n : true;\r\n option.title = option.disabled\r\n ? I18N.labels.geomTypeNotSupported\r\n : '';\r\n }\r\n );\r\n };\r\n\r\n const selectDraw = document.querySelector(\r\n '.wfst--tools-control--select-draw'\r\n ) as HTMLSelectElement;\r\n\r\n let drawType: GeometryType;\r\n\r\n if (selectDraw) {\r\n const geomLayer = layer.getDescribeFeatureType()._parsed.geomType;\r\n\r\n if (geomDrawTypeSelected) {\r\n drawType = selectDraw.value as GeometryType;\r\n } else {\r\n if (geomLayer === GeometryType.GeometryCollection) {\r\n drawType = GeometryType.LineString; // Default drawing type for GeometryCollection\r\n setSelectState(drawType, 'all');\r\n } else if (geomLayer === GeometryType.LinearRing) {\r\n drawType = GeometryType.LineString; // Default drawing type for GeometryCollection\r\n setSelectState(drawType, [\r\n GeometryType.Circle,\r\n GeometryType.LinearRing,\r\n GeometryType.Polygon\r\n ]);\r\n selectDraw.value = drawType;\r\n } else {\r\n drawType = geomLayer;\r\n setSelectState(drawType, [geomLayer]);\r\n }\r\n }\r\n }\r\n\r\n return drawType;\r\n }\r\n\r\n private _visibilityClickHandler(evt: MouseEvent) {\r\n const btn = evt.currentTarget as HTMLElement;\r\n const parentDiv = btn.closest('.wfst--layer-control') as HTMLElement;\r\n const layerName = parentDiv.dataset['layer'];\r\n parentDiv.classList.toggle('ol-wfst--visible-on');\r\n const layer = getStoredMapLayers()[layerName];\r\n if (parentDiv.classList.contains('ol-wfst--visible-on')) {\r\n layer.setVisible(true);\r\n } else {\r\n layer.setVisible(false);\r\n }\r\n }\r\n\r\n /**\r\n * Called when a layer is selected in the widget\r\n * @param evt\r\n * @param layer\r\n */\r\n private _layerChangeHandler(evt: Event, layer: WfsLayer | WmsLayer) {\r\n const selected = document.querySelector('.ol-wfst--selected-on');\r\n const parentDiv = (evt.currentTarget as HTMLElement).closest(\r\n '.wfst--layer-control'\r\n ) as HTMLElement;\r\n\r\n // Deselect DOM previous layer\r\n selected.classList.remove('ol-wfst--selected-on');\r\n\r\n // Select this layer\r\n parentDiv.classList.add('ol-wfst--selected-on');\r\n setActiveLayerToInsertEls(layer);\r\n this._changeStateSelect(layer);\r\n\r\n this.dispatchEvent('changeLayer');\r\n }\r\n\r\n render(): HTMLElement {\r\n return (\r\n <>\r\n <div className=\"wfst--tools-control--head\">\r\n <div className=\"ol-wfst--tools-control-select-cnt\">\r\n <button\r\n className=\"ol-wfst--tools-control-btn ol-wfst--tools-control-btn-select wfst--active\"\r\n type=\"button\"\r\n title={I18N.labels.select}\r\n onClick={() => {\r\n this.dispatchEvent('selectModeSingle');\r\n }}\r\n >\r\n {selectSvg()}\r\n </button>\r\n <button\r\n className=\"ol-wfst--tools-control-btn ol-wfst--tools-control-btn-select-box\"\r\n type=\"button\"\r\n title={I18N.labels.selectBox}\r\n onClick={() => {\r\n this.dispatchEvent('selectModeBox');\r\n }}\r\n >\r\n {selectBoxSvg()}\r\n </button>\r\n <button\r\n className=\"ol-wfst--tools-control-btn ol-wfst--tools-control-btn-select-freehand\"\r\n type=\"button\"\r\n title={I18N.labels.selectFreehand}\r\n onClick={() => {\r\n this.dispatchEvent('selectModeFreehand');\r\n }}\r\n >\r\n {selectFreehandSvg()}\r\n </button>\r\n </div>\r\n <div className=\"ol-wfst--tools-control-query-cnt\">\r\n <button\r\n className=\"ol-wfst--tools-control-btn ol-wfst--tools-control-btn-query\"\r\n type=\"button\"\r\n title={I18N.labels.query}\r\n onClick={() => {\r\n this.dispatchEvent('queryMode');\r\n }}\r\n >\r\n {infoSvg()}\r\n </button>\r\n </div>\r\n <div className=\"ol-wfst--tools-control-draw-cnt\">\r\n <button\r\n className=\"ol-wfst--tools-control-btn ol-wfst--tools-control-btn-draw\"\r\n type=\"button\"\r\n title={I18N.labels.addElement}\r\n onClick={() => {\r\n this.dispatchEvent('drawMode');\r\n }}\r\n >\r\n {drawSvg()}\r\n </button>\r\n <select\r\n title={I18N.labels.selectDrawType}\r\n className=\"wfst--tools-control--select-draw\"\r\n onChange={(evt: Event) => {\r\n const selectedValue = (\r\n evt.target as HTMLSelectElement\r\n ).value as GeometryType;\r\n this._changeStateSelect(\r\n getActiveLayerToInsertEls(),\r\n selectedValue\r\n );\r\n this.dispatchEvent('changeGeom');\r\n }}\r\n >\r\n {[\r\n GeometryType.Point,\r\n GeometryType.MultiPoint,\r\n GeometryType.LineString,\r\n GeometryType.MultiLineString,\r\n GeometryType.Polygon,\r\n GeometryType.MultiPolygon,\r\n GeometryType.Circle\r\n ].map((type) => {\r\n // Show all options, but enable only the accepted ones\r\n return <option value={type}>{type}</option>;\r\n })}\r\n </select>\r\n </div>\r\n {this._uploads && (\r\n <div>\r\n <input\r\n id=\"ol-wfst--upload\"\r\n type=\"file\"\r\n accept={this._uploadFormats}\r\n onChange={(evt) => this._uploads.process(evt)}\r\n />\r\n <label\r\n className=\"ol-wfst--tools-control-btn ol-wfst--tools-control-btn-upload\"\r\n htmlFor=\"ol-wfst--upload\"\r\n title={I18N.labels.uploadToLayer}\r\n >\r\n {uploadSvg()}\r\n </label>\r\n </div>\r\n )}\r\n </div>\r\n <div className=\"wfst--tools-control--select-layers\">\r\n <div className=\"wfst--tools-control--select-layers-title\">\r\n {I18N.labels.geoserverLayers}\r\n </div>\r\n <div className=\"wfst--tools-control--select-layers-list\"></div>\r\n </div>\r\n </>\r\n );\r\n }\r\n}\r\n","import VectorLayer from 'ol/layer/Vector.js';\r\nimport VectorSource from 'ol/source/Vector.js';\r\n\r\nlet editLayer = new VectorLayer({\r\n source: new VectorSource(),\r\n zIndex: 100\r\n});\r\n\r\nexport const getEditLayer = (): VectorLayer<VectorSource> => {\r\n return editLayer;\r\n};\r\n","// Ol\r\nimport {\r\n Geometry,\r\n LineString,\r\n MultiLineString,\r\n MultiPoint,\r\n MultiPolygon,\r\n Point,\r\n Polygon\r\n} from 'ol/geom.js';\r\nimport Feature from 'ol/Feature.js';\r\nimport Observable from 'ol/Observable.js';\r\nimport GeoJSON from 'ol/format/GeoJSON.js';\r\nimport KML from 'ol/format/KML.js';\r\nimport WFS from 'ol/format/WFS.js';\r\nimport { VectorSourceEvent } from 'ol/source/Vector.js';\r\nimport { BaseLayerProperty } from './base/BaseLayer.js';\r\n\r\n// External\r\nimport Modal from 'modal-vanilla';\r\n\r\nimport { Options } from '../ol-wfst';\r\nimport { showError } from './errors';\r\nimport { resetStateButtons } from './LayersControl';\r\nimport { getEditLayer } from './editLayer';\r\nimport { getActiveLayerToInsertEls, getMap } from './state';\r\nimport { GeometryType } from '../@enums';\r\nimport { I18N } from './i18n';\r\n\r\nexport default class Uploads extends Observable {\r\n protected _options: Options;\r\n\r\n // Formats\r\n protected _formatWFS: WFS;\r\n protected _formatGeoJSON: GeoJSON;\r\n protected _formatKml: KML;\r\n protected _xs: XMLSerializer;\r\n\r\n protected _processUpload: Options['processUpload'];\r\n\r\n constructor(options: Options) {\r\n super();\r\n\r\n this._options = options;\r\n\r\n this._processUpload = options.processUpload;\r\n\r\n // Formats\r\n this._formatWFS = new WFS();\r\n\r\n this._formatGeoJSON = new GeoJSON();\r\n this._formatKml = new KML({\r\n extractStyles: false,\r\n showPointNames: false\r\n });\r\n this._xs = new XMLSerializer();\r\n }\r\n\r\n /**\r\n * Parse and check geometry of uploaded files\r\n *\r\n * @param evt\r\n * @public\r\n */\r\n async process(evt: Event): Promise<void> {\r\n const map = getMap();\r\n const view = map.getView();\r\n\r\n const file = (evt.target as HTMLInputElement).files[0];\r\n\r\n let features: Array<Feature<Geometry>>;\r\n\r\n if (!file) {\r\n return;\r\n }\r\n\r\n const extension = file.name.split('.').pop().toLowerCase();\r\n\r\n try {\r\n // If the user uses a custom fucntion...\r\n if (this._processUpload) {\r\n features = this._processUpload(file);\r\n }\r\n\r\n // If the user functions return features, we dont process anything more\r\n if (!features) {\r\n const string = await this._fileReader(file);\r\n\r\n if (extension === 'geojson' || extension === 'json') {\r\n features = this._formatGeoJSON.readFeatures(string, {\r\n featureProjection: view.getProjection().getCode()\r\n });\r\n } else if (extension === 'kml') {\r\n features = this._formatKml.readFeatures(string, {\r\n featureProjection: view.getProjection().getCode()\r\n });\r\n } else {\r\n showError(I18N.errors.badFormat);\r\n }\r\n }\r\n\r\n let invalidFeaturesCount = 0;\r\n let validFeaturesCount = 0;\r\n\r\n const featuresToInsert: Array<Feature<Geometry>> = [];\r\n\r\n for (let feature of features) {\r\n // If the geometry doesn't correspond to the layer, try to fixit.\r\n // If we can't, don't use it\r\n if (!this._checkGeometry(feature)) {\r\n feature = this._fixGeometry(feature);\r\n }\r\n\r\n if (feature) {\r\n featuresToInsert.push(feature);\r\n validFeaturesCount++;\r\n } else {\r\n invalidFeaturesCount++;\r\n continue;\r\n }\r\n }\r\n\r\n if (!validFeaturesCount) {\r\n showError(I18N.errors.noValidGeometry);\r\n } else {\r\n resetStateButtons();\r\n\r\n this.dispatchEvent(\r\n new VectorSourceEvent(\r\n 'loadedFeatures',\r\n null,\r\n featuresToInsert\r\n )\r\n );\r\n\r\n const content = `\r\n ${I18N.labels.validFeatures}: ${validFeaturesCount}<br>\r\n ${\r\n invalidFeaturesCount\r\n ? `${I18N.labels.invalidFeatures}: ${invalidFeaturesCount}`\r\n : ''\r\n }`;\r\n\r\n this._initModal(content, featuresToInsert);\r\n }\r\n\r\n // Reset the input to allow another onChange trigger\r\n (evt.target as HTMLInputElement).value = null;\r\n } catch (err) {\r\n showError(I18N.errors.badFile, err);\r\n }\r\n }\r\n\r\n /**\r\n * Read data file\r\n * @param file\r\n * @public\r\n */\r\n async _fileReader(file: File): Promise<string> {\r\n return new Promise((resolve, reject) => {\r\n const reader = new FileReader();\r\n\r\n reader.addEventListener('load', async (e) => {\r\n const fileData = e.target.result;\r\n resolve(fileData as string);\r\n });\r\n\r\n reader.addEventListener('error', (err) => {\r\n console.error('Error' + err);\r\n reject();\r\n });\r\n reader.readAsText(file);\r\n });\r\n }\r\n\r\n /**\r\n * Attemp to change the geometry feature to the layer\r\n * @param feature\r\n * @private\r\n */\r\n _fixGeometry(feature: Feature<Geometry>): Feature<Geometry> {\r\n // Geometry of the layer\r\n const geomTypeLayer =\r\n getActiveLayerToInsertEls().getDescribeFeatureType()._parsed\r\n .geomType;\r\n const geomTypeFeature = feature.getGeometry().getType();\r\n let geom: Geometry;\r\n\r\n switch (geomTypeFeature) {\r\n case GeometryType.Point: {\r\n if (geomTypeLayer === GeometryType.MultiPoint) {\r\n const coords = (\r\n feature.getGeometry() as Point\r\n ).getCoordinates();\r\n geom = new MultiPoint([coords]);\r\n }\r\n break;\r\n }\r\n\r\n case GeometryType.LineString:\r\n if (geomTypeLayer === GeometryType.MultiLineString) {\r\n const coords = (\r\n feature.getGeometry() as LineString\r\n ).getCoordinates();\r\n geom = new MultiLineString([coords]);\r\n }\r\n break;\r\n\r\n case GeometryType.Polygon:\r\n if (geomTypeLayer === GeometryType.MultiPolygon) {\r\n const coords = (\r\n feature.getGeometry() as Polygon\r\n ).getCoordinates();\r\n geom = new MultiPolygon([coords]);\r\n }\r\n break;\r\n default:\r\n geom = null;\r\n }\r\n\r\n if (!geom) {\r\n return null;\r\n }\r\n\r\n feature.setGeometry(geom);\r\n return feature;\r\n }\r\n\r\n /**\r\n * Check if the feature has the same geometry as the target layer\r\n * @param feature\r\n * @private\r\n */\r\n _checkGeometry(feature: Feature<Geometry>): boolean {\r\n // Geometry of the layer\r\n const geomTypeLayer =\r\n getActiveLayerToInsertEls().getDescribeFeatureType()._parsed\r\n .geomType;\r\n const geomTypeFeature = feature.getGeometry().getType();\r\n\r\n // This geom accepts every type of geometry\r\n if (geomTypeLayer === GeometryType.GeometryCollection) {\r\n return true;\r\n }\r\n\r\n return geomTypeFeature === geomTypeLayer;\r\n }\r\n\r\n /**\r\n * Confirm modal before transact to the GeoServer the features in the file\r\n *\r\n * @param content\r\n * @param featuresToInsert\r\n * @private\r\n */\r\n _initModal(\r\n content: string,\r\n featuresToInsert: Array<Feature<Geometry>>\r\n ): void {\r\n const footer = `\r\n <button type=\"button\" class=\"btn btn-sm btn-secondary\" data-dismiss=\"modal\">\r\n ${I18N.labels.cancel}\r\n </button>\r\n <button type=\"button\" class=\"btn btn-sm btn-primary\" data-action=\"save\" data-dismiss=\"modal\">\r\n ${I18N.labels.upload}\r\n </button>\r\n `;\r\n\r\n const modal = new Modal({\r\n ...this._options.modal,\r\n header: true,\r\n headerClose: false,\r\n title:\r\n I18N.labels.uploadFeatures +\r\n ' ' +\r\n getActiveLayerToInsertEls().get(BaseLayerProperty.NAME),\r\n content: content,\r\n backdrop: 'static', // Prevent close on click outside the modal\r\n footer: footer\r\n }).show();\r\n\r\n modal.on('dismiss', (modal, event) => {\r\n // On saving changes\r\n if (event.target.dataset.action === 'save') {\r\n this.dispatchEvent(\r\n new VectorSourceEvent(\r\n 'addedFeatures',\r\n null,\r\n featuresToInsert\r\n )\r\n );\r\n } else {\r\n // On cancel button\r\n getEditLayer().getSource().clear();\r\n }\r\n });\r\n }\r\n}\r\n","/**\r\n * @param target\r\n * @param sources\r\n * @returns\r\n */\r\nexport const deepObjectAssign = (target, ...sources) => {\r\n sources.forEach((source) => {\r\n Object.keys(source).forEach((key) => {\r\n const s_val = source[key];\r\n const t_val = target[key];\r\n target[key] =\r\n t_val &&\r\n s_val &&\r\n typeof t_val === 'object' &&\r\n typeof s_val === 'object' &&\r\n !Array.isArray(t_val) // Don't merge arrays\r\n ? deepObjectAssign(t_val, s_val)\r\n : s_val;\r\n });\r\n });\r\n return target;\r\n};\r\n","import Feature from 'ol/Feature.js';\r\nimport Geometry from 'ol/geom/Geometry.js';\r\nimport Control from 'ol/control/Control.js';\r\nimport { VectorSourceEvent } from 'ol/source/Vector.js';\r\nimport { CombinedOnSignature, EventTypes, OnSignature } from 'ol/Observable.js';\r\nimport BaseEvent from 'ol/events/Event.js';\r\nimport { EventsKey } from 'ol/events.js';\r\nimport { ObjectEvent } from 'ol/Object.js';\r\nimport { Types as ObjectEventTypes } from 'ol/ObjectEventType.js';\r\n\r\nimport { I18N, I18N_ } from './i18n';\r\n\r\ntype ChangesEventTypes = 'cancel' | 'apply' | 'delete';\r\n\r\nexport default class EditControlChangesEl extends Control {\r\n declare on: OnSignature<EventTypes, BaseEvent, EventsKey> &\r\n OnSignature<ChangesEventTypes, VectorSourceEvent, EventsKey> &\r\n OnSignature<ObjectEventTypes, ObjectEvent, EventsKey> &\r\n CombinedOnSignature<\r\n ChangesEventTypes | ObjectEventTypes | EventTypes,\r\n EventsKey\r\n >;\r\n\r\n declare once: OnSignature<EventTypes, BaseEvent, EventsKey> &\r\n OnSignature<ChangesEventTypes, VectorSourceEvent, EventsKey> &\r\n OnSignature<ObjectEventTypes, ObjectEvent, EventsKey> &\r\n CombinedOnSignature<\r\n ChangesEventTypes | ObjectEventTypes | EventTypes,\r\n EventsKey\r\n >;\r\n\r\n declare un: OnSignature<EventTypes, BaseEvent, void> &\r\n OnSignature<ChangesEventTypes, VectorSourceEvent, EventsKey> &\r\n OnSignature<ObjectEventTypes, ObjectEvent, void> &\r\n CombinedOnSignature<\r\n ChangesEventTypes | ObjectEventTypes | EventTypes,\r\n void\r\n >;\r\n\r\n constructor(features: Feature<Geometry>[]) {\r\n super({\r\n element: (\r\n <div className=\"ol-wfst--changes-control\">\r\n <div className=\"ol-wfst--changes-control-el\">\r\n <div className=\"ol-wfst--changes-control-id\">\r\n <b>{I18N.labels.editMode}</b> -{' '}\r\n <i>\r\n {features.length > 1\r\n ? I18N_('editElements', features.length)\r\n : String(features[0].getId())}\r\n </i>\r\n </div>\r\n <button\r\n type=\"button\"\r\n className=\"btn btn-sm btn-secondary\"\r\n onClick={() => {\r\n this._dispatch('cancel', features);\r\n }}\r\n >\r\n {I18N.labels.cancel}\r\n </button>\r\n <button\r\n type=\"button\"\r\n className=\"btn btn-sm btn-primary\"\r\n onClick={() => {\r\n this._dispatch('apply', features);\r\n }}\r\n >\r\n {I18N.labels.apply}\r\n </button>\r\n <button\r\n type=\"button\"\r\n className=\"btn btn-sm btn-danger-outline\"\r\n onClick={() => {\r\n this._dispatch('delete', features);\r\n }}\r\n >\r\n {I18N.labels.delete}\r\n </button>\r\n </div>\r\n </div>\r\n )\r\n });\r\n }\r\n\r\n private _dispatch(\r\n type: ChangesEventTypes,\r\n features: Feature<Geometry>[]\r\n ): void {\r\n const evt = new VectorSourceEvent(type, features[0]);\r\n (evt as any).features = features;\r\n this.dispatchEvent(evt);\r\n }\r\n}\r\n","// Ol\r\nimport {\r\n Geometry,\r\n GeometryCollection,\r\n LineString,\r\n MultiLineString,\r\n MultiPoint,\r\n MultiPolygon,\r\n Polygon\r\n} from 'ol/geom.js';\r\nimport { Circle as CircleStyle, Fill, Stroke, Style } from 'ol/style.js';\r\nimport Feature, { FeatureLike } from 'ol/Feature.js';\r\nimport { Coordinate } from 'ol/coordinate.js';\r\n\r\nimport { GeometryType } from '../@enums';\r\nimport { getMode, Modes } from './state';\r\n\r\n/**\r\n * Modern vertex handle mimicking the round \"extend line\" buttons shown at\r\n * line endpoints: a soft halo for depth and a white disc with a subtle\r\n * border. When `highlighted` is `true` (e.g. hovering a vertex with the\r\n * Modify interaction) the handle gets bigger with a stronger halo and a\r\n * darker border.\r\n *\r\n * @param highlighted Whether to render the bigger/highlighted state\r\n * @param geometry Style geometry function to position the handles\r\n * @private\r\n */\r\nexport const editVertexStyles = (\r\n highlighted = false,\r\n geometry?: (feature: FeatureLike) => Geometry\r\n): Array<Style> => {\r\n const halo = highlighted ? 10 : 8;\r\n const haloColor = highlighted\r\n ? 'rgba(0, 0, 0, 0.40)'\r\n : 'rgba(0, 0, 0, 0.28)';\r\n\r\n const radius = highlighted ? 7 : 6;\r\n const border = highlighted ? '#4b5563' : '#b3b3b3';\r\n const borderWidth = highlighted ? 2 : 1.5;\r\n\r\n return [\r\n new Style({\r\n image: new CircleStyle({\r\n radius: halo,\r\n fill: new Fill({\r\n color: haloColor\r\n })\r\n }),\r\n ...(geometry ? { geometry } : {})\r\n }),\r\n new Style({\r\n image: new CircleStyle({\r\n radius: radius,\r\n fill: new Fill({\r\n color: '#ffffff'\r\n }),\r\n stroke: new Stroke({\r\n width: borderWidth,\r\n color: border\r\n })\r\n }),\r\n ...(geometry ? { geometry } : {})\r\n })\r\n ];\r\n};\r\n\r\n/**\r\n * Extract a `MultiPoint` with every vertex of the given feature geometry\r\n * (polygons and multi-line strings are flattened). Returns `undefined` when\r\n * the geometry has no coordinates.\r\n *\r\n * @param feature\r\n * @private\r\n */\r\nexport const getFeatureVertices = (\r\n feature: FeatureLike\r\n): MultiPoint | undefined => {\r\n let geometry = feature.getGeometry();\r\n\r\n if (geometry instanceof GeometryCollection) {\r\n geometry = geometry.getGeometries()[0];\r\n }\r\n\r\n const coordinates = (geometry as LineString).getCoordinates();\r\n let flatCoordinates: Coordinate[] | number[] = null;\r\n\r\n if (geometry instanceof Polygon || geometry instanceof MultiLineString) {\r\n flatCoordinates = coordinates.flat(1);\r\n } else if (geometry instanceof MultiPolygon) {\r\n flatCoordinates = coordinates.flat(2);\r\n } else {\r\n flatCoordinates = coordinates;\r\n }\r\n\r\n if (!flatCoordinates || !flatCoordinates.length) {\r\n return;\r\n }\r\n\r\n return new MultiPoint(flatCoordinates as Coordinate[]);\r\n};\r\n\r\n/**\r\n * Master style that handles two modes on the Edit Layer:\r\n * - one is the basic, showing only the vertices\r\n * - and the other when modify is active, showing bigger vertices\r\n *\r\n * When `hovered` is `true`, a white/red halo is prepended to highlight the\r\n * feature, indicating it can be selected on click.\r\n *\r\n * @param feature\r\n * @param hovered\r\n * @private\r\n */\r\nexport default function styleFunction(\r\n feature: Feature<Geometry>,\r\n hovered = false\r\n): Array<Style> {\r\n let geometry = feature.getGeometry();\r\n let type = geometry.getType();\r\n\r\n if (geometry instanceof GeometryCollection) {\r\n geometry = geometry.getGeometries()[0];\r\n type = geometry.getType();\r\n }\r\n\r\n const haloStyle = (): Array<Style> => {\r\n return [\r\n new Style({\r\n image: new CircleStyle({\r\n radius: 9,\r\n fill: new Fill({\r\n color: 'rgba(255, 255, 255, 0.9)'\r\n }),\r\n stroke: new Stroke({\r\n color: '#ff0000',\r\n width: 3\r\n })\r\n }),\r\n stroke: new Stroke({\r\n color: 'rgba(255, 255, 255, 0.9)',\r\n width: 8\r\n }),\r\n fill: new Fill({\r\n color: 'rgba(255, 255, 255, 0.9)'\r\n })\r\n })\r\n ];\r\n };\r\n\r\n switch (type) {\r\n case GeometryType.Point:\r\n case GeometryType.MultiPoint:\r\n if (getMode() === Modes.Edit) {\r\n return editVertexStyles();\r\n } else {\r\n return [\r\n ...(hovered ? haloStyle() : []),\r\n new Style({\r\n image: new CircleStyle({\r\n radius: 5,\r\n fill: new Fill({\r\n color: '#ff0000'\r\n })\r\n })\r\n }),\r\n new Style({\r\n image: new CircleStyle({\r\n radius: 2,\r\n fill: new Fill({\r\n color: '#000000'\r\n })\r\n })\r\n })\r\n ];\r\n }\r\n default:\r\n // If editing mode is active, show bigger vertex\r\n if (getMode() == Modes.Draw || getMode() == Modes.Edit) {\r\n return [\r\n new Style({\r\n stroke: new Stroke({\r\n color: 'rgba( 255, 0, 0, 1)',\r\n width: 4\r\n }),\r\n fill: new Fill({\r\n color: 'rgba(255, 0, 0, 0.7)'\r\n })\r\n }),\r\n ...editVertexStyles(false, getFeatureVertices),\r\n new Style({\r\n stroke: new Stroke({\r\n color: 'rgba(255, 255, 255, 0.7)',\r\n width: 2\r\n })\r\n })\r\n ];\r\n } else {\r\n return [\r\n ...(hovered ? haloStyle() : []),\r\n new Style({\r\n image: new CircleStyle({\r\n radius: 2,\r\n fill: new Fill({\r\n color: '#000000'\r\n })\r\n }),\r\n geometry: (feature) => getFeatureVertices(feature)\r\n }),\r\n new Style({\r\n stroke: new Stroke({\r\n color: '#ff0000',\r\n width: 4\r\n }),\r\n fill: new Fill({\r\n color: 'rgba(255, 0, 0, 0.7)'\r\n })\r\n })\r\n ];\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Style used to highlight a feature after a query, drawn on a dedicated\r\n * highlight layer so the source layers keep their own rendering.\r\n *\r\n * @param feature\r\n * @private\r\n */\r\nexport function queryStyleFunction(_feature: Feature<Geometry>): Array<Style> {\r\n return [\r\n new Style({\r\n image: new CircleStyle({\r\n radius: 6,\r\n fill: new Fill({\r\n color: 'rgba(0, 170, 255, 0.4)'\r\n }),\r\n stroke: new Stroke({\r\n color: '#0066cc',\r\n width: 2\r\n })\r\n }),\r\n stroke: new Stroke({\r\n color: '#00aaff',\r\n width: 4\r\n }),\r\n fill: new Fill({\r\n color: 'rgba(0, 170, 255, 0.3)'\r\n })\r\n })\r\n ];\r\n}\r\n","// Ol\r\nimport Observable from 'ol/Observable.js';\r\nimport Feature from 'ol/Feature.js';\r\nimport Geometry from 'ol/geom/Geometry.js';\r\nimport { VectorSourceEvent } from 'ol/source/Vector.js';\r\n\r\n// External\r\nimport Modal from 'modal-vanilla';\r\n\r\nimport { addFeatureToEditedList, getStoredLayer } from './state';\r\nimport { Options } from '../ol-wfst';\r\nimport { I18N, I18N_ } from './i18n';\r\n\r\n/**\r\n * Shows a fields form in a modal window to allow changes in the properties of\r\n * one or several features. When editing multiple features, fields whose value\r\n * differs across the selection show the \"multiple values\" placeholder and only\r\n * the fields actually changed are applied to the whole selection.\r\n *\r\n * @param features\r\n * @private\r\n */\r\nexport class EditFieldsModal extends Observable {\r\n protected _options: Options;\r\n protected _modal: Modal;\r\n protected _features: Feature[];\r\n\r\n constructor(options: Options) {\r\n super();\r\n\r\n this._options = options;\r\n\r\n this._modal = new Modal({\r\n ...this._options.modal,\r\n header: true,\r\n headerClose: true,\r\n title: '',\r\n content: '<div></div>',\r\n footer: `\r\n <button\r\n type=\"button\"\r\n class=\"btn btn-sm btn-third\"\r\n data-action=\"delete\"\r\n data-dismiss=\"modal\"\r\n >\r\n ${I18N.labels.delete}\r\n </button>\r\n <button\r\n type=\"button\"\r\n class=\"btn btn-sm btn-secondary\"\r\n data-dismiss=\"modal\"\r\n >\r\n ${I18N.labels.cancel}\r\n </button>\r\n <button\r\n type=\"button\"\r\n class=\"btn btn-sm btn-primary\"\r\n data-action=\"save\"\r\n data-dismiss=\"modal\"\r\n >\r\n ${I18N.labels.save}\r\n </button>\r\n `\r\n });\r\n\r\n this._modal.on('dismiss', (modal, event) => {\r\n // On saving changes\r\n if (event.target.dataset.action === 'save') {\r\n const formElements = modal.el.querySelector('form')\r\n .elements as HTMLFormElement[];\r\n\r\n const multipleFields = new Set(\r\n Array.from(formElements)\r\n .filter((el) => el.dataset.multiple === 'true')\r\n .map((el) => el.name)\r\n );\r\n\r\n Array.from(formElements).forEach((el) => {\r\n const value = el.value;\r\n const field = el.name;\r\n\r\n // Do not overwrite untouched fields that had\r\n // multiple values in the selection\r\n if (multipleFields.has(field) && value === '') {\r\n return;\r\n }\r\n\r\n this._features.forEach((feature) => {\r\n if (feature.get(field) !== value) {\r\n feature.set(field, value, /* isSilent = */ true);\r\n }\r\n });\r\n });\r\n\r\n this._features.forEach((feature) => {\r\n feature.changed();\r\n addFeatureToEditedList(feature);\r\n });\r\n\r\n this._dispatch('save', this._features);\r\n } else if (event.target.dataset.action === 'delete') {\r\n this._dispatch('delete', this._features);\r\n }\r\n });\r\n }\r\n\r\n show(features: Feature<Geometry> | Feature<Geometry>[]) {\r\n this._features = Array.isArray(features) ? features : [features];\r\n\r\n const multiple = this._features.length > 1;\r\n\r\n const modalTitle = multiple\r\n ? I18N_('editElements', this._features.length)\r\n : `${I18N.labels.editElement} ${this._features[0].getId()} `;\r\n\r\n const layerName = this._features[0].get('_layerName_');\r\n\r\n // Data schema from the geoserver\r\n const layer = getStoredLayer(layerName);\r\n const describeFeatureType = layer.getDescribeFeatureType()._parsed;\r\n\r\n const fieldList = describeFeatureType.properties.filter(\r\n (field) => field.name !== describeFeatureType.geomField\r\n );\r\n\r\n this._modal._html.body.innerHTML = '';\r\n this._modal._html.body.append(\r\n <div>\r\n {multiple && (\r\n <div className=\"ol-wfst--edit-modal-notice\">\r\n {I18N_('multipleEditNotice', this._features.length)}\r\n </div>\r\n )}\r\n <form autocomplete=\"false\">\r\n {fieldList.flatMap((field) => {\r\n const key = field.name;\r\n\r\n const values = this._features.map((feature) =>\r\n feature.get(key)\r\n );\r\n const uniqueValues = Array.from(\r\n new Set(values.map((value) => String(value ?? '')))\r\n );\r\n const hasMultipleValues =\r\n multiple && uniqueValues.length > 1;\r\n\r\n const value = hasMultipleValues\r\n ? null\r\n : uniqueValues[0] || null;\r\n\r\n const typeXsd = field.type;\r\n\r\n let type: string;\r\n\r\n switch (typeXsd) {\r\n case 'xsd:double':\r\n case 'xsd:number':\r\n case 'xsd:int':\r\n type = 'number';\r\n break;\r\n case 'xsd:date':\r\n type = 'date';\r\n break;\r\n case 'xsd:date-time':\r\n type = 'datetime';\r\n break;\r\n case 'xsd:string':\r\n default:\r\n type = 'text';\r\n }\r\n\r\n let input: HTMLElement = (\r\n <input\r\n placeholder={\r\n hasMultipleValues\r\n ? I18N.labels.multipleValues\r\n : 'NULL'\r\n }\r\n className={\r\n 'ol-wfst--input-field-input' +\r\n (hasMultipleValues\r\n ? ' ol-wfst--input-multiple'\r\n : '')\r\n }\r\n type={type}\r\n name={key}\r\n value={value}\r\n data-multiple={\r\n hasMultipleValues ? 'true' : null\r\n }\r\n />\r\n );\r\n\r\n if (layer.beforeShowFieldsModal) {\r\n const hookInput = layer.beforeShowFieldsModal(\r\n field,\r\n value,\r\n input\r\n );\r\n\r\n if (!hookInput) {\r\n return [];\r\n }\r\n\r\n if (typeof hookInput === 'string') {\r\n input = new DOMParser().parseFromString(\r\n hookInput,\r\n 'text/html'\r\n ).body.childNodes[0] as HTMLElement;\r\n } else {\r\n input = hookInput;\r\n }\r\n }\r\n\r\n if (hasMultipleValues) {\r\n input.dataset.multiple = 'true';\r\n input.classList.add('ol-wfst--input-multiple');\r\n }\r\n\r\n return (\r\n <div className=\"ol-wfst--input-field-container\">\r\n <label\r\n className=\"ol-wfst--input-field-label\"\r\n htmlFor={key}\r\n >\r\n {key}\r\n </label>\r\n {input}\r\n </div>\r\n );\r\n })}\r\n </form>\r\n </div>\r\n );\r\n this._modal._html.header.innerHTML = modalTitle;\r\n this._modal.show();\r\n }\r\n\r\n private _dispatch(\r\n type: 'save' | 'delete',\r\n features: Feature<Geometry>[]\r\n ): void {\r\n const evt = new VectorSourceEvent(type, features[0]);\r\n (evt as any).features = features;\r\n this.dispatchEvent(evt);\r\n }\r\n}\r\n","/**\n * @module ol/format/WFSCapabilities\n */\nimport XML from 'ol/format/XML.js';\nimport {\n getAllTextContent,\n makeArrayPusher,\n makeObjectPropertyPusher,\n makeObjectPropertySetter,\n makeStructureNS,\n pushParseAndPop,\n} from 'ol/xml.js';\nimport {readHref} from 'ol/format/xlink.js';\nimport {readString} from 'ol/format/xsd.js';\n\n/**\n * @const\n * @type {Array<null|string>}\n */\nconst NAMESPACE_URIS = [\n null,\n 'http://www.opengis.net/fes/2.0',\n 'http://www.opengis.net/ows/1.1',\n 'http://www.opengis.net/wfs/2.0',\n];\n\n/**\n * @const\n * @type {Object<string, Object<string, import(\"ol/xml.js\").Parser>>}\n */\n// @ts-ignore\nconst PARSERS = makeStructureNS(NAMESPACE_URIS, {\n 'ServiceIdentification': makeObjectPropertySetter(readServiceIdentification),\n 'ServiceProvider': makeObjectPropertySetter(readServiceProvider),\n 'OperationsMetadata': makeObjectPropertySetter(readOperationsMetadata),\n 'FeatureTypeList': makeObjectPropertySetter(readFeatureTypeList),\n 'Filter_Capabilities': makeObjectPropertySetter(readFilter_Capabilities),\n});\n\n/**\n * @classdesc\n * Format for reading WFS capabilities data\n *\n * @api\n */\nclass WFSCapabilities extends XML {\n constructor() {\n super();\n\n /**\n * @type {string|undefined}\n */\n this.version = undefined;\n }\n\n /**\n * @param {Element} node Node.\n * @return {Object} Object\n */\n readFromNode(node) {\n this.version = node.getAttribute('version').trim();\n const wfsCapabilityObject = pushParseAndPop(\n {\n 'version': this.version,\n },\n PARSERS,\n node,\n []\n );\n return wfsCapabilityObject ? wfsCapabilityObject : null;\n }\n}\n\n/**\n * @const\n * @type {Object<string, Object<string, import(\"ol/xml.js\").Parser>>}\n */\n// @ts-ignore\nconst SERVICE_IDENTIFICATION_PARSERS = makeStructureNS(NAMESPACE_URIS, {\n 'Title': makeObjectPropertySetter(readString),\n 'Abstract': makeObjectPropertySetter(readString),\n 'Keywords': makeObjectPropertySetter(readKeywordList),\n 'ServiceType': makeObjectPropertySetter(readString),\n 'ServiceTypeVersion': makeObjectPropertySetter(readString),\n 'Fees': makeObjectPropertySetter(readString),\n 'AccessConstraints': makeObjectPropertySetter(readString),\n});\n\n/**\n * @const\n * @type {Object<string, Object<string, import(\"ol/xml.js\").Parser>>}\n */\n// @ts-ignore\nconst SERVICE_PROVIDER_PARSERS = makeStructureNS(NAMESPACE_URIS, {\n 'ProviderName': makeObjectPropertySetter(readString),\n 'ServiceContact': makeObjectPropertySetter(readServiceContact),\n});\n\n/**\n * @const\n * @type {Object<string, Object<string, import(\"ol/xml.js\").Parser>>}\n */\n// @ts-ignore\nconst OPERATIONS_METADATA_PARSERS = makeStructureNS(NAMESPACE_URIS, {\n 'Operation': makeObjectPropertyPusher(readNamedOperation),\n 'Constraint': makeObjectPropertyPusher(readNamedConstraint),\n});\n\n/**\n * @const\n * @type {Object<string, Object<string, import(\"ol/xml.js\").Parser>>}\n */\n// @ts-ignore\nconst SERVICE_CONTACT_PARSERS = makeStructureNS(NAMESPACE_URIS, {\n 'IndividualName': makeObjectPropertySetter(readString),\n 'PositionName': makeObjectPropertySetter(readString),\n 'ContactInfo': makeObjectPropertySetter(readContactInfo),\n});\n\n/**\n * @const\n * @type {Object<string, Object<string, import(\"ol/xml.js\").Parser>>}\n */\n// @ts-ignore\nconst CONTACT_INFO_PARSERS = makeStructureNS(NAMESPACE_URIS, {\n 'Phone': makeObjectPropertySetter(readPhone),\n 'Address': makeObjectPropertySetter(readAddress),\n});\n\n/**\n * @const\n * @type {Object<string, Object<string, import(\"ol/xml.js\").Parser>>}\n */\n// @ts-ignore\nconst PHONE_PARSERS = makeStructureNS(NAMESPACE_URIS, {\n 'Voice': makeObjectPropertySetter(readString),\n 'Facsimile': makeObjectPropertySetter(readString),\n});\n\n/**\n * @const\n * @type {Object<string, Object<string, import(\"ol/xml.js\").Parser>>}\n */\n// @ts-ignore\nconst ADDRESS_PARSERS = makeStructureNS(NAMESPACE_URIS, {\n 'DeliveryPoint': makeObjectPropertySetter(readString),\n 'City': makeObjectPropertySetter(readString),\n 'AdministrativeArea': makeObjectPropertySetter(readString),\n 'PostalCode': makeObjectPropertySetter(readString),\n 'Country': makeObjectPropertySetter(readString),\n 'ElectronicMailAddress': makeObjectPropertySetter(readString),\n});\n\n/**\n * @const\n * @type {Object<string, Object<string, import(\"ol/xml.js\").Parser>>}\n */\n// @ts-ignore\nconst FEATURE_TYPE_LIST_PARSERS = makeStructureNS(NAMESPACE_URIS, {\n 'FeatureType': makeArrayPusher(readFeatureType),\n});\n\n/**\n * @const\n * @type {Object<string, Object<string, import(\"ol/xml.js\").Parser>>}\n */\n// @ts-ignore\nconst FEATURE_TYPE_PARSERS = makeStructureNS(NAMESPACE_URIS, {\n 'Name': makeObjectPropertySetter(readString),\n 'Title': makeObjectPropertySetter(readString),\n 'Abstract': makeObjectPropertySetter(readString),\n 'Keywords': makeObjectPropertySetter(readKeywordList),\n 'DefaultCRS': makeObjectPropertySetter(readString),\n 'WGS84BoundingBox': makeObjectPropertySetter(readWGS84BoundingBox),\n 'MetadataURL': makeObjectPropertySetter(readHref),\n});\n\n/**\n * @const\n * @type {Object<string, Object<string, import(\"ol/xml.js\").Parser>>}\n */\n// @ts-ignore\nconst OPERATION_PARSERS = makeStructureNS(NAMESPACE_URIS, {\n 'DCP': makeObjectPropertySetter(readDCP),\n 'Parameter': makeObjectPropertyPusher(readNamedParameter),\n});\n\n/**\n * @const\n * @type {Object<string, Object<string, import(\"ol/xml.js\").Parser>>}\n */\n// @ts-ignore\nconst PARAMETER_PARSERS = makeStructureNS(NAMESPACE_URIS, {\n 'AllowedValues': makeObjectPropertySetter(readValueList),\n});\n\n/**\n * @const\n * @type {Object<string, Object<string, import(\"ol/xml.js\").Parser>>}\n */\n// @ts-ignore\nconst CONSTRAINT_PARSERS = makeStructureNS(NAMESPACE_URIS, {\n 'NoValues': makeObjectPropertySetter(readString),\n 'DefaultValue': makeObjectPropertySetter(readString),\n 'AllowedValues': makeObjectPropertySetter(readValueList),\n});\n\n/**\n * @const\n * @type {Object<string, Object<string, import(\"ol/xml.js\").Parser>>}\n */\n// @ts-ignore\nconst HTTP_PARSERS = makeStructureNS(NAMESPACE_URIS, {\n 'Get': makeObjectPropertySetter(readHref),\n 'Post': makeObjectPropertySetter(readHref),\n});\n\n/**\n * @const\n * @type {Object<string, Object<string, import(\"ol/xml.js\").Parser>>}\n */\n// @ts-ignore\nconst WGS84_BOUNDINGBOX_PARSERS = makeStructureNS(NAMESPACE_URIS, {\n 'LowerCorner': makeObjectPropertySetter(readStringCoords),\n 'UpperCorner': makeObjectPropertySetter(readStringCoords),\n});\n\n/**\n * @const\n * @type {Object<string, Object<string, import(\"ol/xml.js\").Parser>>}\n */\n// @ts-ignore\nconst DCP_PARSERS = makeStructureNS(NAMESPACE_URIS, {\n 'HTTP': makeObjectPropertySetter(readHTTP),\n});\n\n/**\n * @const\n * @type {Object<string, Object<string, import(\"ol/xml.js\").Parser>>}\n */\n// @ts-ignore\nconst KEYWORDLIST_PARSERS = makeStructureNS(NAMESPACE_URIS, {\n 'Keyword': makeArrayPusher(readString),\n});\n\n/**\n * @const\n * @type {Object<string, Object<string, import(\"ol/xml.js\").Parser>>}\n */\n// @ts-ignore\nconst VALUELIST_PARSERS = makeStructureNS(NAMESPACE_URIS, {\n 'Value': makeArrayPusher(readString),\n});\n\n/**\n * @const\n * @type {Object<string, Object<string, import(\"ol/xml.js\").Parser>>}\n */\n// @ts-ignore\nconst FILTER_CAPABILITIES_PARSERS = makeStructureNS(NAMESPACE_URIS, {\n 'Conformance': makeObjectPropertySetter(readConformance),\n 'Id_Capabilities': makeObjectPropertySetter(readId_Capabilities),\n 'Scalar_Capabilities': makeObjectPropertySetter(readScalarCapabilities),\n 'Spatial_Capabilities': makeObjectPropertySetter(readSpatialCapabilities),\n 'Temporal_Capabilities': makeObjectPropertySetter(readTemporalCapabilities),\n 'Functions': makeObjectPropertySetter(readFunctions),\n});\n\n/**\n * @const\n * @type {Object<string, Object<string, import(\"ol/xml.js\").Parser>>}\n */\n// @ts-ignore\nconst CONFORMANCE_PARSERS = makeStructureNS(NAMESPACE_URIS, {\n 'Constraint': makeObjectPropertyPusher(readNamedConstraint),\n});\n\n/**\n * @const\n * @type {Object<string, Object<string, import(\"ol/xml.js\").Parser>>}\n */\n// @ts-ignore\nconst ID_CAPABILITIES_PARSERS = makeStructureNS(NAMESPACE_URIS, {\n 'ResourceIdentifier': makeObjectPropertySetter(readNamedResourceIdentifier),\n});\n\n/**\n * @const\n * @type {Object<string, Object<string, import(\"ol/xml.js\").Parser>>}\n */\n// @ts-ignore\nconst SCALAR_CAPABILITIES_PARSERS = makeStructureNS(NAMESPACE_URIS, {\n 'LogicalOperators': makeObjectPropertySetter(readLogicalOperators),\n 'ComparisonOperators': makeObjectPropertySetter(readComparisonOperators),\n});\n\n/**\n * @const\n * @type {Object<string, Object<string, import(\"ol/xml.js\").Parser>>}\n */\n// @ts-ignore\nconst SPATIAL_CAPABILITIES_PARSERS = makeStructureNS(NAMESPACE_URIS, {\n 'GeometryOperands': makeObjectPropertySetter(readGeometryOperands),\n 'SpatialOperators': makeObjectPropertySetter(readSpatialOperators),\n});\n\n/**\n * @const\n * @type {Object<string, Object<string, import(\"ol/xml.js\").Parser>>}\n */\n// @ts-ignore\nconst TEMPORAL_CAPABILITIES_PARSERS = makeStructureNS(NAMESPACE_URIS, {\n 'TemporalOperands': makeObjectPropertySetter(readTemporalOperands),\n 'TemporalOperators': makeObjectPropertySetter(readTemporalOperators),\n});\n\n/**\n * @const\n * @type {Object<string, Object<string, import(\"ol/xml.js\").Parser>>}\n */\n// @ts-ignore\nconst FUNCTIONS_PARSERS = makeStructureNS(NAMESPACE_URIS, {\n 'Function': makeArrayPusher(readNamedFunction),\n});\n\n/**\n * @const\n * @type {Object<string, Object<string, import(\"ol/xml.js\").Parser>>}\n */\n// @ts-ignore\nconst FUNCTION_PARSERS = makeStructureNS(NAMESPACE_URIS, {\n 'Returns': makeObjectPropertySetter(readString),\n 'Arguments': makeObjectPropertySetter(readArguments),\n});\n\n/**\n * @const\n * @type {Object<string, Object<string, import(\"ol/xml.js\").Parser>>}\n */\n// @ts-ignore\nconst ARGUMENTS_PARSERS = makeStructureNS(NAMESPACE_URIS, {\n 'Argument': makeArrayPusher(readNamedArgument),\n});\n\n/**\n * @const\n * @type {Object<string, Object<string, import(\"ol/xml.js\").Parser>>}\n */\n// @ts-ignore\nconst ARGUMENT_PARSERS = makeStructureNS(NAMESPACE_URIS, {\n 'Type': makeObjectPropertySetter(readString),\n});\n\n/**\n * @const\n * @type {Object<string, Object<string, import(\"ol/xml.js\").Parser>>}\n */\n// @ts-ignore\nconst LOGICAL_OPERATORS_PARSERS = makeStructureNS(NAMESPACE_URIS, {\n 'LogicalOperator': makeArrayPusher(readNamedOnly),\n});\n\n/**\n * @const\n * @type {Object<string, Object<string, import(\"ol/xml.js\").Parser>>}\n */\n// @ts-ignore\nconst COMPARISON_OPERATORS_PARSERS = makeStructureNS(NAMESPACE_URIS, {\n 'ComparisonOperator': makeArrayPusher(readNamedOnly),\n});\n\n/**\n * @const\n * @type {Object<string, Object<string, import(\"ol/xml.js\").Parser>>}\n */\n// @ts-ignore\nconst GEOMETRY_OPERANDS_PARSERS = makeStructureNS(NAMESPACE_URIS, {\n 'GeometryOperand': makeArrayPusher(readNamedOnly),\n});\n\n/**\n * @const\n * @type {Object<string, Object<string, import(\"ol/xml.js\").Parser>>}\n */\n// @ts-ignore\nconst SPATIAL_OPERATORS_PARSERS = makeStructureNS(NAMESPACE_URIS, {\n 'SpatialOperator': makeArrayPusher(readNamedOnly),\n});\n\n/**\n * @const\n * @type {Object<string, Object<string, import(\"ol/xml.js\").Parser>>}\n */\n// @ts-ignore\nconst TEMPORAL_OPERANDS_PARSERS = makeStructureNS(NAMESPACE_URIS, {\n 'TemporalOperand': makeArrayPusher(readNamedOnly),\n});\n\n/**\n * @const\n * @type {Object<string, Object<string, import(\"ol/xml.js\").Parser>>}\n */\n// @ts-ignore\nconst TEMPORAL_OPERATORS_PARSERS = makeStructureNS(NAMESPACE_URIS, {\n 'TemporalOperator': makeArrayPusher(readNamedOnly),\n});\n\n/**\n * @param {Element} node Node.\n * @param {Array<*>} objectStack Object stack.\n * @return {Object|undefined} Service Identification object.\n */\nfunction readServiceIdentification(node, objectStack) {\n return pushParseAndPop({}, SERVICE_IDENTIFICATION_PARSERS, node, objectStack);\n}\n\n/**\n * @param {Element} node Node.\n * @param {Array<*>} objectStack Object stack.\n * @return {Object|undefined} Service Provider object.\n */\nfunction readServiceProvider(node, objectStack) {\n return pushParseAndPop({}, SERVICE_PROVIDER_PARSERS, node, objectStack);\n}\n\n/**\n * @param {Element} node Node.\n * @param {Array<*>} objectStack Object stack.\n * @return {Object|undefined} Operations Metadata object.\n */\nfunction readOperationsMetadata(node, objectStack) {\n return pushParseAndPop({}, OPERATIONS_METADATA_PARSERS, node, objectStack);\n}\n\n/**\n * @param {Element} node Node.\n * @param {Array<*>} objectStack Object stack.\n * @return {Object|undefined} FeatureType list.\n */\nfunction readFeatureTypeList(node, objectStack) {\n return pushParseAndPop([], FEATURE_TYPE_LIST_PARSERS, node, objectStack);\n}\n\n/**\n * @param {Element} node Node.\n * @param {Array<*>} objectStack Object stack.\n * @return {Object|undefined} Serrvice contact object.\n */\nfunction readServiceContact(node, objectStack) {\n return pushParseAndPop({}, SERVICE_CONTACT_PARSERS, node, objectStack);\n}\n\n/**\n * @param {Element} node Node.\n * @param {Array<*>} objectStack Object stack.\n * @return {Object|undefined} Contact info object.\n */\nfunction readContactInfo(node, objectStack) {\n return pushParseAndPop({}, CONTACT_INFO_PARSERS, node, objectStack);\n}\n\n/**\n * @param {Element} node Node.\n * @param {Array<*>} objectStack Object stack.\n * @return {Object|undefined} Contact Phone object.\n */\nfunction readPhone(node, objectStack) {\n return pushParseAndPop({}, PHONE_PARSERS, node, objectStack);\n}\n\n/**\n * @param {Element} node Node.\n * @param {Array<*>} objectStack Object stack.\n * @return {Object|undefined} Contact address object.\n */\nfunction readAddress(node, objectStack) {\n return pushParseAndPop({}, ADDRESS_PARSERS, node, objectStack);\n}\n\n/**\n * @param {Element} node Node.\n * @param {Array<*>} objectStack Object stack.\n * @return {Object|undefined} DCP object.\n */\nfunction readDCP(node, objectStack) {\n return pushParseAndPop({}, DCP_PARSERS, node, objectStack);\n}\n\n/**\n * @param {Element} node Node.\n * @param {Array<*>} objectStack Object stack.\n * @return {Object|undefined} Operation object.\n */\nfunction readOperation(node, objectStack) {\n return pushParseAndPop({}, OPERATION_PARSERS, node, objectStack);\n}\n\n/**\n * @param {Element} node Node.\n * @param {Array<*>} objectStack Object stack.\n * @return {Object|undefined} Parameter object.\n */\nfunction readParameter(node, objectStack) {\n return pushParseAndPop({}, PARAMETER_PARSERS, node, objectStack);\n}\n\n/**\n * @param {Element} node Node.\n * @param {Array<*>} objectStack Object stack.\n * @return {Object|undefined} Constraint object.\n */\nfunction readConstraint(node, objectStack) {\n return pushParseAndPop({}, CONSTRAINT_PARSERS, node, objectStack);\n}\n\n/**\n * @param {Element} node Node.\n * @param {Array<*>} objectStack Object stack.\n * @return {Object|undefined} HTTP object.\n */\nfunction readHTTP(node, objectStack) {\n return pushParseAndPop({}, HTTP_PARSERS, node, objectStack);\n}\n\n/**\n * @param {Element} node Node.\n * @param {Array<*>} objectStack Object stack.\n * @return {Object|undefined} Named operation object.\n */\nfunction readNamedOperation(node, objectStack) {\n const operation = readOperation(node, objectStack);\n if (operation) {\n operation['name'] = node.getAttribute('name');\n return operation;\n }\n return undefined;\n}\n\n/**\n * @param {Element} node Node.\n * @param {Array<*>} objectStack Object stack.\n * @return {Object|undefined} Named Function object.\n */\nfunction readNamedFunction(node, objectStack) {\n const func = readFunction(node, objectStack);\n if (func) {\n func['name'] = node.getAttribute('name');\n return func;\n }\n return undefined;\n}\n\n/**\n * @param {Element} node Node.\n * @param {Array<*>} objectStack Object stack.\n * @return {Object|undefined} Named argument object.\n */\nfunction readNamedArgument(node, objectStack) {\n const argument = readArgument(node, objectStack);\n if (argument) {\n argument['name'] = node.getAttribute('name');\n return argument;\n }\n return undefined;\n}\n\n/**\n * @param {Element} node Node.\n * @param {Array<*>} objectStack Object stack.\n * @return {Object|undefined} Named Parameter object.\n */\nfunction readNamedParameter(node, objectStack) {\n const parameter = readParameter(node, objectStack);\n if (parameter) {\n parameter['name'] = node.getAttribute('name');\n return parameter;\n }\n return undefined;\n}\n\n/**\n * @param {Element} node Node.\n * @param {Array<*>} objectStack Object stack.\n * @return {Object|undefined} Named Constraint object.\n */\nfunction readNamedConstraint(node, objectStack) {\n const constraint = readConstraint(node, objectStack);\n if (constraint) {\n constraint['name'] = node.getAttribute('name');\n return constraint;\n }\n return undefined;\n}\n\n/**\n * @param {Element} node Node.\n * @return {string|undefined} Node name attribute string.\n */\nfunction readNamedOnly(node) {\n return node.getAttribute('name') || undefined;\n}\n\n/**\n * @param {Element} node Node.\n * @return {Object|undefined} Named Resource Identifier object.\n */\nfunction readNamedResourceIdentifier(node) {\n return {\n name: node.getAttribute('name'),\n };\n}\n\n/**\n * @param {Element} node Node.\n * @param {Array<*>} objectStack Object stack.\n * @return {Object|undefined} WGS84 BoundingBox resource object.\n */\nfunction readWGS84BoundingBox(node, objectStack) {\n return pushParseAndPop({}, WGS84_BOUNDINGBOX_PARSERS, node, objectStack);\n}\n\n/**\n * @param {Element} node Node.\n * @param {Array<*>} objectStack Object stack.\n * @return {Array<string>|undefined} Keyword list.\n */\nfunction readKeywordList(node, objectStack) {\n return pushParseAndPop([], KEYWORDLIST_PARSERS, node, objectStack);\n}\n\n/**\n * @param {Element} node Node.\n * @param {Array<*>} objectStack Object stack.\n * @return {Array<string>|undefined} Value list.\n */\nfunction readValueList(node, objectStack) {\n return pushParseAndPop([], VALUELIST_PARSERS, node, objectStack);\n}\n\n/**\n * @param {Element} node Node.\n * @param {Array<*>} objectStack Object stack.\n * @return {Object|undefined} FeatureTyoe object.\n */\nfunction readFeatureType(node, objectStack) {\n return pushParseAndPop({}, FEATURE_TYPE_PARSERS, node, objectStack);\n}\n\n/**\n * @param {Element} node Node.\n * @param {Array<*>} objectStack Object stack.\n * @return {Object|undefined} FilterCapabilities object.\n */\nfunction readFilter_Capabilities(node, objectStack) {\n return pushParseAndPop({}, FILTER_CAPABILITIES_PARSERS, node, objectStack);\n}\n\n/**\n * @param {Element} node Node.\n * @param {Array<*>} objectStack Object stack.\n * @return {Object|undefined} Conformance object.\n */\nfunction readConformance(node, objectStack) {\n return pushParseAndPop({}, CONFORMANCE_PARSERS, node, objectStack);\n}\n\n/**\n * @param {Element} node Node.\n * @param {Array<*>} objectStack Object stack.\n * @return {Object|undefined} Id Capabilities object.\n */\nfunction readId_Capabilities(node, objectStack) {\n return pushParseAndPop({}, ID_CAPABILITIES_PARSERS, node, objectStack);\n}\n\n/**\n * @param {Element} node Node.\n * @param {Array<*>} objectStack Object stack.\n * @return {Object|undefined} Scalar Capabilities object.\n */\nfunction readScalarCapabilities(node, objectStack) {\n return pushParseAndPop({}, SCALAR_CAPABILITIES_PARSERS, node, objectStack);\n}\n\n/**\n * @param {Element} node Node.\n * @param {Array<*>} objectStack Object stack.\n * @return {Object|undefined} Spatial Capabilities object.\n */\nfunction readSpatialCapabilities(node, objectStack) {\n return pushParseAndPop({}, SPATIAL_CAPABILITIES_PARSERS, node, objectStack);\n}\n\n/**\n * @param {Element} node Node.\n * @param {Array<*>} objectStack Object stack.\n * @return {Object|undefined} Temporal Capabilities object.\n */\nfunction readTemporalCapabilities(node, objectStack) {\n return pushParseAndPop({}, TEMPORAL_CAPABILITIES_PARSERS, node, objectStack);\n}\n\n/**\n * @param {Element} node Node.\n * @param {Array<*>} objectStack Object stack.\n * @return {Array<string>|undefined} Functions array.\n */\nfunction readFunctions(node, objectStack) {\n return pushParseAndPop([], FUNCTIONS_PARSERS, node, objectStack);\n}\n\n/**\n * @param {Element} node Node.\n * @param {Array<*>} objectStack Object stack.\n * @return {Object|undefined} Function object.\n */\nfunction readFunction(node, objectStack) {\n return pushParseAndPop({}, FUNCTION_PARSERS, node, objectStack);\n}\n\n/**\n * @param {Element} node Node.\n * @param {Array<*>} objectStack Object stack.\n * @return {Array<string>|undefined} Logical Operators array.\n */\nfunction readLogicalOperators(node, objectStack) {\n return pushParseAndPop([], LOGICAL_OPERATORS_PARSERS, node, objectStack);\n}\n\n/**\n * @param {Element} node Node.\n * @param {Array<*>} objectStack Object stack.\n * @return {Array<string>|undefined} Comparison Operators array.\n */\nfunction readComparisonOperators(node, objectStack) {\n return pushParseAndPop([], COMPARISON_OPERATORS_PARSERS, node, objectStack);\n}\n\n/**\n * @param {Element} node Node.\n * @param {Array<*>} objectStack Object stack.\n * @return {Array<string>|undefined} Geometry Operands array.\n */\nfunction readGeometryOperands(node, objectStack) {\n return pushParseAndPop([], GEOMETRY_OPERANDS_PARSERS, node, objectStack);\n}\n\n/**\n * @param {Element} node Node.\n * @param {Array<*>} objectStack Object stack.\n * @return {Array<string>|undefined} Spatials Operators array.\n */\nfunction readSpatialOperators(node, objectStack) {\n return pushParseAndPop([], SPATIAL_OPERATORS_PARSERS, node, objectStack);\n}\n\n/**\n * @param {Element} node Node.\n * @param {Array<*>} objectStack Object stack.\n * @return {Array<string>|undefined} Temporal Operands array.\n */\nfunction readTemporalOperands(node, objectStack) {\n return pushParseAndPop([], TEMPORAL_OPERANDS_PARSERS, node, objectStack);\n}\n\n/**\n * @param {Element} node Node.\n * @param {Array<*>} objectStack Object stack.\n * @return {Array<string>|undefined} Temporal Operators array.\n */\nfunction readTemporalOperators(node, objectStack) {\n return pushParseAndPop([], TEMPORAL_OPERATORS_PARSERS, node, objectStack);\n}\n\n/**\n * @param {Element} node Node.\n * @param {Array<*>} objectStack Object stack.\n * @return {Array<string>|undefined} Arguments array.\n */\nfunction readArguments(node, objectStack) {\n return pushParseAndPop([], ARGUMENTS_PARSERS, node, objectStack);\n}\n\n/**\n * @param {Element} node Node.\n * @param {Array<*>} objectStack Object stack.\n * @return {Object|undefined} Argument object.\n */\nfunction readArgument(node, objectStack) {\n return pushParseAndPop({}, ARGUMENT_PARSERS, node, objectStack);\n}\n\n/**\n * @param {Element} node Node.\n * @return {Array<number>|undefined} Coordinates array.\n */\nfunction readStringCoords(node) {\n const coords = getAllTextContent(node, false).split(' ');\n if (coords.length) {\n return coords.map((c) => Number(c));\n }\n return undefined;\n}\n\nexport default WFSCapabilities;\n","// Ol\r\nimport BaseObject, { ObjectEvent } from 'ol/Object.js';\r\nimport { Types as ObjectEventTypes } from 'ol/ObjectEventType.js';\r\n\r\nimport { ProjectionLike } from 'ol/proj.js';\r\nimport Circle from 'ol/geom/Circle.js';\r\nimport Geometry from 'ol/geom/Geometry.js';\r\nimport GeometryCollection from 'ol/geom/GeometryCollection.js';\r\nimport Feature from 'ol/Feature.js';\r\n\r\nimport GeoJSON from 'ol/format/GeoJSON.js';\r\nimport KML from 'ol/format/KML.js';\r\nimport WFS from 'ol/format/WFS.js';\r\n\r\nimport { State } from 'ol/source/Source.js';\r\nimport { fromCircle } from 'ol/geom/Polygon.js';\r\nimport BaseEvent from 'ol/events/Event.js';\r\nimport { CombinedOnSignature, EventTypes, OnSignature } from 'ol/Observable.js';\r\nimport { EventsKey } from 'ol/events.js';\r\nimport { TransactionResponse } from 'ol/format/WFS.js';\r\n\r\nimport WFSCapabilities from 'ol-wfs-capabilities';\r\n\r\nimport { showLoading } from './modules/loading';\r\nimport { parseError, showError } from './modules/errors';\r\nimport {\r\n getMap,\r\n getStoredLayer,\r\n removeFeatureFromEditList\r\n} from './modules/state';\r\nimport { getEditLayer } from './modules/editLayer';\r\nimport { deepObjectAssign } from './modules/helpers';\r\nimport { I18N } from './modules/i18n';\r\nimport { GeometryType, TransactionType } from './@enums';\r\nimport WmsLayer from './WmsLayer';\r\n\r\n// https://docs.geoserver.org/latest/en/user/services/wfs/axis_order.html\r\n// Axis ordering: latitude/longitude\r\nconst DEFAULT_GEOSERVER_SRS = 'EPSG:3857';\r\nconst parser = new WFSCapabilities();\r\n\r\n/**\r\n * @fires change:capabilities\r\n * @extends {ol/Object~BaseObject}\r\n * @param options\r\n */\r\nexport default class Geoserver extends BaseObject {\r\n protected _options: GeoserverOptions;\r\n\r\n protected _countRequests: number;\r\n protected _insertFeatures: Array<Feature<Geometry>>;\r\n protected _updateFeatures: Array<Feature<Geometry>>;\r\n protected _deleteFeatures: Array<Feature<Geometry>>;\r\n\r\n // Lock id returned by the server in the LockFeature response. Defaults to\r\n // the configured lockId and is overwritten with the real server one when\r\n // it can be parsed\r\n protected _lockedId: string;\r\n\r\n // Formats\r\n protected _formatWFS: WFS;\r\n protected _formatGeoJSON: GeoJSON;\r\n protected _formatKml: KML;\r\n protected _xs: XMLSerializer;\r\n\r\n protected state_: State;\r\n\r\n declare on: OnSignature<EventTypes, BaseEvent, EventsKey> &\r\n OnSignature<\r\n GeoserverEventTypes | ObjectEventTypes,\r\n ObjectEvent,\r\n EventsKey\r\n > &\r\n CombinedOnSignature<\r\n GeoserverEventTypes | ObjectEventTypes | EventTypes,\r\n EventsKey\r\n >;\r\n\r\n declare once: OnSignature<EventTypes, BaseEvent, EventsKey> &\r\n OnSignature<\r\n GeoserverEventTypes | ObjectEventTypes,\r\n ObjectEvent,\r\n EventsKey\r\n > &\r\n CombinedOnSignature<\r\n GeoserverEventTypes | ObjectEventTypes | EventTypes,\r\n EventsKey\r\n >;\r\n\r\n declare un: OnSignature<EventTypes, BaseEvent, void> &\r\n OnSignature<GeoserverEventTypes | ObjectEventTypes, ObjectEvent, void> &\r\n CombinedOnSignature<\r\n GeoserverEventTypes | ObjectEventTypes | EventTypes,\r\n void\r\n >;\r\n\r\n constructor(options: GeoserverOptions) {\r\n super();\r\n\r\n const defaults = {\r\n url: null,\r\n advanced: {\r\n getCapabilitiesVersion: '2.0.0',\r\n getFeatureVersion: '1.0.0',\r\n describeFeatureTypeVersion: '1.1.0',\r\n lockFeatureVersion: '1.1.0',\r\n wfsTransactionVersion: '1.1.0',\r\n projection: DEFAULT_GEOSERVER_SRS,\r\n lockFeatureParams: {\r\n expiry: 5, // minutes\r\n lockId: 'WFST-editor',\r\n releaseAction: 'SOME'\r\n }\r\n },\r\n headers: {},\r\n credentials: 'same-origin',\r\n useLockFeature: true\r\n };\r\n\r\n this._options = deepObjectAssign(defaults, options);\r\n\r\n this.setAdvanced(this._options.advanced);\r\n this.setHeaders(this._options.headers);\r\n this.setCredentials(this._options.credentials);\r\n this.setUrl(this._options.url);\r\n this.setUseLockFeature(this._options.useLockFeature);\r\n\r\n this._countRequests = 0;\r\n\r\n this._insertFeatures = [];\r\n this._updateFeatures = [];\r\n this._deleteFeatures = [];\r\n\r\n this._lockedId = this._options.advanced.lockFeatureParams.lockId;\r\n\r\n // Formats\r\n this._formatWFS = new WFS();\r\n\r\n this._formatGeoJSON = new GeoJSON();\r\n this._formatKml = new KML({\r\n extractStyles: false,\r\n showPointNames: false\r\n });\r\n this._xs = new XMLSerializer();\r\n\r\n this.getAndUpdateCapabilities();\r\n\r\n this.on('change:parsedCapabilities', () => {\r\n this._checkGeoserverCapabilities();\r\n });\r\n }\r\n\r\n /**\r\n *\r\n * @returns\r\n * @public\r\n */\r\n getCapabilities(): XMLDocument {\r\n return this.get(GeoserverProperty.CAPABILITIES);\r\n }\r\n\r\n /**\r\n * Only work for `2.0.0` getCapabilities version\r\n * @returns\r\n * @public\r\n */\r\n getParsedCapabilities(): any {\r\n return this.get(GeoserverProperty.PARSED_CAPABILITIES);\r\n }\r\n\r\n /**\r\n *\r\n * @param url\r\n * @param opt_silent\r\n * @public\r\n */\r\n setUrl(url: string, opt_silent = false): void {\r\n this.set(GeoserverProperty.URL, url, opt_silent);\r\n }\r\n\r\n /**\r\n *\r\n * @returns\r\n */\r\n getUrl(): string {\r\n return this.get(GeoserverProperty.URL);\r\n }\r\n\r\n /**\r\n *\r\n * @param headers\r\n * @param opt_silent\r\n * @returns\r\n * @public\r\n */\r\n setHeaders(headers: HeadersInit = {}, opt_silent = false): void {\r\n return this.set(GeoserverProperty.HEADERS, headers, opt_silent);\r\n }\r\n\r\n /**\r\n *\r\n * @returns\r\n * @public\r\n */\r\n getHeaders(): HeadersInit {\r\n return this.get(GeoserverProperty.HEADERS);\r\n }\r\n\r\n /**\r\n *\r\n * @param credentials\r\n * @param opt_silent\r\n * @public\r\n */\r\n setCredentials(\r\n credentials: RequestCredentials = null,\r\n opt_silent = false\r\n ): void {\r\n this.set(GeoserverProperty.CREDENTIALS, credentials, opt_silent);\r\n }\r\n\r\n /**\r\n *\r\n * @returns\r\n * @public\r\n */\r\n getCredentials(): RequestCredentials {\r\n return this.get(GeoserverProperty.CREDENTIALS);\r\n }\r\n\r\n /**\r\n *\r\n * @returns\r\n * @public\r\n */\r\n setAdvanced(advanced: GeoServerAdvanced = {}, opt_silent = false): void {\r\n this.set(GeoserverProperty.ADVANCED, advanced, opt_silent);\r\n }\r\n\r\n /**\r\n *\r\n * @returns\r\n * @public\r\n */\r\n getAdvanced(): GeoServerAdvanced {\r\n return this.get(GeoserverProperty.ADVANCED);\r\n }\r\n\r\n /**\r\n *\r\n * @returns\r\n * @public\r\n */\r\n hasTransaction(): boolean {\r\n return this.get(GeoserverProperty.HASTRASNACTION);\r\n }\r\n\r\n /**\r\n *\r\n * @returns\r\n * @public\r\n */\r\n hasLockFeature(): boolean {\r\n return this.get(GeoserverProperty.HASLOCKFEATURE);\r\n }\r\n\r\n /**\r\n *\r\n * @returns\r\n * @public\r\n */\r\n getUseLockFeature(): boolean {\r\n return this.get(GeoserverProperty.USELOCKFEATURE);\r\n }\r\n\r\n /**\r\n *\r\n * @returns\r\n * @public\r\n */\r\n setUseLockFeature(useLockFeature: boolean, opt_silent = false): void {\r\n this.set(GeoserverProperty.USELOCKFEATURE, useLockFeature, opt_silent);\r\n }\r\n\r\n /**\r\n *\r\n * @returns\r\n * @public\r\n */\r\n isLoaded(): boolean {\r\n return this.get(GeoserverProperty.ISLOADED);\r\n }\r\n\r\n /**\r\n *\r\n * @returns\r\n */\r\n getState() {\r\n return this.state_;\r\n }\r\n\r\n /**\r\n * Get the capabilities from the GeoServer and check\r\n * all the available operations.\r\n *\r\n * @fires getcapabilities\r\n * @public\r\n */\r\n async getAndUpdateCapabilities(): Promise<XMLDocument> {\r\n try {\r\n const params = new URLSearchParams({\r\n service: 'wfs',\r\n version: this.getAdvanced().getCapabilitiesVersion,\r\n request: 'GetCapabilities',\r\n exceptions: 'application/json'\r\n });\r\n\r\n const url_fetch = this.getUrl() + '?' + params.toString();\r\n\r\n const response = await fetch(url_fetch, {\r\n headers: this.getHeaders(),\r\n credentials: this.getCredentials()\r\n });\r\n\r\n if (!response.ok) {\r\n throw new Error('');\r\n }\r\n\r\n const data = await response.text();\r\n const capabilities = new window.DOMParser().parseFromString(\r\n data,\r\n 'text/xml'\r\n );\r\n\r\n this.set(GeoserverProperty.CAPABILITIES, capabilities);\r\n\r\n const parsedCapabilities = parser.read(data);\r\n\r\n this.set(GeoserverProperty.PARSED_CAPABILITIES, parsedCapabilities);\r\n\r\n this.state_ = capabilities ? 'ready' : 'error';\r\n\r\n return capabilities;\r\n } catch (err) {\r\n console.error(err);\r\n const msg =\r\n typeof err === 'string' ? err : I18N.errors.capabilities;\r\n showError(msg, err);\r\n }\r\n }\r\n\r\n /**\r\n *\r\n * @private\r\n */\r\n _checkGeoserverCapabilities() {\r\n if (this.getAdvanced().getCapabilitiesVersion === '2.0.0') {\r\n // Available operations in the geoserver\r\n const operations: Array<any> =\r\n this.getParsedCapabilities()?.OperationsMetadata?.Operation;\r\n\r\n if (operations) {\r\n operations.forEach((operation) => {\r\n if (operation.name === 'Transaction') {\r\n this.set(GeoserverProperty.HASTRASNACTION, true);\r\n } else if (operation.name === 'LockFeature') {\r\n this.set(GeoserverProperty.HASLOCKFEATURE, true);\r\n } else if (operation.name === 'DescribeFeatureType') {\r\n this.set(\r\n GeoserverProperty.HASDESCRIBEFEATURETYPE,\r\n true\r\n );\r\n }\r\n });\r\n }\r\n } else {\r\n const operations: HTMLCollectionOf<Element> =\r\n this.getCapabilities().getElementsByTagName('ows:Operation');\r\n\r\n Array.from(operations).forEach((operation) => {\r\n if (operation.getAttribute('name') === 'Transaction') {\r\n this.set(GeoserverProperty.HASTRASNACTION, true);\r\n } else if (operation.getAttribute('name') === 'LockFeature') {\r\n this.set(GeoserverProperty.HASLOCKFEATURE, true);\r\n } else if (\r\n operation.getAttribute('name') === 'DescribeFeatureType'\r\n ) {\r\n this.set(GeoserverProperty.HASDESCRIBEFEATURETYPE, true);\r\n }\r\n });\r\n }\r\n\r\n if (!this.hasTransaction()) {\r\n throw I18N.errors.wfst;\r\n }\r\n }\r\n\r\n /**\r\n * Make the WFS Transactions\r\n *\r\n * @param transactionType\r\n * @param features\r\n * @param layerName\r\n * @private\r\n */\r\n async transact(\r\n transactionType: TransactionType,\r\n features: Array<Feature<Geometry>> | Feature<Geometry>,\r\n layerName: string\r\n ): Promise<TransactionResponse | false> {\r\n features = (\r\n Array.isArray(features) ? features : [features]\r\n ) as Feature<Geometry>[];\r\n const clonedFeatures = [];\r\n const geoLayer = getStoredLayer(layerName);\r\n\r\n for (const feature of features) {\r\n let clone = this._cloneFeature(feature);\r\n const cloneGeom = clone.getGeometry();\r\n\r\n // Ugly fix to support GeometryCollection on GML\r\n // See https://github.com/openlayers/openlayers/issues/4220\r\n if (cloneGeom instanceof GeometryCollection) {\r\n this._transformGeoemtryCollectionToGeometries(\r\n clone,\r\n cloneGeom as GeometryCollection\r\n );\r\n } else if (cloneGeom instanceof Circle) {\r\n // Geoserver has no Support to Circles\r\n this._transformCircleToPolygon(clone, cloneGeom as Circle);\r\n }\r\n\r\n // Filters\r\n if (\r\n 'beforeTransactFeature' in geoLayer &&\r\n typeof geoLayer.beforeTransactFeature === 'function'\r\n ) {\r\n clone = geoLayer.beforeTransactFeature(clone, transactionType);\r\n }\r\n\r\n if (clone) {\r\n clonedFeatures.push(clone);\r\n }\r\n }\r\n\r\n if (!clonedFeatures.length) {\r\n showError(I18N.errors.noValidGeometry);\r\n return false;\r\n }\r\n\r\n switch (transactionType) {\r\n case TransactionType.Insert:\r\n this._insertFeatures = [\r\n ...this._insertFeatures,\r\n ...clonedFeatures\r\n ];\r\n break;\r\n case TransactionType.Update:\r\n this._updateFeatures = [\r\n ...this._updateFeatures,\r\n ...clonedFeatures\r\n ];\r\n break;\r\n case TransactionType.Delete:\r\n this._deleteFeatures = [\r\n ...this._deleteFeatures,\r\n ...clonedFeatures\r\n ];\r\n break;\r\n default:\r\n break;\r\n }\r\n\r\n this._countRequests++;\r\n const numberRequest = this._countRequests;\r\n\r\n return new Promise((resolve, reject) => {\r\n setTimeout(async () => {\r\n try {\r\n // Prevent fire multiples times\r\n if (numberRequest !== this._countRequests) {\r\n return;\r\n }\r\n\r\n let srs = getMap().getView().getProjection().getCode();\r\n\r\n // Force latitude/longitude order on transactions\r\n // EPSG:4326 is longitude/latitude (assumption) and is not managed correctly by GML3\r\n srs =\r\n srs === 'EPSG:4326'\r\n ? 'urn:x-ogc:def:crs:EPSG:4326'\r\n : srs;\r\n\r\n if (!geoLayer || !geoLayer.getDescribeFeatureType()) {\r\n throw new Error(\r\n `${I18N.errors.layerNotFound}: \"${layerName}\"`\r\n );\r\n }\r\n\r\n const describeFeatureType =\r\n geoLayer.getDescribeFeatureType()._parsed;\r\n\r\n const layerNameClean =\r\n layerName.split(':').length > 1\r\n ? layerName.split(':').pop()\r\n : layerName;\r\n\r\n const options = {\r\n featureNS: describeFeatureType.namespace,\r\n featureType: layerNameClean,\r\n srsName: srs,\r\n featurePrefix: null,\r\n nativeElements: null,\r\n version: this.getAdvanced().wfsTransactionVersion\r\n };\r\n\r\n const transaction = this._formatWFS.writeTransaction(\r\n this._insertFeatures,\r\n this._updateFeatures,\r\n this._deleteFeatures,\r\n options\r\n );\r\n\r\n let payload = this._xs.serializeToString(transaction);\r\n const geomType = describeFeatureType.geomType;\r\n const geomField = describeFeatureType.geomField;\r\n\r\n // Ugly fix to support GeometryCollection on GML\r\n // See https://github.com/openlayers/openlayers/issues/4220\r\n if (geomType === GeometryType.GeometryCollection) {\r\n if (transactionType === TransactionType.Insert) {\r\n payload = payload.replace(\r\n /<geometry>/g,\r\n `<geometry><MultiGeometry xmlns=\"http://www.opengis.net/gml\" srsName=\"${srs}\"><geometryMember>`\r\n );\r\n payload = payload.replace(\r\n /<\\/geometry>/g,\r\n `</geometryMember></MultiGeometry></geometry>`\r\n );\r\n } else if (transactionType === TransactionType.Update) {\r\n const gmemberIn = `<MultiGeometry xmlns=\"http://www.opengis.net/gml\" srsName=\"${srs}\"><geometryMember>`;\r\n const gmemberOut = `</geometryMember></MultiGeometry>`;\r\n\r\n payload = payload.replace(\r\n /(.*)(<Name>geometry<\\/Name><Value>)(.*?)(<\\/Value>)(.*)/g,\r\n `$1$2${gmemberIn}$3${gmemberOut}$4$5`\r\n );\r\n }\r\n }\r\n\r\n // Fixes geometry name, weird bug with GML:\r\n // The property for the geometry column is always named \"geometry\"\r\n if (transactionType === TransactionType.Insert) {\r\n payload = payload.replace(\r\n /<(\\/?)\\bgeometry\\b>/g,\r\n `<$1${geomField}>`\r\n );\r\n } else if (transactionType === TransactionType.Update) {\r\n payload = payload.replace(\r\n /<Name>geometry<\\/Name>/g,\r\n `<Name>${geomField}</Name>`\r\n );\r\n }\r\n\r\n // This has to be te same used before\r\n if (\r\n this.hasLockFeature &&\r\n this.getUseLockFeature() &&\r\n transactionType !== TransactionType.Insert\r\n ) {\r\n payload = payload.replace(\r\n `</Transaction>`,\r\n `<LockId>${this._lockedId}</LockId></Transaction>`\r\n );\r\n }\r\n\r\n const headers = {\r\n 'Content-Type': 'text/xml',\r\n ...this.getHeaders()\r\n };\r\n\r\n const response = await fetch(this.getUrl(), {\r\n method: 'POST',\r\n body: payload,\r\n headers: headers,\r\n credentials: this._options.credentials\r\n });\r\n\r\n if (!response.ok) {\r\n throw new Error(\r\n I18N.errors.transaction + ' ' + response.status\r\n );\r\n }\r\n\r\n const responseStr = await response.text();\r\n\r\n const parseResponse =\r\n this._formatWFS.readTransactionResponse(responseStr);\r\n\r\n const wlayer = getStoredLayer(layerName);\r\n\r\n if (!Object.keys(parseResponse).length) {\r\n const findError = String(responseStr).match(\r\n /<ows:ExceptionText>([\\s\\S]*?)<\\/ows:ExceptionText>/\r\n );\r\n\r\n if (findError) {\r\n if (wlayer instanceof WmsLayer) {\r\n this._removeFeatures(\r\n features as Feature<Geometry>[]\r\n );\r\n }\r\n // maybe remove tmp wms features here\r\n throw new Error(findError[1]);\r\n }\r\n }\r\n\r\n if (transactionType !== TransactionType.Delete) {\r\n this._removeFeatures(features as Feature<Geometry>[]);\r\n }\r\n\r\n (features as Feature<Geometry>[]).forEach((feature) => {\r\n removeFeatureFromEditList(feature);\r\n });\r\n\r\n wlayer.refresh();\r\n\r\n showLoading(false);\r\n\r\n this._insertFeatures = [];\r\n this._updateFeatures = [];\r\n this._deleteFeatures = [];\r\n\r\n this._countRequests = 0;\r\n\r\n resolve(parseResponse);\r\n } catch (err) {\r\n showError(err.message, err);\r\n showLoading(false);\r\n this._countRequests = 0;\r\n reject();\r\n }\r\n }, 0);\r\n });\r\n }\r\n\r\n /**\r\n * @privatwe\r\n */\r\n _removeFeatures(features: Feature<Geometry>[]) {\r\n for (const feature of features as Array<Feature<Geometry>>) {\r\n getEditLayer().getSource().removeFeature(feature);\r\n }\r\n }\r\n /**\r\n *\r\n * @param feature\r\n * @param geom\r\n * @private\r\n */\r\n _transformCircleToPolygon(feature: Feature<Geometry>, geom: Circle) {\r\n const geomConverted = fromCircle(geom);\r\n feature.setGeometry(geomConverted);\r\n }\r\n\r\n /**\r\n *\r\n * @param feature\r\n * @private\r\n * @param geom\r\n */\r\n _transformGeoemtryCollectionToGeometries(\r\n feature: Feature<Geometry>,\r\n geom: GeometryCollection\r\n ) {\r\n let geomConverted = geom.getGeometries()[0];\r\n\r\n if (geomConverted instanceof Circle) {\r\n geomConverted = fromCircle(geomConverted);\r\n }\r\n\r\n feature.setGeometry(geomConverted);\r\n }\r\n\r\n /**\r\n *\r\n * @param feature\r\n * @returns\r\n * @private\r\n */\r\n _cloneFeature(feature: Feature<Geometry>): Feature<Geometry> {\r\n removeFeatureFromEditList(feature);\r\n\r\n const featureProperties = feature.getProperties();\r\n\r\n delete featureProperties.boundedBy;\r\n delete featureProperties._layerName_;\r\n delete featureProperties._editOverlayCoord_;\r\n\r\n const clone = new Feature(featureProperties);\r\n clone.setId(feature.getId());\r\n\r\n return clone;\r\n }\r\n\r\n /**\r\n * Lock one or several features in the geoserver. Useful before editing,\r\n * to avoid changes from multiples users. Locking several features at once\r\n * with a single request keeps the lock covered by one LockId\r\n *\r\n * @param featureIds\r\n * @param layerName\r\n * @param retry\r\n * @public\r\n */\r\n async lockFeature(\r\n featureIds: string | number | Array<string | number>,\r\n layerName: string,\r\n retry = 0\r\n ): Promise<string> {\r\n const params = new URLSearchParams({\r\n service: 'wfs',\r\n version: this.getAdvanced().lockFeatureVersion,\r\n request: 'LockFeature',\r\n typeName: layerName,\r\n expiry: String(this._options.advanced.lockFeatureParams.expiry),\r\n handle: this._options.advanced.lockFeatureParams.lockId,\r\n releaseAction:\r\n this._options.advanced.lockFeatureParams.releaseAction,\r\n exceptions: 'application/json',\r\n featureid: Array.isArray(featureIds)\r\n ? featureIds.join(',')\r\n : String(featureIds)\r\n });\r\n\r\n const url_fetch = this.getUrl() + '?' + params.toString();\r\n\r\n try {\r\n const response = await fetch(url_fetch, {\r\n headers: this._options.headers,\r\n credentials: this._options.credentials\r\n });\r\n\r\n if (!response.ok) {\r\n throw new Error(I18N.errors.lockFeature);\r\n }\r\n\r\n const data = await response.text();\r\n\r\n try {\r\n // First, check if is a JSON (with errors)\r\n const dataParsed = JSON.parse(data);\r\n\r\n if ('exceptions' in dataParsed) {\r\n const error = new Error(parseError(dataParsed));\r\n\r\n const exceptions = dataParsed.exceptions;\r\n if (exceptions[0].code === 'CannotLockAllFeatures') {\r\n // Maybe the Feature is already blocked, ant thats trigger error, so, we try one locking more time again\r\n if (!retry) {\r\n this.lockFeature(featureIds, layerName, 1);\r\n } else {\r\n throw error;\r\n }\r\n } else {\r\n throw error;\r\n }\r\n }\r\n } catch (err) {\r\n // XML response (not JSON): parse the real lock id returned by\r\n // the server so the transaction references the lock that was\r\n // actually created instead of the configured one\r\n try {\r\n const dataDoc = new window.DOMParser().parseFromString(\r\n data,\r\n 'text/xml'\r\n );\r\n\r\n const lockIdNode =\r\n dataDoc.getElementsByTagName('wfs:LockId')[0] ||\r\n dataDoc.getElementsByTagNameNS(\r\n 'http://www.opengis.net/wfs',\r\n 'LockId'\r\n )[0];\r\n\r\n if (lockIdNode && lockIdNode.textContent) {\r\n this._lockedId = lockIdNode.textContent;\r\n }\r\n } catch (parseErr) {\r\n // Keep the configured lockId\r\n }\r\n }\r\n\r\n return data;\r\n } catch (err) {\r\n showError(err.message, err);\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * **_[interface]_**\r\n * @public\r\n */\r\nexport interface GeoserverOptions {\r\n /**\r\n * Url for OWS services. This endpoint will recive the WFS, WFST and WMS requests\r\n *\r\n */\r\n url: string;\r\n\r\n /**\r\n * Advanced options for geoserver requests\r\n *\r\n */\r\n advanced?: GeoServerAdvanced;\r\n\r\n /**\r\n * Http headers for GeoServer requests\r\n * https://developer.mozilla.org/en-US/docs/Web/API/Request/headers\r\n *\r\n */\r\n headers?: HeadersInit;\r\n\r\n /**\r\n * Credentials for fetch requests\r\n * https://developer.mozilla.org/en-US/docs/Web/API/Request/credentials\r\n *\r\n * Default is 'same-origin'\r\n */\r\n credentials?: RequestCredentials;\r\n\r\n /**\r\n * Use LockFeatue request on GeoServer when selecting features. Prevents a feature from being edited\r\n * through a persistent feature lock. This is not always supportedd by the GeoServer.\r\n * See https://docs.geoserver.org/stable/en/user/services/wfs/reference.html\r\n */\r\n useLockFeature?: boolean;\r\n}\r\n\r\n/**\r\n * **_[interface]_**\r\n *\r\n * * Default values:\r\n * ```javascript\r\n * {\r\n * getCapabilitiesVersion: '2.0.0',\r\n * getFeatureVersion: '1.0.0',\r\n * describeFeatureTypeVersion: '1.1.0',\r\n * lockFeatureVersion: '1.1.0',\r\n * wfsTransactionVersion: '1.1.0',\r\n * projection: 'EPSG:3857',\r\n * lockFeatureParams: {\r\n * expiry: 5,\r\n * lockId: 'Geoserver',\r\n * releaseAction: 'SOME'\r\n * }\r\n * }\r\n * @public\r\n */\r\nexport interface GeoServerAdvanced {\r\n getCapabilitiesVersion?: string;\r\n getFeatureVersion?: string;\r\n lockFeatureVersion?: string;\r\n describeFeatureTypeVersion?: string;\r\n wfsTransactionVersion?: string;\r\n projection?: ProjectionLike;\r\n lockFeatureParams?: {\r\n // 5 (minutes) by default\r\n expiry?: number | string;\r\n\r\n // 'Geoserver' by default\r\n lockId?: string;\r\n\r\n // 'SOME' by default\r\n releaseAction?: string;\r\n };\r\n}\r\n\r\nexport enum GeoserverProperty {\r\n CAPABILITIES = 'capabilities',\r\n PARSED_CAPABILITIES = 'parsedCapabilities',\r\n URL = 'url',\r\n HEADERS = 'headers',\r\n CREDENTIALS = 'credentials',\r\n ADVANCED = 'advanced',\r\n HASTRASNACTION = 'hasTransaction',\r\n HASLOCKFEATURE = 'hasLockFeature',\r\n HASDESCRIBEFEATURETYPE = 'hasDescribeFeatureType',\r\n USELOCKFEATURE = 'useLockFeature',\r\n ISLOADED = 'isLoaded'\r\n}\r\n\r\nexport type GeoserverEventTypes =\r\n | `change:${GeoserverProperty.CAPABILITIES}`\r\n | `change:${GeoserverProperty.PARSED_CAPABILITIES}`\r\n | `change:${GeoserverProperty.URL}`\r\n | `change:${GeoserverProperty.HEADERS}`\r\n | `change:${GeoserverProperty.CREDENTIALS}`\r\n | `change:${GeoserverProperty.ADVANCED}`\r\n | `change:${GeoserverProperty.HASTRASNACTION}`\r\n | `change:${GeoserverProperty.HASLOCKFEATURE}`\r\n | `change:${GeoserverProperty.HASDESCRIBEFEATURETYPE}`\r\n | `change:${GeoserverProperty.USELOCKFEATURE}`\r\n | `change:${GeoserverProperty.ISLOADED}`;\r\n","import { getCenter } from 'ol/extent.js';\r\nimport Geometry from 'ol/geom/Geometry.js';\r\nimport Feature from 'ol/Feature.js';\r\nimport Overlay from 'ol/Overlay.js';\r\nimport { Coordinate } from 'ol/coordinate.js';\r\n\r\n// Images\r\nimport editFieldsSvg from '../assets/images/editFields.svg';\r\nimport editGeomSvg from '../assets/images/editGeom.svg';\r\nimport { I18N } from './i18n';\r\n\r\nexport default class EditOverlay extends Overlay {\r\n constructor(\r\n feature: Feature<Geometry> | null = null,\r\n coordinate: Coordinate = null,\r\n id?: string | number\r\n ) {\r\n super({\r\n id: id ?? (feature ? feature.getId() : undefined),\r\n position:\r\n coordinate ||\r\n (feature\r\n ? getCenter(feature.getGeometry().getExtent())\r\n : undefined),\r\n positioning: 'center-center',\r\n offset: [0, -40],\r\n stopEvent: true,\r\n element: (\r\n <div>\r\n <div\r\n className=\"ol-wfst--edit-button-cnt\"\r\n onClick={() => {\r\n this.dispatchEvent('editFields');\r\n }}\r\n >\r\n <button\r\n className=\"ol-wfst--edit-button\"\r\n type=\"button\"\r\n title={I18N.labels.editFields}\r\n >\r\n {editFieldsSvg()}\r\n </button>\r\n </div>\r\n <div\r\n className=\"ol-wfst--edit-button-cnt\"\r\n onClick={() => {\r\n this.dispatchEvent('editGeom');\r\n }}\r\n >\r\n <button\r\n class=\"ol-wfst--edit-button\"\r\n type=\"button\"\r\n title={I18N.labels.editGeom}\r\n >\r\n {editGeomSvg()}\r\n </button>\r\n </div>\r\n </div>\r\n )\r\n });\r\n }\r\n}\r\n","import Overlay from 'ol/Overlay.js';\r\nimport Geometry from 'ol/geom/Geometry.js';\r\nimport Feature from 'ol/Feature.js';\r\nimport { Coordinate } from 'ol/coordinate.js';\r\n\r\n// Images\r\nimport addLineSvg from '../assets/images/addLine.svg';\r\nimport { I18N } from './i18n';\r\n\r\nexport type ExtendLineSide = 'start' | 'end';\r\n\r\nexport default class ExtendLineOverlay extends Overlay {\r\n feature: Feature<Geometry>;\r\n side: ExtendLineSide;\r\n component: number;\r\n\r\n constructor(\r\n feature: Feature<Geometry>,\r\n coordinate: Coordinate,\r\n side: ExtendLineSide,\r\n component = 0,\r\n onClick: (side: ExtendLineSide) => void\r\n ) {\r\n super({\r\n position: coordinate,\r\n positioning: 'center-center',\r\n stopEvent: true,\r\n element: (\r\n <div className=\"ol-wfst--extend-button-cnt\">\r\n <button\r\n className=\"ol-wfst--extend-button\"\r\n type=\"button\"\r\n title={I18N.labels.continueLine}\r\n onClick={() => {\r\n onClick(side);\r\n }}\r\n >\r\n {addLineSvg()}\r\n </button>\r\n </div>\r\n )\r\n });\r\n\r\n this.feature = feature;\r\n this.side = side;\r\n this.component = component;\r\n }\r\n}\r\n","import { getCenter } from 'ol/extent.js';\r\nimport Geometry from 'ol/geom/Geometry.js';\r\nimport Feature from 'ol/Feature.js';\r\nimport Overlay from 'ol/Overlay.js';\r\nimport { Coordinate } from 'ol/coordinate.js';\r\n\r\nimport { I18N } from './i18n';\r\nimport { BaseLayerProperty } from './base/BaseLayer';\r\n\r\nconst QUERY_OVERLAY_ID = 'ol-wfst--query-overlay';\r\n\r\n/**\r\n * Popup overlay that shows the attributes of a queried feature and its\r\n * layer label. The geometry is highlighted separately on a dedicated layer.\r\n *\r\n * @extends {ol/Overlay~Overlay}\r\n * @param feature\r\n * @param coordinate\r\n * @param layer\r\n * @private\r\n */\r\nexport default class QueryOverlay extends Overlay {\r\n constructor(\r\n feature: Feature<Geometry>,\r\n coordinate: Coordinate,\r\n layer: { getDescribeFeatureType: () => any; get: (key: string) => any }\r\n ) {\r\n const describeFeatureType = layer.getDescribeFeatureType();\r\n const parsed = describeFeatureType?._parsed;\r\n const fields = parsed?.properties || [];\r\n const geomField = parsed?.geomField;\r\n\r\n const rows = fields\r\n .filter((field: { name: string }) => field.name !== geomField)\r\n .map((field: { name: string }) => {\r\n let value = feature.get(field.name);\r\n\r\n if (value === undefined || value === null) {\r\n value = '';\r\n } else if (typeof value === 'object') {\r\n value = JSON.stringify(value);\r\n }\r\n\r\n return (\r\n <div className=\"ol-wfst--query-popup-row\">\r\n <span className=\"ol-wfst--query-popup-key\">\r\n {field.name}\r\n </span>\r\n <span className=\"ol-wfst--query-popup-value\">\r\n {String(value)}\r\n </span>\r\n </div>\r\n );\r\n });\r\n\r\n super({\r\n id: QUERY_OVERLAY_ID,\r\n position:\r\n coordinate || getCenter(feature.getGeometry().getExtent()),\r\n positioning: 'bottom-center',\r\n offset: [0, -14],\r\n stopEvent: true,\r\n autoPan: true,\r\n element: (\r\n <div className=\"ol-wfst--query-popup\">\r\n <div className=\"ol-wfst--query-popup-head\">\r\n <div className=\"ol-wfst--query-popup-title\">\r\n {I18N.labels.featureInfo}\r\n </div>\r\n <button\r\n className=\"ol-wfst--query-popup-close\"\r\n type=\"button\"\r\n title={I18N.labels.close}\r\n onClick={() => {\r\n this.dispatchEvent('close');\r\n }}\r\n >\r\n ×\r\n </button>\r\n </div>\r\n <div className=\"ol-wfst--query-popup-subtitle\">\r\n <b>{layer.get(BaseLayerProperty.LABEL)}</b>\r\n <i>{String(feature.getId())}</i>\r\n </div>\r\n <div className=\"ol-wfst--query-popup-body\">{rows}</div>\r\n </div>\r\n )\r\n });\r\n }\r\n}\r\n","// Ol\r\nimport Geometry from 'ol/geom/Geometry.js';\r\nimport Fill from 'ol/style/Fill.js';\r\nimport Stroke from 'ol/style/Stroke.js';\r\nimport Style from 'ol/style/Style.js';\r\nimport Control from 'ol/control/Control.js';\r\nimport FullScreen from 'ol/control/FullScreen.js';\r\nimport Draw from 'ol/interaction/Draw.js';\r\nimport DragBox from 'ol/interaction/DragBox.js';\r\nimport Modify from 'ol/interaction/Modify.js';\r\nimport Select from 'ol/interaction/Select.js';\r\nimport Snap from 'ol/interaction/Snap.js';\r\nimport Polygon from 'ol/geom/Polygon.js';\r\nimport LineString from 'ol/geom/LineString.js';\r\nimport MultiLineString from 'ol/geom/MultiLineString.js';\r\nimport GeometryCollection from 'ol/geom/GeometryCollection.js';\r\nimport MapBrowserEvent from 'ol/MapBrowserEvent.js';\r\nimport SimpleGeometry from 'ol/geom/SimpleGeometry.js';\r\nimport { EventsKey } from 'ol/events.js';\r\nimport Collection from 'ol/Collection.js';\r\nimport Feature from 'ol/Feature.js';\r\nimport Overlay from 'ol/Overlay.js';\r\nimport View from 'ol/View.js';\r\nimport VectorLayer from 'ol/layer/Vector.js';\r\nimport VectorSource from 'ol/source/Vector.js';\r\nimport Map from 'ol/Map.js';\r\nimport BaseEvent from 'ol/events/Event.js';\r\nimport { LoadingStrategy } from 'ol/source/Vector.js';\r\nimport { FeatureLike } from 'ol/Feature.js';\r\nimport { Options as VectorLayerOptions } from 'ol/layer/BaseVector.js';\r\nimport { shiftKeyOnly, primaryAction } from 'ol/events/condition.js';\r\nimport {\r\n unByKey,\r\n CombinedOnSignature,\r\n EventTypes,\r\n OnSignature\r\n} from 'ol/Observable.js';\r\nimport {\r\n Coordinate,\r\n squaredDistance,\r\n squaredDistanceToSegment\r\n} from 'ol/coordinate.js';\r\nimport { createEmpty, extend, getCenter, Extent } from 'ol/extent.js';\r\nimport { ObjectEvent } from 'ol/Object.js';\r\nimport { Types as ObjectEventTypes } from 'ol/ObjectEventType.js';\r\n\r\nimport { initModal, showError } from './modules/errors';\r\nimport { initLoading, showLoading } from './modules/loading';\r\nimport WfsLayer from './WfsLayer';\r\nimport WmsLayer from './WmsLayer';\r\nimport LayersControl, {\r\n activateDrawButton,\r\n activateModeButtons,\r\n activateQueryButton,\r\n activateSelectModeButton,\r\n deactivateQueryButton,\r\n deactivateSelectModeButton,\r\n resetStateButtons\r\n} from './modules/LayersControl';\r\nimport Uploads from './modules/Uploads';\r\nimport {\r\n addFeatureToEditedList,\r\n getStoredMapLayers,\r\n isFeatureEdited,\r\n removeFeatureFromEditList,\r\n setActiveLayerToInsertEls,\r\n getActiveLayerToInsertEls,\r\n activateMode,\r\n getMode,\r\n setSelectionMode,\r\n getSelectionMode,\r\n SelectionMode,\r\n Modes,\r\n setMap,\r\n setMapLayers,\r\n getStoredLayer\r\n} from './modules/state';\r\nimport { deepObjectAssign } from './modules/helpers';\r\nimport { getEditLayer } from './modules/editLayer';\r\nimport { GeometryType, TransactionType } from './@enums';\r\nimport {\r\n I18n,\r\n IGeoserverDescribeFeatureType,\r\n IProperty,\r\n WfsGeoserverVendor,\r\n WmsGeoserverVendor\r\n} from './@types';\r\nimport * as i18n from './modules/i18n/index';\r\nimport { getDefaultOptions } from './defaults';\r\nimport EditControlChangesEl from './modules/EditControlChanges';\r\nimport styleFunction, {\r\n editVertexStyles,\r\n getFeatureVertices,\r\n queryStyleFunction\r\n} from './modules/styleFunction';\r\nimport { EditFieldsModal } from './modules/EditFieldsModal';\r\nimport Geoserver from './Geoserver';\r\nimport EditOverlay from './modules/EditOverlay';\r\nimport ExtendLineOverlay, { ExtendLineSide } from './modules/ExtendLineOverlay';\r\nimport QueryOverlay from './modules/QueryOverlay';\r\nimport { BaseLayerProperty } from './modules/base/BaseLayer';\r\n\r\n// External\r\nimport Modal from 'modal-vanilla';\r\n\r\n// Images\r\nimport fullscreenSvg from './assets/images/fullscreen.svg';\r\nimport fullscreenExitSvg from './assets/images/fullscreenExit.svg';\r\n\r\n// Style\r\nimport './assets/scss/-ol-wfst.bootstrap5.scss';\r\nimport './assets/scss/ol-wfst.scss';\r\n\r\nconst controlElement = document.createElement('div');\r\n\r\nconst INIT_LOADING_TIMEOUT = 20000;\r\n\r\n/**\r\n * Endpoint of a line component, with enough context to later extend it: the\r\n * LineString/MultiLineString that owns the coordinates, the line index inside\r\n * a MultiLineString and the parent collection when nested.\r\n *\r\n * @private\r\n */\r\ntype LineEndPoint = {\r\n first: Coordinate;\r\n last: Coordinate;\r\n line: LineString | MultiLineString;\r\n lineIndex: number;\r\n collection?: GeometryCollection;\r\n};\r\n\r\n/**\r\n * Tiny WFS-T client to insert (drawing/uploading), modify and delete\r\n * features on GeoServers using OpenLayers. Layers with these types\r\n * of geometries are supported: \"GeometryCollection\" (in this case, you can\r\n * choose the geometry type of each element to draw), \"Point\", \"MultiPoint\",\r\n * \"LineString\", \"MultiLineString\", \"Polygon\" and \"MultiPolygon\".\r\n *\r\n * @constructor\r\n * @fires modifystart\r\n * @fires modifyend\r\n * @fires drawstart\r\n * @fires drawend\r\n * @fires load\r\n * @fires describeFeatureType\r\n * @extends {ol/control/Control~Control}\r\n * @param options Wfst options, see [Wfst Options](#options) for more details.\r\n */\r\nexport default class Wfst extends Control {\r\n protected _options: Options;\r\n protected _i18n: I18n;\r\n\r\n // Ol\r\n protected _map: Map;\r\n protected _view: View;\r\n protected _viewport: HTMLElement;\r\n protected _initialized = false;\r\n protected _layersControl: LayersControl;\r\n protected _overlay: Overlay;\r\n\r\n // Interactions\r\n protected _interactionWfsSelect: Select;\r\n protected _interactionSelectModify: Select;\r\n protected _collectionModify: Collection<any>;\r\n protected _interactionModify: Modify;\r\n protected _interactionSnap: Snap;\r\n protected _interactionDraw: Draw;\r\n protected _interactionDragBox: DragBox;\r\n protected _interactionFreehandSelect: Draw;\r\n\r\n // Query\r\n protected _keyClickQuery: EventsKey;\r\n protected _queryOverlay: Overlay;\r\n protected _queryOverlayId = 'ol-wfst--query-overlay';\r\n protected _highlightSource: VectorSource;\r\n protected _highlightLayer: VectorLayer;\r\n\r\n // Obserbable keys\r\n protected _keyClickWms: EventsKey | EventsKey[];\r\n protected _keyRemove: EventsKey;\r\n protected _keySelect: EventsKey;\r\n protected _shiftPressed = false;\r\n\r\n // Controls\r\n protected _controlApplyDiscardChanges: EditControlChangesEl;\r\n protected _controlWidgetToolsDiv: HTMLElement;\r\n protected _layersWidgetDiv: HTMLElement;\r\n protected _selectDraw: HTMLSelectElement;\r\n\r\n // State\r\n protected _currentZoom: number;\r\n protected _lastZoom: number;\r\n protected _hoveredFeature: Feature<Geometry> = null;\r\n protected _keySelectBound = false;\r\n // Editing\r\n protected _editFeaturesOriginal: {\r\n [key: string]: Feature<Geometry>;\r\n } = {};\r\n protected _multiOverlayId = 'ol-wfst--multi-edit-overlay';\r\n protected _extendOverlays: ExtendLineOverlay[] = [];\r\n protected _extendDraw: Draw;\r\n\r\n protected _uploads: Uploads;\r\n protected _editFields: EditFieldsModal;\r\n\r\n declare on: OnSignature<EventTypes, BaseEvent, EventsKey> &\r\n OnSignature<WfstEventTypes, WfstEvent, EventsKey> &\r\n OnSignature<ObjectEventTypes, ObjectEvent, EventsKey> &\r\n CombinedOnSignature<\r\n WfstEventTypes | ObjectEventTypes | EventTypes,\r\n EventsKey\r\n >;\r\n\r\n declare once: OnSignature<EventTypes, BaseEvent, EventsKey> &\r\n OnSignature<WfstEventTypes, WfstEvent, EventsKey> &\r\n OnSignature<ObjectEventTypes, ObjectEvent, EventsKey> &\r\n CombinedOnSignature<\r\n WfstEventTypes | ObjectEventTypes | EventTypes,\r\n EventsKey\r\n >;\r\n\r\n declare un: OnSignature<EventTypes, BaseEvent, void> &\r\n OnSignature<WfstEventTypes, WfstEvent, EventsKey> &\r\n OnSignature<ObjectEventTypes, ObjectEvent, void> &\r\n CombinedOnSignature<\r\n WfstEventTypes | ObjectEventTypes | EventTypes,\r\n void\r\n >;\r\n\r\n constructor(options?: Options) {\r\n super({\r\n target: null,\r\n element: controlElement,\r\n render: () => {\r\n if (!this._map) this._init();\r\n }\r\n });\r\n\r\n i18n.setLang(options.language, options.i18n);\r\n\r\n const defaultOptions = getDefaultOptions();\r\n\r\n this._options = deepObjectAssign(defaultOptions, options);\r\n\r\n // By default, the first layer is ready to accept new draws\r\n setActiveLayerToInsertEls(this._options.layers[0]);\r\n\r\n this._controlWidgetToolsDiv = controlElement;\r\n this._controlWidgetToolsDiv.className = 'ol-wfst--tools-control';\r\n\r\n this._uploads = new Uploads(this._options);\r\n\r\n this._editFields = new EditFieldsModal(this._options);\r\n }\r\n\r\n /**\r\n * Get all the layers in the ol-wfst instance\r\n * @public\r\n */\r\n getLayers(): Array<WfsLayer | WmsLayer> {\r\n return Object.values(getStoredMapLayers());\r\n }\r\n\r\n /**\r\n * Get a layer\r\n * @public\r\n */\r\n getLayerByName(layerName = ''): WfsLayer | WmsLayer {\r\n const layers = getStoredMapLayers();\r\n if (layerName && layerName in layers) {\r\n return layers[layerName];\r\n }\r\n return null;\r\n }\r\n\r\n /**\r\n * Connect to the GeoServer and retrieve metadata about the service (GetCapabilities).\r\n * Get each layer specs (DescribeFeatureType) and create the layers and map controls.\r\n * @fires describeFeatureType\r\n * @private\r\n */\r\n private async _initMapAndLayers(): Promise<void> {\r\n try {\r\n const layers = this._options.layers;\r\n\r\n if (layers.length) {\r\n let layerRendered = 0;\r\n let layersNumber = 0; // Only count visibles\r\n\r\n showLoading();\r\n\r\n const layerInitPromises: Promise<void>[] = [];\r\n\r\n layers.forEach((layer) => {\r\n if (layer.isVisible(this._view)) layersNumber++;\r\n\r\n layer.on('layerRendered', () => {\r\n layerRendered++;\r\n if (layerRendered >= layersNumber) {\r\n // run only once\r\n if (!this._initialized) {\r\n this.dispatchEvent('load');\r\n this._initialized = true;\r\n }\r\n showLoading(false);\r\n }\r\n });\r\n\r\n layer.on('change:describeFeatureType', () => {\r\n if (this._options.showControl && layers.length > 1) {\r\n const domEl = this._layersControl.addLayerEl(layer);\r\n\r\n layer.on('change:isVisible', () => {\r\n const layerNotVisible =\r\n 'ol-wfst--layer-not-visible';\r\n\r\n const visible = layer.isVisibleByZoom();\r\n if (visible)\r\n domEl.classList.remove(layerNotVisible);\r\n else domEl.classList.add(layerNotVisible);\r\n });\r\n }\r\n layer.set(\r\n BaseLayerProperty.ISVISIBLE,\r\n this._currentZoom > layer.getMinZoom()\r\n );\r\n\r\n this.dispatchEvent(\r\n new WfstEvent({\r\n type: 'describeFeatureType',\r\n layer: layer,\r\n data: layer.getDescribeFeatureType()\r\n })\r\n );\r\n });\r\n\r\n layerInitPromises.push(layer._init());\r\n\r\n this._map.addLayer(layer);\r\n\r\n setMapLayers({\r\n [layer.get(BaseLayerProperty.NAME)]: layer\r\n });\r\n });\r\n\r\n this._createMapElements(\r\n this._options.showControl,\r\n this._options.active\r\n );\r\n\r\n // Show the loading bar until every layer has resolved its\r\n // DescribeFeatureType (success or error), with a fail-safe\r\n // timeout so it never stays visible on a dead connection.\r\n await Promise.race([\r\n Promise.all(layerInitPromises),\r\n new Promise<void>((resolve) =>\r\n setTimeout(resolve, INIT_LOADING_TIMEOUT)\r\n )\r\n ]);\r\n showLoading(false);\r\n }\r\n } catch (err) {\r\n showLoading(false);\r\n showError(err.message, err);\r\n }\r\n }\r\n\r\n /**\r\n * @private\r\n */\r\n private _init(): void {\r\n this._map = super.getMap();\r\n this._view = this._map.getView();\r\n this._viewport = this._map.getViewport();\r\n\r\n setMap(this._map);\r\n\r\n //@ts-expect-error\r\n this._uploads.on('addedFeatures', ({ features }) => {\r\n const layer = getActiveLayerToInsertEls();\r\n layer.insertFeatures(features);\r\n });\r\n\r\n //@ts-expect-error\r\n this._uploads.on('loadedFeatures', ({ features }) => {\r\n this.activateEditMode();\r\n const editLayerSource = getEditLayer().getSource();\r\n\r\n editLayerSource.addFeatures(features);\r\n\r\n this._view.fit(editLayerSource.getExtent(), {\r\n size: this._map.getSize(),\r\n maxZoom: 21,\r\n padding: [100, 100, 100, 100]\r\n });\r\n });\r\n\r\n // @ts-expect-error\r\n this._editFields.on('save', async ({ feature, features }) => {\r\n const list: Feature<Geometry>[] = features || [feature];\r\n const ok = await this._transactEditList(list);\r\n if (ok) {\r\n Array.from(list).forEach((f) =>\r\n this._collectionModify.remove(f)\r\n );\r\n }\r\n });\r\n\r\n // @ts-expect-error\r\n this._editFields.on('delete', ({ features }) => {\r\n this._deleteFeature(features, true);\r\n });\r\n\r\n this._addMapEvents();\r\n this._addMiddleButtonPan();\r\n\r\n initModal(this._options['modal']);\r\n\r\n this._layersWidgetDiv = document.createElement('div');\r\n this._layersWidgetDiv.className = 'ol-wfst--layers-control';\r\n this._layersWidgetDiv.append(initLoading());\r\n this._map.addControl(\r\n new Control({\r\n element: this._layersWidgetDiv\r\n })\r\n );\r\n\r\n this._initMapAndLayers();\r\n }\r\n\r\n /**\r\n * Create the edit layer to allow modify elements, add interactions,\r\n * map controls and keyboard handlers.\r\n *\r\n * @param showControl\r\n * @param active\r\n * @private\r\n */\r\n private async _createMapElements(\r\n showControl: boolean,\r\n active: boolean\r\n ): Promise<void> {\r\n // VectorLayer to store features on editing and inserting\r\n this._prepareEditLayer();\r\n\r\n this._addInteractions();\r\n this._addInteractionHandlers();\r\n\r\n this._prepareHighlightLayer();\r\n this._addQueryInteraction();\r\n\r\n if (showControl) {\r\n this._addMapControl();\r\n\r\n if (this._options.fullscreen) {\r\n this._map.addControl(\r\n new FullScreen({\r\n className: 'ol-wfst--fullscreen',\r\n tipLabel: i18n.I18N.labels.fullscreen,\r\n label: fullscreenSvg(),\r\n labelActive: fullscreenExitSvg()\r\n })\r\n );\r\n }\r\n }\r\n\r\n // By default, init in edit mode\r\n this.activateEditMode(active);\r\n }\r\n\r\n /**\r\n * @private\r\n */\r\n private _addInteractions(): void {\r\n /**\r\n * Select the wfs feature already downloaded\r\n * @private\r\n */\r\n const prepareWfsInteraction = () => {\r\n this._collectionModify = new Collection();\r\n\r\n // Interaction to select wfs layer elements\r\n this._interactionWfsSelect = new Select({\r\n hitTolerance: 10,\r\n style: (feature: Feature<Geometry>) => styleFunction(feature),\r\n toggleCondition: shiftKeyOnly, // Allow adding features to the selection with shift\r\n filter: (feature, layer) => {\r\n return (\r\n getMode() !== Modes.Edit &&\r\n getMode() !== Modes.Query &&\r\n layer &&\r\n layer instanceof WfsLayer &&\r\n layer === getActiveLayerToInsertEls()\r\n );\r\n }\r\n });\r\n\r\n this._map.addInteraction(this._interactionWfsSelect);\r\n\r\n this._interactionWfsSelect.on(\r\n 'select',\r\n ({ selected, deselected, mapBrowserEvent }) => {\r\n const coordinate = mapBrowserEvent.coordinate;\r\n\r\n // Clear hover to avoid keeping the style on the selected feature\r\n this._clearHoverState();\r\n\r\n if (getMode() === Modes.Query) {\r\n return;\r\n }\r\n\r\n if (selected.length) {\r\n selected.forEach((feature) => {\r\n if (!isFeatureEdited(feature)) {\r\n // Remove the feature from the original layer\r\n const layer =\r\n this._interactionWfsSelect.getLayer(\r\n feature\r\n );\r\n layer.getSource().removeFeature(feature);\r\n this._addFeatureToEditMode(\r\n feature,\r\n coordinate,\r\n layer.get(BaseLayerProperty.NAME)\r\n );\r\n }\r\n });\r\n\r\n this._lockSelectedFeatures();\r\n }\r\n\r\n if (deselected.length) {\r\n if (getMode() !== Modes.Edit) {\r\n deselected.forEach((feature) => {\r\n // Trigger deselect\r\n // This is necessary for those times where two features overlap.\r\n this._collectionModify.remove(feature);\r\n });\r\n }\r\n }\r\n }\r\n );\r\n };\r\n\r\n /**\r\n * Call the geoserver to get the clicked feature\r\n * @private\r\n */\r\n const prepareWmsInteraction = (): void => {\r\n // Interaction to allow select features in the edit layer\r\n this._interactionSelectModify = new Select({\r\n style: (feature: Feature<Geometry>) => styleFunction(feature),\r\n layers: [getEditLayer()],\r\n toggleCondition: shiftKeyOnly, // Allow adding features with shift\r\n removeCondition: () => (getMode() === Modes.Edit ? true : false) // Prevent deselect on clicking outside the feature\r\n });\r\n\r\n this._map.addInteraction(this._interactionSelectModify);\r\n\r\n // When clicking without shift, replace the current selection: remove\r\n // any previously selected and not re-selected feature from the edit list\r\n this._interactionSelectModify.on(\r\n 'select',\r\n ({ selected, mapBrowserEvent }) => {\r\n if (\r\n !selected.length ||\r\n !mapBrowserEvent ||\r\n shiftKeyOnly(mapBrowserEvent)\r\n ) {\r\n return;\r\n }\r\n\r\n const selectedSet = new Set(selected);\r\n Array.from(this._collectionModify.getArray()).forEach(\r\n (feature) => {\r\n if (!selectedSet.has(feature)) {\r\n this._collectionModify.remove(feature);\r\n }\r\n }\r\n );\r\n }\r\n );\r\n\r\n this._collectionModify =\r\n this._interactionSelectModify.getFeatures();\r\n\r\n this._keyClickWms = this._map.on(\r\n this._options.evtType || 'singleclick',\r\n async (evt: MapBrowserEvent<PointerEvent>) => {\r\n if (this._map.hasFeatureAtPixel(evt.pixel)) {\r\n return;\r\n }\r\n\r\n // Only get other features if editmode is disabled\r\n if (getMode() !== Modes.Edit && getMode() !== Modes.Query) {\r\n const layer = getActiveLayerToInsertEls();\r\n\r\n // If layer is hidden or is a wfs, skip\r\n if (\r\n !layer.getVisible() ||\r\n !layer.isVisibleByZoom() ||\r\n layer instanceof WfsLayer\r\n ) {\r\n return;\r\n }\r\n\r\n const features =\r\n await layer._getFeaturesByClickEvent(evt);\r\n\r\n if (!features?.length) {\r\n return;\r\n }\r\n\r\n // Without shift, replace the current selection\r\n if (!shiftKeyOnly(evt)) {\r\n Array.from(\r\n this._collectionModify.getArray()\r\n ).forEach((feature) => {\r\n this._collectionModify.remove(feature);\r\n });\r\n }\r\n\r\n this._addFeatureToEditMode(\r\n features[0],\r\n evt.coordinate,\r\n layer.get(BaseLayerProperty.NAME)\r\n );\r\n\r\n this._lockSelectedFeatures();\r\n }\r\n }\r\n );\r\n };\r\n\r\n if (this._options.layers.find((layer) => layer instanceof WfsLayer)) {\r\n prepareWfsInteraction();\r\n }\r\n\r\n if (this._options.layers.find((layer) => layer instanceof WmsLayer)) {\r\n prepareWmsInteraction();\r\n }\r\n\r\n this._interactionModify = new Modify({\r\n style: (feature: Feature<Geometry>) => {\r\n if (getMode() === Modes.Edit) {\r\n return editVertexStyles(feature.get('existing') === true);\r\n } else {\r\n return;\r\n }\r\n },\r\n features: this._collectionModify,\r\n condition: (evt) => {\r\n return primaryAction(evt) && getMode() === Modes.Edit;\r\n }\r\n });\r\n\r\n this._map.addInteraction(this._interactionModify);\r\n\r\n this._interactionSnap = new Snap({\r\n source: getEditLayer().getSource()\r\n });\r\n this._map.addInteraction(this._interactionSnap);\r\n\r\n this._addSelectionInteractions();\r\n }\r\n\r\n /**\r\n * Interactions to select features by drawing a box (DragBox) or a freehand\r\n * polygon (freehand Draw lasso). The selected features are added to the\r\n * edit list, keeping the same behaviour as the single click selection.\r\n *\r\n * @private\r\n */\r\n private _addSelectionInteractions(): void {\r\n const selectionStyle = new Style({\r\n fill: new Fill({\r\n color: 'rgba(255, 200, 0, 0.1)'\r\n }),\r\n stroke: new Stroke({\r\n color: '#ffc800',\r\n width: 2,\r\n lineDash: [6, 4]\r\n })\r\n });\r\n\r\n // Box selection (dragging a rectangle)\r\n this._interactionDragBox = new DragBox({\r\n condition: (evt) =>\r\n primaryAction(evt) && this._isSelectMode(SelectionMode.Box),\r\n className: 'ol-wfst--dragbox'\r\n });\r\n\r\n this._interactionDragBox.on('boxend', (evt) => {\r\n if (!this._isSelectMode(SelectionMode.Box)) {\r\n return;\r\n }\r\n\r\n // Without shift, replace the current selection\r\n if (!(evt.mapBrowserEvent.originalEvent as MouseEvent).shiftKey) {\r\n this._collectionModify.clear();\r\n }\r\n\r\n this._selectByGeometry(this._interactionDragBox.getGeometry());\r\n });\r\n\r\n this._map.addInteraction(this._interactionDragBox);\r\n\r\n // Freehand selection (holding the mouse to draw a closed lasso)\r\n this._interactionFreehandSelect = new Draw({\r\n type: GeometryType.Polygon,\r\n freehand: true,\r\n stopClick: true,\r\n style: selectionStyle,\r\n condition: (evt) =>\r\n primaryAction(evt) && this._isSelectMode(SelectionMode.Freehand)\r\n });\r\n\r\n this._interactionFreehandSelect.on('drawend', (evt) => {\r\n if (!this._isSelectMode(SelectionMode.Freehand)) {\r\n return;\r\n }\r\n\r\n const geometry = evt.feature.getGeometry() as Polygon;\r\n const ring = geometry ? geometry.getCoordinates()[0] : [];\r\n\r\n // Ignore degenerate lassos (a simple click without dragging)\r\n if (!ring.length || ring.length < 4 || geometry.getArea() <= 0) {\r\n return;\r\n }\r\n\r\n // Without shift, replace the current selection\r\n if (!this._shiftPressed) {\r\n this._collectionModify.clear();\r\n }\r\n\r\n this._selectByGeometry(geometry);\r\n });\r\n\r\n this._map.addInteraction(this._interactionFreehandSelect);\r\n\r\n this._refreshSelectionInteractions();\r\n }\r\n\r\n /**\r\n * Whether a selection tool mode is currently usable: only outside the\r\n * edit/draw modes.\r\n *\r\n * @param mode\r\n * @private\r\n */\r\n private _isSelectMode(mode: SelectionMode): boolean {\r\n return getMode() === null && getSelectionMode() === mode;\r\n }\r\n\r\n /**\r\n * Enable/disable the box and freehand selection interactions according to\r\n * the current selection tool and map mode.\r\n *\r\n * @private\r\n */\r\n private _refreshSelectionInteractions(): void {\r\n const active = getMode() === null;\r\n\r\n if (this._interactionDragBox) {\r\n this._interactionDragBox.setActive(\r\n active && getSelectionMode() === SelectionMode.Box\r\n );\r\n }\r\n\r\n if (this._interactionFreehandSelect) {\r\n this._interactionFreehandSelect.setActive(\r\n active && getSelectionMode() === SelectionMode.Freehand\r\n );\r\n }\r\n }\r\n\r\n /**\r\n * Select the features that intersect the given polygon on the active layer\r\n * and add them to the edit list. WFS features are picked from the already\r\n * loaded source, while WMS features are requested to the GeoServer with a\r\n * WFS GetFeature INTERSECTS filter.\r\n *\r\n * @param geometry\r\n * @private\r\n */\r\n private async _selectByGeometry(geometry: Polygon): Promise<void> {\r\n const layer = getActiveLayerToInsertEls();\r\n\r\n if (!layer || !layer.getVisible() || !layer.isVisibleByZoom()) {\r\n showError(i18n.I18N.errors.layerNotVisible);\r\n return;\r\n }\r\n\r\n let features: Feature<Geometry>[];\r\n\r\n if (layer instanceof WfsLayer) {\r\n const candidates = layer\r\n .getSource()\r\n .getFeaturesInExtent(geometry.getExtent());\r\n\r\n // The extent is only a bounding box; for the freehand lasso be\r\n // more precise and keep the features whose vertices fall inside it\r\n if (getSelectionMode() === SelectionMode.Freehand) {\r\n features = candidates.filter((feature) => {\r\n const featureGeom = feature.getGeometry() as SimpleGeometry;\r\n if (!featureGeom) {\r\n return false;\r\n }\r\n const flatCoords = featureGeom.getFlatCoordinates();\r\n const stride = featureGeom.getStride();\r\n for (let i = 0; i < flatCoords.length; i += stride) {\r\n if (\r\n geometry.intersectsCoordinate([\r\n flatCoords[i],\r\n flatCoords[i + 1]\r\n ])\r\n ) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n });\r\n } else {\r\n features = candidates;\r\n }\r\n } else if (layer instanceof WmsLayer) {\r\n features = await layer._getFeaturesInGeometry(geometry);\r\n }\r\n\r\n if (features) {\r\n this._selectFeatures(features);\r\n }\r\n }\r\n\r\n /**\r\n * Add the given features to the edit mode:\r\n * remove them from their original layer and push them into the edit\r\n * collection so they can be modified/deleted like the ones selected\r\n * with a single click.\r\n *\r\n * @param features\r\n * @private\r\n */\r\n private _selectFeatures(features: Feature<Geometry>[]): void {\r\n if (!features || !features.length) {\r\n return;\r\n }\r\n\r\n const layer = getActiveLayerToInsertEls();\r\n const layerName = layer.get(BaseLayerProperty.NAME);\r\n\r\n const selectedIds = new Set(\r\n this._collectionModify.getArray().map((feature) => feature.getId())\r\n );\r\n\r\n features.forEach((feature) => {\r\n if (isFeatureEdited(feature) || selectedIds.has(feature.getId())) {\r\n return;\r\n }\r\n\r\n // WFS features are stored in their layer source: remove them from\r\n // there while they are being edited\r\n if (\r\n layer instanceof WfsLayer &&\r\n layer.getSource().hasFeature(feature)\r\n ) {\r\n layer.getSource().removeFeature(feature);\r\n }\r\n\r\n this._addFeatureToEditMode(feature, null, layerName);\r\n });\r\n\r\n this._lockSelectedFeatures();\r\n }\r\n\r\n /**\r\n * Layer to store temporary the elements to be edited\r\n * @private\r\n */\r\n private _prepareEditLayer(): void {\r\n this._map.addLayer(getEditLayer());\r\n }\r\n\r\n /**\r\n * Create the dedicated layer used to highlight the queried feature, so\r\n * the source layers keep their own rendering untouched.\r\n * @private\r\n */\r\n private _prepareHighlightLayer(): void {\r\n this._highlightSource = new VectorSource();\r\n this._highlightLayer = new VectorLayer({\r\n source: this._highlightSource,\r\n style: (feature: Feature<Geometry>) => queryStyleFunction(feature),\r\n zIndex: 100\r\n });\r\n this._map.addLayer(this._highlightLayer);\r\n }\r\n\r\n /**\r\n * Listen for clicks while the query mode is active: get the clicked\r\n * feature of the active layer (from the already loaded source for WFS,\r\n * or through a GetFeatureInfo request for WMS), highlight it and show\r\n * its attributes in a popup.\r\n * @private\r\n */\r\n private _addQueryInteraction(): void {\r\n this._keyClickQuery = this._map.on(\r\n this._options.evtType || 'singleclick',\r\n async (evt: MapBrowserEvent<PointerEvent>) => {\r\n if (getMode() !== Modes.Query) {\r\n return;\r\n }\r\n\r\n const layer = getActiveLayerToInsertEls();\r\n\r\n // Skip hidden layers\r\n if (!layer.getVisible() || !layer.isVisibleByZoom()) {\r\n return;\r\n }\r\n\r\n let feature: Feature<Geometry> = null;\r\n\r\n if (layer instanceof WfsLayer) {\r\n const featuresAtPixel = this._map.getFeaturesAtPixel(\r\n evt.pixel,\r\n {\r\n hitTolerance: 10,\r\n layerFilter: (candidate) => candidate === layer\r\n }\r\n );\r\n if (featuresAtPixel && featuresAtPixel.length) {\r\n feature = featuresAtPixel[0] as Feature<Geometry>;\r\n }\r\n } else if (layer instanceof WmsLayer) {\r\n const features = await layer._getFeaturesByClickEvent(evt);\r\n if (features?.length) {\r\n feature = features[0];\r\n }\r\n }\r\n\r\n // Click on empty space: clear the previous result\r\n if (!feature) {\r\n this._clearQueryResult();\r\n return;\r\n }\r\n\r\n this._showQueryResult(feature, layer, evt.coordinate);\r\n }\r\n );\r\n }\r\n\r\n /**\r\n * Highlight the given feature and attach a popup with its attributes.\r\n * @param feature\r\n * @param layer\r\n * @param coordinate\r\n * @private\r\n */\r\n private _showQueryResult(\r\n feature: Feature<Geometry>,\r\n layer: WfsLayer | WmsLayer,\r\n coordinate: Coordinate\r\n ): void {\r\n this._clearQueryResult();\r\n\r\n this._highlightSource.addFeature(feature);\r\n\r\n this._queryOverlay = new QueryOverlay(feature, coordinate, layer);\r\n // @ts-expect-error\r\n this._queryOverlay.on('close', () => {\r\n this._clearQueryResult();\r\n });\r\n this._map.addOverlay(this._queryOverlay);\r\n }\r\n\r\n /**\r\n * Remove the query popup overlay if any.\r\n * @private\r\n */\r\n private _removeQueryOverlay(): void {\r\n if (this._queryOverlay) {\r\n this._map.removeOverlay(this._queryOverlay);\r\n this._queryOverlay = null;\r\n return;\r\n }\r\n\r\n const overlay = this._map.getOverlayById(this._queryOverlayId);\r\n if (overlay) {\r\n this._map.removeOverlay(overlay);\r\n }\r\n }\r\n\r\n /**\r\n * Clear the highlight and remove the query popup.\r\n * @private\r\n */\r\n private _clearQueryResult(): void {\r\n this._highlightSource?.clear();\r\n this._removeQueryOverlay();\r\n }\r\n\r\n /**\r\n * Activate/deactivate the query mode: while it is active, clicking a\r\n * feature of the active layer shows its info in a popup instead of\r\n * selecting it for editing.\r\n *\r\n * @param bool\r\n * @public\r\n */\r\n activateQueryMode(bool = true): void {\r\n if (bool) {\r\n // Leave any draw interaction active\r\n if (this._interactionDraw) {\r\n this._map.removeInteraction(this._interactionDraw);\r\n this._viewport.classList.remove('draw-mode');\r\n }\r\n\r\n resetStateButtons();\r\n deactivateSelectModeButton();\r\n activateQueryButton();\r\n this._clearHoverState();\r\n\r\n activateMode(Modes.Query);\r\n\r\n // Disable the edit selection interactions while querying\r\n if (this._interactionSelectModify) {\r\n this._interactionSelectModify.setActive(false);\r\n }\r\n if (this._interactionWfsSelect) {\r\n this._interactionWfsSelect.setActive(false);\r\n }\r\n this._interactionModify?.setActive(false);\r\n this._syncExtendLineOverlays();\r\n this._refreshSelectionInteractions();\r\n } else {\r\n activateMode(null);\r\n deactivateQueryButton();\r\n activateSelectModeButton(getSelectionMode());\r\n\r\n if (this._interactionSelectModify) {\r\n this._interactionSelectModify.setActive(true);\r\n }\r\n if (this._interactionWfsSelect) {\r\n this._interactionWfsSelect.setActive(true);\r\n }\r\n this._interactionModify?.setActive(true);\r\n\r\n this._refreshSelectionInteractions();\r\n }\r\n\r\n this._clearQueryResult();\r\n }\r\n\r\n /**\r\n * @private\r\n */\r\n private _addMapEvents(): void {\r\n /**\r\n * @private\r\n */\r\n const keyboardEvents = (): void => {\r\n document.addEventListener('keydown', ({ key }) => {\r\n const inputFocus = document.querySelector('input:focus');\r\n if (inputFocus) {\r\n return;\r\n }\r\n if (key === 'Delete') {\r\n const selectedFeatures = this._collectionModify.getArray();\r\n if (selectedFeatures.length) {\r\n this._deleteFeature(selectedFeatures, true);\r\n }\r\n }\r\n });\r\n };\r\n\r\n keyboardEvents();\r\n\r\n /**\r\n * Change the cursor to a pointing hand and highlight the feature\r\n * when hovering over a WFS feature of the active layer.\r\n * @private\r\n */\r\n const pointerMoveHandler = (\r\n evt: MapBrowserEvent<PointerEvent>\r\n ): void => {\r\n if (evt.dragging) {\r\n return;\r\n }\r\n\r\n // In edit mode, give pointer feedback on the editable\r\n // vertices/segments\r\n if (getMode() === Modes.Edit) {\r\n this._clearHoverState();\r\n this._updateEditCursor(evt);\r\n return;\r\n }\r\n\r\n // Only show the hover outside edit and draw modes\r\n if (getMode() !== null) {\r\n this._clearHoverState();\r\n return;\r\n }\r\n\r\n const layer = getActiveLayerToInsertEls();\r\n\r\n // Hover only works on visible WFS layers\r\n if (\r\n !layer ||\r\n !layer.getVisible() ||\r\n !layer.isVisibleByZoom() ||\r\n !(layer instanceof WfsLayer)\r\n ) {\r\n this._clearHoverState();\r\n return;\r\n }\r\n\r\n const features = this._map.getFeaturesAtPixel(evt.pixel, {\r\n hitTolerance: 10,\r\n layerFilter: (candidate) => candidate === layer\r\n });\r\n\r\n if (features && features.length) {\r\n const feature = features[0] as Feature<Geometry>;\r\n\r\n if (feature !== this._hoveredFeature) {\r\n this._clearHoverState();\r\n this._hoveredFeature = feature;\r\n this._hoveredFeature.setStyle((f) =>\r\n styleFunction(f as Feature<Geometry>, true)\r\n );\r\n }\r\n\r\n if (this._viewport.style.cursor !== 'pointer') {\r\n this._viewport.style.cursor = 'pointer';\r\n }\r\n } else {\r\n this._clearHoverState();\r\n }\r\n };\r\n\r\n this._map.on('pointermove', pointerMoveHandler);\r\n\r\n // Store the shift state when a gesture starts, so the freehand\r\n // selection can decide between adding or replacing the selection\r\n this._viewport.addEventListener('pointerdown', (evt: PointerEvent) => {\r\n this._shiftPressed = evt.shiftKey;\r\n });\r\n\r\n // Clear the hover before firing a click, otherwise the Select interaction\r\n // would capture the hover style as the original style of the feature and\r\n // restore it on deselect, leaving the highlight permanently enabled.\r\n this._viewport.addEventListener('pointerdown', () =>\r\n this._clearHoverState()\r\n );\r\n\r\n this._viewport.addEventListener(\r\n 'pointerleave',\r\n () => this._clearHoverState(),\r\n { once: false }\r\n );\r\n\r\n this._map.on('moveend', (): void => {\r\n this._currentZoom = this._view.getZoom();\r\n\r\n if (this._currentZoom !== this._lastZoom) {\r\n const layers = getStoredMapLayers();\r\n\r\n Object.keys(layers).forEach((key) => {\r\n const layer = layers[key];\r\n if (this._currentZoom > layer.getMinZoom()) {\r\n // Show the layers\r\n if (!layer.get(BaseLayerProperty.ISVISIBLE)) {\r\n layer.set(BaseLayerProperty.ISVISIBLE, true);\r\n }\r\n } else {\r\n // Hide the layer\r\n if (layer.get(BaseLayerProperty.ISVISIBLE)) {\r\n layer.set(BaseLayerProperty.ISVISIBLE, false);\r\n }\r\n }\r\n });\r\n\r\n this._lastZoom = this._currentZoom;\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Allow panning with the middle mouse button at all times, even when the\r\n * draw/freehand/box interactions are consuming the left button. The\r\n * middle pointerdown is intercepted in the capture phase so OpenLayers\r\n * never processes it and the active tool is not affected.\r\n *\r\n * @private\r\n */\r\n private _addMiddleButtonPan(): void {\r\n const viewport = this._viewport;\r\n\r\n let panning = false;\r\n let lastX = 0;\r\n let lastY = 0;\r\n\r\n const isMiddleButton = (evt: PointerEvent): boolean =>\r\n evt.pointerType === 'mouse' && evt.button === 1;\r\n\r\n const stopPanning = (): void => {\r\n panning = false;\r\n };\r\n\r\n viewport.addEventListener(\r\n 'pointerdown',\r\n (evt: PointerEvent) => {\r\n if (!isMiddleButton(evt)) {\r\n return;\r\n }\r\n\r\n evt.preventDefault();\r\n evt.stopPropagation();\r\n\r\n viewport.setPointerCapture(evt.pointerId);\r\n panning = true;\r\n lastX = evt.clientX;\r\n lastY = evt.clientY;\r\n\r\n if (this._view.getAnimating()) {\r\n this._view.cancelAnimations();\r\n }\r\n },\r\n true\r\n );\r\n\r\n viewport.addEventListener('pointermove', (evt: PointerEvent) => {\r\n if (!panning) {\r\n return;\r\n }\r\n\r\n evt.preventDefault();\r\n\r\n const delta = [lastX - evt.clientX, evt.clientY - lastY];\r\n lastX = evt.clientX;\r\n lastY = evt.clientY;\r\n\r\n const resolution = this._view.getResolution();\r\n const rotation = this._view.getRotation();\r\n const cosAngle = Math.cos(rotation);\r\n const sinAngle = Math.sin(rotation);\r\n\r\n const x = (delta[0] * cosAngle - delta[1] * sinAngle) * resolution;\r\n const y = (delta[1] * cosAngle + delta[0] * sinAngle) * resolution;\r\n\r\n this._view.adjustCenterInternal([x, y]);\r\n });\r\n\r\n const endPan = (): void => {\r\n if (!panning) {\r\n return;\r\n }\r\n stopPanning();\r\n };\r\n\r\n viewport.addEventListener('pointerup', endPan);\r\n viewport.addEventListener('pointercancel', endPan);\r\n }\r\n\r\n /**\r\n * Add map handlers\r\n * @private\r\n */\r\n private _addInteractionHandlers(): void {\r\n // When a feature is modified, add this to a list.\r\n // This prevent events fired on select and deselect features that has no changes and should\r\n // not be updated in the geoserver\r\n this._interactionModify.on('modifyend', (evt) => {\r\n evt.features.forEach((feature) => {\r\n addFeatureToEditedList(feature);\r\n });\r\n super.dispatchEvent(evt);\r\n });\r\n\r\n this._interactionModify.on('modifystart', (evt) => {\r\n super.dispatchEvent(evt);\r\n });\r\n\r\n // Keep the \"continue drawing\" buttons glued to the line endpoints\r\n // @ts-expect-error - 'modify' is a valid Modify event not typed in the `on` signature\r\n this._interactionModify.on('modify', () => {\r\n this._updateExtendOverlayPositions();\r\n });\r\n\r\n this._onDeselectFeatureEvent();\r\n this._onRemoveFeatureEvent();\r\n }\r\n\r\n /**\r\n * Add the widget on the map to allow change the tools and select active layers\r\n * @private\r\n */\r\n private _addMapControl(): void {\r\n this._layersControl = new LayersControl(\r\n this._options.showUpload ? this._uploads : null,\r\n this._options.uploadFormats\r\n );\r\n\r\n // @ts-expect-error\r\n this._layersControl.on('drawMode', () => {\r\n if (getMode() === Modes.Query) {\r\n this.activateQueryMode(false);\r\n }\r\n\r\n if (getMode() === Modes.Draw) {\r\n resetStateButtons();\r\n this.activateEditMode();\r\n } else {\r\n const activeLayer = getActiveLayerToInsertEls();\r\n\r\n if (!activeLayer.isVisibleByZoom()) {\r\n showError(i18n.I18N.errors.layerNotVisible);\r\n } else {\r\n this.activateDrawMode(getActiveLayerToInsertEls());\r\n }\r\n }\r\n });\r\n\r\n // @ts-expect-error\r\n this._layersControl.on('changeGeom', () => {\r\n if (getMode() === Modes.Draw) {\r\n this.activateDrawMode(getActiveLayerToInsertEls());\r\n }\r\n });\r\n\r\n // @ts-expect-error\r\n this._layersControl.on('changeLayer', () => {\r\n if (getMode() === Modes.Draw) {\r\n this.activateDrawMode(getActiveLayerToInsertEls());\r\n }\r\n });\r\n\r\n (\r\n [\r\n ['selectModeSingle', SelectionMode.Single],\r\n ['selectModeBox', SelectionMode.Box],\r\n ['selectModeFreehand', SelectionMode.Freehand]\r\n ] as Array<[string, SelectionMode]>\r\n ).forEach(([evtName, mode]) => {\r\n // @ts-expect-error\r\n this._layersControl.on(evtName, () => {\r\n // Leaving the draw mode when a select tool is chosen\r\n if (getMode() === Modes.Draw) {\r\n resetStateButtons();\r\n this.activateEditMode();\r\n }\r\n\r\n // Leaving the query mode when a select tool is chosen\r\n if (getMode() === Modes.Query) {\r\n this.activateQueryMode(false);\r\n }\r\n\r\n setSelectionMode(mode);\r\n activateSelectModeButton(mode);\r\n this._refreshSelectionInteractions();\r\n });\r\n });\r\n\r\n // @ts-expect-error\r\n this._layersControl.on('queryMode', () => {\r\n this.activateQueryMode(getMode() !== Modes.Query);\r\n });\r\n\r\n const controlEl = this._layersControl.render();\r\n\r\n this._selectDraw = controlEl.querySelector(\r\n '.wfst--tools-control--select-draw'\r\n );\r\n\r\n this._controlWidgetToolsDiv.append(\r\n controlEl.querySelector('.wfst--tools-control--head')\r\n );\r\n if (this._options.layers.length > 1) {\r\n this._layersWidgetDiv.append(\r\n controlEl.querySelector('.wfst--tools-control--select-layers')\r\n );\r\n }\r\n }\r\n\r\n /**\r\n *\r\n * @param feature\r\n * @private\r\n */\r\n private _deselectEditFeature(feature: FeatureLike): void {\r\n this._removeOverlayHelper(feature);\r\n }\r\n\r\n /**\r\n *\r\n * @param feature\r\n * @param layerName\r\n * @private\r\n */\r\n private _restoreFeatureToLayer(\r\n feature: Feature<Geometry>,\r\n layerName?: string\r\n ): void {\r\n layerName = layerName || feature.get('_layerName_');\r\n const layer = getStoredMapLayers()[layerName];\r\n // Reset any per-feature style (e.g. hover) before returning the feature\r\n // to its layer, so it renders with the layer's default style.\r\n feature.setStyle(undefined);\r\n (layer.getSource() as VectorSource).addFeature(feature);\r\n }\r\n\r\n /**\r\n * @param feature\r\n * @private\r\n */\r\n private _removeFeatureFromTmpLayer(feature: Feature<Geometry>): void {\r\n // Remove element from the Layer\r\n getEditLayer().getSource().removeFeature(feature);\r\n }\r\n\r\n /**\r\n * Trigger on deselecting a feature from in the Edit layer\r\n *\r\n * @private\r\n */\r\n private _onDeselectFeatureEvent(): void {\r\n const checkIfFeatureIsChanged = (feature: Feature<Geometry>): void => {\r\n const layerName = feature.get('_layerName_');\r\n\r\n const layer = this._options.layers.find(\r\n (layer) => layer.get(BaseLayerProperty.NAME) === layerName\r\n );\r\n\r\n if (layer instanceof WfsLayer) {\r\n this._interactionWfsSelect.getFeatures().remove(feature);\r\n }\r\n\r\n if (isFeatureEdited(feature)) {\r\n layer.transactFeatures(TransactionType.Update, feature);\r\n } else {\r\n // Si es wfs y el elemento no tuvo cambios, lo devolvemos a la layer original\r\n if (layer instanceof WfsLayer) {\r\n this._restoreFeatureToLayer(feature, layerName);\r\n }\r\n this._removeFeatureFromTmpLayer(feature);\r\n }\r\n };\r\n\r\n if (this._keySelectBound) {\r\n return;\r\n }\r\n this._keySelectBound = true;\r\n\r\n // This is fired when a feature is deselected and fires the transaction process\r\n if (this._keySelect) {\r\n unByKey(this._keySelect);\r\n }\r\n this._keySelect = this._collectionModify.on('remove', (evt) => {\r\n const feature = evt.element;\r\n\r\n this._deselectEditFeature(feature);\r\n this._syncEditOverlays();\r\n\r\n checkIfFeatureIsChanged(feature);\r\n\r\n this._editModeOff();\r\n });\r\n }\r\n\r\n /**\r\n * Trigger on removing a feature from the Edit layer\r\n *\r\n * @private\r\n */\r\n private _onRemoveFeatureEvent(): void {\r\n // If a feature is removed from the edit layer\r\n this._keyRemove = getEditLayer()\r\n .getSource()\r\n .on('removefeature', (evt) => {\r\n const feature = evt.feature;\r\n\r\n if (!feature.get('_delete_')) {\r\n return;\r\n }\r\n\r\n if (this._keySelect) {\r\n unByKey(this._keySelect);\r\n this._keySelectBound = false;\r\n }\r\n\r\n const layerName = feature.get('_layerName_');\r\n\r\n const ll = this.getLayerByName(layerName);\r\n\r\n ll.transactFeatures(TransactionType.Delete, feature);\r\n\r\n this._deselectEditFeature(feature);\r\n this._editModeOff();\r\n\r\n if (this._keySelect) {\r\n setTimeout(() => {\r\n this._onDeselectFeatureEvent();\r\n }, 150);\r\n }\r\n });\r\n }\r\n\r\n /**\r\n *\r\n * @param features\r\n * @private\r\n */\r\n private _editModeOn(features: Feature<Geometry>[]): void {\r\n features = Array.isArray(features) ? features : [features];\r\n\r\n features.forEach((feature) => {\r\n this._editFeaturesOriginal[String(feature.getId())] =\r\n feature.clone();\r\n });\r\n\r\n activateMode(Modes.Edit);\r\n\r\n // Show the \"continue drawing\" buttons on the line endpoints\r\n this._syncExtendLineOverlays();\r\n\r\n // To refresh the style\r\n getEditLayer().getSource().changed();\r\n this._refreshSelectionInteractions();\r\n\r\n const multiOverlay = this._map.getOverlayById(this._multiOverlayId);\r\n if (multiOverlay) {\r\n this._map.removeOverlay(multiOverlay);\r\n }\r\n\r\n features.forEach((feature) => {\r\n this._removeOverlayHelper(feature);\r\n });\r\n\r\n this._controlApplyDiscardChanges = new EditControlChangesEl(features);\r\n\r\n this._controlApplyDiscardChanges.on('cancel', (evt) => {\r\n const list: Feature<Geometry>[] = (evt as any).features;\r\n Array.from(list).forEach((feature) => {\r\n const original =\r\n this._editFeaturesOriginal[String(feature.getId())];\r\n if (original) {\r\n feature.setGeometry(original.getGeometry());\r\n }\r\n removeFeatureFromEditList(feature);\r\n this._collectionModify.remove(feature);\r\n });\r\n });\r\n\r\n this._controlApplyDiscardChanges.on('apply', async (evt) => {\r\n showLoading();\r\n const list: Feature<Geometry>[] = (evt as any).features;\r\n const ok = await this._transactEditList(list);\r\n if (ok) {\r\n Array.from(list).forEach((feature) => {\r\n this._collectionModify.remove(feature);\r\n });\r\n }\r\n });\r\n\r\n this._controlApplyDiscardChanges.on('delete', (evt) => {\r\n this._deleteFeature((evt as any).features, true);\r\n });\r\n\r\n this._map.addControl(this._controlApplyDiscardChanges);\r\n }\r\n\r\n /**\r\n * @private\r\n */\r\n private _editModeOff(): void {\r\n activateMode(null);\r\n this._destroyExtendLineOverlays();\r\n this._map.removeControl(this._controlApplyDiscardChanges);\r\n this._refreshSelectionInteractions();\r\n }\r\n\r\n /**\r\n * Get the first and last coordinate of every line component of a\r\n * LineString/MultiLineString geometry, including the line components\r\n * nested inside a GeometryCollection. Anything else returns an empty\r\n * array.\r\n *\r\n * @param geometry\r\n * @private\r\n */\r\n private _getLineEndPoints(geometry: Geometry): Array<LineEndPoint> {\r\n const endPoints: LineEndPoint[] = [];\r\n\r\n const appendLine = (\r\n line: LineString | MultiLineString,\r\n collection?: GeometryCollection\r\n ): void => {\r\n if (line instanceof LineString) {\r\n if (line.getCoordinates().length) {\r\n endPoints.push({\r\n first: line.getFirstCoordinate(),\r\n last: line.getLastCoordinate(),\r\n line,\r\n lineIndex: 0,\r\n collection\r\n });\r\n }\r\n return;\r\n }\r\n\r\n line.getCoordinates().forEach((coordinates, lineIndex) => {\r\n if (coordinates.length) {\r\n endPoints.push({\r\n first: coordinates[0],\r\n last: coordinates[coordinates.length - 1],\r\n line,\r\n lineIndex,\r\n collection\r\n });\r\n }\r\n });\r\n };\r\n\r\n // \"getGeometries()\" returns deep clones (see ol GeometryCollection),\r\n // but the extend/merge must work on the actual members.\r\n const collect = (\r\n geometry: Geometry,\r\n collection?: GeometryCollection\r\n ): void => {\r\n if (\r\n geometry instanceof LineString ||\r\n geometry instanceof MultiLineString\r\n ) {\r\n appendLine(geometry, collection);\r\n } else if (geometry instanceof GeometryCollection) {\r\n geometry.getGeometriesArray().forEach((member) => {\r\n collect(member, geometry);\r\n });\r\n }\r\n };\r\n\r\n collect(geometry);\r\n\r\n return endPoints;\r\n }\r\n\r\n /**\r\n * Remove every \"continue drawing\" overlay and abort any active line\r\n * extension draw.\r\n *\r\n * @private\r\n */\r\n private _destroyExtendLineOverlays(): void {\r\n if (this._extendDraw) {\r\n this._finishExtendDraw();\r\n }\r\n\r\n this._extendOverlays.forEach((overlay) => {\r\n this._map.removeOverlay(overlay);\r\n });\r\n this._extendOverlays = [];\r\n }\r\n\r\n /**\r\n * Keep the \"continue drawing\" overlays in sync with the current edit\r\n * selection: they are only shown while editing LineString/MultiLineString\r\n * features, and they are repositioned on the endpoints of each line\r\n * component.\r\n *\r\n * @private\r\n */\r\n private _syncExtendLineOverlays(): void {\r\n if (getMode() !== Modes.Edit || !this._collectionModify) {\r\n this._destroyExtendLineOverlays();\r\n return;\r\n }\r\n\r\n const items = this._collectionModify.getArray();\r\n\r\n // Remove overlays whose feature was deselected or lost its line geometry\r\n const removed: ExtendLineOverlay[] = [];\r\n this._extendOverlays.forEach((overlay) => {\r\n const stale =\r\n !items.includes(overlay.feature) ||\r\n overlay.component >=\r\n this._getLineEndPoints(overlay.feature.getGeometry())\r\n .length;\r\n\r\n if (stale) {\r\n this._map.removeOverlay(overlay);\r\n removed.push(overlay);\r\n }\r\n });\r\n this._extendOverlays = this._extendOverlays.filter(\r\n (overlay) => !removed.includes(overlay)\r\n );\r\n\r\n // Add overlays for new LineString/MultiLineString features\r\n items.forEach((feature) => {\r\n this._getLineEndPoints(feature.getGeometry()).forEach(\r\n ({ first, last }, component) => {\r\n (['start', 'end'] as ExtendLineSide[]).forEach((side) => {\r\n const exists = this._extendOverlays.some(\r\n (overlay) =>\r\n overlay.feature === feature &&\r\n overlay.component === component &&\r\n overlay.side === side\r\n );\r\n\r\n if (exists) {\r\n return;\r\n }\r\n\r\n const overlay = new ExtendLineOverlay(\r\n feature,\r\n side === 'start' ? first : last,\r\n side,\r\n component,\r\n () =>\r\n this._startExtendLineDraw(\r\n feature,\r\n side,\r\n component\r\n )\r\n );\r\n\r\n this._extendOverlays.push(overlay);\r\n this._map.addOverlay(overlay);\r\n });\r\n }\r\n );\r\n });\r\n\r\n this._updateExtendOverlayPositions();\r\n }\r\n\r\n /**\r\n * Move the \"continue drawing\" overlays to the current position of their\r\n * line endpoints, e.g. after a vertex is dragged with the Modify\r\n * interaction.\r\n *\r\n * @private\r\n */\r\n private _updateExtendOverlayPositions(): void {\r\n this._extendOverlays.forEach((overlay) => {\r\n const point = this._getLineEndPoints(overlay.feature.getGeometry())[\r\n overlay.component\r\n ];\r\n\r\n if (!point) {\r\n return;\r\n }\r\n\r\n overlay.setPosition(\r\n overlay.side === 'start' ? point.first : point.last\r\n );\r\n });\r\n }\r\n\r\n /**\r\n * Start drawing a continuation of a line from one of its endpoints. The\r\n * sketch is anchored on the clicked vertex, so the next clicks append the\r\n * new points. A double click (or clicking back on the last point) ends\r\n * the drawing and merges the segment into the feature.\r\n *\r\n * @param feature\r\n * @param side 'start' prepends the new segment, 'end' appends it\r\n * @param component index of the clicked line component\r\n * @private\r\n */\r\n private _startExtendLineDraw(\r\n feature: Feature<Geometry>,\r\n side: ExtendLineSide,\r\n component = 0\r\n ): void {\r\n if (this._extendDraw || getMode() !== Modes.Edit) {\r\n return;\r\n }\r\n\r\n const points = this._getLineEndPoints(feature.getGeometry());\r\n if (!points.length || component >= points.length) {\r\n return;\r\n }\r\n\r\n const anchor =\r\n side === 'start' ? points[component].first : points[component].last;\r\n\r\n // While extending, the Modify/Select interactions must not grab the clicks\r\n this._interactionModify?.setActive(false);\r\n if (this._interactionSelectModify) {\r\n this._interactionSelectModify.setActive(false);\r\n }\r\n if (this._interactionWfsSelect) {\r\n this._interactionWfsSelect.setActive(false);\r\n }\r\n\r\n this._extendDraw = new Draw({\r\n type: GeometryType.LineString as GeometryType,\r\n style: (f: Feature<Geometry>) => styleFunction(f),\r\n stopClick: true // To prevent firing a map/wms click\r\n });\r\n\r\n this._extendDraw.on('drawend', (evt) => {\r\n this._mergeExtendLine(feature, side, evt.feature, component);\r\n });\r\n\r\n this._extendDraw.on('drawabort', () => {\r\n this._finishExtendDraw();\r\n });\r\n\r\n this._map.addInteraction(this._extendDraw);\r\n\r\n // Anchor the sketch on the clicked vertex: the user only has to digitize\r\n // the continuation points (this also dispatches the \"drawstart\" event)\r\n this._extendDraw.appendCoordinates([anchor]);\r\n }\r\n\r\n /**\r\n * Merge the just-drawn segment into the edited feature's line geometry and\r\n * restore the editing interactions.\r\n *\r\n * @param feature\r\n * @param side\r\n * @param sketch\r\n * @param component index of the extended line component\r\n * @private\r\n */\r\n private _mergeExtendLine(\r\n feature: Feature<Geometry>,\r\n side: ExtendLineSide,\r\n sketch: Feature<Geometry>,\r\n component = 0\r\n ): void {\r\n const points = this._getLineEndPoints(feature.getGeometry());\r\n const point = points[component];\r\n\r\n if (!point) {\r\n this._finishExtendDraw();\r\n return;\r\n }\r\n\r\n const segment = (sketch.getGeometry() as LineString).getCoordinates();\r\n const { line, lineIndex } = point;\r\n\r\n if (line instanceof LineString) {\r\n const coords = line.getCoordinates();\r\n\r\n if (side === 'start') {\r\n line.setCoordinates([...segment.slice(1).reverse(), ...coords]);\r\n } else {\r\n line.setCoordinates([...coords, ...segment.slice(1)]);\r\n }\r\n } else if (line instanceof MultiLineString) {\r\n const coords = line.getCoordinates();\r\n\r\n if (side === 'start') {\r\n coords[lineIndex] = [\r\n ...segment.slice(1).reverse(),\r\n ...coords[lineIndex]\r\n ];\r\n } else {\r\n coords[lineIndex] = [...coords[lineIndex], ...segment.slice(1)];\r\n }\r\n\r\n line.setCoordinates(coords);\r\n }\r\n\r\n // Only mark the feature as edited when the segment added new vertices\r\n if (segment.length > 1) {\r\n addFeatureToEditedList(feature);\r\n }\r\n\r\n this._finishExtendDraw();\r\n this._syncExtendLineOverlays();\r\n }\r\n\r\n /**\r\n * Remove the active line extension draw and restore the interactions that\r\n * were disabled while drawing.\r\n *\r\n * @private\r\n */\r\n private _finishExtendDraw(): void {\r\n if (this._extendDraw) {\r\n this._map.removeInteraction(this._extendDraw);\r\n this._extendDraw = null;\r\n }\r\n\r\n if (getMode() !== Modes.Edit) {\r\n return;\r\n }\r\n\r\n this._interactionModify?.setActive(true);\r\n if (this._interactionSelectModify) {\r\n this._interactionSelectModify.setActive(true);\r\n }\r\n if (this._interactionWfsSelect) {\r\n this._interactionWfsSelect.setActive(true);\r\n }\r\n }\r\n\r\n /**\r\n * Send all the given features in a single WFS-T Update transaction per\r\n * layer, so a multi selection is saved with only one request. The \"edited\"\r\n * flag is cleared before transacting, so a deselect fired while the\r\n * request is in flight does not trigger a duplicate transaction.\r\n *\r\n * @param list\r\n * @returns false when there is nothing to transact or the transaction fails\r\n * @private\r\n */\r\n private async _transactEditList(\r\n list: Feature<Geometry>[]\r\n ): Promise<boolean> {\r\n if (!list.length) {\r\n return true;\r\n }\r\n\r\n const byLayer: { [key: string]: Feature<Geometry>[] } = {};\r\n\r\n list.forEach((feature) => {\r\n const layerName = feature.get('_layerName_');\r\n if (!byLayer[layerName]) {\r\n byLayer[layerName] = [];\r\n }\r\n byLayer[layerName].push(feature);\r\n });\r\n\r\n for (const layerName of Object.keys(byLayer)) {\r\n const layer = this._options.layers.find(\r\n (layer) => layer.get(BaseLayerProperty.NAME) === layerName\r\n );\r\n\r\n if (!layer) {\r\n continue;\r\n }\r\n\r\n byLayer[layerName].forEach((feature) => {\r\n removeFeatureFromEditList(feature);\r\n });\r\n\r\n let ok;\r\n try {\r\n ok = await layer.transactFeatures(\r\n TransactionType.Update,\r\n byLayer[layerName]\r\n );\r\n } catch (err) {\r\n return false;\r\n }\r\n\r\n if (ok === false) {\r\n return false;\r\n }\r\n }\r\n\r\n return true;\r\n }\r\n\r\n /**\r\n * Remove features from the edit Layer and from the Geoserver\r\n *\r\n * @param feature\r\n * @param confirm\r\n * @private\r\n */\r\n private _deleteFeature(\r\n feature: Feature<Geometry> | Feature<Geometry>[],\r\n confirm: boolean\r\n ): void {\r\n const deleteEl = () => {\r\n const features = Array.isArray(feature) ? feature : [feature];\r\n features.forEach((feature) => {\r\n feature.set('_delete_', true, true);\r\n getEditLayer().getSource().removeFeature(feature);\r\n });\r\n this._collectionModify.clear();\r\n\r\n this._editModeOff();\r\n this._syncEditOverlays();\r\n\r\n const layerName = features[0]?.get('_layerName_');\r\n const layer = layerName\r\n ? this._options.layers.find(\r\n (layer) => layer.get(BaseLayerProperty.NAME) === layerName\r\n )\r\n : null;\r\n\r\n if (layer instanceof WfsLayer) {\r\n features.forEach((feature) => {\r\n this._interactionWfsSelect.getFeatures().remove(feature);\r\n });\r\n }\r\n };\r\n\r\n if (confirm) {\r\n const features = Array.isArray(feature) ? feature : [feature];\r\n const message =\r\n features.length > 1\r\n ? i18n.I18N_('confirmDeleteElements', features.length)\r\n : i18n.I18N.labels.confirmDelete;\r\n\r\n const confirmModal = Modal.confirm(message, {\r\n ...this._options.modal\r\n });\r\n\r\n confirmModal.show().once('dismiss', function (modal, ev, button) {\r\n if (button && button.value) {\r\n deleteEl();\r\n }\r\n });\r\n } else {\r\n deleteEl();\r\n }\r\n }\r\n\r\n /**\r\n * Add a feature to the Edit Layer to allow editing, and creates an Overlay Helper to show options\r\n *\r\n * @param feature\r\n * @param coordinate\r\n * @param layerName\r\n * @private\r\n */\r\n private _addFeatureToEditMode(\r\n feature: Feature<Geometry>,\r\n coordinate: Coordinate = null,\r\n layerName = null\r\n ): void {\r\n if (layerName) {\r\n // Store the layer information inside the feature\r\n feature.set('_layerName_', layerName);\r\n }\r\n\r\n if (coordinate) {\r\n // Keep the click coordinate to position the overlay helper\r\n feature.set('_editOverlayCoord_', coordinate);\r\n }\r\n\r\n const props = feature ? feature.getProperties() : '';\r\n\r\n if (props) {\r\n if (feature.getGeometry()) {\r\n getEditLayer().getSource().addFeature(feature);\r\n this._collectionModify.push(feature);\r\n\r\n this._syncEditOverlays();\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Lock the whole current selection with a single LockFeature request per\r\n * layer, so the transaction LockId covers all the selected features\r\n *\r\n * @private\r\n */\r\n private async _lockSelectedFeatures(): Promise<void> {\r\n const byLayer: { [key: string]: Array<string | number> } = {};\r\n\r\n this._collectionModify.getArray().forEach((selected) => {\r\n const layerName = selected.get('_layerName_');\r\n\r\n if (!layerName) {\r\n return;\r\n }\r\n\r\n (byLayer[layerName] || (byLayer[layerName] = [])).push(\r\n selected.getId()\r\n );\r\n });\r\n\r\n const locks: Array<Promise<string>> = [];\r\n\r\n Object.keys(byLayer).forEach((layerName) => {\r\n const layer = getStoredLayer(layerName);\r\n\r\n if (layer) {\r\n locks.push(layer.maybeLockFeature(byLayer[layerName]));\r\n }\r\n });\r\n\r\n if (locks.length) {\r\n await Promise.all(locks);\r\n }\r\n }\r\n\r\n /**\r\n * Create an EditOverlay helper and attach the edit listeners\r\n *\r\n * @param feature\r\n * @param coordinate\r\n * @param id\r\n * @private\r\n */\r\n private _createEditOverlay(\r\n feature: Feature<Geometry> = null,\r\n coordinate: Coordinate = null,\r\n id: string | number = null\r\n ): void {\r\n coordinate =\r\n coordinate || (feature ? feature.get('_editOverlayCoord_') : null);\r\n\r\n const overlay = new EditOverlay(feature, coordinate, id);\r\n\r\n // @ts-expect-error\r\n overlay.on('editFields', () => {\r\n this._editFields.show(this._collectionModify.getArray());\r\n });\r\n\r\n // @ts-expect-error\r\n overlay.on('editGeom', () => {\r\n this._editModeOn(this._collectionModify.getArray());\r\n });\r\n\r\n this._map.addOverlay(overlay);\r\n }\r\n\r\n /**\r\n * Sync the edit overlay helpers with the current selection: a single\r\n * per-feature overlay while a feature is selected, or a unique overlay\r\n * centered between all the selected features when editing several at once\r\n *\r\n * @private\r\n */\r\n private _syncEditOverlays(): void {\r\n if (getMode() === Modes.Edit) {\r\n return;\r\n }\r\n\r\n const multiOverlay = this._map.getOverlayById(this._multiOverlayId);\r\n if (multiOverlay) {\r\n this._map.removeOverlay(multiOverlay);\r\n }\r\n\r\n const items: Feature<Geometry>[] = this._collectionModify.getArray();\r\n\r\n if (items.length > 1) {\r\n items.forEach((feature) => {\r\n this._removeOverlayHelper(feature);\r\n });\r\n\r\n const extent: Extent = createEmpty();\r\n items.forEach((feature) => {\r\n extend(extent, feature.getGeometry().getExtent());\r\n });\r\n\r\n this._createEditOverlay(\r\n null,\r\n getCenter(extent),\r\n this._multiOverlayId\r\n );\r\n } else if (items.length === 1) {\r\n const feature = items[0];\r\n const featureId = feature.getId();\r\n\r\n if (featureId && !this._map.getOverlayById(featureId)) {\r\n this._createEditOverlay(feature);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Activate/deactivate the draw mode\r\n *\r\n * @param layer\r\n * @public\r\n */\r\n activateDrawMode(layer: WfsLayer | WmsLayer | false): void {\r\n /**\r\n *\r\n * @param layer\r\n * @private\r\n */\r\n const addDrawInteraction = (layer: WfsLayer | WmsLayer): void => {\r\n this.activateEditMode(false);\r\n\r\n // If already exists, remove\r\n if (this._interactionDraw) {\r\n this._map.removeInteraction(this._interactionDraw);\r\n }\r\n\r\n const geomDrawType = this._selectDraw.value;\r\n\r\n this._interactionDraw = new Draw({\r\n source: getEditLayer().getSource(),\r\n type: geomDrawType as GeometryType,\r\n style: (feature: Feature<Geometry>) => styleFunction(feature),\r\n stopClick: true // To prevent firing a map/wms click\r\n });\r\n\r\n this._map.addInteraction(this._interactionDraw);\r\n\r\n this._interactionDraw.on('drawstart', (evt) => {\r\n super.dispatchEvent(evt);\r\n });\r\n\r\n this._interactionDraw.on('drawend', (evt) => {\r\n const feature: Feature<Geometry> = evt.feature;\r\n layer.transactFeatures(TransactionType.Insert, feature);\r\n super.dispatchEvent(evt);\r\n });\r\n };\r\n\r\n if (!this._interactionDraw && !layer) {\r\n return;\r\n }\r\n\r\n if (layer) {\r\n // If layer is set to invisible, show warning\r\n if (!layer.getVisible()) {\r\n return;\r\n }\r\n\r\n // Clear hover style while drawing\r\n this._clearHoverState();\r\n\r\n activateDrawButton();\r\n deactivateSelectModeButton();\r\n\r\n this._viewport.classList.add('draw-mode');\r\n\r\n addDrawInteraction(layer);\r\n } else {\r\n this._map.removeInteraction(this._interactionDraw);\r\n this._viewport.classList.remove('draw-mode');\r\n activateSelectModeButton(getSelectionMode());\r\n }\r\n\r\n activateMode(layer ? Modes.Draw : null);\r\n this._refreshSelectionInteractions();\r\n }\r\n\r\n /**\r\n * Activate/desactivate the edit mode\r\n *\r\n * @param bool\r\n * @public\r\n */\r\n activateEditMode(bool = true): void {\r\n if (bool) {\r\n activateModeButtons();\r\n this.activateDrawMode(false);\r\n } else {\r\n // Deselct features\r\n this._collectionModify.clear();\r\n // Clear hover state when leaving the edit mode\r\n this._clearHoverState();\r\n }\r\n\r\n if (this._interactionSelectModify) {\r\n this._interactionSelectModify.setActive(bool);\r\n }\r\n\r\n this._interactionModify.setActive(bool);\r\n\r\n if (this._interactionWfsSelect)\r\n this._interactionWfsSelect.setActive(bool);\r\n\r\n this._refreshSelectionInteractions();\r\n }\r\n\r\n /**\r\n * Reset the cursor and remove the hover style of the last hovered feature\r\n * @private\r\n */\r\n private _clearHoverState(): void {\r\n if (this._viewport) {\r\n this._viewport.style.cursor = '';\r\n }\r\n\r\n if (this._hoveredFeature) {\r\n this._hoveredFeature.setStyle(undefined);\r\n this._hoveredFeature = null;\r\n }\r\n }\r\n\r\n /**\r\n * Change the map cursor while in edit mode: `move` when the pointer is\r\n * over an editable vertex and `copy` when it is over a segment (where a\r\n * new vertex can be inserted), mirroring the Modify interaction hit\r\n * tolerance.\r\n *\r\n * @param evt\r\n * @private\r\n */\r\n private _updateEditCursor(evt: MapBrowserEvent<PointerEvent>): void {\r\n if (!this._collectionModify) {\r\n return;\r\n }\r\n\r\n const tolerance = 12;\r\n const toleranceSq = tolerance * tolerance;\r\n const pixel = evt.pixel;\r\n\r\n for (const feature of this._collectionModify.getArray()) {\r\n const vertices = getFeatureVertices(feature);\r\n const coordinates = vertices ? vertices.getCoordinates() : [];\r\n\r\n if (!coordinates.length) {\r\n continue;\r\n }\r\n\r\n // Hovering an existing vertex (draggable handle)\r\n for (const coordinate of coordinates) {\r\n const vertexPixel =\r\n this._map.getPixelFromCoordinate(coordinate);\r\n if (squaredDistance(vertexPixel, pixel) <= toleranceSq) {\r\n this._viewport.style.cursor = 'move';\r\n return;\r\n }\r\n }\r\n\r\n // Hovering a segment (allows inserting a new vertex)\r\n for (let i = 0; i < coordinates.length - 1; i++) {\r\n const start = this._map.getPixelFromCoordinate(coordinates[i]);\r\n const end = this._map.getPixelFromCoordinate(\r\n coordinates[i + 1]\r\n );\r\n if (\r\n squaredDistanceToSegment(pixel, [start, end]) <= toleranceSq\r\n ) {\r\n this._viewport.style.cursor = 'copy';\r\n return;\r\n }\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Remove the overlay helper atttached to a specify feature\r\n * @param feature\r\n * @private\r\n */\r\n private _removeOverlayHelper(feature: FeatureLike): void {\r\n const featureId = feature.getId();\r\n\r\n if (!featureId) {\r\n return;\r\n }\r\n\r\n const overlay = this._map.getOverlayById(featureId);\r\n\r\n if (!overlay) {\r\n return;\r\n }\r\n\r\n this._map.removeOverlay(overlay);\r\n }\r\n}\r\n\r\n/**\r\n * **_[interface]_** - Wfst Options specified when creating a Wfst instance\r\n *\r\n * Default values:\r\n * ```javascript\r\n * {\r\n * layers: null,\r\n * evtType: 'singleclick',\r\n * active: true,\r\n * showControl: true,\r\n * fullscreen: true,\r\n * language: 'en',\r\n * i18n: {...}, // according to language selection\r\n * uploadFormats: '.geojson,.json,.kml',\r\n * processUpload: null,\r\n * }\r\n * ```\r\n */\r\ninterface Options {\r\n /**\r\n * Layers to be loaded from the geoserver\r\n */\r\n layers?: Array<WfsLayer | WmsLayer>;\r\n\r\n /**\r\n * Init active\r\n */\r\n active?: boolean;\r\n\r\n /**\r\n * The click event to allow selection of Features to be edited\r\n */\r\n evtType?: 'singleclick' | 'dblclick';\r\n\r\n /**\r\n * Show/hide the control map\r\n */\r\n showControl?: boolean;\r\n\r\n /**\r\n * Show/hide the fullscreen button on the map\r\n */\r\n fullscreen?: boolean;\r\n\r\n /**\r\n * Modal configuration\r\n */\r\n modal?: {\r\n animateClass?: string;\r\n animateInClass?: string;\r\n transition?: number;\r\n backdropTransition?: number;\r\n templates?: {\r\n dialog?: string | HTMLElement;\r\n headerClose?: string | HTMLElement;\r\n };\r\n };\r\n\r\n /**\r\n * Language to be used\r\n */\r\n language?: 'es' | 'en' | 'zh';\r\n\r\n /**\r\n * Custom translations\r\n */\r\n i18n?: I18n;\r\n\r\n /**\r\n * Show/hide the upload button\r\n */\r\n showUpload?: boolean;\r\n\r\n /**\r\n * Accepted extension formats on upload\r\n * Example: \".json,.geojson\"\r\n */\r\n uploadFormats?: string;\r\n\r\n /**\r\n * Triggered to allow implement custom functions or to parse other formats than default\r\n * by filtering the extension. If this doesn't return features, the default function\r\n * will be used to extract them.\r\n */\r\n processUpload?(file: File): Array<Feature<Geometry>>;\r\n}\r\n\r\n/**\r\n * **_[interface]_** - Parameters to create the layers and connect to the GeoServer\r\n *\r\n * You can use all the parameters supported by OpenLayers\r\n *\r\n * Default values:\r\n * ```javascript\r\n * {\r\n * name: null,\r\n * geoserver: null,\r\n * label: null, // `name` if not provided\r\n * strategy: all,\r\n * geoserverVendor: null\r\n * }\r\n * ```\r\n */\r\ninterface LayerOptions extends Omit<VectorLayerOptions<any, any>, 'source'> {\r\n /**\r\n * Layer name in the GeoServer\r\n */\r\n name: string;\r\n\r\n /**\r\n * Geoserver Object\r\n */\r\n geoserver: Geoserver;\r\n\r\n /**\r\n * Label to be displayed in the widget control\r\n */\r\n label?: string;\r\n\r\n /**\r\n * Available geoserver options\r\n */\r\n geoserverVendor?: WfsGeoserverVendor | WmsGeoserverVendor;\r\n\r\n /**\r\n * Strategy function for loading features.\r\n * Only for WFS\r\n * By default `all` strategy is used\r\n */\r\n strategy?: LoadingStrategy;\r\n\r\n /**\r\n * Triggered before inserting new features to the Geoserver.\r\n * Use this to insert custom properties, modify the feature, etc.\r\n */\r\n beforeTransactFeature?(\r\n feature: Feature<Geometry>,\r\n transaction: TransactionType\r\n ): Feature<Geometry>;\r\n\r\n /**\r\n * Hook to customize the html elements showed in the fields modal\r\n * Return `null` to hide the field from the modal\r\n */\r\n beforeShowFieldsModal?: (\r\n field: IProperty,\r\n value: string,\r\n formElement: HTMLElement\r\n ) => HTMLElement | string | null;\r\n}\r\nclass WfstEvent extends BaseEvent {\r\n public data: IGeoserverDescribeFeatureType;\r\n public layer: WfsLayer | WmsLayer;\r\n\r\n constructor(options: {\r\n type: WfstEventTypes;\r\n layer: WfsLayer | WmsLayer;\r\n data: IGeoserverDescribeFeatureType;\r\n }) {\r\n super(options.type);\r\n this.layer = options.layer;\r\n this.data = options.data;\r\n }\r\n}\r\n\r\ntype WfstEventTypes = 'describeFeatureType';\r\n\r\nexport {\r\n Options,\r\n WfstEventTypes,\r\n WfstEvent,\r\n I18n,\r\n LayerOptions,\r\n Geoserver,\r\n WmsLayer,\r\n WfsLayer\r\n};\r\n","import { I18N } from './modules/i18n';\r\nimport { Options } from './ol-wfst';\r\n\r\nexport const DEFAULT_LANGUAGE = 'en';\r\n\r\nexport const getDefaultOptions = (): Options => {\r\n return {\r\n layers: null,\r\n evtType: 'singleclick',\r\n active: true,\r\n showControl: true,\r\n fullscreen: true,\r\n language: DEFAULT_LANGUAGE,\r\n uploadFormats: '.geojson,.json,.kml',\r\n processUpload: null,\r\n modal: {\r\n animateClass: 'fade',\r\n animateInClass: 'show',\r\n transition: 300,\r\n backdropTransition: 150,\r\n templates: {\r\n dialog: '<div class=\"modal-dialog modal-dialog-centered\"></div>',\r\n headerClose: `<button type=\"button\" class=\"btn-close\" data-dismiss=\"modal\" aria-label=\"${I18N.labels.close}\"><span aria-hidden=\"true\">×</span></button>`\r\n }\r\n }\r\n };\r\n};\r\n","import Wfst from './ol-wfst';\r\nimport WfsLayer from './WfsLayer';\r\nimport WmsLayer from './WmsLayer';\r\nimport Geoserver from './Geoserver';\r\n\r\nconst utils = {\r\n WfsLayer,\r\n WmsLayer,\r\n Geoserver\r\n};\r\n\r\nObject.assign(Wfst, utils);\r\nexport default Wfst;\r\n"],"names":["_factory","_defaults","Object","freeze","el","animate","animateClass","animateInClass","appendTo","backdrop","keyboard","title","header","content","footer","buttons","headerClose","construct","transition","backdropTransition","_buttons","deepFreeze","obj","k","Array","isArray","forEach","v","dialog","text","value","attr","class","alert","confirm","_templates","container","body","data","prop","prefix","elData","dataAttr","getAttribute","build","html","all","nodeName","replace","document","createElement","innerHTML","childNodes","getPath","node","nodes","parentNode","push","Modal","EventEmitter","templates","this","_baseTemplates","assign","_baseButtons","options","_baseOptions","version","message","_options","question","constructor","super","id","Math","random","toString","_html","_events","_visible","_pointerInContent","querySelector","_scrollbarWidth","inner","width","outerWidth","outer","style","visibility","appendChild","offsetWidth","overflow","removeChild","calcScrollbarWidth","Error","_render","_mapDom","o","t","classList","add","_setHeader","_setContent","_setFooter","contains","outerHTML","ineerHTML","children","length","button","setAttribute","j","_setEvents","keydownHandler","_handleKeydownEvent","bind","addEventListener","mousedownHandler","_handleMousedownEvent","clickHandler","_handleClickEvent","resizeHandler","_handleResizeEvent","window","e","target","every","tagName","emit","hide","which","_resize","show","_checkScrollbar","_setScrollbar","display","scrollTop","once","setTimeout","_backdrop","toggle","modalIsOverflowing","scrollHeight","documentElement","clientHeight","paddingLeft","bodyIsOverflowing","paddingRight","contCList","remove","_removeEvents","originalBodyPad","removeEventListener","clientWidth","innerWidth","basePadding","parseInt","isError","Set","parseError","geoserverResponse","exceptions","map","join","showError","msg","originalError","layerName","has","err_msg","al","on","delete","en","labels","select","selectBox","selectFreehand","query","featureInfo","addElement","editElement","save","cancel","apply","upload","editMode","confirmDelete","confirmDeleteElements","geomTypeNotSupported","editFields","editGeom","continueLine","selectDrawType","uploadToLayer","uploadFeatures","validFeatures","invalidFeatures","loading","toggleVisibility","fullscreen","close","multipleValues","editElements","multipleEditNotice","geoserverLayers","errors","capabilities","wfst","layer","layerNotFound","layerNotVisible","noValidGeometry","geoserver","badFormat","badFile","lockFeature","transaction","getFeatures","langs","es","zh","I18N","I18N_","string","args","_a","console","error","arg","loadingDiv","showLoading","bool","copyProps","dest","src","exclude","props","getOwnPropertyDescriptors","defineProperties","protoChain","currentChain","proto","getPrototypeOf","hardMixProtos","ingredients","base","objs","commonProto","protoChains","protos","pop","potentialCommonProto","nearestCommonProto","prototype","mixedProto","create","visitedProtos","i","newProto","indexOf","unique","arr","filter","mixins","WeakMap","getMixinsForClass","clazz","get","mergeObjectsOfDecorators","o1","o2","_b","allKeys","getOwnPropertyNames","mergedObject","key","mergePropertyAndMethodDecorators","d1","d2","_c","_d","property","method","decorators","Map","deepDecoratorSearch","classes","decoratorsForClassChain","allClasses","frontier","size","newClasses","c","newClass","findAllConstituentClasses","reduce","_e","_f","static","instance","mergeDecorators","Mixin","constructors","prototypes","MixedClass","setPrototypeOf","DecoratedMixedClass","classDecorators","decorator","result","applyPropAndMethodDecorators","mixedClass","constituents","set","propAndMethodDecorators","propDecorators","methodDecorators","getOwnPropertyDescriptor","GeometryType","TransactionType","layerToInsertElements","mode","Modes","SelectionMode","selectionMode","Single","activateMode","m","getMode","getSelectionMode","editedFeatures","mapLayers","getMap","setActiveLayerToInsertEls","getActiveLayerToInsertEls","getStoredMapLayers","getStoredLayer","addFeatureToEditedList","feature","String","getId","removeFeatureFromEditList","isFeatureEdited","BaseLayer","Layer","_init","getGeoserver","isLoaded","getAndUpdateDescribeFeatureType","Promise","resolve","async","BaseLayerProperty","NAME","layerLabel","LABEL","params","URLSearchParams","service","getAdvanced","describeFeatureTypeVersion","request","typeName","outputFormat","url_fetch","getUrl","response","fetch","headers","getHeaders","credentials","getCredentials","ok","json","targetNamespace","properties","featureTypes","geom","find","type","_parsed","namespace","geomType","localType","geomField","name","DESCRIBEFEATURETYPE","err","isVisibleByZoom","getView","getZoom","getMinZoom","transactFeatures","features","transact","insertFeatures","Insert","maybeLockFeature","featureIds","getUseLockFeature","hasLockFeature","GEOSERVER","getDescribeFeatureType","WfsSource","VectorSource","format","GeoJSON","loader","extent","resolution","projection","success","failure","strategy","bbox","extentGeoServer","transformExtent","getCode","geoServerAdvanced","urlParams","geoserverUrl","getFormat","readFeatures","featureProjection","dataProjection","addFeatures","removeLoadedExtent","SERVICE","REQUEST","OUTPUTFORMAT","EXCEPTIONS","getFeatureVersion","WfsLayer","label","minZoom","_loadingCount","_loadedCount","beforeTransactFeature","source","geoserverVendor","dispatchEvent","setSource","geoserverOptions","keys","param","refresh","getSource","setCustomParam","paramName","TileState","WmsSource","TileWMS","url","serverType","TILED","LAYERS","tileLoadFunction","tile","blob","parsedError","reader","FileReader","onloadend","JSON","parse","readAsText","getImage","URL","createObjectURL","setState","WmsLayer","_getFullResGeometryById","featuresId","queryParams","VERSION","INFO_FORMAT","TYPENAME","MAXFEATURES","SRSNAME","getProjection","FEATUREID","getUrls","status","fullById","_parseFeaturesFromResponse","Boolean","beforeShowFieldsModal","_formatGeoJSON","_getFeaturesByClickEvent","evt","coordinate","view","buffer","getResolution","BUFFER","FEATURE_COUNT","_requestFeatures","_getFeaturesInGeometry","geometry","viewProj","nativeSrs","_getNativeSrs","polygon","clone","transform","ringWkt","getCoordinates","x","y","sridMatch","match","cql","CQL_FILTER","layerLocalName","split","featureTypeList","getParsedCapabilities","FeatureTypeList","featureType","ft","featureTypeName","Name","undefined","epsgMatch","DefaultCRS","advanced","f","fullResList","getParams","Date","getMilliseconds","updateParams","elem","createDocumentFragment","HTMLElement","entries","startsWith","slice","toLowerCase","child","append","Node","jsx","jsxs","Fragment","resetStateButtons","activeBtn","deactivateQueryButton","btn","activateSelectModeButton","btnMap","Box","Freehand","deactivateSelectModeButton","LayersControl","Observable","uploads","uploadFormats","_uploads","_uploadFormats","addLayerEl","checked","input","_jsx","className","onChange","_layerChangeHandler","layerDom","getVisible","_jsxs","htmlFor","onClick","_visibilityClickHandler","Event","_changeStateSelect","geomDrawTypeSelected","setSelectState","from","selectDraw","option","selected","disabled","includes","drawType","geomLayer","GeometryCollection","LineString","LinearRing","Circle","Polygon","parentDiv","currentTarget","closest","dataset","setVisible","render","_Fragment","selectedValue","Point","MultiPoint","MultiLineString","MultiPolygon","accept","process","editLayer","VectorLayer","zIndex","getEditLayer","Uploads","_processUpload","processUpload","_formatWFS","WFS","_formatKml","KML","extractStyles","showPointNames","_xs","XMLSerializer","file","files","extension","_fileReader","invalidFeaturesCount","validFeaturesCount","featuresToInsert","_checkGeometry","_fixGeometry","VectorSourceEvent","_initModal","reject","fileData","geomTypeLayer","getGeometry","getType","coords","setGeometry","geomTypeFeature","modal","event","action","clear","deepObjectAssign","sources","s_val","t_val","EditControlChangesEl","Control","element","_dispatch","editVertexStyles","highlighted","halo","haloColor","radius","border","borderWidth","Style","image","CircleStyle","fill","Fill","color","stroke","Stroke","getFeatureVertices","getGeometries","coordinates","flatCoordinates","flat","styleFunction","hovered","haloStyle","Edit","Draw","EditFieldsModal","_modal","formElements","elements","multipleFields","multiple","field","_features","changed","modalTitle","describeFeatureType","fieldList","autocomplete","flatMap","values","uniqueValues","hasMultipleValues","placeholder","hookInput","DOMParser","parseFromString","NAMESPACE_URIS","PARSERS","makeStructureNS","ServiceIdentification","makeObjectPropertySetter","objectStack","pushParseAndPop","SERVICE_IDENTIFICATION_PARSERS","ServiceProvider","SERVICE_PROVIDER_PARSERS","OperationsMetadata","OPERATIONS_METADATA_PARSERS","FEATURE_TYPE_LIST_PARSERS","Filter_Capabilities","FILTER_CAPABILITIES_PARSERS","Title","readString","Abstract","Keywords","readKeywordList","ServiceType","ServiceTypeVersion","Fees","AccessConstraints","ProviderName","ServiceContact","SERVICE_CONTACT_PARSERS","Operation","makeObjectPropertyPusher","operation","OPERATION_PARSERS","readOperation","Constraint","readNamedConstraint","IndividualName","PositionName","ContactInfo","CONTACT_INFO_PARSERS","Phone","PHONE_PARSERS","Address","ADDRESS_PARSERS","Voice","Facsimile","DeliveryPoint","City","AdministrativeArea","PostalCode","Country","ElectronicMailAddress","FeatureType","makeArrayPusher","FEATURE_TYPE_PARSERS","WGS84BoundingBox","WGS84_BOUNDINGBOX_PARSERS","MetadataURL","readHref","DCP","DCP_PARSERS","Parameter","parameter","PARAMETER_PARSERS","readParameter","AllowedValues","readValueList","CONSTRAINT_PARSERS","NoValues","DefaultValue","HTTP_PARSERS","Get","Post","LowerCorner","readStringCoords","UpperCorner","HTTP","KEYWORDLIST_PARSERS","Keyword","VALUELIST_PARSERS","Value","Conformance","CONFORMANCE_PARSERS","Id_Capabilities","ID_CAPABILITIES_PARSERS","Scalar_Capabilities","SCALAR_CAPABILITIES_PARSERS","Spatial_Capabilities","SPATIAL_CAPABILITIES_PARSERS","Temporal_Capabilities","TEMPORAL_CAPABILITIES_PARSERS","Functions","FUNCTIONS_PARSERS","ResourceIdentifier","LogicalOperators","LOGICAL_OPERATORS_PARSERS","ComparisonOperators","COMPARISON_OPERATORS_PARSERS","GeometryOperands","GEOMETRY_OPERANDS_PARSERS","SpatialOperators","SPATIAL_OPERATORS_PARSERS","TemporalOperands","TEMPORAL_OPERANDS_PARSERS","TemporalOperators","TEMPORAL_OPERATORS_PARSERS","Function","func","FUNCTION_PARSERS","readFunction","Returns","Arguments","ARGUMENTS_PARSERS","Argument","argument","ARGUMENT_PARSERS","readArgument","Type","LogicalOperator","readNamedOnly","ComparisonOperator","GeometryOperand","SpatialOperator","TemporalOperand","TemporalOperator","constraint","readConstraint","getAllTextContent","Number","parser","XML","readFromNode","trim","wfsCapabilityObject","GeoserverProperty","EditOverlay","Overlay","position","getCenter","getExtent","positioning","offset","stopEvent","ExtendLineOverlay","side","component","QueryOverlay","parsed","fields","rows","stringify","autoPan","controlElement","Wfst","_map","_initialized","_queryOverlayId","_shiftPressed","_hoveredFeature","_keySelectBound","_editFeaturesOriginal","_multiOverlayId","_extendOverlays","lang","customI18n","i18n.setLang","language","i18n","defaultOptions","layers","evtType","active","showControl","_controlWidgetToolsDiv","_editFields","getLayers","getLayerByName","_initMapAndLayers","layerRendered","layersNumber","layerInitPromises","isVisible","_view","domEl","_layersControl","ISVISIBLE","_currentZoom","WfstEvent","addLayer","setMapLayers","_createMapElements","race","opts","_viewport","getViewport","activateEditMode","editLayerSource","fit","getSize","maxZoom","padding","list","_transactEditList","_collectionModify","_deleteFeature","_addMapEvents","_addMiddleButtonPan","_layersWidgetDiv","addControl","_prepareEditLayer","_addInteractions","_addInteractionHandlers","_prepareHighlightLayer","_addQueryInteraction","_addMapControl","FullScreen","tipLabel","i18n.I18N","labelActive","prepareWfsInteraction","Collection","_interactionWfsSelect","Select","hitTolerance","toggleCondition","shiftKeyOnly","Query","addInteraction","deselected","mapBrowserEvent","_clearHoverState","getLayer","removeFeature","_addFeatureToEditMode","_lockSelectedFeatures","prepareWmsInteraction","_interactionSelectModify","removeCondition","selectedSet","getArray","_keyClickWms","hasFeatureAtPixel","pixel","_interactionModify","Modify","condition","primaryAction","_interactionSnap","Snap","_addSelectionInteractions","selectionStyle","lineDash","_interactionDragBox","DragBox","_isSelectMode","originalEvent","shiftKey","_selectByGeometry","_interactionFreehandSelect","freehand","stopClick","ring","getArea","_refreshSelectionInteractions","setActive","candidates","getFeaturesInExtent","featureGeom","flatCoords","getFlatCoordinates","stride","getStride","intersectsCoordinate","_selectFeatures","selectedIds","hasFeature","_highlightSource","_highlightLayer","_keyClickQuery","featuresAtPixel","getFeaturesAtPixel","layerFilter","candidate","_showQueryResult","_clearQueryResult","addFeature","_queryOverlay","addOverlay","_removeQueryOverlay","removeOverlay","overlay","getOverlayById","activateQueryMode","_interactionDraw","removeInteraction","activateQueryButton","_syncExtendLineOverlays","selectedFeatures","keyboardEvents","dragging","_updateEditCursor","setStyle","cursor","_lastZoom","viewport","panning","lastX","lastY","pointerType","isMiddleButton","preventDefault","stopPropagation","setPointerCapture","pointerId","clientX","clientY","getAnimating","cancelAnimations","delta","rotation","getRotation","cosAngle","cos","sinAngle","sin","adjustCenterInternal","endPan","_updateExtendOverlayPositions","_onDeselectFeatureEvent","_onRemoveFeatureEvent","showUpload","activateDrawMode","evtName","controlEl","_selectDraw","_deselectEditFeature","_removeOverlayHelper","_restoreFeatureToLayer","_removeFeatureFromTmpLayer","checkIfFeatureIsChanged","Update","_keySelect","unByKey","_syncEditOverlays","_editModeOff","_keyRemove","Delete","_editModeOn","multiOverlay","_controlApplyDiscardChanges","original","_destroyExtendLineOverlays","removeControl","_getLineEndPoints","endPoints","collect","collection","line","first","getFirstCoordinate","last","getLastCoordinate","lineIndex","appendLine","getGeometriesArray","member","_extendDraw","_finishExtendDraw","items","removed","exists","some","_startExtendLineDraw","point","setPosition","points","anchor","_mergeExtendLine","appendCoordinates","sketch","segment","setCoordinates","reverse","byLayer","deleteEl","i18n.I18N_","ev","getProperties","locks","_createEditOverlay","createEmpty","extend","featureId","addDrawInteraction","geomDrawType","activateDrawButton","activateModeButtons","vertices","vertexPixel","getPixelFromCoordinate","squaredDistance","tolerance","start","end","squaredDistanceToSegment","BaseEvent","utils","Geoserver","BaseObject","defaults","getCapabilitiesVersion","lockFeatureVersion","wfsTransactionVersion","lockFeatureParams","expiry","lockId","releaseAction","useLockFeature","setAdvanced","setHeaders","setCredentials","setUrl","setUseLockFeature","_countRequests","_insertFeatures","_updateFeatures","_deleteFeatures","_lockedId","getAndUpdateCapabilities","_checkGeoserverCapabilities","getCapabilities","CAPABILITIES","PARSED_CAPABILITIES","opt_silent","HEADERS","CREDENTIALS","ADVANCED","hasTransaction","HASTRASNACTION","HASLOCKFEATURE","USELOCKFEATURE","ISLOADED","getState","state_","parsedCapabilities","read","operations","HASDESCRIBEFEATURETYPE","getElementsByTagName","transactionType","clonedFeatures","geoLayer","_cloneFeature","cloneGeom","_transformGeoemtryCollectionToGeometries","_transformCircleToPolygon","numberRequest","srs","layerNameClean","featureNS","srsName","featurePrefix","nativeElements","writeTransaction","payload","serializeToString","gmemberIn","gmemberOut","responseStr","parseResponse","readTransactionResponse","wlayer","findError","_removeFeatures","geomConverted","fromCircle","featureProperties","boundedBy","_layerName_","_editOverlayCoord_","Feature","setId","retry","handle","featureid","dataParsed","code","dataDoc","lockIdNode","getElementsByTagNameNS","textContent","parseErr"],"mappings":"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","x_google_ignoreList":[0,7,13,24]}
|
|
1
|
+
{"version":3,"file":"ol-wfst.min.js","sources":["../node_modules/modal-vanilla/lib/modal.js","../src/modules/errors.ts","../src/modules/i18n/en.ts","../src/modules/i18n/index.ts","../src/modules/i18n/es.ts","../src/modules/i18n/zh.ts","../src/modules/loading.ts","../node_modules/ts-mixer/dist/esm/index.js","../src/@enums.ts","../src/modules/state.ts","../src/modules/base/BaseLayer.ts","../src/modules/base/WfsSource.ts","../src/WfsLayer.ts","../node_modules/ol/TileState.js","../src/modules/base/WmsSource.ts","../src/WmsLayer.ts","../src/jsx-runtime.ts","../src/modules/LayersControl.tsx","../src/modules/editLayer.ts","../src/modules/Uploads.ts","../src/modules/helpers.ts","../src/modules/EditControlChanges.tsx","../src/modules/styleFunction.ts","../src/modules/EditFieldsModal.tsx","../node_modules/ol-wfs-capabilities/lib/WFSCapabilities.js","../src/Geoserver.ts","../src/modules/EditOverlay.tsx","../src/modules/ExtendLineOverlay.tsx","../src/modules/QueryOverlay.tsx","../src/ol-wfst.ts","../src/defaults.ts","../src/index-umd.ts"],"sourcesContent":["/**\n * Vanilla JS Modal compatible with Bootstrap\n * modal-vanilla 0.12.0 <https://github.com/KaneCohen/modal-vanilla>\n * Copyright 2020 Kane Cohen <https://github.com/KaneCohen>\n * Available under BSD-3-Clause license\n */\nimport EventEmitter from 'events';\n\nlet _factory = null;\n\nconst _defaults = Object.freeze({\n el: null, // Existing DOM element that will be 'Modal-ized'.\n animate: true, // Show Modal using animation.\n animateClass: 'fade', //\n animateInClass: 'show', //\n appendTo: 'body', // DOM element to which constructed Modal will be appended.\n backdrop: true, // Boolean or 'static', Show Modal backdrop blocking content.\n keyboard: true, // Close modal on esc key.\n title: false, // Content of the title in the constructed dialog.\n header: true, // Show header content.\n content: false, // Either string or an HTML element.\n footer: true, // Footer content. By default will use buttons.\n buttons: null, //\n headerClose: true, // Show close button in the header.\n construct: false, // Creates new HTML with a given content.\n transition: 300, //\n backdropTransition: 150 //\n});\n\nconst _buttons = deepFreeze({\n dialog: [\n {text: 'Cancel',\n value: false,\n attr: {\n 'class': 'btn btn-default',\n 'data-dismiss': 'modal'\n }\n },\n {text: 'OK',\n value: true,\n attr: {\n 'class': 'btn btn-primary',\n 'data-dismiss': 'modal'\n }\n }\n ],\n alert: [\n {text: 'OK',\n attr: {\n 'class': 'btn btn-primary',\n 'data-dismiss': 'modal'\n }\n }\n ],\n confirm: [\n {text: 'Cancel',\n value: false,\n attr: {\n 'class': 'btn btn-default',\n 'data-dismiss': 'modal'\n }\n },\n {text: 'OK',\n value: true,\n attr: {\n 'class': 'btn btn-primary',\n 'data-dismiss': 'modal'\n }\n }\n ]\n});\n\nconst _templates = {\n container: '<div class=\"modal\"></div>',\n dialog: '<div class=\"modal-dialog\"></div>',\n content: '<div class=\"modal-content\"></div>',\n header: '<div class=\"modal-header\"></div>',\n headerClose: '<button type=\"button\" class=\"close\" data-dismiss=\"modal\" aria-label=\"Close\"><span aria-hidden=\"true\">×</span></button>',\n body: '<div class=\"modal-body\"></div>',\n footer: '<div class=\"modal-footer\"></div>',\n backdrop: '<div class=\"modal-backdrop\"></div>'\n};\n\nfunction deepFreeze(obj) {\n for (let k in obj) {\n if (Array.isArray(obj[k])) {\n obj[k].forEach(v => {\n deepFreeze(v);\n });\n } else if (obj[k] !== null && typeof obj[k] === 'object') {\n Object.freeze(obj[k]);\n }\n }\n return Object.freeze(obj);\n}\n\nfunction guid() {\n return (((1 + Math.random()) * 0x10000) | 0).toString(16) +\n (((1 + Math.random()) * 0x10000) | 0).toString(16);\n}\n\nfunction data(el, prop, value) {\n let prefix = 'data';\n let elData = el[prefix] || {};\n if (typeof value === 'undefined') {\n if (el[prefix] && el[prefix][prop]) {\n return el[prefix][prop];\n } else {\n var dataAttr = el.getAttribute(`${prefix}-${prop}`);\n if (typeof dataAttr !== 'undefined') {\n return dataAttr;\n }\n return null;\n }\n } else {\n elData[prop] = value;\n el[prefix] = elData;\n return el;\n }\n}\n\nfunction build(html, all) {\n if (html.nodeName) return html;\n html = html.replace(/(\\t|\\n$)/g, '');\n\n if (!_factory) {\n _factory = document.createElement('div');\n }\n\n _factory.innerHTML = '';\n _factory.innerHTML = html;\n if (all === true) {\n return _factory.childNodes;\n } else {\n return _factory.childNodes[0];\n }\n}\n\nfunction calcScrollbarWidth() {\n let inner;\n let width;\n let outerWidth;\n let outer = document.createElement('div');\n Object.assign(outer.style, {\n visibility: 'hidden',\n width: '100px'\n });\n document.body.appendChild(outer);\n\n outerWidth = outer.offsetWidth;\n outer.style.overflow = 'scroll';\n\n inner = document.createElement('div');\n inner.style.width = '100%';\n outer.appendChild(inner);\n\n width = outerWidth - inner.offsetWidth;\n document.body.removeChild(outer);\n\n return width;\n}\n\nfunction getPath(node) {\n let nodes = [node];\n while (node.parentNode) {\n node = node.parentNode;\n nodes.push(node);\n }\n return nodes;\n}\n\nclass Modal extends EventEmitter {\n static set templates(templates) {\n this._baseTemplates = templates;\n }\n\n static get templates() {\n return Object.assign({}, _templates, Modal._baseTemplates || {});\n }\n\n static set buttons(buttons) {\n this._baseButtons = buttons;\n }\n\n static get buttons() {\n return Object.assign({}, _buttons, Modal._baseButtons || {});\n }\n\n static set options(options) {\n this._baseOptions = options;\n }\n\n static get options() {\n return Object.assign({}, _defaults, Modal._baseOptions || {});\n }\n\n static get version() {\n return '0.12.0';\n }\n\n static alert(message, _options = {}) {\n let options = Object.assign({},\n _defaults,\n {\n title: message,\n content: false,\n construct: true,\n headerClose: false,\n buttons: Modal.buttons.alert\n },\n _options\n );\n\n return new Modal(options);\n }\n\n static confirm(question, _options = {}) {\n let options = Object.assign({},\n _defaults,\n {\n title: question,\n content: false,\n construct: true,\n headerClose: false,\n buttons: Modal.buttons.confirm\n },\n _options\n );\n\n return new Modal(options);\n }\n\n constructor(options = {}) {\n super();\n\n this.id = guid();\n this.el = null;\n this._html = {};\n this._events = {};\n this._visible = false;\n this._pointerInContent = false;\n this._options = Object.assign({}, Modal.options, options);\n this._templates = Object.assign({}, Modal.templates, options.templates || {});\n this._html.appendTo = document.querySelector(this._options.appendTo);\n this._scrollbarWidth = calcScrollbarWidth();\n\n if (this._options.buttons === null) {\n this._options.buttons = Modal.buttons.dialog;\n }\n\n if (this._options.el) {\n let el = this._options.el;\n if (typeof this._options.el == 'string') {\n el = document.querySelector(this._options.el);\n if (! el) {\n throw new Error(`Selector: DOM Element ${this._options.el} not found.`);\n }\n }\n data(el, 'modal', this);\n this.el = el;\n } else {\n this._options.construct = true;\n }\n\n if (this._options.construct) {\n this._render();\n } else {\n this._mapDom();\n }\n }\n\n _render() {\n let html = this._html;\n let o = this._options;\n let t = this._templates;\n let animate = o.animate ? o.animateClass : false;\n\n html.container = build(t.container);\n html.dialog = build(t.dialog);\n html.content = build(t.content);\n html.header = build(t.header);\n html.headerClose = build(t.headerClose);\n html.body = build(t.body);\n html.footer = build(t.footer);\n if (animate) html.container.classList.add(animate);\n\n this._setHeader();\n this._setContent();\n this._setFooter();\n\n this.el = html.container;\n\n html.dialog.appendChild(html.content);\n html.container.appendChild(html.dialog);\n\n return this;\n }\n\n _mapDom() {\n let html = this._html;\n let o = this._options;\n\n if (this.el.classList.contains(o.animateClass)) {\n o.animate = true;\n }\n\n html.container = this.el;\n html.dialog = this.el.querySelector('.modal-dialog');\n html.content = this.el.querySelector('.modal-content');\n html.header = this.el.querySelector('.modal-header');\n html.headerClose = this.el.querySelector('.modal-header .close');\n html.body = this.el.querySelector('.modal-body');\n html.footer = this.el.querySelector('.modal-footer');\n\n this._setHeader();\n this._setContent();\n this._setFooter();\n\n return this;\n }\n\n _setHeader() {\n let html = this._html;\n let o = this._options;\n\n if (o.header && html.header) {\n if (o.title.nodeName) {\n html.header.innerHTML = o.title.outerHTML;\n } else if (typeof o.title === 'string') {\n html.header.innerHTML = `<h4 class=\"modal-title\">${o.title}</h4>`;\n }\n // Add header close button only to constructed modals.\n if (this.el === null && html.headerClose && o.headerClose) {\n html.header.appendChild(html.headerClose);\n }\n if (o.construct) {\n html.content.appendChild(html.header);\n }\n }\n }\n\n _setContent() {\n let html = this._html;\n let o = this._options;\n\n if (o.content && html.body) {\n if (typeof o.content === 'string') {\n html.body.innerHTML = o.content;\n } else {\n html.body.innerHTML = o.content.outerHTML;\n }\n if (o.construct) {\n html.content.appendChild(html.body);\n }\n }\n }\n\n _setFooter() {\n let html = this._html;\n let o = this._options;\n\n if (o.footer && html.footer) {\n if (o.footer.nodeName) {\n html.footer.ineerHTML = o.footer.outerHTML;\n } else if (typeof o.footer === 'string') {\n html.footer.innerHTML = o.footer;\n } else if (! html.footer.children.length) {\n o.buttons.forEach((button) => {\n let el = document.createElement('button');\n data(el, 'button', button);\n el.innerHTML = button.text;\n el.setAttribute('type', 'button');\n for (let j in button.attr) {\n el.setAttribute(j, button.attr[j]);\n }\n html.footer.appendChild(el);\n });\n }\n if (o.construct) {\n html.content.appendChild(html.footer);\n }\n }\n\n }\n\n _setEvents() {\n let o = this._options;\n let html = this._html;\n\n this._events.keydownHandler = this._handleKeydownEvent.bind(this);\n document.body.addEventListener('keydown',\n this._events.keydownHandler\n );\n\n this._events.mousedownHandler = this._handleMousedownEvent.bind(this);\n html.container.addEventListener('mousedown',\n this._events.mousedownHandler\n );\n\n this._events.clickHandler = this._handleClickEvent.bind(this);\n html.container.addEventListener('click',\n this._events.clickHandler\n );\n\n this._events.resizeHandler = this._handleResizeEvent.bind(this);\n window.addEventListener('resize',\n this._events.resizeHandler\n );\n }\n\n _handleMousedownEvent(e) {\n this._pointerInContent = false;\n let path = getPath(e.target);\n path.every(node => {\n if (node.classList && node.classList.contains('modal-content')) {\n this._pointerInContent = true;\n return false;\n }\n return true;\n });\n }\n\n _handleClickEvent(e) {\n let path = getPath(e.target);\n path.every(node => {\n if (node.tagName === 'HTML') {\n return false;\n }\n if (this._options.backdrop !== true && node.classList.contains('modal')) {\n return false;\n }\n if (node.classList.contains('modal-content')) {\n return false;\n }\n if (node.getAttribute('data-dismiss') === 'modal') {\n this.emit('dismiss', this, e, data(e.target, 'button'));\n this.hide();\n return false;\n }\n\n if (!this._pointerInContent && node.classList.contains('modal')) {\n this.emit('dismiss', this, e, null);\n this.hide();\n return false;\n }\n return true;\n });\n\n this._pointerInContent = false;\n }\n\n _handleKeydownEvent(e) {\n if (e.which === 27 && this._options.keyboard) {\n this.emit('dismiss', this, e, null);\n this.hide();\n }\n }\n\n _handleResizeEvent(e) {\n this._resize();\n }\n\n show() {\n let o = this._options;\n let html = this._html;\n this.emit('show', this);\n\n this._checkScrollbar();\n this._setScrollbar();\n document.body.classList.add('modal-open');\n\n if (o.construct) {\n html.appendTo.appendChild(html.container);\n }\n\n html.container.style.display = 'block';\n html.container.scrollTop = 0;\n\n if (o.backdrop !== false) {\n this.once('showBackdrop', () => {\n this._setEvents();\n\n if (o.animate) html.container.offsetWidth; // Force reflow\n\n html.container.classList.add(o.animateInClass);\n\n setTimeout(() => {\n this._visible = true;\n this.emit('shown', this);\n }, o.transition);\n });\n this._backdrop();\n } else {\n this._setEvents();\n\n if (o.animate) html.container.offsetWidth; // Force reflow\n\n html.container.classList.add(o.animateInClass);\n\n setTimeout(() => {\n this._visible = true;\n this.emit('shown', this);\n }, o.transition);\n }\n this._resize();\n\n return this;\n }\n\n toggle() {\n if (this._visible) {\n this.hide();\n } else {\n this.show();\n }\n }\n\n _resize() {\n var modalIsOverflowing =\n this._html.container.scrollHeight > document.documentElement.clientHeight;\n\n this._html.container.style.paddingLeft =\n ! this.bodyIsOverflowing && modalIsOverflowing ? this._scrollbarWidth + 'px' : '';\n\n this._html.container.style.paddingRight =\n this.bodyIsOverflowing && ! modalIsOverflowing ? this._scrollbarWidth + 'px' : '';\n }\n\n _backdrop() {\n let html = this._html;\n let t = this._templates;\n let o = this._options;\n let animate = o.animate ? o.animateClass : false;\n\n html.backdrop = build(t.backdrop);\n if (animate) html.backdrop.classList.add(animate);\n html.appendTo.appendChild(html.backdrop);\n\n if (animate) html.backdrop.offsetWidth;\n\n html.backdrop.classList.add(o.animateInClass);\n\n setTimeout(() => {\n this.emit('showBackdrop', this);\n }, this._options.backdropTransition);\n }\n\n hide() {\n let html = this._html;\n let o = this._options;\n let contCList = html.container.classList;\n this.emit('hide', this);\n\n contCList.remove(o.animateInClass);\n\n if (o.backdrop) {\n let backCList = html.backdrop.classList;\n backCList.remove(o.animateInClass);\n }\n\n this._removeEvents();\n\n setTimeout(() => {\n document.body.classList.remove('modal-open');\n document.body.style.paddingRight = this.originalBodyPad;\n }, o.backdropTransition);\n\n setTimeout(() => {\n if (o.backdrop) {\n html.backdrop.parentNode.removeChild(html.backdrop);\n }\n html.container.style.display = 'none';\n\n if (o.construct) {\n html.container.parentNode.removeChild(html.container);\n }\n\n this._visible = false;\n this.emit('hidden', this);\n }, o.transition);\n\n return this;\n }\n\n _removeEvents() {\n if (this._events.keydownHandler) {\n document.body.removeEventListener('keydown',\n this._events.keydownHandler\n );\n }\n\n this._html.container.removeEventListener('mousedown',\n this._events.mousedownHandler\n );\n\n this._html.container.removeEventListener('click',\n this._events.clickHandler\n );\n\n window.removeEventListener('resize',\n this._events.resizeHandler\n );\n }\n\n _checkScrollbar() {\n this.bodyIsOverflowing = document.body.clientWidth < window.innerWidth;\n }\n\n _setScrollbar() {\n this.originalBodyPad = document.body.style.paddingRight || '';\n if (this.bodyIsOverflowing) {\n let basePadding = parseInt(this.originalBodyPad || 0, 10);\n document.body.style.paddingRight = basePadding + this._scrollbarWidth + 'px';\n }\n }\n}\n\nexport default Modal;\n","// External\r\nimport Modal from 'modal-vanilla';\r\n\r\nimport { Options } from '../ol-wfst';\r\nimport { ExceptionGeoserver, IGeoserverDescribeFeatureType } from '../@types';\r\nlet options = {};\r\n\r\n// Store layerNames that has errors\r\nconst isError = new Set();\r\n\r\nexport const initModal = (opts: Options['modal']) => {\r\n options = opts;\r\n};\r\n\r\nexport const parseError = (\r\n geoserverResponse: IGeoserverDescribeFeatureType\r\n) => {\r\n if ('exceptions' in geoserverResponse) {\r\n return (geoserverResponse.exceptions as ExceptionGeoserver[])\r\n .map((e) => e.text)\r\n .join(',');\r\n } else {\r\n return '';\r\n }\r\n};\r\n\r\n/**\r\n * Show modal with errors\r\n *\r\n * @param msg\r\n * @private\r\n */\r\nexport const showError = (\r\n msg: string,\r\n originalError: Error = null,\r\n layerName = ''\r\n): void => {\r\n // Prevent multiples modals error in the same layer\r\n if (isError.has(layerName)) {\r\n return;\r\n }\r\n\r\n isError.add(layerName);\r\n\r\n let err_msg = `<b>Error: ${msg}</b>`;\r\n if (originalError && originalError.message !== msg) {\r\n err_msg += `. ${originalError.message}`;\r\n }\r\n\r\n const al = Modal.alert(err_msg, options);\r\n\r\n al.show();\r\n\r\n al.on('hidden', () => {\r\n isError.delete(layerName);\r\n });\r\n};\r\n","import { I18n } from '../../ol-wfst';\r\n\r\nexport const en: I18n = {\r\n labels: {\r\n select: 'Select',\r\n selectBox: 'Select features by drawing a box',\r\n selectFreehand: 'Select features by freehand drawing',\r\n query: 'Query feature info',\r\n featureInfo: 'Feature info',\r\n addElement: 'Toggle Draw mode',\r\n editElement: 'Edit feature',\r\n save: 'Save',\r\n delete: 'Delete',\r\n cancel: 'Cancel',\r\n upload: 'Upload',\r\n editMode: 'Edit Mode',\r\n confirmDelete: 'Are you sure to delete the feature?',\r\n confirmDeleteElements: 'Delete the {} selected features?',\r\n geomTypeNotSupported: 'Geometry not supported by layer',\r\n editFields: 'Edit fields',\r\n editGeom: 'Edit geometry',\r\n continueLine: 'Continue drawing from here',\r\n selectDrawType: 'Geometry type to draw',\r\n uploadToLayer: 'Upload file to selected layer',\r\n uploadFeatures: 'Uploaded features to layer',\r\n validFeatures: 'Valid geometries',\r\n invalidFeatures: 'Invalid',\r\n loading: 'Loading...',\r\n toggleVisibility: 'Toggle layer visibility',\r\n fullscreen: 'Fullscreen',\r\n close: 'Close',\r\n multipleValues: 'Multiple values',\r\n editElements: 'Edit features ({})',\r\n multipleEditNotice:\r\n 'Multi-edit active. Changes will be applied to the {} selected features.',\r\n tableMode: 'Table mode',\r\n formMode: 'Form mode',\r\n feature: 'Feature',\r\n geometry: 'Geometry',\r\n geoserverLayers: 'Geoserver Layers'\r\n },\r\n errors: {\r\n capabilities: 'GeoServer Capabilities could not be downloaded.',\r\n wfst: 'The GeoServer does not support Transactions',\r\n layer: 'Could not get data from layer',\r\n layerNotFound: 'Layer not found',\r\n layerNotVisible: 'Layer is not visible',\r\n noValidGeometry: 'No valid geometries found to add to this layer',\r\n geoserver: 'Failed to get data from GeoServer',\r\n badFormat: 'Unsupported format',\r\n badFile: 'Error reading items from file',\r\n lockFeature: 'Could not lock items on the GeoServer',\r\n transaction: 'Error when doing Transaction with GeoServer',\r\n getFeatures: 'Error getting elements from GeoServer'\r\n }\r\n};\r\n","import { I18n } from '../../@types';\r\nexport * from './es';\r\nexport * from './en';\r\nexport * from './zh';\r\n\r\nimport { es } from './es';\r\nimport { en } from './en';\r\nimport { zh } from './zh';\r\n\r\nconst langs = {\r\n es,\r\n en,\r\n zh\r\n};\r\n\r\n// Set default Language\r\nexport let I18N: I18n = en;\r\n\r\nexport const setLang = (lang = 'en', customI18n: I18n = null): void => {\r\n // Check if language exists\r\n if (lang in langs) {\r\n I18N = langs[lang];\r\n }\r\n\r\n // Check if customs translations are provided\r\n if (customI18n) {\r\n I18N = { ...I18N, ...customI18n };\r\n }\r\n};\r\n\r\n/**\r\n * /**\r\n * For translations thas has a variable \"{}\"\" to be replaced inside\r\n * @param string\r\n * @param args\r\n * @returns\r\n */\r\nexport const I18N_ = (string: string, ...args: any): string => {\r\n let text = (I18N.labels as Record<string, string>)?.[string];\r\n\r\n if (!text) {\r\n text = (I18N as Record<string, string>)[string];\r\n }\r\n\r\n if (!text) {\r\n console.error('Translation not found', string);\r\n text = string;\r\n }\r\n\r\n if (args.length) {\r\n args.forEach((arg) => {\r\n text = text.replace(/{}/, arg);\r\n });\r\n }\r\n\r\n return text;\r\n};\r\n","import { I18n } from '../../ol-wfst';\r\n\r\nexport const es: I18n = {\r\n labels: {\r\n select: 'Seleccionar',\r\n selectBox: 'Seleccionar elementos dibujando una caja',\r\n selectFreehand: 'Seleccionar elementos dibujando a mano alzada',\r\n query: 'Consultar información del elemento',\r\n featureInfo: 'Información del elemento',\r\n addElement: 'Modo dibujo',\r\n editElement: 'Editar elemento',\r\n save: 'Guardar',\r\n delete: 'Eliminar',\r\n cancel: 'Cancelar',\r\n upload: 'Subir',\r\n editMode: 'Modo Edición',\r\n confirmDelete: '¿Estás seguro de borrar el elemento?',\r\n confirmDeleteElements: '¿Borrar los {} elementos?',\r\n geomTypeNotSupported: 'Geometría no compatible con la capa',\r\n editFields: 'Editar campos',\r\n editGeom: 'Editar geometría',\r\n continueLine: 'Continuar dibujando desde aquí',\r\n selectDrawType: 'Tipo de geometría para dibujar',\r\n uploadToLayer: 'Subir archivo a la capa seleccionada',\r\n uploadFeatures: 'Subida de elementos a la capa',\r\n validFeatures: 'Válidas',\r\n invalidFeatures: 'Invalidas',\r\n loading: 'Cargando...',\r\n toggleVisibility: 'Cambiar visibilidad de la capa',\r\n fullscreen: 'Pantalla completa',\r\n close: 'Cerrar',\r\n multipleValues: 'Valores múltiples',\r\n editElements: 'Editar elementos ({})',\r\n multipleEditNotice:\r\n 'Edición múltiple activada. Los cambios se aplicarán a los {} elementos seleccionados.',\r\n tableMode: 'Modo tabla',\r\n formMode: 'Modo formulario',\r\n feature: 'Elemento',\r\n geometry: 'Geometría',\r\n geoserverLayers: 'Capas de GeoServer'\r\n },\r\n errors: {\r\n capabilities: 'No se pudieron obtener las Capabilidades del GeoServer',\r\n wfst: 'El GeoServer no tiene soporte a Transacciones',\r\n layer: 'No se pudieron obtener datos de la capa',\r\n layerNotFound: 'Capa no encontrada',\r\n layerNotVisible: 'La capa no está visible',\r\n noValidGeometry:\r\n 'No se encontraron geometrías válidas para agregar a esta capa',\r\n geoserver: 'No se pudieron obtener datos desde el GeoServer',\r\n badFormat: 'Formato no soportado',\r\n badFile: 'Error al leer elementos del archivo',\r\n lockFeature: 'No se pudieron bloquear elementos en el GeoServer',\r\n transaction: 'Error al hacer transacción con el GeoServer',\r\n getFeatures: 'Error al obtener elemento desde el GeoServer'\r\n }\r\n};\r\n","import { I18n } from '../../ol-wfst';\r\n\r\nexport const zh: I18n = {\r\n labels: {\r\n select: '选择',\r\n selectBox: '框选元素',\r\n selectFreehand: '手绘选择元素',\r\n query: '查询元素信息',\r\n featureInfo: '元素信息',\r\n addElement: '切换绘图类型',\r\n editElement: '编辑元素',\r\n save: '保存',\r\n delete: '删除',\r\n cancel: '取消',\r\n upload: '上传',\r\n editMode: '编辑模式',\r\n confirmDelete: '确认删除元素?',\r\n confirmDeleteElements: '确认删除选中的 {} 个元素?',\r\n geomTypeNotSupported: '图层不支持该几何',\r\n editFields: '编辑区域',\r\n editGeom: '编辑几何',\r\n continueLine: '从此处继续绘制',\r\n selectDrawType: '几何类型',\r\n uploadToLayer: '通过文件上传图层',\r\n uploadFeatures: '上传元素到图层',\r\n validFeatures: '合法的几何类型',\r\n invalidFeatures: '不合法',\r\n loading: '加载中...',\r\n toggleVisibility: '切换图层透明度',\r\n fullscreen: '全屏',\r\n close: '关闭',\r\n multipleValues: '多个值',\r\n editElements: '编辑元素({})',\r\n multipleEditNotice: '多选编辑已激活。更改将应用于所有 {} 个选定元素。',\r\n tableMode: '表格模式',\r\n formMode: '表单模式',\r\n feature: '要素',\r\n geometry: '几何',\r\n geoserverLayers: 'GeoServer 图层'\r\n },\r\n errors: {\r\n capabilities: '无法加载GeoServer服务所支持的能力.',\r\n wfst: 'GeoServer不支持事务',\r\n layer: '无法从图层获得数据',\r\n layerNotFound: 'Layer not found',\r\n layerNotVisible: 'Layer is not visible',\r\n noValidGeometry: '不支持的几何类型无法加载到图层',\r\n geoserver: '无法从GeoServer获取数据',\r\n badFormat: '不支持的格式',\r\n badFile: '读取文件数据出错',\r\n lockFeature: '无法锁定GeoServer上的元素.',\r\n transaction: 'GeoServer处理事务出错.',\r\n getFeatures: '从GeoServer获取元素出错.'\r\n }\r\n};\r\n","import { I18N } from './i18n';\r\n\r\nlet loadingDiv: HTMLDivElement;\r\n\r\nexport const initLoading = (): HTMLDivElement => {\r\n loadingDiv = document.createElement('div');\r\n loadingDiv.className = 'ol-wfst--tools-control--loading';\r\n loadingDiv.setAttribute('role', 'progressbar');\r\n loadingDiv.setAttribute('aria-label', I18N.labels.loading);\r\n return loadingDiv;\r\n};\r\n\r\nexport const showLoading = (bool: boolean = true) => {\r\n if (bool) {\r\n loadingDiv.classList.add('ol-wfst--tools-control--loading-show');\r\n } else {\r\n loadingDiv.classList.remove('ol-wfst--tools-control--loading-show');\r\n }\r\n};\r\n","/**\n * Utility function that works like `Object.apply`, but copies getters and setters properly as well. Additionally gives\n * the option to exclude properties by name.\n */\nconst copyProps = (dest, src, exclude = []) => {\n const props = Object.getOwnPropertyDescriptors(src);\n for (let prop of exclude)\n delete props[prop];\n Object.defineProperties(dest, props);\n};\n/**\n * Returns the full chain of prototypes up until Object.prototype given a starting object. The order of prototypes will\n * be closest to farthest in the chain.\n */\nconst protoChain = (obj, currentChain = [obj]) => {\n const proto = Object.getPrototypeOf(obj);\n if (proto === null)\n return currentChain;\n return protoChain(proto, [...currentChain, proto]);\n};\n/**\n * Identifies the nearest ancestor common to all the given objects in their prototype chains. For most unrelated\n * objects, this function should return Object.prototype.\n */\nconst nearestCommonProto = (...objs) => {\n if (objs.length === 0)\n return undefined;\n let commonProto = undefined;\n const protoChains = objs.map(obj => protoChain(obj));\n while (protoChains.every(protoChain => protoChain.length > 0)) {\n const protos = protoChains.map(protoChain => protoChain.pop());\n const potentialCommonProto = protos[0];\n if (protos.every(proto => proto === potentialCommonProto))\n commonProto = potentialCommonProto;\n else\n break;\n }\n return commonProto;\n};\n/**\n * Creates a new prototype object that is a mixture of the given prototypes. The mixing is achieved by first\n * identifying the nearest common ancestor and using it as the prototype for a new object. Then all properties/methods\n * downstream of this prototype (ONLY downstream) are copied into the new object.\n *\n * The resulting prototype is more performant than softMixProtos(...), as well as ES5 compatible. However, it's not as\n * flexible as updates to the source prototypes aren't captured by the mixed result. See softMixProtos for why you may\n * want to use that instead.\n */\nconst hardMixProtos = (ingredients, constructor, exclude = []) => {\n var _a;\n const base = (_a = nearestCommonProto(...ingredients)) !== null && _a !== void 0 ? _a : Object.prototype;\n const mixedProto = Object.create(base);\n // Keeps track of prototypes we've already visited to avoid copying the same properties multiple times. We init the\n // list with the proto chain below the nearest common ancestor because we don't want any of those methods mixed in\n // when they will already be accessible via prototype access.\n const visitedProtos = protoChain(base);\n for (let prototype of ingredients) {\n let protos = protoChain(prototype);\n // Apply the prototype chain in reverse order so that old methods don't override newer ones.\n for (let i = protos.length - 1; i >= 0; i--) {\n let newProto = protos[i];\n if (visitedProtos.indexOf(newProto) === -1) {\n copyProps(mixedProto, newProto, ['constructor', ...exclude]);\n visitedProtos.push(newProto);\n }\n }\n }\n mixedProto.constructor = constructor;\n return mixedProto;\n};\nconst unique = (arr) => arr.filter((e, i) => arr.indexOf(e) == i);\n\n/**\n * Finds the ingredient with the given prop, searching in reverse order and breadth-first if searching ingredient\n * prototypes is required.\n */\nconst getIngredientWithProp = (prop, ingredients) => {\n const protoChains = ingredients.map(ingredient => protoChain(ingredient));\n // since we search breadth-first, we need to keep track of our depth in the prototype chains\n let protoDepth = 0;\n // not all prototype chains are the same depth, so this remains true as long as at least one of the ingredients'\n // prototype chains has an object at this depth\n let protosAreLeftToSearch = true;\n while (protosAreLeftToSearch) {\n // with the start of each horizontal slice, we assume this is the one that's deeper than any of the proto chains\n protosAreLeftToSearch = false;\n // scan through the ingredients right to left\n for (let i = ingredients.length - 1; i >= 0; i--) {\n const searchTarget = protoChains[i][protoDepth];\n if (searchTarget !== undefined && searchTarget !== null) {\n // if we find something, this is proof that this horizontal slice potentially more objects to search\n protosAreLeftToSearch = true;\n // eureka, we found it\n if (Object.getOwnPropertyDescriptor(searchTarget, prop) != undefined) {\n return protoChains[i][0];\n }\n }\n }\n protoDepth++;\n }\n return undefined;\n};\n/**\n * \"Mixes\" ingredients by wrapping them in a Proxy. The optional prototype argument allows the mixed object to sit\n * downstream of an existing prototype chain. Note that \"properties\" cannot be added, deleted, or modified.\n */\nconst proxyMix = (ingredients, prototype = Object.prototype) => new Proxy({}, {\n getPrototypeOf() {\n return prototype;\n },\n setPrototypeOf() {\n throw Error('Cannot set prototype of Proxies created by ts-mixer');\n },\n getOwnPropertyDescriptor(_, prop) {\n return Object.getOwnPropertyDescriptor(getIngredientWithProp(prop, ingredients) || {}, prop);\n },\n defineProperty() {\n throw new Error('Cannot define new properties on Proxies created by ts-mixer');\n },\n has(_, prop) {\n return getIngredientWithProp(prop, ingredients) !== undefined || prototype[prop] !== undefined;\n },\n get(_, prop) {\n return (getIngredientWithProp(prop, ingredients) || prototype)[prop];\n },\n set(_, prop, val) {\n const ingredientWithProp = getIngredientWithProp(prop, ingredients);\n if (ingredientWithProp === undefined)\n throw new Error('Cannot set new properties on Proxies created by ts-mixer');\n ingredientWithProp[prop] = val;\n return true;\n },\n deleteProperty() {\n throw new Error('Cannot delete properties on Proxies created by ts-mixer');\n },\n ownKeys() {\n return ingredients\n .map(Object.getOwnPropertyNames)\n .reduce((prev, curr) => curr.concat(prev.filter(key => curr.indexOf(key) < 0)));\n },\n});\n/**\n * Creates a new proxy-prototype object that is a \"soft\" mixture of the given prototypes. The mixing is achieved by\n * proxying all property access to the ingredients. This is not ES5 compatible and less performant. However, any\n * changes made to the source prototypes will be reflected in the proxy-prototype, which may be desirable.\n */\nconst softMixProtos = (ingredients, constructor) => proxyMix([...ingredients, { constructor }]);\n\nconst settings = {\n initFunction: null,\n staticsStrategy: 'copy',\n prototypeStrategy: 'copy',\n decoratorInheritance: 'deep',\n};\n\n// Keeps track of constituent classes for every mixin class created by ts-mixer.\nconst mixins = new WeakMap();\nconst getMixinsForClass = (clazz) => mixins.get(clazz);\nconst registerMixins = (mixedClass, constituents) => mixins.set(mixedClass, constituents);\nconst hasMixin = (instance, mixin) => {\n if (instance instanceof mixin)\n return true;\n const constructor = instance.constructor;\n const visited = new Set();\n let frontier = new Set();\n frontier.add(constructor);\n while (frontier.size > 0) {\n // check if the frontier has the mixin we're looking for. if not, we can say we visited every item in the frontier\n if (frontier.has(mixin))\n return true;\n frontier.forEach((item) => visited.add(item));\n // build a new frontier based on the associated mixin classes and prototype chains of each frontier item\n const newFrontier = new Set();\n frontier.forEach((item) => {\n var _a;\n const itemConstituents = (_a = mixins.get(item)) !== null && _a !== void 0 ? _a : protoChain(item.prototype)\n .map((proto) => proto.constructor)\n .filter((item) => item !== null);\n if (itemConstituents)\n itemConstituents.forEach((constituent) => {\n if (!visited.has(constituent) && !frontier.has(constituent))\n newFrontier.add(constituent);\n });\n });\n // we have a new frontier, now search again\n frontier = newFrontier;\n }\n // if we get here, we couldn't find the mixin anywhere in the prototype chain or associated mixin classes\n return false;\n};\n\nconst mergeObjectsOfDecorators = (o1, o2) => {\n var _a, _b;\n const allKeys = unique([...Object.getOwnPropertyNames(o1), ...Object.getOwnPropertyNames(o2)]);\n const mergedObject = {};\n for (let key of allKeys)\n mergedObject[key] = unique([...((_a = o1 === null || o1 === void 0 ? void 0 : o1[key]) !== null && _a !== void 0 ? _a : []), ...((_b = o2 === null || o2 === void 0 ? void 0 : o2[key]) !== null && _b !== void 0 ? _b : [])]);\n return mergedObject;\n};\nconst mergePropertyAndMethodDecorators = (d1, d2) => {\n var _a, _b, _c, _d;\n return ({\n property: mergeObjectsOfDecorators((_a = d1 === null || d1 === void 0 ? void 0 : d1.property) !== null && _a !== void 0 ? _a : {}, (_b = d2 === null || d2 === void 0 ? void 0 : d2.property) !== null && _b !== void 0 ? _b : {}),\n method: mergeObjectsOfDecorators((_c = d1 === null || d1 === void 0 ? void 0 : d1.method) !== null && _c !== void 0 ? _c : {}, (_d = d2 === null || d2 === void 0 ? void 0 : d2.method) !== null && _d !== void 0 ? _d : {}),\n });\n};\nconst mergeDecorators = (d1, d2) => {\n var _a, _b, _c, _d, _e, _f;\n return ({\n class: unique([...(_a = d1 === null || d1 === void 0 ? void 0 : d1.class) !== null && _a !== void 0 ? _a : [], ...(_b = d2 === null || d2 === void 0 ? void 0 : d2.class) !== null && _b !== void 0 ? _b : []]),\n static: mergePropertyAndMethodDecorators((_c = d1 === null || d1 === void 0 ? void 0 : d1.static) !== null && _c !== void 0 ? _c : {}, (_d = d2 === null || d2 === void 0 ? void 0 : d2.static) !== null && _d !== void 0 ? _d : {}),\n instance: mergePropertyAndMethodDecorators((_e = d1 === null || d1 === void 0 ? void 0 : d1.instance) !== null && _e !== void 0 ? _e : {}, (_f = d2 === null || d2 === void 0 ? void 0 : d2.instance) !== null && _f !== void 0 ? _f : {}),\n });\n};\nconst decorators = new Map();\nconst findAllConstituentClasses = (...classes) => {\n var _a;\n const allClasses = new Set();\n const frontier = new Set([...classes]);\n while (frontier.size > 0) {\n for (let clazz of frontier) {\n const protoChainClasses = protoChain(clazz.prototype).map(proto => proto.constructor);\n const mixinClasses = (_a = getMixinsForClass(clazz)) !== null && _a !== void 0 ? _a : [];\n const potentiallyNewClasses = [...protoChainClasses, ...mixinClasses];\n const newClasses = potentiallyNewClasses.filter(c => !allClasses.has(c));\n for (let newClass of newClasses)\n frontier.add(newClass);\n allClasses.add(clazz);\n frontier.delete(clazz);\n }\n }\n return [...allClasses];\n};\nconst deepDecoratorSearch = (...classes) => {\n const decoratorsForClassChain = findAllConstituentClasses(...classes)\n .map(clazz => decorators.get(clazz))\n .filter(decorators => !!decorators);\n if (decoratorsForClassChain.length == 0)\n return {};\n if (decoratorsForClassChain.length == 1)\n return decoratorsForClassChain[0];\n return decoratorsForClassChain.reduce((d1, d2) => mergeDecorators(d1, d2));\n};\nconst directDecoratorSearch = (...classes) => {\n const classDecorators = classes.map(clazz => getDecoratorsForClass(clazz));\n if (classDecorators.length === 0)\n return {};\n if (classDecorators.length === 1)\n return classDecorators[0];\n return classDecorators.reduce((d1, d2) => mergeDecorators(d1, d2));\n};\nconst getDecoratorsForClass = (clazz) => {\n let decoratorsForClass = decorators.get(clazz);\n if (!decoratorsForClass) {\n decoratorsForClass = {};\n decorators.set(clazz, decoratorsForClass);\n }\n return decoratorsForClass;\n};\nconst decorateClass = (decorator) => ((clazz) => {\n const decoratorsForClass = getDecoratorsForClass(clazz);\n let classDecorators = decoratorsForClass.class;\n if (!classDecorators) {\n classDecorators = [];\n decoratorsForClass.class = classDecorators;\n }\n classDecorators.push(decorator);\n return decorator(clazz);\n});\nconst decorateMember = (decorator) => ((object, key, ...otherArgs) => {\n var _a, _b, _c;\n const decoratorTargetType = typeof object === 'function' ? 'static' : 'instance';\n const decoratorType = typeof object[key] === 'function' ? 'method' : 'property';\n const clazz = decoratorTargetType === 'static' ? object : object.constructor;\n const decoratorsForClass = getDecoratorsForClass(clazz);\n const decoratorsForTargetType = (_a = decoratorsForClass === null || decoratorsForClass === void 0 ? void 0 : decoratorsForClass[decoratorTargetType]) !== null && _a !== void 0 ? _a : {};\n decoratorsForClass[decoratorTargetType] = decoratorsForTargetType;\n let decoratorsForType = (_b = decoratorsForTargetType === null || decoratorsForTargetType === void 0 ? void 0 : decoratorsForTargetType[decoratorType]) !== null && _b !== void 0 ? _b : {};\n decoratorsForTargetType[decoratorType] = decoratorsForType;\n let decoratorsForKey = (_c = decoratorsForType === null || decoratorsForType === void 0 ? void 0 : decoratorsForType[key]) !== null && _c !== void 0 ? _c : [];\n decoratorsForType[key] = decoratorsForKey;\n // @ts-ignore: array is type `A[] | B[]` and item is type `A | B`, so technically a type error, but it's fine\n decoratorsForKey.push(decorator);\n // @ts-ignore\n return decorator(object, key, ...otherArgs);\n});\nconst decorate = (decorator) => ((...args) => {\n if (args.length === 1)\n return decorateClass(decorator)(args[0]);\n return decorateMember(decorator)(...args);\n});\n\nfunction Mixin(...constructors) {\n var _a, _b, _c;\n const prototypes = constructors.map(constructor => constructor.prototype);\n // Here we gather up the init functions of the ingredient prototypes, combine them into one init function, and\n // attach it to the mixed class prototype. The reason we do this is because we want the init functions to mix\n // similarly to constructors -- not methods, which simply override each other.\n const initFunctionName = settings.initFunction;\n if (initFunctionName !== null) {\n const initFunctions = prototypes\n .map(proto => proto[initFunctionName])\n .filter(func => typeof func === 'function');\n const combinedInitFunction = function (...args) {\n for (let initFunction of initFunctions)\n initFunction.apply(this, args);\n };\n const extraProto = { [initFunctionName]: combinedInitFunction };\n prototypes.push(extraProto);\n }\n function MixedClass(...args) {\n for (const constructor of constructors)\n // @ts-ignore: potentially abstract class\n copyProps(this, new constructor(...args));\n if (initFunctionName !== null && typeof this[initFunctionName] === 'function')\n this[initFunctionName].apply(this, args);\n }\n MixedClass.prototype = settings.prototypeStrategy === 'copy'\n ? hardMixProtos(prototypes, MixedClass)\n : softMixProtos(prototypes, MixedClass);\n Object.setPrototypeOf(MixedClass, settings.staticsStrategy === 'copy'\n ? hardMixProtos(constructors, null, ['prototype'])\n : proxyMix(constructors, Function.prototype));\n let DecoratedMixedClass = MixedClass;\n if (settings.decoratorInheritance !== 'none') {\n const classDecorators = settings.decoratorInheritance === 'deep'\n ? deepDecoratorSearch(...constructors)\n : directDecoratorSearch(...constructors);\n for (let decorator of (_a = classDecorators === null || classDecorators === void 0 ? void 0 : classDecorators.class) !== null && _a !== void 0 ? _a : []) {\n const result = decorator(DecoratedMixedClass);\n if (result) {\n DecoratedMixedClass = result;\n }\n }\n applyPropAndMethodDecorators((_b = classDecorators === null || classDecorators === void 0 ? void 0 : classDecorators.static) !== null && _b !== void 0 ? _b : {}, DecoratedMixedClass);\n applyPropAndMethodDecorators((_c = classDecorators === null || classDecorators === void 0 ? void 0 : classDecorators.instance) !== null && _c !== void 0 ? _c : {}, DecoratedMixedClass.prototype);\n }\n registerMixins(DecoratedMixedClass, constructors);\n return DecoratedMixedClass;\n}\nconst applyPropAndMethodDecorators = (propAndMethodDecorators, target) => {\n const propDecorators = propAndMethodDecorators.property;\n const methodDecorators = propAndMethodDecorators.method;\n if (propDecorators)\n for (let key in propDecorators)\n for (let decorator of propDecorators[key])\n decorator(target, key);\n if (methodDecorators)\n for (let key in methodDecorators)\n for (let decorator of methodDecorators[key])\n decorator(target, key, Object.getOwnPropertyDescriptor(target, key));\n};\n/**\n * A decorator version of the `Mixin` function. You'll want to use this instead of `Mixin` for mixing generic classes.\n */\nconst mix = (...ingredients) => decoratedClass => {\n // @ts-ignore\n const mixedClass = Mixin(...ingredients.concat([decoratedClass]));\n Object.defineProperty(mixedClass, 'name', {\n value: decoratedClass.name,\n writable: false,\n });\n return mixedClass;\n};\n\nexport { Mixin, decorate, hasMixin, mix, settings };\n","export enum GeometryType {\r\n Point = 'Point',\r\n LineString = 'LineString',\r\n LinearRing = 'LinearRing',\r\n Polygon = 'Polygon',\r\n MultiPoint = 'MultiPoint',\r\n MultiLineString = 'MultiLineString',\r\n MultiPolygon = 'MultiPolygon',\r\n GeometryCollection = 'GeometryCollection',\r\n Circle = 'Circle'\r\n}\r\n\r\nexport enum TransactionType {\r\n Insert = 'insert',\r\n Delete = 'delete',\r\n Update = 'update'\r\n}\r\n","import Map from 'ol/Map.js';\r\nimport { FeatureLike } from 'ol/Feature.js';\r\n\r\nimport WfsLayer from '../WfsLayer';\r\nimport WmsLayer from '../WmsLayer';\r\nimport { IWfstLayersList } from '../@types';\r\n\r\nlet map: Map;\r\nlet layerToInsertElements: WfsLayer | WmsLayer = null;\r\nlet mode = null;\r\n\r\nexport enum Modes {\r\n Edit = 'EDIT',\r\n Draw = 'DRAW',\r\n Query = 'QUERY'\r\n}\r\n\r\nexport enum SelectionMode {\r\n Single = 'SINGLE',\r\n Box = 'BOX',\r\n Freehand = 'FREEHAND'\r\n}\r\n\r\nlet selectionMode: SelectionMode = SelectionMode.Single;\r\n\r\nexport function activateMode(m: Modes = null) {\r\n mode = m;\r\n}\r\n\r\nexport function getMode() {\r\n return mode;\r\n}\r\n\r\nexport function setSelectionMode(m: SelectionMode) {\r\n selectionMode = m;\r\n}\r\n\r\nexport function getSelectionMode(): SelectionMode {\r\n return selectionMode;\r\n}\r\n\r\nconst editedFeatures: Set<string> = new Set();\r\nconst mapLayers: IWfstLayersList = {};\r\n\r\nexport function setMap(m: Map) {\r\n map = m;\r\n}\r\n\r\nexport function getMap(): Map {\r\n return map;\r\n}\r\n\r\nexport function setActiveLayerToInsertEls(layer: WmsLayer | WfsLayer) {\r\n layerToInsertElements = layer;\r\n}\r\n\r\nexport function getActiveLayerToInsertEls(): WmsLayer | WfsLayer {\r\n return layerToInsertElements;\r\n}\r\n\r\nexport function setMapLayers(data) {\r\n Object.assign(mapLayers, data);\r\n}\r\n\r\nexport function getStoredMapLayers(): IWfstLayersList {\r\n return mapLayers;\r\n}\r\n\r\nexport function getStoredLayer(layerName: string): WfsLayer | WmsLayer {\r\n return getStoredMapLayers()[layerName];\r\n}\r\n\r\nexport function addFeatureToEditedList(feature: FeatureLike): void {\r\n editedFeatures.add(String(feature.getId()));\r\n}\r\n\r\nexport function removeFeatureFromEditList(feature: FeatureLike): void {\r\n editedFeatures.delete(String(feature.getId()));\r\n}\r\n\r\nexport function isFeatureEdited(feature: FeatureLike): boolean {\r\n return editedFeatures.has(String(feature.getId()));\r\n}\r\n","import Feature from 'ol/Feature.js';\r\nimport Geometry from 'ol/geom/Geometry.js';\r\nimport { TransactionResponse } from 'ol/format/WFS.js';\r\nimport Layer from 'ol/layer/Base.js';\r\n\r\nimport Geoserver from '../../Geoserver';\r\nimport { IGeoserverDescribeFeatureType } from '../../@types';\r\nimport { GeometryType, TransactionType } from '../../@enums';\r\nimport { I18N } from '../i18n';\r\nimport { getMap } from '../state';\r\nimport { showError } from '../errors';\r\nimport { parseError } from '../errors';\r\n\r\n/**\r\n * Base class from which all layer types are derived.\r\n */\r\nexport default class BaseLayer extends Layer {\r\n /**\r\n * Initialize the layer: request DescribeFeatureType and resolve when it\r\n * finishes (whether successful or not).\r\n *\r\n * @private\r\n * @returns Promise that resolves when the layer is initialized\r\n */\r\n async _init(): Promise<void> {\r\n const geoserver = this.getGeoserver() as Geoserver;\r\n\r\n if (geoserver.isLoaded()) {\r\n await this.getAndUpdateDescribeFeatureType();\r\n } else {\r\n await new Promise<void>((resolve) => {\r\n geoserver.once('change:capabilities', async () => {\r\n await this.getAndUpdateDescribeFeatureType();\r\n resolve();\r\n });\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * Request and store data layers obtained by DescribeFeatureType\r\n *\r\n * @public\r\n */\r\n async getAndUpdateDescribeFeatureType(): Promise<void> {\r\n const layerName = this.get(BaseLayerProperty.NAME);\r\n const layerLabel = this.get(BaseLayerProperty.LABEL);\r\n\r\n try {\r\n const geoserver = this.getGeoserver() as Geoserver;\r\n\r\n const params = new URLSearchParams({\r\n service: 'wfs',\r\n version: geoserver.getAdvanced().describeFeatureTypeVersion,\r\n request: 'DescribeFeatureType',\r\n typeName: layerName,\r\n outputFormat: 'application/json',\r\n exceptions: 'application/json'\r\n });\r\n\r\n const url_fetch = geoserver.getUrl() + '?' + params.toString();\r\n\r\n const response = await fetch(url_fetch, {\r\n headers: geoserver.getHeaders(),\r\n credentials: geoserver.getCredentials()\r\n });\r\n\r\n if (!response.ok) {\r\n throw new Error('');\r\n }\r\n\r\n const data: IGeoserverDescribeFeatureType = await response.json();\r\n\r\n if (!data) {\r\n throw new Error('');\r\n }\r\n\r\n if (data.exceptions) {\r\n throw new Error(parseError(data));\r\n }\r\n\r\n const targetNamespace = data.targetNamespace;\r\n const properties = data.featureTypes[0].properties;\r\n\r\n // Find the geometry field\r\n const geom = properties.find((el) => el.type.indexOf('gml:') >= 0);\r\n\r\n data._parsed = {\r\n namespace: targetNamespace,\r\n properties: properties,\r\n geomType: geom.localType as GeometryType,\r\n geomField: geom.name\r\n };\r\n\r\n this.set(BaseLayerProperty.DESCRIBEFEATURETYPE, data);\r\n } catch (err) {\r\n console.error(err);\r\n showError(`${I18N.errors.layer} \"${layerLabel}\"`, err, layerName);\r\n }\r\n }\r\n\r\n /**\r\n * @public\r\n * @returns\r\n */\r\n isVisibleByZoom(): boolean {\r\n return getMap().getView().getZoom() > this.getMinZoom();\r\n }\r\n\r\n /**\r\n *\r\n * @param mode\r\n * @param features\r\n * @public\r\n */\r\n async transactFeatures(\r\n mode: TransactionType,\r\n features: Array<Feature<Geometry>> | Feature<Geometry>\r\n ): Promise<TransactionResponse | false> {\r\n const geoserver = this.getGeoserver() as Geoserver;\r\n return geoserver.transact(\r\n mode,\r\n features,\r\n this.get(BaseLayerProperty.NAME)\r\n );\r\n }\r\n\r\n async insertFeatures(\r\n features: Array<Feature<Geometry>> | Feature<Geometry>\r\n ): Promise<TransactionResponse | false> {\r\n return this.transactFeatures(TransactionType.Insert, features);\r\n }\r\n\r\n /**\r\n * @public\r\n * @param featureIds\r\n * @returns\r\n */\r\n async maybeLockFeature(\r\n featureIds: string | number | Array<string | number>\r\n ): Promise<string> {\r\n const geoserver = this.getGeoserver() as Geoserver;\r\n\r\n if (geoserver.getUseLockFeature() && geoserver.hasLockFeature()) {\r\n return await geoserver.lockFeature(\r\n featureIds,\r\n this.get(BaseLayerProperty.NAME)\r\n );\r\n }\r\n return null;\r\n }\r\n\r\n /**\r\n *\r\n * @returns\r\n * @public\r\n */\r\n getGeoserver(): Geoserver {\r\n return this.get(BaseLayerProperty.GEOSERVER);\r\n }\r\n\r\n /**\r\n *\r\n * @returns\r\n * @public\r\n */\r\n getDescribeFeatureType(): IGeoserverDescribeFeatureType {\r\n return this.get(BaseLayerProperty.DESCRIBEFEATURETYPE);\r\n }\r\n}\r\n\r\nexport enum BaseLayerProperty {\r\n NAME = 'name',\r\n LABEL = 'label',\r\n DESCRIBEFEATURETYPE = 'describeFeatureType',\r\n ISVISIBLE = 'isVisible',\r\n GEOSERVER = 'geoserver'\r\n}\r\n\r\nexport type BaseLayerEventTypes =\r\n | 'layerRendered'\r\n | `change:${BaseLayerProperty.DESCRIBEFEATURETYPE}`\r\n | `change:${BaseLayerProperty.ISVISIBLE}`;\r\n","import Feature from 'ol/Feature.js';\r\nimport GeoJSON from 'ol/format/GeoJSON.js';\r\nimport Geometry from 'ol/geom/Geometry.js';\r\nimport VectorSource, { Options as VSOptions } from 'ol/source/Vector.js';\r\nimport { transformExtent } from 'ol/proj.js';\r\nimport { bbox } from 'ol/loadingstrategy.js';\r\n\r\nimport { WfsGeoserverVendor } from '../../@types';\r\nimport { parseError, showError } from '../errors';\r\nimport { I18N } from '../i18n';\r\nimport { GeoServerAdvanced } from '../../Geoserver';\r\n\r\n/**\r\n * Layer source to retrieve WFS features from geoservers\r\n * https://docs.geoserver.org/stable/en/user/services/wfs/reference.html\r\n *\r\n * @extends {ol/source/Vector~VectorSource}\r\n * @param options\r\n */\r\nexport default class WfsSource extends VectorSource {\r\n public urlParams = new URLSearchParams({\r\n SERVICE: 'wfs',\r\n REQUEST: 'GetFeature',\r\n OUTPUTFORMAT: 'application/json',\r\n EXCEPTIONS: 'application/json'\r\n });\r\n\r\n constructor(options: WfsSourceOptions) {\r\n super({\r\n ...options,\r\n format: new GeoJSON(),\r\n loader: (extent, resolution, projection, success, failure) => {\r\n void (async () => {\r\n try {\r\n // If bbox, add extent to the request\r\n if (options.strategy == bbox) {\r\n const extentGeoServer = transformExtent(\r\n extent,\r\n projection.getCode(),\r\n options.geoServerAdvanced.projection\r\n );\r\n // https://docs.geoserver.org/stable/en/user/services/wfs/reference.html\r\n // request features using a bounding box with CRS maybe different from featureTypes native CRS\r\n this.urlParams.set(\r\n 'bbox',\r\n extentGeoServer.toString() +\r\n `,${options.geoServerAdvanced.projection}`\r\n );\r\n }\r\n\r\n const url_fetch =\r\n options.geoserverUrl +\r\n '?' +\r\n this.urlParams.toString();\r\n\r\n const response = await fetch(url_fetch, {\r\n headers: options.headers,\r\n credentials: options.credentials\r\n });\r\n\r\n if (!response.ok) {\r\n throw new Error('');\r\n }\r\n\r\n const data = await response.json();\r\n\r\n if (data.exceptions) {\r\n throw new Error(parseError(data));\r\n }\r\n\r\n const features = this.getFormat().readFeatures(data, {\r\n featureProjection: projection.getCode(),\r\n dataProjection: options.geoServerAdvanced.projection\r\n });\r\n\r\n features.forEach((feature: Feature<Geometry>) => {\r\n feature.set(\r\n '_layerName_',\r\n options.name,\r\n /* silent = */ true\r\n );\r\n });\r\n\r\n this.addFeatures(features as Feature<Geometry>[]);\r\n\r\n success(features as Feature<Geometry>[]);\r\n } catch (err) {\r\n this.removeLoadedExtent(extent);\r\n\r\n showError(I18N.errors.geoserver, err, options.name);\r\n\r\n failure();\r\n }\r\n })();\r\n }\r\n });\r\n\r\n this.urlParams.set(\r\n 'version',\r\n options.geoServerAdvanced.getFeatureVersion\r\n );\r\n\r\n this.urlParams.set('typename', options.name);\r\n\r\n this.urlParams.set(\r\n 'srsName',\r\n options.geoServerAdvanced.projection.toString()\r\n );\r\n }\r\n}\r\n\r\n/**\r\n * **_[interface]_** - Parameters to create a WfsSource\r\n *\r\n * @public\r\n */\r\nexport interface WfsSourceOptions extends VSOptions<Feature> {\r\n /**\r\n * Layer name in the GeoServer\r\n */\r\n name: string;\r\n\r\n /**\r\n * Url for OWS services. This endpoint will recive the WFS, WFST and WMS requests\r\n */\r\n geoserverUrl: string;\r\n\r\n /**\r\n * Advanced options for geoserver requests\r\n */\r\n geoServerAdvanced?: GeoServerAdvanced;\r\n\r\n /**\r\n *\r\n */\r\n geoserverVendor?: WfsGeoserverVendor;\r\n\r\n /**\r\n * Url headers for GeoServer requests. You can use it to add Authorization credentials\r\n * https://developer.mozilla.org/en-US/docs/Web/API/Request/headers\r\n */\r\n headers?: HeadersInit;\r\n\r\n /**\r\n * Credentials for fetch requests\r\n * https://developer.mozilla.org/en-US/docs/Web/API/Request/credentials\r\n */\r\n credentials?: RequestCredentials;\r\n}\r\n","import VectorLayer from 'ol/layer/Vector.js';\r\nimport BaseEvent from 'ol/events/Event.js';\r\nimport { CombinedOnSignature, EventTypes, OnSignature } from 'ol/Observable.js';\r\nimport { EventsKey } from 'ol/events.js';\r\nimport { LayerRenderEventTypes } from 'ol/render/EventType.js';\r\nimport { BaseLayerObjectEventTypes } from 'ol/layer/Base.js';\r\nimport { ObjectEvent } from 'ol/Object.js';\r\nimport RenderEvent from 'ol/render/Event.js';\r\n\r\nimport { Mixin } from 'ts-mixer';\r\n\r\nimport BaseLayer, { BaseLayerEventTypes } from './modules/base/BaseLayer';\r\nimport WfsSource from './modules/base/WfsSource';\r\nimport { LayerOptions } from './ol-wfst';\r\nimport { showLoading } from './modules/loading';\r\nimport { WfsGeoserverVendor } from './@types';\r\n\r\n/**\r\n * Layer to retrieve WFS features from geoservers\r\n * https://docs.geoserver.org/stable/en/user/services/wfs/reference.html\r\n *\r\n * @fires layerRendered\r\n * @extends {ol/layer/Vector~VectorLayer}\r\n * @param options\r\n */\r\nexport default class WfsLayer extends Mixin(BaseLayer, VectorLayer<WfsSource>) {\r\n private _loadingCount = 0;\r\n private _loadedCount = 0;\r\n\r\n public beforeTransactFeature: LayerOptions['beforeTransactFeature'];\r\n public beforeShowFieldsModal: LayerOptions['beforeShowFieldsModal'];\r\n\r\n declare on: OnSignature<EventTypes, BaseEvent, EventsKey> &\r\n OnSignature<\r\n | BaseLayerEventTypes\r\n | BaseLayerObjectEventTypes\r\n | 'change:source'\r\n | 'sourceready',\r\n ObjectEvent,\r\n EventsKey\r\n > &\r\n OnSignature<LayerRenderEventTypes, RenderEvent, EventsKey> &\r\n CombinedOnSignature<\r\n | EventTypes\r\n | BaseLayerEventTypes\r\n | BaseLayerObjectEventTypes\r\n | 'change:source'\r\n | 'sourceready'\r\n | LayerRenderEventTypes,\r\n EventsKey\r\n >;\r\n\r\n declare once: OnSignature<EventTypes, BaseEvent, EventsKey> &\r\n OnSignature<\r\n | BaseLayerEventTypes\r\n | BaseLayerObjectEventTypes\r\n | 'change:source'\r\n | 'sourceready',\r\n ObjectEvent,\r\n EventsKey\r\n > &\r\n OnSignature<LayerRenderEventTypes, RenderEvent, EventsKey> &\r\n CombinedOnSignature<\r\n | EventTypes\r\n | BaseLayerEventTypes\r\n | BaseLayerObjectEventTypes\r\n | 'change:source'\r\n | 'sourceready'\r\n | LayerRenderEventTypes,\r\n EventsKey\r\n >;\r\n\r\n declare un: OnSignature<EventTypes, BaseEvent, void> &\r\n OnSignature<\r\n | BaseLayerEventTypes\r\n | BaseLayerObjectEventTypes\r\n | 'change:source'\r\n | 'sourceready',\r\n ObjectEvent,\r\n void\r\n > &\r\n OnSignature<LayerRenderEventTypes, RenderEvent, void> &\r\n CombinedOnSignature<\r\n | EventTypes\r\n | BaseLayerEventTypes\r\n | BaseLayerObjectEventTypes\r\n | 'change:source'\r\n | 'sourceready'\r\n | LayerRenderEventTypes,\r\n void\r\n >;\r\n\r\n constructor(options: LayerOptions) {\r\n super({\r\n name: options.name,\r\n label: options.label || options.name,\r\n minZoom: options.minZoom,\r\n ...options\r\n });\r\n\r\n if (options.beforeTransactFeature) {\r\n this.beforeTransactFeature = options.beforeTransactFeature;\r\n }\r\n\r\n const geoserver = options.geoserver;\r\n\r\n const source = new WfsSource({\r\n name: options.name,\r\n headers: geoserver.getHeaders(),\r\n credentials: geoserver.getCredentials(),\r\n geoserverUrl: geoserver.getUrl(),\r\n geoServerAdvanced: geoserver.getAdvanced(),\r\n ...(options.strategy && { strategy: options.strategy }),\r\n geoserverVendor: options.geoserverVendor\r\n });\r\n\r\n this._loadingCount = 0;\r\n this._loadedCount = 0;\r\n\r\n source.on('featuresloadstart', () => {\r\n this._loadingCount++;\r\n if (this._loadingCount === 1 && this.isVisibleByZoom()) {\r\n showLoading();\r\n }\r\n });\r\n\r\n source.on(['featuresloadend', 'featuresloaderror'], () => {\r\n this._loadedCount++;\r\n if (this._loadingCount === this._loadedCount) {\r\n this._loadingCount = 0;\r\n this._loadedCount = 0;\r\n setTimeout(() => {\r\n this.dispatchEvent('layerRendered');\r\n }, 300);\r\n }\r\n });\r\n\r\n this.setSource(source);\r\n\r\n const geoserverOptions = options.geoserverVendor as WfsGeoserverVendor;\r\n\r\n Object.keys(geoserverOptions).forEach((param) => {\r\n source.urlParams.set(param, geoserverOptions[param]);\r\n });\r\n }\r\n\r\n /**\r\n * @public\r\n */\r\n refresh() {\r\n const source = this.getSource();\r\n // Refrescamos el wms\r\n source.refresh();\r\n }\r\n\r\n /**\r\n * Use this to update Geoserver Wms Vendors (https://docs.geoserver.org/latest/en/user/services/wms/vendor.html)\r\n * and other arguements (https://docs.geoserver.org/stable/en/user/services/wms/reference.html#getmap)\r\n * in all the getMap requests.\r\n *\r\n * Example: you can use this to change the style of the WMS, add a custom sld, set a cql_filter, etc.\r\n *\r\n * @public\r\n * @param paramName\r\n * @param value Use `undefined` or `null` to remove the param\r\n * @param refresh\r\n */\r\n setCustomParam(\r\n paramName: string,\r\n value: string = null,\r\n refresh = true\r\n ): URLSearchParams {\r\n const source = this.getSource();\r\n\r\n if (value === undefined || value === null) {\r\n source.urlParams.delete(paramName);\r\n } else {\r\n source.urlParams.set(paramName, value);\r\n }\r\n\r\n if (refresh) {\r\n this.refresh();\r\n }\r\n\r\n return source.urlParams;\r\n }\r\n}\r\n","/**\n * @module ol/TileState\n */\n\n/**\n * @enum {number}\n */\nexport default {\n IDLE: 0,\n LOADING: 1,\n LOADED: 2,\n /**\n * Indicates that tile loading failed\n * @type {number}\n */\n ERROR: 3,\n EMPTY: 4,\n};\n","import TileWMS, { Options as TSOptions } from 'ol/source/TileWMS.js';\r\nimport TileState from 'ol/TileState.js';\r\nimport ImageTile from 'ol/ImageTile.js';\r\n\r\nimport { WmsGeoserverVendor } from '../../@types';\r\nimport { parseError, showError } from '../errors';\r\nimport { I18N } from '../i18n';\r\nimport { GeoServerAdvanced } from '../../Geoserver';\r\n\r\n/**\r\n * Layer source to retrieve WMS information from geoservers\r\n * https://docs.geoserver.org/stable/en/user/services/wms/reference.html\r\n *\r\n * @extends {ol/source/TieWMS~TileWMS}\r\n * @param options\r\n */\r\nexport default class WmsSource extends TileWMS {\r\n constructor(options: WmsSourceOptions) {\r\n super({\r\n url: options.geoserverUrl,\r\n serverType: 'geoserver',\r\n params: {\r\n SERVICE: 'wms',\r\n TILED: true,\r\n LAYERS: options.name,\r\n EXCEPTIONS: 'application/json',\r\n ...(options.geoserverVendor && options.geoserverVendor)\r\n },\r\n tileLoadFunction: async (tile, src) => {\r\n const blobToJson = (blob: Blob): any => {\r\n return new Promise((resolve) => {\r\n const reader = new FileReader();\r\n reader.onloadend = () =>\r\n resolve(JSON.parse(reader.result as string));\r\n reader.readAsText(blob);\r\n });\r\n };\r\n\r\n try {\r\n const response = await fetch(src, {\r\n headers: options.headers,\r\n credentials: options.credentials\r\n });\r\n\r\n if (!response.ok) {\r\n throw new Error('');\r\n }\r\n\r\n let data = await response.blob();\r\n\r\n // Check if the response has an error\r\n if (data.type == 'application/json') {\r\n const parsedError = await blobToJson(data);\r\n throw new Error(parseError(parsedError));\r\n }\r\n\r\n ((tile as ImageTile).getImage() as HTMLImageElement).src =\r\n URL.createObjectURL(data);\r\n\r\n tile.setState(TileState.LOADED);\r\n } catch (err) {\r\n showError(I18N.errors.geoserver, err, options.name);\r\n tile.setState(TileState.ERROR);\r\n }\r\n },\r\n ...options\r\n });\r\n }\r\n}\r\n\r\n/**\r\n * **_[interface]_** - Parameters to create a WmsSource\r\n *\r\n * @public\r\n */\r\nexport interface WmsSourceOptions extends Omit<TSOptions, 'params'> {\r\n /**\r\n * Layer name in the GeoServer\r\n */\r\n name: string;\r\n\r\n /**\r\n * Url for OWS services. This endpoint will recive the WFS, WFST and WMS requests\r\n */\r\n geoserverUrl: string;\r\n\r\n /**\r\n * Advanced options for geoserver requests\r\n */\r\n geoServerAdvanced?: GeoServerAdvanced;\r\n\r\n /**\r\n *\r\n */\r\n geoserverVendor?: WmsGeoserverVendor;\r\n\r\n /**\r\n * Url headers for GeoServer requests. You can use it to add Authorization credentials\r\n * https://developer.mozilla.org/en-US/docs/Web/API/Request/headers\r\n */\r\n headers?: HeadersInit;\r\n\r\n /**\r\n * Credentials for fetch requests\r\n * https://developer.mozilla.org/en-US/docs/Web/API/Request/credentials\r\n */\r\n credentials?: RequestCredentials;\r\n}\r\n","import MapBrowserEvent from 'ol/MapBrowserEvent.js';\r\nimport TileLayer from 'ol/layer/Tile.js';\r\nimport Geometry from 'ol/geom/Geometry.js';\r\nimport Polygon from 'ol/geom/Polygon.js';\r\nimport Feature from 'ol/Feature.js';\r\nimport GeoJSON from 'ol/format/GeoJSON.js';\r\nimport BaseEvent from 'ol/events/Event.js';\r\nimport { CombinedOnSignature, EventTypes, OnSignature } from 'ol/Observable.js';\r\nimport { EventsKey } from 'ol/events.js';\r\nimport { LayerRenderEventTypes } from 'ol/render/EventType.js';\r\nimport { BaseLayerObjectEventTypes } from 'ol/layer/Base.js';\r\nimport { ObjectEvent } from 'ol/Object.js';\r\nimport RenderEvent from 'ol/render/Event.js';\r\n\r\nimport { Mixin } from 'ts-mixer';\r\n\r\nimport WmsSource from './modules/base/WmsSource';\r\nimport BaseLayer, { BaseLayerEventTypes } from './modules/base/BaseLayer';\r\nimport { LayerOptions } from './ol-wfst';\r\nimport { showLoading } from './modules/loading';\r\nimport { showError } from './modules/errors';\r\nimport { I18N } from './modules/i18n';\r\nimport { getMap } from './modules/state';\r\nimport { WmsGeoserverVendor } from './@types';\r\n\r\n/**\r\n * Layer to retrieve WMS information from geoservers\r\n * https://docs.geoserver.org/stable/en/user/services/wms/reference.html\r\n *\r\n * @fires layerRendered\r\n * @extends {ol/layer/Tile~TileLayer}\r\n * @param options\r\n */\r\nexport default class WmsLayer extends Mixin(BaseLayer, TileLayer<WmsSource>) {\r\n private _loadingCount = 0;\r\n private _loadedCount = 0;\r\n\r\n public beforeTransactFeature: LayerOptions['beforeTransactFeature'];\r\n public beforeShowFieldsModal: LayerOptions['beforeShowFieldsModal'];\r\n\r\n // Formats\r\n private _formatGeoJSON: GeoJSON;\r\n\r\n declare on: OnSignature<EventTypes, BaseEvent, EventsKey> &\r\n OnSignature<\r\n | BaseLayerEventTypes\r\n | BaseLayerObjectEventTypes\r\n | 'sourceready'\r\n | 'change:source'\r\n | 'change:preload'\r\n | 'change:useInterimTilesOnError',\r\n ObjectEvent,\r\n EventsKey\r\n > &\r\n OnSignature<LayerRenderEventTypes, RenderEvent, EventsKey> &\r\n CombinedOnSignature<\r\n | EventTypes\r\n | BaseLayerEventTypes\r\n | BaseLayerObjectEventTypes\r\n | 'sourceready'\r\n | 'change:source'\r\n | 'change:preload'\r\n | 'change:useInterimTilesOnError'\r\n | LayerRenderEventTypes,\r\n EventsKey\r\n >;\r\n declare once: OnSignature<EventTypes, BaseEvent, EventsKey> &\r\n OnSignature<\r\n | BaseLayerEventTypes\r\n | BaseLayerObjectEventTypes\r\n | 'sourceready'\r\n | 'change:source'\r\n | 'change:preload'\r\n | 'change:useInterimTilesOnError',\r\n ObjectEvent,\r\n EventsKey\r\n > &\r\n OnSignature<LayerRenderEventTypes, RenderEvent, EventsKey> &\r\n CombinedOnSignature<\r\n | EventTypes\r\n | BaseLayerEventTypes\r\n | BaseLayerObjectEventTypes\r\n | 'sourceready'\r\n | 'change:source'\r\n | 'change:preload'\r\n | 'change:useInterimTilesOnError'\r\n | LayerRenderEventTypes,\r\n EventsKey\r\n >;\r\n\r\n declare un: OnSignature<EventTypes, BaseEvent, void> &\r\n OnSignature<\r\n | BaseLayerEventTypes\r\n | BaseLayerObjectEventTypes\r\n | 'sourceready'\r\n | 'change:source'\r\n | 'change:preload'\r\n | 'change:useInterimTilesOnError',\r\n ObjectEvent,\r\n void\r\n > &\r\n OnSignature<LayerRenderEventTypes, RenderEvent, void> &\r\n CombinedOnSignature<\r\n | EventTypes\r\n | BaseLayerEventTypes\r\n | BaseLayerObjectEventTypes\r\n | 'sourceready'\r\n | 'change:source'\r\n | 'change:preload'\r\n | 'change:useInterimTilesOnError'\r\n | LayerRenderEventTypes,\r\n void\r\n >;\r\n\r\n constructor(options: LayerOptions) {\r\n super({\r\n name: options.name,\r\n label: options.label || options.name,\r\n minZoom: options.minZoom,\r\n ...options\r\n });\r\n\r\n if (options.beforeTransactFeature) {\r\n this.beforeTransactFeature = options.beforeTransactFeature;\r\n }\r\n\r\n if (options.beforeShowFieldsModal) {\r\n this.beforeShowFieldsModal = options.beforeShowFieldsModal;\r\n }\r\n\r\n this._formatGeoJSON = new GeoJSON();\r\n\r\n const geoserver = options.geoserver;\r\n\r\n const source = new WmsSource({\r\n name: options.name,\r\n headers: geoserver.getHeaders(),\r\n credentials: geoserver.getCredentials(),\r\n geoserverUrl: geoserver.getUrl(),\r\n geoServerAdvanced: geoserver.getAdvanced(),\r\n geoserverVendor: options.geoserverVendor as WmsGeoserverVendor\r\n });\r\n\r\n this._loadingCount = 0;\r\n this._loadedCount = 0;\r\n\r\n source.on('tileloadstart', () => {\r\n this._loadingCount++;\r\n if (this._loadingCount === 1 && this.isVisibleByZoom()) {\r\n showLoading();\r\n }\r\n });\r\n\r\n source.on(['tileloadend', 'tileloaderror'], () => {\r\n this._loadedCount++;\r\n if (this._loadingCount === this._loadedCount) {\r\n this._loadingCount = 0;\r\n this._loadedCount = 0;\r\n setTimeout(() => {\r\n this.dispatchEvent('layerRendered');\r\n }, 300);\r\n }\r\n });\r\n\r\n this.setSource(source);\r\n }\r\n\r\n /**\r\n * Get the features on the click area\r\n * @param evt\r\n * @returns\r\n * @private\r\n */\r\n async _getFeaturesByClickEvent(\r\n evt: MapBrowserEvent<PointerEvent>\r\n ): Promise<Feature<Geometry>[]> {\r\n const coordinate = evt.coordinate;\r\n\r\n const view = getMap().getView();\r\n\r\n // Si la vista es lejana, disminumos el buffer\r\n // Si es cercana, lo aumentamos, por ejemplo, para podeer clickear los vectores\r\n // y mejorar la sensibilidad en IOS\r\n const buffer = view.getZoom() > 10 ? 10 : 5;\r\n\r\n const source = this.getSource();\r\n\r\n // Fallback to support a bad name\r\n // https://openlayers.org/en/v5.3.0/apidoc/module-ol_source_ImageWMS-ImageWMS.html#getGetFeatureInfoUrl\r\n const fallbackOl5 =\r\n 'getFeatureInfoUrl' in source\r\n ? 'getFeatureInfoUrl'\r\n : 'getGetFeatureInfoUrl';\r\n\r\n const url = source[fallbackOl5](\r\n coordinate,\r\n view.getResolution(),\r\n view.getProjection().getCode(),\r\n {\r\n INFO_FORMAT: 'application/json',\r\n BUFFER: buffer,\r\n FEATURE_COUNT: 1,\r\n EXCEPTIONS: 'application/json'\r\n }\r\n );\r\n\r\n return this._requestFeatures(url);\r\n }\r\n\r\n /**\r\n * Request the WFS features that intersect the given geometry, selecting\r\n * them with a WFS GetFeature + CQL INTERSECTS filter. Used to select\r\n * features from a WMS layer with a box or a freehand lasso.\r\n *\r\n * @param geometry Geometry in the map view projection\r\n * @returns\r\n * @private\r\n */\r\n async _getFeaturesInGeometry(\r\n geometry: Geometry\r\n ): Promise<Feature<Geometry>[]> {\r\n // Make sure the DescribeFeatureType is loaded to get the geometry\r\n // field, waiting for it if the layer is still initializing\r\n if (!this.getDescribeFeatureType()) {\r\n await this.getAndUpdateDescribeFeatureType();\r\n }\r\n\r\n const geomField = this.getDescribeFeatureType()?._parsed?.geomField;\r\n\r\n if (!geomField) {\r\n showError(`${I18N.errors.layer} \"${this.get('name')}\"`);\r\n return [];\r\n }\r\n\r\n const viewProj = getMap().getView().getProjection().getCode();\r\n const nativeSrs = this._getNativeSrs();\r\n\r\n // Work on a copy transformed to the layer native projection so the\r\n // server evaluates the INTERSECTS filter against the proper SRID\r\n const polygon = geometry.clone() as Polygon;\r\n if (nativeSrs !== viewProj) {\r\n try {\r\n polygon.transform(viewProj, nativeSrs);\r\n } catch (err) {\r\n console.error(err);\r\n }\r\n }\r\n\r\n const ring = polygon.getCoordinates()[0] || [];\r\n const ringWkt = ring.map(([x, y]) => `${x} ${y}`).join(', ');\r\n\r\n // Force the filter geometry CRS with the EWKT SRID prefix so the\r\n // server evaluates the INTERSECTS against the layer projection\r\n // instead of its native storage SRS\r\n const sridMatch =\r\n nativeSrs.match(/(?:EPSG\\s*::?\\s*|EPSG\\/0\\/)(\\d+)/i) ??\r\n nativeSrs.match(/(\\d+)$/);\r\n\r\n const cql = sridMatch\r\n ? `INTERSECTS(${geomField}, SRID=${sridMatch[1]};POLYGON((${ringWkt})))`\r\n : `INTERSECTS(${geomField}, POLYGON((${ringWkt})))`;\r\n\r\n const queryParams = new URLSearchParams({\r\n SERVICE: 'wfs',\r\n VERSION: '2.0.0',\r\n REQUEST: 'GetFeature',\r\n TYPENAME: this.get('name'),\r\n OUTPUTFORMAT: 'application/json',\r\n SRSNAME: viewProj,\r\n CQL_FILTER: cql\r\n });\r\n\r\n const url =\r\n this.getSource().getUrls()[0] + '?' + queryParams.toString();\r\n\r\n // The server returns the features in the map view projection (same as\r\n // the full resolution request), so no further transformation is needed\r\n return this._requestFeatures(url);\r\n }\r\n\r\n /**\r\n * Resolve the layer native SRS so spatial filters are evaluated in the\r\n * correct projection. It reads the DefaultCRS from the WFS capabilities,\r\n * falling back to the geoserver advanced projection option and finally to\r\n * the map view projection.\r\n *\r\n * @returns\r\n * @private\r\n */\r\n private _getNativeSrs(): string {\r\n const geoserver = this.getGeoserver();\r\n\r\n const viewProj = getMap().getView().getProjection().getCode();\r\n\r\n const layerName = String(this.get('name') || '');\r\n const layerLocalName = layerName.split(':').pop();\r\n\r\n const featureTypeList =\r\n geoserver.getParsedCapabilities()?.FeatureTypeList;\r\n\r\n const featureType = Array.isArray(featureTypeList)\r\n ? featureTypeList.find((ft: any) => {\r\n const featureTypeName = String(ft?.Name || '');\r\n return (\r\n featureTypeName === layerName ||\r\n featureTypeName === layerLocalName ||\r\n featureTypeName.split(':').pop() === layerLocalName\r\n );\r\n })\r\n : undefined;\r\n\r\n const defaultCrs = featureType?.DefaultCRS\r\n ? String(featureType.DefaultCRS)\r\n : '';\r\n\r\n const epsgMatch = defaultCrs.match(/(?:EPSG\\s*::?\\s*|EPSG\\/0\\/)(\\d+)/i);\r\n\r\n if (epsgMatch) {\r\n return `EPSG:${epsgMatch[1]}`;\r\n }\r\n\r\n const advanced = geoserver.getAdvanced().projection;\r\n if (advanced) {\r\n return String(advanced);\r\n }\r\n\r\n return viewProj;\r\n }\r\n\r\n /**\r\n * Fetch and parse the features from a request url, replacing the\r\n * low resolution geometries (GetFeatureInfo) with the full resolution\r\n * ones requested by FEATUREID when possible.\r\n *\r\n * @param url\r\n * @returns\r\n * @private\r\n */\r\n private async _requestFeatures(\r\n url: string\r\n ): Promise<Feature<Geometry>[] | undefined> {\r\n const geoserver = this.getGeoserver();\r\n\r\n try {\r\n const response = await fetch(url, {\r\n headers: geoserver.getHeaders(),\r\n credentials: geoserver.getCredentials()\r\n });\r\n\r\n if (!response.ok) {\r\n throw new Error(\r\n `${I18N.errors.getFeatures} ${response.status}`\r\n );\r\n }\r\n\r\n const data = await response.json();\r\n let features = this._parseFeaturesFromResponse(data);\r\n\r\n const featuresId = features.map((f) => f.getId());\r\n\r\n if (!featuresId.length) {\r\n return [];\r\n }\r\n\r\n const fullResList = await this._getFullResGeometryById(featuresId);\r\n\r\n if (fullResList) {\r\n features = fullResList;\r\n }\r\n\r\n return features;\r\n } catch (err) {\r\n showError(err.message, err);\r\n }\r\n }\r\n\r\n private _parseFeaturesFromResponse(data: string): Feature<Geometry>[] {\r\n return this._formatGeoJSON.readFeatures(data);\r\n }\r\n\r\n /**\r\n * Return the full accuracy geometries to replace the features from GetFeatureInfo\r\n * @param featuresId\r\n * @returns\r\n */\r\n private _getFullResGeometryById = async (\r\n featuresId: Array<string | number>\r\n ): Promise<Feature<Geometry>[] | false> => {\r\n const queryParams = new URLSearchParams({\r\n SERVICE: 'wfs',\r\n VERSION: '2.0.0',\r\n INFO_FORMAT: 'application/json',\r\n REQUEST: 'GetFeature',\r\n TYPENAME: this.get('name'),\r\n MAXFEATURES: String(featuresId.length),\r\n OUTPUTFORMAT: 'application/json',\r\n SRSNAME: getMap().getView().getProjection().getCode(),\r\n FEATUREID: featuresId.join(',')\r\n });\r\n\r\n const url =\r\n this.getSource().getUrls()[0] + '?' + queryParams.toString();\r\n\r\n try {\r\n const geoserver = this.getGeoserver();\r\n\r\n const response = await fetch(url, {\r\n headers: geoserver.getHeaders(),\r\n credentials: geoserver.getCredentials()\r\n });\r\n\r\n if (!response.ok) {\r\n throw new Error(\r\n `${I18N.errors.getFeatures} ${response.status}`\r\n );\r\n }\r\n const data = await response.json();\r\n\r\n const fullById: { [key: string]: Feature<Geometry> } = {};\r\n this._parseFeaturesFromResponse(data).forEach((feature) => {\r\n fullById[String(feature.getId())] = feature;\r\n });\r\n\r\n return featuresId.map((id) => fullById[String(id)]).filter(Boolean);\r\n } catch (err) {\r\n console.error(err);\r\n return false;\r\n }\r\n };\r\n\r\n /**\r\n * @public\r\n */\r\n refresh() {\r\n const source = this.getSource();\r\n\r\n // Refrescamos el wms\r\n source.refresh();\r\n\r\n // Force refresh the tiles\r\n const params = source.getParams();\r\n params.t = new Date().getMilliseconds();\r\n source.updateParams(params);\r\n }\r\n\r\n /**\r\n * Use this to update Geoserver Wfs Vendors (https://docs.geoserver.org/latest/en/user/services/wfs/vendor.html)\r\n * and other arguements (https://docs.geoserver.org/stable/en/user/services/wfs/reference.html)\r\n * in all the getFeature requests.\r\n *\r\n * Example: you can use this to set a cql_filter, limit the numbers of features, etc.\r\n *\r\n * @public\r\n * @param paramName\r\n * @param value\r\n * @param refresh\r\n */\r\n setCustomParam(\r\n paramName: string,\r\n value: string = null,\r\n refresh = true\r\n ): URLSearchParams {\r\n const source = this.getSource();\r\n\r\n source.updateParams({\r\n [paramName]: value\r\n });\r\n\r\n if (refresh) {\r\n this.refresh();\r\n }\r\n\r\n return source.getParams();\r\n }\r\n}\r\n","function createElement(\r\n tagName: string | ((props, children) => HTMLElement),\r\n props: { [key: string]: any }\r\n): HTMLElement | DocumentFragment {\r\n props = props || {};\r\n\r\n let children = props.children || [];\r\n children = Array.isArray(children) ? children : [children];\r\n\r\n delete props.children;\r\n\r\n if (typeof tagName === 'function') {\r\n return tagName(props, children);\r\n }\r\n\r\n const elem: HTMLElement | DocumentFragment =\r\n tagName === 'fragment'\r\n ? document.createDocumentFragment()\r\n : document.createElement(tagName);\r\n\r\n if (elem instanceof HTMLElement) {\r\n Object.entries(props).forEach(([name, value]) => {\r\n if (value != null) {\r\n // listener\r\n if (name.startsWith('on') && typeof value === 'function') {\r\n elem.addEventListener(\r\n name\r\n .slice(2)\r\n .toLowerCase() as keyof HTMLElementEventMap,\r\n value as EventListenerOrEventListenerObject\r\n );\r\n } else if (name === 'className') {\r\n elem.setAttribute('class', value.toString());\r\n } else if (name === 'htmlFor') {\r\n elem.setAttribute('for', value.toString());\r\n } else {\r\n elem.setAttribute(name, value.toString());\r\n }\r\n }\r\n });\r\n }\r\n\r\n for (const child of children) {\r\n if (!child) {\r\n continue;\r\n }\r\n if (Array.isArray(child)) {\r\n elem.append(...child);\r\n } else if (child instanceof Node) {\r\n elem.appendChild(child);\r\n } else {\r\n (elem as HTMLElement).innerHTML += child;\r\n }\r\n }\r\n return elem;\r\n}\r\n\r\nexport function jsx(type: any, props: any) {\r\n return createElement(type, props) as HTMLElement;\r\n}\r\n\r\nexport function jsxs(type: any, props: any) {\r\n return createElement(type, props) as HTMLElement;\r\n}\r\n\r\nexport function Fragment(type: any, children) {\r\n return createElement('fragment', { children }) as DocumentFragment;\r\n}\r\n","import Observable from 'ol/Observable.js';\r\n\r\nimport WfsLayer from '../WfsLayer.js';\r\nimport WmsLayer from '../WmsLayer.js';\r\n\r\nimport uploadSvg from '../assets/images/upload.svg';\r\nimport drawSvg from '../assets/images/draw.svg';\r\nimport selectSvg from '../assets/images/select.svg';\r\nimport selectBoxSvg from '../assets/images/selectBox.svg';\r\nimport selectFreehandSvg from '../assets/images/selectFreehand.svg';\r\nimport infoSvg from '../assets/images/info.svg';\r\nimport visibilityOnSvg from '../assets/images/visibilityOn.svg';\r\nimport visibilityOffSvg from '../assets/images/visibilityOff.svg';\r\n\r\nimport { GeometryType } from '../@enums';\r\nimport {\r\n getActiveLayerToInsertEls,\r\n getStoredMapLayers,\r\n setActiveLayerToInsertEls,\r\n SelectionMode\r\n} from './state';\r\nimport { I18N } from './i18n';\r\nimport Uploads from './Uploads';\r\nimport { BaseLayerProperty } from './base/BaseLayer';\r\n\r\nimport type { Options } from '../ol-wfst';\r\n\r\n/**\r\n * Removes in the DOM the class of the tools\r\n * @private\r\n */\r\nexport const resetStateButtons = (): void => {\r\n const activeBtn = document.querySelector(\r\n '.ol-wfst--tools-control-btn.wfst--active'\r\n );\r\n if (activeBtn) {\r\n activeBtn.classList.remove('wfst--active');\r\n }\r\n};\r\n\r\nexport const activateModeButtons = () => {\r\n const btn = document.querySelector('.ol-wfst--tools-control-btn-edit');\r\n if (btn) {\r\n btn.classList.add('wfst--active');\r\n }\r\n deactivateQueryButton();\r\n};\r\n\r\nexport const activateQueryButton = () => {\r\n const btn = document.querySelector('.ol-wfst--tools-control-btn-query');\r\n if (btn) {\r\n btn.classList.add('wfst--active');\r\n }\r\n};\r\n\r\nexport const deactivateQueryButton = (): void => {\r\n const btn = document.querySelector('.ol-wfst--tools-control-btn-query');\r\n if (btn) {\r\n btn.classList.remove('wfst--active');\r\n }\r\n};\r\n\r\nexport const activateDrawButton = () => {\r\n const btn = document.querySelector('.ol-wfst--tools-control-btn-draw');\r\n if (btn) {\r\n btn.classList.add('wfst--active');\r\n }\r\n};\r\n\r\nexport const activateSelectModeButton = (mode: SelectionMode) => {\r\n const activeBtn = document.querySelector(\r\n '.ol-wfst--tools-control-btn-select.wfst--active, .ol-wfst--tools-control-btn-select-box.wfst--active, .ol-wfst--tools-control-btn-select-freehand.wfst--active'\r\n );\r\n if (activeBtn) {\r\n activeBtn.classList.remove('wfst--active');\r\n }\r\n\r\n deactivateQueryButton();\r\n\r\n const btnMap = {\r\n [SelectionMode.Single]: '.ol-wfst--tools-control-btn-select',\r\n [SelectionMode.Box]: '.ol-wfst--tools-control-btn-select-box',\r\n [SelectionMode.Freehand]: '.ol-wfst--tools-control-btn-select-freehand'\r\n };\r\n\r\n const btn = document.querySelector(btnMap[mode]);\r\n if (btn) {\r\n btn.classList.add('wfst--active');\r\n }\r\n};\r\n\r\nexport const deactivateSelectModeButton = (): void => {\r\n const activeBtn = document.querySelector(\r\n '.ol-wfst--tools-control-btn-select.wfst--active, .ol-wfst--tools-control-btn-select-box.wfst--active, .ol-wfst--tools-control-btn-select-freehand.wfst--active'\r\n );\r\n if (activeBtn) {\r\n activeBtn.classList.remove('wfst--active');\r\n }\r\n\r\n deactivateQueryButton();\r\n};\r\n\r\nexport default class LayersControl extends Observable {\r\n protected _uploads: Uploads;\r\n protected _uploadFormats: Options['uploadFormats'];\r\n\r\n constructor(uploads: Uploads, uploadFormats: Options['uploadFormats']) {\r\n super();\r\n\r\n this._uploads = uploads;\r\n this._uploadFormats = uploadFormats;\r\n }\r\n\r\n /**\r\n *\r\n * @param layer\r\n * @public\r\n */\r\n addLayerEl(layer: WfsLayer | WmsLayer): HTMLElement {\r\n const container = document.querySelector(\r\n '.wfst--tools-control--select-layers-list'\r\n );\r\n\r\n const layerName = layer.get(BaseLayerProperty.NAME) as string;\r\n const checked =\r\n layer === getActiveLayerToInsertEls() ? { checked: true } : {};\r\n\r\n const input = (\r\n <input\r\n value={layerName}\r\n id={`wfst--${layerName}`}\r\n type=\"radio\"\r\n className=\"ol-wfst--tools-control-input\"\r\n name=\"wfst--select-layer\"\r\n {...checked}\r\n onChange={(evt: Event) => this._layerChangeHandler(evt, layer)}\r\n />\r\n );\r\n\r\n const layerDom = (\r\n <div\r\n className={`wfst--layer-control \r\n ${layer.getVisible() ? 'ol-wfst--visible-on' : ''}\r\n ${\r\n layer === getActiveLayerToInsertEls()\r\n ? 'ol-wfst--selected-on'\r\n : ''\r\n }`}\r\n data-layer={layerName}\r\n >\r\n <label htmlFor={`wfst--${layerName}`}>\r\n <div className=\"ol-wfst--layer-control-visible \">\r\n <span\r\n className=\"ol-wfst--layer-control-visible -btn ol-wfst--visible-btn-on\"\r\n title={I18N.labels.toggleVisibility}\r\n onClick={(evt: MouseEvent) =>\r\n this._visibilityClickHandler(evt)\r\n }\r\n >\r\n {visibilityOnSvg()}\r\n </span>\r\n <span\r\n className=\"ol-wfst--layer-control-visible -btn ol-wfst--visible-btn-off\"\r\n title={I18N.labels.toggleVisibility}\r\n onClick={(evt: MouseEvent) =>\r\n this._visibilityClickHandler(evt)\r\n }\r\n >\r\n {visibilityOffSvg()}\r\n </span>\r\n </div>\r\n {input}\r\n <span\r\n title={`${\r\n layer instanceof WfsLayer ? 'WFS' : 'WMS'\r\n } - ${layer.getDescribeFeatureType()._parsed.geomType}`}\r\n >\r\n {layer.get(BaseLayerProperty.LABEL)}\r\n </span>\r\n </label>\r\n </div>\r\n );\r\n\r\n container.appendChild(layerDom);\r\n\r\n if (layer === getActiveLayerToInsertEls()) {\r\n input.dispatchEvent(new Event('change'));\r\n }\r\n\r\n return layerDom;\r\n }\r\n\r\n /**\r\n * Update geom Types availibles to select for this layer\r\n *\r\n * @param layerName\r\n * @param geomDrawTypeSelected\r\n * @private\r\n */\r\n private _changeStateSelect(\r\n layer: WmsLayer | WfsLayer,\r\n geomDrawTypeSelected: GeometryType = null\r\n ): GeometryType {\r\n /**\r\n * Set the geometry type in the select according to the geometry of\r\n * the layer in the geoserver and disable what does not correspond.\r\n *\r\n * @param value\r\n * @param options\r\n * @private\r\n */\r\n const setSelectState = (\r\n value: GeometryType,\r\n options: Array<string> | 'all'\r\n ): void => {\r\n Array.from(selectDraw.options).forEach(\r\n (option: HTMLOptionElement) => {\r\n option.selected = option.value === value ? true : false;\r\n option.disabled =\r\n options === 'all'\r\n ? false\r\n : options.includes(option.value)\r\n ? false\r\n : true;\r\n option.title = option.disabled\r\n ? I18N.labels.geomTypeNotSupported\r\n : '';\r\n }\r\n );\r\n };\r\n\r\n const selectDraw = document.querySelector(\r\n '.wfst--tools-control--select-draw'\r\n ) as HTMLSelectElement;\r\n\r\n let drawType: GeometryType;\r\n\r\n if (selectDraw) {\r\n const geomLayer = layer.getDescribeFeatureType()._parsed.geomType;\r\n\r\n if (geomDrawTypeSelected) {\r\n drawType = selectDraw.value as GeometryType;\r\n } else {\r\n if (geomLayer === GeometryType.GeometryCollection) {\r\n drawType = GeometryType.LineString; // Default drawing type for GeometryCollection\r\n setSelectState(drawType, 'all');\r\n } else if (geomLayer === GeometryType.LinearRing) {\r\n drawType = GeometryType.LineString; // Default drawing type for GeometryCollection\r\n setSelectState(drawType, [\r\n GeometryType.Circle,\r\n GeometryType.LinearRing,\r\n GeometryType.Polygon\r\n ]);\r\n selectDraw.value = drawType;\r\n } else {\r\n drawType = geomLayer;\r\n setSelectState(drawType, [geomLayer]);\r\n }\r\n }\r\n }\r\n\r\n return drawType;\r\n }\r\n\r\n private _visibilityClickHandler(evt: MouseEvent) {\r\n const btn = evt.currentTarget as HTMLElement;\r\n const parentDiv = btn.closest('.wfst--layer-control') as HTMLElement;\r\n const layerName = parentDiv.dataset['layer'];\r\n parentDiv.classList.toggle('ol-wfst--visible-on');\r\n const layer = getStoredMapLayers()[layerName];\r\n if (parentDiv.classList.contains('ol-wfst--visible-on')) {\r\n layer.setVisible(true);\r\n } else {\r\n layer.setVisible(false);\r\n }\r\n }\r\n\r\n /**\r\n * Called when a layer is selected in the widget\r\n * @param evt\r\n * @param layer\r\n */\r\n private _layerChangeHandler(evt: Event, layer: WfsLayer | WmsLayer) {\r\n const selected = document.querySelector('.ol-wfst--selected-on');\r\n const parentDiv = (evt.currentTarget as HTMLElement).closest(\r\n '.wfst--layer-control'\r\n ) as HTMLElement;\r\n\r\n // Deselect DOM previous layer\r\n selected.classList.remove('ol-wfst--selected-on');\r\n\r\n // Select this layer\r\n parentDiv.classList.add('ol-wfst--selected-on');\r\n setActiveLayerToInsertEls(layer);\r\n this._changeStateSelect(layer);\r\n\r\n this.dispatchEvent('changeLayer');\r\n }\r\n\r\n render(): HTMLElement {\r\n return (\r\n <>\r\n <div className=\"wfst--tools-control--head\">\r\n <div className=\"ol-wfst--tools-control-select-cnt\">\r\n <button\r\n className=\"ol-wfst--tools-control-btn ol-wfst--tools-control-btn-select wfst--active\"\r\n type=\"button\"\r\n title={I18N.labels.select}\r\n onClick={() => {\r\n this.dispatchEvent('selectModeSingle');\r\n }}\r\n >\r\n {selectSvg()}\r\n </button>\r\n <button\r\n className=\"ol-wfst--tools-control-btn ol-wfst--tools-control-btn-select-box\"\r\n type=\"button\"\r\n title={I18N.labels.selectBox}\r\n onClick={() => {\r\n this.dispatchEvent('selectModeBox');\r\n }}\r\n >\r\n {selectBoxSvg()}\r\n </button>\r\n <button\r\n className=\"ol-wfst--tools-control-btn ol-wfst--tools-control-btn-select-freehand\"\r\n type=\"button\"\r\n title={I18N.labels.selectFreehand}\r\n onClick={() => {\r\n this.dispatchEvent('selectModeFreehand');\r\n }}\r\n >\r\n {selectFreehandSvg()}\r\n </button>\r\n </div>\r\n <div className=\"ol-wfst--tools-control-query-cnt\">\r\n <button\r\n className=\"ol-wfst--tools-control-btn ol-wfst--tools-control-btn-query\"\r\n type=\"button\"\r\n title={I18N.labels.query}\r\n onClick={() => {\r\n this.dispatchEvent('queryMode');\r\n }}\r\n >\r\n {infoSvg()}\r\n </button>\r\n </div>\r\n <div className=\"ol-wfst--tools-control-draw-cnt\">\r\n <button\r\n className=\"ol-wfst--tools-control-btn ol-wfst--tools-control-btn-draw\"\r\n type=\"button\"\r\n title={I18N.labels.addElement}\r\n onClick={() => {\r\n this.dispatchEvent('drawMode');\r\n }}\r\n >\r\n {drawSvg()}\r\n </button>\r\n <select\r\n title={I18N.labels.selectDrawType}\r\n className=\"wfst--tools-control--select-draw\"\r\n onChange={(evt: Event) => {\r\n const selectedValue = (\r\n evt.target as HTMLSelectElement\r\n ).value as GeometryType;\r\n this._changeStateSelect(\r\n getActiveLayerToInsertEls(),\r\n selectedValue\r\n );\r\n this.dispatchEvent('changeGeom');\r\n }}\r\n >\r\n {[\r\n GeometryType.Point,\r\n GeometryType.MultiPoint,\r\n GeometryType.LineString,\r\n GeometryType.MultiLineString,\r\n GeometryType.Polygon,\r\n GeometryType.MultiPolygon,\r\n GeometryType.Circle\r\n ].map((type) => {\r\n // Show all options, but enable only the accepted ones\r\n return <option value={type}>{type}</option>;\r\n })}\r\n </select>\r\n </div>\r\n {this._uploads && (\r\n <div>\r\n <input\r\n id=\"ol-wfst--upload\"\r\n type=\"file\"\r\n accept={this._uploadFormats}\r\n onChange={(evt) => this._uploads.process(evt)}\r\n />\r\n <label\r\n className=\"ol-wfst--tools-control-btn ol-wfst--tools-control-btn-upload\"\r\n htmlFor=\"ol-wfst--upload\"\r\n title={I18N.labels.uploadToLayer}\r\n >\r\n {uploadSvg()}\r\n </label>\r\n </div>\r\n )}\r\n </div>\r\n <div className=\"wfst--tools-control--select-layers\">\r\n <div className=\"wfst--tools-control--select-layers-title\">\r\n {I18N.labels.geoserverLayers}\r\n </div>\r\n <div className=\"wfst--tools-control--select-layers-list\"></div>\r\n </div>\r\n </>\r\n );\r\n }\r\n}\r\n","import VectorLayer from 'ol/layer/Vector.js';\r\nimport VectorSource from 'ol/source/Vector.js';\r\n\r\nlet editLayer = new VectorLayer({\r\n source: new VectorSource(),\r\n zIndex: 100\r\n});\r\n\r\nexport const getEditLayer = (): VectorLayer<VectorSource> => {\r\n return editLayer;\r\n};\r\n","// Ol\r\nimport {\r\n Geometry,\r\n LineString,\r\n MultiLineString,\r\n MultiPoint,\r\n MultiPolygon,\r\n Point,\r\n Polygon\r\n} from 'ol/geom.js';\r\nimport Feature from 'ol/Feature.js';\r\nimport Observable from 'ol/Observable.js';\r\nimport GeoJSON from 'ol/format/GeoJSON.js';\r\nimport KML from 'ol/format/KML.js';\r\nimport WFS from 'ol/format/WFS.js';\r\nimport { VectorSourceEvent } from 'ol/source/Vector.js';\r\nimport { BaseLayerProperty } from './base/BaseLayer.js';\r\n\r\n// External\r\nimport Modal from 'modal-vanilla';\r\n\r\nimport { Options } from '../ol-wfst';\r\nimport { showError } from './errors';\r\nimport { resetStateButtons } from './LayersControl';\r\nimport { getEditLayer } from './editLayer';\r\nimport { getActiveLayerToInsertEls, getMap } from './state';\r\nimport { GeometryType } from '../@enums';\r\nimport { I18N } from './i18n';\r\n\r\nexport default class Uploads extends Observable {\r\n protected _options: Options;\r\n\r\n // Formats\r\n protected _formatWFS: WFS;\r\n protected _formatGeoJSON: GeoJSON;\r\n protected _formatKml: KML;\r\n protected _xs: XMLSerializer;\r\n\r\n protected _processUpload: Options['processUpload'];\r\n\r\n constructor(options: Options) {\r\n super();\r\n\r\n this._options = options;\r\n\r\n this._processUpload = options.processUpload;\r\n\r\n // Formats\r\n this._formatWFS = new WFS();\r\n\r\n this._formatGeoJSON = new GeoJSON();\r\n this._formatKml = new KML({\r\n extractStyles: false,\r\n showPointNames: false\r\n });\r\n this._xs = new XMLSerializer();\r\n }\r\n\r\n /**\r\n * Parse and check geometry of uploaded files\r\n *\r\n * @param evt\r\n * @public\r\n */\r\n async process(evt: Event): Promise<void> {\r\n const map = getMap();\r\n const view = map.getView();\r\n\r\n const file = (evt.target as HTMLInputElement).files[0];\r\n\r\n let features: Array<Feature<Geometry>>;\r\n\r\n if (!file) {\r\n return;\r\n }\r\n\r\n const extension = file.name.split('.').pop().toLowerCase();\r\n\r\n try {\r\n // If the user uses a custom fucntion...\r\n if (this._processUpload) {\r\n features = this._processUpload(file);\r\n }\r\n\r\n // If the user functions return features, we dont process anything more\r\n if (!features) {\r\n const string = await this._fileReader(file);\r\n\r\n if (extension === 'geojson' || extension === 'json') {\r\n features = this._formatGeoJSON.readFeatures(string, {\r\n featureProjection: view.getProjection().getCode()\r\n });\r\n } else if (extension === 'kml') {\r\n features = this._formatKml.readFeatures(string, {\r\n featureProjection: view.getProjection().getCode()\r\n });\r\n } else {\r\n showError(I18N.errors.badFormat);\r\n }\r\n }\r\n\r\n let invalidFeaturesCount = 0;\r\n let validFeaturesCount = 0;\r\n\r\n const featuresToInsert: Array<Feature<Geometry>> = [];\r\n\r\n for (let feature of features) {\r\n // If the geometry doesn't correspond to the layer, try to fixit.\r\n // If we can't, don't use it\r\n if (!this._checkGeometry(feature)) {\r\n feature = this._fixGeometry(feature);\r\n }\r\n\r\n if (feature) {\r\n featuresToInsert.push(feature);\r\n validFeaturesCount++;\r\n } else {\r\n invalidFeaturesCount++;\r\n continue;\r\n }\r\n }\r\n\r\n if (!validFeaturesCount) {\r\n showError(I18N.errors.noValidGeometry);\r\n } else {\r\n resetStateButtons();\r\n\r\n this.dispatchEvent(\r\n new VectorSourceEvent(\r\n 'loadedFeatures',\r\n null,\r\n featuresToInsert\r\n )\r\n );\r\n\r\n const content = `\r\n ${I18N.labels.validFeatures}: ${validFeaturesCount}<br>\r\n ${\r\n invalidFeaturesCount\r\n ? `${I18N.labels.invalidFeatures}: ${invalidFeaturesCount}`\r\n : ''\r\n }`;\r\n\r\n this._initModal(content, featuresToInsert);\r\n }\r\n\r\n // Reset the input to allow another onChange trigger\r\n (evt.target as HTMLInputElement).value = null;\r\n } catch (err) {\r\n showError(I18N.errors.badFile, err);\r\n }\r\n }\r\n\r\n /**\r\n * Read data file\r\n * @param file\r\n * @public\r\n */\r\n async _fileReader(file: File): Promise<string> {\r\n return new Promise((resolve, reject) => {\r\n const reader = new FileReader();\r\n\r\n reader.addEventListener('load', async (e) => {\r\n const fileData = e.target.result;\r\n resolve(fileData as string);\r\n });\r\n\r\n reader.addEventListener('error', (err) => {\r\n console.error('Error' + err);\r\n reject();\r\n });\r\n reader.readAsText(file);\r\n });\r\n }\r\n\r\n /**\r\n * Attemp to change the geometry feature to the layer\r\n * @param feature\r\n * @private\r\n */\r\n _fixGeometry(feature: Feature<Geometry>): Feature<Geometry> {\r\n // Geometry of the layer\r\n const geomTypeLayer =\r\n getActiveLayerToInsertEls().getDescribeFeatureType()._parsed\r\n .geomType;\r\n const geomTypeFeature = feature.getGeometry().getType();\r\n let geom: Geometry;\r\n\r\n switch (geomTypeFeature) {\r\n case GeometryType.Point: {\r\n if (geomTypeLayer === GeometryType.MultiPoint) {\r\n const coords = (\r\n feature.getGeometry() as Point\r\n ).getCoordinates();\r\n geom = new MultiPoint([coords]);\r\n }\r\n break;\r\n }\r\n\r\n case GeometryType.LineString:\r\n if (geomTypeLayer === GeometryType.MultiLineString) {\r\n const coords = (\r\n feature.getGeometry() as LineString\r\n ).getCoordinates();\r\n geom = new MultiLineString([coords]);\r\n }\r\n break;\r\n\r\n case GeometryType.Polygon:\r\n if (geomTypeLayer === GeometryType.MultiPolygon) {\r\n const coords = (\r\n feature.getGeometry() as Polygon\r\n ).getCoordinates();\r\n geom = new MultiPolygon([coords]);\r\n }\r\n break;\r\n default:\r\n geom = null;\r\n }\r\n\r\n if (!geom) {\r\n return null;\r\n }\r\n\r\n feature.setGeometry(geom);\r\n return feature;\r\n }\r\n\r\n /**\r\n * Check if the feature has the same geometry as the target layer\r\n * @param feature\r\n * @private\r\n */\r\n _checkGeometry(feature: Feature<Geometry>): boolean {\r\n // Geometry of the layer\r\n const geomTypeLayer =\r\n getActiveLayerToInsertEls().getDescribeFeatureType()._parsed\r\n .geomType;\r\n const geomTypeFeature = feature.getGeometry().getType();\r\n\r\n // This geom accepts every type of geometry\r\n if (geomTypeLayer === GeometryType.GeometryCollection) {\r\n return true;\r\n }\r\n\r\n return geomTypeFeature === geomTypeLayer;\r\n }\r\n\r\n /**\r\n * Confirm modal before transact to the GeoServer the features in the file\r\n *\r\n * @param content\r\n * @param featuresToInsert\r\n * @private\r\n */\r\n _initModal(\r\n content: string,\r\n featuresToInsert: Array<Feature<Geometry>>\r\n ): void {\r\n const footer = `\r\n <button type=\"button\" class=\"btn btn-sm btn-secondary\" data-dismiss=\"modal\">\r\n ${I18N.labels.cancel}\r\n </button>\r\n <button type=\"button\" class=\"btn btn-sm btn-primary\" data-action=\"save\" data-dismiss=\"modal\">\r\n ${I18N.labels.upload}\r\n </button>\r\n `;\r\n\r\n const modal = new Modal({\r\n ...this._options.modal,\r\n header: true,\r\n headerClose: false,\r\n title:\r\n I18N.labels.uploadFeatures +\r\n ' ' +\r\n getActiveLayerToInsertEls().get(BaseLayerProperty.NAME),\r\n content: content,\r\n backdrop: 'static', // Prevent close on click outside the modal\r\n footer: footer\r\n }).show();\r\n\r\n modal.on('dismiss', (modal, event) => {\r\n // On saving changes\r\n if (event.target.dataset.action === 'save') {\r\n this.dispatchEvent(\r\n new VectorSourceEvent(\r\n 'addedFeatures',\r\n null,\r\n featuresToInsert\r\n )\r\n );\r\n } else {\r\n // On cancel button\r\n getEditLayer().getSource().clear();\r\n }\r\n });\r\n }\r\n}\r\n","/**\r\n * @param target\r\n * @param sources\r\n * @returns\r\n */\r\nexport const deepObjectAssign = (target, ...sources) => {\r\n sources.forEach((source) => {\r\n Object.keys(source).forEach((key) => {\r\n const s_val = source[key];\r\n const t_val = target[key];\r\n target[key] =\r\n t_val &&\r\n s_val &&\r\n typeof t_val === 'object' &&\r\n typeof s_val === 'object' &&\r\n !Array.isArray(t_val) // Don't merge arrays\r\n ? deepObjectAssign(t_val, s_val)\r\n : s_val;\r\n });\r\n });\r\n return target;\r\n};\r\n","import Feature from 'ol/Feature.js';\r\nimport Geometry from 'ol/geom/Geometry.js';\r\nimport Control from 'ol/control/Control.js';\r\nimport { VectorSourceEvent } from 'ol/source/Vector.js';\r\nimport { CombinedOnSignature, EventTypes, OnSignature } from 'ol/Observable.js';\r\nimport BaseEvent from 'ol/events/Event.js';\r\nimport { EventsKey } from 'ol/events.js';\r\nimport { ObjectEvent } from 'ol/Object.js';\r\nimport { Types as ObjectEventTypes } from 'ol/ObjectEventType.js';\r\n\r\nimport { I18N, I18N_ } from './i18n';\r\n\r\ntype ChangesEventTypes = 'cancel' | 'apply' | 'delete';\r\n\r\nexport default class EditControlChangesEl extends Control {\r\n declare on: OnSignature<EventTypes, BaseEvent, EventsKey> &\r\n OnSignature<ChangesEventTypes, VectorSourceEvent, EventsKey> &\r\n OnSignature<ObjectEventTypes, ObjectEvent, EventsKey> &\r\n CombinedOnSignature<\r\n ChangesEventTypes | ObjectEventTypes | EventTypes,\r\n EventsKey\r\n >;\r\n\r\n declare once: OnSignature<EventTypes, BaseEvent, EventsKey> &\r\n OnSignature<ChangesEventTypes, VectorSourceEvent, EventsKey> &\r\n OnSignature<ObjectEventTypes, ObjectEvent, EventsKey> &\r\n CombinedOnSignature<\r\n ChangesEventTypes | ObjectEventTypes | EventTypes,\r\n EventsKey\r\n >;\r\n\r\n declare un: OnSignature<EventTypes, BaseEvent, void> &\r\n OnSignature<ChangesEventTypes, VectorSourceEvent, EventsKey> &\r\n OnSignature<ObjectEventTypes, ObjectEvent, void> &\r\n CombinedOnSignature<\r\n ChangesEventTypes | ObjectEventTypes | EventTypes,\r\n void\r\n >;\r\n\r\n constructor(features: Feature<Geometry>[]) {\r\n super({\r\n element: (\r\n <div className=\"ol-wfst--changes-control\">\r\n <div className=\"ol-wfst--changes-control-el\">\r\n <div className=\"ol-wfst--changes-control-id\">\r\n <b>{I18N.labels.editMode}</b> -{' '}\r\n <i>\r\n {features.length > 1\r\n ? I18N_('editElements', features.length)\r\n : String(features[0].getId())}\r\n </i>\r\n </div>\r\n <button\r\n type=\"button\"\r\n className=\"btn btn-sm btn-danger\"\r\n onClick={() => {\r\n this._dispatch('delete', features);\r\n }}\r\n >\r\n {I18N.labels.delete}\r\n </button>\r\n <button\r\n type=\"button\"\r\n className=\"btn btn-sm btn-secondary\"\r\n onClick={() => {\r\n this._dispatch('cancel', features);\r\n }}\r\n >\r\n {I18N.labels.cancel}\r\n </button>\r\n <button\r\n type=\"button\"\r\n className=\"btn btn-sm btn-primary\"\r\n onClick={() => {\r\n this._dispatch('apply', features);\r\n }}\r\n >\r\n {I18N.labels.save}\r\n </button>\r\n </div>\r\n </div>\r\n )\r\n });\r\n }\r\n\r\n private _dispatch(\r\n type: ChangesEventTypes,\r\n features: Feature<Geometry>[]\r\n ): void {\r\n const evt = new VectorSourceEvent(type, features[0]);\r\n (evt as any).features = features;\r\n this.dispatchEvent(evt);\r\n }\r\n}\r\n","// Ol\r\nimport {\r\n Geometry,\r\n GeometryCollection,\r\n LineString,\r\n MultiLineString,\r\n MultiPoint,\r\n MultiPolygon,\r\n Polygon\r\n} from 'ol/geom.js';\r\nimport { Circle as CircleStyle, Fill, Stroke, Style } from 'ol/style.js';\r\nimport Feature, { FeatureLike } from 'ol/Feature.js';\r\nimport { Coordinate } from 'ol/coordinate.js';\r\n\r\nimport { GeometryType } from '../@enums';\r\nimport { getMode, Modes } from './state';\r\n\r\n/**\r\n * Modern vertex handle mimicking the round \"extend line\" buttons shown at\r\n * line endpoints: a soft halo for depth and a white disc with a subtle\r\n * border. When `highlighted` is `true` (e.g. hovering a vertex with the\r\n * Modify interaction) the handle gets bigger with a stronger halo and a\r\n * darker border.\r\n *\r\n * @param highlighted Whether to render the bigger/highlighted state\r\n * @param geometry Style geometry function to position the handles\r\n * @private\r\n */\r\nexport const editVertexStyles = (\r\n highlighted = false,\r\n geometry?: (feature: FeatureLike) => Geometry\r\n): Array<Style> => {\r\n const halo = highlighted ? 10 : 8;\r\n const haloColor = highlighted\r\n ? 'rgba(0, 0, 0, 0.40)'\r\n : 'rgba(0, 0, 0, 0.28)';\r\n\r\n const radius = highlighted ? 7 : 6;\r\n const border = highlighted ? '#4b5563' : '#b3b3b3';\r\n const borderWidth = highlighted ? 2 : 1.5;\r\n\r\n return [\r\n new Style({\r\n image: new CircleStyle({\r\n radius: halo,\r\n fill: new Fill({\r\n color: haloColor\r\n })\r\n }),\r\n ...(geometry ? { geometry } : {})\r\n }),\r\n new Style({\r\n image: new CircleStyle({\r\n radius: radius,\r\n fill: new Fill({\r\n color: '#ffffff'\r\n }),\r\n stroke: new Stroke({\r\n width: borderWidth,\r\n color: border\r\n })\r\n }),\r\n ...(geometry ? { geometry } : {})\r\n })\r\n ];\r\n};\r\n\r\n/**\r\n * Extract a `MultiPoint` with every vertex of the given feature geometry\r\n * (polygons and multi-line strings are flattened). Returns `undefined` when\r\n * the geometry has no coordinates.\r\n *\r\n * @param feature\r\n * @private\r\n */\r\nexport const getFeatureVertices = (\r\n feature: FeatureLike\r\n): MultiPoint | undefined => {\r\n let geometry = feature.getGeometry();\r\n\r\n if (geometry instanceof GeometryCollection) {\r\n geometry = geometry.getGeometries()[0];\r\n }\r\n\r\n const coordinates = (geometry as LineString).getCoordinates();\r\n let flatCoordinates: Coordinate[] | number[] = null;\r\n\r\n if (geometry instanceof Polygon || geometry instanceof MultiLineString) {\r\n flatCoordinates = coordinates.flat(1);\r\n } else if (geometry instanceof MultiPolygon) {\r\n flatCoordinates = coordinates.flat(2);\r\n } else {\r\n flatCoordinates = coordinates;\r\n }\r\n\r\n if (!flatCoordinates || !flatCoordinates.length) {\r\n return;\r\n }\r\n\r\n return new MultiPoint(flatCoordinates as Coordinate[]);\r\n};\r\n\r\n/**\r\n * Master style that handles two modes on the Edit Layer:\r\n * - one is the basic, showing only the vertices\r\n * - and the other when modify is active, showing bigger vertices\r\n *\r\n * When `hovered` is `true`, a white/red halo is prepended to highlight the\r\n * feature, indicating it can be selected on click.\r\n *\r\n * @param feature\r\n * @param hovered\r\n * @private\r\n */\r\nexport default function styleFunction(\r\n feature: Feature<Geometry>,\r\n hovered = false\r\n): Array<Style> {\r\n let geometry = feature.getGeometry();\r\n let type = geometry.getType();\r\n\r\n if (geometry instanceof GeometryCollection) {\r\n geometry = geometry.getGeometries()[0];\r\n type = geometry.getType();\r\n }\r\n\r\n const haloStyle = (): Array<Style> => {\r\n return [\r\n new Style({\r\n image: new CircleStyle({\r\n radius: 9,\r\n fill: new Fill({\r\n color: 'rgba(255, 255, 255, 0.9)'\r\n }),\r\n stroke: new Stroke({\r\n color: '#ff0000',\r\n width: 3\r\n })\r\n }),\r\n stroke: new Stroke({\r\n color: 'rgba(255, 255, 255, 0.9)',\r\n width: 8\r\n }),\r\n fill: new Fill({\r\n color: 'rgba(255, 255, 255, 0.9)'\r\n })\r\n })\r\n ];\r\n };\r\n\r\n switch (type) {\r\n case GeometryType.Point:\r\n case GeometryType.MultiPoint:\r\n if (getMode() === Modes.Edit) {\r\n return editVertexStyles();\r\n } else {\r\n return [\r\n ...(hovered ? haloStyle() : []),\r\n new Style({\r\n image: new CircleStyle({\r\n radius: 5,\r\n fill: new Fill({\r\n color: '#ff0000'\r\n })\r\n })\r\n }),\r\n new Style({\r\n image: new CircleStyle({\r\n radius: 2,\r\n fill: new Fill({\r\n color: '#000000'\r\n })\r\n })\r\n })\r\n ];\r\n }\r\n default:\r\n // If editing mode is active, show bigger vertex\r\n if (getMode() == Modes.Draw || getMode() == Modes.Edit) {\r\n return [\r\n new Style({\r\n stroke: new Stroke({\r\n color: 'rgba( 255, 0, 0, 1)',\r\n width: 4\r\n }),\r\n fill: new Fill({\r\n color: 'rgba(255, 0, 0, 0.7)'\r\n })\r\n }),\r\n ...editVertexStyles(false, getFeatureVertices),\r\n new Style({\r\n stroke: new Stroke({\r\n color: 'rgba(255, 255, 255, 0.7)',\r\n width: 2\r\n })\r\n })\r\n ];\r\n } else {\r\n return [\r\n ...(hovered ? haloStyle() : []),\r\n new Style({\r\n image: new CircleStyle({\r\n radius: 2,\r\n fill: new Fill({\r\n color: '#000000'\r\n })\r\n }),\r\n geometry: (feature) => getFeatureVertices(feature)\r\n }),\r\n new Style({\r\n stroke: new Stroke({\r\n color: '#ff0000',\r\n width: 4\r\n }),\r\n fill: new Fill({\r\n color: 'rgba(255, 0, 0, 0.7)'\r\n })\r\n })\r\n ];\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Style used to highlight a feature after a query, drawn on a dedicated\r\n * highlight layer so the source layers keep their own rendering.\r\n *\r\n * @param feature\r\n * @private\r\n */\r\nexport function queryStyleFunction(_feature: Feature<Geometry>): Array<Style> {\r\n return [\r\n new Style({\r\n image: new CircleStyle({\r\n radius: 6,\r\n fill: new Fill({\r\n color: 'rgba(0, 170, 255, 0.4)'\r\n }),\r\n stroke: new Stroke({\r\n color: '#0066cc',\r\n width: 2\r\n })\r\n }),\r\n stroke: new Stroke({\r\n color: '#00aaff',\r\n width: 4\r\n }),\r\n fill: new Fill({\r\n color: 'rgba(0, 170, 255, 0.3)'\r\n })\r\n })\r\n ];\r\n}\r\n","// Ol\r\nimport Observable from 'ol/Observable.js';\r\nimport Feature from 'ol/Feature.js';\r\nimport Geometry from 'ol/geom/Geometry.js';\r\nimport GeometryCollection from 'ol/geom/GeometryCollection.js';\r\nimport { VectorSourceEvent } from 'ol/source/Vector.js';\r\n\r\n// External\r\nimport Modal from 'modal-vanilla';\r\n\r\nimport { addFeatureToEditedList, getStoredLayer } from './state';\r\nimport { Options } from '../ol-wfst';\r\nimport { I18N, I18N_ } from './i18n';\r\nimport { IProperty } from '../@types';\r\n\r\n// Images\r\nimport tableSvg from '../assets/images/table.svg';\r\nimport formSvg from '../assets/images/form.svg';\r\n\r\n/**\r\n * Shows a fields form in a modal window to allow changes in the properties of\r\n * one or several features. When editing multiple features, a \"table mode\"\r\n * button renders one feature per row, spreadsheet-style, so each feature can be\r\n * edited separately (like an Excel sheet). Otherwise a single form is shown\r\n * where fields whose value differs across the selection show the \"multiple\r\n * values\" placeholder and only the fields actually changed are applied to the\r\n * whole selection.\r\n *\r\n * @param features\r\n * @private\r\n */\r\nexport class EditFieldsModal extends Observable {\r\n protected _options: Options;\r\n protected _modal: Modal;\r\n protected _features: Feature[];\r\n protected _tableMode: boolean;\r\n protected _fieldList: IProperty[];\r\n protected _layer: ReturnType<typeof getStoredLayer>;\r\n\r\n constructor(options: Options) {\r\n super();\r\n\r\n this._options = options;\r\n this._tableMode = false;\r\n this._fieldList = [];\r\n\r\n this._modal = new Modal({\r\n ...this._options.modal,\r\n header: true,\r\n headerClose: true,\r\n title: '',\r\n content: '<div></div>',\r\n footer: `\r\n <button\r\n type=\"button\"\r\n class=\"btn btn-sm btn-danger\"\r\n data-action=\"delete\"\r\n data-dismiss=\"modal\"\r\n >\r\n ${I18N.labels.delete}\r\n </button>\r\n <button\r\n type=\"button\"\r\n class=\"btn btn-sm btn-secondary\"\r\n data-dismiss=\"modal\"\r\n >\r\n ${I18N.labels.cancel}\r\n </button>\r\n <button\r\n type=\"button\"\r\n class=\"btn btn-sm btn-primary\"\r\n data-action=\"save\"\r\n data-dismiss=\"modal\"\r\n >\r\n ${I18N.labels.save}\r\n </button>\r\n `\r\n });\r\n\r\n this._modal.on('dismiss', (modal, event) => {\r\n // On saving changes\r\n if (event.target.dataset.action === 'save') {\r\n if (this._tableMode) {\r\n this._saveTable(modal);\r\n } else {\r\n this._saveForm(modal);\r\n }\r\n\r\n this._dispatch('save', this._features);\r\n } else if (event.target.dataset.action === 'delete') {\r\n this._dispatch('delete', this._features);\r\n }\r\n });\r\n }\r\n\r\n show(features: Feature<Geometry> | Feature<Geometry>[]) {\r\n this._features = Array.isArray(features) ? features : [features];\r\n\r\n // Keep the form (current behavior) as default entry view\r\n this._tableMode = false;\r\n\r\n const multiple = this._features.length > 1;\r\n\r\n const modalTitle = multiple\r\n ? I18N_('editElements', this._features.length)\r\n : `${I18N.labels.editElement} ${this._features[0].getId()} `;\r\n\r\n const layerName = this._features[0].get('_layerName_');\r\n\r\n // Data schema from the geoserver\r\n const layer = getStoredLayer(layerName);\r\n const describeFeatureType = layer.getDescribeFeatureType()._parsed;\r\n\r\n this._fieldList = describeFeatureType.properties.filter(\r\n (field) => field.name !== describeFeatureType.geomField\r\n );\r\n\r\n this._layer = layer;\r\n\r\n this._modal._html.dialog.classList.remove('ol-wfst--edit-table-modal');\r\n\r\n this._renderBody();\r\n this._modal._html.header.innerHTML = modalTitle;\r\n this._modal.show();\r\n }\r\n\r\n protected _renderBody(): void {\r\n const multiple = this._features.length > 1;\r\n\r\n this._modal._html.body.innerHTML = '';\r\n this._modal._html.body.append(\r\n <div>\r\n {multiple && (\r\n <div className=\"ol-wfst--edit-modal-notice\">\r\n <span className=\"ol-wfst--edit-modal-notice-txt\">\r\n {I18N_('multipleEditNotice', this._features.length)}\r\n </span>\r\n <button\r\n type=\"button\"\r\n className=\"ol-wfst--edit-modal-toolbar-btn\"\r\n title={\r\n this._tableMode\r\n ? I18N.labels.formMode\r\n : I18N.labels.tableMode\r\n }\r\n onClick={() => this._toggleTable()}\r\n >\r\n {this._tableMode ? formSvg() : tableSvg()}\r\n </button>\r\n </div>\r\n )}\r\n {this._tableMode ? this._renderTable() : this._renderForm()}\r\n </div>\r\n );\r\n }\r\n\r\n protected _toggleTable(): void {\r\n this._tableMode = !this._tableMode;\r\n this._modal._html.dialog.classList.toggle(\r\n 'ol-wfst--edit-table-modal',\r\n this._tableMode\r\n );\r\n this._renderBody();\r\n }\r\n\r\n protected _renderForm(): HTMLElement {\r\n const multiple = this._features.length > 1;\r\n\r\n return (\r\n <form autocomplete=\"false\">\r\n {this._fieldList.flatMap((field) => {\r\n const key = field.name;\r\n\r\n const values = this._features.map((feature) =>\r\n feature.get(key)\r\n );\r\n const uniqueValues = Array.from(\r\n new Set(values.map((value) => String(value ?? '')))\r\n );\r\n const hasMultipleValues =\r\n multiple && uniqueValues.length > 1;\r\n\r\n const value = hasMultipleValues\r\n ? null\r\n : uniqueValues[0] || null;\r\n\r\n const type = this._inputType(field.type);\r\n\r\n let input: HTMLElement = (\r\n <input\r\n placeholder={\r\n hasMultipleValues\r\n ? I18N.labels.multipleValues\r\n : 'NULL'\r\n }\r\n className={\r\n 'ol-wfst--input-field-input' +\r\n (hasMultipleValues\r\n ? ' ol-wfst--input-multiple'\r\n : '')\r\n }\r\n type={type}\r\n name={key}\r\n value={value}\r\n data-multiple={hasMultipleValues ? 'true' : null}\r\n />\r\n );\r\n\r\n if (this._layer.beforeShowFieldsModal) {\r\n const hookInput = this._layer.beforeShowFieldsModal(\r\n field,\r\n value,\r\n input\r\n );\r\n\r\n if (!hookInput) {\r\n return [];\r\n }\r\n\r\n if (typeof hookInput === 'string') {\r\n input = new DOMParser().parseFromString(\r\n hookInput,\r\n 'text/html'\r\n ).body.childNodes[0] as HTMLElement;\r\n } else {\r\n input = hookInput;\r\n }\r\n }\r\n\r\n if (hasMultipleValues) {\r\n input.dataset.multiple = 'true';\r\n input.classList.add('ol-wfst--input-multiple');\r\n }\r\n\r\n return (\r\n <div className=\"ol-wfst--input-field-container\">\r\n <label\r\n className=\"ol-wfst--input-field-label\"\r\n htmlFor={key}\r\n >\r\n {key}\r\n </label>\r\n {input}\r\n </div>\r\n );\r\n })}\r\n </form>\r\n );\r\n }\r\n\r\n protected _renderTable(): HTMLElement {\r\n return (\r\n <form autocomplete=\"false\">\r\n <div className=\"ol-wfst--edit-table-wrap\">\r\n <table className=\"ol-wfst--edit-table\">\r\n <thead>\r\n <tr>\r\n <th>{I18N.labels.feature}</th>\r\n <th>{I18N.labels.geometry}</th>\r\n {this._fieldList.map((field) => (\r\n <th>{field.name}</th>\r\n ))}\r\n </tr>\r\n </thead>\r\n <tbody>\r\n {this._features.map((feature, idx) => (\r\n <tr>\r\n <td className=\"ol-wfst--edit-table-fid\">\r\n {String(feature.getId() ?? idx + 1)}\r\n </td>\r\n <td className=\"ol-wfst--edit-table-geom\">\r\n {geometryTypeLabel(\r\n feature.getGeometry()\r\n )}\r\n </td>\r\n {this._fieldList.map((field) => {\r\n const key = field.name;\r\n const type = this._inputType(\r\n field.type\r\n );\r\n const value = feature.get(key) ?? '';\r\n\r\n let input: HTMLElement = (\r\n <input\r\n type={type}\r\n name={key}\r\n className=\"ol-wfst--input-field-input\"\r\n data-feat-idx={String(idx)}\r\n value={String(value)}\r\n />\r\n );\r\n\r\n if (this._layer.beforeShowFieldsModal) {\r\n const hookInput =\r\n this._layer.beforeShowFieldsModal(\r\n field,\r\n value,\r\n input\r\n );\r\n\r\n if (!hookInput) {\r\n return <td />;\r\n }\r\n\r\n if (typeof hookInput === 'string') {\r\n input =\r\n new DOMParser().parseFromString(\r\n hookInput,\r\n 'text/html'\r\n ).body\r\n .childNodes[0] as HTMLElement;\r\n } else {\r\n input = hookInput;\r\n }\r\n\r\n input.setAttribute('name', key);\r\n input.setAttribute(\r\n 'data-feat-idx',\r\n String(idx)\r\n );\r\n input.classList.add(\r\n 'ol-wfst--input-field-input'\r\n );\r\n }\r\n\r\n return <td>{input}</td>;\r\n })}\r\n </tr>\r\n ))}\r\n </tbody>\r\n </table>\r\n </div>\r\n </form>\r\n );\r\n }\r\n\r\n protected _inputType(typeXsd: string): string {\r\n switch (typeXsd) {\r\n case 'xsd:double':\r\n case 'xsd:number':\r\n case 'xsd:int':\r\n return 'number';\r\n case 'xsd:date':\r\n return 'date';\r\n case 'xsd:date-time':\r\n return 'datetime';\r\n case 'xsd:string':\r\n default:\r\n return 'text';\r\n }\r\n }\r\n\r\n private _saveForm(modal: Modal): void {\r\n const formElements = modal.el.querySelector('form')\r\n .elements as HTMLFormElement[];\r\n\r\n const multipleFields = new Set(\r\n Array.from(formElements)\r\n .filter((el) => el.dataset.multiple === 'true')\r\n .map((el) => el.name)\r\n );\r\n\r\n Array.from(formElements).forEach((el) => {\r\n const value = el.value;\r\n const field = el.name;\r\n\r\n // Do not overwrite untouched fields that had\r\n // multiple values in the selection\r\n if (multipleFields.has(field) && value === '') {\r\n return;\r\n }\r\n\r\n this._features.forEach((feature) => {\r\n if (feature.get(field) !== value) {\r\n feature.set(field, value, /* isSilent = */ true);\r\n }\r\n });\r\n });\r\n\r\n this._features.forEach((feature) => {\r\n feature.changed();\r\n addFeatureToEditedList(feature);\r\n });\r\n }\r\n\r\n private _saveTable(modal: Modal): void {\r\n const inputList = Array.from(\r\n modal.el.querySelectorAll('form input[data-feat-idx]')\r\n ) as HTMLInputElement[];\r\n\r\n const grouped = new Map<number, HTMLInputElement[]>();\r\n\r\n inputList.forEach((input) => {\r\n const idx = Number(input.dataset.featIdx);\r\n\r\n if (!grouped.has(idx)) {\r\n grouped.set(idx, []);\r\n }\r\n\r\n grouped.get(idx).push(input);\r\n });\r\n\r\n grouped.forEach((inputs, idx) => {\r\n const feature = this._features[idx];\r\n\r\n if (!feature) {\r\n return;\r\n }\r\n\r\n inputs.forEach((input) => {\r\n const field = input.name;\r\n const value = input.value;\r\n\r\n if (feature.get(field) !== value) {\r\n feature.set(field, value, /* isSilent = */ true);\r\n }\r\n });\r\n });\r\n\r\n this._features.forEach((feature) => {\r\n feature.changed();\r\n addFeatureToEditedList(feature);\r\n });\r\n }\r\n\r\n private _dispatch(\r\n type: 'save' | 'delete',\r\n features: Feature<Geometry>[]\r\n ): void {\r\n const evt = new VectorSourceEvent(type, features[0]);\r\n (evt as any).features = features;\r\n this.dispatchEvent(evt);\r\n }\r\n}\r\n\r\nfunction geometryTypeLabel(geometry: Geometry | undefined): string {\r\n if (!geometry) {\r\n return '-';\r\n }\r\n\r\n if (geometry instanceof GeometryCollection) {\r\n const types = new Set<string>();\r\n\r\n const collect = (geom: Geometry): void => {\r\n if (geom instanceof GeometryCollection) {\r\n geom.getGeometriesArray().forEach(collect);\r\n } else {\r\n types.add(geom.getType());\r\n }\r\n };\r\n\r\n collect(geometry);\r\n\r\n return types.size ? Array.from(types).join(', ') : '-';\r\n }\r\n\r\n return geometry.getType();\r\n}\r\n","/**\n * @module ol/format/WFSCapabilities\n */\nimport XML from 'ol/format/XML.js';\nimport {\n getAllTextContent,\n makeArrayPusher,\n makeObjectPropertyPusher,\n makeObjectPropertySetter,\n makeStructureNS,\n pushParseAndPop,\n} from 'ol/xml.js';\nimport {readHref} from 'ol/format/xlink.js';\nimport {readString} from 'ol/format/xsd.js';\n\n/**\n * @const\n * @type {Array<null|string>}\n */\nconst NAMESPACE_URIS = [\n null,\n 'http://www.opengis.net/fes/2.0',\n 'http://www.opengis.net/ows/1.1',\n 'http://www.opengis.net/wfs/2.0',\n];\n\n/**\n * @const\n * @type {Object<string, Object<string, import(\"ol/xml.js\").Parser>>}\n */\n// @ts-ignore\nconst PARSERS = makeStructureNS(NAMESPACE_URIS, {\n 'ServiceIdentification': makeObjectPropertySetter(readServiceIdentification),\n 'ServiceProvider': makeObjectPropertySetter(readServiceProvider),\n 'OperationsMetadata': makeObjectPropertySetter(readOperationsMetadata),\n 'FeatureTypeList': makeObjectPropertySetter(readFeatureTypeList),\n 'Filter_Capabilities': makeObjectPropertySetter(readFilter_Capabilities),\n});\n\n/**\n * @classdesc\n * Format for reading WFS capabilities data\n *\n * @api\n */\nclass WFSCapabilities extends XML {\n constructor() {\n super();\n\n /**\n * @type {string|undefined}\n */\n this.version = undefined;\n }\n\n /**\n * @param {Element} node Node.\n * @return {Object} Object\n */\n readFromNode(node) {\n this.version = node.getAttribute('version').trim();\n const wfsCapabilityObject = pushParseAndPop(\n {\n 'version': this.version,\n },\n PARSERS,\n node,\n []\n );\n return wfsCapabilityObject ? wfsCapabilityObject : null;\n }\n}\n\n/**\n * @const\n * @type {Object<string, Object<string, import(\"ol/xml.js\").Parser>>}\n */\n// @ts-ignore\nconst SERVICE_IDENTIFICATION_PARSERS = makeStructureNS(NAMESPACE_URIS, {\n 'Title': makeObjectPropertySetter(readString),\n 'Abstract': makeObjectPropertySetter(readString),\n 'Keywords': makeObjectPropertySetter(readKeywordList),\n 'ServiceType': makeObjectPropertySetter(readString),\n 'ServiceTypeVersion': makeObjectPropertySetter(readString),\n 'Fees': makeObjectPropertySetter(readString),\n 'AccessConstraints': makeObjectPropertySetter(readString),\n});\n\n/**\n * @const\n * @type {Object<string, Object<string, import(\"ol/xml.js\").Parser>>}\n */\n// @ts-ignore\nconst SERVICE_PROVIDER_PARSERS = makeStructureNS(NAMESPACE_URIS, {\n 'ProviderName': makeObjectPropertySetter(readString),\n 'ServiceContact': makeObjectPropertySetter(readServiceContact),\n});\n\n/**\n * @const\n * @type {Object<string, Object<string, import(\"ol/xml.js\").Parser>>}\n */\n// @ts-ignore\nconst OPERATIONS_METADATA_PARSERS = makeStructureNS(NAMESPACE_URIS, {\n 'Operation': makeObjectPropertyPusher(readNamedOperation),\n 'Constraint': makeObjectPropertyPusher(readNamedConstraint),\n});\n\n/**\n * @const\n * @type {Object<string, Object<string, import(\"ol/xml.js\").Parser>>}\n */\n// @ts-ignore\nconst SERVICE_CONTACT_PARSERS = makeStructureNS(NAMESPACE_URIS, {\n 'IndividualName': makeObjectPropertySetter(readString),\n 'PositionName': makeObjectPropertySetter(readString),\n 'ContactInfo': makeObjectPropertySetter(readContactInfo),\n});\n\n/**\n * @const\n * @type {Object<string, Object<string, import(\"ol/xml.js\").Parser>>}\n */\n// @ts-ignore\nconst CONTACT_INFO_PARSERS = makeStructureNS(NAMESPACE_URIS, {\n 'Phone': makeObjectPropertySetter(readPhone),\n 'Address': makeObjectPropertySetter(readAddress),\n});\n\n/**\n * @const\n * @type {Object<string, Object<string, import(\"ol/xml.js\").Parser>>}\n */\n// @ts-ignore\nconst PHONE_PARSERS = makeStructureNS(NAMESPACE_URIS, {\n 'Voice': makeObjectPropertySetter(readString),\n 'Facsimile': makeObjectPropertySetter(readString),\n});\n\n/**\n * @const\n * @type {Object<string, Object<string, import(\"ol/xml.js\").Parser>>}\n */\n// @ts-ignore\nconst ADDRESS_PARSERS = makeStructureNS(NAMESPACE_URIS, {\n 'DeliveryPoint': makeObjectPropertySetter(readString),\n 'City': makeObjectPropertySetter(readString),\n 'AdministrativeArea': makeObjectPropertySetter(readString),\n 'PostalCode': makeObjectPropertySetter(readString),\n 'Country': makeObjectPropertySetter(readString),\n 'ElectronicMailAddress': makeObjectPropertySetter(readString),\n});\n\n/**\n * @const\n * @type {Object<string, Object<string, import(\"ol/xml.js\").Parser>>}\n */\n// @ts-ignore\nconst FEATURE_TYPE_LIST_PARSERS = makeStructureNS(NAMESPACE_URIS, {\n 'FeatureType': makeArrayPusher(readFeatureType),\n});\n\n/**\n * @const\n * @type {Object<string, Object<string, import(\"ol/xml.js\").Parser>>}\n */\n// @ts-ignore\nconst FEATURE_TYPE_PARSERS = makeStructureNS(NAMESPACE_URIS, {\n 'Name': makeObjectPropertySetter(readString),\n 'Title': makeObjectPropertySetter(readString),\n 'Abstract': makeObjectPropertySetter(readString),\n 'Keywords': makeObjectPropertySetter(readKeywordList),\n 'DefaultCRS': makeObjectPropertySetter(readString),\n 'WGS84BoundingBox': makeObjectPropertySetter(readWGS84BoundingBox),\n 'MetadataURL': makeObjectPropertySetter(readHref),\n});\n\n/**\n * @const\n * @type {Object<string, Object<string, import(\"ol/xml.js\").Parser>>}\n */\n// @ts-ignore\nconst OPERATION_PARSERS = makeStructureNS(NAMESPACE_URIS, {\n 'DCP': makeObjectPropertySetter(readDCP),\n 'Parameter': makeObjectPropertyPusher(readNamedParameter),\n});\n\n/**\n * @const\n * @type {Object<string, Object<string, import(\"ol/xml.js\").Parser>>}\n */\n// @ts-ignore\nconst PARAMETER_PARSERS = makeStructureNS(NAMESPACE_URIS, {\n 'AllowedValues': makeObjectPropertySetter(readValueList),\n});\n\n/**\n * @const\n * @type {Object<string, Object<string, import(\"ol/xml.js\").Parser>>}\n */\n// @ts-ignore\nconst CONSTRAINT_PARSERS = makeStructureNS(NAMESPACE_URIS, {\n 'NoValues': makeObjectPropertySetter(readString),\n 'DefaultValue': makeObjectPropertySetter(readString),\n 'AllowedValues': makeObjectPropertySetter(readValueList),\n});\n\n/**\n * @const\n * @type {Object<string, Object<string, import(\"ol/xml.js\").Parser>>}\n */\n// @ts-ignore\nconst HTTP_PARSERS = makeStructureNS(NAMESPACE_URIS, {\n 'Get': makeObjectPropertySetter(readHref),\n 'Post': makeObjectPropertySetter(readHref),\n});\n\n/**\n * @const\n * @type {Object<string, Object<string, import(\"ol/xml.js\").Parser>>}\n */\n// @ts-ignore\nconst WGS84_BOUNDINGBOX_PARSERS = makeStructureNS(NAMESPACE_URIS, {\n 'LowerCorner': makeObjectPropertySetter(readStringCoords),\n 'UpperCorner': makeObjectPropertySetter(readStringCoords),\n});\n\n/**\n * @const\n * @type {Object<string, Object<string, import(\"ol/xml.js\").Parser>>}\n */\n// @ts-ignore\nconst DCP_PARSERS = makeStructureNS(NAMESPACE_URIS, {\n 'HTTP': makeObjectPropertySetter(readHTTP),\n});\n\n/**\n * @const\n * @type {Object<string, Object<string, import(\"ol/xml.js\").Parser>>}\n */\n// @ts-ignore\nconst KEYWORDLIST_PARSERS = makeStructureNS(NAMESPACE_URIS, {\n 'Keyword': makeArrayPusher(readString),\n});\n\n/**\n * @const\n * @type {Object<string, Object<string, import(\"ol/xml.js\").Parser>>}\n */\n// @ts-ignore\nconst VALUELIST_PARSERS = makeStructureNS(NAMESPACE_URIS, {\n 'Value': makeArrayPusher(readString),\n});\n\n/**\n * @const\n * @type {Object<string, Object<string, import(\"ol/xml.js\").Parser>>}\n */\n// @ts-ignore\nconst FILTER_CAPABILITIES_PARSERS = makeStructureNS(NAMESPACE_URIS, {\n 'Conformance': makeObjectPropertySetter(readConformance),\n 'Id_Capabilities': makeObjectPropertySetter(readId_Capabilities),\n 'Scalar_Capabilities': makeObjectPropertySetter(readScalarCapabilities),\n 'Spatial_Capabilities': makeObjectPropertySetter(readSpatialCapabilities),\n 'Temporal_Capabilities': makeObjectPropertySetter(readTemporalCapabilities),\n 'Functions': makeObjectPropertySetter(readFunctions),\n});\n\n/**\n * @const\n * @type {Object<string, Object<string, import(\"ol/xml.js\").Parser>>}\n */\n// @ts-ignore\nconst CONFORMANCE_PARSERS = makeStructureNS(NAMESPACE_URIS, {\n 'Constraint': makeObjectPropertyPusher(readNamedConstraint),\n});\n\n/**\n * @const\n * @type {Object<string, Object<string, import(\"ol/xml.js\").Parser>>}\n */\n// @ts-ignore\nconst ID_CAPABILITIES_PARSERS = makeStructureNS(NAMESPACE_URIS, {\n 'ResourceIdentifier': makeObjectPropertySetter(readNamedResourceIdentifier),\n});\n\n/**\n * @const\n * @type {Object<string, Object<string, import(\"ol/xml.js\").Parser>>}\n */\n// @ts-ignore\nconst SCALAR_CAPABILITIES_PARSERS = makeStructureNS(NAMESPACE_URIS, {\n 'LogicalOperators': makeObjectPropertySetter(readLogicalOperators),\n 'ComparisonOperators': makeObjectPropertySetter(readComparisonOperators),\n});\n\n/**\n * @const\n * @type {Object<string, Object<string, import(\"ol/xml.js\").Parser>>}\n */\n// @ts-ignore\nconst SPATIAL_CAPABILITIES_PARSERS = makeStructureNS(NAMESPACE_URIS, {\n 'GeometryOperands': makeObjectPropertySetter(readGeometryOperands),\n 'SpatialOperators': makeObjectPropertySetter(readSpatialOperators),\n});\n\n/**\n * @const\n * @type {Object<string, Object<string, import(\"ol/xml.js\").Parser>>}\n */\n// @ts-ignore\nconst TEMPORAL_CAPABILITIES_PARSERS = makeStructureNS(NAMESPACE_URIS, {\n 'TemporalOperands': makeObjectPropertySetter(readTemporalOperands),\n 'TemporalOperators': makeObjectPropertySetter(readTemporalOperators),\n});\n\n/**\n * @const\n * @type {Object<string, Object<string, import(\"ol/xml.js\").Parser>>}\n */\n// @ts-ignore\nconst FUNCTIONS_PARSERS = makeStructureNS(NAMESPACE_URIS, {\n 'Function': makeArrayPusher(readNamedFunction),\n});\n\n/**\n * @const\n * @type {Object<string, Object<string, import(\"ol/xml.js\").Parser>>}\n */\n// @ts-ignore\nconst FUNCTION_PARSERS = makeStructureNS(NAMESPACE_URIS, {\n 'Returns': makeObjectPropertySetter(readString),\n 'Arguments': makeObjectPropertySetter(readArguments),\n});\n\n/**\n * @const\n * @type {Object<string, Object<string, import(\"ol/xml.js\").Parser>>}\n */\n// @ts-ignore\nconst ARGUMENTS_PARSERS = makeStructureNS(NAMESPACE_URIS, {\n 'Argument': makeArrayPusher(readNamedArgument),\n});\n\n/**\n * @const\n * @type {Object<string, Object<string, import(\"ol/xml.js\").Parser>>}\n */\n// @ts-ignore\nconst ARGUMENT_PARSERS = makeStructureNS(NAMESPACE_URIS, {\n 'Type': makeObjectPropertySetter(readString),\n});\n\n/**\n * @const\n * @type {Object<string, Object<string, import(\"ol/xml.js\").Parser>>}\n */\n// @ts-ignore\nconst LOGICAL_OPERATORS_PARSERS = makeStructureNS(NAMESPACE_URIS, {\n 'LogicalOperator': makeArrayPusher(readNamedOnly),\n});\n\n/**\n * @const\n * @type {Object<string, Object<string, import(\"ol/xml.js\").Parser>>}\n */\n// @ts-ignore\nconst COMPARISON_OPERATORS_PARSERS = makeStructureNS(NAMESPACE_URIS, {\n 'ComparisonOperator': makeArrayPusher(readNamedOnly),\n});\n\n/**\n * @const\n * @type {Object<string, Object<string, import(\"ol/xml.js\").Parser>>}\n */\n// @ts-ignore\nconst GEOMETRY_OPERANDS_PARSERS = makeStructureNS(NAMESPACE_URIS, {\n 'GeometryOperand': makeArrayPusher(readNamedOnly),\n});\n\n/**\n * @const\n * @type {Object<string, Object<string, import(\"ol/xml.js\").Parser>>}\n */\n// @ts-ignore\nconst SPATIAL_OPERATORS_PARSERS = makeStructureNS(NAMESPACE_URIS, {\n 'SpatialOperator': makeArrayPusher(readNamedOnly),\n});\n\n/**\n * @const\n * @type {Object<string, Object<string, import(\"ol/xml.js\").Parser>>}\n */\n// @ts-ignore\nconst TEMPORAL_OPERANDS_PARSERS = makeStructureNS(NAMESPACE_URIS, {\n 'TemporalOperand': makeArrayPusher(readNamedOnly),\n});\n\n/**\n * @const\n * @type {Object<string, Object<string, import(\"ol/xml.js\").Parser>>}\n */\n// @ts-ignore\nconst TEMPORAL_OPERATORS_PARSERS = makeStructureNS(NAMESPACE_URIS, {\n 'TemporalOperator': makeArrayPusher(readNamedOnly),\n});\n\n/**\n * @param {Element} node Node.\n * @param {Array<*>} objectStack Object stack.\n * @return {Object|undefined} Service Identification object.\n */\nfunction readServiceIdentification(node, objectStack) {\n return pushParseAndPop({}, SERVICE_IDENTIFICATION_PARSERS, node, objectStack);\n}\n\n/**\n * @param {Element} node Node.\n * @param {Array<*>} objectStack Object stack.\n * @return {Object|undefined} Service Provider object.\n */\nfunction readServiceProvider(node, objectStack) {\n return pushParseAndPop({}, SERVICE_PROVIDER_PARSERS, node, objectStack);\n}\n\n/**\n * @param {Element} node Node.\n * @param {Array<*>} objectStack Object stack.\n * @return {Object|undefined} Operations Metadata object.\n */\nfunction readOperationsMetadata(node, objectStack) {\n return pushParseAndPop({}, OPERATIONS_METADATA_PARSERS, node, objectStack);\n}\n\n/**\n * @param {Element} node Node.\n * @param {Array<*>} objectStack Object stack.\n * @return {Object|undefined} FeatureType list.\n */\nfunction readFeatureTypeList(node, objectStack) {\n return pushParseAndPop([], FEATURE_TYPE_LIST_PARSERS, node, objectStack);\n}\n\n/**\n * @param {Element} node Node.\n * @param {Array<*>} objectStack Object stack.\n * @return {Object|undefined} Serrvice contact object.\n */\nfunction readServiceContact(node, objectStack) {\n return pushParseAndPop({}, SERVICE_CONTACT_PARSERS, node, objectStack);\n}\n\n/**\n * @param {Element} node Node.\n * @param {Array<*>} objectStack Object stack.\n * @return {Object|undefined} Contact info object.\n */\nfunction readContactInfo(node, objectStack) {\n return pushParseAndPop({}, CONTACT_INFO_PARSERS, node, objectStack);\n}\n\n/**\n * @param {Element} node Node.\n * @param {Array<*>} objectStack Object stack.\n * @return {Object|undefined} Contact Phone object.\n */\nfunction readPhone(node, objectStack) {\n return pushParseAndPop({}, PHONE_PARSERS, node, objectStack);\n}\n\n/**\n * @param {Element} node Node.\n * @param {Array<*>} objectStack Object stack.\n * @return {Object|undefined} Contact address object.\n */\nfunction readAddress(node, objectStack) {\n return pushParseAndPop({}, ADDRESS_PARSERS, node, objectStack);\n}\n\n/**\n * @param {Element} node Node.\n * @param {Array<*>} objectStack Object stack.\n * @return {Object|undefined} DCP object.\n */\nfunction readDCP(node, objectStack) {\n return pushParseAndPop({}, DCP_PARSERS, node, objectStack);\n}\n\n/**\n * @param {Element} node Node.\n * @param {Array<*>} objectStack Object stack.\n * @return {Object|undefined} Operation object.\n */\nfunction readOperation(node, objectStack) {\n return pushParseAndPop({}, OPERATION_PARSERS, node, objectStack);\n}\n\n/**\n * @param {Element} node Node.\n * @param {Array<*>} objectStack Object stack.\n * @return {Object|undefined} Parameter object.\n */\nfunction readParameter(node, objectStack) {\n return pushParseAndPop({}, PARAMETER_PARSERS, node, objectStack);\n}\n\n/**\n * @param {Element} node Node.\n * @param {Array<*>} objectStack Object stack.\n * @return {Object|undefined} Constraint object.\n */\nfunction readConstraint(node, objectStack) {\n return pushParseAndPop({}, CONSTRAINT_PARSERS, node, objectStack);\n}\n\n/**\n * @param {Element} node Node.\n * @param {Array<*>} objectStack Object stack.\n * @return {Object|undefined} HTTP object.\n */\nfunction readHTTP(node, objectStack) {\n return pushParseAndPop({}, HTTP_PARSERS, node, objectStack);\n}\n\n/**\n * @param {Element} node Node.\n * @param {Array<*>} objectStack Object stack.\n * @return {Object|undefined} Named operation object.\n */\nfunction readNamedOperation(node, objectStack) {\n const operation = readOperation(node, objectStack);\n if (operation) {\n operation['name'] = node.getAttribute('name');\n return operation;\n }\n return undefined;\n}\n\n/**\n * @param {Element} node Node.\n * @param {Array<*>} objectStack Object stack.\n * @return {Object|undefined} Named Function object.\n */\nfunction readNamedFunction(node, objectStack) {\n const func = readFunction(node, objectStack);\n if (func) {\n func['name'] = node.getAttribute('name');\n return func;\n }\n return undefined;\n}\n\n/**\n * @param {Element} node Node.\n * @param {Array<*>} objectStack Object stack.\n * @return {Object|undefined} Named argument object.\n */\nfunction readNamedArgument(node, objectStack) {\n const argument = readArgument(node, objectStack);\n if (argument) {\n argument['name'] = node.getAttribute('name');\n return argument;\n }\n return undefined;\n}\n\n/**\n * @param {Element} node Node.\n * @param {Array<*>} objectStack Object stack.\n * @return {Object|undefined} Named Parameter object.\n */\nfunction readNamedParameter(node, objectStack) {\n const parameter = readParameter(node, objectStack);\n if (parameter) {\n parameter['name'] = node.getAttribute('name');\n return parameter;\n }\n return undefined;\n}\n\n/**\n * @param {Element} node Node.\n * @param {Array<*>} objectStack Object stack.\n * @return {Object|undefined} Named Constraint object.\n */\nfunction readNamedConstraint(node, objectStack) {\n const constraint = readConstraint(node, objectStack);\n if (constraint) {\n constraint['name'] = node.getAttribute('name');\n return constraint;\n }\n return undefined;\n}\n\n/**\n * @param {Element} node Node.\n * @return {string|undefined} Node name attribute string.\n */\nfunction readNamedOnly(node) {\n return node.getAttribute('name') || undefined;\n}\n\n/**\n * @param {Element} node Node.\n * @return {Object|undefined} Named Resource Identifier object.\n */\nfunction readNamedResourceIdentifier(node) {\n return {\n name: node.getAttribute('name'),\n };\n}\n\n/**\n * @param {Element} node Node.\n * @param {Array<*>} objectStack Object stack.\n * @return {Object|undefined} WGS84 BoundingBox resource object.\n */\nfunction readWGS84BoundingBox(node, objectStack) {\n return pushParseAndPop({}, WGS84_BOUNDINGBOX_PARSERS, node, objectStack);\n}\n\n/**\n * @param {Element} node Node.\n * @param {Array<*>} objectStack Object stack.\n * @return {Array<string>|undefined} Keyword list.\n */\nfunction readKeywordList(node, objectStack) {\n return pushParseAndPop([], KEYWORDLIST_PARSERS, node, objectStack);\n}\n\n/**\n * @param {Element} node Node.\n * @param {Array<*>} objectStack Object stack.\n * @return {Array<string>|undefined} Value list.\n */\nfunction readValueList(node, objectStack) {\n return pushParseAndPop([], VALUELIST_PARSERS, node, objectStack);\n}\n\n/**\n * @param {Element} node Node.\n * @param {Array<*>} objectStack Object stack.\n * @return {Object|undefined} FeatureTyoe object.\n */\nfunction readFeatureType(node, objectStack) {\n return pushParseAndPop({}, FEATURE_TYPE_PARSERS, node, objectStack);\n}\n\n/**\n * @param {Element} node Node.\n * @param {Array<*>} objectStack Object stack.\n * @return {Object|undefined} FilterCapabilities object.\n */\nfunction readFilter_Capabilities(node, objectStack) {\n return pushParseAndPop({}, FILTER_CAPABILITIES_PARSERS, node, objectStack);\n}\n\n/**\n * @param {Element} node Node.\n * @param {Array<*>} objectStack Object stack.\n * @return {Object|undefined} Conformance object.\n */\nfunction readConformance(node, objectStack) {\n return pushParseAndPop({}, CONFORMANCE_PARSERS, node, objectStack);\n}\n\n/**\n * @param {Element} node Node.\n * @param {Array<*>} objectStack Object stack.\n * @return {Object|undefined} Id Capabilities object.\n */\nfunction readId_Capabilities(node, objectStack) {\n return pushParseAndPop({}, ID_CAPABILITIES_PARSERS, node, objectStack);\n}\n\n/**\n * @param {Element} node Node.\n * @param {Array<*>} objectStack Object stack.\n * @return {Object|undefined} Scalar Capabilities object.\n */\nfunction readScalarCapabilities(node, objectStack) {\n return pushParseAndPop({}, SCALAR_CAPABILITIES_PARSERS, node, objectStack);\n}\n\n/**\n * @param {Element} node Node.\n * @param {Array<*>} objectStack Object stack.\n * @return {Object|undefined} Spatial Capabilities object.\n */\nfunction readSpatialCapabilities(node, objectStack) {\n return pushParseAndPop({}, SPATIAL_CAPABILITIES_PARSERS, node, objectStack);\n}\n\n/**\n * @param {Element} node Node.\n * @param {Array<*>} objectStack Object stack.\n * @return {Object|undefined} Temporal Capabilities object.\n */\nfunction readTemporalCapabilities(node, objectStack) {\n return pushParseAndPop({}, TEMPORAL_CAPABILITIES_PARSERS, node, objectStack);\n}\n\n/**\n * @param {Element} node Node.\n * @param {Array<*>} objectStack Object stack.\n * @return {Array<string>|undefined} Functions array.\n */\nfunction readFunctions(node, objectStack) {\n return pushParseAndPop([], FUNCTIONS_PARSERS, node, objectStack);\n}\n\n/**\n * @param {Element} node Node.\n * @param {Array<*>} objectStack Object stack.\n * @return {Object|undefined} Function object.\n */\nfunction readFunction(node, objectStack) {\n return pushParseAndPop({}, FUNCTION_PARSERS, node, objectStack);\n}\n\n/**\n * @param {Element} node Node.\n * @param {Array<*>} objectStack Object stack.\n * @return {Array<string>|undefined} Logical Operators array.\n */\nfunction readLogicalOperators(node, objectStack) {\n return pushParseAndPop([], LOGICAL_OPERATORS_PARSERS, node, objectStack);\n}\n\n/**\n * @param {Element} node Node.\n * @param {Array<*>} objectStack Object stack.\n * @return {Array<string>|undefined} Comparison Operators array.\n */\nfunction readComparisonOperators(node, objectStack) {\n return pushParseAndPop([], COMPARISON_OPERATORS_PARSERS, node, objectStack);\n}\n\n/**\n * @param {Element} node Node.\n * @param {Array<*>} objectStack Object stack.\n * @return {Array<string>|undefined} Geometry Operands array.\n */\nfunction readGeometryOperands(node, objectStack) {\n return pushParseAndPop([], GEOMETRY_OPERANDS_PARSERS, node, objectStack);\n}\n\n/**\n * @param {Element} node Node.\n * @param {Array<*>} objectStack Object stack.\n * @return {Array<string>|undefined} Spatials Operators array.\n */\nfunction readSpatialOperators(node, objectStack) {\n return pushParseAndPop([], SPATIAL_OPERATORS_PARSERS, node, objectStack);\n}\n\n/**\n * @param {Element} node Node.\n * @param {Array<*>} objectStack Object stack.\n * @return {Array<string>|undefined} Temporal Operands array.\n */\nfunction readTemporalOperands(node, objectStack) {\n return pushParseAndPop([], TEMPORAL_OPERANDS_PARSERS, node, objectStack);\n}\n\n/**\n * @param {Element} node Node.\n * @param {Array<*>} objectStack Object stack.\n * @return {Array<string>|undefined} Temporal Operators array.\n */\nfunction readTemporalOperators(node, objectStack) {\n return pushParseAndPop([], TEMPORAL_OPERATORS_PARSERS, node, objectStack);\n}\n\n/**\n * @param {Element} node Node.\n * @param {Array<*>} objectStack Object stack.\n * @return {Array<string>|undefined} Arguments array.\n */\nfunction readArguments(node, objectStack) {\n return pushParseAndPop([], ARGUMENTS_PARSERS, node, objectStack);\n}\n\n/**\n * @param {Element} node Node.\n * @param {Array<*>} objectStack Object stack.\n * @return {Object|undefined} Argument object.\n */\nfunction readArgument(node, objectStack) {\n return pushParseAndPop({}, ARGUMENT_PARSERS, node, objectStack);\n}\n\n/**\n * @param {Element} node Node.\n * @return {Array<number>|undefined} Coordinates array.\n */\nfunction readStringCoords(node) {\n const coords = getAllTextContent(node, false).split(' ');\n if (coords.length) {\n return coords.map((c) => Number(c));\n }\n return undefined;\n}\n\nexport default WFSCapabilities;\n","// Ol\r\nimport BaseObject, { ObjectEvent } from 'ol/Object.js';\r\nimport { Types as ObjectEventTypes } from 'ol/ObjectEventType.js';\r\n\r\nimport { ProjectionLike } from 'ol/proj.js';\r\nimport Circle from 'ol/geom/Circle.js';\r\nimport Geometry from 'ol/geom/Geometry.js';\r\nimport GeometryCollection from 'ol/geom/GeometryCollection.js';\r\nimport Feature from 'ol/Feature.js';\r\n\r\nimport GeoJSON from 'ol/format/GeoJSON.js';\r\nimport KML from 'ol/format/KML.js';\r\nimport WFS from 'ol/format/WFS.js';\r\n\r\nimport { State } from 'ol/source/Source.js';\r\nimport { fromCircle } from 'ol/geom/Polygon.js';\r\nimport BaseEvent from 'ol/events/Event.js';\r\nimport { CombinedOnSignature, EventTypes, OnSignature } from 'ol/Observable.js';\r\nimport { EventsKey } from 'ol/events.js';\r\nimport { TransactionResponse } from 'ol/format/WFS.js';\r\n\r\nimport WFSCapabilities from 'ol-wfs-capabilities';\r\n\r\nimport { showLoading } from './modules/loading';\r\nimport { parseError, showError } from './modules/errors';\r\nimport {\r\n getMap,\r\n getStoredLayer,\r\n removeFeatureFromEditList\r\n} from './modules/state';\r\nimport { getEditLayer } from './modules/editLayer';\r\nimport { deepObjectAssign } from './modules/helpers';\r\nimport { I18N } from './modules/i18n';\r\nimport { GeometryType, TransactionType } from './@enums';\r\nimport WmsLayer from './WmsLayer';\r\n\r\n// https://docs.geoserver.org/latest/en/user/services/wfs/axis_order.html\r\n// Axis ordering: latitude/longitude\r\nconst DEFAULT_GEOSERVER_SRS = 'EPSG:3857';\r\nconst parser = new WFSCapabilities();\r\n\r\n/**\r\n * @fires change:capabilities\r\n * @extends {ol/Object~BaseObject}\r\n * @param options\r\n */\r\nexport default class Geoserver extends BaseObject {\r\n protected _options: GeoserverOptions;\r\n\r\n protected _countRequests: number;\r\n protected _insertFeatures: Array<Feature<Geometry>>;\r\n protected _updateFeatures: Array<Feature<Geometry>>;\r\n protected _deleteFeatures: Array<Feature<Geometry>>;\r\n\r\n // Lock id returned by the server in the LockFeature response. Defaults to\r\n // the configured lockId and is overwritten with the real server one when\r\n // it can be parsed\r\n protected _lockedId: string;\r\n\r\n // Formats\r\n protected _formatWFS: WFS;\r\n protected _formatGeoJSON: GeoJSON;\r\n protected _formatKml: KML;\r\n protected _xs: XMLSerializer;\r\n\r\n protected state_: State;\r\n\r\n declare on: OnSignature<EventTypes, BaseEvent, EventsKey> &\r\n OnSignature<\r\n GeoserverEventTypes | ObjectEventTypes,\r\n ObjectEvent,\r\n EventsKey\r\n > &\r\n CombinedOnSignature<\r\n GeoserverEventTypes | ObjectEventTypes | EventTypes,\r\n EventsKey\r\n >;\r\n\r\n declare once: OnSignature<EventTypes, BaseEvent, EventsKey> &\r\n OnSignature<\r\n GeoserverEventTypes | ObjectEventTypes,\r\n ObjectEvent,\r\n EventsKey\r\n > &\r\n CombinedOnSignature<\r\n GeoserverEventTypes | ObjectEventTypes | EventTypes,\r\n EventsKey\r\n >;\r\n\r\n declare un: OnSignature<EventTypes, BaseEvent, void> &\r\n OnSignature<GeoserverEventTypes | ObjectEventTypes, ObjectEvent, void> &\r\n CombinedOnSignature<\r\n GeoserverEventTypes | ObjectEventTypes | EventTypes,\r\n void\r\n >;\r\n\r\n constructor(options: GeoserverOptions) {\r\n super();\r\n\r\n const defaults = {\r\n url: null,\r\n advanced: {\r\n getCapabilitiesVersion: '2.0.0',\r\n getFeatureVersion: '1.0.0',\r\n describeFeatureTypeVersion: '1.1.0',\r\n lockFeatureVersion: '1.1.0',\r\n wfsTransactionVersion: '1.1.0',\r\n projection: DEFAULT_GEOSERVER_SRS,\r\n lockFeatureParams: {\r\n expiry: 5, // minutes\r\n lockId: 'WFST-editor',\r\n releaseAction: 'SOME'\r\n }\r\n },\r\n headers: {},\r\n credentials: 'same-origin',\r\n useLockFeature: true\r\n };\r\n\r\n this._options = deepObjectAssign(defaults, options);\r\n\r\n this.setAdvanced(this._options.advanced);\r\n this.setHeaders(this._options.headers);\r\n this.setCredentials(this._options.credentials);\r\n this.setUrl(this._options.url);\r\n this.setUseLockFeature(this._options.useLockFeature);\r\n\r\n this._countRequests = 0;\r\n\r\n this._insertFeatures = [];\r\n this._updateFeatures = [];\r\n this._deleteFeatures = [];\r\n\r\n this._lockedId = this._options.advanced.lockFeatureParams.lockId;\r\n\r\n // Formats\r\n this._formatWFS = new WFS();\r\n\r\n this._formatGeoJSON = new GeoJSON();\r\n this._formatKml = new KML({\r\n extractStyles: false,\r\n showPointNames: false\r\n });\r\n this._xs = new XMLSerializer();\r\n\r\n this.getAndUpdateCapabilities();\r\n\r\n this.on('change:parsedCapabilities', () => {\r\n this._checkGeoserverCapabilities();\r\n });\r\n }\r\n\r\n /**\r\n *\r\n * @returns\r\n * @public\r\n */\r\n getCapabilities(): XMLDocument {\r\n return this.get(GeoserverProperty.CAPABILITIES);\r\n }\r\n\r\n /**\r\n * Only work for `2.0.0` getCapabilities version\r\n * @returns\r\n * @public\r\n */\r\n getParsedCapabilities(): any {\r\n return this.get(GeoserverProperty.PARSED_CAPABILITIES);\r\n }\r\n\r\n /**\r\n *\r\n * @param url\r\n * @param opt_silent\r\n * @public\r\n */\r\n setUrl(url: string, opt_silent = false): void {\r\n this.set(GeoserverProperty.URL, url, opt_silent);\r\n }\r\n\r\n /**\r\n *\r\n * @returns\r\n */\r\n getUrl(): string {\r\n return this.get(GeoserverProperty.URL);\r\n }\r\n\r\n /**\r\n *\r\n * @param headers\r\n * @param opt_silent\r\n * @returns\r\n * @public\r\n */\r\n setHeaders(headers: HeadersInit = {}, opt_silent = false): void {\r\n return this.set(GeoserverProperty.HEADERS, headers, opt_silent);\r\n }\r\n\r\n /**\r\n *\r\n * @returns\r\n * @public\r\n */\r\n getHeaders(): HeadersInit {\r\n return this.get(GeoserverProperty.HEADERS);\r\n }\r\n\r\n /**\r\n *\r\n * @param credentials\r\n * @param opt_silent\r\n * @public\r\n */\r\n setCredentials(\r\n credentials: RequestCredentials = null,\r\n opt_silent = false\r\n ): void {\r\n this.set(GeoserverProperty.CREDENTIALS, credentials, opt_silent);\r\n }\r\n\r\n /**\r\n *\r\n * @returns\r\n * @public\r\n */\r\n getCredentials(): RequestCredentials {\r\n return this.get(GeoserverProperty.CREDENTIALS);\r\n }\r\n\r\n /**\r\n *\r\n * @returns\r\n * @public\r\n */\r\n setAdvanced(advanced: GeoServerAdvanced = {}, opt_silent = false): void {\r\n this.set(GeoserverProperty.ADVANCED, advanced, opt_silent);\r\n }\r\n\r\n /**\r\n *\r\n * @returns\r\n * @public\r\n */\r\n getAdvanced(): GeoServerAdvanced {\r\n return this.get(GeoserverProperty.ADVANCED);\r\n }\r\n\r\n /**\r\n *\r\n * @returns\r\n * @public\r\n */\r\n hasTransaction(): boolean {\r\n return this.get(GeoserverProperty.HASTRASNACTION);\r\n }\r\n\r\n /**\r\n *\r\n * @returns\r\n * @public\r\n */\r\n hasLockFeature(): boolean {\r\n return this.get(GeoserverProperty.HASLOCKFEATURE);\r\n }\r\n\r\n /**\r\n *\r\n * @returns\r\n * @public\r\n */\r\n getUseLockFeature(): boolean {\r\n return this.get(GeoserverProperty.USELOCKFEATURE);\r\n }\r\n\r\n /**\r\n *\r\n * @returns\r\n * @public\r\n */\r\n setUseLockFeature(useLockFeature: boolean, opt_silent = false): void {\r\n this.set(GeoserverProperty.USELOCKFEATURE, useLockFeature, opt_silent);\r\n }\r\n\r\n /**\r\n *\r\n * @returns\r\n * @public\r\n */\r\n isLoaded(): boolean {\r\n return this.get(GeoserverProperty.ISLOADED);\r\n }\r\n\r\n /**\r\n *\r\n * @returns\r\n */\r\n getState() {\r\n return this.state_;\r\n }\r\n\r\n /**\r\n * Get the capabilities from the GeoServer and check\r\n * all the available operations.\r\n *\r\n * @fires getcapabilities\r\n * @public\r\n */\r\n async getAndUpdateCapabilities(): Promise<XMLDocument> {\r\n try {\r\n const params = new URLSearchParams({\r\n service: 'wfs',\r\n version: this.getAdvanced().getCapabilitiesVersion,\r\n request: 'GetCapabilities',\r\n exceptions: 'application/json'\r\n });\r\n\r\n const url_fetch = this.getUrl() + '?' + params.toString();\r\n\r\n const response = await fetch(url_fetch, {\r\n headers: this.getHeaders(),\r\n credentials: this.getCredentials()\r\n });\r\n\r\n if (!response.ok) {\r\n throw new Error('');\r\n }\r\n\r\n const data = await response.text();\r\n const capabilities = new window.DOMParser().parseFromString(\r\n data,\r\n 'text/xml'\r\n );\r\n\r\n this.set(GeoserverProperty.CAPABILITIES, capabilities);\r\n\r\n const parsedCapabilities = parser.read(data);\r\n\r\n this.set(GeoserverProperty.PARSED_CAPABILITIES, parsedCapabilities);\r\n\r\n this.state_ = capabilities ? 'ready' : 'error';\r\n\r\n return capabilities;\r\n } catch (err) {\r\n console.error(err);\r\n const msg =\r\n typeof err === 'string' ? err : I18N.errors.capabilities;\r\n showError(msg, err);\r\n }\r\n }\r\n\r\n /**\r\n *\r\n * @private\r\n */\r\n _checkGeoserverCapabilities() {\r\n if (this.getAdvanced().getCapabilitiesVersion === '2.0.0') {\r\n // Available operations in the geoserver\r\n const operations: Array<any> =\r\n this.getParsedCapabilities()?.OperationsMetadata?.Operation;\r\n\r\n if (operations) {\r\n operations.forEach((operation) => {\r\n if (operation.name === 'Transaction') {\r\n this.set(GeoserverProperty.HASTRASNACTION, true);\r\n } else if (operation.name === 'LockFeature') {\r\n this.set(GeoserverProperty.HASLOCKFEATURE, true);\r\n } else if (operation.name === 'DescribeFeatureType') {\r\n this.set(\r\n GeoserverProperty.HASDESCRIBEFEATURETYPE,\r\n true\r\n );\r\n }\r\n });\r\n }\r\n } else {\r\n const operations: HTMLCollectionOf<Element> =\r\n this.getCapabilities().getElementsByTagName('ows:Operation');\r\n\r\n Array.from(operations).forEach((operation) => {\r\n if (operation.getAttribute('name') === 'Transaction') {\r\n this.set(GeoserverProperty.HASTRASNACTION, true);\r\n } else if (operation.getAttribute('name') === 'LockFeature') {\r\n this.set(GeoserverProperty.HASLOCKFEATURE, true);\r\n } else if (\r\n operation.getAttribute('name') === 'DescribeFeatureType'\r\n ) {\r\n this.set(GeoserverProperty.HASDESCRIBEFEATURETYPE, true);\r\n }\r\n });\r\n }\r\n\r\n if (!this.hasTransaction()) {\r\n throw I18N.errors.wfst;\r\n }\r\n }\r\n\r\n /**\r\n * Make the WFS Transactions\r\n *\r\n * @param transactionType\r\n * @param features\r\n * @param layerName\r\n * @private\r\n */\r\n async transact(\r\n transactionType: TransactionType,\r\n features: Array<Feature<Geometry>> | Feature<Geometry>,\r\n layerName: string\r\n ): Promise<TransactionResponse | false> {\r\n features = (\r\n Array.isArray(features) ? features : [features]\r\n ) as Feature<Geometry>[];\r\n const clonedFeatures = [];\r\n const geoLayer = getStoredLayer(layerName);\r\n\r\n for (const feature of features) {\r\n let clone = this._cloneFeature(feature);\r\n const cloneGeom = clone.getGeometry();\r\n\r\n // Ugly fix to support GeometryCollection on GML\r\n // See https://github.com/openlayers/openlayers/issues/4220\r\n if (cloneGeom instanceof GeometryCollection) {\r\n this._transformGeoemtryCollectionToGeometries(\r\n clone,\r\n cloneGeom as GeometryCollection\r\n );\r\n } else if (cloneGeom instanceof Circle) {\r\n // Geoserver has no Support to Circles\r\n this._transformCircleToPolygon(clone, cloneGeom as Circle);\r\n }\r\n\r\n // Filters\r\n if (\r\n 'beforeTransactFeature' in geoLayer &&\r\n typeof geoLayer.beforeTransactFeature === 'function'\r\n ) {\r\n clone = geoLayer.beforeTransactFeature(clone, transactionType);\r\n }\r\n\r\n if (clone) {\r\n clonedFeatures.push(clone);\r\n }\r\n }\r\n\r\n if (!clonedFeatures.length) {\r\n showError(I18N.errors.noValidGeometry);\r\n return false;\r\n }\r\n\r\n switch (transactionType) {\r\n case TransactionType.Insert:\r\n this._insertFeatures = [\r\n ...this._insertFeatures,\r\n ...clonedFeatures\r\n ];\r\n break;\r\n case TransactionType.Update:\r\n this._updateFeatures = [\r\n ...this._updateFeatures,\r\n ...clonedFeatures\r\n ];\r\n break;\r\n case TransactionType.Delete:\r\n this._deleteFeatures = [\r\n ...this._deleteFeatures,\r\n ...clonedFeatures\r\n ];\r\n break;\r\n default:\r\n break;\r\n }\r\n\r\n this._countRequests++;\r\n const numberRequest = this._countRequests;\r\n\r\n return new Promise((resolve, reject) => {\r\n setTimeout(async () => {\r\n try {\r\n // Prevent fire multiples times\r\n if (numberRequest !== this._countRequests) {\r\n return;\r\n }\r\n\r\n let srs = getMap().getView().getProjection().getCode();\r\n\r\n // Force latitude/longitude order on transactions\r\n // EPSG:4326 is longitude/latitude (assumption) and is not managed correctly by GML3\r\n srs =\r\n srs === 'EPSG:4326'\r\n ? 'urn:x-ogc:def:crs:EPSG:4326'\r\n : srs;\r\n\r\n if (!geoLayer || !geoLayer.getDescribeFeatureType()) {\r\n throw new Error(\r\n `${I18N.errors.layerNotFound}: \"${layerName}\"`\r\n );\r\n }\r\n\r\n const describeFeatureType =\r\n geoLayer.getDescribeFeatureType()._parsed;\r\n\r\n const layerNameClean =\r\n layerName.split(':').length > 1\r\n ? layerName.split(':').pop()\r\n : layerName;\r\n\r\n const options = {\r\n featureNS: describeFeatureType.namespace,\r\n featureType: layerNameClean,\r\n srsName: srs,\r\n featurePrefix: null,\r\n nativeElements: null,\r\n version: this.getAdvanced().wfsTransactionVersion\r\n };\r\n\r\n const transaction = this._formatWFS.writeTransaction(\r\n this._insertFeatures,\r\n this._updateFeatures,\r\n this._deleteFeatures,\r\n options\r\n );\r\n\r\n let payload = this._xs.serializeToString(transaction);\r\n const geomType = describeFeatureType.geomType;\r\n const geomField = describeFeatureType.geomField;\r\n\r\n // Ugly fix to support GeometryCollection on GML\r\n // See https://github.com/openlayers/openlayers/issues/4220\r\n if (geomType === GeometryType.GeometryCollection) {\r\n if (transactionType === TransactionType.Insert) {\r\n payload = payload.replace(\r\n /<geometry>/g,\r\n `<geometry><MultiGeometry xmlns=\"http://www.opengis.net/gml\" srsName=\"${srs}\"><geometryMember>`\r\n );\r\n payload = payload.replace(\r\n /<\\/geometry>/g,\r\n `</geometryMember></MultiGeometry></geometry>`\r\n );\r\n } else if (transactionType === TransactionType.Update) {\r\n const gmemberIn = `<MultiGeometry xmlns=\"http://www.opengis.net/gml\" srsName=\"${srs}\"><geometryMember>`;\r\n const gmemberOut = `</geometryMember></MultiGeometry>`;\r\n\r\n payload = payload.replace(\r\n /(.*)(<Name>geometry<\\/Name><Value>)(.*?)(<\\/Value>)(.*)/g,\r\n `$1$2${gmemberIn}$3${gmemberOut}$4$5`\r\n );\r\n }\r\n }\r\n\r\n // Fixes geometry name, weird bug with GML:\r\n // The property for the geometry column is always named \"geometry\"\r\n if (transactionType === TransactionType.Insert) {\r\n payload = payload.replace(\r\n /<(\\/?)\\bgeometry\\b>/g,\r\n `<$1${geomField}>`\r\n );\r\n } else if (transactionType === TransactionType.Update) {\r\n payload = payload.replace(\r\n /<Name>geometry<\\/Name>/g,\r\n `<Name>${geomField}</Name>`\r\n );\r\n }\r\n\r\n // This has to be te same used before\r\n if (\r\n this.hasLockFeature &&\r\n this.getUseLockFeature() &&\r\n transactionType !== TransactionType.Insert\r\n ) {\r\n payload = payload.replace(\r\n `</Transaction>`,\r\n `<LockId>${this._lockedId}</LockId></Transaction>`\r\n );\r\n }\r\n\r\n const headers = {\r\n 'Content-Type': 'text/xml',\r\n ...this.getHeaders()\r\n };\r\n\r\n const response = await fetch(this.getUrl(), {\r\n method: 'POST',\r\n body: payload,\r\n headers: headers,\r\n credentials: this._options.credentials\r\n });\r\n\r\n if (!response.ok) {\r\n throw new Error(\r\n I18N.errors.transaction + ' ' + response.status\r\n );\r\n }\r\n\r\n const responseStr = await response.text();\r\n\r\n const parseResponse =\r\n this._formatWFS.readTransactionResponse(responseStr);\r\n\r\n const wlayer = getStoredLayer(layerName);\r\n\r\n if (!Object.keys(parseResponse).length) {\r\n const findError = String(responseStr).match(\r\n /<ows:ExceptionText>([\\s\\S]*?)<\\/ows:ExceptionText>/\r\n );\r\n\r\n if (findError) {\r\n if (wlayer instanceof WmsLayer) {\r\n this._removeFeatures(\r\n features as Feature<Geometry>[]\r\n );\r\n }\r\n // maybe remove tmp wms features here\r\n throw new Error(findError[1]);\r\n }\r\n }\r\n\r\n if (transactionType !== TransactionType.Delete) {\r\n this._removeFeatures(features as Feature<Geometry>[]);\r\n }\r\n\r\n (features as Feature<Geometry>[]).forEach((feature) => {\r\n removeFeatureFromEditList(feature);\r\n });\r\n\r\n wlayer.refresh();\r\n\r\n showLoading(false);\r\n\r\n this._insertFeatures = [];\r\n this._updateFeatures = [];\r\n this._deleteFeatures = [];\r\n\r\n this._countRequests = 0;\r\n\r\n resolve(parseResponse);\r\n } catch (err) {\r\n showError(err.message, err);\r\n showLoading(false);\r\n this._countRequests = 0;\r\n reject();\r\n }\r\n }, 0);\r\n });\r\n }\r\n\r\n /**\r\n * @privatwe\r\n */\r\n _removeFeatures(features: Feature<Geometry>[]) {\r\n for (const feature of features as Array<Feature<Geometry>>) {\r\n getEditLayer().getSource().removeFeature(feature);\r\n }\r\n }\r\n /**\r\n *\r\n * @param feature\r\n * @param geom\r\n * @private\r\n */\r\n _transformCircleToPolygon(feature: Feature<Geometry>, geom: Circle) {\r\n const geomConverted = fromCircle(geom);\r\n feature.setGeometry(geomConverted);\r\n }\r\n\r\n /**\r\n *\r\n * @param feature\r\n * @private\r\n * @param geom\r\n */\r\n _transformGeoemtryCollectionToGeometries(\r\n feature: Feature<Geometry>,\r\n geom: GeometryCollection\r\n ) {\r\n let geomConverted = geom.getGeometries()[0];\r\n\r\n if (geomConverted instanceof Circle) {\r\n geomConverted = fromCircle(geomConverted);\r\n }\r\n\r\n feature.setGeometry(geomConverted);\r\n }\r\n\r\n /**\r\n *\r\n * @param feature\r\n * @returns\r\n * @private\r\n */\r\n _cloneFeature(feature: Feature<Geometry>): Feature<Geometry> {\r\n removeFeatureFromEditList(feature);\r\n\r\n const featureProperties = feature.getProperties();\r\n\r\n delete featureProperties.boundedBy;\r\n delete featureProperties._layerName_;\r\n delete featureProperties._editOverlayCoord_;\r\n\r\n const clone = new Feature(featureProperties);\r\n clone.setId(feature.getId());\r\n\r\n return clone;\r\n }\r\n\r\n /**\r\n * Lock one or several features in the geoserver. Useful before editing,\r\n * to avoid changes from multiples users. Locking several features at once\r\n * with a single request keeps the lock covered by one LockId\r\n *\r\n * @param featureIds\r\n * @param layerName\r\n * @param retry\r\n * @public\r\n */\r\n async lockFeature(\r\n featureIds: string | number | Array<string | number>,\r\n layerName: string,\r\n retry = 0\r\n ): Promise<string> {\r\n const params = new URLSearchParams({\r\n service: 'wfs',\r\n version: this.getAdvanced().lockFeatureVersion,\r\n request: 'LockFeature',\r\n typeName: layerName,\r\n expiry: String(this._options.advanced.lockFeatureParams.expiry),\r\n handle: this._options.advanced.lockFeatureParams.lockId,\r\n releaseAction:\r\n this._options.advanced.lockFeatureParams.releaseAction,\r\n exceptions: 'application/json',\r\n featureid: Array.isArray(featureIds)\r\n ? featureIds.join(',')\r\n : String(featureIds)\r\n });\r\n\r\n const url_fetch = this.getUrl() + '?' + params.toString();\r\n\r\n try {\r\n const response = await fetch(url_fetch, {\r\n headers: this._options.headers,\r\n credentials: this._options.credentials\r\n });\r\n\r\n if (!response.ok) {\r\n throw new Error(I18N.errors.lockFeature);\r\n }\r\n\r\n const data = await response.text();\r\n\r\n try {\r\n // First, check if is a JSON (with errors)\r\n const dataParsed = JSON.parse(data);\r\n\r\n if ('exceptions' in dataParsed) {\r\n const error = new Error(parseError(dataParsed));\r\n\r\n const exceptions = dataParsed.exceptions;\r\n if (exceptions[0].code === 'CannotLockAllFeatures') {\r\n // Maybe the Feature is already blocked, ant thats trigger error, so, we try one locking more time again\r\n if (!retry) {\r\n this.lockFeature(featureIds, layerName, 1);\r\n } else {\r\n throw error;\r\n }\r\n } else {\r\n throw error;\r\n }\r\n }\r\n } catch (err) {\r\n // XML response (not JSON): parse the real lock id returned by\r\n // the server so the transaction references the lock that was\r\n // actually created instead of the configured one\r\n try {\r\n const dataDoc = new window.DOMParser().parseFromString(\r\n data,\r\n 'text/xml'\r\n );\r\n\r\n const lockIdNode =\r\n dataDoc.getElementsByTagName('wfs:LockId')[0] ||\r\n dataDoc.getElementsByTagNameNS(\r\n 'http://www.opengis.net/wfs',\r\n 'LockId'\r\n )[0];\r\n\r\n if (lockIdNode && lockIdNode.textContent) {\r\n this._lockedId = lockIdNode.textContent;\r\n }\r\n } catch (parseErr) {\r\n // Keep the configured lockId\r\n }\r\n }\r\n\r\n return data;\r\n } catch (err) {\r\n showError(err.message, err);\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * **_[interface]_**\r\n * @public\r\n */\r\nexport interface GeoserverOptions {\r\n /**\r\n * Url for OWS services. This endpoint will recive the WFS, WFST and WMS requests\r\n *\r\n */\r\n url: string;\r\n\r\n /**\r\n * Advanced options for geoserver requests\r\n *\r\n */\r\n advanced?: GeoServerAdvanced;\r\n\r\n /**\r\n * Http headers for GeoServer requests\r\n * https://developer.mozilla.org/en-US/docs/Web/API/Request/headers\r\n *\r\n */\r\n headers?: HeadersInit;\r\n\r\n /**\r\n * Credentials for fetch requests\r\n * https://developer.mozilla.org/en-US/docs/Web/API/Request/credentials\r\n *\r\n * Default is 'same-origin'\r\n */\r\n credentials?: RequestCredentials;\r\n\r\n /**\r\n * Use LockFeatue request on GeoServer when selecting features. Prevents a feature from being edited\r\n * through a persistent feature lock. This is not always supportedd by the GeoServer.\r\n * See https://docs.geoserver.org/stable/en/user/services/wfs/reference.html\r\n */\r\n useLockFeature?: boolean;\r\n}\r\n\r\n/**\r\n * **_[interface]_**\r\n *\r\n * * Default values:\r\n * ```javascript\r\n * {\r\n * getCapabilitiesVersion: '2.0.0',\r\n * getFeatureVersion: '1.0.0',\r\n * describeFeatureTypeVersion: '1.1.0',\r\n * lockFeatureVersion: '1.1.0',\r\n * wfsTransactionVersion: '1.1.0',\r\n * projection: 'EPSG:3857',\r\n * lockFeatureParams: {\r\n * expiry: 5,\r\n * lockId: 'Geoserver',\r\n * releaseAction: 'SOME'\r\n * }\r\n * }\r\n * @public\r\n */\r\nexport interface GeoServerAdvanced {\r\n getCapabilitiesVersion?: string;\r\n getFeatureVersion?: string;\r\n lockFeatureVersion?: string;\r\n describeFeatureTypeVersion?: string;\r\n wfsTransactionVersion?: string;\r\n projection?: ProjectionLike;\r\n lockFeatureParams?: {\r\n // 5 (minutes) by default\r\n expiry?: number | string;\r\n\r\n // 'Geoserver' by default\r\n lockId?: string;\r\n\r\n // 'SOME' by default\r\n releaseAction?: string;\r\n };\r\n}\r\n\r\nexport enum GeoserverProperty {\r\n CAPABILITIES = 'capabilities',\r\n PARSED_CAPABILITIES = 'parsedCapabilities',\r\n URL = 'url',\r\n HEADERS = 'headers',\r\n CREDENTIALS = 'credentials',\r\n ADVANCED = 'advanced',\r\n HASTRASNACTION = 'hasTransaction',\r\n HASLOCKFEATURE = 'hasLockFeature',\r\n HASDESCRIBEFEATURETYPE = 'hasDescribeFeatureType',\r\n USELOCKFEATURE = 'useLockFeature',\r\n ISLOADED = 'isLoaded'\r\n}\r\n\r\nexport type GeoserverEventTypes =\r\n | `change:${GeoserverProperty.CAPABILITIES}`\r\n | `change:${GeoserverProperty.PARSED_CAPABILITIES}`\r\n | `change:${GeoserverProperty.URL}`\r\n | `change:${GeoserverProperty.HEADERS}`\r\n | `change:${GeoserverProperty.CREDENTIALS}`\r\n | `change:${GeoserverProperty.ADVANCED}`\r\n | `change:${GeoserverProperty.HASTRASNACTION}`\r\n | `change:${GeoserverProperty.HASLOCKFEATURE}`\r\n | `change:${GeoserverProperty.HASDESCRIBEFEATURETYPE}`\r\n | `change:${GeoserverProperty.USELOCKFEATURE}`\r\n | `change:${GeoserverProperty.ISLOADED}`;\r\n","import { getCenter } from 'ol/extent.js';\r\nimport Geometry from 'ol/geom/Geometry.js';\r\nimport Feature from 'ol/Feature.js';\r\nimport Overlay from 'ol/Overlay.js';\r\nimport { Coordinate } from 'ol/coordinate.js';\r\n\r\n// Images\r\nimport editFieldsSvg from '../assets/images/editFields.svg';\r\nimport editGeomSvg from '../assets/images/editGeom.svg';\r\nimport { I18N } from './i18n';\r\n\r\nexport default class EditOverlay extends Overlay {\r\n constructor(\r\n feature: Feature<Geometry> | null = null,\r\n coordinate: Coordinate = null,\r\n id?: string | number\r\n ) {\r\n super({\r\n id: id ?? (feature ? feature.getId() : undefined),\r\n position:\r\n coordinate ||\r\n (feature\r\n ? getCenter(feature.getGeometry().getExtent())\r\n : undefined),\r\n positioning: 'center-center',\r\n offset: [0, -40],\r\n stopEvent: true,\r\n element: (\r\n <div>\r\n <div\r\n className=\"ol-wfst--edit-button-cnt\"\r\n onClick={() => {\r\n this.dispatchEvent('editFields');\r\n }}\r\n >\r\n <button\r\n className=\"ol-wfst--edit-button\"\r\n type=\"button\"\r\n title={I18N.labels.editFields}\r\n >\r\n {editFieldsSvg()}\r\n </button>\r\n </div>\r\n <div\r\n className=\"ol-wfst--edit-button-cnt\"\r\n onClick={() => {\r\n this.dispatchEvent('editGeom');\r\n }}\r\n >\r\n <button\r\n class=\"ol-wfst--edit-button\"\r\n type=\"button\"\r\n title={I18N.labels.editGeom}\r\n >\r\n {editGeomSvg()}\r\n </button>\r\n </div>\r\n </div>\r\n )\r\n });\r\n }\r\n}\r\n","import Overlay from 'ol/Overlay.js';\r\nimport Geometry from 'ol/geom/Geometry.js';\r\nimport Feature from 'ol/Feature.js';\r\nimport { Coordinate } from 'ol/coordinate.js';\r\n\r\n// Images\r\nimport addLineSvg from '../assets/images/addLine.svg';\r\nimport { I18N } from './i18n';\r\n\r\nexport type ExtendLineSide = 'start' | 'end';\r\n\r\nexport default class ExtendLineOverlay extends Overlay {\r\n feature: Feature<Geometry>;\r\n side: ExtendLineSide;\r\n component: number;\r\n\r\n constructor(\r\n feature: Feature<Geometry>,\r\n coordinate: Coordinate,\r\n side: ExtendLineSide,\r\n component = 0,\r\n onClick: (side: ExtendLineSide) => void\r\n ) {\r\n super({\r\n position: coordinate,\r\n positioning: 'center-center',\r\n stopEvent: true,\r\n element: (\r\n <div className=\"ol-wfst--extend-button-cnt\">\r\n <button\r\n className=\"ol-wfst--extend-button\"\r\n type=\"button\"\r\n title={I18N.labels.continueLine}\r\n onClick={() => {\r\n onClick(side);\r\n }}\r\n >\r\n {addLineSvg()}\r\n </button>\r\n </div>\r\n )\r\n });\r\n\r\n this.feature = feature;\r\n this.side = side;\r\n this.component = component;\r\n }\r\n}\r\n","import { getCenter } from 'ol/extent.js';\r\nimport Geometry from 'ol/geom/Geometry.js';\r\nimport Feature from 'ol/Feature.js';\r\nimport Overlay from 'ol/Overlay.js';\r\nimport { Coordinate } from 'ol/coordinate.js';\r\n\r\nimport { I18N } from './i18n';\r\nimport { BaseLayerProperty } from './base/BaseLayer';\r\n\r\nconst QUERY_OVERLAY_ID = 'ol-wfst--query-overlay';\r\n\r\n/**\r\n * Popup overlay that shows the attributes of a queried feature and its\r\n * layer label. The geometry is highlighted separately on a dedicated layer.\r\n *\r\n * @extends {ol/Overlay~Overlay}\r\n * @param feature\r\n * @param coordinate\r\n * @param layer\r\n * @private\r\n */\r\nexport default class QueryOverlay extends Overlay {\r\n constructor(\r\n feature: Feature<Geometry>,\r\n coordinate: Coordinate,\r\n layer: { getDescribeFeatureType: () => any; get: (key: string) => any }\r\n ) {\r\n const describeFeatureType = layer.getDescribeFeatureType();\r\n const parsed = describeFeatureType?._parsed;\r\n const fields = parsed?.properties || [];\r\n const geomField = parsed?.geomField;\r\n\r\n const rows = fields\r\n .filter((field: { name: string }) => field.name !== geomField)\r\n .map((field: { name: string }) => {\r\n let value = feature.get(field.name);\r\n\r\n if (value === undefined || value === null) {\r\n value = '';\r\n } else if (typeof value === 'object') {\r\n value = JSON.stringify(value);\r\n }\r\n\r\n return (\r\n <div className=\"ol-wfst--query-popup-row\">\r\n <span className=\"ol-wfst--query-popup-key\">\r\n {field.name}\r\n </span>\r\n <span className=\"ol-wfst--query-popup-value\">\r\n {String(value)}\r\n </span>\r\n </div>\r\n );\r\n });\r\n\r\n super({\r\n id: QUERY_OVERLAY_ID,\r\n position:\r\n coordinate || getCenter(feature.getGeometry().getExtent()),\r\n positioning: 'bottom-center',\r\n offset: [0, -14],\r\n stopEvent: true,\r\n autoPan: true,\r\n element: (\r\n <div className=\"ol-wfst--query-popup\">\r\n <div className=\"ol-wfst--query-popup-head\">\r\n <div className=\"ol-wfst--query-popup-title\">\r\n {I18N.labels.featureInfo}\r\n </div>\r\n <button\r\n className=\"ol-wfst--query-popup-close\"\r\n type=\"button\"\r\n title={I18N.labels.close}\r\n onClick={() => {\r\n this.dispatchEvent('close');\r\n }}\r\n >\r\n ×\r\n </button>\r\n </div>\r\n <div className=\"ol-wfst--query-popup-subtitle\">\r\n <b>{layer.get(BaseLayerProperty.LABEL)}</b>\r\n <i>{String(feature.getId())}</i>\r\n </div>\r\n <div className=\"ol-wfst--query-popup-body\">{rows}</div>\r\n </div>\r\n )\r\n });\r\n }\r\n}\r\n","// Ol\r\nimport Geometry from 'ol/geom/Geometry.js';\r\nimport Fill from 'ol/style/Fill.js';\r\nimport Stroke from 'ol/style/Stroke.js';\r\nimport Style from 'ol/style/Style.js';\r\nimport Control from 'ol/control/Control.js';\r\nimport FullScreen from 'ol/control/FullScreen.js';\r\nimport Draw from 'ol/interaction/Draw.js';\r\nimport DragBox from 'ol/interaction/DragBox.js';\r\nimport Modify from 'ol/interaction/Modify.js';\r\nimport Select from 'ol/interaction/Select.js';\r\nimport Snap from 'ol/interaction/Snap.js';\r\nimport Polygon from 'ol/geom/Polygon.js';\r\nimport LineString from 'ol/geom/LineString.js';\r\nimport MultiLineString from 'ol/geom/MultiLineString.js';\r\nimport GeometryCollection from 'ol/geom/GeometryCollection.js';\r\nimport MapBrowserEvent from 'ol/MapBrowserEvent.js';\r\nimport SimpleGeometry from 'ol/geom/SimpleGeometry.js';\r\nimport { EventsKey } from 'ol/events.js';\r\nimport Collection from 'ol/Collection.js';\r\nimport Feature from 'ol/Feature.js';\r\nimport Overlay from 'ol/Overlay.js';\r\nimport View from 'ol/View.js';\r\nimport VectorLayer from 'ol/layer/Vector.js';\r\nimport VectorSource from 'ol/source/Vector.js';\r\nimport Map from 'ol/Map.js';\r\nimport BaseEvent from 'ol/events/Event.js';\r\nimport { LoadingStrategy } from 'ol/source/Vector.js';\r\nimport { FeatureLike } from 'ol/Feature.js';\r\nimport { Options as VectorLayerOptions } from 'ol/layer/BaseVector.js';\r\nimport { shiftKeyOnly, primaryAction } from 'ol/events/condition.js';\r\nimport {\r\n unByKey,\r\n CombinedOnSignature,\r\n EventTypes,\r\n OnSignature\r\n} from 'ol/Observable.js';\r\nimport {\r\n Coordinate,\r\n squaredDistance,\r\n squaredDistanceToSegment\r\n} from 'ol/coordinate.js';\r\nimport { createEmpty, extend, getCenter, Extent } from 'ol/extent.js';\r\nimport { ObjectEvent } from 'ol/Object.js';\r\nimport { Types as ObjectEventTypes } from 'ol/ObjectEventType.js';\r\n\r\nimport { initModal, showError } from './modules/errors';\r\nimport { initLoading, showLoading } from './modules/loading';\r\nimport WfsLayer from './WfsLayer';\r\nimport WmsLayer from './WmsLayer';\r\nimport LayersControl, {\r\n activateDrawButton,\r\n activateModeButtons,\r\n activateQueryButton,\r\n activateSelectModeButton,\r\n deactivateQueryButton,\r\n deactivateSelectModeButton,\r\n resetStateButtons\r\n} from './modules/LayersControl';\r\nimport Uploads from './modules/Uploads';\r\nimport {\r\n addFeatureToEditedList,\r\n getStoredMapLayers,\r\n isFeatureEdited,\r\n removeFeatureFromEditList,\r\n setActiveLayerToInsertEls,\r\n getActiveLayerToInsertEls,\r\n activateMode,\r\n getMode,\r\n setSelectionMode,\r\n getSelectionMode,\r\n SelectionMode,\r\n Modes,\r\n setMap,\r\n setMapLayers,\r\n getStoredLayer\r\n} from './modules/state';\r\nimport { deepObjectAssign } from './modules/helpers';\r\nimport { getEditLayer } from './modules/editLayer';\r\nimport { GeometryType, TransactionType } from './@enums';\r\nimport {\r\n I18n,\r\n IGeoserverDescribeFeatureType,\r\n IProperty,\r\n WfsGeoserverVendor,\r\n WmsGeoserverVendor\r\n} from './@types';\r\nimport * as i18n from './modules/i18n/index';\r\nimport { getDefaultOptions } from './defaults';\r\nimport EditControlChangesEl from './modules/EditControlChanges';\r\nimport styleFunction, {\r\n editVertexStyles,\r\n getFeatureVertices,\r\n queryStyleFunction\r\n} from './modules/styleFunction';\r\nimport { EditFieldsModal } from './modules/EditFieldsModal';\r\nimport Geoserver from './Geoserver';\r\nimport EditOverlay from './modules/EditOverlay';\r\nimport ExtendLineOverlay, { ExtendLineSide } from './modules/ExtendLineOverlay';\r\nimport QueryOverlay from './modules/QueryOverlay';\r\nimport { BaseLayerProperty } from './modules/base/BaseLayer';\r\n\r\n// External\r\nimport Modal from 'modal-vanilla';\r\n\r\n// Images\r\nimport fullscreenSvg from './assets/images/fullscreen.svg';\r\nimport fullscreenExitSvg from './assets/images/fullscreenExit.svg';\r\n\r\n// Style\r\nimport './assets/scss/-ol-wfst.bootstrap5.scss';\r\nimport './assets/scss/ol-wfst.scss';\r\n\r\nconst controlElement = document.createElement('div');\r\n\r\nconst INIT_LOADING_TIMEOUT = 20000;\r\n\r\n/**\r\n * Endpoint of a line component, with enough context to later extend it: the\r\n * LineString/MultiLineString that owns the coordinates, the line index inside\r\n * a MultiLineString and the parent collection when nested.\r\n *\r\n * @private\r\n */\r\ntype LineEndPoint = {\r\n first: Coordinate;\r\n last: Coordinate;\r\n line: LineString | MultiLineString;\r\n lineIndex: number;\r\n collection?: GeometryCollection;\r\n};\r\n\r\n/**\r\n * Tiny WFS-T client to insert (drawing/uploading), modify and delete\r\n * features on GeoServers using OpenLayers. Layers with these types\r\n * of geometries are supported: \"GeometryCollection\" (in this case, you can\r\n * choose the geometry type of each element to draw), \"Point\", \"MultiPoint\",\r\n * \"LineString\", \"MultiLineString\", \"Polygon\" and \"MultiPolygon\".\r\n *\r\n * @constructor\r\n * @fires modifystart\r\n * @fires modifyend\r\n * @fires drawstart\r\n * @fires drawend\r\n * @fires load\r\n * @fires describeFeatureType\r\n * @extends {ol/control/Control~Control}\r\n * @param options Wfst options, see [Wfst Options](#options) for more details.\r\n */\r\nexport default class Wfst extends Control {\r\n protected _options: Options;\r\n protected _i18n: I18n;\r\n\r\n // Ol\r\n protected _map: Map;\r\n protected _view: View;\r\n protected _viewport: HTMLElement;\r\n protected _initialized = false;\r\n protected _layersControl: LayersControl;\r\n protected _overlay: Overlay;\r\n\r\n // Interactions\r\n protected _interactionWfsSelect: Select;\r\n protected _interactionSelectModify: Select;\r\n protected _collectionModify: Collection<any>;\r\n protected _interactionModify: Modify;\r\n protected _interactionSnap: Snap;\r\n protected _interactionDraw: Draw;\r\n protected _interactionDragBox: DragBox;\r\n protected _interactionFreehandSelect: Draw;\r\n\r\n // Query\r\n protected _keyClickQuery: EventsKey;\r\n protected _queryOverlay: Overlay;\r\n protected _queryOverlayId = 'ol-wfst--query-overlay';\r\n protected _highlightSource: VectorSource;\r\n protected _highlightLayer: VectorLayer;\r\n\r\n // Obserbable keys\r\n protected _keyClickWms: EventsKey | EventsKey[];\r\n protected _keyRemove: EventsKey;\r\n protected _keySelect: EventsKey;\r\n protected _shiftPressed = false;\r\n\r\n // Controls\r\n protected _controlApplyDiscardChanges: EditControlChangesEl;\r\n protected _controlWidgetToolsDiv: HTMLElement;\r\n protected _layersWidgetDiv: HTMLElement;\r\n protected _selectDraw: HTMLSelectElement;\r\n\r\n // State\r\n protected _currentZoom: number;\r\n protected _lastZoom: number;\r\n protected _hoveredFeature: Feature<Geometry> = null;\r\n protected _keySelectBound = false;\r\n // Editing\r\n protected _editFeaturesOriginal: {\r\n [key: string]: Feature<Geometry>;\r\n } = {};\r\n protected _multiOverlayId = 'ol-wfst--multi-edit-overlay';\r\n protected _extendOverlays: ExtendLineOverlay[] = [];\r\n protected _extendDraw: Draw;\r\n\r\n protected _uploads: Uploads;\r\n protected _editFields: EditFieldsModal;\r\n\r\n declare on: OnSignature<EventTypes, BaseEvent, EventsKey> &\r\n OnSignature<WfstEventTypes, WfstEvent, EventsKey> &\r\n OnSignature<ObjectEventTypes, ObjectEvent, EventsKey> &\r\n CombinedOnSignature<\r\n WfstEventTypes | ObjectEventTypes | EventTypes,\r\n EventsKey\r\n >;\r\n\r\n declare once: OnSignature<EventTypes, BaseEvent, EventsKey> &\r\n OnSignature<WfstEventTypes, WfstEvent, EventsKey> &\r\n OnSignature<ObjectEventTypes, ObjectEvent, EventsKey> &\r\n CombinedOnSignature<\r\n WfstEventTypes | ObjectEventTypes | EventTypes,\r\n EventsKey\r\n >;\r\n\r\n declare un: OnSignature<EventTypes, BaseEvent, void> &\r\n OnSignature<WfstEventTypes, WfstEvent, EventsKey> &\r\n OnSignature<ObjectEventTypes, ObjectEvent, void> &\r\n CombinedOnSignature<\r\n WfstEventTypes | ObjectEventTypes | EventTypes,\r\n void\r\n >;\r\n\r\n constructor(options?: Options) {\r\n super({\r\n target: null,\r\n element: controlElement,\r\n render: () => {\r\n if (!this._map) this._init();\r\n }\r\n });\r\n\r\n i18n.setLang(options.language, options.i18n);\r\n\r\n const defaultOptions = getDefaultOptions();\r\n\r\n this._options = deepObjectAssign(defaultOptions, options);\r\n\r\n // By default, the first layer is ready to accept new draws\r\n setActiveLayerToInsertEls(this._options.layers[0]);\r\n\r\n this._controlWidgetToolsDiv = controlElement;\r\n this._controlWidgetToolsDiv.className = 'ol-wfst--tools-control';\r\n\r\n this._uploads = new Uploads(this._options);\r\n\r\n this._editFields = new EditFieldsModal(this._options);\r\n }\r\n\r\n /**\r\n * Get all the layers in the ol-wfst instance\r\n * @public\r\n */\r\n getLayers(): Array<WfsLayer | WmsLayer> {\r\n return Object.values(getStoredMapLayers());\r\n }\r\n\r\n /**\r\n * Get a layer\r\n * @public\r\n */\r\n getLayerByName(layerName = ''): WfsLayer | WmsLayer {\r\n const layers = getStoredMapLayers();\r\n if (layerName && layerName in layers) {\r\n return layers[layerName];\r\n }\r\n return null;\r\n }\r\n\r\n /**\r\n * Connect to the GeoServer and retrieve metadata about the service (GetCapabilities).\r\n * Get each layer specs (DescribeFeatureType) and create the layers and map controls.\r\n * @fires describeFeatureType\r\n * @private\r\n */\r\n private async _initMapAndLayers(): Promise<void> {\r\n try {\r\n const layers = this._options.layers;\r\n\r\n if (layers.length) {\r\n let layerRendered = 0;\r\n let layersNumber = 0; // Only count visibles\r\n\r\n showLoading();\r\n\r\n const layerInitPromises: Promise<void>[] = [];\r\n\r\n layers.forEach((layer) => {\r\n if (layer.isVisible(this._view)) layersNumber++;\r\n\r\n layer.on('layerRendered', () => {\r\n layerRendered++;\r\n if (layerRendered >= layersNumber) {\r\n // run only once\r\n if (!this._initialized) {\r\n this.dispatchEvent('load');\r\n this._initialized = true;\r\n }\r\n showLoading(false);\r\n }\r\n });\r\n\r\n layer.on('change:describeFeatureType', () => {\r\n if (this._options.showControl && layers.length > 1) {\r\n const domEl = this._layersControl.addLayerEl(layer);\r\n\r\n layer.on('change:isVisible', () => {\r\n const layerNotVisible =\r\n 'ol-wfst--layer-not-visible';\r\n\r\n const visible = layer.isVisibleByZoom();\r\n if (visible)\r\n domEl.classList.remove(layerNotVisible);\r\n else domEl.classList.add(layerNotVisible);\r\n });\r\n }\r\n layer.set(\r\n BaseLayerProperty.ISVISIBLE,\r\n this._currentZoom > layer.getMinZoom()\r\n );\r\n\r\n this.dispatchEvent(\r\n new WfstEvent({\r\n type: 'describeFeatureType',\r\n layer: layer,\r\n data: layer.getDescribeFeatureType()\r\n })\r\n );\r\n });\r\n\r\n layerInitPromises.push(layer._init());\r\n\r\n this._map.addLayer(layer);\r\n\r\n setMapLayers({\r\n [layer.get(BaseLayerProperty.NAME)]: layer\r\n });\r\n });\r\n\r\n this._createMapElements(\r\n this._options.showControl,\r\n this._options.active\r\n );\r\n\r\n // Show the loading bar until every layer has resolved its\r\n // DescribeFeatureType (success or error), with a fail-safe\r\n // timeout so it never stays visible on a dead connection.\r\n await Promise.race([\r\n Promise.all(layerInitPromises),\r\n new Promise<void>((resolve) =>\r\n setTimeout(resolve, INIT_LOADING_TIMEOUT)\r\n )\r\n ]);\r\n showLoading(false);\r\n }\r\n } catch (err) {\r\n showLoading(false);\r\n showError(err.message, err);\r\n }\r\n }\r\n\r\n /**\r\n * @private\r\n */\r\n private _init(): void {\r\n this._map = super.getMap();\r\n this._view = this._map.getView();\r\n this._viewport = this._map.getViewport();\r\n\r\n this._map.getTargetElement().classList.add('ol-wfst--map');\r\n\r\n setMap(this._map);\r\n\r\n //@ts-expect-error\r\n this._uploads.on('addedFeatures', ({ features }) => {\r\n const layer = getActiveLayerToInsertEls();\r\n layer.insertFeatures(features);\r\n });\r\n\r\n //@ts-expect-error\r\n this._uploads.on('loadedFeatures', ({ features }) => {\r\n this.activateEditMode();\r\n const editLayerSource = getEditLayer().getSource();\r\n\r\n editLayerSource.addFeatures(features);\r\n\r\n this._view.fit(editLayerSource.getExtent(), {\r\n size: this._map.getSize(),\r\n maxZoom: 21,\r\n padding: [100, 100, 100, 100]\r\n });\r\n });\r\n\r\n // @ts-expect-error\r\n this._editFields.on('save', async ({ feature, features }) => {\r\n const list: Feature<Geometry>[] = features || [feature];\r\n const ok = await this._transactEditList(list);\r\n if (ok) {\r\n Array.from(list).forEach((f) =>\r\n this._collectionModify.remove(f)\r\n );\r\n }\r\n });\r\n\r\n // @ts-expect-error\r\n this._editFields.on('delete', ({ features }) => {\r\n this._deleteFeature(features, true);\r\n });\r\n\r\n this._addMapEvents();\r\n this._addMiddleButtonPan();\r\n\r\n initModal(this._options['modal']);\r\n\r\n this._layersWidgetDiv = document.createElement('div');\r\n this._layersWidgetDiv.className = 'ol-wfst--layers-control';\r\n this._layersWidgetDiv.append(initLoading());\r\n this._map.addControl(\r\n new Control({\r\n element: this._layersWidgetDiv\r\n })\r\n );\r\n\r\n this._initMapAndLayers();\r\n }\r\n\r\n /**\r\n * Create the edit layer to allow modify elements, add interactions,\r\n * map controls and keyboard handlers.\r\n *\r\n * @param showControl\r\n * @param active\r\n * @private\r\n */\r\n private async _createMapElements(\r\n showControl: boolean,\r\n active: boolean\r\n ): Promise<void> {\r\n // VectorLayer to store features on editing and inserting\r\n this._prepareEditLayer();\r\n\r\n this._addInteractions();\r\n this._addInteractionHandlers();\r\n\r\n this._prepareHighlightLayer();\r\n this._addQueryInteraction();\r\n\r\n if (showControl) {\r\n this._addMapControl();\r\n\r\n if (this._options.fullscreen) {\r\n this._map.addControl(\r\n new FullScreen({\r\n className: 'ol-wfst--fullscreen',\r\n tipLabel: i18n.I18N.labels.fullscreen,\r\n label: fullscreenSvg(),\r\n labelActive: fullscreenExitSvg()\r\n })\r\n );\r\n }\r\n }\r\n\r\n // By default, init in edit mode\r\n this.activateEditMode(active);\r\n }\r\n\r\n /**\r\n * @private\r\n */\r\n private _addInteractions(): void {\r\n /**\r\n * Select the wfs feature already downloaded\r\n * @private\r\n */\r\n const prepareWfsInteraction = () => {\r\n this._collectionModify = new Collection();\r\n\r\n // Interaction to select wfs layer elements\r\n this._interactionWfsSelect = new Select({\r\n hitTolerance: 10,\r\n style: (feature: Feature<Geometry>) => styleFunction(feature),\r\n toggleCondition: shiftKeyOnly, // Allow adding features to the selection with shift\r\n filter: (feature, layer) => {\r\n return (\r\n getMode() !== Modes.Edit &&\r\n getMode() !== Modes.Query &&\r\n layer &&\r\n layer instanceof WfsLayer &&\r\n layer === getActiveLayerToInsertEls()\r\n );\r\n }\r\n });\r\n\r\n this._map.addInteraction(this._interactionWfsSelect);\r\n\r\n this._interactionWfsSelect.on(\r\n 'select',\r\n ({ selected, deselected, mapBrowserEvent }) => {\r\n const coordinate = mapBrowserEvent.coordinate;\r\n\r\n // Clear hover to avoid keeping the style on the selected feature\r\n this._clearHoverState();\r\n\r\n if (getMode() === Modes.Query) {\r\n return;\r\n }\r\n\r\n if (selected.length) {\r\n selected.forEach((feature) => {\r\n if (!isFeatureEdited(feature)) {\r\n // Remove the feature from the original layer\r\n const layer =\r\n this._interactionWfsSelect.getLayer(\r\n feature\r\n );\r\n layer.getSource().removeFeature(feature);\r\n this._addFeatureToEditMode(\r\n feature,\r\n coordinate,\r\n layer.get(BaseLayerProperty.NAME)\r\n );\r\n }\r\n });\r\n\r\n this._lockSelectedFeatures();\r\n }\r\n\r\n if (deselected.length) {\r\n if (getMode() !== Modes.Edit) {\r\n deselected.forEach((feature) => {\r\n // Trigger deselect\r\n // This is necessary for those times where two features overlap.\r\n this._collectionModify.remove(feature);\r\n });\r\n }\r\n }\r\n }\r\n );\r\n };\r\n\r\n /**\r\n * Call the geoserver to get the clicked feature\r\n * @private\r\n */\r\n const prepareWmsInteraction = (): void => {\r\n // Interaction to allow select features in the edit layer\r\n this._interactionSelectModify = new Select({\r\n style: (feature: Feature<Geometry>) => styleFunction(feature),\r\n layers: [getEditLayer()],\r\n toggleCondition: shiftKeyOnly, // Allow adding features with shift\r\n removeCondition: () => (getMode() === Modes.Edit ? true : false) // Prevent deselect on clicking outside the feature\r\n });\r\n\r\n this._map.addInteraction(this._interactionSelectModify);\r\n\r\n // When clicking without shift, replace the current selection: remove\r\n // any previously selected and not re-selected feature from the edit list\r\n this._interactionSelectModify.on(\r\n 'select',\r\n ({ selected, mapBrowserEvent }) => {\r\n if (\r\n !selected.length ||\r\n !mapBrowserEvent ||\r\n shiftKeyOnly(mapBrowserEvent)\r\n ) {\r\n return;\r\n }\r\n\r\n const selectedSet = new Set(selected);\r\n Array.from(this._collectionModify.getArray()).forEach(\r\n (feature) => {\r\n if (!selectedSet.has(feature)) {\r\n this._collectionModify.remove(feature);\r\n }\r\n }\r\n );\r\n }\r\n );\r\n\r\n this._collectionModify =\r\n this._interactionSelectModify.getFeatures();\r\n\r\n this._keyClickWms = this._map.on(\r\n this._options.evtType || 'singleclick',\r\n async (evt: MapBrowserEvent<PointerEvent>) => {\r\n if (this._map.hasFeatureAtPixel(evt.pixel)) {\r\n return;\r\n }\r\n\r\n // Only get other features if editmode is disabled\r\n if (getMode() !== Modes.Edit && getMode() !== Modes.Query) {\r\n const layer = getActiveLayerToInsertEls();\r\n\r\n // If layer is hidden or is a wfs, skip\r\n if (\r\n !layer.getVisible() ||\r\n !layer.isVisibleByZoom() ||\r\n layer instanceof WfsLayer\r\n ) {\r\n return;\r\n }\r\n\r\n const features =\r\n await layer._getFeaturesByClickEvent(evt);\r\n\r\n if (!features?.length) {\r\n return;\r\n }\r\n\r\n // Without shift, replace the current selection\r\n if (!shiftKeyOnly(evt)) {\r\n Array.from(\r\n this._collectionModify.getArray()\r\n ).forEach((feature) => {\r\n this._collectionModify.remove(feature);\r\n });\r\n }\r\n\r\n this._addFeatureToEditMode(\r\n features[0],\r\n evt.coordinate,\r\n layer.get(BaseLayerProperty.NAME)\r\n );\r\n\r\n this._lockSelectedFeatures();\r\n }\r\n }\r\n );\r\n };\r\n\r\n if (this._options.layers.find((layer) => layer instanceof WfsLayer)) {\r\n prepareWfsInteraction();\r\n }\r\n\r\n if (this._options.layers.find((layer) => layer instanceof WmsLayer)) {\r\n prepareWmsInteraction();\r\n }\r\n\r\n this._interactionModify = new Modify({\r\n style: (feature: Feature<Geometry>) => {\r\n if (getMode() === Modes.Edit) {\r\n return editVertexStyles(feature.get('existing') === true);\r\n } else {\r\n return;\r\n }\r\n },\r\n features: this._collectionModify,\r\n condition: (evt) => {\r\n return primaryAction(evt) && getMode() === Modes.Edit;\r\n }\r\n });\r\n\r\n this._map.addInteraction(this._interactionModify);\r\n\r\n this._interactionSnap = new Snap({\r\n source: getEditLayer().getSource()\r\n });\r\n this._map.addInteraction(this._interactionSnap);\r\n\r\n this._addSelectionInteractions();\r\n }\r\n\r\n /**\r\n * Interactions to select features by drawing a box (DragBox) or a freehand\r\n * polygon (freehand Draw lasso). The selected features are added to the\r\n * edit list, keeping the same behaviour as the single click selection.\r\n *\r\n * @private\r\n */\r\n private _addSelectionInteractions(): void {\r\n const selectionStyle = new Style({\r\n fill: new Fill({\r\n color: 'rgba(255, 200, 0, 0.1)'\r\n }),\r\n stroke: new Stroke({\r\n color: '#ffc800',\r\n width: 2,\r\n lineDash: [6, 4]\r\n })\r\n });\r\n\r\n // Box selection (dragging a rectangle)\r\n this._interactionDragBox = new DragBox({\r\n condition: (evt) =>\r\n primaryAction(evt) && this._isSelectMode(SelectionMode.Box),\r\n className: 'ol-wfst--dragbox'\r\n });\r\n\r\n this._interactionDragBox.on('boxend', (evt) => {\r\n if (!this._isSelectMode(SelectionMode.Box)) {\r\n return;\r\n }\r\n\r\n // Without shift, replace the current selection\r\n if (!(evt.mapBrowserEvent.originalEvent as MouseEvent).shiftKey) {\r\n this._collectionModify.clear();\r\n }\r\n\r\n this._selectByGeometry(this._interactionDragBox.getGeometry());\r\n });\r\n\r\n this._map.addInteraction(this._interactionDragBox);\r\n\r\n // Freehand selection (holding the mouse to draw a closed lasso)\r\n this._interactionFreehandSelect = new Draw({\r\n type: GeometryType.Polygon,\r\n freehand: true,\r\n stopClick: true,\r\n style: selectionStyle,\r\n condition: (evt) =>\r\n primaryAction(evt) && this._isSelectMode(SelectionMode.Freehand)\r\n });\r\n\r\n this._interactionFreehandSelect.on('drawend', (evt) => {\r\n if (!this._isSelectMode(SelectionMode.Freehand)) {\r\n return;\r\n }\r\n\r\n const geometry = evt.feature.getGeometry() as Polygon;\r\n const ring = geometry ? geometry.getCoordinates()[0] : [];\r\n\r\n // Ignore degenerate lassos (a simple click without dragging)\r\n if (!ring.length || ring.length < 4 || geometry.getArea() <= 0) {\r\n return;\r\n }\r\n\r\n // Without shift, replace the current selection\r\n if (!this._shiftPressed) {\r\n this._collectionModify.clear();\r\n }\r\n\r\n this._selectByGeometry(geometry);\r\n });\r\n\r\n this._map.addInteraction(this._interactionFreehandSelect);\r\n\r\n this._refreshSelectionInteractions();\r\n }\r\n\r\n /**\r\n * Whether a selection tool mode is currently usable: only outside the\r\n * edit/draw modes.\r\n *\r\n * @param mode\r\n * @private\r\n */\r\n private _isSelectMode(mode: SelectionMode): boolean {\r\n return getMode() === null && getSelectionMode() === mode;\r\n }\r\n\r\n /**\r\n * Enable/disable the box and freehand selection interactions according to\r\n * the current selection tool and map mode.\r\n *\r\n * @private\r\n */\r\n private _refreshSelectionInteractions(): void {\r\n const active = getMode() === null;\r\n\r\n if (this._interactionDragBox) {\r\n this._interactionDragBox.setActive(\r\n active && getSelectionMode() === SelectionMode.Box\r\n );\r\n }\r\n\r\n if (this._interactionFreehandSelect) {\r\n this._interactionFreehandSelect.setActive(\r\n active && getSelectionMode() === SelectionMode.Freehand\r\n );\r\n }\r\n }\r\n\r\n /**\r\n * Select the features that intersect the given polygon on the active layer\r\n * and add them to the edit list. WFS features are picked from the already\r\n * loaded source, while WMS features are requested to the GeoServer with a\r\n * WFS GetFeature INTERSECTS filter.\r\n *\r\n * @param geometry\r\n * @private\r\n */\r\n private async _selectByGeometry(geometry: Polygon): Promise<void> {\r\n const layer = getActiveLayerToInsertEls();\r\n\r\n if (!layer || !layer.getVisible() || !layer.isVisibleByZoom()) {\r\n showError(i18n.I18N.errors.layerNotVisible);\r\n return;\r\n }\r\n\r\n let features: Feature<Geometry>[];\r\n\r\n if (layer instanceof WfsLayer) {\r\n const candidates = layer\r\n .getSource()\r\n .getFeaturesInExtent(geometry.getExtent());\r\n\r\n // The extent is only a bounding box; for the freehand lasso be\r\n // more precise and keep the features whose vertices fall inside it\r\n if (getSelectionMode() === SelectionMode.Freehand) {\r\n features = candidates.filter((feature) => {\r\n const featureGeom = feature.getGeometry() as SimpleGeometry;\r\n if (!featureGeom) {\r\n return false;\r\n }\r\n const flatCoords = featureGeom.getFlatCoordinates();\r\n const stride = featureGeom.getStride();\r\n for (let i = 0; i < flatCoords.length; i += stride) {\r\n if (\r\n geometry.intersectsCoordinate([\r\n flatCoords[i],\r\n flatCoords[i + 1]\r\n ])\r\n ) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n });\r\n } else {\r\n features = candidates;\r\n }\r\n } else if (layer instanceof WmsLayer) {\r\n features = await layer._getFeaturesInGeometry(geometry);\r\n }\r\n\r\n if (features) {\r\n this._selectFeatures(features);\r\n }\r\n }\r\n\r\n /**\r\n * Add the given features to the edit mode:\r\n * remove them from their original layer and push them into the edit\r\n * collection so they can be modified/deleted like the ones selected\r\n * with a single click.\r\n *\r\n * @param features\r\n * @private\r\n */\r\n private _selectFeatures(features: Feature<Geometry>[]): void {\r\n if (!features || !features.length) {\r\n return;\r\n }\r\n\r\n const layer = getActiveLayerToInsertEls();\r\n const layerName = layer.get(BaseLayerProperty.NAME);\r\n\r\n const selectedIds = new Set(\r\n this._collectionModify.getArray().map((feature) => feature.getId())\r\n );\r\n\r\n features.forEach((feature) => {\r\n if (isFeatureEdited(feature) || selectedIds.has(feature.getId())) {\r\n return;\r\n }\r\n\r\n // WFS features are stored in their layer source: remove them from\r\n // there while they are being edited\r\n if (\r\n layer instanceof WfsLayer &&\r\n layer.getSource().hasFeature(feature)\r\n ) {\r\n layer.getSource().removeFeature(feature);\r\n }\r\n\r\n this._addFeatureToEditMode(feature, null, layerName);\r\n });\r\n\r\n this._lockSelectedFeatures();\r\n }\r\n\r\n /**\r\n * Layer to store temporary the elements to be edited\r\n * @private\r\n */\r\n private _prepareEditLayer(): void {\r\n this._map.addLayer(getEditLayer());\r\n }\r\n\r\n /**\r\n * Create the dedicated layer used to highlight the queried feature, so\r\n * the source layers keep their own rendering untouched.\r\n * @private\r\n */\r\n private _prepareHighlightLayer(): void {\r\n this._highlightSource = new VectorSource();\r\n this._highlightLayer = new VectorLayer({\r\n source: this._highlightSource,\r\n style: (feature: Feature<Geometry>) => queryStyleFunction(feature),\r\n zIndex: 100\r\n });\r\n this._map.addLayer(this._highlightLayer);\r\n }\r\n\r\n /**\r\n * Listen for clicks while the query mode is active: get the clicked\r\n * feature of the active layer (from the already loaded source for WFS,\r\n * or through a GetFeatureInfo request for WMS), highlight it and show\r\n * its attributes in a popup.\r\n * @private\r\n */\r\n private _addQueryInteraction(): void {\r\n this._keyClickQuery = this._map.on(\r\n this._options.evtType || 'singleclick',\r\n async (evt: MapBrowserEvent<PointerEvent>) => {\r\n if (getMode() !== Modes.Query) {\r\n return;\r\n }\r\n\r\n const layer = getActiveLayerToInsertEls();\r\n\r\n // Skip hidden layers\r\n if (!layer.getVisible() || !layer.isVisibleByZoom()) {\r\n return;\r\n }\r\n\r\n let feature: Feature<Geometry> = null;\r\n\r\n if (layer instanceof WfsLayer) {\r\n const featuresAtPixel = this._map.getFeaturesAtPixel(\r\n evt.pixel,\r\n {\r\n hitTolerance: 10,\r\n layerFilter: (candidate) => candidate === layer\r\n }\r\n );\r\n if (featuresAtPixel && featuresAtPixel.length) {\r\n feature = featuresAtPixel[0] as Feature<Geometry>;\r\n }\r\n } else if (layer instanceof WmsLayer) {\r\n const features = await layer._getFeaturesByClickEvent(evt);\r\n if (features?.length) {\r\n feature = features[0];\r\n }\r\n }\r\n\r\n // Click on empty space: clear the previous result\r\n if (!feature) {\r\n this._clearQueryResult();\r\n return;\r\n }\r\n\r\n this._showQueryResult(feature, layer, evt.coordinate);\r\n }\r\n );\r\n }\r\n\r\n /**\r\n * Highlight the given feature and attach a popup with its attributes.\r\n * @param feature\r\n * @param layer\r\n * @param coordinate\r\n * @private\r\n */\r\n private _showQueryResult(\r\n feature: Feature<Geometry>,\r\n layer: WfsLayer | WmsLayer,\r\n coordinate: Coordinate\r\n ): void {\r\n this._clearQueryResult();\r\n\r\n this._highlightSource.addFeature(feature);\r\n\r\n this._queryOverlay = new QueryOverlay(feature, coordinate, layer);\r\n // @ts-expect-error\r\n this._queryOverlay.on('close', () => {\r\n this._clearQueryResult();\r\n });\r\n this._map.addOverlay(this._queryOverlay);\r\n }\r\n\r\n /**\r\n * Remove the query popup overlay if any.\r\n * @private\r\n */\r\n private _removeQueryOverlay(): void {\r\n if (this._queryOverlay) {\r\n this._map.removeOverlay(this._queryOverlay);\r\n this._queryOverlay = null;\r\n return;\r\n }\r\n\r\n const overlay = this._map.getOverlayById(this._queryOverlayId);\r\n if (overlay) {\r\n this._map.removeOverlay(overlay);\r\n }\r\n }\r\n\r\n /**\r\n * Clear the highlight and remove the query popup.\r\n * @private\r\n */\r\n private _clearQueryResult(): void {\r\n this._highlightSource?.clear();\r\n this._removeQueryOverlay();\r\n }\r\n\r\n /**\r\n * Activate/deactivate the query mode: while it is active, clicking a\r\n * feature of the active layer shows its info in a popup instead of\r\n * selecting it for editing.\r\n *\r\n * @param bool\r\n * @public\r\n */\r\n activateQueryMode(bool = true): void {\r\n if (bool) {\r\n // While a geometry/fields edit is in progress the tools toolbar is\r\n // hidden)Skip, so the only way out is Apply, Discard or Delete.\r\n // Guard here too so programmatic calls cannot leave the edit mode.\r\n if (getMode() === Modes.Edit) {\r\n return;\r\n }\r\n\r\n // If features are merely selected (not being edited), deselect\r\n // them without transacting: each removal restores the feature to\r\n // its original layer and turns the edit mode off.\r\n if (this._collectionModify.getLength()) {\r\n this._collectionModify\r\n .getArray()\r\n .slice()\r\n .forEach((feature) => {\r\n this._collectionModify.remove(feature);\r\n });\r\n }\r\n\r\n // Leave any draw interaction active\r\n if (this._interactionDraw) {\r\n this._map.removeInteraction(this._interactionDraw);\r\n this._viewport.classList.remove('draw-mode');\r\n }\r\n\r\n resetStateButtons();\r\n deactivateSelectModeButton();\r\n activateQueryButton();\r\n this._clearHoverState();\r\n\r\n activateMode(Modes.Query);\r\n\r\n // Disable the edit selection interactions while querying\r\n if (this._interactionSelectModify) {\r\n this._interactionSelectModify.setActive(false);\r\n }\r\n if (this._interactionWfsSelect) {\r\n this._interactionWfsSelect.setActive(false);\r\n }\r\n this._interactionModify?.setActive(false);\r\n this._syncExtendLineOverlays();\r\n this._refreshSelectionInteractions();\r\n } else {\r\n activateMode(null);\r\n deactivateQueryButton();\r\n activateSelectModeButton(getSelectionMode());\r\n\r\n if (this._interactionSelectModify) {\r\n this._interactionSelectModify.setActive(true);\r\n }\r\n if (this._interactionWfsSelect) {\r\n this._interactionWfsSelect.setActive(true);\r\n }\r\n this._interactionModify?.setActive(true);\r\n\r\n this._refreshSelectionInteractions();\r\n }\r\n\r\n this._clearQueryResult();\r\n }\r\n\r\n /**\r\n * @private\r\n */\r\n private _addMapEvents(): void {\r\n /**\r\n * @private\r\n */\r\n const keyboardEvents = (): void => {\r\n document.addEventListener('keydown', ({ key }) => {\r\n const inputFocus = document.querySelector('input:focus');\r\n if (inputFocus) {\r\n return;\r\n }\r\n if (key === 'Delete') {\r\n const selectedFeatures = this._collectionModify.getArray();\r\n if (selectedFeatures.length) {\r\n this._deleteFeature(selectedFeatures, true);\r\n }\r\n }\r\n });\r\n };\r\n\r\n keyboardEvents();\r\n\r\n /**\r\n * Change the cursor to a pointing hand and highlight the feature\r\n * when hovering over a WFS feature of the active layer.\r\n * @private\r\n */\r\n const pointerMoveHandler = (\r\n evt: MapBrowserEvent<PointerEvent>\r\n ): void => {\r\n if (evt.dragging) {\r\n return;\r\n }\r\n\r\n // In edit mode, give pointer feedback on the editable\r\n // vertices/segments\r\n if (getMode() === Modes.Edit) {\r\n this._clearHoverState();\r\n this._updateEditCursor(evt);\r\n return;\r\n }\r\n\r\n // Only show the hover outside edit and draw modes\r\n if (getMode() !== null) {\r\n this._clearHoverState();\r\n return;\r\n }\r\n\r\n const layer = getActiveLayerToInsertEls();\r\n\r\n // Hover only works on visible WFS layers\r\n if (\r\n !layer ||\r\n !layer.getVisible() ||\r\n !layer.isVisibleByZoom() ||\r\n !(layer instanceof WfsLayer)\r\n ) {\r\n this._clearHoverState();\r\n return;\r\n }\r\n\r\n const features = this._map.getFeaturesAtPixel(evt.pixel, {\r\n hitTolerance: 10,\r\n layerFilter: (candidate) => candidate === layer\r\n });\r\n\r\n if (features && features.length) {\r\n const feature = features[0] as Feature<Geometry>;\r\n\r\n if (feature !== this._hoveredFeature) {\r\n this._clearHoverState();\r\n this._hoveredFeature = feature;\r\n this._hoveredFeature.setStyle((f) =>\r\n styleFunction(f as Feature<Geometry>, true)\r\n );\r\n }\r\n\r\n if (this._viewport.style.cursor !== 'pointer') {\r\n this._viewport.style.cursor = 'pointer';\r\n }\r\n } else {\r\n this._clearHoverState();\r\n }\r\n };\r\n\r\n this._map.on('pointermove', pointerMoveHandler);\r\n\r\n // Store the shift state when a gesture starts, so the freehand\r\n // selection can decide between adding or replacing the selection\r\n this._viewport.addEventListener('pointerdown', (evt: PointerEvent) => {\r\n this._shiftPressed = evt.shiftKey;\r\n });\r\n\r\n // Clear the hover before firing a click, otherwise the Select interaction\r\n // would capture the hover style as the original style of the feature and\r\n // restore it on deselect, leaving the highlight permanently enabled.\r\n this._viewport.addEventListener('pointerdown', () =>\r\n this._clearHoverState()\r\n );\r\n\r\n this._viewport.addEventListener(\r\n 'pointerleave',\r\n () => this._clearHoverState(),\r\n { once: false }\r\n );\r\n\r\n this._map.on('moveend', (): void => {\r\n this._currentZoom = this._view.getZoom();\r\n\r\n if (this._currentZoom !== this._lastZoom) {\r\n const layers = getStoredMapLayers();\r\n\r\n Object.keys(layers).forEach((key) => {\r\n const layer = layers[key];\r\n if (this._currentZoom > layer.getMinZoom()) {\r\n // Show the layers\r\n if (!layer.get(BaseLayerProperty.ISVISIBLE)) {\r\n layer.set(BaseLayerProperty.ISVISIBLE, true);\r\n }\r\n } else {\r\n // Hide the layer\r\n if (layer.get(BaseLayerProperty.ISVISIBLE)) {\r\n layer.set(BaseLayerProperty.ISVISIBLE, false);\r\n }\r\n }\r\n });\r\n\r\n this._lastZoom = this._currentZoom;\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Allow panning with the middle mouse button at all times, even when the\r\n * draw/freehand/box interactions are consuming the left button. The\r\n * middle pointerdown is intercepted in the capture phase so OpenLayers\r\n * never processes it and the active tool is not affected.\r\n *\r\n * @private\r\n */\r\n private _addMiddleButtonPan(): void {\r\n const viewport = this._viewport;\r\n\r\n let panning = false;\r\n let lastX = 0;\r\n let lastY = 0;\r\n\r\n const isMiddleButton = (evt: PointerEvent): boolean =>\r\n evt.pointerType === 'mouse' && evt.button === 1;\r\n\r\n const stopPanning = (): void => {\r\n panning = false;\r\n };\r\n\r\n viewport.addEventListener(\r\n 'pointerdown',\r\n (evt: PointerEvent) => {\r\n if (!isMiddleButton(evt)) {\r\n return;\r\n }\r\n\r\n evt.preventDefault();\r\n evt.stopPropagation();\r\n\r\n viewport.setPointerCapture(evt.pointerId);\r\n panning = true;\r\n lastX = evt.clientX;\r\n lastY = evt.clientY;\r\n\r\n if (this._view.getAnimating()) {\r\n this._view.cancelAnimations();\r\n }\r\n },\r\n true\r\n );\r\n\r\n viewport.addEventListener('pointermove', (evt: PointerEvent) => {\r\n if (!panning) {\r\n return;\r\n }\r\n\r\n evt.preventDefault();\r\n\r\n const delta = [lastX - evt.clientX, evt.clientY - lastY];\r\n lastX = evt.clientX;\r\n lastY = evt.clientY;\r\n\r\n const resolution = this._view.getResolution();\r\n const rotation = this._view.getRotation();\r\n const cosAngle = Math.cos(rotation);\r\n const sinAngle = Math.sin(rotation);\r\n\r\n const x = (delta[0] * cosAngle - delta[1] * sinAngle) * resolution;\r\n const y = (delta[1] * cosAngle + delta[0] * sinAngle) * resolution;\r\n\r\n this._view.adjustCenterInternal([x, y]);\r\n });\r\n\r\n const endPan = (): void => {\r\n if (!panning) {\r\n return;\r\n }\r\n stopPanning();\r\n };\r\n\r\n viewport.addEventListener('pointerup', endPan);\r\n viewport.addEventListener('pointercancel', endPan);\r\n }\r\n\r\n /**\r\n * Add map handlers\r\n * @private\r\n */\r\n private _addInteractionHandlers(): void {\r\n // When a feature is modified, add this to a list.\r\n // This prevent events fired on select and deselect features that has no changes and should\r\n // not be updated in the geoserver\r\n this._interactionModify.on('modifyend', (evt) => {\r\n evt.features.forEach((feature) => {\r\n addFeatureToEditedList(feature);\r\n });\r\n super.dispatchEvent(evt);\r\n });\r\n\r\n this._interactionModify.on('modifystart', (evt) => {\r\n super.dispatchEvent(evt);\r\n });\r\n\r\n // Keep the \"continue drawing\" buttons glued to the line endpoints\r\n // @ts-expect-error - 'modify' is a valid Modify event not typed in the `on` signature\r\n this._interactionModify.on('modify', () => {\r\n this._updateExtendOverlayPositions();\r\n });\r\n\r\n this._onDeselectFeatureEvent();\r\n this._onRemoveFeatureEvent();\r\n }\r\n\r\n /**\r\n * Add the widget on the map to allow change the tools and select active layers\r\n * @private\r\n */\r\n private _addMapControl(): void {\r\n this._layersControl = new LayersControl(\r\n this._options.showUpload ? this._uploads : null,\r\n this._options.uploadFormats\r\n );\r\n\r\n // @ts-expect-error\r\n this._layersControl.on('drawMode', () => {\r\n if (getMode() === Modes.Query) {\r\n this.activateQueryMode(false);\r\n }\r\n\r\n if (getMode() === Modes.Draw) {\r\n resetStateButtons();\r\n this.activateEditMode();\r\n } else {\r\n const activeLayer = getActiveLayerToInsertEls();\r\n\r\n if (!activeLayer.isVisibleByZoom()) {\r\n showError(i18n.I18N.errors.layerNotVisible);\r\n } else {\r\n this.activateDrawMode(getActiveLayerToInsertEls());\r\n }\r\n }\r\n });\r\n\r\n // @ts-expect-error\r\n this._layersControl.on('changeGeom', () => {\r\n if (getMode() === Modes.Draw) {\r\n this.activateDrawMode(getActiveLayerToInsertEls());\r\n }\r\n });\r\n\r\n // @ts-expect-error\r\n this._layersControl.on('changeLayer', () => {\r\n if (getMode() === Modes.Draw) {\r\n this.activateDrawMode(getActiveLayerToInsertEls());\r\n }\r\n });\r\n\r\n (\r\n [\r\n ['selectModeSingle', SelectionMode.Single],\r\n ['selectModeBox', SelectionMode.Box],\r\n ['selectModeFreehand', SelectionMode.Freehand]\r\n ] as Array<[string, SelectionMode]>\r\n ).forEach(([evtName, mode]) => {\r\n // @ts-expect-error\r\n this._layersControl.on(evtName, () => {\r\n // Leaving the draw mode when a select tool is chosen\r\n if (getMode() === Modes.Draw) {\r\n resetStateButtons();\r\n this.activateEditMode();\r\n }\r\n\r\n // Leaving the query mode when a select tool is chosen\r\n if (getMode() === Modes.Query) {\r\n this.activateQueryMode(false);\r\n }\r\n\r\n setSelectionMode(mode);\r\n activateSelectModeButton(mode);\r\n this._refreshSelectionInteractions();\r\n });\r\n });\r\n\r\n // @ts-expect-error\r\n this._layersControl.on('queryMode', () => {\r\n this.activateQueryMode(getMode() !== Modes.Query);\r\n });\r\n\r\n const controlEl = this._layersControl.render();\r\n\r\n this._selectDraw = controlEl.querySelector(\r\n '.wfst--tools-control--select-draw'\r\n );\r\n\r\n this._controlWidgetToolsDiv.append(\r\n controlEl.querySelector('.wfst--tools-control--head')\r\n );\r\n if (this._options.layers.length > 1) {\r\n this._layersWidgetDiv.append(\r\n controlEl.querySelector('.wfst--tools-control--select-layers')\r\n );\r\n }\r\n }\r\n\r\n /**\r\n *\r\n * @param feature\r\n * @private\r\n */\r\n private _deselectEditFeature(feature: FeatureLike): void {\r\n this._removeOverlayHelper(feature);\r\n }\r\n\r\n /**\r\n *\r\n * @param feature\r\n * @param layerName\r\n * @private\r\n */\r\n private _restoreFeatureToLayer(\r\n feature: Feature<Geometry>,\r\n layerName?: string\r\n ): void {\r\n layerName = layerName || feature.get('_layerName_');\r\n const layer = getStoredMapLayers()[layerName];\r\n // Reset any per-feature style (e.g. hover) before returning the feature\r\n // to its layer, so it renders with the layer's default style.\r\n feature.setStyle(undefined);\r\n (layer.getSource() as VectorSource).addFeature(feature);\r\n }\r\n\r\n /**\r\n * @param feature\r\n * @private\r\n */\r\n private _removeFeatureFromTmpLayer(feature: Feature<Geometry>): void {\r\n // Remove element from the Layer\r\n getEditLayer().getSource().removeFeature(feature);\r\n }\r\n\r\n /**\r\n * Trigger on deselecting a feature from in the Edit layer\r\n *\r\n * @private\r\n */\r\n private _onDeselectFeatureEvent(): void {\r\n const checkIfFeatureIsChanged = (feature: Feature<Geometry>): void => {\r\n const layerName = feature.get('_layerName_');\r\n\r\n const layer = this._options.layers.find(\r\n (layer) => layer.get(BaseLayerProperty.NAME) === layerName\r\n );\r\n\r\n if (layer instanceof WfsLayer) {\r\n this._interactionWfsSelect.getFeatures().remove(feature);\r\n }\r\n\r\n if (isFeatureEdited(feature)) {\r\n layer.transactFeatures(TransactionType.Update, feature);\r\n } else {\r\n // Si es wfs y el elemento no tuvo cambios, lo devolvemos a la layer original\r\n if (layer instanceof WfsLayer) {\r\n this._restoreFeatureToLayer(feature, layerName);\r\n }\r\n this._removeFeatureFromTmpLayer(feature);\r\n }\r\n };\r\n\r\n if (this._keySelectBound) {\r\n return;\r\n }\r\n this._keySelectBound = true;\r\n\r\n // This is fired when a feature is deselected and fires the transaction process\r\n if (this._keySelect) {\r\n unByKey(this._keySelect);\r\n }\r\n this._keySelect = this._collectionModify.on('remove', (evt) => {\r\n const feature = evt.element;\r\n\r\n this._deselectEditFeature(feature);\r\n this._syncEditOverlays();\r\n\r\n checkIfFeatureIsChanged(feature);\r\n\r\n this._editModeOff();\r\n });\r\n }\r\n\r\n /**\r\n * Trigger on removing a feature from the Edit layer\r\n *\r\n * @private\r\n */\r\n private _onRemoveFeatureEvent(): void {\r\n // If a feature is removed from the edit layer\r\n this._keyRemove = getEditLayer()\r\n .getSource()\r\n .on('removefeature', (evt) => {\r\n const feature = evt.feature;\r\n\r\n if (!feature.get('_delete_')) {\r\n return;\r\n }\r\n\r\n if (this._keySelect) {\r\n unByKey(this._keySelect);\r\n this._keySelectBound = false;\r\n }\r\n\r\n const layerName = feature.get('_layerName_');\r\n\r\n const ll = this.getLayerByName(layerName);\r\n\r\n ll.transactFeatures(TransactionType.Delete, feature);\r\n\r\n this._deselectEditFeature(feature);\r\n this._editModeOff();\r\n\r\n if (this._keySelect) {\r\n setTimeout(() => {\r\n this._onDeselectFeatureEvent();\r\n }, 150);\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Hide the whole tools toolbar (geometry/draw/select/query buttons and\r\n * the layer selector). It is hidden while a geometry/fields edit is in\r\n * progress so the only way out is Apply, Discard or Delete.\r\n *\r\n * @private\r\n */\r\n private _hideControls(): void {\r\n // While an edit is in progress the tools toolbar and the layers widget\r\n // disappear together: the only controls left on screen are Apply,\r\n // Discard and Delete.\r\n this._controlWidgetToolsDiv.classList.add('ol-wfst--controls--hidden');\r\n this._layersWidgetDiv.classList.add('ol-wfst--controls--hidden');\r\n }\r\n\r\n /**\r\n * Show the tools toolbar again.\r\n *\r\n * @private\r\n */\r\n private _showControls(): void {\r\n this._controlWidgetToolsDiv.classList.remove(\r\n 'ol-wfst--controls--hidden'\r\n );\r\n this._layersWidgetDiv.classList.remove('ol-wfst--controls--hidden');\r\n }\r\n\r\n /**\r\n *\r\n * @param features\r\n * @private\r\n */\r\n private _editModeOn(features: Feature<Geometry>[]): void {\r\n features = Array.isArray(features) ? features : [features];\r\n\r\n features.forEach((feature) => {\r\n this._editFeaturesOriginal[String(feature.getId())] =\r\n feature.clone();\r\n });\r\n\r\n activateMode(Modes.Edit);\r\n\r\n // While a geometry/fields edit is in progress the whole tools toolbar\r\n // and the layers widget are hidden together, so the only way out is\r\n // Apply, Discard or Delete\r\n this._hideControls();\r\n\r\n // Show the \"continue drawing\" buttons on the line endpoints\r\n this._syncExtendLineOverlays();\r\n\r\n // To refresh the style\r\n getEditLayer().getSource().changed();\r\n this._refreshSelectionInteractions();\r\n\r\n const multiOverlay = this._map.getOverlayById(this._multiOverlayId);\r\n if (multiOverlay) {\r\n this._map.removeOverlay(multiOverlay);\r\n }\r\n\r\n features.forEach((feature) => {\r\n this._removeOverlayHelper(feature);\r\n });\r\n\r\n this._controlApplyDiscardChanges = new EditControlChangesEl(features);\r\n\r\n this._controlApplyDiscardChanges.on('cancel', (evt) => {\r\n const list: Feature<Geometry>[] = (evt as any).features;\r\n Array.from(list).forEach((feature) => {\r\n const original =\r\n this._editFeaturesOriginal[String(feature.getId())];\r\n if (original) {\r\n feature.setGeometry(original.getGeometry());\r\n }\r\n removeFeatureFromEditList(feature);\r\n this._collectionModify.remove(feature);\r\n });\r\n });\r\n\r\n this._controlApplyDiscardChanges.on('apply', async (evt) => {\r\n showLoading();\r\n const list: Feature<Geometry>[] = (evt as any).features;\r\n const ok = await this._transactEditList(list);\r\n if (ok) {\r\n Array.from(list).forEach((feature) => {\r\n this._collectionModify.remove(feature);\r\n });\r\n }\r\n });\r\n\r\n this._controlApplyDiscardChanges.on('delete', (evt) => {\r\n this._deleteFeature((evt as any).features, true);\r\n });\r\n\r\n this._map.addControl(this._controlApplyDiscardChanges);\r\n }\r\n\r\n /**\r\n * @private\r\n */\r\n private _editModeOff(): void {\r\n // Restore the tools toolbar and the layers widget together\r\n this._showControls();\r\n activateMode(null);\r\n this._destroyExtendLineOverlays();\r\n this._map.removeControl(this._controlApplyDiscardChanges);\r\n this._refreshSelectionInteractions();\r\n }\r\n\r\n /**\r\n * Get the first and last coordinate of every line component of a\r\n * LineString/MultiLineString geometry, including the line components\r\n * nested inside a GeometryCollection. Anything else returns an empty\r\n * array.\r\n *\r\n * @param geometry\r\n * @private\r\n */\r\n private _getLineEndPoints(geometry: Geometry): Array<LineEndPoint> {\r\n const endPoints: LineEndPoint[] = [];\r\n\r\n const appendLine = (\r\n line: LineString | MultiLineString,\r\n collection?: GeometryCollection\r\n ): void => {\r\n if (line instanceof LineString) {\r\n if (line.getCoordinates().length) {\r\n endPoints.push({\r\n first: line.getFirstCoordinate(),\r\n last: line.getLastCoordinate(),\r\n line,\r\n lineIndex: 0,\r\n collection\r\n });\r\n }\r\n return;\r\n }\r\n\r\n line.getCoordinates().forEach((coordinates, lineIndex) => {\r\n if (coordinates.length) {\r\n endPoints.push({\r\n first: coordinates[0],\r\n last: coordinates[coordinates.length - 1],\r\n line,\r\n lineIndex,\r\n collection\r\n });\r\n }\r\n });\r\n };\r\n\r\n // \"getGeometries()\" returns deep clones (see ol GeometryCollection),\r\n // but the extend/merge must work on the actual members.\r\n const collect = (\r\n geometry: Geometry,\r\n collection?: GeometryCollection\r\n ): void => {\r\n if (\r\n geometry instanceof LineString ||\r\n geometry instanceof MultiLineString\r\n ) {\r\n appendLine(geometry, collection);\r\n } else if (geometry instanceof GeometryCollection) {\r\n geometry.getGeometriesArray().forEach((member) => {\r\n collect(member, geometry);\r\n });\r\n }\r\n };\r\n\r\n collect(geometry);\r\n\r\n return endPoints;\r\n }\r\n\r\n /**\r\n * Remove every \"continue drawing\" overlay and abort any active line\r\n * extension draw.\r\n *\r\n * @private\r\n */\r\n private _destroyExtendLineOverlays(): void {\r\n if (this._extendDraw) {\r\n this._finishExtendDraw();\r\n }\r\n\r\n this._extendOverlays.forEach((overlay) => {\r\n this._map.removeOverlay(overlay);\r\n });\r\n this._extendOverlays = [];\r\n }\r\n\r\n /**\r\n * Keep the \"continue drawing\" overlays in sync with the current edit\r\n * selection: they are only shown while editing LineString/MultiLineString\r\n * features, and they are repositioned on the endpoints of each line\r\n * component.\r\n *\r\n * @private\r\n */\r\n private _syncExtendLineOverlays(): void {\r\n if (getMode() !== Modes.Edit || !this._collectionModify) {\r\n this._destroyExtendLineOverlays();\r\n return;\r\n }\r\n\r\n const items = this._collectionModify.getArray();\r\n\r\n // Remove overlays whose feature was deselected or lost its line geometry\r\n const removed: ExtendLineOverlay[] = [];\r\n this._extendOverlays.forEach((overlay) => {\r\n const stale =\r\n !items.includes(overlay.feature) ||\r\n overlay.component >=\r\n this._getLineEndPoints(overlay.feature.getGeometry())\r\n .length;\r\n\r\n if (stale) {\r\n this._map.removeOverlay(overlay);\r\n removed.push(overlay);\r\n }\r\n });\r\n this._extendOverlays = this._extendOverlays.filter(\r\n (overlay) => !removed.includes(overlay)\r\n );\r\n\r\n // Add overlays for new LineString/MultiLineString features\r\n items.forEach((feature) => {\r\n this._getLineEndPoints(feature.getGeometry()).forEach(\r\n ({ first, last }, component) => {\r\n (['start', 'end'] as ExtendLineSide[]).forEach((side) => {\r\n const exists = this._extendOverlays.some(\r\n (overlay) =>\r\n overlay.feature === feature &&\r\n overlay.component === component &&\r\n overlay.side === side\r\n );\r\n\r\n if (exists) {\r\n return;\r\n }\r\n\r\n const overlay = new ExtendLineOverlay(\r\n feature,\r\n side === 'start' ? first : last,\r\n side,\r\n component,\r\n () =>\r\n this._startExtendLineDraw(\r\n feature,\r\n side,\r\n component\r\n )\r\n );\r\n\r\n this._extendOverlays.push(overlay);\r\n this._map.addOverlay(overlay);\r\n });\r\n }\r\n );\r\n });\r\n\r\n this._updateExtendOverlayPositions();\r\n }\r\n\r\n /**\r\n * Move the \"continue drawing\" overlays to the current position of their\r\n * line endpoints, e.g. after a vertex is dragged with the Modify\r\n * interaction.\r\n *\r\n * @private\r\n */\r\n private _updateExtendOverlayPositions(): void {\r\n this._extendOverlays.forEach((overlay) => {\r\n const point = this._getLineEndPoints(overlay.feature.getGeometry())[\r\n overlay.component\r\n ];\r\n\r\n if (!point) {\r\n return;\r\n }\r\n\r\n overlay.setPosition(\r\n overlay.side === 'start' ? point.first : point.last\r\n );\r\n });\r\n }\r\n\r\n /**\r\n * Start drawing a continuation of a line from one of its endpoints. The\r\n * sketch is anchored on the clicked vertex, so the next clicks append the\r\n * new points. A double click (or clicking back on the last point) ends\r\n * the drawing and merges the segment into the feature.\r\n *\r\n * @param feature\r\n * @param side 'start' prepends the new segment, 'end' appends it\r\n * @param component index of the clicked line component\r\n * @private\r\n */\r\n private _startExtendLineDraw(\r\n feature: Feature<Geometry>,\r\n side: ExtendLineSide,\r\n component = 0\r\n ): void {\r\n if (this._extendDraw || getMode() !== Modes.Edit) {\r\n return;\r\n }\r\n\r\n const points = this._getLineEndPoints(feature.getGeometry());\r\n if (!points.length || component >= points.length) {\r\n return;\r\n }\r\n\r\n const anchor =\r\n side === 'start' ? points[component].first : points[component].last;\r\n\r\n // While extending, the Modify/Select interactions must not grab the clicks\r\n this._interactionModify?.setActive(false);\r\n if (this._interactionSelectModify) {\r\n this._interactionSelectModify.setActive(false);\r\n }\r\n if (this._interactionWfsSelect) {\r\n this._interactionWfsSelect.setActive(false);\r\n }\r\n\r\n this._extendDraw = new Draw({\r\n type: GeometryType.LineString as GeometryType,\r\n style: (f: Feature<Geometry>) => styleFunction(f),\r\n stopClick: true // To prevent firing a map/wms click\r\n });\r\n\r\n this._extendDraw.on('drawend', (evt) => {\r\n this._mergeExtendLine(feature, side, evt.feature, component);\r\n });\r\n\r\n this._extendDraw.on('drawabort', () => {\r\n this._finishExtendDraw();\r\n });\r\n\r\n this._map.addInteraction(this._extendDraw);\r\n\r\n // Anchor the sketch on the clicked vertex: the user only has to digitize\r\n // the continuation points (this also dispatches the \"drawstart\" event)\r\n this._extendDraw.appendCoordinates([anchor]);\r\n }\r\n\r\n /**\r\n * Merge the just-drawn segment into the edited feature's line geometry and\r\n * restore the editing interactions.\r\n *\r\n * @param feature\r\n * @param side\r\n * @param sketch\r\n * @param component index of the extended line component\r\n * @private\r\n */\r\n private _mergeExtendLine(\r\n feature: Feature<Geometry>,\r\n side: ExtendLineSide,\r\n sketch: Feature<Geometry>,\r\n component = 0\r\n ): void {\r\n const points = this._getLineEndPoints(feature.getGeometry());\r\n const point = points[component];\r\n\r\n if (!point) {\r\n this._finishExtendDraw();\r\n return;\r\n }\r\n\r\n const segment = (sketch.getGeometry() as LineString).getCoordinates();\r\n const { line, lineIndex } = point;\r\n\r\n if (line instanceof LineString) {\r\n const coords = line.getCoordinates();\r\n\r\n if (side === 'start') {\r\n line.setCoordinates([...segment.slice(1).reverse(), ...coords]);\r\n } else {\r\n line.setCoordinates([...coords, ...segment.slice(1)]);\r\n }\r\n } else if (line instanceof MultiLineString) {\r\n const coords = line.getCoordinates();\r\n\r\n if (side === 'start') {\r\n coords[lineIndex] = [\r\n ...segment.slice(1).reverse(),\r\n ...coords[lineIndex]\r\n ];\r\n } else {\r\n coords[lineIndex] = [...coords[lineIndex], ...segment.slice(1)];\r\n }\r\n\r\n line.setCoordinates(coords);\r\n }\r\n\r\n // Only mark the feature as edited when the segment added new vertices\r\n if (segment.length > 1) {\r\n addFeatureToEditedList(feature);\r\n }\r\n\r\n this._finishExtendDraw();\r\n this._syncExtendLineOverlays();\r\n }\r\n\r\n /**\r\n * Remove the active line extension draw and restore the interactions that\r\n * were disabled while drawing.\r\n *\r\n * @private\r\n */\r\n private _finishExtendDraw(): void {\r\n if (this._extendDraw) {\r\n this._map.removeInteraction(this._extendDraw);\r\n this._extendDraw = null;\r\n }\r\n\r\n if (getMode() !== Modes.Edit) {\r\n return;\r\n }\r\n\r\n this._interactionModify?.setActive(true);\r\n if (this._interactionSelectModify) {\r\n this._interactionSelectModify.setActive(true);\r\n }\r\n if (this._interactionWfsSelect) {\r\n this._interactionWfsSelect.setActive(true);\r\n }\r\n }\r\n\r\n /**\r\n * Send all the given features in a single WFS-T Update transaction per\r\n * layer, so a multi selection is saved with only one request. The \"edited\"\r\n * flag is cleared before transacting, so a deselect fired while the\r\n * request is in flight does not trigger a duplicate transaction.\r\n *\r\n * @param list\r\n * @returns false when there is nothing to transact or the transaction fails\r\n * @private\r\n */\r\n private async _transactEditList(\r\n list: Feature<Geometry>[]\r\n ): Promise<boolean> {\r\n if (!list.length) {\r\n return true;\r\n }\r\n\r\n const byLayer: { [key: string]: Feature<Geometry>[] } = {};\r\n\r\n list.forEach((feature) => {\r\n const layerName = feature.get('_layerName_');\r\n if (!byLayer[layerName]) {\r\n byLayer[layerName] = [];\r\n }\r\n byLayer[layerName].push(feature);\r\n });\r\n\r\n for (const layerName of Object.keys(byLayer)) {\r\n const layer = this._options.layers.find(\r\n (layer) => layer.get(BaseLayerProperty.NAME) === layerName\r\n );\r\n\r\n if (!layer) {\r\n continue;\r\n }\r\n\r\n byLayer[layerName].forEach((feature) => {\r\n removeFeatureFromEditList(feature);\r\n });\r\n\r\n let ok;\r\n try {\r\n ok = await layer.transactFeatures(\r\n TransactionType.Update,\r\n byLayer[layerName]\r\n );\r\n } catch (err) {\r\n return false;\r\n }\r\n\r\n if (ok === false) {\r\n return false;\r\n }\r\n }\r\n\r\n return true;\r\n }\r\n\r\n /**\r\n * Remove features from the edit Layer and from the Geoserver\r\n *\r\n * @param feature\r\n * @param askToConfirm\r\n * @private\r\n */\r\n private _deleteFeature(\r\n feature: Feature<Geometry> | Feature<Geometry>[],\r\n askToConfirm: boolean\r\n ): void {\r\n const deleteEl = () => {\r\n const features = Array.isArray(feature) ? feature : [feature];\r\n features.forEach((feature) => {\r\n feature.set('_delete_', true, true);\r\n getEditLayer().getSource().removeFeature(feature);\r\n });\r\n this._collectionModify.clear();\r\n\r\n this._editModeOff();\r\n this._syncEditOverlays();\r\n\r\n const layerName = features[0]?.get('_layerName_');\r\n const layer = layerName\r\n ? this._options.layers.find(\r\n (layer) => layer.get(BaseLayerProperty.NAME) === layerName\r\n )\r\n : null;\r\n\r\n if (layer instanceof WfsLayer) {\r\n features.forEach((feature) => {\r\n this._interactionWfsSelect.getFeatures().remove(feature);\r\n });\r\n }\r\n };\r\n\r\n if (askToConfirm) {\r\n const features = Array.isArray(feature) ? feature : [feature];\r\n const message =\r\n features.length > 1\r\n ? i18n.I18N_('confirmDeleteElements', features.length)\r\n : i18n.I18N.labels.confirmDelete;\r\n\r\n const confirmModal = Modal.confirm(message, {\r\n ...this._options.modal,\r\n footer: `\r\n <button type=\"button\" class=\"btn btn-sm btn-secondary\" data-dismiss=\"modal\">\r\n ${i18n.I18N.labels.cancel}\r\n </button>\r\n <button type=\"button\" class=\"btn btn-sm btn-danger\" data-action=\"delete\" data-dismiss=\"modal\">\r\n ${i18n.I18N.labels.delete}\r\n </button>\r\n `\r\n });\r\n\r\n confirmModal.show().once('dismiss', function (modal, event) {\r\n if (event.target.dataset.action == 'delete') {\r\n deleteEl();\r\n }\r\n });\r\n } else {\r\n deleteEl();\r\n }\r\n }\r\n\r\n /**\r\n * Add a feature to the Edit Layer to allow editing, and creates an Overlay Helper to show options\r\n *\r\n * @param feature\r\n * @param coordinate\r\n * @param layerName\r\n * @private\r\n */\r\n private _addFeatureToEditMode(\r\n feature: Feature<Geometry>,\r\n coordinate: Coordinate = null,\r\n layerName = null\r\n ): void {\r\n if (layerName) {\r\n // Store the layer information inside the feature\r\n feature.set('_layerName_', layerName);\r\n }\r\n\r\n if (coordinate) {\r\n // Keep the click coordinate to position the overlay helper\r\n feature.set('_editOverlayCoord_', coordinate);\r\n }\r\n\r\n const props = feature ? feature.getProperties() : '';\r\n\r\n if (props) {\r\n if (feature.getGeometry()) {\r\n getEditLayer().getSource().addFeature(feature);\r\n this._collectionModify.push(feature);\r\n\r\n this._syncEditOverlays();\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Lock the whole current selection with a single LockFeature request per\r\n * layer, so the transaction LockId covers all the selected features\r\n *\r\n * @private\r\n */\r\n private async _lockSelectedFeatures(): Promise<void> {\r\n const byLayer: { [key: string]: Array<string | number> } = {};\r\n\r\n this._collectionModify.getArray().forEach((selected) => {\r\n const layerName = selected.get('_layerName_');\r\n\r\n if (!layerName) {\r\n return;\r\n }\r\n\r\n (byLayer[layerName] || (byLayer[layerName] = [])).push(\r\n selected.getId()\r\n );\r\n });\r\n\r\n const locks: Array<Promise<string>> = [];\r\n\r\n Object.keys(byLayer).forEach((layerName) => {\r\n const layer = getStoredLayer(layerName);\r\n\r\n if (layer) {\r\n locks.push(layer.maybeLockFeature(byLayer[layerName]));\r\n }\r\n });\r\n\r\n if (locks.length) {\r\n await Promise.all(locks);\r\n }\r\n }\r\n\r\n /**\r\n * Create an EditOverlay helper and attach the edit listeners\r\n *\r\n * @param feature\r\n * @param coordinate\r\n * @param id\r\n * @private\r\n */\r\n private _createEditOverlay(\r\n feature: Feature<Geometry> = null,\r\n coordinate: Coordinate = null,\r\n id: string | number = null\r\n ): void {\r\n coordinate =\r\n coordinate || (feature ? feature.get('_editOverlayCoord_') : null);\r\n\r\n const overlay = new EditOverlay(feature, coordinate, id);\r\n\r\n // @ts-expect-error\r\n overlay.on('editFields', () => {\r\n this._editFields.show(this._collectionModify.getArray());\r\n });\r\n\r\n // @ts-expect-error\r\n overlay.on('editGeom', () => {\r\n this._editModeOn(this._collectionModify.getArray());\r\n });\r\n\r\n this._map.addOverlay(overlay);\r\n }\r\n\r\n /**\r\n * Sync the edit overlay helpers with the current selection: a single\r\n * per-feature overlay while a feature is selected, or a unique overlay\r\n * centered between all the selected features when editing several at once\r\n *\r\n * @private\r\n */\r\n private _syncEditOverlays(): void {\r\n if (getMode() === Modes.Edit) {\r\n return;\r\n }\r\n\r\n const multiOverlay = this._map.getOverlayById(this._multiOverlayId);\r\n if (multiOverlay) {\r\n this._map.removeOverlay(multiOverlay);\r\n }\r\n\r\n const items: Feature<Geometry>[] = this._collectionModify.getArray();\r\n\r\n if (items.length > 1) {\r\n items.forEach((feature) => {\r\n this._removeOverlayHelper(feature);\r\n });\r\n\r\n const extent: Extent = createEmpty();\r\n items.forEach((feature) => {\r\n extend(extent, feature.getGeometry().getExtent());\r\n });\r\n\r\n this._createEditOverlay(\r\n null,\r\n getCenter(extent),\r\n this._multiOverlayId\r\n );\r\n } else if (items.length === 1) {\r\n const feature = items[0];\r\n const featureId = feature.getId();\r\n\r\n if (featureId && !this._map.getOverlayById(featureId)) {\r\n this._createEditOverlay(feature);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Activate/deactivate the draw mode\r\n *\r\n * @param layer\r\n * @public\r\n */\r\n activateDrawMode(layer: WfsLayer | WmsLayer | false): void {\r\n /**\r\n *\r\n * @param layer\r\n * @private\r\n */\r\n const addDrawInteraction = (layer: WfsLayer | WmsLayer): void => {\r\n this.activateEditMode(false);\r\n\r\n // If already exists, remove\r\n if (this._interactionDraw) {\r\n this._map.removeInteraction(this._interactionDraw);\r\n }\r\n\r\n const geomDrawType = this._selectDraw.value;\r\n\r\n this._interactionDraw = new Draw({\r\n source: getEditLayer().getSource(),\r\n type: geomDrawType as GeometryType,\r\n style: (feature: Feature<Geometry>) => styleFunction(feature),\r\n stopClick: true // To prevent firing a map/wms click\r\n });\r\n\r\n this._map.addInteraction(this._interactionDraw);\r\n\r\n this._interactionDraw.on('drawstart', (evt) => {\r\n super.dispatchEvent(evt);\r\n });\r\n\r\n this._interactionDraw.on('drawend', (evt) => {\r\n const feature: Feature<Geometry> = evt.feature;\r\n layer.transactFeatures(TransactionType.Insert, feature);\r\n super.dispatchEvent(evt);\r\n });\r\n };\r\n\r\n if (!this._interactionDraw && !layer) {\r\n return;\r\n }\r\n\r\n if (layer) {\r\n // If layer is set to invisible, show warning\r\n if (!layer.getVisible()) {\r\n return;\r\n }\r\n\r\n // Clear hover style while drawing\r\n this._clearHoverState();\r\n\r\n activateDrawButton();\r\n deactivateSelectModeButton();\r\n\r\n this._viewport.classList.add('draw-mode');\r\n\r\n addDrawInteraction(layer);\r\n } else {\r\n this._map.removeInteraction(this._interactionDraw);\r\n this._viewport.classList.remove('draw-mode');\r\n activateSelectModeButton(getSelectionMode());\r\n }\r\n\r\n activateMode(layer ? Modes.Draw : null);\r\n this._refreshSelectionInteractions();\r\n }\r\n\r\n /**\r\n * Activate/desactivate the edit mode\r\n *\r\n * @param bool\r\n * @public\r\n */\r\n activateEditMode(bool = true): void {\r\n if (bool) {\r\n activateModeButtons();\r\n this.activateDrawMode(false);\r\n } else {\r\n // Deselct features\r\n this._collectionModify.clear();\r\n // Clear hover state when leaving the edit mode\r\n this._clearHoverState();\r\n }\r\n\r\n if (this._interactionSelectModify) {\r\n this._interactionSelectModify.setActive(bool);\r\n }\r\n\r\n this._interactionModify.setActive(bool);\r\n\r\n if (this._interactionWfsSelect)\r\n this._interactionWfsSelect.setActive(bool);\r\n\r\n this._refreshSelectionInteractions();\r\n }\r\n\r\n /**\r\n * Reset the cursor and remove the hover style of the last hovered feature\r\n * @private\r\n */\r\n private _clearHoverState(): void {\r\n if (this._viewport) {\r\n this._viewport.style.cursor = '';\r\n }\r\n\r\n if (this._hoveredFeature) {\r\n this._hoveredFeature.setStyle(undefined);\r\n this._hoveredFeature = null;\r\n }\r\n }\r\n\r\n /**\r\n * Change the map cursor while in edit mode: `move` when the pointer is\r\n * over an editable vertex and `copy` when it is over a segment (where a\r\n * new vertex can be inserted), mirroring the Modify interaction hit\r\n * tolerance.\r\n *\r\n * @param evt\r\n * @private\r\n */\r\n private _updateEditCursor(evt: MapBrowserEvent<PointerEvent>): void {\r\n if (!this._collectionModify) {\r\n return;\r\n }\r\n\r\n const tolerance = 12;\r\n const toleranceSq = tolerance * tolerance;\r\n const pixel = evt.pixel;\r\n\r\n for (const feature of this._collectionModify.getArray()) {\r\n const vertices = getFeatureVertices(feature);\r\n const coordinates = vertices ? vertices.getCoordinates() : [];\r\n\r\n if (!coordinates.length) {\r\n continue;\r\n }\r\n\r\n // Hovering an existing vertex (draggable handle)\r\n for (const coordinate of coordinates) {\r\n const vertexPixel =\r\n this._map.getPixelFromCoordinate(coordinate);\r\n if (squaredDistance(vertexPixel, pixel) <= toleranceSq) {\r\n this._viewport.style.cursor = 'move';\r\n return;\r\n }\r\n }\r\n\r\n // Hovering a segment (allows inserting a new vertex)\r\n for (let i = 0; i < coordinates.length - 1; i++) {\r\n const start = this._map.getPixelFromCoordinate(coordinates[i]);\r\n const end = this._map.getPixelFromCoordinate(\r\n coordinates[i + 1]\r\n );\r\n if (\r\n squaredDistanceToSegment(pixel, [start, end]) <= toleranceSq\r\n ) {\r\n this._viewport.style.cursor = 'copy';\r\n return;\r\n }\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Remove the overlay helper atttached to a specify feature\r\n * @param feature\r\n * @private\r\n */\r\n private _removeOverlayHelper(feature: FeatureLike): void {\r\n const featureId = feature.getId();\r\n\r\n if (!featureId) {\r\n return;\r\n }\r\n\r\n const overlay = this._map.getOverlayById(featureId);\r\n\r\n if (!overlay) {\r\n return;\r\n }\r\n\r\n this._map.removeOverlay(overlay);\r\n }\r\n}\r\n\r\n/**\r\n * **_[interface]_** - Wfst Options specified when creating a Wfst instance\r\n *\r\n * Default values:\r\n * ```javascript\r\n * {\r\n * layers: null,\r\n * evtType: 'singleclick',\r\n * active: true,\r\n * showControl: true,\r\n * fullscreen: true,\r\n * language: 'en',\r\n * i18n: {...}, // according to language selection\r\n * uploadFormats: '.geojson,.json,.kml',\r\n * processUpload: null,\r\n * }\r\n * ```\r\n */\r\ninterface Options {\r\n /**\r\n * Layers to be loaded from the geoserver\r\n */\r\n layers?: Array<WfsLayer | WmsLayer>;\r\n\r\n /**\r\n * Init active\r\n */\r\n active?: boolean;\r\n\r\n /**\r\n * The click event to allow selection of Features to be edited\r\n */\r\n evtType?: 'singleclick' | 'dblclick';\r\n\r\n /**\r\n * Show/hide the control map\r\n */\r\n showControl?: boolean;\r\n\r\n /**\r\n * Show/hide the fullscreen button on the map\r\n */\r\n fullscreen?: boolean;\r\n\r\n /**\r\n * Modal configuration\r\n */\r\n modal?: {\r\n animateClass?: string;\r\n animateInClass?: string;\r\n transition?: number;\r\n backdropTransition?: number;\r\n templates?: {\r\n dialog?: string | HTMLElement;\r\n headerClose?: string | HTMLElement;\r\n };\r\n };\r\n\r\n /**\r\n * Language to be used\r\n */\r\n language?: 'es' | 'en' | 'zh';\r\n\r\n /**\r\n * Custom translations\r\n */\r\n i18n?: I18n;\r\n\r\n /**\r\n * Show/hide the upload button\r\n */\r\n showUpload?: boolean;\r\n\r\n /**\r\n * Accepted extension formats on upload\r\n * Example: \".json,.geojson\"\r\n */\r\n uploadFormats?: string;\r\n\r\n /**\r\n * Triggered to allow implement custom functions or to parse other formats than default\r\n * by filtering the extension. If this doesn't return features, the default function\r\n * will be used to extract them.\r\n */\r\n processUpload?(file: File): Array<Feature<Geometry>>;\r\n}\r\n\r\n/**\r\n * **_[interface]_** - Parameters to create the layers and connect to the GeoServer\r\n *\r\n * You can use all the parameters supported by OpenLayers\r\n *\r\n * Default values:\r\n * ```javascript\r\n * {\r\n * name: null,\r\n * geoserver: null,\r\n * label: null, // `name` if not provided\r\n * strategy: all,\r\n * geoserverVendor: null\r\n * }\r\n * ```\r\n */\r\ninterface LayerOptions extends Omit<VectorLayerOptions<any, any>, 'source'> {\r\n /**\r\n * Layer name in the GeoServer\r\n */\r\n name: string;\r\n\r\n /**\r\n * Geoserver Object\r\n */\r\n geoserver: Geoserver;\r\n\r\n /**\r\n * Label to be displayed in the widget control\r\n */\r\n label?: string;\r\n\r\n /**\r\n * Available geoserver options\r\n */\r\n geoserverVendor?: WfsGeoserverVendor | WmsGeoserverVendor;\r\n\r\n /**\r\n * Strategy function for loading features.\r\n * Only for WFS\r\n * By default `all` strategy is used\r\n */\r\n strategy?: LoadingStrategy;\r\n\r\n /**\r\n * Triggered before inserting new features to the Geoserver.\r\n * Use this to insert custom properties, modify the feature, etc.\r\n */\r\n beforeTransactFeature?(\r\n feature: Feature<Geometry>,\r\n transaction: TransactionType\r\n ): Feature<Geometry>;\r\n\r\n /**\r\n * Hook to customize the html elements showed in the fields modal\r\n * Return `null` to hide the field from the modal\r\n */\r\n beforeShowFieldsModal?: (\r\n field: IProperty,\r\n value: string,\r\n formElement: HTMLElement\r\n ) => HTMLElement | string | null;\r\n}\r\nclass WfstEvent extends BaseEvent {\r\n public data: IGeoserverDescribeFeatureType;\r\n public layer: WfsLayer | WmsLayer;\r\n\r\n constructor(options: {\r\n type: WfstEventTypes;\r\n layer: WfsLayer | WmsLayer;\r\n data: IGeoserverDescribeFeatureType;\r\n }) {\r\n super(options.type);\r\n this.layer = options.layer;\r\n this.data = options.data;\r\n }\r\n}\r\n\r\ntype WfstEventTypes = 'describeFeatureType';\r\n\r\nexport {\r\n Options,\r\n WfstEventTypes,\r\n WfstEvent,\r\n I18n,\r\n LayerOptions,\r\n Geoserver,\r\n WmsLayer,\r\n WfsLayer\r\n};\r\n","import { I18N } from './modules/i18n';\r\nimport { Options } from './ol-wfst';\r\n\r\nexport const DEFAULT_LANGUAGE = 'en';\r\n\r\nexport const getDefaultOptions = (): Options => {\r\n return {\r\n layers: null,\r\n evtType: 'singleclick',\r\n active: true,\r\n showControl: true,\r\n fullscreen: true,\r\n language: DEFAULT_LANGUAGE,\r\n uploadFormats: '.geojson,.json,.kml',\r\n processUpload: null,\r\n modal: {\r\n animateClass: 'fade',\r\n animateInClass: 'show',\r\n transition: 300,\r\n backdropTransition: 150,\r\n templates: {\r\n dialog: '<div class=\"modal-dialog modal-dialog-centered\"></div>',\r\n headerClose: `<button type=\"button\" class=\"btn-close\" data-dismiss=\"modal\" aria-label=\"${I18N.labels.close}\"><span aria-hidden=\"true\">×</span></button>`\r\n }\r\n }\r\n };\r\n};\r\n","import Wfst from './ol-wfst';\r\nimport WfsLayer from './WfsLayer';\r\nimport WmsLayer from './WmsLayer';\r\nimport Geoserver from './Geoserver';\r\n\r\nconst utils = {\r\n WfsLayer,\r\n WmsLayer,\r\n Geoserver\r\n};\r\n\r\nObject.assign(Wfst, utils);\r\nexport default Wfst;\r\n"],"names":["_factory","_defaults","Object","freeze","el","animate","animateClass","animateInClass","appendTo","backdrop","keyboard","title","header","content","footer","buttons","headerClose","construct","transition","backdropTransition","_buttons","deepFreeze","obj","k","Array","isArray","forEach","v","dialog","text","value","attr","class","alert","confirm","_templates","container","body","data","prop","prefix","elData","dataAttr","getAttribute","build","html","all","nodeName","replace","document","createElement","innerHTML","childNodes","getPath","node","nodes","parentNode","push","Modal","EventEmitter","templates","this","_baseTemplates","assign","_baseButtons","options","_baseOptions","version","message","_options","question","constructor","super","id","Math","random","toString","_html","_events","_visible","_pointerInContent","querySelector","_scrollbarWidth","inner","width","outerWidth","outer","style","visibility","appendChild","offsetWidth","overflow","removeChild","calcScrollbarWidth","Error","_render","_mapDom","o","t","classList","add","_setHeader","_setContent","_setFooter","contains","outerHTML","ineerHTML","children","length","button","setAttribute","j","_setEvents","keydownHandler","_handleKeydownEvent","bind","addEventListener","mousedownHandler","_handleMousedownEvent","clickHandler","_handleClickEvent","resizeHandler","_handleResizeEvent","window","e","target","every","tagName","emit","hide","which","_resize","show","_checkScrollbar","_setScrollbar","display","scrollTop","once","setTimeout","_backdrop","toggle","modalIsOverflowing","scrollHeight","documentElement","clientHeight","paddingLeft","bodyIsOverflowing","paddingRight","contCList","remove","_removeEvents","originalBodyPad","removeEventListener","clientWidth","innerWidth","basePadding","parseInt","isError","Set","parseError","geoserverResponse","exceptions","map","join","showError","msg","originalError","layerName","has","err_msg","al","on","delete","en","labels","select","selectBox","selectFreehand","query","featureInfo","addElement","editElement","save","cancel","upload","editMode","confirmDelete","confirmDeleteElements","geomTypeNotSupported","editFields","editGeom","continueLine","selectDrawType","uploadToLayer","uploadFeatures","validFeatures","invalidFeatures","loading","toggleVisibility","fullscreen","close","multipleValues","editElements","multipleEditNotice","tableMode","formMode","feature","geometry","geoserverLayers","errors","capabilities","wfst","layer","layerNotFound","layerNotVisible","noValidGeometry","geoserver","badFormat","badFile","lockFeature","transaction","getFeatures","langs","es","zh","I18N","I18N_","string","args","_a","console","error","arg","loadingDiv","showLoading","bool","copyProps","dest","src","exclude","props","getOwnPropertyDescriptors","defineProperties","protoChain","currentChain","proto","getPrototypeOf","hardMixProtos","ingredients","base","objs","commonProto","protoChains","protos","pop","potentialCommonProto","nearestCommonProto","prototype","mixedProto","create","visitedProtos","i","newProto","indexOf","unique","arr","filter","mixins","WeakMap","getMixinsForClass","clazz","get","mergeObjectsOfDecorators","o1","o2","_b","allKeys","getOwnPropertyNames","mergedObject","key","mergePropertyAndMethodDecorators","d1","d2","_c","_d","property","method","decorators","Map","deepDecoratorSearch","classes","decoratorsForClassChain","allClasses","frontier","size","newClasses","c","newClass","findAllConstituentClasses","reduce","_e","_f","static","instance","mergeDecorators","Mixin","constructors","prototypes","MixedClass","setPrototypeOf","DecoratedMixedClass","classDecorators","decorator","result","applyPropAndMethodDecorators","mixedClass","constituents","set","propAndMethodDecorators","propDecorators","methodDecorators","getOwnPropertyDescriptor","GeometryType","TransactionType","layerToInsertElements","mode","Modes","SelectionMode","selectionMode","Single","activateMode","m","getMode","getSelectionMode","editedFeatures","mapLayers","getMap","setActiveLayerToInsertEls","getActiveLayerToInsertEls","getStoredMapLayers","getStoredLayer","addFeatureToEditedList","String","getId","removeFeatureFromEditList","isFeatureEdited","BaseLayer","Layer","_init","getGeoserver","isLoaded","getAndUpdateDescribeFeatureType","Promise","resolve","async","BaseLayerProperty","NAME","layerLabel","LABEL","params","URLSearchParams","service","getAdvanced","describeFeatureTypeVersion","request","typeName","outputFormat","url_fetch","getUrl","response","fetch","headers","getHeaders","credentials","getCredentials","ok","json","targetNamespace","properties","featureTypes","geom","find","type","_parsed","namespace","geomType","localType","geomField","name","DESCRIBEFEATURETYPE","err","isVisibleByZoom","getView","getZoom","getMinZoom","transactFeatures","features","transact","insertFeatures","Insert","maybeLockFeature","featureIds","getUseLockFeature","hasLockFeature","GEOSERVER","getDescribeFeatureType","WfsSource","VectorSource","format","GeoJSON","loader","extent","resolution","projection","success","failure","strategy","bbox","extentGeoServer","transformExtent","getCode","geoServerAdvanced","urlParams","geoserverUrl","getFormat","readFeatures","featureProjection","dataProjection","addFeatures","removeLoadedExtent","SERVICE","REQUEST","OUTPUTFORMAT","EXCEPTIONS","getFeatureVersion","WfsLayer","label","minZoom","_loadingCount","_loadedCount","beforeTransactFeature","source","geoserverVendor","dispatchEvent","setSource","geoserverOptions","keys","param","refresh","getSource","setCustomParam","paramName","TileState","WmsSource","TileWMS","url","serverType","TILED","LAYERS","tileLoadFunction","tile","blob","parsedError","reader","FileReader","onloadend","JSON","parse","readAsText","getImage","URL","createObjectURL","setState","WmsLayer","_getFullResGeometryById","featuresId","queryParams","VERSION","INFO_FORMAT","TYPENAME","MAXFEATURES","SRSNAME","getProjection","FEATUREID","getUrls","status","fullById","_parseFeaturesFromResponse","Boolean","beforeShowFieldsModal","_formatGeoJSON","_getFeaturesByClickEvent","evt","coordinate","view","buffer","getResolution","BUFFER","FEATURE_COUNT","_requestFeatures","_getFeaturesInGeometry","viewProj","nativeSrs","_getNativeSrs","polygon","clone","transform","ringWkt","getCoordinates","x","y","sridMatch","match","cql","CQL_FILTER","layerLocalName","split","featureTypeList","getParsedCapabilities","FeatureTypeList","featureType","ft","featureTypeName","Name","undefined","epsgMatch","DefaultCRS","advanced","f","fullResList","getParams","Date","getMilliseconds","updateParams","elem","createDocumentFragment","HTMLElement","entries","startsWith","slice","toLowerCase","child","append","Node","jsx","jsxs","Fragment","resetStateButtons","activeBtn","deactivateQueryButton","btn","activateSelectModeButton","btnMap","Box","Freehand","deactivateSelectModeButton","LayersControl","Observable","uploads","uploadFormats","_uploads","_uploadFormats","addLayerEl","checked","input","_jsx","className","onChange","_layerChangeHandler","layerDom","getVisible","_jsxs","htmlFor","onClick","_visibilityClickHandler","Event","_changeStateSelect","geomDrawTypeSelected","setSelectState","from","selectDraw","option","selected","disabled","includes","drawType","geomLayer","GeometryCollection","LineString","LinearRing","Circle","Polygon","parentDiv","currentTarget","closest","dataset","setVisible","render","_Fragment","selectedValue","Point","MultiPoint","MultiLineString","MultiPolygon","accept","process","editLayer","VectorLayer","zIndex","getEditLayer","Uploads","_processUpload","processUpload","_formatWFS","WFS","_formatKml","KML","extractStyles","showPointNames","_xs","XMLSerializer","file","files","extension","_fileReader","invalidFeaturesCount","validFeaturesCount","featuresToInsert","_checkGeometry","_fixGeometry","VectorSourceEvent","_initModal","reject","fileData","geomTypeLayer","getGeometry","getType","coords","setGeometry","geomTypeFeature","modal","event","action","clear","deepObjectAssign","sources","s_val","t_val","EditControlChangesEl","Control","element","_dispatch","editVertexStyles","highlighted","halo","haloColor","radius","border","borderWidth","Style","image","CircleStyle","fill","Fill","color","stroke","Stroke","getFeatureVertices","getGeometries","coordinates","flatCoordinates","flat","styleFunction","hovered","haloStyle","Edit","Draw","EditFieldsModal","_tableMode","_fieldList","_modal","_saveTable","_saveForm","_features","modalTitle","describeFeatureType","field","_layer","_renderBody","multiple","_toggleTable","_renderTable","_renderForm","autocomplete","flatMap","values","uniqueValues","hasMultipleValues","_inputType","placeholder","hookInput","DOMParser","parseFromString","idx","geometryTypeLabel","typeXsd","formElements","elements","multipleFields","changed","inputList","querySelectorAll","grouped","Number","featIdx","inputs","types","collect","getGeometriesArray","NAMESPACE_URIS","PARSERS","makeStructureNS","ServiceIdentification","makeObjectPropertySetter","objectStack","pushParseAndPop","SERVICE_IDENTIFICATION_PARSERS","ServiceProvider","SERVICE_PROVIDER_PARSERS","OperationsMetadata","OPERATIONS_METADATA_PARSERS","FEATURE_TYPE_LIST_PARSERS","Filter_Capabilities","FILTER_CAPABILITIES_PARSERS","Title","readString","Abstract","Keywords","readKeywordList","ServiceType","ServiceTypeVersion","Fees","AccessConstraints","ProviderName","ServiceContact","SERVICE_CONTACT_PARSERS","Operation","makeObjectPropertyPusher","operation","OPERATION_PARSERS","readOperation","Constraint","readNamedConstraint","IndividualName","PositionName","ContactInfo","CONTACT_INFO_PARSERS","Phone","PHONE_PARSERS","Address","ADDRESS_PARSERS","Voice","Facsimile","DeliveryPoint","City","AdministrativeArea","PostalCode","Country","ElectronicMailAddress","FeatureType","makeArrayPusher","FEATURE_TYPE_PARSERS","WGS84BoundingBox","WGS84_BOUNDINGBOX_PARSERS","MetadataURL","readHref","DCP","DCP_PARSERS","Parameter","parameter","PARAMETER_PARSERS","readParameter","AllowedValues","readValueList","CONSTRAINT_PARSERS","NoValues","DefaultValue","HTTP_PARSERS","Get","Post","LowerCorner","readStringCoords","UpperCorner","HTTP","KEYWORDLIST_PARSERS","Keyword","VALUELIST_PARSERS","Value","Conformance","CONFORMANCE_PARSERS","Id_Capabilities","ID_CAPABILITIES_PARSERS","Scalar_Capabilities","SCALAR_CAPABILITIES_PARSERS","Spatial_Capabilities","SPATIAL_CAPABILITIES_PARSERS","Temporal_Capabilities","TEMPORAL_CAPABILITIES_PARSERS","Functions","FUNCTIONS_PARSERS","ResourceIdentifier","LogicalOperators","LOGICAL_OPERATORS_PARSERS","ComparisonOperators","COMPARISON_OPERATORS_PARSERS","GeometryOperands","GEOMETRY_OPERANDS_PARSERS","SpatialOperators","SPATIAL_OPERATORS_PARSERS","TemporalOperands","TEMPORAL_OPERANDS_PARSERS","TemporalOperators","TEMPORAL_OPERATORS_PARSERS","Function","func","FUNCTION_PARSERS","readFunction","Returns","Arguments","ARGUMENTS_PARSERS","Argument","argument","ARGUMENT_PARSERS","readArgument","Type","LogicalOperator","readNamedOnly","ComparisonOperator","GeometryOperand","SpatialOperator","TemporalOperand","TemporalOperator","constraint","readConstraint","getAllTextContent","parser","XML","readFromNode","trim","wfsCapabilityObject","GeoserverProperty","EditOverlay","Overlay","position","getCenter","getExtent","positioning","offset","stopEvent","ExtendLineOverlay","side","component","QueryOverlay","parsed","fields","rows","stringify","autoPan","controlElement","Wfst","_map","_initialized","_queryOverlayId","_shiftPressed","_hoveredFeature","_keySelectBound","_editFeaturesOriginal","_multiOverlayId","_extendOverlays","lang","customI18n","i18n.setLang","language","i18n","defaultOptions","layers","evtType","active","showControl","_controlWidgetToolsDiv","_editFields","getLayers","getLayerByName","_initMapAndLayers","layerRendered","layersNumber","layerInitPromises","isVisible","_view","domEl","_layersControl","ISVISIBLE","_currentZoom","WfstEvent","addLayer","setMapLayers","_createMapElements","race","opts","_viewport","getViewport","getTargetElement","activateEditMode","editLayerSource","fit","getSize","maxZoom","padding","list","_transactEditList","_collectionModify","_deleteFeature","_addMapEvents","_addMiddleButtonPan","_layersWidgetDiv","addControl","_prepareEditLayer","_addInteractions","_addInteractionHandlers","_prepareHighlightLayer","_addQueryInteraction","_addMapControl","FullScreen","tipLabel","i18n.I18N","labelActive","prepareWfsInteraction","Collection","_interactionWfsSelect","Select","hitTolerance","toggleCondition","shiftKeyOnly","Query","addInteraction","deselected","mapBrowserEvent","_clearHoverState","getLayer","removeFeature","_addFeatureToEditMode","_lockSelectedFeatures","prepareWmsInteraction","_interactionSelectModify","removeCondition","selectedSet","getArray","_keyClickWms","hasFeatureAtPixel","pixel","_interactionModify","Modify","condition","primaryAction","_interactionSnap","Snap","_addSelectionInteractions","selectionStyle","lineDash","_interactionDragBox","DragBox","_isSelectMode","originalEvent","shiftKey","_selectByGeometry","_interactionFreehandSelect","freehand","stopClick","ring","getArea","_refreshSelectionInteractions","setActive","candidates","getFeaturesInExtent","featureGeom","flatCoords","getFlatCoordinates","stride","getStride","intersectsCoordinate","_selectFeatures","selectedIds","hasFeature","_highlightSource","_highlightLayer","_keyClickQuery","featuresAtPixel","getFeaturesAtPixel","layerFilter","candidate","_showQueryResult","_clearQueryResult","addFeature","_queryOverlay","addOverlay","_removeQueryOverlay","removeOverlay","overlay","getOverlayById","activateQueryMode","getLength","_interactionDraw","removeInteraction","activateQueryButton","_syncExtendLineOverlays","selectedFeatures","keyboardEvents","dragging","_updateEditCursor","setStyle","cursor","_lastZoom","viewport","panning","lastX","lastY","pointerType","isMiddleButton","preventDefault","stopPropagation","setPointerCapture","pointerId","clientX","clientY","getAnimating","cancelAnimations","delta","rotation","getRotation","cosAngle","cos","sinAngle","sin","adjustCenterInternal","endPan","_updateExtendOverlayPositions","_onDeselectFeatureEvent","_onRemoveFeatureEvent","showUpload","activateDrawMode","evtName","controlEl","_selectDraw","_deselectEditFeature","_removeOverlayHelper","_restoreFeatureToLayer","_removeFeatureFromTmpLayer","checkIfFeatureIsChanged","Update","_keySelect","unByKey","_syncEditOverlays","_editModeOff","_keyRemove","Delete","_hideControls","_showControls","_editModeOn","multiOverlay","_controlApplyDiscardChanges","original","_destroyExtendLineOverlays","removeControl","_getLineEndPoints","endPoints","collection","line","first","getFirstCoordinate","last","getLastCoordinate","lineIndex","appendLine","member","_extendDraw","_finishExtendDraw","items","removed","exists","some","_startExtendLineDraw","point","setPosition","points","anchor","_mergeExtendLine","appendCoordinates","sketch","segment","setCoordinates","reverse","byLayer","askToConfirm","deleteEl","i18n.I18N_","getProperties","locks","_createEditOverlay","createEmpty","extend","featureId","addDrawInteraction","geomDrawType","activateDrawButton","activateModeButtons","vertices","vertexPixel","getPixelFromCoordinate","squaredDistance","tolerance","start","end","squaredDistanceToSegment","BaseEvent","utils","Geoserver","BaseObject","defaults","getCapabilitiesVersion","lockFeatureVersion","wfsTransactionVersion","lockFeatureParams","expiry","lockId","releaseAction","useLockFeature","setAdvanced","setHeaders","setCredentials","setUrl","setUseLockFeature","_countRequests","_insertFeatures","_updateFeatures","_deleteFeatures","_lockedId","getAndUpdateCapabilities","_checkGeoserverCapabilities","getCapabilities","CAPABILITIES","PARSED_CAPABILITIES","opt_silent","HEADERS","CREDENTIALS","ADVANCED","hasTransaction","HASTRASNACTION","HASLOCKFEATURE","USELOCKFEATURE","ISLOADED","getState","state_","parsedCapabilities","read","operations","HASDESCRIBEFEATURETYPE","getElementsByTagName","transactionType","clonedFeatures","geoLayer","_cloneFeature","cloneGeom","_transformGeoemtryCollectionToGeometries","_transformCircleToPolygon","numberRequest","srs","layerNameClean","featureNS","srsName","featurePrefix","nativeElements","writeTransaction","payload","serializeToString","gmemberIn","gmemberOut","responseStr","parseResponse","readTransactionResponse","wlayer","findError","_removeFeatures","geomConverted","fromCircle","featureProperties","boundedBy","_layerName_","_editOverlayCoord_","Feature","setId","retry","handle","featureid","dataParsed","code","dataDoc","lockIdNode","getElementsByTagNameNS","textContent","parseErr"],"mappings":"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","x_google_ignoreList":[0,7,13,24]}
|