@open-pioneer/editing 1.3.0-dev.20260303160408 → 1.3.0-dev.20260310142705
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 +1 -130
- package/EditingCreateWorkflowImpl.js +1 -1
- package/EditingCreateWorkflowImpl.js.map +1 -1
- package/EditingUpdateWorkflowImpl.js +1 -1
- package/EditingUpdateWorkflowImpl.js.map +1 -1
- package/Tooltip.d.ts +2 -2
- package/Tooltip.js +10 -24
- package/Tooltip.js.map +1 -1
- package/package.json +2 -2
package/CHANGELOG.md
CHANGED
|
@@ -1,23 +1,11 @@
|
|
|
1
1
|
# @open-pioneer/editing
|
|
2
2
|
|
|
3
|
-
## 1.3.0-dev.
|
|
3
|
+
## 1.3.0-dev.20260310142705
|
|
4
4
|
|
|
5
5
|
### Minor Changes
|
|
6
6
|
|
|
7
7
|
- d54ccfd: Update to Chakra UI 3.32.0
|
|
8
8
|
|
|
9
|
-
### Patch Changes
|
|
10
|
-
|
|
11
|
-
- Updated dependencies [9b5d5f3]
|
|
12
|
-
- Updated dependencies [fcbd505]
|
|
13
|
-
- Updated dependencies [2ceb1ca]
|
|
14
|
-
- Updated dependencies [73453af]
|
|
15
|
-
- Updated dependencies [fcbd505]
|
|
16
|
-
- Updated dependencies [d54ccfd]
|
|
17
|
-
- Updated dependencies [4bcc8ce]
|
|
18
|
-
- Updated dependencies [2ceb1ca]
|
|
19
|
-
- @open-pioneer/map@1.3.0-dev.20260303160408
|
|
20
|
-
|
|
21
9
|
## 1.2.0
|
|
22
10
|
|
|
23
11
|
### Patch Changes
|
|
@@ -26,13 +14,6 @@
|
|
|
26
14
|
- 279ca67: Use `workspace:*` instead of `workspace:^` for local package references as default. This ensures that trails packages from this repository are always referenced with their exact version to avoid potential issues with version mismatches. If a project specifically wants to use other versions for some trails packages, a pnpm override can be used to force other versions.
|
|
27
15
|
- 9580bb4: Update various dependencies.
|
|
28
16
|
- 9580bb4: Update to Chakra 3.31.0
|
|
29
|
-
- Updated dependencies [597584b]
|
|
30
|
-
- Updated dependencies [9c29256]
|
|
31
|
-
- Updated dependencies [279ca67]
|
|
32
|
-
- Updated dependencies [597584b]
|
|
33
|
-
- Updated dependencies [9580bb4]
|
|
34
|
-
- Updated dependencies [9580bb4]
|
|
35
|
-
- @open-pioneer/map@1.2.0
|
|
36
17
|
|
|
37
18
|
## 1.1.0
|
|
38
19
|
|
|
@@ -42,15 +23,6 @@
|
|
|
42
23
|
- a8b8a36: Update trails core packages to 4.3.0
|
|
43
24
|
- 10338fa: Update Chakra to 3.29.0
|
|
44
25
|
|
|
45
|
-
### Patch Changes
|
|
46
|
-
|
|
47
|
-
- Updated dependencies [fce7fa9]
|
|
48
|
-
- Updated dependencies [10338fa]
|
|
49
|
-
- Updated dependencies [a8b8a36]
|
|
50
|
-
- Updated dependencies [10338fa]
|
|
51
|
-
- Updated dependencies [c38b619]
|
|
52
|
-
- @open-pioneer/map@1.1.0
|
|
53
|
-
|
|
54
26
|
## 1.0.0
|
|
55
27
|
|
|
56
28
|
### Minor Changes
|
|
@@ -64,30 +36,6 @@
|
|
|
64
36
|
The previous implementation was based on adding a "raw" OpenLayers layer to the `olMap`.
|
|
65
37
|
- 138d85b: Update core packages to 4.2.0
|
|
66
38
|
- da6a410: Update dependencies
|
|
67
|
-
- Updated dependencies [c6180c6]
|
|
68
|
-
- Updated dependencies [29a10df]
|
|
69
|
-
- Updated dependencies [10d2fe7]
|
|
70
|
-
- Updated dependencies [4f1e7bd]
|
|
71
|
-
- Updated dependencies [2702df4]
|
|
72
|
-
- Updated dependencies [12561fe]
|
|
73
|
-
- Updated dependencies [5df900f]
|
|
74
|
-
- Updated dependencies [8986b3b]
|
|
75
|
-
- Updated dependencies [b3709f1]
|
|
76
|
-
- Updated dependencies [14c484e]
|
|
77
|
-
- Updated dependencies [138d85b]
|
|
78
|
-
- Updated dependencies [4f1e7bd]
|
|
79
|
-
- Updated dependencies [aeb9000]
|
|
80
|
-
- Updated dependencies [9e9bc6e]
|
|
81
|
-
- Updated dependencies [b3709f1]
|
|
82
|
-
- Updated dependencies [2c8b617]
|
|
83
|
-
- Updated dependencies [b3709f1]
|
|
84
|
-
- Updated dependencies [5df900f]
|
|
85
|
-
- Updated dependencies [f1f69f2]
|
|
86
|
-
- Updated dependencies [a1614de]
|
|
87
|
-
- Updated dependencies [773fa2d]
|
|
88
|
-
- Updated dependencies [2abcaaf]
|
|
89
|
-
- Updated dependencies [da6a410]
|
|
90
|
-
- @open-pioneer/map@1.0.0
|
|
91
39
|
|
|
92
40
|
## 0.11.0
|
|
93
41
|
|
|
@@ -95,15 +43,6 @@
|
|
|
95
43
|
|
|
96
44
|
- 66179bc: Update to core-packages v4.0.0
|
|
97
45
|
|
|
98
|
-
### Patch Changes
|
|
99
|
-
|
|
100
|
-
- Updated dependencies [738390e]
|
|
101
|
-
- Updated dependencies [66179bc]
|
|
102
|
-
- Updated dependencies [0a8ff71]
|
|
103
|
-
- Updated dependencies [acd5115]
|
|
104
|
-
- Updated dependencies [738390e]
|
|
105
|
-
- @open-pioneer/map@0.11.0
|
|
106
|
-
|
|
107
46
|
## 0.10.0
|
|
108
47
|
|
|
109
48
|
### Minor Changes
|
|
@@ -116,13 +55,6 @@
|
|
|
116
55
|
- cd1435b: Update ol to 10.5.0
|
|
117
56
|
- 032eed7: Bump dependencies.
|
|
118
57
|
- cd1435b: Update to react 19.1.0
|
|
119
|
-
- Updated dependencies [2bafdad]
|
|
120
|
-
- Updated dependencies [cd1435b]
|
|
121
|
-
- Updated dependencies [193068a]
|
|
122
|
-
- Updated dependencies [032eed7]
|
|
123
|
-
- Updated dependencies [cd1435b]
|
|
124
|
-
- Updated dependencies [7558df4]
|
|
125
|
-
- @open-pioneer/map@0.10.0
|
|
126
58
|
|
|
127
59
|
## 0.9.0
|
|
128
60
|
|
|
@@ -130,18 +62,6 @@
|
|
|
130
62
|
|
|
131
63
|
- cb94c75: update dependencies
|
|
132
64
|
|
|
133
|
-
### Patch Changes
|
|
134
|
-
|
|
135
|
-
- Updated dependencies [e7fdc5d]
|
|
136
|
-
- Updated dependencies [cb94c75]
|
|
137
|
-
- Updated dependencies [37cd707]
|
|
138
|
-
- Updated dependencies [32ed2cd]
|
|
139
|
-
- Updated dependencies [f327eec]
|
|
140
|
-
- Updated dependencies [f327eec]
|
|
141
|
-
- Updated dependencies [209eb8e]
|
|
142
|
-
- Updated dependencies [d72e42c]
|
|
143
|
-
- @open-pioneer/map@0.9.0
|
|
144
|
-
|
|
145
65
|
## 0.8.0
|
|
146
66
|
|
|
147
67
|
### Minor Changes
|
|
@@ -158,17 +78,6 @@
|
|
|
158
78
|
- e7978a8: Use reactive map model APIs to access the current map container element.
|
|
159
79
|
- 49f0207: Update trails core packages to version 2.4.0
|
|
160
80
|
- e7978a8: Stop draw interactions and remove tooltips before saving.
|
|
161
|
-
- Updated dependencies [b717121]
|
|
162
|
-
- Updated dependencies [e7978a8]
|
|
163
|
-
- Updated dependencies [7a5f1e1]
|
|
164
|
-
- Updated dependencies [7ae9f90]
|
|
165
|
-
- Updated dependencies [d8337a6]
|
|
166
|
-
- Updated dependencies [49f0207]
|
|
167
|
-
- Updated dependencies [b2127df]
|
|
168
|
-
- Updated dependencies [2fa8020]
|
|
169
|
-
- Updated dependencies [7ae9f90]
|
|
170
|
-
- Updated dependencies [d8337a6]
|
|
171
|
-
- @open-pioneer/map@0.8.0
|
|
172
81
|
|
|
173
82
|
## 0.7.0
|
|
174
83
|
|
|
@@ -182,26 +91,12 @@
|
|
|
182
91
|
- a8b3449: Switch to a new versioning strategy.
|
|
183
92
|
From now on, packages released by this repository share a common version number.
|
|
184
93
|
- 900eb11: Update dependencies.
|
|
185
|
-
- Updated dependencies [310800c]
|
|
186
|
-
- Updated dependencies [2502050]
|
|
187
|
-
- Updated dependencies [583f1d6]
|
|
188
|
-
- Updated dependencies [583f1d6]
|
|
189
|
-
- Updated dependencies [397d617]
|
|
190
|
-
- Updated dependencies [a8b3449]
|
|
191
|
-
- Updated dependencies [310800c]
|
|
192
|
-
- Updated dependencies [900eb11]
|
|
193
|
-
- Updated dependencies [583f1d6]
|
|
194
|
-
- Updated dependencies [397d617]
|
|
195
|
-
- @open-pioneer/map@0.7.0
|
|
196
94
|
|
|
197
95
|
## 0.2.3
|
|
198
96
|
|
|
199
97
|
### Patch Changes
|
|
200
98
|
|
|
201
99
|
- b152428: Update trails dependencies
|
|
202
|
-
- Updated dependencies [b152428]
|
|
203
|
-
- Updated dependencies [291ccb6]
|
|
204
|
-
- @open-pioneer/map@0.6.1
|
|
205
100
|
|
|
206
101
|
## 0.2.2
|
|
207
102
|
|
|
@@ -209,10 +104,6 @@
|
|
|
209
104
|
|
|
210
105
|
- 28e092a: Update dependencies
|
|
211
106
|
- 484ad86: Add tooltip role to tooltip divs (See https://github.com/open-pioneer/trails-openlayers-base-packages/issues/309).
|
|
212
|
-
- Updated dependencies [28e092a]
|
|
213
|
-
- Updated dependencies [0d51d2f]
|
|
214
|
-
- Updated dependencies [76f8863]
|
|
215
|
-
- @open-pioneer/map@0.6.0
|
|
216
107
|
|
|
217
108
|
## 0.2.1
|
|
218
109
|
|
|
@@ -222,12 +113,6 @@
|
|
|
222
113
|
- 4140646: Update to react 18.3.1
|
|
223
114
|
- 81bc7da: Update trails dependencies
|
|
224
115
|
- 2c092dc: Update dependencies
|
|
225
|
-
- Updated dependencies [4140646]
|
|
226
|
-
- Updated dependencies [4140646]
|
|
227
|
-
- Updated dependencies [b5bb7a1]
|
|
228
|
-
- Updated dependencies [81bc7da]
|
|
229
|
-
- Updated dependencies [2c092dc]
|
|
230
|
-
- @open-pioneer/map@0.5.1
|
|
231
116
|
|
|
232
117
|
## 0.2.0
|
|
233
118
|
|
|
@@ -235,11 +120,6 @@
|
|
|
235
120
|
|
|
236
121
|
- 434fd3e: Implemented update feature workflow in EditingService
|
|
237
122
|
|
|
238
|
-
### Patch Changes
|
|
239
|
-
|
|
240
|
-
- Updated dependencies [520a97b]
|
|
241
|
-
- @open-pioneer/map@0.5.0
|
|
242
|
-
|
|
243
123
|
## 0.1.0
|
|
244
124
|
|
|
245
125
|
### Minor Changes
|
|
@@ -251,12 +131,3 @@
|
|
|
251
131
|
|
|
252
132
|
- 1a8ad89: Update package.json metadata
|
|
253
133
|
- 6162979: Update versions of core packages
|
|
254
|
-
- Updated dependencies [1a8ad89]
|
|
255
|
-
- Updated dependencies [a11bf72]
|
|
256
|
-
- Updated dependencies [fc6bf82]
|
|
257
|
-
- Updated dependencies [a0d8882]
|
|
258
|
-
- Updated dependencies [6162979]
|
|
259
|
-
- Updated dependencies [9334e81]
|
|
260
|
-
- Updated dependencies [ac7fdd1]
|
|
261
|
-
- Updated dependencies [13ea342]
|
|
262
|
-
- @open-pioneer/map@0.4.0
|
|
@@ -1 +1 @@
|
|
|
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 { LayerFactory, MapModel, SimpleLayer } 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 { sourceId } from \"open-pioneer:source-info\";\nimport { saveCreatedFeature } from \"./SaveFeaturesHandler\";\nimport { Tooltip, createTooltip } from \"./Tooltip\";\nimport { EditingWorkflow, EditingWorkflowProps, EditingWorkflowState } from \"./api\";\nimport { createStyles } from \"./style-utils\";\n\nconst LOG = createLogger(sourceId);\n\nexport class EditingCreateWorkflowImpl implements EditingWorkflow {\n #waiter: ManualPromise<Record<string, string> | undefined> | undefined;\n\n private _httpService: HttpService;\n private _layerFactory: LayerFactory;\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: SimpleLayer;\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._layerFactory = options.layerFactory;\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 const olLayer = new VectorLayer({\n source: this._editingSource\n });\n this._editingLayer = this._layerFactory.create({\n type: SimpleLayer,\n title: \"editing-layer\",\n internal: true,\n olLayer: olLayer\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._map.layers.addLayer(this._editingLayer, { at: \"topmost\" });\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._map.layers.removeLayer(this._editingLayer);\n this._editingLayer.destroy();\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 { LayerFactory, MapModel, SimpleLayer } 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 { sourceId } from \"open-pioneer:source-info\";\nimport { saveCreatedFeature } from \"./SaveFeaturesHandler\";\nimport { Tooltip, createTooltip } from \"./Tooltip\";\nimport { EditingWorkflow, EditingWorkflowProps, EditingWorkflowState } from \"./api\";\nimport { createStyles } from \"./style-utils\";\n\nconst LOG = createLogger(sourceId);\n\nexport class EditingCreateWorkflowImpl implements EditingWorkflow {\n #waiter: ManualPromise<Record<string, string> | undefined> | undefined;\n\n private _httpService: HttpService;\n private _layerFactory: LayerFactory;\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: SimpleLayer;\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._layerFactory = options.layerFactory;\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 const olLayer = new VectorLayer({\n source: this._editingSource\n });\n this._editingLayer = this._layerFactory.create({\n type: SimpleLayer,\n title: \"editing-layer\",\n internal: true,\n olLayer: olLayer\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._map,\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._map.layers.addLayer(this._editingLayer, { at: \"topmost\" });\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._map.layers.removeLayer(this._editingLayer);\n this._editingLayer.destroy();\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":";;;;;;;;;;;;;AA0BA,MAAM,GAAA,GAAM,aAAa,QAAQ,CAAA;AAE1B,MAAM,yBAAA,CAAqD;AAAA,EAC9D,OAAA;AAAA,EAEQ,YAAA;AAAA,EACA,aAAA;AAAA,EACA,KAAA;AAAA,EAEA,IAAA;AAAA,EACA,aAAA;AAAA,EACA,YAAA;AAAA,EACA,MAAA;AAAA,EACA,aAAA;AAAA,EACA,UAAA;AAAA,EAEA,cAAA;AAAA,EACA,aAAA;AAAA,EACA,gBAAA;AAAA,EACA,MAAA;AAAA,EACA,QAAA;AAAA,EACA,aAAA;AAAA,EACA,cAAA;AAAA,EAEA,MAAA;AAAA,EAEA,oBAAA;AAAA,EACA,YAAA;AAAA,EAER,YAAY,OAAA,EAA+B;AACvC,IAAA,IAAA,CAAK,eAAe,OAAA,CAAQ,WAAA;AAC5B,IAAA,IAAA,CAAK,gBAAgB,OAAA,CAAQ,YAAA;AAC7B,IAAA,IAAA,CAAK,QAAQ,OAAA,CAAQ,IAAA;AAErB,IAAA,IAAA,CAAK,gBAAgB,OAAA,CAAQ,YAAA;AAC7B,IAAA,IAAA,CAAK,eAAe,OAAA,CAAQ,WAAA;AAE5B,IAAA,IAAA,CAAK,OAAO,OAAA,CAAQ,GAAA;AACpB,IAAA,IAAA,CAAK,MAAA,GAAS,QAAQ,GAAA,CAAI,KAAA;AAC1B,IAAA,IAAA,CAAK,MAAA,GAAS,SAAS,oBAAoB,CAAA;AAC3C,IAAA,IAAA,CAAK,gBAAgB,OAAA,CAAQ,qBAAA;AAE7B,IAAA,IAAA,CAAK,cAAA,GAAiB,IAAI,YAAA,EAAa;AACvC,IAAA,MAAM,OAAA,GAAU,IAAI,WAAA,CAAY;AAAA,MAC5B,QAAQ,IAAA,CAAK;AAAA,KAChB,CAAA;AACD,IAAA,IAAA,CAAK,aAAA,GAAgB,IAAA,CAAK,aAAA,CAAc,MAAA,CAAO;AAAA,MAC3C,IAAA,EAAM,WAAA;AAAA,MACN,KAAA,EAAO,eAAA;AAAA,MACP,QAAA,EAAU,IAAA;AAAA,MACV;AAAA,KACH,CAAA;AAED,IAAA,IAAA,CAAK,gBAAA,GAAmB,IAAI,IAAA,CAAK;AAAA,MAC7B,QAAQ,IAAA,CAAK,cAAA;AAAA,MACb,IAAA,EAAM,SAAA;AAAA,MACN,OAAO,YAAA,CAAa;AAAA,QAChB,SAAS,IAAA,CAAK,aAAA;AAAA,QACd,QAAQ,IAAA,CAAK;AAAA,OAChB;AAAA,KACJ,CAAA;AAED,IAAA,IAAA,CAAK,QAAA,GAAW,aAAA;AAAA,MACZ,IAAA,CAAK,IAAA;AAAA,MACL,KAAK,KAAA,CAAM,aAAA,CAAc,EAAE,EAAA,EAAI,wBAAwB;AAAA,KAC3D;AAEA,IAAA,IAAA,CAAK,aAAA,GAAgB,CAAC,CAAA,KAAqB;AACvC,MAAA,IAAA,CACK,CAAA,CAAE,IAAA,KAAS,OAAA,IAAW,CAAA,CAAE,IAAA,KAAS,aAAA,KAClC,CAAA,CAAE,MAAA,KAAW,IAAA,CAAK,MAAA,CAAO,gBAAA,EAAiB,EAC5C;AACE,QAAA,MAAM,QAAA,GACF,KAAK,gBAAA,CAAiB,UAAA,GAAa,SAAA,EAAU,EAAG,WAAA,EAAY,IAAK,EAAC;AAQtE,QAAA,IAAI,QAAA,CAAS,CAAC,CAAA,IAAK,QAAA,CAAS,CAAC,CAAA,CAAE,WAAA,EAAY,CAAE,cAAA,EAAe,CAAE,CAAC,CAAA,CAAE,SAAS,CAAA,EAAG;AACzE,UAAA,IAAA,CAAK,WAAA,EAAY;AAAA,QACrB;AAAA,MACJ;AAAA,IACJ,CAAA;AAEA,IAAA,IAAA,CAAK,cAAA,GAAiB,CAAC,CAAA,KAAqB;AACxC,MAAA,IAAI,CAAA,CAAE,SAAS,QAAA,IAAY,CAAA,CAAE,WAAW,IAAA,CAAK,MAAA,CAAO,kBAAiB,EAAG;AACpE,QAAA,IAAA,CAAK,KAAA,EAAM;AAAA,MACf;AAAA,IACJ,CAAA;AAEA,IAAA,IAAA,CAAK,uBAAuB,EAAC;AAC7B,IAAA,IAAA,CAAK,eAAe,EAAC;AAErB,IAAA,IAAA,CAAK,MAAA,EAAO;AAAA,EAChB;AAAA,EAEA,kBAAA,GAAqB;AACjB,IAAA,OAAO,IAAA,CAAK,gBAAA;AAAA,EAChB;AAAA,EAEA,QAAA,GAAW;AACP,IAAA,OAAO,KAAK,MAAA,CAAO,KAAA;AAAA,EACvB;AAAA,EAEQ,UAAU,KAAA,EAA6B;AAC3C,IAAA,IAAA,CAAK,OAAO,KAAA,GAAQ,KAAA;AAAA,EACxB;AAAA,EAEQ,MAAM,OAAA,EAAkB;AAC5B,IAAA,IAAA,CAAK,UAAU,eAAe,CAAA;AAE9B,IAAA,MAAM,WAAW,IAAA,CAAK,aAAA;AAEtB,IAAA,MAAM,QAAA,GAAW,QAAQ,WAAA,EAAY;AACrC,IAAA,IAAI,CAAC,QAAA,EAAU;AACX,MAAA,IAAA,CAAK,QAAA,EAAS;AACd,MAAA,IAAA,CAAK,MAAA,GAAS,IAAI,KAAA,CAAM,uBAAuB,CAAA;AAC/C,MAAA,IAAA,CAAK,OAAA,EAAS,MAAA,CAAO,IAAA,CAAK,MAAM,CAAA;AAChC,MAAA;AAAA,IACJ;AACA,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,MAAA,CAAO,OAAA,GAAU,aAAA,EAAc;AACvD,IAAA,MAAM,OAAA,GAAU,IAAI,OAAA,CAAQ;AAAA,MACxB,cAAA,EAAgB;AAAA,KACnB,CAAA;AACD,IAAA,MAAM,eAAA,GACF,OAAA,CAAQ,mBAAA,CAAoB,QAAA,EAAU;AAAA,MAClC,WAAA,EAAa,IAAA;AAAA,MACb,QAAA,EAAU;AAAA,KACb,CAAA;AAEL,IAAA,IAAA,CAAK,MAAA,CAAO,iBAAA,CAAkB,IAAA,CAAK,gBAAgB,CAAA;AACnD,IAAA,IAAA,CAAK,SAAS,OAAA,EAAQ;AAEtB,IAAA,kBAAA,CAAmB,IAAA,CAAK,cAAc,QAAA,EAAU,eAAA,EAAiB,UAAU,CAAA,CACtE,IAAA,CAAK,CAAC,SAAA,KAAc;AACjB,MAAA,IAAA,CAAK,UAAA,GAAa,SAAA;AAClB,MAAA,IAAA,CAAK,QAAA,EAAS;AACd,MAAA,IAAA,CAAK,SAAS,OAAA,CAAQ,EAAE,SAAA,EAAW,IAAA,CAAK,YAAY,CAAA;AAAA,IACxD,CAAC,CAAA,CACA,KAAA,CAAM,CAAC,GAAA,KAAe;AACnB,MAAA,GAAA,CAAI,MAAM,GAAG,CAAA;AACb,MAAA,IAAA,CAAK,QAAA,EAAS;AACd,MAAA,IAAA,CAAK,SAAS,IAAI,KAAA,CAAM,0BAA0B,EAAE,KAAA,EAAO,KAAK,CAAA;AAChE,MAAA,IAAA,CAAK,OAAA,EAAS,MAAA,CAAO,IAAA,CAAK,MAAM,CAAA;AAAA,IACpC,CAAC,CAAA;AAAA,EACT;AAAA,EAEQ,MAAA,GAAS;AACb,IAAA,IAAA,CAAK,IAAA,CAAK,OAAO,QAAA,CAAS,IAAA,CAAK,eAAe,EAAE,EAAA,EAAI,WAAW,CAAA;AAC/D,IAAA,IAAA,CAAK,MAAA,CAAO,cAAA,CAAe,IAAA,CAAK,gBAAgB,CAAA;AAGhD,IAAA,MAAM,eAAA,GAAkB,OAAO,MAAM;AACjC,MAAA,MAAM,SAAA,GAAY,KAAK,IAAA,CAAK,SAAA;AAC5B,MAAA,IAAI,CAAC,SAAA,EAAW;AACZ,QAAA;AAAA,MACJ;AAEA,MAAA,SAAA,CAAU,gBAAA,CAAiB,SAAA,EAAW,IAAA,CAAK,aAAA,EAAe,KAAK,CAAA;AAC/D,MAAA,SAAA,CAAU,gBAAA,CAAiB,SAAA,EAAW,IAAA,CAAK,cAAA,EAAgB,KAAK,CAAA;AAChE,MAAA,OAAO,MAAM;AACT,QAAA,SAAA,CAAU,mBAAA,CAAoB,SAAA,EAAW,IAAA,CAAK,aAAa,CAAA;AAC3D,QAAA,SAAA,CAAU,mBAAA,CAAoB,SAAA,EAAW,IAAA,CAAK,cAAc,CAAA;AAAA,MAChE,CAAA;AAAA,IACJ,CAAC,CAAA;AAED,IAAA,IAAA,CAAK,QAAA,CAAS,WAAW,IAAI,CAAA;AAE7B,IAAA,MAAM,SAAA,GAAY,IAAA,CAAK,gBAAA,CAAiB,EAAA,CAAG,aAAa,MAAM;AAC1D,MAAA,IAAA,CAAK,UAAU,gBAAgB,CAAA;AAC/B,MAAA,IAAA,CAAK,QAAA,CAAS,OAAA;AAAA,QACV,IAAA,CAAK,MAAM,aAAA,CAAc;AAAA,UACrB,EAAA,EAAI;AAAA,SACP;AAAA,OACL;AAAA,IACJ,CAAC,CAAA;AAED,IAAA,MAAM,UAAU,IAAA,CAAK,gBAAA,CAAiB,EAAA,CAAG,SAAA,EAAW,CAAC,CAAA,KAAM;AACvD,MAAA,MAAM,UAAU,CAAA,CAAE,OAAA;AAClB,MAAA,IAAI,CAAC,OAAA,EAAS;AACV,QAAA,IAAA,CAAK,QAAA,EAAS;AACd,QAAA,IAAA,CAAK,MAAA,GAAS,IAAI,KAAA,CAAM,sBAAsB,CAAA;AAC9C,QAAA,IAAA,CAAK,OAAA,EAAS,MAAA,CAAO,IAAA,CAAK,MAAM,CAAA;AAChC,QAAA;AAAA,MACJ;AACA,MAAA,IAAA,CAAK,MAAM,OAAO,CAAA;AAAA,IACtB,CAAC,CAAA;AAED,IAAA,IAAA,CAAK,oBAAA,CAAqB,IAAA,CAAK,SAAA,EAAW,OAAO,CAAA;AACjD,IAAA,IAAA,CAAK,YAAA,CAAa,KAAK,eAAe,CAAA;AAAA,EAC1C;AAAA,EAEA,KAAA,GAAQ;AACJ,IAAA,IAAA,CAAK,iBAAiB,YAAA,EAAa;AACnC,IAAA,IAAA,CAAK,QAAA,CAAS,OAAA;AAAA,MACV,IAAA,CAAK,MAAM,aAAA,CAAc;AAAA,QACrB,EAAA,EAAI;AAAA,OACP;AAAA,KACL;AACA,IAAA,IAAA,CAAK,UAAU,oBAAoB,CAAA;AAAA,EACvC;AAAA,EAEA,IAAA,GAAO;AACH,IAAA,IAAA,CAAK,QAAA,EAAS;AACd,IAAA,IAAA,CAAK,OAAA,EAAS,QAAQ,MAAS,CAAA;AAAA,EACnC;AAAA,EAEQ,QAAA,GAAW;AACf,IAAA,IAAA,CAAK,IAAA,CAAK,MAAA,CAAO,WAAA,CAAY,IAAA,CAAK,aAAa,CAAA;AAC/C,IAAA,IAAA,CAAK,cAAc,OAAA,EAAQ;AAC3B,IAAA,IAAA,CAAK,MAAA,CAAO,iBAAA,CAAkB,IAAA,CAAK,gBAAgB,CAAA;AACnD,IAAA,IAAA,CAAK,SAAS,OAAA,EAAQ;AAGtB,IAAA,IAAA,CAAK,oBAAA,CAAqB,OAAA,CAAQ,CAAC,QAAA,KAAa;AAC5C,MAAA,OAAA,CAAQ,QAAQ,CAAA;AAAA,IACpB,CAAC,CAAA;AACD,IAAA,IAAA,CAAK,YAAA,CAAa,OAAA,CAAQ,CAAC,QAAA,KAAa;AACpC,MAAA,QAAA,CAAS,OAAA,EAAQ;AAAA,IACrB,CAAC,CAAA;AAED,IAAA,IAAA,CAAK,UAAU,WAAW,CAAA;AAAA,EAC9B;AAAA,EAEA,WAAA,GAAc;AAEV,IAAA,IAAA,CAAK,iBAAiB,aAAA,EAAc;AAAA,EACxC;AAAA,EAEA,YAAA,GAA4D;AACxD,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,KAAA,KAAU,WAAA,EAAa;AACnC,MAAA,IAAI,KAAK,MAAA,EAAQ;AACb,QAAA,OAAO,OAAA,CAAQ,MAAA,CAAO,IAAA,CAAK,MAAM,CAAA;AAAA,MACrC,CAAA,MAAO;AACH,QAAA,IAAI,KAAK,UAAA,EAAY;AACjB,UAAA,OAAO,QAAQ,OAAA,CAAQ,EAAE,SAAA,EAAW,IAAA,CAAK,YAAY,CAAA;AAAA,QACzD,CAAA,MAAO;AACH,UAAA,OAAO,OAAA,CAAQ,QAAQ,MAAS,CAAA;AAAA,QACpC;AAAA,MACJ;AAAA,IACJ;AAEA,IAAA,MAAM,aAAA,GAAiB,IAAA,CAAK,OAAA,KAAY,mBAAA,EAAoB;AAC5D,IAAA,OAAO,aAAA,CAAc,OAAA;AAAA,EACzB;AACJ;;;;"}
|
|
@@ -1 +1 @@
|
|
|
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 { LayerFactory, MapModel, SimpleLayer } 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 private _layerFactory: LayerFactory;\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: SimpleLayer;\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._layerFactory = options.layerFactory;\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\n const olLayer = new VectorLayer({\n source: this._editingSource\n });\n this._editingLayer = this._layerFactory.create({\n type: SimpleLayer,\n title: \"editing-layer\",\n internal: true,\n olLayer: olLayer\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._map.layers.addLayer(this._editingLayer, { at: \"topmost\" });\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._map.layers.removeLayer(this._editingLayer);\n this._editingLayer.destroy();\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 { LayerFactory, MapModel, SimpleLayer } 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 private _layerFactory: LayerFactory;\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: SimpleLayer;\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._layerFactory = options.layerFactory;\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\n const olLayer = new VectorLayer({\n source: this._editingSource\n });\n this._editingLayer = this._layerFactory.create({\n type: SimpleLayer,\n title: \"editing-layer\",\n internal: true,\n olLayer: olLayer\n });\n\n this._modifyInteraction = new Modify({\n source: this._editingSource\n });\n\n this._tooltip = createTooltip(\n this._map,\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._map.layers.addLayer(this._editingLayer, { at: \"topmost\" });\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._map.layers.removeLayer(this._editingLayer);\n this._editingLayer.destroy();\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/Tooltip.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { Resource } from "@open-pioneer/core";
|
|
2
|
-
import
|
|
2
|
+
import { MapModel } from "@open-pioneer/map";
|
|
3
3
|
/**
|
|
4
4
|
* Represents a tooltip rendered on the OpenLayers map
|
|
5
5
|
*/
|
|
@@ -14,4 +14,4 @@ export interface Tooltip extends Resource {
|
|
|
14
14
|
*
|
|
15
15
|
* Note: the tooltip starts invisible, and must be toggled on via `setVisible(true)`.
|
|
16
16
|
*/
|
|
17
|
-
export declare function createTooltip(
|
|
17
|
+
export declare function createTooltip(map: MapModel, text: string): Tooltip;
|
package/Tooltip.js
CHANGED
|
@@ -1,35 +1,21 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
const element = document.createElement("div");
|
|
6
|
-
element.className = "editing-tooltip editing-tooltip-hidden";
|
|
7
|
-
element.role = "tooltip";
|
|
8
|
-
const content = document.createElement("span");
|
|
9
|
-
content.textContent = text;
|
|
10
|
-
element.appendChild(content);
|
|
11
|
-
const overlay = new Overlay({
|
|
12
|
-
element,
|
|
1
|
+
function createTooltip(map, text) {
|
|
2
|
+
const overlay = map.overlays.add({
|
|
3
|
+
content: text,
|
|
4
|
+
mode: "follow-pointer",
|
|
13
5
|
offset: [15, 0],
|
|
14
|
-
positioning: "center-left"
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
if (evt.dragging) {
|
|
18
|
-
return;
|
|
19
|
-
}
|
|
20
|
-
overlay.setPosition(evt.coordinate);
|
|
6
|
+
positioning: "center-left",
|
|
7
|
+
ariaRole: "tooltip",
|
|
8
|
+
className: "editing-tooltip"
|
|
21
9
|
});
|
|
22
|
-
olMap.addOverlay(overlay);
|
|
23
10
|
return {
|
|
24
11
|
destroy() {
|
|
25
|
-
|
|
26
|
-
olMap.removeOverlay(overlay);
|
|
12
|
+
overlay.destroy();
|
|
27
13
|
},
|
|
28
14
|
setVisible(visible) {
|
|
29
|
-
element.classList.toggle("editing-tooltip-hidden", !visible);
|
|
15
|
+
overlay.element.classList.toggle("editing-tooltip-hidden", !visible);
|
|
30
16
|
},
|
|
31
17
|
setText(text2) {
|
|
32
|
-
|
|
18
|
+
overlay.setContent(text2);
|
|
33
19
|
}
|
|
34
20
|
};
|
|
35
21
|
}
|
package/Tooltip.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
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 {
|
|
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 { MapModel } from \"@open-pioneer/map\";\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(map: MapModel, text: string): Tooltip {\n const overlay = map.overlays.add({\n content: text,\n mode: \"follow-pointer\",\n offset: [15, 0],\n positioning: \"center-left\",\n ariaRole: \"tooltip\",\n className: \"editing-tooltip\"\n });\n\n return {\n destroy() {\n overlay.destroy();\n },\n setVisible(visible) {\n overlay.element.classList.toggle(\"editing-tooltip-hidden\", !visible);\n },\n setText(text) {\n overlay.setContent(text);\n }\n };\n}\n"],"names":["text"],"mappings":"AAoBO,SAAS,aAAA,CAAc,KAAe,IAAA,EAAuB;AAChE,EAAA,MAAM,OAAA,GAAU,GAAA,CAAI,QAAA,CAAS,GAAA,CAAI;AAAA,IAC7B,OAAA,EAAS,IAAA;AAAA,IACT,IAAA,EAAM,gBAAA;AAAA,IACN,MAAA,EAAQ,CAAC,EAAA,EAAI,CAAC,CAAA;AAAA,IACd,WAAA,EAAa,aAAA;AAAA,IACb,QAAA,EAAU,SAAA;AAAA,IACV,SAAA,EAAW;AAAA,GACd,CAAA;AAED,EAAA,OAAO;AAAA,IACH,OAAA,GAAU;AACN,MAAA,OAAA,CAAQ,OAAA,EAAQ;AAAA,IACpB,CAAA;AAAA,IACA,WAAW,OAAA,EAAS;AAChB,MAAA,OAAA,CAAQ,OAAA,CAAQ,SAAA,CAAU,MAAA,CAAO,wBAAA,EAA0B,CAAC,OAAO,CAAA;AAAA,IACvE,CAAA;AAAA,IACA,QAAQA,KAAAA,EAAM;AACV,MAAA,OAAA,CAAQ,WAAWA,KAAI,CAAA;AAAA,IAC3B;AAAA,GACJ;AACJ;;;;"}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"type": "module",
|
|
3
3
|
"name": "@open-pioneer/editing",
|
|
4
|
-
"version": "1.3.0-dev.
|
|
4
|
+
"version": "1.3.0-dev.20260310142705",
|
|
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"
|
|
@@ -19,7 +19,7 @@
|
|
|
19
19
|
"@open-pioneer/runtime": "4.5.0-dev.20260225121659",
|
|
20
20
|
"ol": "^10.8.0",
|
|
21
21
|
"@conterra/reactivity-core": "^0.8.1",
|
|
22
|
-
"@open-pioneer/map": "1.3.0-dev.
|
|
22
|
+
"@open-pioneer/map": "1.3.0-dev.20260310142705"
|
|
23
23
|
},
|
|
24
24
|
"exports": {
|
|
25
25
|
"./package.json": "./package.json",
|