@open-pioneer/editing 0.9.0-dev.20250220091855 → 0.9.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/CHANGELOG.md CHANGED
@@ -1,130 +1,139 @@
1
1
  # @open-pioneer/editing
2
2
 
3
- ## 0.9.0-dev.20250220091855
3
+ ## 0.9.0
4
+
5
+ ### Minor Changes
6
+
7
+ - cb94c75: update dependencies
4
8
 
5
9
  ### Patch Changes
6
10
 
7
- - Updated dependencies [f327eec]
8
- - Updated dependencies [f327eec]
9
- - Updated dependencies [209eb8e]
10
- - @open-pioneer/map@0.9.0-dev.20250220091855
11
+ - Updated dependencies [e7fdc5d]
12
+ - Updated dependencies [cb94c75]
13
+ - Updated dependencies [37cd707]
14
+ - Updated dependencies [32ed2cd]
15
+ - Updated dependencies [f327eec]
16
+ - Updated dependencies [f327eec]
17
+ - Updated dependencies [209eb8e]
18
+ - Updated dependencies [d72e42c]
19
+ - @open-pioneer/map@0.9.0
11
20
 
12
21
  ## 0.8.0
13
22
 
14
23
  ### Minor Changes
15
24
 
16
- - b717121: Update from OL 9 to OL 10.
17
- - e7978a8: Removed EditingWorkflowEvent; the state of the EditingWorkflow is now reactive and should be used instead.
18
- - 2fa8020: Update trails core package dependencies.
25
+ - b717121: Update from OL 9 to OL 10.
26
+ - e7978a8: Removed EditingWorkflowEvent; the state of the EditingWorkflow is now reactive and should be used instead.
27
+ - 2fa8020: Update trails core package dependencies.
19
28
 
20
- - Also updates Chakra UI to the latest 2.x version and Chakra React Select to version 5.
21
- - Removes any obsolete references to `@chakra-ui/system`.
22
- This dependency seems to be no longer required and may lead to duplicate packages in your dependency tree.
29
+ - Also updates Chakra UI to the latest 2.x version and Chakra React Select to version 5.
30
+ - Removes any obsolete references to `@chakra-ui/system`.
31
+ This dependency seems to be no longer required and may lead to duplicate packages in your dependency tree.
23
32
 
24
33
  ### Patch Changes
25
34
 
26
- - e7978a8: Use reactive map model APIs to access the current map container element.
27
- - 49f0207: Update trails core packages to version 2.4.0
28
- - e7978a8: Stop draw interactions and remove tooltips before saving.
29
- - Updated dependencies [b717121]
30
- - Updated dependencies [e7978a8]
31
- - Updated dependencies [7a5f1e1]
32
- - Updated dependencies [7ae9f90]
33
- - Updated dependencies [d8337a6]
34
- - Updated dependencies [49f0207]
35
- - Updated dependencies [b2127df]
36
- - Updated dependencies [2fa8020]
37
- - Updated dependencies [7ae9f90]
38
- - Updated dependencies [d8337a6]
39
- - @open-pioneer/map@0.8.0
35
+ - e7978a8: Use reactive map model APIs to access the current map container element.
36
+ - 49f0207: Update trails core packages to version 2.4.0
37
+ - e7978a8: Stop draw interactions and remove tooltips before saving.
38
+ - Updated dependencies [b717121]
39
+ - Updated dependencies [e7978a8]
40
+ - Updated dependencies [7a5f1e1]
41
+ - Updated dependencies [7ae9f90]
42
+ - Updated dependencies [d8337a6]
43
+ - Updated dependencies [49f0207]
44
+ - Updated dependencies [b2127df]
45
+ - Updated dependencies [2fa8020]
46
+ - Updated dependencies [7ae9f90]
47
+ - Updated dependencies [d8337a6]
48
+ - @open-pioneer/map@0.8.0
40
49
 
41
50
  ## 0.7.0
42
51
 
43
52
  ### Minor Changes
44
53
 
45
- - 310800c: Switch from `peerDependencies` to normal `dependencies`. Peer dependencies have some usability problems when used at scale.
54
+ - 310800c: Switch from `peerDependencies` to normal `dependencies`. Peer dependencies have some usability problems when used at scale.
46
55
 
47
56
  ### Patch Changes
48
57
 
49
- - 310800c: Update core packages version.
50
- - a8b3449: Switch to a new versioning strategy.
51
- From now on, packages released by this repository share a common version number.
52
- - 900eb11: Update dependencies.
53
- - Updated dependencies [310800c]
54
- - Updated dependencies [2502050]
55
- - Updated dependencies [583f1d6]
56
- - Updated dependencies [583f1d6]
57
- - Updated dependencies [397d617]
58
- - Updated dependencies [a8b3449]
59
- - Updated dependencies [310800c]
60
- - Updated dependencies [900eb11]
61
- - Updated dependencies [583f1d6]
62
- - Updated dependencies [397d617]
63
- - @open-pioneer/map@0.7.0
58
+ - 310800c: Update core packages version.
59
+ - a8b3449: Switch to a new versioning strategy.
60
+ From now on, packages released by this repository share a common version number.
61
+ - 900eb11: Update dependencies.
62
+ - Updated dependencies [310800c]
63
+ - Updated dependencies [2502050]
64
+ - Updated dependencies [583f1d6]
65
+ - Updated dependencies [583f1d6]
66
+ - Updated dependencies [397d617]
67
+ - Updated dependencies [a8b3449]
68
+ - Updated dependencies [310800c]
69
+ - Updated dependencies [900eb11]
70
+ - Updated dependencies [583f1d6]
71
+ - Updated dependencies [397d617]
72
+ - @open-pioneer/map@0.7.0
64
73
 
65
74
  ## 0.2.3
66
75
 
67
76
  ### Patch Changes
68
77
 
69
- - b152428: Update trails dependencies
70
- - Updated dependencies [b152428]
71
- - Updated dependencies [291ccb6]
72
- - @open-pioneer/map@0.6.1
78
+ - b152428: Update trails dependencies
79
+ - Updated dependencies [b152428]
80
+ - Updated dependencies [291ccb6]
81
+ - @open-pioneer/map@0.6.1
73
82
 
74
83
  ## 0.2.2
75
84
 
76
85
  ### Patch Changes
77
86
 
78
- - 28e092a: Update dependencies
79
- - 484ad86: Add tooltip role to tooltip divs (See https://github.com/open-pioneer/trails-openlayers-base-packages/issues/309).
80
- - Updated dependencies [28e092a]
81
- - Updated dependencies [0d51d2f]
82
- - Updated dependencies [76f8863]
83
- - @open-pioneer/map@0.6.0
87
+ - 28e092a: Update dependencies
88
+ - 484ad86: Add tooltip role to tooltip divs (See https://github.com/open-pioneer/trails-openlayers-base-packages/issues/309).
89
+ - Updated dependencies [28e092a]
90
+ - Updated dependencies [0d51d2f]
91
+ - Updated dependencies [76f8863]
92
+ - @open-pioneer/map@0.6.0
84
93
 
85
94
  ## 0.2.1
86
95
 
87
96
  ### Patch Changes
88
97
 
89
- - 4140646: Update trails dependencies
90
- - 4140646: Update to react 18.3.1
91
- - 81bc7da: Update trails dependencies
92
- - 2c092dc: Update dependencies
93
- - Updated dependencies [4140646]
94
- - Updated dependencies [4140646]
95
- - Updated dependencies [b5bb7a1]
96
- - Updated dependencies [81bc7da]
97
- - Updated dependencies [2c092dc]
98
- - @open-pioneer/map@0.5.1
98
+ - 4140646: Update trails dependencies
99
+ - 4140646: Update to react 18.3.1
100
+ - 81bc7da: Update trails dependencies
101
+ - 2c092dc: Update dependencies
102
+ - Updated dependencies [4140646]
103
+ - Updated dependencies [4140646]
104
+ - Updated dependencies [b5bb7a1]
105
+ - Updated dependencies [81bc7da]
106
+ - Updated dependencies [2c092dc]
107
+ - @open-pioneer/map@0.5.1
99
108
 
100
109
  ## 0.2.0
101
110
 
102
111
  ### Minor Changes
103
112
 
104
- - 434fd3e: Implemented update feature workflow in EditingService
113
+ - 434fd3e: Implemented update feature workflow in EditingService
105
114
 
106
115
  ### Patch Changes
107
116
 
108
- - Updated dependencies [520a97b]
109
- - @open-pioneer/map@0.5.0
117
+ - Updated dependencies [520a97b]
118
+ - @open-pioneer/map@0.5.0
110
119
 
111
120
  ## 0.1.0
112
121
 
113
122
  ### Minor Changes
114
123
 
115
- - ac7fdd1: Initial release.
116
- - 9334e81: Update to OpenLayers 9
124
+ - ac7fdd1: Initial release.
125
+ - 9334e81: Update to OpenLayers 9
117
126
 
118
127
  ### Patch Changes
119
128
 
120
- - 1a8ad89: Update package.json metadata
121
- - 6162979: Update versions of core packages
122
- - Updated dependencies [1a8ad89]
123
- - Updated dependencies [a11bf72]
124
- - Updated dependencies [fc6bf82]
125
- - Updated dependencies [a0d8882]
126
- - Updated dependencies [6162979]
127
- - Updated dependencies [9334e81]
128
- - Updated dependencies [ac7fdd1]
129
- - Updated dependencies [13ea342]
130
- - @open-pioneer/map@0.4.0
129
+ - 1a8ad89: Update package.json metadata
130
+ - 6162979: Update versions of core packages
131
+ - Updated dependencies [1a8ad89]
132
+ - Updated dependencies [a11bf72]
133
+ - Updated dependencies [fc6bf82]
134
+ - Updated dependencies [a0d8882]
135
+ - Updated dependencies [6162979]
136
+ - Updated dependencies [9334e81]
137
+ - Updated dependencies [ac7fdd1]
138
+ - Updated dependencies [13ea342]
139
+ - @open-pioneer/map@0.4.0
@@ -1 +1 @@
1
- {"version":3,"file":"EditingCreateWorkflowImpl.js","sources":["EditingCreateWorkflowImpl.ts"],"sourcesContent":["// SPDX-FileCopyrightText: 2023 Open Pioneer project (https://github.com/open-pioneer)\n// SPDX-License-Identifier: Apache-2.0\nimport { Reactive, effect, reactive } from \"@conterra/reactivity-core\";\nimport { ManualPromise, Resource, createLogger, createManualPromise } from \"@open-pioneer/core\";\nimport { HttpService } from \"@open-pioneer/http\";\nimport { MapModel, TOPMOST_LAYER_Z } from \"@open-pioneer/map\";\nimport { PackageIntl } from \"@open-pioneer/runtime\";\nimport Feature from \"ol/Feature\";\nimport OlMap from \"ol/Map\";\nimport { unByKey } from \"ol/Observable\";\nimport { EventsKey } from \"ol/events\";\nimport {\n default as GeoJSON,\n default as GeoJSONGeometry,\n default as GeoJSONGeometryCollection\n} from \"ol/format/GeoJSON\";\nimport { Draw } from \"ol/interaction\";\nimport VectorLayer from \"ol/layer/Vector\";\nimport VectorSource from \"ol/source/Vector\";\nimport { FlatStyle } from \"ol/style/flat\";\nimport { saveCreatedFeature } from \"./SaveFeaturesHandler\";\nimport { Tooltip, createTooltip } from \"./Tooltip\";\nimport { EditingWorkflow, EditingWorkflowProps, EditingWorkflowState } from \"./api\";\nimport { createStyles } from \"./style-utils\";\n\nconst LOG = createLogger(\"editing:EditingCreateWorkflowImpl\");\n\nexport class EditingCreateWorkflowImpl implements EditingWorkflow {\n #waiter: ManualPromise<Record<string, string> | undefined> | undefined;\n\n private _httpService: HttpService;\n private _intl: PackageIntl;\n\n private _map: MapModel;\n private _polygonStyle: FlatStyle;\n private _vertexStyle: FlatStyle;\n private _state: Reactive<EditingWorkflowState>;\n private _editLayerURL: URL;\n private _featureId: string | undefined;\n\n private _editingSource: VectorSource;\n private _editingLayer: VectorLayer<VectorSource, Feature>;\n private _drawInteraction: Draw;\n private _olMap: OlMap;\n private _tooltip: Tooltip;\n private _enterHandler: (e: KeyboardEvent) => void;\n private _escapeHandler: (e: KeyboardEvent) => void;\n\n private _error: Error | undefined;\n\n private _interactionListener: Array<EventsKey>;\n private _mapListener: Array<Resource>;\n\n constructor(options: EditingWorkflowProps) {\n this._httpService = options.httpService;\n this._intl = options.intl;\n\n this._polygonStyle = options.polygonStyle;\n this._vertexStyle = options.vertexStyle;\n\n this._map = options.map;\n this._olMap = options.map.olMap;\n this._state = reactive(\"active:initialized\");\n this._editLayerURL = options.ogcApiFeatureLayerUrl;\n\n this._editingSource = new VectorSource();\n this._editingLayer = new VectorLayer({\n source: this._editingSource,\n zIndex: TOPMOST_LAYER_Z,\n properties: {\n name: \"editing-layer\"\n }\n });\n\n this._drawInteraction = new Draw({\n source: this._editingSource,\n type: \"Polygon\",\n style: createStyles({\n polygon: this._polygonStyle,\n vertex: this._vertexStyle\n })\n });\n\n this._tooltip = createTooltip(\n this._olMap,\n this._intl.formatMessage({ id: \"create.tooltip.begin\" })\n );\n\n this._enterHandler = (e: KeyboardEvent) => {\n if (\n (e.code === \"Enter\" || e.code === \"NumpadEnter\") &&\n e.target === this._olMap.getTargetElement()\n ) {\n const features =\n this._drawInteraction.getOverlay().getSource()?.getFeatures() ?? [];\n\n /**\n * Get the first linear ring of the polygon\n * Coordinates include closing vertex, so a triangle has 4, while drawing the\n * actual mouse position is an extra vertex, therefor we have to check\n * \"length > 4\" instead of \"length >= 4\"\n */\n if (features[0] && features[0].getGeometry().getCoordinates()[0].length > 4) {\n this.triggerSave();\n }\n }\n };\n\n this._escapeHandler = (e: KeyboardEvent) => {\n if (e.code === \"Escape\" && e.target === this._olMap.getTargetElement()) {\n this.reset();\n }\n };\n\n this._interactionListener = [];\n this._mapListener = [];\n\n this._start();\n }\n\n getDrawInteraction() {\n return this._drawInteraction;\n }\n\n getState() {\n return this._state.value;\n }\n\n private _setState(state: EditingWorkflowState) {\n this._state.value = state;\n }\n\n private _save(feature: Feature) {\n this._setState(\"active:saving\");\n\n const layerUrl = this._editLayerURL;\n\n const geometry = feature.getGeometry();\n if (!geometry) {\n this._destroy();\n this._error = new Error(\"no geometry available\");\n this.#waiter?.reject(this._error);\n return;\n }\n const projection = this._olMap.getView().getProjection();\n const geoJson = new GeoJSON({\n dataProjection: projection\n });\n const geoJSONGeometry: GeoJSONGeometry | GeoJSONGeometryCollection =\n geoJson.writeGeometryObject(geometry, {\n rightHanded: true,\n decimals: 10\n });\n\n this._olMap.removeInteraction(this._drawInteraction);\n this._tooltip.destroy();\n\n saveCreatedFeature(this._httpService, layerUrl, geoJSONGeometry, projection)\n .then((featureId) => {\n this._featureId = featureId;\n this._destroy();\n this.#waiter?.resolve({ featureId: this._featureId });\n })\n .catch((err: Error) => {\n LOG.error(err);\n this._destroy();\n this._error = new Error(\"Failed to save feature\", { cause: err });\n this.#waiter?.reject(this._error);\n });\n }\n\n private _start() {\n this._olMap.addLayer(this._editingLayer);\n this._olMap.addInteraction(this._drawInteraction);\n\n // Add EventListener on focused map to abort actual interaction via `Escape`\n const containerEvents = effect(() => {\n const container = this._map.container;\n if (!container) {\n return;\n }\n\n container.addEventListener(\"keydown\", this._enterHandler, false);\n container.addEventListener(\"keydown\", this._escapeHandler, false);\n return () => {\n container.removeEventListener(\"keydown\", this._enterHandler);\n container.removeEventListener(\"keydown\", this._escapeHandler);\n };\n });\n\n this._tooltip.setVisible(true);\n\n const drawStart = this._drawInteraction.on(\"drawstart\", () => {\n this._setState(\"active:drawing\");\n this._tooltip.setText(\n this._intl.formatMessage({\n id: \"create.tooltip.continue\"\n })\n );\n });\n\n const drawEnd = this._drawInteraction.on(\"drawend\", (e) => {\n const feature = e.feature;\n if (!feature) {\n this._destroy();\n this._error = new Error(\"no feature available\");\n this.#waiter?.reject(this._error);\n return;\n }\n this._save(feature);\n });\n\n this._interactionListener.push(drawStart, drawEnd);\n this._mapListener.push(containerEvents);\n }\n\n reset() {\n this._drawInteraction.abortDrawing();\n this._tooltip.setText(\n this._intl.formatMessage({\n id: \"create.tooltip.begin\"\n })\n );\n this._setState(\"active:initialized\");\n }\n\n stop() {\n this._destroy();\n this.#waiter?.resolve(undefined);\n }\n\n private _destroy() {\n this._olMap.removeLayer(this._editingLayer);\n this._olMap.removeInteraction(this._drawInteraction);\n this._tooltip.destroy();\n\n // Remove event listener on interaction and on map\n this._interactionListener.forEach((listener) => {\n unByKey(listener);\n });\n this._mapListener.forEach((listener) => {\n listener.destroy();\n });\n\n this._setState(\"destroyed\");\n }\n\n triggerSave() {\n // Stop drawing - the `drawend` event is dispatched before inserting the feature.\n this._drawInteraction.finishDrawing();\n }\n\n whenComplete(): Promise<Record<string, string> | undefined> {\n if (this._state.value === \"destroyed\") {\n if (this._error) {\n return Promise.reject(this._error);\n } else {\n if (this._featureId) {\n return Promise.resolve({ featureId: this._featureId });\n } else {\n return Promise.resolve(undefined);\n }\n }\n }\n\n const manualPromise = (this.#waiter ??= createManualPromise());\n return manualPromise.promise;\n }\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"EditingCreateWorkflowImpl.js","sources":["EditingCreateWorkflowImpl.ts"],"sourcesContent":["// SPDX-FileCopyrightText: 2023-2025 Open Pioneer project (https://github.com/open-pioneer)\n// SPDX-License-Identifier: Apache-2.0\nimport { Reactive, effect, reactive } from \"@conterra/reactivity-core\";\nimport { ManualPromise, Resource, createLogger, createManualPromise } from \"@open-pioneer/core\";\nimport { HttpService } from \"@open-pioneer/http\";\nimport { MapModel, TOPMOST_LAYER_Z } from \"@open-pioneer/map\";\nimport { PackageIntl } from \"@open-pioneer/runtime\";\nimport Feature from \"ol/Feature\";\nimport OlMap from \"ol/Map\";\nimport { unByKey } from \"ol/Observable\";\nimport { EventsKey } from \"ol/events\";\nimport {\n default as GeoJSON,\n default as GeoJSONGeometry,\n default as GeoJSONGeometryCollection\n} from \"ol/format/GeoJSON\";\nimport { Draw } from \"ol/interaction\";\nimport VectorLayer from \"ol/layer/Vector\";\nimport VectorSource from \"ol/source/Vector\";\nimport { FlatStyle } from \"ol/style/flat\";\nimport { saveCreatedFeature } from \"./SaveFeaturesHandler\";\nimport { Tooltip, createTooltip } from \"./Tooltip\";\nimport { EditingWorkflow, EditingWorkflowProps, EditingWorkflowState } from \"./api\";\nimport { createStyles } from \"./style-utils\";\n\nconst LOG = createLogger(\"editing:EditingCreateWorkflowImpl\");\n\nexport class EditingCreateWorkflowImpl implements EditingWorkflow {\n #waiter: ManualPromise<Record<string, string> | undefined> | undefined;\n\n private _httpService: HttpService;\n private _intl: PackageIntl;\n\n private _map: MapModel;\n private _polygonStyle: FlatStyle;\n private _vertexStyle: FlatStyle;\n private _state: Reactive<EditingWorkflowState>;\n private _editLayerURL: URL;\n private _featureId: string | undefined;\n\n private _editingSource: VectorSource;\n private _editingLayer: VectorLayer<VectorSource, Feature>;\n private _drawInteraction: Draw;\n private _olMap: OlMap;\n private _tooltip: Tooltip;\n private _enterHandler: (e: KeyboardEvent) => void;\n private _escapeHandler: (e: KeyboardEvent) => void;\n\n private _error: Error | undefined;\n\n private _interactionListener: Array<EventsKey>;\n private _mapListener: Array<Resource>;\n\n constructor(options: EditingWorkflowProps) {\n this._httpService = options.httpService;\n this._intl = options.intl;\n\n this._polygonStyle = options.polygonStyle;\n this._vertexStyle = options.vertexStyle;\n\n this._map = options.map;\n this._olMap = options.map.olMap;\n this._state = reactive(\"active:initialized\");\n this._editLayerURL = options.ogcApiFeatureLayerUrl;\n\n this._editingSource = new VectorSource();\n this._editingLayer = new VectorLayer({\n source: this._editingSource,\n zIndex: TOPMOST_LAYER_Z,\n properties: {\n name: \"editing-layer\"\n }\n });\n\n this._drawInteraction = new Draw({\n source: this._editingSource,\n type: \"Polygon\",\n style: createStyles({\n polygon: this._polygonStyle,\n vertex: this._vertexStyle\n })\n });\n\n this._tooltip = createTooltip(\n this._olMap,\n this._intl.formatMessage({ id: \"create.tooltip.begin\" })\n );\n\n this._enterHandler = (e: KeyboardEvent) => {\n if (\n (e.code === \"Enter\" || e.code === \"NumpadEnter\") &&\n e.target === this._olMap.getTargetElement()\n ) {\n const features =\n this._drawInteraction.getOverlay().getSource()?.getFeatures() ?? [];\n\n /**\n * Get the first linear ring of the polygon\n * Coordinates include closing vertex, so a triangle has 4, while drawing the\n * actual mouse position is an extra vertex, therefor we have to check\n * \"length > 4\" instead of \"length >= 4\"\n */\n if (features[0] && features[0].getGeometry().getCoordinates()[0].length > 4) {\n this.triggerSave();\n }\n }\n };\n\n this._escapeHandler = (e: KeyboardEvent) => {\n if (e.code === \"Escape\" && e.target === this._olMap.getTargetElement()) {\n this.reset();\n }\n };\n\n this._interactionListener = [];\n this._mapListener = [];\n\n this._start();\n }\n\n getDrawInteraction() {\n return this._drawInteraction;\n }\n\n getState() {\n return this._state.value;\n }\n\n private _setState(state: EditingWorkflowState) {\n this._state.value = state;\n }\n\n private _save(feature: Feature) {\n this._setState(\"active:saving\");\n\n const layerUrl = this._editLayerURL;\n\n const geometry = feature.getGeometry();\n if (!geometry) {\n this._destroy();\n this._error = new Error(\"no geometry available\");\n this.#waiter?.reject(this._error);\n return;\n }\n const projection = this._olMap.getView().getProjection();\n const geoJson = new GeoJSON({\n dataProjection: projection\n });\n const geoJSONGeometry: GeoJSONGeometry | GeoJSONGeometryCollection =\n geoJson.writeGeometryObject(geometry, {\n rightHanded: true,\n decimals: 10\n });\n\n this._olMap.removeInteraction(this._drawInteraction);\n this._tooltip.destroy();\n\n saveCreatedFeature(this._httpService, layerUrl, geoJSONGeometry, projection)\n .then((featureId) => {\n this._featureId = featureId;\n this._destroy();\n this.#waiter?.resolve({ featureId: this._featureId });\n })\n .catch((err: Error) => {\n LOG.error(err);\n this._destroy();\n this._error = new Error(\"Failed to save feature\", { cause: err });\n this.#waiter?.reject(this._error);\n });\n }\n\n private _start() {\n this._olMap.addLayer(this._editingLayer);\n this._olMap.addInteraction(this._drawInteraction);\n\n // Add EventListener on focused map to abort actual interaction via `Escape`\n const containerEvents = effect(() => {\n const container = this._map.container;\n if (!container) {\n return;\n }\n\n container.addEventListener(\"keydown\", this._enterHandler, false);\n container.addEventListener(\"keydown\", this._escapeHandler, false);\n return () => {\n container.removeEventListener(\"keydown\", this._enterHandler);\n container.removeEventListener(\"keydown\", this._escapeHandler);\n };\n });\n\n this._tooltip.setVisible(true);\n\n const drawStart = this._drawInteraction.on(\"drawstart\", () => {\n this._setState(\"active:drawing\");\n this._tooltip.setText(\n this._intl.formatMessage({\n id: \"create.tooltip.continue\"\n })\n );\n });\n\n const drawEnd = this._drawInteraction.on(\"drawend\", (e) => {\n const feature = e.feature;\n if (!feature) {\n this._destroy();\n this._error = new Error(\"no feature available\");\n this.#waiter?.reject(this._error);\n return;\n }\n this._save(feature);\n });\n\n this._interactionListener.push(drawStart, drawEnd);\n this._mapListener.push(containerEvents);\n }\n\n reset() {\n this._drawInteraction.abortDrawing();\n this._tooltip.setText(\n this._intl.formatMessage({\n id: \"create.tooltip.begin\"\n })\n );\n this._setState(\"active:initialized\");\n }\n\n stop() {\n this._destroy();\n this.#waiter?.resolve(undefined);\n }\n\n private _destroy() {\n this._olMap.removeLayer(this._editingLayer);\n this._olMap.removeInteraction(this._drawInteraction);\n this._tooltip.destroy();\n\n // Remove event listener on interaction and on map\n this._interactionListener.forEach((listener) => {\n unByKey(listener);\n });\n this._mapListener.forEach((listener) => {\n listener.destroy();\n });\n\n this._setState(\"destroyed\");\n }\n\n triggerSave() {\n // Stop drawing - the `drawend` event is dispatched before inserting the feature.\n this._drawInteraction.finishDrawing();\n }\n\n whenComplete(): Promise<Record<string, string> | undefined> {\n if (this._state.value === \"destroyed\") {\n if (this._error) {\n return Promise.reject(this._error);\n } else {\n if (this._featureId) {\n return Promise.resolve({ featureId: this._featureId });\n } else {\n return Promise.resolve(undefined);\n }\n }\n }\n\n const manualPromise = (this.#waiter ??= createManualPromise());\n return manualPromise.promise;\n }\n}\n"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"EditingServiceImpl.js","sources":["EditingServiceImpl.ts"],"sourcesContent":["// SPDX-FileCopyrightText: 2023 Open Pioneer project (https://github.com/open-pioneer)\n// SPDX-License-Identifier: Apache-2.0\nimport { MapModel, MapRegistry } from \"@open-pioneer/map\";\nimport { EditingService } from \"./api\";\nimport { EditingCreateWorkflowImpl } from \"./EditingCreateWorkflowImpl\";\nimport { EditingUpdateWorkflowImpl } from \"./EditingUpdateWorkflowImpl\";\nimport { FlatStyle } from \"ol/style/flat\";\nimport { ServiceOptions } from \"@open-pioneer/runtime\";\nimport { HttpService } from \"@open-pioneer/http\";\nimport { Feature } from \"ol\";\nimport { syncWatch } from \"@conterra/reactivity-core\";\n\nexport interface References {\n mapRegistry: MapRegistry;\n httpService: HttpService;\n}\n\nexport class EditingServiceImpl implements EditingService {\n private _serviceOptions: ServiceOptions<References>;\n private _workflows: Map<string, EditingCreateWorkflowImpl | EditingUpdateWorkflowImpl>;\n\n constructor(serviceOptions: ServiceOptions<References>) {\n this._serviceOptions = serviceOptions;\n this._workflows = new Map();\n }\n\n createFeature(map: MapModel, ogcApiFeatureLayerUrl: URL): EditingCreateWorkflowImpl {\n if (!ogcApiFeatureLayerUrl || !map || !map.id) {\n throw new Error(\"Map, mapId or url is undefined.\");\n }\n\n const mapId = map.id;\n\n let workflow = this._workflows.get(mapId);\n if (workflow) {\n throw new Error(\n \"EditingWorkflow could not be started. EditingWorkflow already in progress for this map.\"\n );\n }\n\n workflow = new EditingCreateWorkflowImpl({\n map,\n ogcApiFeatureLayerUrl,\n polygonStyle: this._serviceOptions.properties.polygonStyle as FlatStyle,\n vertexStyle: this._serviceOptions.properties.vertexStyle as FlatStyle,\n httpService: this._serviceOptions.references.httpService,\n intl: this._serviceOptions.intl\n });\n this._workflows.set(mapId, workflow);\n this._connectToWorkflowDestroyEvent(workflow, mapId);\n\n return workflow;\n }\n\n updateFeature(\n map: MapModel,\n ogcApiFeatureLayerUrl: URL,\n feature: Feature\n ): EditingUpdateWorkflowImpl {\n if (!ogcApiFeatureLayerUrl || !map || !map.id) {\n throw new Error(\"Map, mapId or url is undefined.\");\n }\n\n const mapId = map.id;\n\n let workflow = this._workflows.get(mapId);\n if (workflow) {\n throw new Error(\n \"EditingWorkflow could not be started. EditingWorkflow already in progress for this map.\"\n );\n }\n\n workflow = new EditingUpdateWorkflowImpl({\n map,\n ogcApiFeatureLayerUrl,\n feature,\n polygonStyle: this._serviceOptions.properties.polygonStyle as FlatStyle,\n vertexStyle: this._serviceOptions.properties.vertexStyle as FlatStyle,\n httpService: this._serviceOptions.references.httpService,\n intl: this._serviceOptions.intl\n });\n this._workflows.set(mapId, workflow);\n this._connectToWorkflowDestroyEvent(workflow, mapId);\n\n return workflow;\n }\n\n stop(mapId: string): void {\n const workflow = this._workflows.get(mapId);\n if (workflow) {\n workflow.stop();\n }\n // A missing workflow is not an error if all we want to do is stop it.\n }\n\n reset(mapId: string): void {\n const workflow = this._workflows.get(mapId);\n if (workflow) {\n workflow.reset();\n } else {\n throw new Error(\"No workflow found for mapId: \" + mapId);\n }\n }\n\n _connectToWorkflowDestroyEvent(\n workflow: EditingCreateWorkflowImpl | EditingUpdateWorkflowImpl,\n mapId: string\n ) {\n const watchStateHandle = syncWatch(\n () => [workflow.getState()],\n ([newState]) => {\n if (newState === \"destroyed\") {\n if (this._workflows.get(mapId) === workflow) {\n this._workflows.delete(mapId);\n }\n watchStateHandle.destroy();\n }\n }\n );\n }\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"EditingServiceImpl.js","sources":["EditingServiceImpl.ts"],"sourcesContent":["// SPDX-FileCopyrightText: 2023-2025 Open Pioneer project (https://github.com/open-pioneer)\n// SPDX-License-Identifier: Apache-2.0\nimport { MapModel, MapRegistry } from \"@open-pioneer/map\";\nimport { EditingService } from \"./api\";\nimport { EditingCreateWorkflowImpl } from \"./EditingCreateWorkflowImpl\";\nimport { EditingUpdateWorkflowImpl } from \"./EditingUpdateWorkflowImpl\";\nimport { FlatStyle } from \"ol/style/flat\";\nimport { ServiceOptions } from \"@open-pioneer/runtime\";\nimport { HttpService } from \"@open-pioneer/http\";\nimport { Feature } from \"ol\";\nimport { syncWatch } from \"@conterra/reactivity-core\";\n\nexport interface References {\n mapRegistry: MapRegistry;\n httpService: HttpService;\n}\n\nexport class EditingServiceImpl implements EditingService {\n private _serviceOptions: ServiceOptions<References>;\n private _workflows: Map<string, EditingCreateWorkflowImpl | EditingUpdateWorkflowImpl>;\n\n constructor(serviceOptions: ServiceOptions<References>) {\n this._serviceOptions = serviceOptions;\n this._workflows = new Map();\n }\n\n createFeature(map: MapModel, ogcApiFeatureLayerUrl: URL): EditingCreateWorkflowImpl {\n if (!ogcApiFeatureLayerUrl || !map || !map.id) {\n throw new Error(\"Map, mapId or url is undefined.\");\n }\n\n const mapId = map.id;\n\n let workflow = this._workflows.get(mapId);\n if (workflow) {\n throw new Error(\n \"EditingWorkflow could not be started. EditingWorkflow already in progress for this map.\"\n );\n }\n\n workflow = new EditingCreateWorkflowImpl({\n map,\n ogcApiFeatureLayerUrl,\n polygonStyle: this._serviceOptions.properties.polygonStyle as FlatStyle,\n vertexStyle: this._serviceOptions.properties.vertexStyle as FlatStyle,\n httpService: this._serviceOptions.references.httpService,\n intl: this._serviceOptions.intl\n });\n this._workflows.set(mapId, workflow);\n this._connectToWorkflowDestroyEvent(workflow, mapId);\n\n return workflow;\n }\n\n updateFeature(\n map: MapModel,\n ogcApiFeatureLayerUrl: URL,\n feature: Feature\n ): EditingUpdateWorkflowImpl {\n if (!ogcApiFeatureLayerUrl || !map || !map.id) {\n throw new Error(\"Map, mapId or url is undefined.\");\n }\n\n const mapId = map.id;\n\n let workflow = this._workflows.get(mapId);\n if (workflow) {\n throw new Error(\n \"EditingWorkflow could not be started. EditingWorkflow already in progress for this map.\"\n );\n }\n\n workflow = new EditingUpdateWorkflowImpl({\n map,\n ogcApiFeatureLayerUrl,\n feature,\n polygonStyle: this._serviceOptions.properties.polygonStyle as FlatStyle,\n vertexStyle: this._serviceOptions.properties.vertexStyle as FlatStyle,\n httpService: this._serviceOptions.references.httpService,\n intl: this._serviceOptions.intl\n });\n this._workflows.set(mapId, workflow);\n this._connectToWorkflowDestroyEvent(workflow, mapId);\n\n return workflow;\n }\n\n stop(mapId: string): void {\n const workflow = this._workflows.get(mapId);\n if (workflow) {\n workflow.stop();\n }\n // A missing workflow is not an error if all we want to do is stop it.\n }\n\n reset(mapId: string): void {\n const workflow = this._workflows.get(mapId);\n if (workflow) {\n workflow.reset();\n } else {\n throw new Error(\"No workflow found for mapId: \" + mapId);\n }\n }\n\n _connectToWorkflowDestroyEvent(\n workflow: EditingCreateWorkflowImpl | EditingUpdateWorkflowImpl,\n mapId: string\n ) {\n const watchStateHandle = syncWatch(\n () => [workflow.getState()],\n ([newState]) => {\n if (newState === \"destroyed\") {\n if (this._workflows.get(mapId) === workflow) {\n this._workflows.delete(mapId);\n }\n watchStateHandle.destroy();\n }\n }\n );\n }\n}\n"],"names":[],"mappings":";;;;AAiBO,MAAM,kBAA6C,CAAA;AAAA,EAC9C,eAAA;AAAA,EACA,UAAA;AAAA,EAER,YAAY,cAA4C,EAAA;AACpD,IAAA,IAAA,CAAK,eAAkB,GAAA,cAAA;AACvB,IAAK,IAAA,CAAA,UAAA,uBAAiB,GAAI,EAAA;AAAA;AAC9B,EAEA,aAAA,CAAc,KAAe,qBAAuD,EAAA;AAChF,IAAA,IAAI,CAAC,qBAAyB,IAAA,CAAC,GAAO,IAAA,CAAC,IAAI,EAAI,EAAA;AAC3C,MAAM,MAAA,IAAI,MAAM,iCAAiC,CAAA;AAAA;AAGrD,IAAA,MAAM,QAAQ,GAAI,CAAA,EAAA;AAElB,IAAA,IAAI,QAAW,GAAA,IAAA,CAAK,UAAW,CAAA,GAAA,CAAI,KAAK,CAAA;AACxC,IAAA,IAAI,QAAU,EAAA;AACV,MAAA,MAAM,IAAI,KAAA;AAAA,QACN;AAAA,OACJ;AAAA;AAGJ,IAAA,QAAA,GAAW,IAAI,yBAA0B,CAAA;AAAA,MACrC,GAAA;AAAA,MACA,qBAAA;AAAA,MACA,YAAA,EAAc,IAAK,CAAA,eAAA,CAAgB,UAAW,CAAA,YAAA;AAAA,MAC9C,WAAA,EAAa,IAAK,CAAA,eAAA,CAAgB,UAAW,CAAA,WAAA;AAAA,MAC7C,WAAA,EAAa,IAAK,CAAA,eAAA,CAAgB,UAAW,CAAA,WAAA;AAAA,MAC7C,IAAA,EAAM,KAAK,eAAgB,CAAA;AAAA,KAC9B,CAAA;AACD,IAAK,IAAA,CAAA,UAAA,CAAW,GAAI,CAAA,KAAA,EAAO,QAAQ,CAAA;AACnC,IAAK,IAAA,CAAA,8BAAA,CAA+B,UAAU,KAAK,CAAA;AAEnD,IAAO,OAAA,QAAA;AAAA;AACX,EAEA,aAAA,CACI,GACA,EAAA,qBAAA,EACA,OACyB,EAAA;AACzB,IAAA,IAAI,CAAC,qBAAyB,IAAA,CAAC,GAAO,IAAA,CAAC,IAAI,EAAI,EAAA;AAC3C,MAAM,MAAA,IAAI,MAAM,iCAAiC,CAAA;AAAA;AAGrD,IAAA,MAAM,QAAQ,GAAI,CAAA,EAAA;AAElB,IAAA,IAAI,QAAW,GAAA,IAAA,CAAK,UAAW,CAAA,GAAA,CAAI,KAAK,CAAA;AACxC,IAAA,IAAI,QAAU,EAAA;AACV,MAAA,MAAM,IAAI,KAAA;AAAA,QACN;AAAA,OACJ;AAAA;AAGJ,IAAA,QAAA,GAAW,IAAI,yBAA0B,CAAA;AAAA,MACrC,GAAA;AAAA,MACA,qBAAA;AAAA,MACA,OAAA;AAAA,MACA,YAAA,EAAc,IAAK,CAAA,eAAA,CAAgB,UAAW,CAAA,YAAA;AAAA,MAC9C,WAAA,EAAa,IAAK,CAAA,eAAA,CAAgB,UAAW,CAAA,WAAA;AAAA,MAC7C,WAAA,EAAa,IAAK,CAAA,eAAA,CAAgB,UAAW,CAAA,WAAA;AAAA,MAC7C,IAAA,EAAM,KAAK,eAAgB,CAAA;AAAA,KAC9B,CAAA;AACD,IAAK,IAAA,CAAA,UAAA,CAAW,GAAI,CAAA,KAAA,EAAO,QAAQ,CAAA;AACnC,IAAK,IAAA,CAAA,8BAAA,CAA+B,UAAU,KAAK,CAAA;AAEnD,IAAO,OAAA,QAAA;AAAA;AACX,EAEA,KAAK,KAAqB,EAAA;AACtB,IAAA,MAAM,QAAW,GAAA,IAAA,CAAK,UAAW,CAAA,GAAA,CAAI,KAAK,CAAA;AAC1C,IAAA,IAAI,QAAU,EAAA;AACV,MAAA,QAAA,CAAS,IAAK,EAAA;AAAA;AAClB;AAEJ,EAEA,MAAM,KAAqB,EAAA;AACvB,IAAA,MAAM,QAAW,GAAA,IAAA,CAAK,UAAW,CAAA,GAAA,CAAI,KAAK,CAAA;AAC1C,IAAA,IAAI,QAAU,EAAA;AACV,MAAA,QAAA,CAAS,KAAM,EAAA;AAAA,KACZ,MAAA;AACH,MAAM,MAAA,IAAI,KAAM,CAAA,+BAAA,GAAkC,KAAK,CAAA;AAAA;AAC3D;AACJ,EAEA,8BAAA,CACI,UACA,KACF,EAAA;AACE,IAAA,MAAM,gBAAmB,GAAA,SAAA;AAAA,MACrB,MAAM,CAAC,QAAS,CAAA,QAAA,EAAU,CAAA;AAAA,MAC1B,CAAC,CAAC,QAAQ,CAAM,KAAA;AACZ,QAAA,IAAI,aAAa,WAAa,EAAA;AAC1B,UAAA,IAAI,IAAK,CAAA,UAAA,CAAW,GAAI,CAAA,KAAK,MAAM,QAAU,EAAA;AACzC,YAAK,IAAA,CAAA,UAAA,CAAW,OAAO,KAAK,CAAA;AAAA;AAEhC,UAAA,gBAAA,CAAiB,OAAQ,EAAA;AAAA;AAC7B;AACJ,KACJ;AAAA;AAER;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"EditingUpdateWorkflowImpl.js","sources":["EditingUpdateWorkflowImpl.ts"],"sourcesContent":["// SPDX-FileCopyrightText: 2023 Open Pioneer project (https://github.com/open-pioneer)\n// SPDX-License-Identifier: Apache-2.0\nimport { Reactive, effect, reactive } from \"@conterra/reactivity-core\";\nimport { ManualPromise, Resource, createManualPromise } from \"@open-pioneer/core\";\nimport { HttpService } from \"@open-pioneer/http\";\nimport { MapModel, TOPMOST_LAYER_Z } from \"@open-pioneer/map\";\nimport { PackageIntl } from \"@open-pioneer/runtime\";\nimport { Collection } from \"ol\";\nimport { EventsKey } from \"ol/events\";\nimport Feature from \"ol/Feature\";\nimport {\n default as GeoJSON,\n default as GeoJSONGeometry,\n default as GeoJSONGeometryCollection\n} from \"ol/format/GeoJSON\";\nimport { Modify } from \"ol/interaction\";\nimport VectorLayer from \"ol/layer/Vector\";\nimport OlMap from \"ol/Map\";\nimport { unByKey } from \"ol/Observable\";\nimport VectorSource from \"ol/source/Vector\";\nimport { FlatStyle } from \"ol/style/flat\";\nimport { EditingWorkflow, EditingWorkflowProps, EditingWorkflowState } from \"./api\";\nimport { saveUpdatedFeature } from \"./SaveFeaturesHandler\";\nimport { createStyles } from \"./style-utils\";\nimport { Tooltip, createTooltip } from \"./Tooltip\";\n\nexport class EditingUpdateWorkflowImpl implements EditingWorkflow {\n #waiter: ManualPromise<Record<string, string> | undefined> | undefined;\n\n private _httpService: HttpService;\n private _intl: PackageIntl;\n\n private _map: MapModel;\n private _polygonStyle: FlatStyle;\n private _vertexStyle: FlatStyle;\n private _state: Reactive<EditingWorkflowState>;\n private _editLayerURL: URL;\n private _featureId: string | undefined;\n\n private _initialFeature: Feature;\n private _editFeature: Feature;\n private _editingSource: VectorSource;\n private _editingLayer: VectorLayer<VectorSource, Feature>;\n private _modifyInteraction: Modify;\n private _olMap: OlMap;\n private _tooltip: Tooltip;\n private _enterHandler: (e: KeyboardEvent) => void;\n private _escapeHandler: (e: KeyboardEvent) => void;\n\n private _error: Error | undefined;\n\n private _interactionListener: Array<EventsKey>;\n private _mapListener: Array<Resource>;\n\n constructor(options: { feature: Feature } & EditingWorkflowProps) {\n this._httpService = options.httpService;\n this._intl = options.intl;\n\n this._polygonStyle = options.polygonStyle;\n this._vertexStyle = options.vertexStyle;\n\n this._map = options.map;\n this._olMap = options.map.olMap;\n this._state = reactive(\"active:initialized\");\n this._editLayerURL = options.ogcApiFeatureLayerUrl;\n\n // Save copy of initial state for reset feature\n this._initialFeature = options.feature.clone();\n this._initialFeature.setId(options.feature.getId());\n\n // Work on copied feature to avoid the style to be applied on the original feature\n this._editFeature = options.feature.clone();\n this._editFeature.setId(options.feature.getId());\n\n this._editFeature.setStyle(\n createStyles({\n polygon: this._polygonStyle,\n vertex: this._vertexStyle\n })\n );\n\n this._editingSource = new VectorSource({\n features: new Collection([this._editFeature])\n });\n this._editingLayer = new VectorLayer({\n source: this._editingSource,\n zIndex: TOPMOST_LAYER_Z,\n properties: {\n name: \"editing-layer\"\n }\n });\n\n this._modifyInteraction = new Modify({\n source: this._editingSource\n });\n\n this._tooltip = createTooltip(\n this._olMap,\n this._intl.formatMessage({ id: \"create.tooltip.deselect\" })\n );\n\n this._enterHandler = (e: KeyboardEvent) => {\n if (\n (e.code === \"Enter\" || e.code === \"NumpadEnter\") &&\n e.target === this._olMap.getTargetElement()\n ) {\n const updatedFeature = this._editingSource.getFeatures()[0];\n if (!updatedFeature) {\n throw Error(\"no updated feature found\");\n }\n this._save(updatedFeature);\n }\n };\n\n this._escapeHandler = (e: KeyboardEvent) => {\n if (e.code === \"Escape\" && e.target === this._olMap.getTargetElement()) {\n this.reset();\n }\n };\n\n this._interactionListener = [];\n this._mapListener = [];\n\n this._start();\n }\n\n getModifyInteraction() {\n return this._modifyInteraction;\n }\n\n getState() {\n return this._state.value;\n }\n\n private _setState(state: EditingWorkflowState) {\n this._state.value = state;\n }\n\n private _save(feature: Feature) {\n this._setState(\"active:saving\");\n\n const layerUrl = this._editLayerURL;\n\n this._featureId = feature.getId()?.toString();\n if (!this._featureId) {\n this._destroy();\n this._error = new Error(\"no feature id available\");\n this.#waiter?.reject(this._error);\n return;\n }\n\n const geometry = feature?.getGeometry();\n if (!geometry) {\n this._destroy();\n this._error = new Error(\"no geometry available\");\n this.#waiter?.reject(this._error);\n return;\n }\n const projection = this._olMap.getView().getProjection();\n const geoJson = new GeoJSON({\n dataProjection: projection\n });\n const geoJSONGeometry: GeoJSONGeometry | GeoJSONGeometryCollection =\n geoJson.writeGeometryObject(geometry, {\n rightHanded: true,\n decimals: 10\n });\n\n this._olMap.removeInteraction(this._modifyInteraction);\n this._tooltip.destroy();\n\n saveUpdatedFeature(\n this._httpService,\n layerUrl,\n this._featureId,\n geoJSONGeometry,\n projection\n )\n .then((featureId) => {\n this._destroy();\n this.#waiter?.resolve({ featureId });\n })\n .catch((err: Error) => {\n this._destroy();\n this._error = new Error(\"Failed to save feature\", { cause: err });\n this.#waiter?.reject(this._error);\n });\n }\n\n private _start() {\n this._olMap.addLayer(this._editingLayer);\n this._olMap.addInteraction(this._modifyInteraction);\n\n const feature = this._editingSource.getFeatures()[0];\n if (feature && !feature.getId()?.toString()) {\n this._destroy();\n this._error = new Error(\"no feature id available\");\n this.#waiter?.reject(this._error);\n return;\n }\n\n // Add EventListener on focused map to abort actual interaction via `Escape`\n const containerEvents = effect(() => {\n const container = this._map.container;\n if (!container) {\n return;\n }\n\n container.addEventListener(\"keydown\", this._enterHandler, false);\n container.addEventListener(\"keydown\", this._escapeHandler, false);\n return () => {\n container.removeEventListener(\"keydown\", this._enterHandler);\n container.removeEventListener(\"keydown\", this._escapeHandler);\n };\n });\n\n this._tooltip.setVisible(true);\n\n const click = this._map.olMap.on(\"click\", (e) => {\n const coordinate = e.coordinate;\n const altKeyPressed = e.originalEvent.altKey;\n const features = this._editingSource.getFeaturesAtCoordinate(coordinate);\n\n if (altKeyPressed) {\n return;\n }\n\n if (features.length === 0) {\n this.triggerSave();\n }\n });\n\n const modify = this._modifyInteraction.on(\"modifystart\", () => {\n this._setState(\"active:drawing\");\n });\n\n this._interactionListener.push(click, modify);\n this._mapListener.push(containerEvents);\n }\n\n reset() {\n // Clone geometry to pass geometry, not reference\n const geometry = this._initialFeature.getGeometry()?.clone();\n\n const resetFeature = this._editingSource.getFeatures()[0];\n if (!resetFeature) {\n throw Error(\"no updated feature found\");\n }\n resetFeature.setGeometry(geometry);\n\n this._setState(\"active:initialized\");\n }\n\n stop() {\n this._destroy();\n this.#waiter?.resolve(undefined);\n }\n\n private _destroy() {\n this._editingSource.clear();\n this._olMap.removeLayer(this._editingLayer);\n this._olMap.removeInteraction(this._modifyInteraction);\n this._tooltip.destroy();\n\n // Remove event listener on interaction and on map\n this._interactionListener.forEach((listener) => {\n unByKey(listener);\n });\n this._mapListener.forEach((listener) => {\n listener.destroy();\n });\n\n this._setState(\"destroyed\");\n }\n\n triggerSave() {\n const feature = this._editingSource.getFeatures()[0];\n if (!feature) {\n throw Error(\"no updated feature found\");\n }\n this._save(feature);\n }\n\n whenComplete(): Promise<Record<string, string> | undefined> {\n if (this._state.value === \"destroyed\") {\n if (this._error) {\n return Promise.reject(this._error);\n } else {\n if (this._featureId) {\n return Promise.resolve({ featureId: this._featureId });\n } else {\n return Promise.resolve(undefined);\n }\n }\n }\n\n const manualPromise = (this.#waiter ??= createManualPromise());\n return manualPromise.promise;\n }\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"EditingUpdateWorkflowImpl.js","sources":["EditingUpdateWorkflowImpl.ts"],"sourcesContent":["// SPDX-FileCopyrightText: 2023-2025 Open Pioneer project (https://github.com/open-pioneer)\n// SPDX-License-Identifier: Apache-2.0\nimport { Reactive, effect, reactive } from \"@conterra/reactivity-core\";\nimport { ManualPromise, Resource, createManualPromise } from \"@open-pioneer/core\";\nimport { HttpService } from \"@open-pioneer/http\";\nimport { MapModel, TOPMOST_LAYER_Z } from \"@open-pioneer/map\";\nimport { PackageIntl } from \"@open-pioneer/runtime\";\nimport { Collection } from \"ol\";\nimport { EventsKey } from \"ol/events\";\nimport Feature from \"ol/Feature\";\nimport {\n default as GeoJSON,\n default as GeoJSONGeometry,\n default as GeoJSONGeometryCollection\n} from \"ol/format/GeoJSON\";\nimport { Modify } from \"ol/interaction\";\nimport VectorLayer from \"ol/layer/Vector\";\nimport OlMap from \"ol/Map\";\nimport { unByKey } from \"ol/Observable\";\nimport VectorSource from \"ol/source/Vector\";\nimport { FlatStyle } from \"ol/style/flat\";\nimport { EditingWorkflow, EditingWorkflowProps, EditingWorkflowState } from \"./api\";\nimport { saveUpdatedFeature } from \"./SaveFeaturesHandler\";\nimport { createStyles } from \"./style-utils\";\nimport { Tooltip, createTooltip } from \"./Tooltip\";\n\nexport class EditingUpdateWorkflowImpl implements EditingWorkflow {\n #waiter: ManualPromise<Record<string, string> | undefined> | undefined;\n\n private _httpService: HttpService;\n private _intl: PackageIntl;\n\n private _map: MapModel;\n private _polygonStyle: FlatStyle;\n private _vertexStyle: FlatStyle;\n private _state: Reactive<EditingWorkflowState>;\n private _editLayerURL: URL;\n private _featureId: string | undefined;\n\n private _initialFeature: Feature;\n private _editFeature: Feature;\n private _editingSource: VectorSource;\n private _editingLayer: VectorLayer<VectorSource, Feature>;\n private _modifyInteraction: Modify;\n private _olMap: OlMap;\n private _tooltip: Tooltip;\n private _enterHandler: (e: KeyboardEvent) => void;\n private _escapeHandler: (e: KeyboardEvent) => void;\n\n private _error: Error | undefined;\n\n private _interactionListener: Array<EventsKey>;\n private _mapListener: Array<Resource>;\n\n constructor(options: { feature: Feature } & EditingWorkflowProps) {\n this._httpService = options.httpService;\n this._intl = options.intl;\n\n this._polygonStyle = options.polygonStyle;\n this._vertexStyle = options.vertexStyle;\n\n this._map = options.map;\n this._olMap = options.map.olMap;\n this._state = reactive(\"active:initialized\");\n this._editLayerURL = options.ogcApiFeatureLayerUrl;\n\n // Save copy of initial state for reset feature\n this._initialFeature = options.feature.clone();\n this._initialFeature.setId(options.feature.getId());\n\n // Work on copied feature to avoid the style to be applied on the original feature\n this._editFeature = options.feature.clone();\n this._editFeature.setId(options.feature.getId());\n\n this._editFeature.setStyle(\n createStyles({\n polygon: this._polygonStyle,\n vertex: this._vertexStyle\n })\n );\n\n this._editingSource = new VectorSource({\n features: new Collection([this._editFeature])\n });\n this._editingLayer = new VectorLayer({\n source: this._editingSource,\n zIndex: TOPMOST_LAYER_Z,\n properties: {\n name: \"editing-layer\"\n }\n });\n\n this._modifyInteraction = new Modify({\n source: this._editingSource\n });\n\n this._tooltip = createTooltip(\n this._olMap,\n this._intl.formatMessage({ id: \"create.tooltip.deselect\" })\n );\n\n this._enterHandler = (e: KeyboardEvent) => {\n if (\n (e.code === \"Enter\" || e.code === \"NumpadEnter\") &&\n e.target === this._olMap.getTargetElement()\n ) {\n const updatedFeature = this._editingSource.getFeatures()[0];\n if (!updatedFeature) {\n throw Error(\"no updated feature found\");\n }\n this._save(updatedFeature);\n }\n };\n\n this._escapeHandler = (e: KeyboardEvent) => {\n if (e.code === \"Escape\" && e.target === this._olMap.getTargetElement()) {\n this.reset();\n }\n };\n\n this._interactionListener = [];\n this._mapListener = [];\n\n this._start();\n }\n\n getModifyInteraction() {\n return this._modifyInteraction;\n }\n\n getState() {\n return this._state.value;\n }\n\n private _setState(state: EditingWorkflowState) {\n this._state.value = state;\n }\n\n private _save(feature: Feature) {\n this._setState(\"active:saving\");\n\n const layerUrl = this._editLayerURL;\n\n this._featureId = feature.getId()?.toString();\n if (!this._featureId) {\n this._destroy();\n this._error = new Error(\"no feature id available\");\n this.#waiter?.reject(this._error);\n return;\n }\n\n const geometry = feature?.getGeometry();\n if (!geometry) {\n this._destroy();\n this._error = new Error(\"no geometry available\");\n this.#waiter?.reject(this._error);\n return;\n }\n const projection = this._olMap.getView().getProjection();\n const geoJson = new GeoJSON({\n dataProjection: projection\n });\n const geoJSONGeometry: GeoJSONGeometry | GeoJSONGeometryCollection =\n geoJson.writeGeometryObject(geometry, {\n rightHanded: true,\n decimals: 10\n });\n\n this._olMap.removeInteraction(this._modifyInteraction);\n this._tooltip.destroy();\n\n saveUpdatedFeature(\n this._httpService,\n layerUrl,\n this._featureId,\n geoJSONGeometry,\n projection\n )\n .then((featureId) => {\n this._destroy();\n this.#waiter?.resolve({ featureId });\n })\n .catch((err: Error) => {\n this._destroy();\n this._error = new Error(\"Failed to save feature\", { cause: err });\n this.#waiter?.reject(this._error);\n });\n }\n\n private _start() {\n this._olMap.addLayer(this._editingLayer);\n this._olMap.addInteraction(this._modifyInteraction);\n\n const feature = this._editingSource.getFeatures()[0];\n if (feature && !feature.getId()?.toString()) {\n this._destroy();\n this._error = new Error(\"no feature id available\");\n this.#waiter?.reject(this._error);\n return;\n }\n\n // Add EventListener on focused map to abort actual interaction via `Escape`\n const containerEvents = effect(() => {\n const container = this._map.container;\n if (!container) {\n return;\n }\n\n container.addEventListener(\"keydown\", this._enterHandler, false);\n container.addEventListener(\"keydown\", this._escapeHandler, false);\n return () => {\n container.removeEventListener(\"keydown\", this._enterHandler);\n container.removeEventListener(\"keydown\", this._escapeHandler);\n };\n });\n\n this._tooltip.setVisible(true);\n\n const click = this._map.olMap.on(\"click\", (e) => {\n const coordinate = e.coordinate;\n const altKeyPressed = e.originalEvent.altKey;\n const features = this._editingSource.getFeaturesAtCoordinate(coordinate);\n\n if (altKeyPressed) {\n return;\n }\n\n if (features.length === 0) {\n this.triggerSave();\n }\n });\n\n const modify = this._modifyInteraction.on(\"modifystart\", () => {\n this._setState(\"active:drawing\");\n });\n\n this._interactionListener.push(click, modify);\n this._mapListener.push(containerEvents);\n }\n\n reset() {\n // Clone geometry to pass geometry, not reference\n const geometry = this._initialFeature.getGeometry()?.clone();\n\n const resetFeature = this._editingSource.getFeatures()[0];\n if (!resetFeature) {\n throw Error(\"no updated feature found\");\n }\n resetFeature.setGeometry(geometry);\n\n this._setState(\"active:initialized\");\n }\n\n stop() {\n this._destroy();\n this.#waiter?.resolve(undefined);\n }\n\n private _destroy() {\n this._editingSource.clear();\n this._olMap.removeLayer(this._editingLayer);\n this._olMap.removeInteraction(this._modifyInteraction);\n this._tooltip.destroy();\n\n // Remove event listener on interaction and on map\n this._interactionListener.forEach((listener) => {\n unByKey(listener);\n });\n this._mapListener.forEach((listener) => {\n listener.destroy();\n });\n\n this._setState(\"destroyed\");\n }\n\n triggerSave() {\n const feature = this._editingSource.getFeatures()[0];\n if (!feature) {\n throw Error(\"no updated feature found\");\n }\n this._save(feature);\n }\n\n whenComplete(): Promise<Record<string, string> | undefined> {\n if (this._state.value === \"destroyed\") {\n if (this._error) {\n return Promise.reject(this._error);\n } else {\n if (this._featureId) {\n return Promise.resolve({ featureId: this._featureId });\n } else {\n return Promise.resolve(undefined);\n }\n }\n }\n\n const manualPromise = (this.#waiter ??= createManualPromise());\n return manualPromise.promise;\n }\n}\n"],"names":[],"mappings":"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"}
package/README.md CHANGED
@@ -10,10 +10,10 @@ This package provides an editing service that allows to start and handle geometr
10
10
  >
11
11
  > Additional information:
12
12
  >
13
- > - Create Workflow: The feature is saved in the collection as a new feature with an empty properties
14
- > object and without an id (using POST).
15
- > - Update Workflow: The updated geometry is saved for the feature in the collection using a PATCH request.
16
- > In addition to the new geometry, the PATCH request sends an empty properties object within the body.
13
+ > - Create Workflow: The feature is saved in the collection as a new feature with an empty properties
14
+ > object and without an id (using POST).
15
+ > - Update Workflow: The updated geometry is saved for the feature in the collection using a PATCH request.
16
+ > In addition to the new geometry, the PATCH request sends an empty properties object within the body.
17
17
 
18
18
  ## Usage
19
19
 
@@ -68,9 +68,9 @@ workflow.on("active:drawing", () => {
68
68
 
69
69
  After the editing is finished, a `Promise` will be returned.
70
70
 
71
- - The returned promise rejects if saving the feature failed.
72
- - The promise resolves with `undefined` when the editing was stopped.
73
- - The promise resolves with the feature ID when saving was successful.
71
+ - The returned promise rejects if saving the feature failed.
72
+ - The promise resolves with `undefined` when the editing was stopped.
73
+ - The promise resolves with the feature ID when saving was successful.
74
74
 
75
75
  Example:
76
76
 
@@ -166,15 +166,15 @@ customElements.define("ol-map-app", element);
166
166
 
167
167
  The user can use the following keyboard shortcuts / interactions during create feature workflow:
168
168
 
169
- - `Esc`: Reset the drawing
170
- - `Mouse double-click`: Set last vertex and finish drawing
171
- - `Enter`: Finish drawing (vertex that is currently drawn is discarded)
169
+ - `Esc`: Reset the drawing
170
+ - `Mouse double-click`: Set last vertex and finish drawing
171
+ - `Enter`: Finish drawing (vertex that is currently drawn is discarded)
172
172
 
173
173
  The user can use the following keyboard shortcuts / interactions during update feature workflow:
174
174
 
175
- - `Esc`: Reset the drawing
176
- - `Alt + MouseClick`: Remove vertices from feature
177
- - `Mouse click (outside feature)` or `Enter`: finish editing
175
+ - `Esc`: Reset the drawing
176
+ - `Alt + MouseClick`: Remove vertices from feature
177
+ - `Mouse click (outside feature)` or `Enter`: finish editing
178
178
 
179
179
  ## License
180
180
 
@@ -1 +1 @@
1
- {"version":3,"file":"SaveFeaturesHandler.js","sources":["SaveFeaturesHandler.ts"],"sourcesContent":["// SPDX-FileCopyrightText: 2023 Open Pioneer project (https://github.com/open-pioneer)\n// SPDX-License-Identifier: Apache-2.0\nimport { HttpService } from \"@open-pioneer/http\";\nimport GeoJSONGeometry from \"ol/format/GeoJSON\";\nimport GeoJSONGeometryCollection from \"ol/format/GeoJSON\";\nimport { Projection } from \"ol/proj\";\n\n/**\n * Function to save a created feature to an OGC API Features service.\n * Resolves with feature id, or rejects if an error occurs.\n */\nexport async function saveCreatedFeature(\n httpService: HttpService,\n url: URL,\n geometry: GeoJSONGeometry | GeoJSONGeometryCollection,\n projection: Projection\n) {\n const epsgCode = projection.getCode();\n const crs = epsgCode.replace(\"EPSG:\", \"http://www.opengis.net/def/crs/EPSG/0/\");\n const response = await httpService.fetch(url, {\n method: \"POST\",\n body: JSON.stringify({ type: \"Feature\", properties: {}, geometry: geometry }),\n headers: {\n \"Content-Type\": \"application/geo+json; charset=utf-8\",\n \"Content-Crs\": `<${crs}>`\n }\n });\n\n if (!response || !response.ok || response.status !== 201) {\n throw new Error(\"Request failed: \" + response.status);\n }\n\n const location = response.headers.get(\"location\");\n if (!location) {\n throw new Error(\"Request failed: no Location response header\");\n }\n\n const featureId = location.substring(location.lastIndexOf(\"/\") + 1);\n return Promise.resolve(featureId);\n}\n\n/**\n * Function to save an updated geometry to a feature to an OGC API Features service.\n * Resolves with feature id, or rejects if an error occurs.\n */\nexport async function saveUpdatedFeature(\n httpService: HttpService,\n url: URL,\n featureId: string,\n geometry: GeoJSONGeometry | GeoJSONGeometryCollection,\n projection: Projection\n) {\n const epsgCode = projection.getCode();\n const crs = epsgCode.replace(\"EPSG:\", \"http://www.opengis.net/def/crs/EPSG/0/\");\n const featureUrl = new URL(`${url.toString()}/${featureId}`);\n const response = await httpService.fetch(featureUrl, {\n method: \"PATCH\",\n body: JSON.stringify({ type: \"Feature\", properties: {}, geometry: geometry }),\n headers: {\n \"Content-Type\": \"application/geo+json; charset=utf-8\",\n \"Content-Crs\": `<${crs}>`\n }\n });\n\n if (!response || !response.ok || response.status !== 204) {\n throw new Error(\"Request failed: \" + response.status);\n }\n\n return Promise.resolve(featureId);\n}\n"],"names":[],"mappings":"AAWA,eAAsB,kBAClB,CAAA,WAAA,EACA,GACA,EAAA,QAAA,EACA,UACF,EAAA;AACE,EAAM,MAAA,QAAA,GAAW,WAAW,OAAQ,EAAA,CAAA;AACpC,EAAA,MAAM,GAAM,GAAA,QAAA,CAAS,OAAQ,CAAA,OAAA,EAAS,wCAAwC,CAAA,CAAA;AAC9E,EAAA,MAAM,QAAW,GAAA,MAAM,WAAY,CAAA,KAAA,CAAM,GAAK,EAAA;AAAA,IAC1C,MAAQ,EAAA,MAAA;AAAA,IACR,IAAA,EAAM,IAAK,CAAA,SAAA,CAAU,EAAE,IAAA,EAAM,WAAW,UAAY,EAAA,EAAI,EAAA,QAAA,EAAoB,CAAA;AAAA,IAC5E,OAAS,EAAA;AAAA,MACL,cAAgB,EAAA,qCAAA;AAAA,MAChB,aAAA,EAAe,IAAI,GAAG,CAAA,CAAA,CAAA;AAAA,KAC1B;AAAA,GACH,CAAA,CAAA;AAED,EAAA,IAAI,CAAC,QAAY,IAAA,CAAC,SAAS,EAAM,IAAA,QAAA,CAAS,WAAW,GAAK,EAAA;AACtD,IAAA,MAAM,IAAI,KAAA,CAAM,kBAAqB,GAAA,QAAA,CAAS,MAAM,CAAA,CAAA;AAAA,GACxD;AAEA,EAAA,MAAM,QAAW,GAAA,QAAA,CAAS,OAAQ,CAAA,GAAA,CAAI,UAAU,CAAA,CAAA;AAChD,EAAA,IAAI,CAAC,QAAU,EAAA;AACX,IAAM,MAAA,IAAI,MAAM,6CAA6C,CAAA,CAAA;AAAA,GACjE;AAEA,EAAA,MAAM,YAAY,QAAS,CAAA,SAAA,CAAU,SAAS,WAAY,CAAA,GAAG,IAAI,CAAC,CAAA,CAAA;AAClE,EAAO,OAAA,OAAA,CAAQ,QAAQ,SAAS,CAAA,CAAA;AACpC,CAAA;AAMA,eAAsB,kBAClB,CAAA,WAAA,EACA,GACA,EAAA,SAAA,EACA,UACA,UACF,EAAA;AACE,EAAM,MAAA,QAAA,GAAW,WAAW,OAAQ,EAAA,CAAA;AACpC,EAAA,MAAM,GAAM,GAAA,QAAA,CAAS,OAAQ,CAAA,OAAA,EAAS,wCAAwC,CAAA,CAAA;AAC9E,EAAM,MAAA,UAAA,GAAa,IAAI,GAAI,CAAA,CAAA,EAAG,IAAI,QAAS,EAAC,CAAI,CAAA,EAAA,SAAS,CAAE,CAAA,CAAA,CAAA;AAC3D,EAAA,MAAM,QAAW,GAAA,MAAM,WAAY,CAAA,KAAA,CAAM,UAAY,EAAA;AAAA,IACjD,MAAQ,EAAA,OAAA;AAAA,IACR,IAAA,EAAM,IAAK,CAAA,SAAA,CAAU,EAAE,IAAA,EAAM,WAAW,UAAY,EAAA,EAAI,EAAA,QAAA,EAAoB,CAAA;AAAA,IAC5E,OAAS,EAAA;AAAA,MACL,cAAgB,EAAA,qCAAA;AAAA,MAChB,aAAA,EAAe,IAAI,GAAG,CAAA,CAAA,CAAA;AAAA,KAC1B;AAAA,GACH,CAAA,CAAA;AAED,EAAA,IAAI,CAAC,QAAY,IAAA,CAAC,SAAS,EAAM,IAAA,QAAA,CAAS,WAAW,GAAK,EAAA;AACtD,IAAA,MAAM,IAAI,KAAA,CAAM,kBAAqB,GAAA,QAAA,CAAS,MAAM,CAAA,CAAA;AAAA,GACxD;AAEA,EAAO,OAAA,OAAA,CAAQ,QAAQ,SAAS,CAAA,CAAA;AACpC;;;;"}
1
+ {"version":3,"file":"SaveFeaturesHandler.js","sources":["SaveFeaturesHandler.ts"],"sourcesContent":["// SPDX-FileCopyrightText: 2023-2025 Open Pioneer project (https://github.com/open-pioneer)\n// SPDX-License-Identifier: Apache-2.0\nimport { HttpService } from \"@open-pioneer/http\";\nimport GeoJSONGeometry from \"ol/format/GeoJSON\";\nimport GeoJSONGeometryCollection from \"ol/format/GeoJSON\";\nimport { Projection } from \"ol/proj\";\n\n/**\n * Function to save a created feature to an OGC API Features service.\n * Resolves with feature id, or rejects if an error occurs.\n */\nexport async function saveCreatedFeature(\n httpService: HttpService,\n url: URL,\n geometry: GeoJSONGeometry | GeoJSONGeometryCollection,\n projection: Projection\n) {\n const epsgCode = projection.getCode();\n const crs = epsgCode.replace(\"EPSG:\", \"http://www.opengis.net/def/crs/EPSG/0/\");\n const response = await httpService.fetch(url, {\n method: \"POST\",\n body: JSON.stringify({ type: \"Feature\", properties: {}, geometry: geometry }),\n headers: {\n \"Content-Type\": \"application/geo+json; charset=utf-8\",\n \"Content-Crs\": `<${crs}>`\n }\n });\n\n if (!response || !response.ok || response.status !== 201) {\n throw new Error(\"Request failed: \" + response.status);\n }\n\n const location = response.headers.get(\"location\");\n if (!location) {\n throw new Error(\"Request failed: no Location response header\");\n }\n\n const featureId = location.substring(location.lastIndexOf(\"/\") + 1);\n return Promise.resolve(featureId);\n}\n\n/**\n * Function to save an updated geometry to a feature to an OGC API Features service.\n * Resolves with feature id, or rejects if an error occurs.\n */\nexport async function saveUpdatedFeature(\n httpService: HttpService,\n url: URL,\n featureId: string,\n geometry: GeoJSONGeometry | GeoJSONGeometryCollection,\n projection: Projection\n) {\n const epsgCode = projection.getCode();\n const crs = epsgCode.replace(\"EPSG:\", \"http://www.opengis.net/def/crs/EPSG/0/\");\n const featureUrl = new URL(`${url.toString()}/${featureId}`);\n const response = await httpService.fetch(featureUrl, {\n method: \"PATCH\",\n body: JSON.stringify({ type: \"Feature\", properties: {}, geometry: geometry }),\n headers: {\n \"Content-Type\": \"application/geo+json; charset=utf-8\",\n \"Content-Crs\": `<${crs}>`\n }\n });\n\n if (!response || !response.ok || response.status !== 204) {\n throw new Error(\"Request failed: \" + response.status);\n }\n\n return Promise.resolve(featureId);\n}\n"],"names":[],"mappings":"AAWA,eAAsB,kBAClB,CAAA,WAAA,EACA,GACA,EAAA,QAAA,EACA,UACF,EAAA;AACE,EAAM,MAAA,QAAA,GAAW,WAAW,OAAQ,EAAA;AACpC,EAAA,MAAM,GAAM,GAAA,QAAA,CAAS,OAAQ,CAAA,OAAA,EAAS,wCAAwC,CAAA;AAC9E,EAAA,MAAM,QAAW,GAAA,MAAM,WAAY,CAAA,KAAA,CAAM,GAAK,EAAA;AAAA,IAC1C,MAAQ,EAAA,MAAA;AAAA,IACR,IAAA,EAAM,IAAK,CAAA,SAAA,CAAU,EAAE,IAAA,EAAM,WAAW,UAAY,EAAA,EAAI,EAAA,QAAA,EAAoB,CAAA;AAAA,IAC5E,OAAS,EAAA;AAAA,MACL,cAAgB,EAAA,qCAAA;AAAA,MAChB,aAAA,EAAe,IAAI,GAAG,CAAA,CAAA;AAAA;AAC1B,GACH,CAAA;AAED,EAAA,IAAI,CAAC,QAAY,IAAA,CAAC,SAAS,EAAM,IAAA,QAAA,CAAS,WAAW,GAAK,EAAA;AACtD,IAAA,MAAM,IAAI,KAAA,CAAM,kBAAqB,GAAA,QAAA,CAAS,MAAM,CAAA;AAAA;AAGxD,EAAA,MAAM,QAAW,GAAA,QAAA,CAAS,OAAQ,CAAA,GAAA,CAAI,UAAU,CAAA;AAChD,EAAA,IAAI,CAAC,QAAU,EAAA;AACX,IAAM,MAAA,IAAI,MAAM,6CAA6C,CAAA;AAAA;AAGjE,EAAA,MAAM,YAAY,QAAS,CAAA,SAAA,CAAU,SAAS,WAAY,CAAA,GAAG,IAAI,CAAC,CAAA;AAClE,EAAO,OAAA,OAAA,CAAQ,QAAQ,SAAS,CAAA;AACpC;AAMA,eAAsB,kBAClB,CAAA,WAAA,EACA,GACA,EAAA,SAAA,EACA,UACA,UACF,EAAA;AACE,EAAM,MAAA,QAAA,GAAW,WAAW,OAAQ,EAAA;AACpC,EAAA,MAAM,GAAM,GAAA,QAAA,CAAS,OAAQ,CAAA,OAAA,EAAS,wCAAwC,CAAA;AAC9E,EAAM,MAAA,UAAA,GAAa,IAAI,GAAI,CAAA,CAAA,EAAG,IAAI,QAAS,EAAC,CAAI,CAAA,EAAA,SAAS,CAAE,CAAA,CAAA;AAC3D,EAAA,MAAM,QAAW,GAAA,MAAM,WAAY,CAAA,KAAA,CAAM,UAAY,EAAA;AAAA,IACjD,MAAQ,EAAA,OAAA;AAAA,IACR,IAAA,EAAM,IAAK,CAAA,SAAA,CAAU,EAAE,IAAA,EAAM,WAAW,UAAY,EAAA,EAAI,EAAA,QAAA,EAAoB,CAAA;AAAA,IAC5E,OAAS,EAAA;AAAA,MACL,cAAgB,EAAA,qCAAA;AAAA,MAChB,aAAA,EAAe,IAAI,GAAG,CAAA,CAAA;AAAA;AAC1B,GACH,CAAA;AAED,EAAA,IAAI,CAAC,QAAY,IAAA,CAAC,SAAS,EAAM,IAAA,QAAA,CAAS,WAAW,GAAK,EAAA;AACtD,IAAA,MAAM,IAAI,KAAA,CAAM,kBAAqB,GAAA,QAAA,CAAS,MAAM,CAAA;AAAA;AAGxD,EAAO,OAAA,OAAA,CAAQ,QAAQ,SAAS,CAAA;AACpC;;;;"}
package/Tooltip.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"Tooltip.js","sources":["Tooltip.ts"],"sourcesContent":["// SPDX-FileCopyrightText: 2023 Open Pioneer project (https://github.com/open-pioneer)\n// SPDX-License-Identifier: Apache-2.0\nimport { Resource } from \"@open-pioneer/core\";\nimport { Overlay } from \"ol\";\nimport type OlMap from \"ol/Map\";\nimport { unByKey } from \"ol/Observable\";\n\n/**\n * Represents a tooltip rendered on the OpenLayers map\n */\nexport interface Tooltip extends Resource {\n setVisible(visible: boolean): void;\n setText(text: string): void;\n}\n\n/**\n * Creates a new tooltip on the given map, with the given text content.\n *\n * The tooltip will follow the mouse while it moves over the map.\n *\n * Note: the tooltip starts invisible, and must be toggled on via `setVisible(true)`.\n */\nexport function createTooltip(olMap: OlMap, text: string): Tooltip {\n const element = document.createElement(\"div\");\n element.className = \"editing-tooltip editing-tooltip-hidden\";\n element.role = \"tooltip\";\n\n const content = document.createElement(\"span\");\n content.textContent = text;\n element.appendChild(content);\n\n const overlay = new Overlay({\n element: element,\n offset: [15, 0],\n positioning: \"center-left\"\n });\n\n const pointerMove = olMap.on(\"pointermove\", (evt) => {\n if (evt.dragging) {\n return;\n }\n\n overlay.setPosition(evt.coordinate);\n });\n\n olMap.addOverlay(overlay);\n return {\n destroy() {\n unByKey(pointerMove);\n olMap.removeOverlay(overlay);\n },\n setVisible(visible) {\n element.classList.toggle(\"editing-tooltip-hidden\", !visible);\n },\n setText(text) {\n content.textContent = text;\n }\n };\n}\n"],"names":["text"],"mappings":";;;AAsBgB,SAAA,aAAA,CAAc,OAAc,IAAuB,EAAA;AAC/D,EAAM,MAAA,OAAA,GAAU,QAAS,CAAA,aAAA,CAAc,KAAK,CAAA,CAAA;AAC5C,EAAA,OAAA,CAAQ,SAAY,GAAA,wCAAA,CAAA;AACpB,EAAA,OAAA,CAAQ,IAAO,GAAA,SAAA,CAAA;AAEf,EAAM,MAAA,OAAA,GAAU,QAAS,CAAA,aAAA,CAAc,MAAM,CAAA,CAAA;AAC7C,EAAA,OAAA,CAAQ,WAAc,GAAA,IAAA,CAAA;AACtB,EAAA,OAAA,CAAQ,YAAY,OAAO,CAAA,CAAA;AAE3B,EAAM,MAAA,OAAA,GAAU,IAAI,OAAQ,CAAA;AAAA,IACxB,OAAA;AAAA,IACA,MAAA,EAAQ,CAAC,EAAA,EAAI,CAAC,CAAA;AAAA,IACd,WAAa,EAAA,aAAA;AAAA,GAChB,CAAA,CAAA;AAED,EAAA,MAAM,WAAc,GAAA,KAAA,CAAM,EAAG,CAAA,aAAA,EAAe,CAAC,GAAQ,KAAA;AACjD,IAAA,IAAI,IAAI,QAAU,EAAA;AACd,MAAA,OAAA;AAAA,KACJ;AAEA,IAAQ,OAAA,CAAA,WAAA,CAAY,IAAI,UAAU,CAAA,CAAA;AAAA,GACrC,CAAA,CAAA;AAED,EAAA,KAAA,CAAM,WAAW,OAAO,CAAA,CAAA;AACxB,EAAO,OAAA;AAAA,IACH,OAAU,GAAA;AACN,MAAA,OAAA,CAAQ,WAAW,CAAA,CAAA;AACnB,MAAA,KAAA,CAAM,cAAc,OAAO,CAAA,CAAA;AAAA,KAC/B;AAAA,IACA,WAAW,OAAS,EAAA;AAChB,MAAA,OAAA,CAAQ,SAAU,CAAA,MAAA,CAAO,wBAA0B,EAAA,CAAC,OAAO,CAAA,CAAA;AAAA,KAC/D;AAAA,IACA,QAAQA,KAAM,EAAA;AACV,MAAA,OAAA,CAAQ,WAAcA,GAAAA,KAAAA,CAAAA;AAAA,KAC1B;AAAA,GACJ,CAAA;AACJ;;;;"}
1
+ {"version":3,"file":"Tooltip.js","sources":["Tooltip.ts"],"sourcesContent":["// SPDX-FileCopyrightText: 2023-2025 Open Pioneer project (https://github.com/open-pioneer)\n// SPDX-License-Identifier: Apache-2.0\nimport { Resource } from \"@open-pioneer/core\";\nimport { Overlay } from \"ol\";\nimport type OlMap from \"ol/Map\";\nimport { unByKey } from \"ol/Observable\";\n\n/**\n * Represents a tooltip rendered on the OpenLayers map\n */\nexport interface Tooltip extends Resource {\n setVisible(visible: boolean): void;\n setText(text: string): void;\n}\n\n/**\n * Creates a new tooltip on the given map, with the given text content.\n *\n * The tooltip will follow the mouse while it moves over the map.\n *\n * Note: the tooltip starts invisible, and must be toggled on via `setVisible(true)`.\n */\nexport function createTooltip(olMap: OlMap, text: string): Tooltip {\n const element = document.createElement(\"div\");\n element.className = \"editing-tooltip editing-tooltip-hidden\";\n element.role = \"tooltip\";\n\n const content = document.createElement(\"span\");\n content.textContent = text;\n element.appendChild(content);\n\n const overlay = new Overlay({\n element: element,\n offset: [15, 0],\n positioning: \"center-left\"\n });\n\n const pointerMove = olMap.on(\"pointermove\", (evt) => {\n if (evt.dragging) {\n return;\n }\n\n overlay.setPosition(evt.coordinate);\n });\n\n olMap.addOverlay(overlay);\n return {\n destroy() {\n unByKey(pointerMove);\n olMap.removeOverlay(overlay);\n },\n setVisible(visible) {\n element.classList.toggle(\"editing-tooltip-hidden\", !visible);\n },\n setText(text) {\n content.textContent = text;\n }\n };\n}\n"],"names":["text"],"mappings":";;;AAsBgB,SAAA,aAAA,CAAc,OAAc,IAAuB,EAAA;AAC/D,EAAM,MAAA,OAAA,GAAU,QAAS,CAAA,aAAA,CAAc,KAAK,CAAA;AAC5C,EAAA,OAAA,CAAQ,SAAY,GAAA,wCAAA;AACpB,EAAA,OAAA,CAAQ,IAAO,GAAA,SAAA;AAEf,EAAM,MAAA,OAAA,GAAU,QAAS,CAAA,aAAA,CAAc,MAAM,CAAA;AAC7C,EAAA,OAAA,CAAQ,WAAc,GAAA,IAAA;AACtB,EAAA,OAAA,CAAQ,YAAY,OAAO,CAAA;AAE3B,EAAM,MAAA,OAAA,GAAU,IAAI,OAAQ,CAAA;AAAA,IACxB,OAAA;AAAA,IACA,MAAA,EAAQ,CAAC,EAAA,EAAI,CAAC,CAAA;AAAA,IACd,WAAa,EAAA;AAAA,GAChB,CAAA;AAED,EAAA,MAAM,WAAc,GAAA,KAAA,CAAM,EAAG,CAAA,aAAA,EAAe,CAAC,GAAQ,KAAA;AACjD,IAAA,IAAI,IAAI,QAAU,EAAA;AACd,MAAA;AAAA;AAGJ,IAAQ,OAAA,CAAA,WAAA,CAAY,IAAI,UAAU,CAAA;AAAA,GACrC,CAAA;AAED,EAAA,KAAA,CAAM,WAAW,OAAO,CAAA;AACxB,EAAO,OAAA;AAAA,IACH,OAAU,GAAA;AACN,MAAA,OAAA,CAAQ,WAAW,CAAA;AACnB,MAAA,KAAA,CAAM,cAAc,OAAO,CAAA;AAAA,KAC/B;AAAA,IACA,WAAW,OAAS,EAAA;AAChB,MAAA,OAAA,CAAQ,SAAU,CAAA,MAAA,CAAO,wBAA0B,EAAA,CAAC,OAAO,CAAA;AAAA,KAC/D;AAAA,IACA,QAAQA,KAAM,EAAA;AACV,MAAA,OAAA,CAAQ,WAAcA,GAAAA,KAAAA;AAAA;AAC1B,GACJ;AACJ;;;;"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "type": "module",
3
3
  "name": "@open-pioneer/editing",
4
- "version": "0.9.0-dev.20250220091855",
4
+ "version": "0.9.0",
5
5
  "description": "This package provides an editing service that allows to start and handle geometry editing workflows.",
6
6
  "keywords": [
7
7
  "open-pioneer-trails"
@@ -14,12 +14,12 @@
14
14
  "directory": "src/packages/editing"
15
15
  },
16
16
  "dependencies": {
17
- "@open-pioneer/core": "^2.4.0",
18
- "@open-pioneer/http": "^2.4.0",
19
- "@open-pioneer/runtime": "^2.4.0",
20
- "ol": "^10.3.0",
17
+ "@open-pioneer/core": "^3.0.0",
18
+ "@open-pioneer/http": "^3.0.0",
19
+ "@open-pioneer/runtime": "^3.0.0",
20
+ "ol": "^10.4.0",
21
21
  "@conterra/reactivity-core": "^0.4.3",
22
- "@open-pioneer/map": "^0.9.0-dev.20250220091855"
22
+ "@open-pioneer/map": "^0.9.0"
23
23
  },
24
24
  "exports": {
25
25
  "./package.json": "./package.json",
@@ -1 +1 @@
1
- {"version":3,"file":"style-utils.js","sources":["style-utils.ts"],"sourcesContent":["// SPDX-FileCopyrightText: 2023 Open Pioneer project (https://github.com/open-pioneer)\n// SPDX-License-Identifier: Apache-2.0\nimport { Style } from \"ol/style\";\nimport { MultiPoint, Polygon } from \"ol/geom\";\nimport { GeometryFunction } from \"ol/style/Style\";\nimport { FlatStyle } from \"ol/style/flat\";\nimport VectorLayer from \"ol/layer/Vector\";\nimport { Feature } from \"ol\";\n\ninterface EditingStyleProps {\n polygon: FlatStyle;\n vertex: FlatStyle;\n}\n\n/**\n * Function to retrieve an OpenLayers style for an editing workflow\n * from editing polygon and vertex style.\n *\n * The polygon OpenLayers FlatStyle is convert to an OpenLayers style.\n *\n * The vertex OpenLayers FlatStyle is convert to an OpenLayers style\n * by setting an geometry to the style to render a vertex geometry instead of the feature's geometry.\n */\nexport function createStyles(editingStyle: EditingStyleProps) {\n let polygonStyle = convertFlatStyleToStyle(editingStyle.polygon);\n if (Array.isArray(polygonStyle)) {\n polygonStyle = polygonStyle[0];\n }\n\n let vertexStyle = convertFlatStyleToStyle(editingStyle.vertex);\n if (Array.isArray(vertexStyle)) {\n vertexStyle = vertexStyle[0];\n }\n\n const style = [];\n if (polygonStyle) {\n style.push(polygonStyle);\n }\n\n // Set a vertex geometry that is rendered instead of the feature's geometry\n if (vertexStyle) {\n vertexStyle.setGeometry(createVertexGeometry);\n style.push(vertexStyle);\n }\n\n return style;\n}\n\n/**\n * Function to create a new multi point geometry from a given feature (to style the point as a vertex).\n * Returns an Openlayers geometry function.\n */\nconst createVertexGeometry: GeometryFunction = (feature) => {\n if (feature) {\n const geometry = feature.getGeometry() as Polygon;\n if (geometry && geometry.getType() === \"Polygon\") {\n const coordinates = geometry.getCoordinates()[0];\n if (coordinates) {\n return new MultiPoint(coordinates);\n }\n }\n }\n return undefined;\n};\n\n/**\n * Function to convert a OpenLayers FlatStyle to an OpenLayers Style by setting the FlatStyle\n * to an OpenLayers feature and retrieving the style from a vector layer's style function.\n */\nconst convertFlatStyleToStyle = (flatStyle: FlatStyle): Style | Style[] | undefined => {\n const feature = new Feature();\n const vectorLayer = new VectorLayer({ style: flatStyle });\n\n const styleFunction = vectorLayer.getStyleFunction();\n if (!styleFunction) {\n throw new Error(\"can't retrieve style function\");\n }\n\n const styles = styleFunction(feature, 1);\n if (!styles) {\n throw new Error(\"can't retrieve styles from feature style function\");\n }\n\n // Return only first style in array\n if (Array.isArray(styles) && styles.length) {\n return styles.length > 1 ? styles : styles[0];\n } else {\n return styles;\n }\n};\n"],"names":[],"mappings":";;;;AAuBO,SAAS,aAAa,YAAiC,EAAA;AAC1D,EAAI,IAAA,YAAA,GAAe,uBAAwB,CAAA,YAAA,CAAa,OAAO,CAAA,CAAA;AAC/D,EAAI,IAAA,KAAA,CAAM,OAAQ,CAAA,YAAY,CAAG,EAAA;AAC7B,IAAA,YAAA,GAAe,aAAa,CAAC,CAAA,CAAA;AAAA,GACjC;AAEA,EAAI,IAAA,WAAA,GAAc,uBAAwB,CAAA,YAAA,CAAa,MAAM,CAAA,CAAA;AAC7D,EAAI,IAAA,KAAA,CAAM,OAAQ,CAAA,WAAW,CAAG,EAAA;AAC5B,IAAA,WAAA,GAAc,YAAY,CAAC,CAAA,CAAA;AAAA,GAC/B;AAEA,EAAA,MAAM,QAAQ,EAAC,CAAA;AACf,EAAA,IAAI,YAAc,EAAA;AACd,IAAA,KAAA,CAAM,KAAK,YAAY,CAAA,CAAA;AAAA,GAC3B;AAGA,EAAA,IAAI,WAAa,EAAA;AACb,IAAA,WAAA,CAAY,YAAY,oBAAoB,CAAA,CAAA;AAC5C,IAAA,KAAA,CAAM,KAAK,WAAW,CAAA,CAAA;AAAA,GAC1B;AAEA,EAAO,OAAA,KAAA,CAAA;AACX,CAAA;AAMA,MAAM,oBAAA,GAAyC,CAAC,OAAY,KAAA;AACxD,EAAA,IAAI,OAAS,EAAA;AACT,IAAM,MAAA,QAAA,GAAW,QAAQ,WAAY,EAAA,CAAA;AACrC,IAAA,IAAI,QAAY,IAAA,QAAA,CAAS,OAAQ,EAAA,KAAM,SAAW,EAAA;AAC9C,MAAA,MAAM,WAAc,GAAA,QAAA,CAAS,cAAe,EAAA,CAAE,CAAC,CAAA,CAAA;AAC/C,MAAA,IAAI,WAAa,EAAA;AACb,QAAO,OAAA,IAAI,WAAW,WAAW,CAAA,CAAA;AAAA,OACrC;AAAA,KACJ;AAAA,GACJ;AACA,EAAO,OAAA,KAAA,CAAA,CAAA;AACX,CAAA,CAAA;AAMA,MAAM,uBAAA,GAA0B,CAAC,SAAsD,KAAA;AACnF,EAAM,MAAA,OAAA,GAAU,IAAI,OAAQ,EAAA,CAAA;AAC5B,EAAA,MAAM,cAAc,IAAI,WAAA,CAAY,EAAE,KAAA,EAAO,WAAW,CAAA,CAAA;AAExD,EAAM,MAAA,aAAA,GAAgB,YAAY,gBAAiB,EAAA,CAAA;AACnD,EAAA,IAAI,CAAC,aAAe,EAAA;AAChB,IAAM,MAAA,IAAI,MAAM,+BAA+B,CAAA,CAAA;AAAA,GACnD;AAEA,EAAM,MAAA,MAAA,GAAS,aAAc,CAAA,OAAA,EAAS,CAAC,CAAA,CAAA;AACvC,EAAA,IAAI,CAAC,MAAQ,EAAA;AACT,IAAM,MAAA,IAAI,MAAM,mDAAmD,CAAA,CAAA;AAAA,GACvE;AAGA,EAAA,IAAI,KAAM,CAAA,OAAA,CAAQ,MAAM,CAAA,IAAK,OAAO,MAAQ,EAAA;AACxC,IAAA,OAAO,MAAO,CAAA,MAAA,GAAS,CAAI,GAAA,MAAA,GAAS,OAAO,CAAC,CAAA,CAAA;AAAA,GACzC,MAAA;AACH,IAAO,OAAA,MAAA,CAAA;AAAA,GACX;AACJ,CAAA;;;;"}
1
+ {"version":3,"file":"style-utils.js","sources":["style-utils.ts"],"sourcesContent":["// SPDX-FileCopyrightText: 2023-2025 Open Pioneer project (https://github.com/open-pioneer)\n// SPDX-License-Identifier: Apache-2.0\nimport { Style } from \"ol/style\";\nimport { MultiPoint, Polygon } from \"ol/geom\";\nimport { GeometryFunction } from \"ol/style/Style\";\nimport { FlatStyle } from \"ol/style/flat\";\nimport VectorLayer from \"ol/layer/Vector\";\nimport { Feature } from \"ol\";\n\ninterface EditingStyleProps {\n polygon: FlatStyle;\n vertex: FlatStyle;\n}\n\n/**\n * Function to retrieve an OpenLayers style for an editing workflow\n * from editing polygon and vertex style.\n *\n * The polygon OpenLayers FlatStyle is convert to an OpenLayers style.\n *\n * The vertex OpenLayers FlatStyle is convert to an OpenLayers style\n * by setting an geometry to the style to render a vertex geometry instead of the feature's geometry.\n */\nexport function createStyles(editingStyle: EditingStyleProps) {\n let polygonStyle = convertFlatStyleToStyle(editingStyle.polygon);\n if (Array.isArray(polygonStyle)) {\n polygonStyle = polygonStyle[0];\n }\n\n let vertexStyle = convertFlatStyleToStyle(editingStyle.vertex);\n if (Array.isArray(vertexStyle)) {\n vertexStyle = vertexStyle[0];\n }\n\n const style = [];\n if (polygonStyle) {\n style.push(polygonStyle);\n }\n\n // Set a vertex geometry that is rendered instead of the feature's geometry\n if (vertexStyle) {\n vertexStyle.setGeometry(createVertexGeometry);\n style.push(vertexStyle);\n }\n\n return style;\n}\n\n/**\n * Function to create a new multi point geometry from a given feature (to style the point as a vertex).\n * Returns an Openlayers geometry function.\n */\nconst createVertexGeometry: GeometryFunction = (feature) => {\n if (feature) {\n const geometry = feature.getGeometry() as Polygon;\n if (geometry && geometry.getType() === \"Polygon\") {\n const coordinates = geometry.getCoordinates()[0];\n if (coordinates) {\n return new MultiPoint(coordinates);\n }\n }\n }\n return undefined;\n};\n\n/**\n * Function to convert a OpenLayers FlatStyle to an OpenLayers Style by setting the FlatStyle\n * to an OpenLayers feature and retrieving the style from a vector layer's style function.\n */\nconst convertFlatStyleToStyle = (flatStyle: FlatStyle): Style | Style[] | undefined => {\n const feature = new Feature();\n const vectorLayer = new VectorLayer({ style: flatStyle });\n\n const styleFunction = vectorLayer.getStyleFunction();\n if (!styleFunction) {\n throw new Error(\"can't retrieve style function\");\n }\n\n const styles = styleFunction(feature, 1);\n if (!styles) {\n throw new Error(\"can't retrieve styles from feature style function\");\n }\n\n // Return only first style in array\n if (Array.isArray(styles) && styles.length) {\n return styles.length > 1 ? styles : styles[0];\n } else {\n return styles;\n }\n};\n"],"names":[],"mappings":";;;;AAuBO,SAAS,aAAa,YAAiC,EAAA;AAC1D,EAAI,IAAA,YAAA,GAAe,uBAAwB,CAAA,YAAA,CAAa,OAAO,CAAA;AAC/D,EAAI,IAAA,KAAA,CAAM,OAAQ,CAAA,YAAY,CAAG,EAAA;AAC7B,IAAA,YAAA,GAAe,aAAa,CAAC,CAAA;AAAA;AAGjC,EAAI,IAAA,WAAA,GAAc,uBAAwB,CAAA,YAAA,CAAa,MAAM,CAAA;AAC7D,EAAI,IAAA,KAAA,CAAM,OAAQ,CAAA,WAAW,CAAG,EAAA;AAC5B,IAAA,WAAA,GAAc,YAAY,CAAC,CAAA;AAAA;AAG/B,EAAA,MAAM,QAAQ,EAAC;AACf,EAAA,IAAI,YAAc,EAAA;AACd,IAAA,KAAA,CAAM,KAAK,YAAY,CAAA;AAAA;AAI3B,EAAA,IAAI,WAAa,EAAA;AACb,IAAA,WAAA,CAAY,YAAY,oBAAoB,CAAA;AAC5C,IAAA,KAAA,CAAM,KAAK,WAAW,CAAA;AAAA;AAG1B,EAAO,OAAA,KAAA;AACX;AAMA,MAAM,oBAAA,GAAyC,CAAC,OAAY,KAAA;AACxD,EAAA,IAAI,OAAS,EAAA;AACT,IAAM,MAAA,QAAA,GAAW,QAAQ,WAAY,EAAA;AACrC,IAAA,IAAI,QAAY,IAAA,QAAA,CAAS,OAAQ,EAAA,KAAM,SAAW,EAAA;AAC9C,MAAA,MAAM,WAAc,GAAA,QAAA,CAAS,cAAe,EAAA,CAAE,CAAC,CAAA;AAC/C,MAAA,IAAI,WAAa,EAAA;AACb,QAAO,OAAA,IAAI,WAAW,WAAW,CAAA;AAAA;AACrC;AACJ;AAEJ,EAAO,OAAA,MAAA;AACX,CAAA;AAMA,MAAM,uBAAA,GAA0B,CAAC,SAAsD,KAAA;AACnF,EAAM,MAAA,OAAA,GAAU,IAAI,OAAQ,EAAA;AAC5B,EAAA,MAAM,cAAc,IAAI,WAAA,CAAY,EAAE,KAAA,EAAO,WAAW,CAAA;AAExD,EAAM,MAAA,aAAA,GAAgB,YAAY,gBAAiB,EAAA;AACnD,EAAA,IAAI,CAAC,aAAe,EAAA;AAChB,IAAM,MAAA,IAAI,MAAM,+BAA+B,CAAA;AAAA;AAGnD,EAAM,MAAA,MAAA,GAAS,aAAc,CAAA,OAAA,EAAS,CAAC,CAAA;AACvC,EAAA,IAAI,CAAC,MAAQ,EAAA;AACT,IAAM,MAAA,IAAI,MAAM,mDAAmD,CAAA;AAAA;AAIvE,EAAA,IAAI,KAAM,CAAA,OAAA,CAAQ,MAAM,CAAA,IAAK,OAAO,MAAQ,EAAA;AACxC,IAAA,OAAO,MAAO,CAAA,MAAA,GAAS,CAAI,GAAA,MAAA,GAAS,OAAO,CAAC,CAAA;AAAA,GACzC,MAAA;AACH,IAAO,OAAA,MAAA;AAAA;AAEf,CAAA;;;;"}