@open-pioneer/editing 1.0.0-dev.20251021074813 → 1.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,19 +1,39 @@
1
1
  # @open-pioneer/editing
2
2
 
3
- ## 1.0.0-dev.20251021074813
3
+ ## 1.1.0
4
4
 
5
5
  ### Minor Changes
6
6
 
7
- - 2abcaaf: Update to chakra-ui 3.27.1
7
+ - 10338fa: Update OpenLayers to 10.7.0
8
+ - a8b8a36: Update trails core packages to 4.3.0
9
+ - 10338fa: Update Chakra to 3.29.0
10
+
11
+ ### Patch Changes
12
+
13
+ - Updated dependencies [fce7fa9]
14
+ - Updated dependencies [10338fa]
15
+ - Updated dependencies [a8b8a36]
16
+ - Updated dependencies [10338fa]
17
+ - Updated dependencies [c38b619]
18
+ - @open-pioneer/map@1.1.0
19
+
20
+ ## 1.0.0
21
+
22
+ ### Minor Changes
23
+
24
+ - 2abcaaf: Update to chakra-ui 3.28.0
8
25
 
9
26
  ### Patch Changes
10
27
 
11
28
  - 10d2fe7: Update dependencies
12
- - 138d85b: Update core packages to 4.1.0
29
+ - 4f1e7bd: The highlight layer(s) created by this package now uses the map model's `topmost` option to register an (internal) layer.
30
+ The previous implementation was based on adding a "raw" OpenLayers layer to the `olMap`.
31
+ - 138d85b: Update core packages to 4.2.0
13
32
  - da6a410: Update dependencies
14
33
  - Updated dependencies [c6180c6]
15
34
  - Updated dependencies [29a10df]
16
35
  - Updated dependencies [10d2fe7]
36
+ - Updated dependencies [4f1e7bd]
17
37
  - Updated dependencies [2702df4]
18
38
  - Updated dependencies [12561fe]
19
39
  - Updated dependencies [5df900f]
@@ -21,6 +41,7 @@
21
41
  - Updated dependencies [b3709f1]
22
42
  - Updated dependencies [14c484e]
23
43
  - Updated dependencies [138d85b]
44
+ - Updated dependencies [4f1e7bd]
24
45
  - Updated dependencies [aeb9000]
25
46
  - Updated dependencies [9e9bc6e]
26
47
  - Updated dependencies [b3709f1]
@@ -32,7 +53,7 @@
32
53
  - Updated dependencies [773fa2d]
33
54
  - Updated dependencies [2abcaaf]
34
55
  - Updated dependencies [da6a410]
35
- - @open-pioneer/map@1.0.0-dev.20251021074813
56
+ - @open-pioneer/map@1.0.0
36
57
 
37
58
  ## 0.11.0
38
59
 
@@ -3,6 +3,7 @@ import { EditingWorkflow, EditingWorkflowProps, EditingWorkflowState } from "./a
3
3
  export declare class EditingCreateWorkflowImpl implements EditingWorkflow {
4
4
  #private;
5
5
  private _httpService;
6
+ private _layerFactory;
6
7
  private _intl;
7
8
  private _map;
8
9
  private _polygonStyle;
@@ -1,6 +1,6 @@
1
1
  import { reactive, effect } from '@conterra/reactivity-core';
2
2
  import { createLogger, createManualPromise } from '@open-pioneer/core';
3
- import { TOPMOST_LAYER_Z } from '@open-pioneer/map';
3
+ import { SimpleLayer } from '@open-pioneer/map';
4
4
  import { unByKey } from 'ol/Observable.js';
5
5
  import GeoJSON from 'ol/format/GeoJSON.js';
6
6
  import { Draw } from 'ol/interaction.js';
@@ -14,6 +14,7 @@ const LOG = createLogger("editing:EditingCreateWorkflowImpl");
14
14
  class EditingCreateWorkflowImpl {
15
15
  #waiter;
16
16
  _httpService;
17
+ _layerFactory;
17
18
  _intl;
18
19
  _map;
19
20
  _polygonStyle;
@@ -33,6 +34,7 @@ class EditingCreateWorkflowImpl {
33
34
  _mapListener;
34
35
  constructor(options) {
35
36
  this._httpService = options.httpService;
37
+ this._layerFactory = options.layerFactory;
36
38
  this._intl = options.intl;
37
39
  this._polygonStyle = options.polygonStyle;
38
40
  this._vertexStyle = options.vertexStyle;
@@ -41,12 +43,14 @@ class EditingCreateWorkflowImpl {
41
43
  this._state = reactive("active:initialized");
42
44
  this._editLayerURL = options.ogcApiFeatureLayerUrl;
43
45
  this._editingSource = new VectorSource();
44
- this._editingLayer = new VectorLayer({
45
- source: this._editingSource,
46
- zIndex: TOPMOST_LAYER_Z,
47
- properties: {
48
- name: "editing-layer"
49
- }
46
+ const olLayer = new VectorLayer({
47
+ source: this._editingSource
48
+ });
49
+ this._editingLayer = this._layerFactory.create({
50
+ type: SimpleLayer,
51
+ title: "editing-layer",
52
+ internal: true,
53
+ olLayer
50
54
  });
51
55
  this._drawInteraction = new Draw({
52
56
  source: this._editingSource,
@@ -118,7 +122,7 @@ class EditingCreateWorkflowImpl {
118
122
  });
119
123
  }
120
124
  _start() {
121
- this._olMap.addLayer(this._editingLayer);
125
+ this._map.layers.addLayer(this._editingLayer, { at: "topmost" });
122
126
  this._olMap.addInteraction(this._drawInteraction);
123
127
  const containerEvents = effect(() => {
124
128
  const container = this._map.container;
@@ -168,7 +172,8 @@ class EditingCreateWorkflowImpl {
168
172
  this.#waiter?.resolve(void 0);
169
173
  }
170
174
  _destroy() {
171
- this._olMap.removeLayer(this._editingLayer);
175
+ this._map.layers.removeLayer(this._editingLayer);
176
+ this._editingLayer.destroy();
172
177
  this._olMap.removeInteraction(this._drawInteraction);
173
178
  this._tooltip.destroy();
174
179
  this._interactionListener.forEach((listener) => {
@@ -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 { 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":";;;;;;;;;;;;AAyBA,MAAM,GAAA,GAAM,aAAa,mCAAmC,CAAA;AAErD,MAAM,yBAAA,CAAqD;AAAA,EAC9D,OAAA;AAAA,EAEQ,YAAA;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,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,IAAA,CAAK,aAAA,GAAgB,IAAI,WAAA,CAAY;AAAA,MACjC,QAAQ,IAAA,CAAK,cAAA;AAAA,MACb,MAAA,EAAQ,eAAA;AAAA,MACR,UAAA,EAAY;AAAA,QACR,IAAA,EAAM;AAAA;AACV,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,MAAA;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,MAAA,CAAO,QAAA,CAAS,IAAA,CAAK,aAAa,CAAA;AACvC,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,MAAA,CAAO,WAAA,CAAY,IAAA,CAAK,aAAa,CAAA;AAC1C,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
+ {"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 { 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 _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,4 +1,4 @@
1
- import { MapModel, MapRegistry } from "@open-pioneer/map";
1
+ import { LayerFactory, MapModel, MapRegistry } from "@open-pioneer/map";
2
2
  import { EditingService } from "./api";
3
3
  import { EditingCreateWorkflowImpl } from "./EditingCreateWorkflowImpl";
4
4
  import { EditingUpdateWorkflowImpl } from "./EditingUpdateWorkflowImpl";
@@ -8,6 +8,7 @@ import { Feature } from "ol";
8
8
  export interface References {
9
9
  mapRegistry: MapRegistry;
10
10
  httpService: HttpService;
11
+ layerFactory: LayerFactory;
11
12
  }
12
13
  export declare class EditingServiceImpl implements EditingService {
13
14
  private _serviceOptions;
@@ -1,6 +1,6 @@
1
1
  import { EditingCreateWorkflowImpl } from './EditingCreateWorkflowImpl.js';
2
2
  import { EditingUpdateWorkflowImpl } from './EditingUpdateWorkflowImpl.js';
3
- import { syncWatch } from '@conterra/reactivity-core';
3
+ import { watch } from '@conterra/reactivity-core';
4
4
 
5
5
  class EditingServiceImpl {
6
6
  _serviceOptions;
@@ -26,6 +26,7 @@ class EditingServiceImpl {
26
26
  polygonStyle: this._serviceOptions.properties.polygonStyle,
27
27
  vertexStyle: this._serviceOptions.properties.vertexStyle,
28
28
  httpService: this._serviceOptions.references.httpService,
29
+ layerFactory: this._serviceOptions.references.layerFactory,
29
30
  intl: this._serviceOptions.intl
30
31
  });
31
32
  this._workflows.set(mapId, workflow);
@@ -50,6 +51,7 @@ class EditingServiceImpl {
50
51
  polygonStyle: this._serviceOptions.properties.polygonStyle,
51
52
  vertexStyle: this._serviceOptions.properties.vertexStyle,
52
53
  httpService: this._serviceOptions.references.httpService,
54
+ layerFactory: this._serviceOptions.references.layerFactory,
53
55
  intl: this._serviceOptions.intl
54
56
  });
55
57
  this._workflows.set(mapId, workflow);
@@ -73,7 +75,7 @@ class EditingServiceImpl {
73
75
  }
74
76
  }
75
77
  _connectToWorkflowDestroyEvent(workflow, mapId) {
76
- const watchStateHandle = syncWatch(
78
+ const watchStateHandle = watch(
77
79
  () => [workflow.getState()],
78
80
  ([newState]) => {
79
81
  if (newState === "destroyed") {
@@ -82,7 +84,8 @@ class EditingServiceImpl {
82
84
  }
83
85
  watchStateHandle.destroy();
84
86
  }
85
- }
87
+ },
88
+ { dispatch: "sync" }
86
89
  );
87
90
  }
88
91
  }
@@ -1 +1 @@
1
- {"version":3,"file":"EditingServiceImpl.js","sources":["EditingServiceImpl.ts"],"sourcesContent":["// SPDX-FileCopyrightText: 2023-2025 Open Pioneer project (https://github.com/open-pioneer)\n// SPDX-License-Identifier: Apache-2.0\nimport { MapModel, MapRegistry } from \"@open-pioneer/map\";\nimport { EditingService } from \"./api\";\nimport { EditingCreateWorkflowImpl } from \"./EditingCreateWorkflowImpl\";\nimport { EditingUpdateWorkflowImpl } from \"./EditingUpdateWorkflowImpl\";\nimport { FlatStyle } from \"ol/style/flat\";\nimport { ServiceOptions } from \"@open-pioneer/runtime\";\nimport { HttpService } from \"@open-pioneer/http\";\nimport { Feature } from \"ol\";\nimport { syncWatch } from \"@conterra/reactivity-core\";\n\nexport interface References {\n mapRegistry: MapRegistry;\n httpService: HttpService;\n}\n\nexport class EditingServiceImpl implements EditingService {\n private _serviceOptions: ServiceOptions<References>;\n private _workflows: Map<string, EditingCreateWorkflowImpl | EditingUpdateWorkflowImpl>;\n\n constructor(serviceOptions: ServiceOptions<References>) {\n this._serviceOptions = serviceOptions;\n this._workflows = new Map();\n }\n\n createFeature(map: MapModel, ogcApiFeatureLayerUrl: URL): EditingCreateWorkflowImpl {\n if (!ogcApiFeatureLayerUrl || !map || !map.id) {\n throw new Error(\"Map, mapId or url is undefined.\");\n }\n\n const mapId = map.id;\n\n let workflow = this._workflows.get(mapId);\n if (workflow) {\n throw new Error(\n \"EditingWorkflow could not be started. EditingWorkflow already in progress for this map.\"\n );\n }\n\n workflow = new EditingCreateWorkflowImpl({\n map,\n ogcApiFeatureLayerUrl,\n polygonStyle: this._serviceOptions.properties.polygonStyle as FlatStyle,\n vertexStyle: this._serviceOptions.properties.vertexStyle as FlatStyle,\n httpService: this._serviceOptions.references.httpService,\n intl: this._serviceOptions.intl\n });\n this._workflows.set(mapId, workflow);\n this._connectToWorkflowDestroyEvent(workflow, mapId);\n\n return workflow;\n }\n\n updateFeature(\n map: MapModel,\n ogcApiFeatureLayerUrl: URL,\n feature: Feature\n ): EditingUpdateWorkflowImpl {\n if (!ogcApiFeatureLayerUrl || !map || !map.id) {\n throw new Error(\"Map, mapId or url is undefined.\");\n }\n\n const mapId = map.id;\n\n let workflow = this._workflows.get(mapId);\n if (workflow) {\n throw new Error(\n \"EditingWorkflow could not be started. EditingWorkflow already in progress for this map.\"\n );\n }\n\n workflow = new EditingUpdateWorkflowImpl({\n map,\n ogcApiFeatureLayerUrl,\n feature,\n polygonStyle: this._serviceOptions.properties.polygonStyle as FlatStyle,\n vertexStyle: this._serviceOptions.properties.vertexStyle as FlatStyle,\n httpService: this._serviceOptions.references.httpService,\n intl: this._serviceOptions.intl\n });\n this._workflows.set(mapId, workflow);\n this._connectToWorkflowDestroyEvent(workflow, mapId);\n\n return workflow;\n }\n\n stop(map: string | MapModel): void {\n const mapId = typeof map === \"string\" ? map : map.id;\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(map: string | MapModel): void {\n const mapId = typeof map === \"string\" ? map : map.id;\n const workflow = this._workflows.get(mapId);\n if (workflow) {\n workflow.reset();\n } else {\n throw new Error(\"No workflow found for mapId: \" + mapId);\n }\n }\n\n _connectToWorkflowDestroyEvent(\n workflow: EditingCreateWorkflowImpl | EditingUpdateWorkflowImpl,\n mapId: string\n ) {\n const watchStateHandle = syncWatch(\n () => [workflow.getState()],\n ([newState]) => {\n if (newState === \"destroyed\") {\n if (this._workflows.get(mapId) === workflow) {\n this._workflows.delete(mapId);\n }\n watchStateHandle.destroy();\n }\n }\n );\n }\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"EditingServiceImpl.js","sources":["EditingServiceImpl.ts"],"sourcesContent":["// SPDX-FileCopyrightText: 2023-2025 Open Pioneer project (https://github.com/open-pioneer)\n// SPDX-License-Identifier: Apache-2.0\nimport { LayerFactory, 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 { watch } from \"@conterra/reactivity-core\";\n\nexport interface References {\n mapRegistry: MapRegistry;\n httpService: HttpService;\n layerFactory: LayerFactory;\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 layerFactory: this._serviceOptions.references.layerFactory,\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 layerFactory: this._serviceOptions.references.layerFactory,\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(map: string | MapModel): void {\n const mapId = typeof map === \"string\" ? map : map.id;\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(map: string | MapModel): void {\n const mapId = typeof map === \"string\" ? map : map.id;\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 = watch(\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 { dispatch: \"sync\" }\n );\n }\n}\n"],"names":[],"mappings":"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"}
@@ -5,6 +5,7 @@ export declare class EditingUpdateWorkflowImpl implements EditingWorkflow {
5
5
  #private;
6
6
  private _httpService;
7
7
  private _intl;
8
+ private _layerFactory;
8
9
  private _map;
9
10
  private _polygonStyle;
10
11
  private _vertexStyle;
@@ -1,6 +1,6 @@
1
1
  import { reactive, effect } from '@conterra/reactivity-core';
2
2
  import { createManualPromise } from '@open-pioneer/core';
3
- import { TOPMOST_LAYER_Z } from '@open-pioneer/map';
3
+ import { SimpleLayer } from '@open-pioneer/map';
4
4
  import { Collection } from 'ol';
5
5
  import GeoJSON from 'ol/format/GeoJSON.js';
6
6
  import { Modify } from 'ol/interaction.js';
@@ -15,6 +15,7 @@ class EditingUpdateWorkflowImpl {
15
15
  #waiter;
16
16
  _httpService;
17
17
  _intl;
18
+ _layerFactory;
18
19
  _map;
19
20
  _polygonStyle;
20
21
  _vertexStyle;
@@ -35,6 +36,7 @@ class EditingUpdateWorkflowImpl {
35
36
  _mapListener;
36
37
  constructor(options) {
37
38
  this._httpService = options.httpService;
39
+ this._layerFactory = options.layerFactory;
38
40
  this._intl = options.intl;
39
41
  this._polygonStyle = options.polygonStyle;
40
42
  this._vertexStyle = options.vertexStyle;
@@ -55,12 +57,14 @@ class EditingUpdateWorkflowImpl {
55
57
  this._editingSource = new VectorSource({
56
58
  features: new Collection([this._editFeature])
57
59
  });
58
- this._editingLayer = new VectorLayer({
59
- source: this._editingSource,
60
- zIndex: TOPMOST_LAYER_Z,
61
- properties: {
62
- name: "editing-layer"
63
- }
60
+ const olLayer = new VectorLayer({
61
+ source: this._editingSource
62
+ });
63
+ this._editingLayer = this._layerFactory.create({
64
+ type: SimpleLayer,
65
+ title: "editing-layer",
66
+ internal: true,
67
+ olLayer
64
68
  });
65
69
  this._modifyInteraction = new Modify({
66
70
  source: this._editingSource
@@ -139,7 +143,7 @@ class EditingUpdateWorkflowImpl {
139
143
  });
140
144
  }
141
145
  _start() {
142
- this._olMap.addLayer(this._editingLayer);
146
+ this._map.layers.addLayer(this._editingLayer, { at: "topmost" });
143
147
  this._olMap.addInteraction(this._modifyInteraction);
144
148
  const feature = this._editingSource.getFeatures()[0];
145
149
  if (feature && !feature.getId()?.toString()) {
@@ -193,7 +197,8 @@ class EditingUpdateWorkflowImpl {
193
197
  }
194
198
  _destroy() {
195
199
  this._editingSource.clear();
196
- this._olMap.removeLayer(this._editingLayer);
200
+ this._map.layers.removeLayer(this._editingLayer);
201
+ this._editingLayer.destroy();
197
202
  this._olMap.removeInteraction(this._modifyInteraction);
198
203
  this._tooltip.destroy();
199
204
  this._interactionListener.forEach((listener) => {
@@ -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 { MapModel, TOPMOST_LAYER_Z } from \"@open-pioneer/map\";\nimport { PackageIntl } from \"@open-pioneer/runtime\";\nimport { Collection } from \"ol\";\nimport { EventsKey } from \"ol/events\";\nimport Feature from \"ol/Feature\";\nimport {\n default as GeoJSON,\n default as GeoJSONGeometry,\n default as GeoJSONGeometryCollection\n} from \"ol/format/GeoJSON\";\nimport { Modify } from \"ol/interaction\";\nimport VectorLayer from \"ol/layer/Vector\";\nimport OlMap from \"ol/Map\";\nimport { unByKey } from \"ol/Observable\";\nimport VectorSource from \"ol/source/Vector\";\nimport { FlatStyle } from \"ol/style/flat\";\nimport { EditingWorkflow, EditingWorkflowProps, EditingWorkflowState } from \"./api\";\nimport { saveUpdatedFeature } from \"./SaveFeaturesHandler\";\nimport { createStyles } from \"./style-utils\";\nimport { Tooltip, createTooltip } from \"./Tooltip\";\n\nexport class EditingUpdateWorkflowImpl implements EditingWorkflow {\n #waiter: ManualPromise<Record<string, string> | undefined> | undefined;\n\n private _httpService: HttpService;\n private _intl: PackageIntl;\n\n private _map: MapModel;\n private _polygonStyle: FlatStyle;\n private _vertexStyle: FlatStyle;\n private _state: Reactive<EditingWorkflowState>;\n private _editLayerURL: URL;\n private _featureId: string | undefined;\n\n private _initialFeature: Feature;\n private _editFeature: Feature;\n private _editingSource: VectorSource;\n private _editingLayer: VectorLayer<VectorSource, Feature>;\n private _modifyInteraction: Modify;\n private _olMap: OlMap;\n private _tooltip: Tooltip;\n private _enterHandler: (e: KeyboardEvent) => void;\n private _escapeHandler: (e: KeyboardEvent) => void;\n\n private _error: Error | undefined;\n\n private _interactionListener: Array<EventsKey>;\n private _mapListener: Array<Resource>;\n\n constructor(options: { feature: Feature } & EditingWorkflowProps) {\n this._httpService = options.httpService;\n this._intl = options.intl;\n\n this._polygonStyle = options.polygonStyle;\n this._vertexStyle = options.vertexStyle;\n\n this._map = options.map;\n this._olMap = options.map.olMap;\n this._state = reactive(\"active:initialized\");\n this._editLayerURL = options.ogcApiFeatureLayerUrl;\n\n // Save copy of initial state for reset feature\n this._initialFeature = options.feature.clone();\n this._initialFeature.setId(options.feature.getId());\n\n // Work on copied feature to avoid the style to be applied on the original feature\n this._editFeature = options.feature.clone();\n this._editFeature.setId(options.feature.getId());\n\n this._editFeature.setStyle(\n createStyles({\n polygon: this._polygonStyle,\n vertex: this._vertexStyle\n })\n );\n\n this._editingSource = new VectorSource({\n features: new Collection([this._editFeature])\n });\n this._editingLayer = new VectorLayer({\n source: this._editingSource,\n zIndex: TOPMOST_LAYER_Z,\n properties: {\n name: \"editing-layer\"\n }\n });\n\n this._modifyInteraction = new Modify({\n source: this._editingSource\n });\n\n this._tooltip = createTooltip(\n this._olMap,\n this._intl.formatMessage({ id: \"create.tooltip.deselect\" })\n );\n\n this._enterHandler = (e: KeyboardEvent) => {\n if (\n (e.code === \"Enter\" || e.code === \"NumpadEnter\") &&\n e.target === this._olMap.getTargetElement()\n ) {\n const updatedFeature = this._editingSource.getFeatures()[0];\n if (!updatedFeature) {\n throw Error(\"no updated feature found\");\n }\n this._save(updatedFeature);\n }\n };\n\n this._escapeHandler = (e: KeyboardEvent) => {\n if (e.code === \"Escape\" && e.target === this._olMap.getTargetElement()) {\n this.reset();\n }\n };\n\n this._interactionListener = [];\n this._mapListener = [];\n\n this._start();\n }\n\n getModifyInteraction() {\n return this._modifyInteraction;\n }\n\n getState() {\n return this._state.value;\n }\n\n private _setState(state: EditingWorkflowState) {\n this._state.value = state;\n }\n\n private _save(feature: Feature) {\n this._setState(\"active:saving\");\n\n const layerUrl = this._editLayerURL;\n\n this._featureId = feature.getId()?.toString();\n if (!this._featureId) {\n this._destroy();\n this._error = new Error(\"no feature id available\");\n this.#waiter?.reject(this._error);\n return;\n }\n\n const geometry = feature?.getGeometry();\n if (!geometry) {\n this._destroy();\n this._error = new Error(\"no geometry available\");\n this.#waiter?.reject(this._error);\n return;\n }\n const projection = this._olMap.getView().getProjection();\n const geoJson = new GeoJSON({\n dataProjection: projection\n });\n const geoJSONGeometry: GeoJSONGeometry | GeoJSONGeometryCollection =\n geoJson.writeGeometryObject(geometry, {\n rightHanded: true,\n decimals: 10\n });\n\n this._olMap.removeInteraction(this._modifyInteraction);\n this._tooltip.destroy();\n\n saveUpdatedFeature(\n this._httpService,\n layerUrl,\n this._featureId,\n geoJSONGeometry,\n projection\n )\n .then((featureId) => {\n this._destroy();\n this.#waiter?.resolve({ featureId });\n })\n .catch((err: Error) => {\n this._destroy();\n this._error = new Error(\"Failed to save feature\", { cause: err });\n this.#waiter?.reject(this._error);\n });\n }\n\n private _start() {\n this._olMap.addLayer(this._editingLayer);\n this._olMap.addInteraction(this._modifyInteraction);\n\n const feature = this._editingSource.getFeatures()[0];\n if (feature && !feature.getId()?.toString()) {\n this._destroy();\n this._error = new Error(\"no feature id available\");\n this.#waiter?.reject(this._error);\n return;\n }\n\n // Add EventListener on focused map to abort actual interaction via `Escape`\n const containerEvents = effect(() => {\n const container = this._map.container;\n if (!container) {\n return;\n }\n\n container.addEventListener(\"keydown\", this._enterHandler, false);\n container.addEventListener(\"keydown\", this._escapeHandler, false);\n return () => {\n container.removeEventListener(\"keydown\", this._enterHandler);\n container.removeEventListener(\"keydown\", this._escapeHandler);\n };\n });\n\n this._tooltip.setVisible(true);\n\n const click = this._map.olMap.on(\"click\", (e) => {\n const coordinate = e.coordinate;\n const altKeyPressed = e.originalEvent.altKey;\n const features = this._editingSource.getFeaturesAtCoordinate(coordinate);\n\n if (altKeyPressed) {\n return;\n }\n\n if (features.length === 0) {\n this.triggerSave();\n }\n });\n\n const modify = this._modifyInteraction.on(\"modifystart\", () => {\n this._setState(\"active:drawing\");\n });\n\n this._interactionListener.push(click, modify);\n this._mapListener.push(containerEvents);\n }\n\n reset() {\n // Clone geometry to pass geometry, not reference\n const geometry = this._initialFeature.getGeometry()?.clone();\n\n const resetFeature = this._editingSource.getFeatures()[0];\n if (!resetFeature) {\n throw Error(\"no updated feature found\");\n }\n resetFeature.setGeometry(geometry);\n\n this._setState(\"active:initialized\");\n }\n\n stop() {\n this._destroy();\n this.#waiter?.resolve(undefined);\n }\n\n private _destroy() {\n this._editingSource.clear();\n this._olMap.removeLayer(this._editingLayer);\n this._olMap.removeInteraction(this._modifyInteraction);\n this._tooltip.destroy();\n\n // Remove event listener on interaction and on map\n this._interactionListener.forEach((listener) => {\n unByKey(listener);\n });\n this._mapListener.forEach((listener) => {\n listener.destroy();\n });\n\n this._setState(\"destroyed\");\n }\n\n triggerSave() {\n const feature = this._editingSource.getFeatures()[0];\n if (!feature) {\n throw Error(\"no updated feature found\");\n }\n this._save(feature);\n }\n\n whenComplete(): Promise<Record<string, string> | undefined> {\n if (this._state.value === \"destroyed\") {\n if (this._error) {\n return Promise.reject(this._error);\n } else {\n if (this._featureId) {\n return Promise.resolve({ featureId: this._featureId });\n } else {\n return Promise.resolve(undefined);\n }\n }\n }\n\n const manualPromise = (this.#waiter ??= createManualPromise());\n return manualPromise.promise;\n }\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"EditingUpdateWorkflowImpl.js","sources":["EditingUpdateWorkflowImpl.ts"],"sourcesContent":["// SPDX-FileCopyrightText: 2023-2025 Open Pioneer project (https://github.com/open-pioneer)\n// SPDX-License-Identifier: Apache-2.0\nimport { Reactive, effect, reactive } from \"@conterra/reactivity-core\";\nimport { ManualPromise, Resource, createManualPromise } from \"@open-pioneer/core\";\nimport { HttpService } from \"@open-pioneer/http\";\nimport { 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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"}
package/api.d.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  import { HttpService } from "@open-pioneer/http";
2
- import { MapModel } from "@open-pioneer/map";
2
+ import { LayerFactory, MapModel } from "@open-pioneer/map";
3
3
  import type { DeclaredService, PackageIntl } from "@open-pioneer/runtime";
4
4
  import { Feature } from "ol";
5
5
  import { FlatStyle } from "ol/style/flat";
@@ -30,6 +30,7 @@ export interface EditingWorkflowProps {
30
30
  polygonStyle: FlatStyle;
31
31
  vertexStyle: FlatStyle;
32
32
  httpService: HttpService;
33
+ layerFactory: LayerFactory;
33
34
  intl: PackageIntl;
34
35
  }
35
36
  /**
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "type": "module",
3
3
  "name": "@open-pioneer/editing",
4
- "version": "1.0.0-dev.20251021074813",
4
+ "version": "1.1.0",
5
5
  "description": "This package provides an editing service that allows to start and handle geometry editing workflows.",
6
6
  "keywords": [
7
7
  "open-pioneer-trails"
@@ -14,12 +14,12 @@
14
14
  "directory": "src/packages/editing"
15
15
  },
16
16
  "dependencies": {
17
- "@open-pioneer/core": "4.2.0-dev.20251021072202",
18
- "@open-pioneer/http": "4.2.0-dev.20251021072202",
19
- "@open-pioneer/runtime": "4.2.0-dev.20251021072202",
20
- "ol": "^10.6.1",
21
- "@conterra/reactivity-core": "^0.8.0",
22
- "@open-pioneer/map": "1.0.0-dev.20251021074813"
17
+ "@open-pioneer/core": "^4.3.0",
18
+ "@open-pioneer/http": "^4.3.0",
19
+ "@open-pioneer/runtime": "^4.3.0",
20
+ "ol": "^10.7.0",
21
+ "@conterra/reactivity-core": "^0.8.1",
22
+ "@open-pioneer/map": "^1.1.0"
23
23
  },
24
24
  "exports": {
25
25
  "./package.json": "./package.json",
@@ -49,6 +49,11 @@
49
49
  "type": "unique",
50
50
  "interfaceName": "map.MapRegistry"
51
51
  },
52
+ {
53
+ "referenceName": "layerFactory",
54
+ "type": "unique",
55
+ "interfaceName": "map.LayerFactory"
56
+ },
52
57
  {
53
58
  "referenceName": "httpService",
54
59
  "type": "unique",