@open-pioneer/selection 0.2.3 → 0.2.4
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 +11 -0
- package/DragController.d.ts +1 -1
- package/DragController.js +6 -15
- package/DragController.js.map +1 -1
- package/Selection.d.ts +0 -9
- package/Selection.js +93 -104
- package/Selection.js.map +1 -1
- package/i18n/de.yaml +2 -0
- package/i18n/en.yaml +2 -0
- package/package.json +7 -7
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,16 @@
|
|
|
1
1
|
# @open-pioneer/selection
|
|
2
2
|
|
|
3
|
+
## 0.2.4
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- 291ccb6: Automatically select initial selection-source.
|
|
8
|
+
- b152428: Update trails dependencies
|
|
9
|
+
- da18bda: The `onSelectionSourceChange` event is no longer thrown if user selects the currently selected source again.
|
|
10
|
+
- Updated dependencies [b152428]
|
|
11
|
+
- Updated dependencies [291ccb6]
|
|
12
|
+
- @open-pioneer/map@0.6.1
|
|
13
|
+
|
|
3
14
|
## 0.2.3
|
|
4
15
|
|
|
5
16
|
### Patch Changes
|
package/DragController.d.ts
CHANGED
|
@@ -12,7 +12,7 @@ export declare class DragController {
|
|
|
12
12
|
private isActive;
|
|
13
13
|
private tooltipMessage;
|
|
14
14
|
private tooltipDisabledMessage;
|
|
15
|
-
constructor(olMap: OlMap,
|
|
15
|
+
constructor(olMap: OlMap, tooltipMessage: string, tooltipDisabledMessage: string, onExtentSelected: (geometry: Geometry) => void);
|
|
16
16
|
initViewport(olMap: OlMap): HTMLElement;
|
|
17
17
|
/**
|
|
18
18
|
* Method for destroying the controller when it is no longer needed
|
package/DragController.js
CHANGED
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
import { unByKey } from 'ol/Observable.js';
|
|
2
2
|
import Overlay from 'ol/Overlay.js';
|
|
3
3
|
import { mouseActionButton } from 'ol/events/condition.js';
|
|
4
|
-
import { SelectionMethods } from './Selection.js';
|
|
5
4
|
import { DragBox, DragPan } from 'ol/interaction.js';
|
|
6
5
|
|
|
7
6
|
const ACTIVE_CLASS = "selection-active";
|
|
@@ -13,20 +12,12 @@ class DragController {
|
|
|
13
12
|
isActive = true;
|
|
14
13
|
tooltipMessage;
|
|
15
14
|
tooltipDisabledMessage;
|
|
16
|
-
constructor(olMap,
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
this.interactionResources.push(
|
|
23
|
-
this.createDragBox(olMap, onExtentSelected, viewPort, this.interactionResources)
|
|
24
|
-
);
|
|
25
|
-
this.interactionResources.push(
|
|
26
|
-
this.createDrag(olMap, viewPort, this.interactionResources)
|
|
27
|
-
);
|
|
28
|
-
break;
|
|
29
|
-
}
|
|
15
|
+
constructor(olMap, tooltipMessage, tooltipDisabledMessage, onExtentSelected) {
|
|
16
|
+
const viewPort = this.initViewport(olMap);
|
|
17
|
+
this.interactionResources.push(
|
|
18
|
+
this.createDragBox(olMap, onExtentSelected, viewPort, this.interactionResources)
|
|
19
|
+
);
|
|
20
|
+
this.interactionResources.push(this.createDrag(olMap, viewPort, this.interactionResources));
|
|
30
21
|
this.tooltip = this.createHelpTooltip(olMap, tooltipMessage);
|
|
31
22
|
this.olMap = olMap;
|
|
32
23
|
this.tooltipMessage = tooltipMessage;
|
package/DragController.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DragController.js","sources":["DragController.ts"],"sourcesContent":["// SPDX-FileCopyrightText: 2023 Open Pioneer project (https://github.com/open-pioneer)\n// SPDX-License-Identifier: Apache-2.0\nimport { Resource } from \"@open-pioneer/core\";\nimport OlMap from \"ol/Map\";\nimport { unByKey } from \"ol/Observable\";\nimport Overlay from \"ol/Overlay\";\nimport { mouseActionButton } from \"ol/events/condition\";\nimport Geometry from \"ol/geom/Geometry\";\nimport { SelectionMethods } from \"./Selection\";\nimport { DragBox, DragPan } from \"ol/interaction\";\nimport PointerInteraction from \"ol/interaction/Pointer\";\n\ninterface InteractionResource extends Resource {\n interaction: PointerInteraction;\n}\n/** Represents a tooltip rendered on the OpenLayers map. */\ninterface Tooltip extends Resource {\n overlay: Overlay;\n element: HTMLDivElement;\n setText(value: string): void;\n}\n\nconst ACTIVE_CLASS = \"selection-active\";\nconst INACTIVE_CLASS = \"selection-inactive\";\n\nexport class DragController {\n private tooltip: Tooltip;\n private interactionResources: InteractionResource[] = [];\n private olMap: OlMap;\n private isActive: boolean = true;\n private tooltipMessage: string;\n private tooltipDisabledMessage: string;\n\n constructor(\n olMap: OlMap,\n selectMethode: string,\n tooltipMessage: string,\n tooltipDisabledMessage: string,\n onExtentSelected: (geometry: Geometry) => void\n ) {\n let viewPort;\n /**\n * Notice for Projectdeveloper\n * Add cases for more Selectionmethods\n */\n switch (selectMethode) {\n case SelectionMethods.extent:\n default:\n viewPort = this.initViewport(olMap);\n this.interactionResources.push(\n this.createDragBox(olMap, onExtentSelected, viewPort, this.interactionResources)\n );\n this.interactionResources.push(\n this.createDrag(olMap, viewPort, this.interactionResources)\n );\n break;\n }\n\n this.tooltip = this.createHelpTooltip(olMap, tooltipMessage);\n this.olMap = olMap;\n this.tooltipMessage = tooltipMessage;\n this.tooltipDisabledMessage = tooltipDisabledMessage;\n }\n\n initViewport(olMap: OlMap) {\n const viewPort = olMap.getViewport();\n viewPort.classList.add(ACTIVE_CLASS);\n\n viewPort.oncontextmenu = (e) => {\n e.preventDefault();\n return false;\n };\n return viewPort;\n }\n\n /**\n * Method for destroying the controller when it is no longer needed\n */\n destroy() {\n this.tooltip.destroy();\n this.interactionResources.forEach((interaction) => {\n interaction.destroy();\n });\n }\n\n setActive(isActive: boolean) {\n if (this.isActive === isActive) return;\n const viewPort = this.olMap.getViewport();\n if (isActive) {\n this.interactionResources.forEach((interaction) =>\n this.olMap.addInteraction(interaction.interaction)\n );\n this.tooltip.setText(this.tooltipMessage);\n viewPort.classList.remove(INACTIVE_CLASS);\n viewPort.classList.add(ACTIVE_CLASS);\n this.isActive = true;\n } else {\n this.interactionResources.forEach((interaction) =>\n this.olMap.removeInteraction(interaction.interaction)\n );\n this.tooltip.setText(this.tooltipDisabledMessage);\n viewPort.classList.remove(ACTIVE_CLASS);\n viewPort.classList.add(INACTIVE_CLASS);\n this.isActive = false;\n }\n }\n\n /**\n * Method to create a simple extent-selection\n */\n private createDragBox(\n olMap: OlMap,\n onExtentSelected: (geometry: Geometry) => void,\n viewPort: HTMLElement,\n interactionResources: InteractionResource[]\n ): InteractionResource {\n const dragBox = new DragBox({\n className: \"selection-drag-box\",\n condition: mouseActionButton\n });\n\n olMap.addInteraction(dragBox);\n dragBox.on(\"boxend\", function () {\n onExtentSelected(dragBox.getGeometry());\n });\n\n const interactionResource: InteractionResource = {\n interaction: dragBox,\n destroy() {\n olMap.removeInteraction(dragBox);\n interactionResources.splice(interactionResources.indexOf(this));\n dragBox.dispose();\n viewPort.classList.remove(ACTIVE_CLASS);\n viewPort.classList.remove(INACTIVE_CLASS);\n viewPort.oncontextmenu = null;\n }\n };\n return interactionResource;\n }\n\n /**\n * Method to activate pan with right-mouse-click\n */\n private createDrag(\n olMap: OlMap,\n viewPort: HTMLElement,\n interactionResources: InteractionResource[]\n ): InteractionResource {\n const condition = function (mapBrowserEvent: {\n originalEvent: MouseEvent;\n dragging: unknown;\n }) {\n const originalEvent = /** @type {MouseEvent} */ mapBrowserEvent.originalEvent;\n return originalEvent.button == 2;\n };\n const drag = new DragPan({\n condition: condition\n });\n\n olMap.addInteraction(drag);\n\n const interactionResource: InteractionResource = {\n interaction: drag,\n destroy() {\n olMap.removeInteraction(drag);\n interactionResources.splice(interactionResources.indexOf(this));\n drag.dispose();\n viewPort.classList.remove(ACTIVE_CLASS);\n viewPort.classList.remove(INACTIVE_CLASS);\n viewPort.oncontextmenu = null;\n }\n };\n\n return interactionResource;\n }\n\n /**\n * Method to generate a tooltip on the mouse cursor\n */\n private createHelpTooltip(olMap: OlMap, message: string): Tooltip {\n const element = document.createElement(\"div\");\n element.className = \"selection-tooltip printing-hide\";\n element.role = \"tooltip\";\n\n const content = document.createElement(\"span\");\n content.textContent = message;\n element.appendChild(content);\n\n const overlay = new Overlay({\n element: element,\n offset: [15, 0],\n positioning: \"center-left\"\n });\n\n const pointHandler = olMap.on(\"pointermove\", (evt) => {\n overlay.setPosition(evt.coordinate);\n });\n\n olMap.addOverlay(overlay);\n return {\n overlay,\n element,\n destroy() {\n olMap.removeOverlay(overlay);\n overlay.dispose();\n unByKey(pointHandler);\n },\n setText(value) {\n content.textContent = value;\n }\n };\n }\n\n /**\n * Method for testing purposes only\n * @returns InteractionResource of class DragBox\n */\n getDragboxInteraction() {\n return this.interactionResources.find(\n (interactionResource) => interactionResource.interaction instanceof DragBox\n );\n }\n\n /**\n * Method for testing purposes only\n * @returns InteractionResource of class DragPan\n */\n getDragPanInteraction() {\n return this.interactionResources.find(\n (interactionResource) => interactionResource.interaction instanceof DragPan\n );\n }\n}\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"DragController.js","sources":["DragController.ts"],"sourcesContent":["// SPDX-FileCopyrightText: 2023 Open Pioneer project (https://github.com/open-pioneer)\n// SPDX-License-Identifier: Apache-2.0\nimport { Resource } from \"@open-pioneer/core\";\nimport OlMap from \"ol/Map\";\nimport { unByKey } from \"ol/Observable\";\nimport Overlay from \"ol/Overlay\";\nimport { mouseActionButton } from \"ol/events/condition\";\nimport Geometry from \"ol/geom/Geometry\";\nimport { DragBox, DragPan } from \"ol/interaction\";\nimport PointerInteraction from \"ol/interaction/Pointer\";\n\ninterface InteractionResource extends Resource {\n interaction: PointerInteraction;\n}\n/** Represents a tooltip rendered on the OpenLayers map. */\ninterface Tooltip extends Resource {\n overlay: Overlay;\n element: HTMLDivElement;\n setText(value: string): void;\n}\n\nconst ACTIVE_CLASS = \"selection-active\";\nconst INACTIVE_CLASS = \"selection-inactive\";\n\nexport class DragController {\n private tooltip: Tooltip;\n private interactionResources: InteractionResource[] = [];\n private olMap: OlMap;\n private isActive: boolean = true;\n private tooltipMessage: string;\n private tooltipDisabledMessage: string;\n\n constructor(\n olMap: OlMap,\n tooltipMessage: string,\n tooltipDisabledMessage: string,\n onExtentSelected: (geometry: Geometry) => void\n ) {\n const viewPort = this.initViewport(olMap);\n this.interactionResources.push(\n this.createDragBox(olMap, onExtentSelected, viewPort, this.interactionResources)\n );\n this.interactionResources.push(this.createDrag(olMap, viewPort, this.interactionResources));\n\n this.tooltip = this.createHelpTooltip(olMap, tooltipMessage);\n this.olMap = olMap;\n this.tooltipMessage = tooltipMessage;\n this.tooltipDisabledMessage = tooltipDisabledMessage;\n }\n\n initViewport(olMap: OlMap) {\n const viewPort = olMap.getViewport();\n viewPort.classList.add(ACTIVE_CLASS);\n\n viewPort.oncontextmenu = (e) => {\n e.preventDefault();\n return false;\n };\n return viewPort;\n }\n\n /**\n * Method for destroying the controller when it is no longer needed\n */\n destroy() {\n this.tooltip.destroy();\n this.interactionResources.forEach((interaction) => {\n interaction.destroy();\n });\n }\n\n setActive(isActive: boolean) {\n if (this.isActive === isActive) return;\n const viewPort = this.olMap.getViewport();\n if (isActive) {\n this.interactionResources.forEach((interaction) =>\n this.olMap.addInteraction(interaction.interaction)\n );\n this.tooltip.setText(this.tooltipMessage);\n viewPort.classList.remove(INACTIVE_CLASS);\n viewPort.classList.add(ACTIVE_CLASS);\n this.isActive = true;\n } else {\n this.interactionResources.forEach((interaction) =>\n this.olMap.removeInteraction(interaction.interaction)\n );\n this.tooltip.setText(this.tooltipDisabledMessage);\n viewPort.classList.remove(ACTIVE_CLASS);\n viewPort.classList.add(INACTIVE_CLASS);\n this.isActive = false;\n }\n }\n\n /**\n * Method to create a simple extent-selection\n */\n private createDragBox(\n olMap: OlMap,\n onExtentSelected: (geometry: Geometry) => void,\n viewPort: HTMLElement,\n interactionResources: InteractionResource[]\n ): InteractionResource {\n const dragBox = new DragBox({\n className: \"selection-drag-box\",\n condition: mouseActionButton\n });\n\n olMap.addInteraction(dragBox);\n dragBox.on(\"boxend\", function () {\n onExtentSelected(dragBox.getGeometry());\n });\n\n const interactionResource: InteractionResource = {\n interaction: dragBox,\n destroy() {\n olMap.removeInteraction(dragBox);\n interactionResources.splice(interactionResources.indexOf(this));\n dragBox.dispose();\n viewPort.classList.remove(ACTIVE_CLASS);\n viewPort.classList.remove(INACTIVE_CLASS);\n viewPort.oncontextmenu = null;\n }\n };\n return interactionResource;\n }\n\n /**\n * Method to activate pan with right-mouse-click\n */\n private createDrag(\n olMap: OlMap,\n viewPort: HTMLElement,\n interactionResources: InteractionResource[]\n ): InteractionResource {\n const condition = function (mapBrowserEvent: {\n originalEvent: MouseEvent;\n dragging: unknown;\n }) {\n const originalEvent = /** @type {MouseEvent} */ mapBrowserEvent.originalEvent;\n return originalEvent.button == 2;\n };\n const drag = new DragPan({\n condition: condition\n });\n\n olMap.addInteraction(drag);\n\n const interactionResource: InteractionResource = {\n interaction: drag,\n destroy() {\n olMap.removeInteraction(drag);\n interactionResources.splice(interactionResources.indexOf(this));\n drag.dispose();\n viewPort.classList.remove(ACTIVE_CLASS);\n viewPort.classList.remove(INACTIVE_CLASS);\n viewPort.oncontextmenu = null;\n }\n };\n\n return interactionResource;\n }\n\n /**\n * Method to generate a tooltip on the mouse cursor\n */\n private createHelpTooltip(olMap: OlMap, message: string): Tooltip {\n const element = document.createElement(\"div\");\n element.className = \"selection-tooltip printing-hide\";\n element.role = \"tooltip\";\n\n const content = document.createElement(\"span\");\n content.textContent = message;\n element.appendChild(content);\n\n const overlay = new Overlay({\n element: element,\n offset: [15, 0],\n positioning: \"center-left\"\n });\n\n const pointHandler = olMap.on(\"pointermove\", (evt) => {\n overlay.setPosition(evt.coordinate);\n });\n\n olMap.addOverlay(overlay);\n return {\n overlay,\n element,\n destroy() {\n olMap.removeOverlay(overlay);\n overlay.dispose();\n unByKey(pointHandler);\n },\n setText(value) {\n content.textContent = value;\n }\n };\n }\n\n /**\n * Method for testing purposes only\n * @returns InteractionResource of class DragBox\n */\n getDragboxInteraction() {\n return this.interactionResources.find(\n (interactionResource) => interactionResource.interaction instanceof DragBox\n );\n }\n\n /**\n * Method for testing purposes only\n * @returns InteractionResource of class DragPan\n */\n getDragPanInteraction() {\n return this.interactionResources.find(\n (interactionResource) => interactionResource.interaction instanceof DragPan\n );\n }\n}\n"],"names":[],"mappings":";;;;;AAqBA,MAAM,YAAe,GAAA,kBAAA,CAAA;AACrB,MAAM,cAAiB,GAAA,oBAAA,CAAA;AAEhB,MAAM,cAAe,CAAA;AAAA,EAChB,OAAA,CAAA;AAAA,EACA,uBAA8C,EAAC,CAAA;AAAA,EAC/C,KAAA,CAAA;AAAA,EACA,QAAoB,GAAA,IAAA,CAAA;AAAA,EACpB,cAAA,CAAA;AAAA,EACA,sBAAA,CAAA;AAAA,EAER,WACI,CAAA,KAAA,EACA,cACA,EAAA,sBAAA,EACA,gBACF,EAAA;AACE,IAAM,MAAA,QAAA,GAAW,IAAK,CAAA,YAAA,CAAa,KAAK,CAAA,CAAA;AACxC,IAAA,IAAA,CAAK,oBAAqB,CAAA,IAAA;AAAA,MACtB,KAAK,aAAc,CAAA,KAAA,EAAO,gBAAkB,EAAA,QAAA,EAAU,KAAK,oBAAoB,CAAA;AAAA,KACnF,CAAA;AACA,IAAK,IAAA,CAAA,oBAAA,CAAqB,KAAK,IAAK,CAAA,UAAA,CAAW,OAAO,QAAU,EAAA,IAAA,CAAK,oBAAoB,CAAC,CAAA,CAAA;AAE1F,IAAA,IAAA,CAAK,OAAU,GAAA,IAAA,CAAK,iBAAkB,CAAA,KAAA,EAAO,cAAc,CAAA,CAAA;AAC3D,IAAA,IAAA,CAAK,KAAQ,GAAA,KAAA,CAAA;AACb,IAAA,IAAA,CAAK,cAAiB,GAAA,cAAA,CAAA;AACtB,IAAA,IAAA,CAAK,sBAAyB,GAAA,sBAAA,CAAA;AAAA,GAClC;AAAA,EAEA,aAAa,KAAc,EAAA;AACvB,IAAM,MAAA,QAAA,GAAW,MAAM,WAAY,EAAA,CAAA;AACnC,IAAS,QAAA,CAAA,SAAA,CAAU,IAAI,YAAY,CAAA,CAAA;AAEnC,IAAS,QAAA,CAAA,aAAA,GAAgB,CAAC,CAAM,KAAA;AAC5B,MAAA,CAAA,CAAE,cAAe,EAAA,CAAA;AACjB,MAAO,OAAA,KAAA,CAAA;AAAA,KACX,CAAA;AACA,IAAO,OAAA,QAAA,CAAA;AAAA,GACX;AAAA;AAAA;AAAA;AAAA,EAKA,OAAU,GAAA;AACN,IAAA,IAAA,CAAK,QAAQ,OAAQ,EAAA,CAAA;AACrB,IAAK,IAAA,CAAA,oBAAA,CAAqB,OAAQ,CAAA,CAAC,WAAgB,KAAA;AAC/C,MAAA,WAAA,CAAY,OAAQ,EAAA,CAAA;AAAA,KACvB,CAAA,CAAA;AAAA,GACL;AAAA,EAEA,UAAU,QAAmB,EAAA;AACzB,IAAI,IAAA,IAAA,CAAK,aAAa,QAAU,EAAA,OAAA;AAChC,IAAM,MAAA,QAAA,GAAW,IAAK,CAAA,KAAA,CAAM,WAAY,EAAA,CAAA;AACxC,IAAA,IAAI,QAAU,EAAA;AACV,MAAA,IAAA,CAAK,oBAAqB,CAAA,OAAA;AAAA,QAAQ,CAAC,WAC/B,KAAA,IAAA,CAAK,KAAM,CAAA,cAAA,CAAe,YAAY,WAAW,CAAA;AAAA,OACrD,CAAA;AACA,MAAK,IAAA,CAAA,OAAA,CAAQ,OAAQ,CAAA,IAAA,CAAK,cAAc,CAAA,CAAA;AACxC,MAAS,QAAA,CAAA,SAAA,CAAU,OAAO,cAAc,CAAA,CAAA;AACxC,MAAS,QAAA,CAAA,SAAA,CAAU,IAAI,YAAY,CAAA,CAAA;AACnC,MAAA,IAAA,CAAK,QAAW,GAAA,IAAA,CAAA;AAAA,KACb,MAAA;AACH,MAAA,IAAA,CAAK,oBAAqB,CAAA,OAAA;AAAA,QAAQ,CAAC,WAC/B,KAAA,IAAA,CAAK,KAAM,CAAA,iBAAA,CAAkB,YAAY,WAAW,CAAA;AAAA,OACxD,CAAA;AACA,MAAK,IAAA,CAAA,OAAA,CAAQ,OAAQ,CAAA,IAAA,CAAK,sBAAsB,CAAA,CAAA;AAChD,MAAS,QAAA,CAAA,SAAA,CAAU,OAAO,YAAY,CAAA,CAAA;AACtC,MAAS,QAAA,CAAA,SAAA,CAAU,IAAI,cAAc,CAAA,CAAA;AACrC,MAAA,IAAA,CAAK,QAAW,GAAA,KAAA,CAAA;AAAA,KACpB;AAAA,GACJ;AAAA;AAAA;AAAA;AAAA,EAKQ,aACJ,CAAA,KAAA,EACA,gBACA,EAAA,QAAA,EACA,oBACmB,EAAA;AACnB,IAAM,MAAA,OAAA,GAAU,IAAI,OAAQ,CAAA;AAAA,MACxB,SAAW,EAAA,oBAAA;AAAA,MACX,SAAW,EAAA,iBAAA;AAAA,KACd,CAAA,CAAA;AAED,IAAA,KAAA,CAAM,eAAe,OAAO,CAAA,CAAA;AAC5B,IAAQ,OAAA,CAAA,EAAA,CAAG,UAAU,WAAY;AAC7B,MAAiB,gBAAA,CAAA,OAAA,CAAQ,aAAa,CAAA,CAAA;AAAA,KACzC,CAAA,CAAA;AAED,IAAA,MAAM,mBAA2C,GAAA;AAAA,MAC7C,WAAa,EAAA,OAAA;AAAA,MACb,OAAU,GAAA;AACN,QAAA,KAAA,CAAM,kBAAkB,OAAO,CAAA,CAAA;AAC/B,QAAA,oBAAA,CAAqB,MAAO,CAAA,oBAAA,CAAqB,OAAQ,CAAA,IAAI,CAAC,CAAA,CAAA;AAC9D,QAAA,OAAA,CAAQ,OAAQ,EAAA,CAAA;AAChB,QAAS,QAAA,CAAA,SAAA,CAAU,OAAO,YAAY,CAAA,CAAA;AACtC,QAAS,QAAA,CAAA,SAAA,CAAU,OAAO,cAAc,CAAA,CAAA;AACxC,QAAA,QAAA,CAAS,aAAgB,GAAA,IAAA,CAAA;AAAA,OAC7B;AAAA,KACJ,CAAA;AACA,IAAO,OAAA,mBAAA,CAAA;AAAA,GACX;AAAA;AAAA;AAAA;AAAA,EAKQ,UAAA,CACJ,KACA,EAAA,QAAA,EACA,oBACmB,EAAA;AACnB,IAAM,MAAA,SAAA,GAAY,SAAU,eAGzB,EAAA;AACC,MAAM,MAAA,aAAA;AAAA;AAAA,QAA0C,eAAgB,CAAA,aAAA;AAAA,OAAA,CAAA;AAChE,MAAA,OAAO,cAAc,MAAU,IAAA,CAAA,CAAA;AAAA,KACnC,CAAA;AACA,IAAM,MAAA,IAAA,GAAO,IAAI,OAAQ,CAAA;AAAA,MACrB,SAAA;AAAA,KACH,CAAA,CAAA;AAED,IAAA,KAAA,CAAM,eAAe,IAAI,CAAA,CAAA;AAEzB,IAAA,MAAM,mBAA2C,GAAA;AAAA,MAC7C,WAAa,EAAA,IAAA;AAAA,MACb,OAAU,GAAA;AACN,QAAA,KAAA,CAAM,kBAAkB,IAAI,CAAA,CAAA;AAC5B,QAAA,oBAAA,CAAqB,MAAO,CAAA,oBAAA,CAAqB,OAAQ,CAAA,IAAI,CAAC,CAAA,CAAA;AAC9D,QAAA,IAAA,CAAK,OAAQ,EAAA,CAAA;AACb,QAAS,QAAA,CAAA,SAAA,CAAU,OAAO,YAAY,CAAA,CAAA;AACtC,QAAS,QAAA,CAAA,SAAA,CAAU,OAAO,cAAc,CAAA,CAAA;AACxC,QAAA,QAAA,CAAS,aAAgB,GAAA,IAAA,CAAA;AAAA,OAC7B;AAAA,KACJ,CAAA;AAEA,IAAO,OAAA,mBAAA,CAAA;AAAA,GACX;AAAA;AAAA;AAAA;AAAA,EAKQ,iBAAA,CAAkB,OAAc,OAA0B,EAAA;AAC9D,IAAM,MAAA,OAAA,GAAU,QAAS,CAAA,aAAA,CAAc,KAAK,CAAA,CAAA;AAC5C,IAAA,OAAA,CAAQ,SAAY,GAAA,iCAAA,CAAA;AACpB,IAAA,OAAA,CAAQ,IAAO,GAAA,SAAA,CAAA;AAEf,IAAM,MAAA,OAAA,GAAU,QAAS,CAAA,aAAA,CAAc,MAAM,CAAA,CAAA;AAC7C,IAAA,OAAA,CAAQ,WAAc,GAAA,OAAA,CAAA;AACtB,IAAA,OAAA,CAAQ,YAAY,OAAO,CAAA,CAAA;AAE3B,IAAM,MAAA,OAAA,GAAU,IAAI,OAAQ,CAAA;AAAA,MACxB,OAAA;AAAA,MACA,MAAA,EAAQ,CAAC,EAAA,EAAI,CAAC,CAAA;AAAA,MACd,WAAa,EAAA,aAAA;AAAA,KAChB,CAAA,CAAA;AAED,IAAA,MAAM,YAAe,GAAA,KAAA,CAAM,EAAG,CAAA,aAAA,EAAe,CAAC,GAAQ,KAAA;AAClD,MAAQ,OAAA,CAAA,WAAA,CAAY,IAAI,UAAU,CAAA,CAAA;AAAA,KACrC,CAAA,CAAA;AAED,IAAA,KAAA,CAAM,WAAW,OAAO,CAAA,CAAA;AACxB,IAAO,OAAA;AAAA,MACH,OAAA;AAAA,MACA,OAAA;AAAA,MACA,OAAU,GAAA;AACN,QAAA,KAAA,CAAM,cAAc,OAAO,CAAA,CAAA;AAC3B,QAAA,OAAA,CAAQ,OAAQ,EAAA,CAAA;AAChB,QAAA,OAAA,CAAQ,YAAY,CAAA,CAAA;AAAA,OACxB;AAAA,MACA,QAAQ,KAAO,EAAA;AACX,QAAA,OAAA,CAAQ,WAAc,GAAA,KAAA,CAAA;AAAA,OAC1B;AAAA,KACJ,CAAA;AAAA,GACJ;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,qBAAwB,GAAA;AACpB,IAAA,OAAO,KAAK,oBAAqB,CAAA,IAAA;AAAA,MAC7B,CAAC,mBAAwB,KAAA,mBAAA,CAAoB,WAAuB,YAAA,OAAA;AAAA,KACxE,CAAA;AAAA,GACJ;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,qBAAwB,GAAA;AACpB,IAAA,OAAO,KAAK,oBAAqB,CAAA,IAAA;AAAA,MAC7B,CAAC,mBAAwB,KAAA,mBAAA,CAAoB,WAAuB,YAAA,OAAA;AAAA,KACxE,CAAA;AAAA,GACJ;AACJ;;;;"}
|
package/Selection.d.ts
CHANGED
|
@@ -33,15 +33,6 @@ export interface SelectionSourceChangedEvent {
|
|
|
33
33
|
/** The new selected source */
|
|
34
34
|
source: SelectionSource | undefined;
|
|
35
35
|
}
|
|
36
|
-
/**
|
|
37
|
-
* Supported selection methods
|
|
38
|
-
*/
|
|
39
|
-
export declare enum SelectionMethods {
|
|
40
|
-
extent = "EXTENT",
|
|
41
|
-
polygon = "POLYGON",
|
|
42
|
-
free = "FREEPOLYGON",
|
|
43
|
-
circle = "CIRCLE"
|
|
44
|
-
}
|
|
45
36
|
/**
|
|
46
37
|
* A component that allows the user to perform a spatial selection on a given set of {@link SelectionSource}.
|
|
47
38
|
*/
|
package/Selection.js
CHANGED
|
@@ -1,21 +1,14 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { jsx, jsxs } from 'react/jsx-runtime';
|
|
2
2
|
import { VStack, FormControl, FormLabel, Flex, Box, Tooltip, chakra, Icon, useToken } from '@open-pioneer/chakra-integration';
|
|
3
3
|
import { useMapModel } from '@open-pioneer/map';
|
|
4
4
|
import { useCommonComponentProps, useEvent } from '@open-pioneer/react-utils';
|
|
5
5
|
import { Select, chakraComponents } from 'chakra-react-select';
|
|
6
6
|
import { useIntl, useService } from './_virtual/_virtual-pioneer-module_react-hooks.js';
|
|
7
|
-
import { useState,
|
|
7
|
+
import { useState, useMemo, useEffect, useRef } from 'react';
|
|
8
8
|
import { FiAlertTriangle } from 'react-icons/fi';
|
|
9
9
|
import { DragController } from './DragController.js';
|
|
10
10
|
import { SelectionController } from './SelectionController.js';
|
|
11
11
|
|
|
12
|
-
var SelectionMethods = /* @__PURE__ */ ((SelectionMethods2) => {
|
|
13
|
-
SelectionMethods2["extent"] = "EXTENT";
|
|
14
|
-
SelectionMethods2["polygon"] = "POLYGON";
|
|
15
|
-
SelectionMethods2["free"] = "FREEPOLYGON";
|
|
16
|
-
SelectionMethods2["circle"] = "CIRCLE";
|
|
17
|
-
return SelectionMethods2;
|
|
18
|
-
})(SelectionMethods || {});
|
|
19
12
|
const COMMON_SELECT_PROPS = {
|
|
20
13
|
classNamePrefix: "react-select",
|
|
21
14
|
menuPosition: "fixed",
|
|
@@ -26,9 +19,12 @@ const Selection = (props) => {
|
|
|
26
19
|
const intl = useIntl();
|
|
27
20
|
const { mapId, sources, onSelectionComplete, onSelectionSourceChanged } = props;
|
|
28
21
|
const { containerProps } = useCommonComponentProps("selection", props);
|
|
29
|
-
const
|
|
30
|
-
|
|
22
|
+
const defaultNotAvailableMessage = intl.formatMessage({ id: "sourceNotAvailable" });
|
|
23
|
+
const [currentSource, setCurrentSource] = useCurrentSelectionSource(
|
|
24
|
+
sources,
|
|
25
|
+
onSelectionSourceChanged
|
|
31
26
|
);
|
|
27
|
+
const currentSourceStatus = useSourceStatus(currentSource, defaultNotAvailableMessage);
|
|
32
28
|
const mapState = useMapModel(mapId);
|
|
33
29
|
const { onExtentSelected } = useSelectionController(
|
|
34
30
|
mapState.map,
|
|
@@ -38,101 +34,73 @@ const Selection = (props) => {
|
|
|
38
34
|
);
|
|
39
35
|
const chakraStyles = useChakraStyles();
|
|
40
36
|
const [isOpenSelect, setIsOpenSelect] = useState(false);
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
objects.push({ label: intl.formatMessage({ id: item }), value: item });
|
|
48
|
-
});
|
|
49
|
-
if (objects.length === 0) throw new Error("methods does not contain valid values");
|
|
50
|
-
return objects;
|
|
51
|
-
},
|
|
52
|
-
[intl]
|
|
37
|
+
useDragSelection(
|
|
38
|
+
mapState.map,
|
|
39
|
+
intl,
|
|
40
|
+
onExtentSelected,
|
|
41
|
+
currentSourceStatus.kind === "available",
|
|
42
|
+
!!currentSource
|
|
53
43
|
);
|
|
54
|
-
const methodOptions = buildMethodOptions(void 0);
|
|
55
|
-
const [selectedMethod, setSelectedMethod] = useState(methodOptions[0]);
|
|
56
|
-
const onMethodeOptionChance = useEvent((newValue) => {
|
|
57
|
-
setSelectedMethod(newValue);
|
|
58
|
-
});
|
|
59
|
-
const [dragControllerActive, setDragControllerActive] = useState(true);
|
|
60
|
-
useDragSelection(mapState.map, selectedMethod, intl, onExtentSelected, dragControllerActive);
|
|
61
44
|
const sourceOptions = useMemo(
|
|
62
45
|
() => sources.map((source) => {
|
|
63
46
|
return { label: source.label, value: source };
|
|
64
47
|
}),
|
|
65
48
|
[sources]
|
|
66
49
|
);
|
|
67
|
-
const currentSourceOption = useMemo(
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
50
|
+
const currentSourceOption = useMemo(() => {
|
|
51
|
+
const foundOption = sourceOptions.find(
|
|
52
|
+
(option) => option.value === currentSource
|
|
53
|
+
);
|
|
54
|
+
return foundOption || null;
|
|
55
|
+
}, [sourceOptions, currentSource]);
|
|
71
56
|
const onSourceOptionChanged = useEvent((newValue) => {
|
|
72
57
|
setCurrentSource(newValue?.value);
|
|
73
|
-
onSelectionSourceChanged && onSelectionSourceChanged({ source: newValue?.value });
|
|
74
58
|
});
|
|
75
|
-
useEffect(() => {
|
|
76
|
-
if (!currentSource) {
|
|
77
|
-
setDragControllerActive(false);
|
|
78
|
-
return;
|
|
79
|
-
}
|
|
80
|
-
const sourceNotAvailableReason = intl.formatMessage({ id: "sourceNotAvailable" });
|
|
81
|
-
const isCurrentSourceAvailable = () => {
|
|
82
|
-
return currentSource && getSourceStatus(currentSource, sourceNotAvailableReason).kind === "available";
|
|
83
|
-
};
|
|
84
|
-
setDragControllerActive(isCurrentSourceAvailable());
|
|
85
|
-
const handle = currentSource.on("changed:status", () => {
|
|
86
|
-
setDragControllerActive(isCurrentSourceAvailable());
|
|
87
|
-
});
|
|
88
|
-
return () => handle.destroy();
|
|
89
|
-
}, [currentSource, setDragControllerActive, intl]);
|
|
90
59
|
const keyDown = useEvent((event) => {
|
|
91
60
|
if (!isOpenSelect && event.key === "Enter") {
|
|
92
61
|
setIsOpenSelect(true);
|
|
93
62
|
}
|
|
94
63
|
});
|
|
95
|
-
return /* @__PURE__ */
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
SingleValue: SourceSelectValue
|
|
64
|
+
return /* @__PURE__ */ jsx(VStack, { ...containerProps, spacing: 2, children: /* @__PURE__ */ jsxs(FormControl, { children: [
|
|
65
|
+
/* @__PURE__ */ jsx(FormLabel, { children: intl.formatMessage({ id: "selectSource" }) }),
|
|
66
|
+
/* @__PURE__ */ jsx(
|
|
67
|
+
Select,
|
|
68
|
+
{
|
|
69
|
+
className: "selection-source react-select",
|
|
70
|
+
...COMMON_SELECT_PROPS,
|
|
71
|
+
options: sourceOptions,
|
|
72
|
+
placeholder: intl.formatMessage({ id: "selectionPlaceholder" }),
|
|
73
|
+
value: currentSourceOption,
|
|
74
|
+
onChange: onSourceOptionChanged,
|
|
75
|
+
components: {
|
|
76
|
+
Option: SourceSelectOption,
|
|
77
|
+
SingleValue: SourceSelectValue
|
|
78
|
+
},
|
|
79
|
+
isOptionDisabled: () => false,
|
|
80
|
+
getOptionLabel: (option) => {
|
|
81
|
+
const label = option.label;
|
|
82
|
+
const status = getSourceStatus(option.value, defaultNotAvailableMessage);
|
|
83
|
+
if (status.kind == "available") return label;
|
|
84
|
+
return label + " " + status.reason;
|
|
85
|
+
},
|
|
86
|
+
ariaLiveMessages: {
|
|
87
|
+
guidance: () => "",
|
|
88
|
+
onChange: (props2) => {
|
|
89
|
+
if (props2.action == "select-option" || props2.action == "initial-input-focus")
|
|
90
|
+
return props2.label + " " + intl.formatMessage({ id: "selected" });
|
|
91
|
+
else return "";
|
|
124
92
|
},
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
] });
|
|
93
|
+
onFilter: () => "",
|
|
94
|
+
onFocus: () => ""
|
|
95
|
+
},
|
|
96
|
+
chakraStyles,
|
|
97
|
+
onKeyDown: keyDown,
|
|
98
|
+
menuIsOpen: isOpenSelect,
|
|
99
|
+
onMenuOpen: () => setIsOpenSelect(true),
|
|
100
|
+
onMenuClose: () => setIsOpenSelect(false)
|
|
101
|
+
}
|
|
102
|
+
)
|
|
103
|
+
] }) });
|
|
136
104
|
};
|
|
137
105
|
function SourceSelectOption(props) {
|
|
138
106
|
const { value } = props.data;
|
|
@@ -153,9 +121,29 @@ function SourceSelectValue(props) {
|
|
|
153
121
|
const clazz = isAvailable ? "selection-source-value" : "selection-source-value selection-source-value--disabled";
|
|
154
122
|
return /* @__PURE__ */ jsx(chakraComponents.SingleValue, { ...props, isDisabled: !isAvailable, className: clazz, children: content });
|
|
155
123
|
}
|
|
124
|
+
function useCurrentSelectionSource(sources, onSourceChanged) {
|
|
125
|
+
const [currentSource, setCurrentSource] = useState(
|
|
126
|
+
() => sources[0]
|
|
127
|
+
);
|
|
128
|
+
useEffect(() => {
|
|
129
|
+
if (currentSource && !sources.includes(currentSource)) {
|
|
130
|
+
setCurrentSource(void 0);
|
|
131
|
+
}
|
|
132
|
+
}, [sources, currentSource]);
|
|
133
|
+
const prevSelectedSource = useRef(void 0);
|
|
134
|
+
useEffect(() => {
|
|
135
|
+
if (currentSource !== prevSelectedSource.current) {
|
|
136
|
+
prevSelectedSource.current = currentSource;
|
|
137
|
+
onSourceChanged?.({ source: currentSource });
|
|
138
|
+
}
|
|
139
|
+
}, [currentSource, onSourceChanged]);
|
|
140
|
+
return [currentSource, setCurrentSource];
|
|
141
|
+
}
|
|
156
142
|
function useSourceItem(source, isSelected) {
|
|
143
|
+
const intl = useIntl();
|
|
157
144
|
const label = source?.label;
|
|
158
|
-
const
|
|
145
|
+
const defaultNotAvailableMessage = intl.formatMessage({ id: "sourceNotAvailable" });
|
|
146
|
+
const status = useSourceStatus(source, defaultNotAvailableMessage);
|
|
159
147
|
return {
|
|
160
148
|
isAvailable: status.kind === "available",
|
|
161
149
|
content: /* @__PURE__ */ jsxs(Flex, { direction: "row", alignItems: "center", grow: 1, children: [
|
|
@@ -221,40 +209,41 @@ function getSourceStatus(source, sourceNotAvailableReason) {
|
|
|
221
209
|
reason: current.reason ?? sourceNotAvailableReason
|
|
222
210
|
};
|
|
223
211
|
}
|
|
224
|
-
function useSourceStatus(source) {
|
|
225
|
-
const
|
|
226
|
-
|
|
212
|
+
function useSourceStatus(source, defaultNotAvailableMessage) {
|
|
213
|
+
const [status, setStatus] = useState(() => ({
|
|
214
|
+
kind: "unavailable",
|
|
215
|
+
reason: defaultNotAvailableMessage
|
|
216
|
+
}));
|
|
227
217
|
useEffect(() => {
|
|
228
218
|
if (!source) {
|
|
229
|
-
setStatus({ kind: "
|
|
219
|
+
setStatus({ kind: "unavailable", reason: defaultNotAvailableMessage });
|
|
230
220
|
return;
|
|
231
221
|
}
|
|
232
|
-
|
|
233
|
-
setStatus(getSourceStatus(source, sourceNotAvailableReason));
|
|
222
|
+
setStatus(getSourceStatus(source, defaultNotAvailableMessage));
|
|
234
223
|
const resource = source.on?.("changed:status", () => {
|
|
235
|
-
setStatus(getSourceStatus(source,
|
|
224
|
+
setStatus(getSourceStatus(source, defaultNotAvailableMessage));
|
|
236
225
|
});
|
|
237
226
|
return () => resource?.destroy();
|
|
238
|
-
}, [source,
|
|
227
|
+
}, [source, defaultNotAvailableMessage]);
|
|
239
228
|
return status;
|
|
240
229
|
}
|
|
241
|
-
function useDragSelection(map,
|
|
230
|
+
function useDragSelection(map, intl, onExtentSelected, isActive, hasSelectedSource) {
|
|
242
231
|
useEffect(() => {
|
|
243
232
|
if (!map) {
|
|
244
233
|
return;
|
|
245
234
|
}
|
|
235
|
+
const disabledMessage = hasSelectedSource ? intl.formatMessage({ id: "disabledTooltip" }) : intl.formatMessage({ id: "noSourceTooltip" });
|
|
246
236
|
const dragController = new DragController(
|
|
247
237
|
map.olMap,
|
|
248
|
-
selectMethode.value,
|
|
249
238
|
intl.formatMessage({ id: "tooltip" }),
|
|
250
|
-
|
|
239
|
+
disabledMessage,
|
|
251
240
|
onExtentSelected
|
|
252
241
|
);
|
|
253
242
|
dragController.setActive(isActive);
|
|
254
243
|
return () => {
|
|
255
244
|
dragController?.destroy();
|
|
256
245
|
};
|
|
257
|
-
}, [map,
|
|
246
|
+
}, [map, intl, onExtentSelected, isActive, hasSelectedSource]);
|
|
258
247
|
}
|
|
259
248
|
function useChakraStyles() {
|
|
260
249
|
const [dropDownBackground, borderColor] = useToken(
|
|
@@ -278,5 +267,5 @@ function useChakraStyles() {
|
|
|
278
267
|
}, [dropDownBackground, borderColor]);
|
|
279
268
|
}
|
|
280
269
|
|
|
281
|
-
export { Selection
|
|
270
|
+
export { Selection };
|
|
282
271
|
//# sourceMappingURL=Selection.js.map
|
package/Selection.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Selection.js","sources":["Selection.tsx"],"sourcesContent":["// SPDX-FileCopyrightText: 2023 Open Pioneer project (https://github.com/open-pioneer)\n// SPDX-License-Identifier: Apache-2.0\nimport {\n Box,\n Flex,\n FormControl,\n FormLabel,\n Icon,\n Tooltip,\n VStack,\n chakra,\n useToken\n} from \"@open-pioneer/chakra-integration\";\nimport { MapModel, useMapModel } from \"@open-pioneer/map\";\nimport { NotificationService } from \"@open-pioneer/notifier\";\nimport { CommonComponentProps, useCommonComponentProps, useEvent } from \"@open-pioneer/react-utils\";\nimport { PackageIntl } from \"@open-pioneer/runtime\";\nimport {\n OptionProps,\n Select,\n Props as SelectProps,\n SingleValueProps,\n chakraComponents,\n type SingleValue,\n ChakraStylesConfig,\n GroupBase\n} from \"chakra-react-select\";\nimport { Geometry } from \"ol/geom\";\nimport { useIntl, useService } from \"open-pioneer:react-hooks\";\nimport { FC, useCallback, useEffect, useMemo, useState } from \"react\";\nimport { FiAlertTriangle } from \"react-icons/fi\";\nimport { DragController } from \"./DragController\";\nimport { SelectionController } from \"./SelectionController\";\nimport { SelectionResult, SelectionSource, SelectionSourceStatusObject } from \"./api\";\nimport { KeyboardEvent } from \"react\";\n\n/**\n * Properties supported by the {@link Selection} component.\n */\nexport interface SelectionProps extends CommonComponentProps {\n /**\n * The id of the map.\n */\n mapId: string;\n\n /**\n * Array of selection sources available for spatial selection.\n */\n sources: SelectionSource[];\n\n /**\n * This handler is called whenever the user has successfully selected\n * some items.\n */\n onSelectionComplete?(event: SelectionCompleteEvent): void;\n\n /**\n * This handler is called whenever the user has changed the selected source\n */\n onSelectionSourceChanged?(event: SelectionSourceChangedEvent): void;\n}\n\nexport interface SelectionCompleteEvent {\n /** The source that returned the {@link results}. */\n source: SelectionSource;\n\n /** Results selected by the user. */\n results: SelectionResult[];\n}\n\nexport interface SelectionSourceChangedEvent {\n /** The new selected source */\n source: SelectionSource | undefined;\n}\n\n/**\n * Properties for single select options.\n */\ninterface SelectionOption {\n /**\n * The label of the selection source option.\n */\n label: string;\n\n /**\n * The value (SelectionSource) of the selection source option.\n */\n value: SelectionSource | undefined;\n}\n\n/**\n * Properties for single selection method options.\n */\ninterface MethodOption {\n /**\n * The label of the select method option.\n */\n label: string;\n\n /**\n * The value of the select method option.\n */\n value: string;\n}\n\n/**\n * Supported selection methods\n */\nexport enum SelectionMethods {\n extent = \"EXTENT\",\n polygon = \"POLYGON\",\n free = \"FREEPOLYGON\",\n circle = \"CIRCLE\"\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nconst COMMON_SELECT_PROPS: SelectProps<any, any, any> = {\n classNamePrefix: \"react-select\",\n menuPosition: \"fixed\",\n isSearchable: false,\n isClearable: false\n};\n\n/**\n * A component that allows the user to perform a spatial selection on a given set of {@link SelectionSource}.\n */\nexport const Selection: FC<SelectionProps> = (props) => {\n const intl = useIntl();\n const { mapId, sources, onSelectionComplete, onSelectionSourceChanged } = props;\n const { containerProps } = useCommonComponentProps(\"selection\", props);\n const [currentSource, setCurrentSource] = useState<SelectionSource | undefined>(() =>\n sources.find((s) => (s.status ?? \"available\") === \"available\")\n );\n const mapState = useMapModel(mapId);\n const { onExtentSelected } = useSelectionController(\n mapState.map,\n sources,\n currentSource,\n onSelectionComplete\n );\n const chakraStyles = useChakraStyles();\n const [isOpenSelect, setIsOpenSelect] = useState(false);\n\n /**\n * Method to build Option-Array from the supported selection methods for the selection-method react-select\n * If there is no configuration => Default selection method: EXTENT\n */\n const buildMethodOptions = useCallback(\n (methods: string[] | undefined) => {\n const objects: MethodOption[] = [];\n if (!methods) methods = [SelectionMethods.extent];\n methods.forEach((item) => {\n if (Object.values(SelectionMethods as unknown as string[]).includes(item))\n objects.push({ label: intl.formatMessage({ id: item }), value: item });\n });\n if (objects.length === 0) throw new Error(\"methods does not contain valid values\");\n return objects;\n },\n [intl]\n );\n\n const methodOptions: MethodOption[] = buildMethodOptions(undefined);\n const [selectedMethod, setSelectedMethod] = useState(methodOptions[0] as MethodOption);\n\n /**\n * Method to change used selectmethod\n */\n const onMethodeOptionChance = useEvent((newValue: MethodOption) => {\n setSelectedMethod(newValue);\n });\n\n const [dragControllerActive, setDragControllerActive] = useState<boolean>(true);\n useDragSelection(mapState.map, selectedMethod, intl, onExtentSelected, dragControllerActive);\n\n /**\n * Method to build Option-Array from sources for the selection-source react-select\n */\n const sourceOptions = useMemo(\n () =>\n sources.map<SelectionOption>((source) => {\n return { label: source.label, value: source };\n }),\n [sources]\n );\n const currentSourceOption = useMemo(\n () => sourceOptions.find((option) => option.value === currentSource),\n [sourceOptions, currentSource]\n );\n\n /**\n * Method to change used source\n */\n const onSourceOptionChanged = useEvent((newValue: SingleValue<SelectionOption>) => {\n setCurrentSource(newValue?.value);\n onSelectionSourceChanged && onSelectionSourceChanged({ source: newValue?.value });\n });\n\n useEffect(() => {\n if (!currentSource) {\n setDragControllerActive(false);\n return;\n }\n\n const sourceNotAvailableReason = intl.formatMessage({ id: \"sourceNotAvailable\" });\n const isCurrentSourceAvailable = () => {\n return (\n currentSource &&\n getSourceStatus(currentSource, sourceNotAvailableReason).kind === \"available\"\n );\n };\n\n setDragControllerActive(isCurrentSourceAvailable());\n // Why can this be undefined after test above?!\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n const handle = currentSource.on(\"changed:status\", () => {\n setDragControllerActive(isCurrentSourceAvailable());\n });\n return () => handle.destroy();\n }, [currentSource, setDragControllerActive, intl]);\n const keyDown = useEvent((event: KeyboardEvent<HTMLDivElement>) => {\n //if the menu is already open, do noting\n if (!isOpenSelect && event.key === \"Enter\") {\n setIsOpenSelect(true);\n }\n });\n\n return (\n <VStack {...containerProps} spacing={2}>\n {methodOptions.length > 1 && (\n <FormControl>\n <FormLabel>{intl.formatMessage({ id: \"selectMethod\" })}</FormLabel>\n <Select\n className=\"selection-method react-select\"\n {...COMMON_SELECT_PROPS}\n options={methodOptions}\n onChange={onMethodeOptionChance}\n value={selectedMethod}\n chakraStyles={chakraStyles}\n />\n </FormControl>\n )}\n <FormControl>\n <FormLabel>{intl.formatMessage({ id: \"selectSource\" })}</FormLabel>\n <Select<SelectionOption>\n className=\"selection-source react-select\"\n {...COMMON_SELECT_PROPS}\n options={sourceOptions}\n placeholder={intl.formatMessage({ id: \"selectionPlaceholder\" })}\n value={currentSourceOption}\n onChange={onSourceOptionChanged}\n components={{\n Option: SourceSelectOption,\n SingleValue: SourceSelectValue\n }}\n isOptionDisabled={(option) =>\n option.value === undefined || option.value.status === \"unavailable\"\n }\n // optionLabel is used by screenreaders\n getOptionLabel={(option) =>\n option.label +\n (option.value === undefined || option.value.status === \"unavailable\"\n ? \" \" + intl.formatMessage({ id: \"sourceNotAvailable\" })\n : \"\")\n }\n chakraStyles={chakraStyles}\n onKeyDown={keyDown}\n menuIsOpen={isOpenSelect}\n onMenuOpen={() => setIsOpenSelect(true)}\n onMenuClose={() => setIsOpenSelect(false)}\n />\n </FormControl>\n </VStack>\n );\n};\n\nfunction SourceSelectOption(props: OptionProps<SelectionOption>): JSX.Element {\n const { value } = props.data;\n const { isAvailable, content } = useSourceItem(value, false);\n\n return (\n <chakraComponents.Option\n {...props}\n isDisabled={!isAvailable}\n className=\"selection-source-option\"\n >\n {content}\n </chakraComponents.Option>\n );\n}\n\nfunction SourceSelectValue(props: SingleValueProps<SelectionOption>): JSX.Element {\n const { value } = props.data;\n const { isAvailable, content } = useSourceItem(value, true);\n const clazz = isAvailable\n ? \"selection-source-value\"\n : \"selection-source-value selection-source-value--disabled\";\n\n return (\n <chakraComponents.SingleValue {...props} isDisabled={!isAvailable} className={clazz}>\n {content}\n </chakraComponents.SingleValue>\n );\n}\n\n/**\n * Hook to manage source option in selection-source react-select\n */\nfunction useSourceItem(source: SelectionSource | undefined, isSelected: boolean) {\n const label: string | undefined = source?.label;\n const status = useSourceStatus(source);\n\n return {\n isAvailable: status.kind === \"available\",\n content: (\n <Flex direction=\"row\" alignItems=\"center\" grow={1}>\n {!isSelected && <Flex grow={1}>{label}</Flex>}\n {status.kind === \"unavailable\" && (\n <Box ml={2}>\n <Tooltip label={status.reason} placement=\"right\" openDelay={500}>\n <chakra.span>\n <Icon\n as={FiAlertTriangle}\n color=\"red\"\n className=\"warning-icon\"\n aria-label={status.reason}\n />\n </chakra.span>\n </Tooltip>\n </Box>\n )}\n {isSelected && label}\n </Flex>\n )\n };\n}\n\n/**\n * Hook to manage selection sources\n */\nfunction useSelectionController(\n mapModel: MapModel | undefined,\n sources: SelectionSource[],\n currentSource: SelectionSource | undefined,\n onSelectionComplete: ((event: SelectionCompleteEvent) => void) | undefined\n) {\n const notifier = useService<NotificationService>(\"notifier.NotificationService\");\n const intl = useIntl();\n const [controller, setController] = useState<SelectionController | undefined>(undefined);\n useEffect(() => {\n if (!mapModel) {\n return;\n }\n const controller = new SelectionController({\n mapModel,\n onError() {\n notifier.notify({\n level: \"error\",\n message: intl.formatMessage({ id: \"selectionFailed\" })\n });\n }\n });\n setController(controller);\n return () => {\n controller.destroy();\n };\n }, [mapModel, notifier, sources, intl]);\n\n const onExtentSelected = useEvent(async (geometry: Geometry) => {\n if (!controller || !currentSource) {\n return;\n }\n\n const selectionResult = await controller.select(currentSource, geometry.getExtent());\n if (!selectionResult) {\n return;\n }\n\n onSelectionComplete?.(selectionResult);\n });\n return {\n controller,\n onExtentSelected\n };\n}\n\ntype SimpleStatus =\n | {\n kind: \"available\";\n }\n | {\n kind: \"unavailable\";\n reason: string;\n };\n\nfunction getSourceStatus(source: SelectionSource, sourceNotAvailableReason: string): SimpleStatus {\n const rawCurrent = source.status ?? \"available\";\n const current: SelectionSourceStatusObject =\n typeof rawCurrent === \"string\" ? { kind: rawCurrent } : rawCurrent;\n if (current.kind === \"available\") {\n return current;\n }\n\n return {\n kind: \"unavailable\",\n reason: current.reason ?? sourceNotAvailableReason\n };\n}\n\n/**\n * Hook to manage source status\n */\nfunction useSourceStatus(source: SelectionSource | undefined): SimpleStatus {\n const intl = useIntl();\n const [status, setStatus] = useState<SimpleStatus>(() => ({ kind: \"available\" }));\n useEffect(() => {\n if (!source) {\n setStatus({ kind: \"available\" });\n return;\n }\n const sourceNotAvailableReason = intl.formatMessage({ id: \"sourceNotAvailable\" });\n setStatus(getSourceStatus(source, sourceNotAvailableReason));\n const resource = source.on?.(\"changed:status\", () => {\n setStatus(getSourceStatus(source, sourceNotAvailableReason));\n });\n return () => resource?.destroy();\n }, [source, intl]);\n return status;\n}\n\n/**\n * Hook to manage map controls and tooltip\n */\nfunction useDragSelection(\n map: MapModel | undefined,\n selectMethode: MethodOption,\n intl: PackageIntl,\n onExtentSelected: (geometry: Geometry) => void,\n isActive: boolean\n) {\n useEffect(() => {\n if (!map) {\n return;\n }\n\n const dragController = new DragController(\n map.olMap,\n selectMethode.value,\n intl.formatMessage({ id: \"tooltip\" }),\n intl.formatMessage({ id: \"disabledTooltip\" }),\n onExtentSelected\n );\n dragController.setActive(isActive);\n\n return () => {\n dragController?.destroy();\n };\n }, [map, selectMethode, intl, onExtentSelected, isActive]);\n}\n\n/**\n * Customizes components styles within the select component.\n */\nfunction useChakraStyles() {\n const [dropDownBackground, borderColor] = useToken(\n \"colors\",\n [\"background_body\", \"border\"],\n [\"#ffffff\", \"#ffffff\"]\n );\n return useMemo(() => {\n const chakraStyles: ChakraStylesConfig<\n SelectionOption,\n false,\n GroupBase<SelectionOption>\n > = {\n control: (styles) => ({ ...styles, cursor: \"pointer\" }),\n indicatorSeparator: (styles) => ({\n ...styles,\n borderColor: borderColor\n }),\n dropdownIndicator: (provided) => ({\n ...provided,\n backgroundColor: dropDownBackground\n })\n };\n return chakraStyles;\n }, [dropDownBackground, borderColor]);\n}\n"],"names":["SelectionMethods","controller"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"Selection.js","sources":["Selection.tsx"],"sourcesContent":["// SPDX-FileCopyrightText: 2023 Open Pioneer project (https://github.com/open-pioneer)\n// SPDX-License-Identifier: Apache-2.0\nimport {\n Box,\n Flex,\n FormControl,\n FormLabel,\n Icon,\n Tooltip,\n VStack,\n chakra,\n useToken\n} from \"@open-pioneer/chakra-integration\";\nimport { MapModel, useMapModel } from \"@open-pioneer/map\";\nimport { NotificationService } from \"@open-pioneer/notifier\";\nimport { CommonComponentProps, useCommonComponentProps, useEvent } from \"@open-pioneer/react-utils\";\nimport { PackageIntl } from \"@open-pioneer/runtime\";\nimport {\n ChakraStylesConfig,\n GroupBase,\n OptionProps,\n Select,\n Props as SelectProps,\n SingleValueProps,\n chakraComponents,\n type SingleValue\n} from \"chakra-react-select\";\nimport { Geometry } from \"ol/geom\";\nimport { useIntl, useService } from \"open-pioneer:react-hooks\";\nimport { FC, KeyboardEvent, useEffect, useMemo, useRef, useState } from \"react\";\nimport { FiAlertTriangle } from \"react-icons/fi\";\nimport { DragController } from \"./DragController\";\nimport { SelectionController } from \"./SelectionController\";\nimport { SelectionResult, SelectionSource, SelectionSourceStatusObject } from \"./api\";\n\n/**\n * Properties supported by the {@link Selection} component.\n */\nexport interface SelectionProps extends CommonComponentProps {\n /**\n * The id of the map.\n */\n mapId: string;\n\n /**\n * Array of selection sources available for spatial selection.\n */\n sources: SelectionSource[];\n\n /**\n * This handler is called whenever the user has successfully selected\n * some items.\n */\n onSelectionComplete?(event: SelectionCompleteEvent): void;\n\n /**\n * This handler is called whenever the user has changed the selected source\n */\n onSelectionSourceChanged?(event: SelectionSourceChangedEvent): void;\n}\n\nexport interface SelectionCompleteEvent {\n /** The source that returned the {@link results}. */\n source: SelectionSource;\n\n /** Results selected by the user. */\n results: SelectionResult[];\n}\n\nexport interface SelectionSourceChangedEvent {\n /** The new selected source */\n source: SelectionSource | undefined;\n}\n\n/**\n * Properties for single select options.\n */\ninterface SelectionOption {\n /**\n * The label of the selection source option.\n */\n label: string;\n\n /**\n * The value (SelectionSource) of the selection source option.\n */\n value: SelectionSource;\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nconst COMMON_SELECT_PROPS: SelectProps<any, any, any> = {\n classNamePrefix: \"react-select\",\n menuPosition: \"fixed\",\n isSearchable: false,\n isClearable: false\n};\n\n/**\n * A component that allows the user to perform a spatial selection on a given set of {@link SelectionSource}.\n */\nexport const Selection: FC<SelectionProps> = (props) => {\n const intl = useIntl();\n const { mapId, sources, onSelectionComplete, onSelectionSourceChanged } = props;\n const { containerProps } = useCommonComponentProps(\"selection\", props);\n const defaultNotAvailableMessage = intl.formatMessage({ id: \"sourceNotAvailable\" });\n\n const [currentSource, setCurrentSource] = useCurrentSelectionSource(\n sources,\n onSelectionSourceChanged\n );\n\n const currentSourceStatus = useSourceStatus(currentSource, defaultNotAvailableMessage);\n\n const mapState = useMapModel(mapId);\n const { onExtentSelected } = useSelectionController(\n mapState.map,\n sources,\n currentSource,\n onSelectionComplete\n );\n const chakraStyles = useChakraStyles();\n const [isOpenSelect, setIsOpenSelect] = useState(false);\n\n useDragSelection(\n mapState.map,\n intl,\n onExtentSelected,\n currentSourceStatus.kind === \"available\",\n !!currentSource\n );\n\n const sourceOptions = useMemo(\n () =>\n sources.map<SelectionOption>((source) => {\n return { label: source.label, value: source };\n }),\n [sources]\n );\n const currentSourceOption = useMemo(() => {\n const foundOption: SelectionOption | undefined = sourceOptions.find(\n (option) => option.value === currentSource\n );\n return foundOption || null;\n }, [sourceOptions, currentSource]);\n\n const onSourceOptionChanged = useEvent((newValue: SingleValue<SelectionOption>) => {\n setCurrentSource(newValue?.value);\n });\n\n const keyDown = useEvent((event: KeyboardEvent<HTMLDivElement>) => {\n //if the menu is already open, do noting\n if (!isOpenSelect && event.key === \"Enter\") {\n setIsOpenSelect(true);\n }\n });\n\n return (\n <VStack {...containerProps} spacing={2}>\n <FormControl>\n <FormLabel>{intl.formatMessage({ id: \"selectSource\" })}</FormLabel>\n <Select<SelectionOption>\n className=\"selection-source react-select\"\n {...COMMON_SELECT_PROPS}\n options={sourceOptions}\n placeholder={intl.formatMessage({ id: \"selectionPlaceholder\" })}\n value={currentSourceOption}\n onChange={onSourceOptionChanged}\n components={{\n Option: SourceSelectOption,\n SingleValue: SourceSelectValue\n }}\n isOptionDisabled={() => false} // allow to select disabled options; optical disabling is done in option\n // optionLabel is used by screenreaders\n getOptionLabel={(option) => {\n const label = option.label;\n const status = getSourceStatus(option.value, defaultNotAvailableMessage);\n if (status.kind == \"available\") return label;\n return label + \" \" + status.reason;\n }}\n ariaLiveMessages={{\n guidance: () => \"\",\n onChange: (props) => {\n if (\n props.action == \"select-option\" ||\n props.action == \"initial-input-focus\"\n )\n return props.label + \" \" + intl.formatMessage({ id: \"selected\" });\n else return \"\";\n },\n onFilter: () => \"\",\n onFocus: () => \"\"\n }}\n chakraStyles={chakraStyles}\n onKeyDown={keyDown}\n menuIsOpen={isOpenSelect}\n onMenuOpen={() => setIsOpenSelect(true)}\n onMenuClose={() => setIsOpenSelect(false)}\n />\n </FormControl>\n </VStack>\n );\n};\n\nfunction SourceSelectOption(props: OptionProps<SelectionOption>): JSX.Element {\n const { value } = props.data;\n const { isAvailable, content } = useSourceItem(value, false);\n\n return (\n <chakraComponents.Option\n {...props}\n isDisabled={!isAvailable}\n className=\"selection-source-option\"\n >\n {content}\n </chakraComponents.Option>\n );\n}\n\nfunction SourceSelectValue(props: SingleValueProps<SelectionOption>): JSX.Element {\n const { value } = props.data;\n const { isAvailable, content } = useSourceItem(value, true);\n const clazz = isAvailable\n ? \"selection-source-value\"\n : \"selection-source-value selection-source-value--disabled\";\n\n return (\n <chakraComponents.SingleValue {...props} isDisabled={!isAvailable} className={clazz}>\n {content}\n </chakraComponents.SingleValue>\n );\n}\n\nfunction useCurrentSelectionSource(\n sources: SelectionSource[],\n onSourceChanged: ((event: SelectionSourceChangedEvent) => void) | undefined\n): [SelectionSource | undefined, (source: SelectionSource | undefined) => void] {\n const [currentSource, setCurrentSource] = useState<SelectionSource | undefined>(\n () => sources[0]\n );\n\n // Reset to undefined if the current source is not in the list of sources\n useEffect(() => {\n if (currentSource && !sources.includes(currentSource)) {\n setCurrentSource(undefined);\n }\n }, [sources, currentSource]);\n\n // Track the current source and notify the parent component if it changes\n const prevSelectedSource = useRef<SelectionSource | undefined>(undefined);\n useEffect(() => {\n if (currentSource !== prevSelectedSource.current) {\n prevSelectedSource.current = currentSource;\n onSourceChanged?.({ source: currentSource });\n }\n }, [currentSource, onSourceChanged]);\n return [currentSource, setCurrentSource];\n}\n\n/**\n * Hook to manage source option in selection-source react-select\n */\nfunction useSourceItem(source: SelectionSource | undefined, isSelected: boolean) {\n const intl = useIntl();\n const label: string | undefined = source?.label;\n const defaultNotAvailableMessage = intl.formatMessage({ id: \"sourceNotAvailable\" });\n const status = useSourceStatus(source, defaultNotAvailableMessage);\n\n return {\n isAvailable: status.kind === \"available\",\n content: (\n <Flex direction=\"row\" alignItems=\"center\" grow={1}>\n {!isSelected && <Flex grow={1}>{label}</Flex>}\n {status.kind === \"unavailable\" && (\n <Box ml={2}>\n <Tooltip label={status.reason} placement=\"right\" openDelay={500}>\n <chakra.span>\n <Icon\n as={FiAlertTriangle}\n color=\"red\"\n className=\"warning-icon\"\n aria-label={status.reason}\n />\n </chakra.span>\n </Tooltip>\n </Box>\n )}\n {isSelected && label}\n </Flex>\n )\n };\n}\n\n/**\n * Hook to manage selection sources\n */\nfunction useSelectionController(\n mapModel: MapModel | undefined,\n sources: SelectionSource[],\n currentSource: SelectionSource | undefined,\n onSelectionComplete: ((event: SelectionCompleteEvent) => void) | undefined\n) {\n const notifier = useService<NotificationService>(\"notifier.NotificationService\");\n const intl = useIntl();\n const [controller, setController] = useState<SelectionController | undefined>(undefined);\n useEffect(() => {\n if (!mapModel) {\n return;\n }\n const controller = new SelectionController({\n mapModel,\n onError() {\n notifier.notify({\n level: \"error\",\n message: intl.formatMessage({ id: \"selectionFailed\" })\n });\n }\n });\n setController(controller);\n return () => {\n controller.destroy();\n };\n }, [mapModel, notifier, sources, intl]);\n\n const onExtentSelected = useEvent(async (geometry: Geometry) => {\n if (!controller || !currentSource) {\n return;\n }\n\n const selectionResult = await controller.select(currentSource, geometry.getExtent());\n if (!selectionResult) {\n return;\n }\n\n onSelectionComplete?.(selectionResult);\n });\n return {\n controller,\n onExtentSelected\n };\n}\n\ntype SimpleStatus =\n | {\n kind: \"available\";\n }\n | {\n kind: \"unavailable\";\n reason: string;\n };\n\nfunction getSourceStatus(source: SelectionSource, sourceNotAvailableReason: string): SimpleStatus {\n const rawCurrent = source.status ?? \"available\";\n const current: SelectionSourceStatusObject =\n typeof rawCurrent === \"string\" ? { kind: rawCurrent } : rawCurrent;\n if (current.kind === \"available\") {\n return current;\n }\n\n return {\n kind: \"unavailable\",\n reason: current.reason ?? sourceNotAvailableReason\n };\n}\n\n/**\n * Hook to manage source status\n */\nfunction useSourceStatus(\n source: SelectionSource | undefined,\n defaultNotAvailableMessage: string\n): SimpleStatus {\n const [status, setStatus] = useState<SimpleStatus>(() => ({\n kind: \"unavailable\",\n reason: defaultNotAvailableMessage\n }));\n useEffect(() => {\n if (!source) {\n setStatus({ kind: \"unavailable\", reason: defaultNotAvailableMessage });\n return;\n }\n setStatus(getSourceStatus(source, defaultNotAvailableMessage));\n const resource = source.on?.(\"changed:status\", () => {\n setStatus(getSourceStatus(source, defaultNotAvailableMessage));\n });\n return () => resource?.destroy();\n }, [source, defaultNotAvailableMessage]);\n return status;\n}\n\n/**\n * Hook to manage map controls and tooltip\n */\nfunction useDragSelection(\n map: MapModel | undefined,\n intl: PackageIntl,\n onExtentSelected: (geometry: Geometry) => void,\n isActive: boolean,\n hasSelectedSource: boolean\n) {\n useEffect(() => {\n if (!map) {\n return;\n }\n\n const disabledMessage = hasSelectedSource\n ? intl.formatMessage({ id: \"disabledTooltip\" })\n : intl.formatMessage({ id: \"noSourceTooltip\" });\n\n const dragController = new DragController(\n map.olMap,\n intl.formatMessage({ id: \"tooltip\" }),\n disabledMessage,\n onExtentSelected\n );\n\n dragController.setActive(isActive);\n return () => {\n dragController?.destroy();\n };\n }, [map, intl, onExtentSelected, isActive, hasSelectedSource]);\n}\n\n/**\n * Customizes components styles within the select component.\n */\nfunction useChakraStyles() {\n const [dropDownBackground, borderColor] = useToken(\n \"colors\",\n [\"background_body\", \"border\"],\n [\"#ffffff\", \"#ffffff\"]\n );\n return useMemo(() => {\n const chakraStyles: ChakraStylesConfig<\n SelectionOption,\n false,\n GroupBase<SelectionOption>\n > = {\n control: (styles) => ({ ...styles, cursor: \"pointer\" }),\n indicatorSeparator: (styles) => ({\n ...styles,\n borderColor: borderColor\n }),\n dropdownIndicator: (provided) => ({\n ...provided,\n backgroundColor: dropDownBackground\n })\n };\n return chakraStyles;\n }, [dropDownBackground, borderColor]);\n}\n"],"names":["props","controller"],"mappings":"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"}
|
package/i18n/de.yaml
CHANGED
|
@@ -7,7 +7,9 @@ messages:
|
|
|
7
7
|
selectSource: "Quelle auswählen"
|
|
8
8
|
tooltip: "Klicken Sie in die Karte, halten Sie die Maustaste gedrückt und ziehen Sie ein Rechteck auf"
|
|
9
9
|
disabledTooltip: "Die aktuelle Selektionsquelle ist nicht verfügbar."
|
|
10
|
+
noSourceTooltip: "Es ist keine Selektionsquelle ausgewählt. Zum Starten bitte Selektionsquelle auswählen."
|
|
10
11
|
sourceNotAvailable: "Quelle nicht verfügbar"
|
|
11
12
|
selectionFailed: "Die räumliche Auswahl ist fehlgeschlagen"
|
|
12
13
|
selectionPlaceholder: "Keine Quelle ausgewählt"
|
|
13
14
|
layerNotVisibleReason: "Zugehöriger Layer ist nicht sichtbar."
|
|
15
|
+
selected: "selektiert"
|
package/i18n/en.yaml
CHANGED
|
@@ -7,7 +7,9 @@ messages:
|
|
|
7
7
|
selectSource: "Select source"
|
|
8
8
|
tooltip: "Click on the map, hold down the mouse button and draw a rectangle"
|
|
9
9
|
disabledTooltip: "The current selection source is not available"
|
|
10
|
+
noSourceTooltip: "No selection source selected. Please choose a selection source to start."
|
|
10
11
|
sourceNotAvailable: "Source not available"
|
|
11
12
|
selectionFailed: "Spatial selection failed"
|
|
12
13
|
selectionPlaceholder: "No source selected"
|
|
13
14
|
layerNotVisibleReason: "Matching layer is not visible."
|
|
15
|
+
selected: "selected"
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"type": "module",
|
|
3
3
|
"name": "@open-pioneer/selection",
|
|
4
|
-
"version": "0.2.
|
|
4
|
+
"version": "0.2.4",
|
|
5
5
|
"description": "This package provides a UI component to perform a selection on given selection sources from the map.",
|
|
6
6
|
"keywords": [
|
|
7
7
|
"open-pioneer-trails"
|
|
@@ -19,16 +19,16 @@
|
|
|
19
19
|
},
|
|
20
20
|
"peerDependencies": {
|
|
21
21
|
"@chakra-ui/icons": "^2.1.1",
|
|
22
|
-
"@open-pioneer/chakra-integration": "^1.1.
|
|
23
|
-
"@open-pioneer/core": "^1.
|
|
24
|
-
"@open-pioneer/notifier": "^0.3.
|
|
25
|
-
"@open-pioneer/react-utils": "^1.0.
|
|
26
|
-
"@open-pioneer/runtime": "^2.1.
|
|
22
|
+
"@open-pioneer/chakra-integration": "^1.1.4",
|
|
23
|
+
"@open-pioneer/core": "^1.3.0",
|
|
24
|
+
"@open-pioneer/notifier": "^0.3.6",
|
|
25
|
+
"@open-pioneer/react-utils": "^1.0.1",
|
|
26
|
+
"@open-pioneer/runtime": "^2.1.7",
|
|
27
27
|
"chakra-react-select": "^4.7.6",
|
|
28
28
|
"ol": "^9.2.4",
|
|
29
29
|
"react": "^18.3.1",
|
|
30
30
|
"react-icons": "^5.2.1",
|
|
31
|
-
"@open-pioneer/map": "^0.6.
|
|
31
|
+
"@open-pioneer/map": "^0.6.1"
|
|
32
32
|
},
|
|
33
33
|
"exports": {
|
|
34
34
|
"./package.json": "./package.json",
|