@open-pioneer/editing 0.7.0 → 0.8.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 +29 -0
- package/EditingCreateWorkflowImpl.d.ts +2 -4
- package/EditingCreateWorkflowImpl.js +24 -28
- package/EditingCreateWorkflowImpl.js.map +1 -1
- package/EditingServiceImpl.js +11 -4
- package/EditingServiceImpl.js.map +1 -1
- package/EditingUpdateWorkflowImpl.d.ts +3 -5
- package/EditingUpdateWorkflowImpl.js +28 -32
- package/EditingUpdateWorkflowImpl.js.map +1 -1
- package/api.d.ts +15 -24
- package/package.json +7 -6
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,34 @@
|
|
|
1
1
|
# @open-pioneer/editing
|
|
2
2
|
|
|
3
|
+
## 0.8.0
|
|
4
|
+
|
|
5
|
+
### Minor Changes
|
|
6
|
+
|
|
7
|
+
- b717121: Update from OL 9 to OL 10.
|
|
8
|
+
- e7978a8: Removed EditingWorkflowEvent; the state of the EditingWorkflow is now reactive and should be used instead.
|
|
9
|
+
- 2fa8020: Update trails core package dependencies.
|
|
10
|
+
|
|
11
|
+
- Also updates Chakra UI to the latest 2.x version and Chakra React Select to version 5.
|
|
12
|
+
- Removes any obsolete references to `@chakra-ui/system`.
|
|
13
|
+
This dependency seems to be no longer required and may lead to duplicate packages in your dependency tree.
|
|
14
|
+
|
|
15
|
+
### Patch Changes
|
|
16
|
+
|
|
17
|
+
- e7978a8: Use reactive map model APIs to access the current map container element.
|
|
18
|
+
- 49f0207: Update trails core packages to version 2.4.0
|
|
19
|
+
- e7978a8: Stop draw interactions and remove tooltips before saving.
|
|
20
|
+
- Updated dependencies [b717121]
|
|
21
|
+
- Updated dependencies [e7978a8]
|
|
22
|
+
- Updated dependencies [7a5f1e1]
|
|
23
|
+
- Updated dependencies [7ae9f90]
|
|
24
|
+
- Updated dependencies [d8337a6]
|
|
25
|
+
- Updated dependencies [49f0207]
|
|
26
|
+
- Updated dependencies [b2127df]
|
|
27
|
+
- Updated dependencies [2fa8020]
|
|
28
|
+
- Updated dependencies [7ae9f90]
|
|
29
|
+
- Updated dependencies [d8337a6]
|
|
30
|
+
- @open-pioneer/map@0.8.0
|
|
31
|
+
|
|
3
32
|
## 0.7.0
|
|
4
33
|
|
|
5
34
|
### Minor Changes
|
|
@@ -1,7 +1,6 @@
|
|
|
1
|
-
import { EventEmitter } from "@open-pioneer/core";
|
|
2
1
|
import { Draw } from "ol/interaction";
|
|
3
|
-
import { EditingWorkflow,
|
|
4
|
-
export declare class EditingCreateWorkflowImpl
|
|
2
|
+
import { EditingWorkflow, EditingWorkflowProps, EditingWorkflowState } from "./api";
|
|
3
|
+
export declare class EditingCreateWorkflowImpl implements EditingWorkflow {
|
|
5
4
|
#private;
|
|
6
5
|
private _httpService;
|
|
7
6
|
private _intl;
|
|
@@ -15,7 +14,6 @@ export declare class EditingCreateWorkflowImpl extends EventEmitter<EditingWorkf
|
|
|
15
14
|
private _editingLayer;
|
|
16
15
|
private _drawInteraction;
|
|
17
16
|
private _olMap;
|
|
18
|
-
private _mapContainer;
|
|
19
17
|
private _tooltip;
|
|
20
18
|
private _enterHandler;
|
|
21
19
|
private _escapeHandler;
|
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { reactive, effect } from '@conterra/reactivity-core';
|
|
2
|
+
import { createLogger, createManualPromise } from '@open-pioneer/core';
|
|
2
3
|
import { TOPMOST_LAYER_Z } from '@open-pioneer/map';
|
|
3
4
|
import { unByKey } from 'ol/Observable.js';
|
|
4
5
|
import GeoJSON from 'ol/format/GeoJSON.js';
|
|
@@ -10,7 +11,7 @@ import { createTooltip } from './Tooltip.js';
|
|
|
10
11
|
import { createStyles } from './style-utils.js';
|
|
11
12
|
|
|
12
13
|
const LOG = createLogger("editing:EditingCreateWorkflowImpl");
|
|
13
|
-
class EditingCreateWorkflowImpl
|
|
14
|
+
class EditingCreateWorkflowImpl {
|
|
14
15
|
#waiter;
|
|
15
16
|
_httpService;
|
|
16
17
|
_intl;
|
|
@@ -24,7 +25,6 @@ class EditingCreateWorkflowImpl extends EventEmitter {
|
|
|
24
25
|
_editingLayer;
|
|
25
26
|
_drawInteraction;
|
|
26
27
|
_olMap;
|
|
27
|
-
_mapContainer;
|
|
28
28
|
_tooltip;
|
|
29
29
|
_enterHandler;
|
|
30
30
|
_escapeHandler;
|
|
@@ -32,14 +32,13 @@ class EditingCreateWorkflowImpl extends EventEmitter {
|
|
|
32
32
|
_interactionListener;
|
|
33
33
|
_mapListener;
|
|
34
34
|
constructor(options) {
|
|
35
|
-
super();
|
|
36
35
|
this._httpService = options.httpService;
|
|
37
36
|
this._intl = options.intl;
|
|
38
37
|
this._polygonStyle = options.polygonStyle;
|
|
39
38
|
this._vertexStyle = options.vertexStyle;
|
|
40
39
|
this._map = options.map;
|
|
41
40
|
this._olMap = options.map.olMap;
|
|
42
|
-
this._state = "active:initialized";
|
|
41
|
+
this._state = reactive("active:initialized");
|
|
43
42
|
this._editLayerURL = options.ogcApiFeatureLayerUrl;
|
|
44
43
|
this._editingSource = new VectorSource();
|
|
45
44
|
this._editingLayer = new VectorLayer({
|
|
@@ -82,11 +81,10 @@ class EditingCreateWorkflowImpl extends EventEmitter {
|
|
|
82
81
|
return this._drawInteraction;
|
|
83
82
|
}
|
|
84
83
|
getState() {
|
|
85
|
-
return this._state;
|
|
84
|
+
return this._state.value;
|
|
86
85
|
}
|
|
87
86
|
_setState(state) {
|
|
88
|
-
this._state = state;
|
|
89
|
-
this.emit(state);
|
|
87
|
+
this._state.value = state;
|
|
90
88
|
}
|
|
91
89
|
_save(feature) {
|
|
92
90
|
this._setState("active:saving");
|
|
@@ -106,6 +104,8 @@ class EditingCreateWorkflowImpl extends EventEmitter {
|
|
|
106
104
|
rightHanded: true,
|
|
107
105
|
decimals: 10
|
|
108
106
|
});
|
|
107
|
+
this._olMap.removeInteraction(this._drawInteraction);
|
|
108
|
+
this._tooltip.destroy();
|
|
109
109
|
saveCreatedFeature(this._httpService, layerUrl, geoJSONGeometry, projection).then((featureId) => {
|
|
110
110
|
this._featureId = featureId;
|
|
111
111
|
this._destroy();
|
|
@@ -120,11 +120,18 @@ class EditingCreateWorkflowImpl extends EventEmitter {
|
|
|
120
120
|
_start() {
|
|
121
121
|
this._olMap.addLayer(this._editingLayer);
|
|
122
122
|
this._olMap.addInteraction(this._drawInteraction);
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
123
|
+
const containerEvents = effect(() => {
|
|
124
|
+
const container = this._map.container;
|
|
125
|
+
if (!container) {
|
|
126
|
+
return;
|
|
127
|
+
}
|
|
128
|
+
container.addEventListener("keydown", this._enterHandler, false);
|
|
129
|
+
container.addEventListener("keydown", this._escapeHandler, false);
|
|
130
|
+
return () => {
|
|
131
|
+
container.removeEventListener("keydown", this._enterHandler);
|
|
132
|
+
container.removeEventListener("keydown", this._escapeHandler);
|
|
133
|
+
};
|
|
134
|
+
});
|
|
128
135
|
this._tooltip.setVisible(true);
|
|
129
136
|
const drawStart = this._drawInteraction.on("drawstart", () => {
|
|
130
137
|
this._setState("active:drawing");
|
|
@@ -144,17 +151,8 @@ class EditingCreateWorkflowImpl extends EventEmitter {
|
|
|
144
151
|
}
|
|
145
152
|
this._save(feature);
|
|
146
153
|
});
|
|
147
|
-
const changedContainer = this._map.on("changed:container", () => {
|
|
148
|
-
this._mapContainer?.removeEventListener("keydown", this._enterHandler);
|
|
149
|
-
this._mapContainer?.removeEventListener("keydown", this._escapeHandler);
|
|
150
|
-
this._mapContainer = this._olMap.getTargetElement() ?? void 0;
|
|
151
|
-
if (this._mapContainer) {
|
|
152
|
-
this._mapContainer.addEventListener("keydown", this._enterHandler, false);
|
|
153
|
-
this._mapContainer.addEventListener("keydown", this._escapeHandler, false);
|
|
154
|
-
}
|
|
155
|
-
});
|
|
156
154
|
this._interactionListener.push(drawStart, drawEnd);
|
|
157
|
-
this._mapListener.push(
|
|
155
|
+
this._mapListener.push(containerEvents);
|
|
158
156
|
}
|
|
159
157
|
reset() {
|
|
160
158
|
this._drawInteraction.abortDrawing();
|
|
@@ -173,21 +171,19 @@ class EditingCreateWorkflowImpl extends EventEmitter {
|
|
|
173
171
|
this._olMap.removeLayer(this._editingLayer);
|
|
174
172
|
this._olMap.removeInteraction(this._drawInteraction);
|
|
175
173
|
this._tooltip.destroy();
|
|
176
|
-
this._interactionListener.
|
|
174
|
+
this._interactionListener.forEach((listener) => {
|
|
177
175
|
unByKey(listener);
|
|
178
176
|
});
|
|
179
|
-
this._mapListener.
|
|
177
|
+
this._mapListener.forEach((listener) => {
|
|
180
178
|
listener.destroy();
|
|
181
179
|
});
|
|
182
|
-
this._mapContainer?.removeEventListener("keydown", this._enterHandler);
|
|
183
|
-
this._mapContainer?.removeEventListener("keydown", this._escapeHandler);
|
|
184
180
|
this._setState("destroyed");
|
|
185
181
|
}
|
|
186
182
|
triggerSave() {
|
|
187
183
|
this._drawInteraction.finishDrawing();
|
|
188
184
|
}
|
|
189
185
|
whenComplete() {
|
|
190
|
-
if (this._state === "destroyed") {
|
|
186
|
+
if (this._state.value === "destroyed") {
|
|
191
187
|
if (this._error) {
|
|
192
188
|
return Promise.reject(this._error);
|
|
193
189
|
} else {
|
|
@@ -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 {\n EventEmitter,\n ManualPromise,\n Resource,\n createLogger,\n createManualPromise\n} 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 {\n EditingWorkflow,\n EditingWorkflowEvents,\n EditingWorkflowProps,\n EditingWorkflowState\n} from \"./api\";\nimport { createStyles } from \"./style-utils\";\n\nconst LOG = createLogger(\"editing:EditingCreateWorkflowImpl\");\n\nexport class EditingCreateWorkflowImpl\n extends EventEmitter<EditingWorkflowEvents>\n implements EditingWorkflow\n{\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: EditingWorkflowState;\n private _editLayerURL: URL;\n private _featureId: string | undefined;\n\n private _editingSource: VectorSource;\n private _editingLayer: VectorLayer<Feature>;\n private _drawInteraction: Draw;\n private _olMap: OlMap;\n private _mapContainer: HTMLElement | undefined;\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 super();\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 = \"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;\n }\n\n private _setState(state: EditingWorkflowState) {\n this._state = state;\n this.emit(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 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 this._mapContainer = this._olMap.getTargetElement() ?? undefined;\n if (this._mapContainer) {\n this._mapContainer.addEventListener(\"keydown\", this._enterHandler, false);\n this._mapContainer.addEventListener(\"keydown\", this._escapeHandler, false);\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 // update event handler when container changes\n const changedContainer = this._map.on(\"changed:container\", () => {\n this._mapContainer?.removeEventListener(\"keydown\", this._enterHandler);\n this._mapContainer?.removeEventListener(\"keydown\", this._escapeHandler);\n\n this._mapContainer = this._olMap.getTargetElement() ?? undefined;\n if (this._mapContainer) {\n this._mapContainer.addEventListener(\"keydown\", this._enterHandler, false);\n this._mapContainer.addEventListener(\"keydown\", this._escapeHandler, false);\n }\n });\n\n this._interactionListener.push(drawStart, drawEnd);\n this._mapListener.push(changedContainer);\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.map((listener) => {\n unByKey(listener);\n });\n this._mapListener.map((listener) => {\n listener.destroy();\n });\n\n // Remove event escape listener\n this._mapContainer?.removeEventListener(\"keydown\", this._enterHandler);\n this._mapContainer?.removeEventListener(\"keydown\", this._escapeHandler);\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 === \"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 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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"}
|
package/EditingServiceImpl.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { EditingCreateWorkflowImpl } from './EditingCreateWorkflowImpl.js';
|
|
2
2
|
import { EditingUpdateWorkflowImpl } from './EditingUpdateWorkflowImpl.js';
|
|
3
|
+
import { syncWatch } from '@conterra/reactivity-core';
|
|
3
4
|
|
|
4
5
|
class EditingServiceImpl {
|
|
5
6
|
_serviceOptions;
|
|
@@ -70,11 +71,17 @@ class EditingServiceImpl {
|
|
|
70
71
|
}
|
|
71
72
|
}
|
|
72
73
|
_connectToWorkflowDestroyEvent(workflow, mapId) {
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
74
|
+
const watchStateHandle = syncWatch(
|
|
75
|
+
() => [workflow.getState()],
|
|
76
|
+
([newState]) => {
|
|
77
|
+
if (newState === "destroyed") {
|
|
78
|
+
if (this._workflows.get(mapId) === workflow) {
|
|
79
|
+
this._workflows.delete(mapId);
|
|
80
|
+
}
|
|
81
|
+
watchStateHandle.destroy();
|
|
82
|
+
}
|
|
76
83
|
}
|
|
77
|
-
|
|
84
|
+
);
|
|
78
85
|
}
|
|
79
86
|
}
|
|
80
87
|
|
|
@@ -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\";\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 workflow.
|
|
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,8 +1,7 @@
|
|
|
1
|
-
import { EventEmitter } from "@open-pioneer/core";
|
|
2
|
-
import { Modify } from "ol/interaction";
|
|
3
1
|
import Feature from "ol/Feature";
|
|
4
|
-
import {
|
|
5
|
-
|
|
2
|
+
import { Modify } from "ol/interaction";
|
|
3
|
+
import { EditingWorkflow, EditingWorkflowProps, EditingWorkflowState } from "./api";
|
|
4
|
+
export declare class EditingUpdateWorkflowImpl implements EditingWorkflow {
|
|
6
5
|
#private;
|
|
7
6
|
private _httpService;
|
|
8
7
|
private _intl;
|
|
@@ -18,7 +17,6 @@ export declare class EditingUpdateWorkflowImpl extends EventEmitter<EditingWorkf
|
|
|
18
17
|
private _editingLayer;
|
|
19
18
|
private _modifyInteraction;
|
|
20
19
|
private _olMap;
|
|
21
|
-
private _mapContainer;
|
|
22
20
|
private _tooltip;
|
|
23
21
|
private _enterHandler;
|
|
24
22
|
private _escapeHandler;
|
|
@@ -1,16 +1,17 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { reactive, effect } from '@conterra/reactivity-core';
|
|
2
|
+
import { createManualPromise } from '@open-pioneer/core';
|
|
2
3
|
import { TOPMOST_LAYER_Z } from '@open-pioneer/map';
|
|
4
|
+
import { Collection } from 'ol';
|
|
5
|
+
import GeoJSON from 'ol/format/GeoJSON.js';
|
|
3
6
|
import { Modify } from 'ol/interaction.js';
|
|
4
7
|
import VectorLayer from 'ol/layer/Vector.js';
|
|
5
|
-
import VectorSource from 'ol/source/Vector.js';
|
|
6
|
-
import GeoJSON from 'ol/format/GeoJSON.js';
|
|
7
8
|
import { unByKey } from 'ol/Observable.js';
|
|
8
|
-
import
|
|
9
|
-
import { createStyles } from './style-utils.js';
|
|
9
|
+
import VectorSource from 'ol/source/Vector.js';
|
|
10
10
|
import { saveUpdatedFeature } from './SaveFeaturesHandler.js';
|
|
11
|
+
import { createStyles } from './style-utils.js';
|
|
11
12
|
import { createTooltip } from './Tooltip.js';
|
|
12
13
|
|
|
13
|
-
class EditingUpdateWorkflowImpl
|
|
14
|
+
class EditingUpdateWorkflowImpl {
|
|
14
15
|
#waiter;
|
|
15
16
|
_httpService;
|
|
16
17
|
_intl;
|
|
@@ -26,7 +27,6 @@ class EditingUpdateWorkflowImpl extends EventEmitter {
|
|
|
26
27
|
_editingLayer;
|
|
27
28
|
_modifyInteraction;
|
|
28
29
|
_olMap;
|
|
29
|
-
_mapContainer;
|
|
30
30
|
_tooltip;
|
|
31
31
|
_enterHandler;
|
|
32
32
|
_escapeHandler;
|
|
@@ -34,14 +34,13 @@ class EditingUpdateWorkflowImpl extends EventEmitter {
|
|
|
34
34
|
_interactionListener;
|
|
35
35
|
_mapListener;
|
|
36
36
|
constructor(options) {
|
|
37
|
-
super();
|
|
38
37
|
this._httpService = options.httpService;
|
|
39
38
|
this._intl = options.intl;
|
|
40
39
|
this._polygonStyle = options.polygonStyle;
|
|
41
40
|
this._vertexStyle = options.vertexStyle;
|
|
42
41
|
this._map = options.map;
|
|
43
42
|
this._olMap = options.map.olMap;
|
|
44
|
-
this._state = "active:initialized";
|
|
43
|
+
this._state = reactive("active:initialized");
|
|
45
44
|
this._editLayerURL = options.ogcApiFeatureLayerUrl;
|
|
46
45
|
this._initialFeature = options.feature.clone();
|
|
47
46
|
this._initialFeature.setId(options.feature.getId());
|
|
@@ -92,11 +91,10 @@ class EditingUpdateWorkflowImpl extends EventEmitter {
|
|
|
92
91
|
return this._modifyInteraction;
|
|
93
92
|
}
|
|
94
93
|
getState() {
|
|
95
|
-
return this._state;
|
|
94
|
+
return this._state.value;
|
|
96
95
|
}
|
|
97
96
|
_setState(state) {
|
|
98
|
-
this._state = state;
|
|
99
|
-
this.emit(state);
|
|
97
|
+
this._state.value = state;
|
|
100
98
|
}
|
|
101
99
|
_save(feature) {
|
|
102
100
|
this._setState("active:saving");
|
|
@@ -123,6 +121,8 @@ class EditingUpdateWorkflowImpl extends EventEmitter {
|
|
|
123
121
|
rightHanded: true,
|
|
124
122
|
decimals: 10
|
|
125
123
|
});
|
|
124
|
+
this._olMap.removeInteraction(this._modifyInteraction);
|
|
125
|
+
this._tooltip.destroy();
|
|
126
126
|
saveUpdatedFeature(
|
|
127
127
|
this._httpService,
|
|
128
128
|
layerUrl,
|
|
@@ -148,11 +148,18 @@ class EditingUpdateWorkflowImpl extends EventEmitter {
|
|
|
148
148
|
this.#waiter?.reject(this._error);
|
|
149
149
|
return;
|
|
150
150
|
}
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
151
|
+
const containerEvents = effect(() => {
|
|
152
|
+
const container = this._map.container;
|
|
153
|
+
if (!container) {
|
|
154
|
+
return;
|
|
155
|
+
}
|
|
156
|
+
container.addEventListener("keydown", this._enterHandler, false);
|
|
157
|
+
container.addEventListener("keydown", this._escapeHandler, false);
|
|
158
|
+
return () => {
|
|
159
|
+
container.removeEventListener("keydown", this._enterHandler);
|
|
160
|
+
container.removeEventListener("keydown", this._escapeHandler);
|
|
161
|
+
};
|
|
162
|
+
});
|
|
156
163
|
this._tooltip.setVisible(true);
|
|
157
164
|
const click = this._map.olMap.on("click", (e) => {
|
|
158
165
|
const coordinate = e.coordinate;
|
|
@@ -168,17 +175,8 @@ class EditingUpdateWorkflowImpl extends EventEmitter {
|
|
|
168
175
|
const modify = this._modifyInteraction.on("modifystart", () => {
|
|
169
176
|
this._setState("active:drawing");
|
|
170
177
|
});
|
|
171
|
-
const changedContainer = this._map.on("changed:container", () => {
|
|
172
|
-
this._mapContainer?.removeEventListener("keydown", this._enterHandler);
|
|
173
|
-
this._mapContainer?.removeEventListener("keydown", this._escapeHandler);
|
|
174
|
-
this._mapContainer = this._olMap.getTargetElement() ?? void 0;
|
|
175
|
-
if (this._mapContainer) {
|
|
176
|
-
this._mapContainer.addEventListener("keydown", this._enterHandler, false);
|
|
177
|
-
this._mapContainer.addEventListener("keydown", this._escapeHandler, false);
|
|
178
|
-
}
|
|
179
|
-
});
|
|
180
178
|
this._interactionListener.push(click, modify);
|
|
181
|
-
this._mapListener.push(
|
|
179
|
+
this._mapListener.push(containerEvents);
|
|
182
180
|
}
|
|
183
181
|
reset() {
|
|
184
182
|
const geometry = this._initialFeature.getGeometry()?.clone();
|
|
@@ -198,14 +196,12 @@ class EditingUpdateWorkflowImpl extends EventEmitter {
|
|
|
198
196
|
this._olMap.removeLayer(this._editingLayer);
|
|
199
197
|
this._olMap.removeInteraction(this._modifyInteraction);
|
|
200
198
|
this._tooltip.destroy();
|
|
201
|
-
this._interactionListener.
|
|
199
|
+
this._interactionListener.forEach((listener) => {
|
|
202
200
|
unByKey(listener);
|
|
203
201
|
});
|
|
204
|
-
this._mapListener.
|
|
202
|
+
this._mapListener.forEach((listener) => {
|
|
205
203
|
listener.destroy();
|
|
206
204
|
});
|
|
207
|
-
this._mapContainer?.removeEventListener("keydown", this._enterHandler);
|
|
208
|
-
this._mapContainer?.removeEventListener("keydown", this._escapeHandler);
|
|
209
205
|
this._setState("destroyed");
|
|
210
206
|
}
|
|
211
207
|
triggerSave() {
|
|
@@ -216,7 +212,7 @@ class EditingUpdateWorkflowImpl extends EventEmitter {
|
|
|
216
212
|
this._save(feature);
|
|
217
213
|
}
|
|
218
214
|
whenComplete() {
|
|
219
|
-
if (this._state === "destroyed") {
|
|
215
|
+
if (this._state.value === "destroyed") {
|
|
220
216
|
if (this._error) {
|
|
221
217
|
return Promise.reject(this._error);
|
|
222
218
|
} else {
|
|
@@ -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 { EventEmitter, ManualPromise, createManualPromise } from \"@open-pioneer/core\";\nimport { MapModel, TOPMOST_LAYER_Z } from \"@open-pioneer/map\";\nimport { Modify } from \"ol/interaction\";\nimport VectorLayer from \"ol/layer/Vector\";\nimport VectorSource from \"ol/source/Vector\";\nimport { HttpService } from \"@open-pioneer/http\";\nimport { FlatStyle } from \"ol/style/flat\";\nimport Feature from \"ol/Feature\";\nimport GeoJSON from \"ol/format/GeoJSON\";\nimport GeoJSONGeometry from \"ol/format/GeoJSON\";\nimport GeoJSONGeometryCollection from \"ol/format/GeoJSON\";\nimport OlMap from \"ol/Map\";\nimport { Resource } from \"@open-pioneer/core\";\nimport { unByKey } from \"ol/Observable\";\nimport { EventsKey } from \"ol/events\";\nimport {\n EditingWorkflowEvents,\n EditingWorkflowState,\n EditingWorkflow,\n EditingWorkflowProps\n} from \"./api\";\nimport { Collection } from \"ol\";\nimport { createStyles } from \"./style-utils\";\nimport { PackageIntl } from \"@open-pioneer/runtime\";\nimport { saveUpdatedFeature } from \"./SaveFeaturesHandler\";\nimport { Tooltip, createTooltip } from \"./Tooltip\";\n\nexport class EditingUpdateWorkflowImpl\n extends EventEmitter<EditingWorkflowEvents>\n implements EditingWorkflow\n{\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: 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<Feature>;\n private _modifyInteraction: Modify;\n private _olMap: OlMap;\n private _mapContainer: HTMLElement | undefined;\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 super();\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 = \"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;\n }\n\n private _setState(state: EditingWorkflowState) {\n this._state = state;\n this.emit(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 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 this._mapContainer = this._olMap.getTargetElement() ?? undefined;\n if (this._mapContainer) {\n this._mapContainer.addEventListener(\"keydown\", this._enterHandler, false);\n this._mapContainer.addEventListener(\"keydown\", this._escapeHandler, false);\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 // update event handler when container changes\n const changedContainer = this._map.on(\"changed:container\", () => {\n this._mapContainer?.removeEventListener(\"keydown\", this._enterHandler);\n this._mapContainer?.removeEventListener(\"keydown\", this._escapeHandler);\n\n this._mapContainer = this._olMap.getTargetElement() ?? undefined;\n if (this._mapContainer) {\n this._mapContainer.addEventListener(\"keydown\", this._enterHandler, false);\n this._mapContainer.addEventListener(\"keydown\", this._escapeHandler, false);\n }\n });\n\n this._interactionListener.push(click, modify);\n this._mapListener.push(changedContainer);\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.map((listener) => {\n unByKey(listener);\n });\n this._mapListener.map((listener) => {\n listener.destroy();\n });\n\n // Remove event escape listener\n this._mapContainer?.removeEventListener(\"keydown\", this._enterHandler);\n this._mapContainer?.removeEventListener(\"keydown\", this._escapeHandler);\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 === \"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 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/api.d.ts
CHANGED
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import { EventEmitter } from "@open-pioneer/core";
|
|
2
1
|
import { HttpService } from "@open-pioneer/http";
|
|
3
2
|
import { MapModel } from "@open-pioneer/map";
|
|
4
3
|
import type { DeclaredService, PackageIntl } from "@open-pioneer/runtime";
|
|
@@ -6,30 +5,22 @@ import { Feature } from "ol";
|
|
|
6
5
|
import { FlatStyle } from "ol/style/flat";
|
|
7
6
|
/**
|
|
8
7
|
* State of an editing workflow
|
|
8
|
+
*
|
|
9
|
+
* "active:initialized":
|
|
10
|
+
* Initial state after editing workflow was started but user has not yet started drawing.
|
|
11
|
+
*
|
|
12
|
+
* "active:drawing":
|
|
13
|
+
* State while user is drawing a feature. State is entered when user adds the first vertex of the geometry (`create-mode`).
|
|
14
|
+
* State while user is updating an existing feature. State is entered when user moved the first vertex of the geometry (`update-mode`).
|
|
15
|
+
*
|
|
16
|
+
* "active:saving":
|
|
17
|
+
* State while feature is being saved after user finished the geometry drawing.
|
|
18
|
+
*
|
|
19
|
+
* "destroyed:
|
|
20
|
+
* state after editing is stopped.
|
|
21
|
+
*
|
|
9
22
|
*/
|
|
10
23
|
export type EditingWorkflowState = "active:initialized" | "active:drawing" | "active:saving" | "destroyed";
|
|
11
|
-
/**
|
|
12
|
-
* Events emitted by the {@link EditingWorkflow}.
|
|
13
|
-
*/
|
|
14
|
-
export interface EditingWorkflowEvents {
|
|
15
|
-
/**
|
|
16
|
-
* Initial state after editing workflow was started but user has not yet started drawing.
|
|
17
|
-
*/
|
|
18
|
-
"active:initialized": void;
|
|
19
|
-
/**
|
|
20
|
-
* State while user is drawing a feature. State is entered when user adds the first vertex of the geometry (`create-mode`).
|
|
21
|
-
* State while user is updating an existing feature. State is entered when user moved the first vertex of the geometry (`update-mode`).
|
|
22
|
-
*/
|
|
23
|
-
"active:drawing": void;
|
|
24
|
-
/**
|
|
25
|
-
* State while feature is being saved after user finished the geometry drawing.
|
|
26
|
-
*/
|
|
27
|
-
"active:saving": void;
|
|
28
|
-
/**
|
|
29
|
-
* State after editing is stopped.
|
|
30
|
-
*/
|
|
31
|
-
"destroyed": void;
|
|
32
|
-
}
|
|
33
24
|
/**
|
|
34
25
|
* Props of an editing workflow
|
|
35
26
|
*/
|
|
@@ -45,7 +36,7 @@ export interface EditingWorkflowProps {
|
|
|
45
36
|
* EditingWorkflows are created by the {@link EditingService}
|
|
46
37
|
* and represent a currently ongoing editing workflow.
|
|
47
38
|
*/
|
|
48
|
-
export interface EditingWorkflow
|
|
39
|
+
export interface EditingWorkflow {
|
|
49
40
|
/**
|
|
50
41
|
* Stops this editing operation.
|
|
51
42
|
*/
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"type": "module",
|
|
3
3
|
"name": "@open-pioneer/editing",
|
|
4
|
-
"version": "0.
|
|
4
|
+
"version": "0.8.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,11 +14,12 @@
|
|
|
14
14
|
"directory": "src/packages/editing"
|
|
15
15
|
},
|
|
16
16
|
"dependencies": {
|
|
17
|
-
"@open-pioneer/core": "^2.
|
|
18
|
-
"@open-pioneer/http": "^2.
|
|
19
|
-
"@open-pioneer/runtime": "^2.
|
|
20
|
-
"ol": "^
|
|
21
|
-
"@
|
|
17
|
+
"@open-pioneer/core": "^2.4.0",
|
|
18
|
+
"@open-pioneer/http": "^2.4.0",
|
|
19
|
+
"@open-pioneer/runtime": "^2.4.0",
|
|
20
|
+
"ol": "^10.2.1",
|
|
21
|
+
"@conterra/reactivity-core": "^0.4.3",
|
|
22
|
+
"@open-pioneer/map": "^0.8.0"
|
|
22
23
|
},
|
|
23
24
|
"exports": {
|
|
24
25
|
"./package.json": "./package.json",
|