@open-pioneer/selection 0.1.0 → 0.2.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 +32 -0
- package/DragController.js +1 -1
- package/DragController.js.map +1 -1
- package/Selection.js.map +1 -1
- package/api.d.ts +1 -1
- package/i18n/de.yaml +1 -1
- package/i18n/en.yaml +1 -1
- package/package.json +20 -7
- package/selectionSources.js +6 -2
- package/selectionSources.js.map +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,37 @@
|
|
|
1
1
|
# @open-pioneer/selection
|
|
2
2
|
|
|
3
|
+
## 0.2.0
|
|
4
|
+
|
|
5
|
+
### Minor Changes
|
|
6
|
+
|
|
7
|
+
- 9334e81: Update to OpenLayers 9
|
|
8
|
+
|
|
9
|
+
### Patch Changes
|
|
10
|
+
|
|
11
|
+
- 13ea342: `VectorLayerSelectionSource`: Use a UUID as a fallback if a found feature has no id.
|
|
12
|
+
- 1a8ad89: Update package.json metadata
|
|
13
|
+
- 13ea342: Fix import of internal module of another package.
|
|
14
|
+
- a0d8882: hide help texts during map export
|
|
15
|
+
- 6162979: Update versions of core packages
|
|
16
|
+
- Updated dependencies [1a8ad89]
|
|
17
|
+
- Updated dependencies [a11bf72]
|
|
18
|
+
- Updated dependencies [fc6bf82]
|
|
19
|
+
- Updated dependencies [a0d8882]
|
|
20
|
+
- Updated dependencies [6162979]
|
|
21
|
+
- Updated dependencies [9334e81]
|
|
22
|
+
- Updated dependencies [ac7fdd1]
|
|
23
|
+
- Updated dependencies [13ea342]
|
|
24
|
+
- @open-pioneer/react-utils@0.2.2
|
|
25
|
+
- @open-pioneer/map@0.4.0
|
|
26
|
+
|
|
27
|
+
## 0.1.1
|
|
28
|
+
|
|
29
|
+
### Patch Changes
|
|
30
|
+
|
|
31
|
+
- 611ddb9: Export interface `BaseFeature` from Map API and use it correctly in base packages `selection` and `search`.
|
|
32
|
+
- Updated dependencies [611ddb9]
|
|
33
|
+
- @open-pioneer/map@0.3.1
|
|
34
|
+
|
|
3
35
|
## 0.1.0
|
|
4
36
|
|
|
5
37
|
### Minor Changes
|
package/DragController.js
CHANGED
|
@@ -130,7 +130,7 @@ class DragController {
|
|
|
130
130
|
*/
|
|
131
131
|
createHelpTooltip(olMap, message) {
|
|
132
132
|
const element = document.createElement("div");
|
|
133
|
-
element.className = "selection-tooltip";
|
|
133
|
+
element.className = "selection-tooltip printing-hide";
|
|
134
134
|
element.textContent = message;
|
|
135
135
|
const overlay = new Overlay({
|
|
136
136
|
element,
|
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/resources\";\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}\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.element.textContent = 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.element.textContent = 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) {\n const element = document.createElement(\"div\");\n element.className = \"selection-tooltip\";\n element.textContent = message;\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 };\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/resources\";\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}\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.element.textContent = 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.element.textContent = 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) {\n const element = document.createElement(\"div\");\n element.className = \"selection-tooltip printing-hide\";\n element.textContent = message;\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 };\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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"}
|
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/i18n\";\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\";\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\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\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 />\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 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\";\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\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\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 />\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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"}
|
package/api.d.ts
CHANGED
|
@@ -2,7 +2,7 @@ import type { Geometry } from "ol/geom";
|
|
|
2
2
|
import type { Projection } from "ol/proj";
|
|
3
3
|
import type { Extent } from "ol/extent";
|
|
4
4
|
import type { EventSource, Resource } from "@open-pioneer/core";
|
|
5
|
-
import { BaseFeature } from "@open-pioneer/map
|
|
5
|
+
import { BaseFeature } from "@open-pioneer/map";
|
|
6
6
|
import { DeclaredService } from "@open-pioneer/runtime";
|
|
7
7
|
import VectorLayer from "ol/layer/Vector";
|
|
8
8
|
import VectorSource from "ol/source/Vector";
|
package/i18n/de.yaml
CHANGED
|
@@ -6,7 +6,7 @@ messages:
|
|
|
6
6
|
CIRCLE: "Kreis"
|
|
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
|
-
disabledTooltip: "Die aktuelle
|
|
9
|
+
disabledTooltip: "Die aktuelle Selektionsquelle ist nicht verfügbar."
|
|
10
10
|
sourceNotAvailable: "Quelle nicht verfügbar"
|
|
11
11
|
selectionFailed: "Die räumliche Auswahl ist fehlgeschlagen"
|
|
12
12
|
selectionPlaceholder: "Keine Quelle ausgewählt"
|
package/i18n/en.yaml
CHANGED
|
@@ -6,7 +6,7 @@ messages:
|
|
|
6
6
|
CIRCLE: "Kreis"
|
|
7
7
|
selectSource: "Select source"
|
|
8
8
|
tooltip: "Click on the map, hold down the mouse button and draw a rectangle"
|
|
9
|
-
disabledTooltip: "The current
|
|
9
|
+
disabledTooltip: "The current selection source is not available"
|
|
10
10
|
sourceNotAvailable: "Source not available"
|
|
11
11
|
selectionFailed: "Spatial selection failed"
|
|
12
12
|
selectionPlaceholder: "No source selected"
|
package/package.json
CHANGED
|
@@ -1,21 +1,34 @@
|
|
|
1
1
|
{
|
|
2
2
|
"type": "module",
|
|
3
3
|
"name": "@open-pioneer/selection",
|
|
4
|
-
"version": "0.
|
|
4
|
+
"version": "0.2.0",
|
|
5
|
+
"description": "This package provides a UI component to perform a selection on given selection sources from the map.",
|
|
6
|
+
"keywords": [
|
|
7
|
+
"open-pioneer-trails"
|
|
8
|
+
],
|
|
9
|
+
"homepage": "https://github.com/open-pioneer",
|
|
5
10
|
"license": "Apache-2.0",
|
|
11
|
+
"repository": {
|
|
12
|
+
"type": "git",
|
|
13
|
+
"url": "https://github.com/open-pioneer/trails-openlayers-base-packages",
|
|
14
|
+
"directory": "src/packages/selection"
|
|
15
|
+
},
|
|
16
|
+
"dependencies": {
|
|
17
|
+
"uuid": "^9.0.1",
|
|
18
|
+
"classnames": "^2.3.2"
|
|
19
|
+
},
|
|
6
20
|
"peerDependencies": {
|
|
7
21
|
"@open-pioneer/chakra-integration": "^1.1.1",
|
|
8
|
-
"@open-pioneer/runtime": "^2.1.
|
|
22
|
+
"@open-pioneer/runtime": "^2.1.2",
|
|
9
23
|
"@open-pioneer/core": "^1.2.1",
|
|
10
|
-
"
|
|
24
|
+
"@open-pioneer/notifier": "^0.3.1",
|
|
25
|
+
"ol": "^9.0.0",
|
|
11
26
|
"react": "^18.2.0",
|
|
12
|
-
"classnames": "^2.3.2",
|
|
13
27
|
"chakra-react-select": "^4.7.6",
|
|
14
28
|
"@chakra-ui/icons": "^2.1.1",
|
|
15
29
|
"react-icons": "^4.12.0",
|
|
16
|
-
"@open-pioneer/map": "^0.
|
|
17
|
-
"@open-pioneer/
|
|
18
|
-
"@open-pioneer/react-utils": "^0.2.1"
|
|
30
|
+
"@open-pioneer/map": "^0.4.0",
|
|
31
|
+
"@open-pioneer/react-utils": "^0.2.2"
|
|
19
32
|
},
|
|
20
33
|
"exports": {
|
|
21
34
|
"./package.json": "./package.json",
|
package/selectionSources.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { Point } from 'ol/geom';
|
|
2
2
|
import { EventEmitter } from '@open-pioneer/core';
|
|
3
3
|
import { unByKey } from 'ol/Observable';
|
|
4
|
+
import { v4 } from 'uuid';
|
|
4
5
|
|
|
5
6
|
[
|
|
6
7
|
new Point([407354, 5754673]),
|
|
@@ -40,9 +41,12 @@ class VectorLayerSelectionSourceImpl extends EventEmitter {
|
|
|
40
41
|
this.#vectorLayer.getSource().forEachFeatureIntersectingExtent(selectionKind.extent, (feature) => {
|
|
41
42
|
if (!feature.getGeometry())
|
|
42
43
|
return;
|
|
44
|
+
const filteredProperties = { ...feature.getProperties() };
|
|
45
|
+
delete filteredProperties.geometries;
|
|
43
46
|
const result = {
|
|
44
|
-
id: feature.getId()?.toString() ||
|
|
45
|
-
geometry: feature.getGeometry()
|
|
47
|
+
id: feature.getId()?.toString() || v4(),
|
|
48
|
+
geometry: feature.getGeometry(),
|
|
49
|
+
properties: filteredProperties
|
|
46
50
|
};
|
|
47
51
|
allResults.push(result);
|
|
48
52
|
});
|
package/selectionSources.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"selectionSources.js","sources":["selectionSources.ts"],"sourcesContent":["// SPDX-FileCopyrightText: 2023 Open Pioneer project (https://github.com/open-pioneer)\n// SPDX-License-Identifier: Apache-2.0\nimport {\n SelectionSource,\n SelectionResult,\n SelectionOptions,\n SelectionSourceStatus,\n SelectionSourceEvents,\n SelectionKind,\n VectorLayerSelectionSource\n} from \"./api\";\nimport { Point } from \"ol/geom\";\nimport { EventEmitter } from \"@open-pioneer/core\";\nimport VectorSource from \"ol/source/Vector\";\nimport VectorLayer from \"ol/layer/Vector\";\nimport { EventsKey } from \"ol/events\";\nimport { unByKey } from \"ol/Observable\";\n\nexport const fakeSelectedPointFeatures = [\n new Point([407354, 5754673]), // con terra (Bottom Right)\n new Point([404740, 5757893]) // Schloss (Top Left)\n];\n\nlet count = 0;\n\nexport class FakePointSelectionSource\n extends EventEmitter<SelectionSourceEvents>\n implements SelectionSource\n{\n readonly label = `Fake Selection Source #${++count}`;\n #timeout: number;\n #status: SelectionSourceStatus;\n #pointFeatures: Point[];\n\n constructor(\n timeout?: number,\n status?: SelectionSourceStatus,\n pointFeatures: Point[] = fakeSelectedPointFeatures\n ) {\n super();\n this.#timeout = timeout || 0;\n this.#status = status || \"unavailable\";\n this.#pointFeatures = pointFeatures;\n }\n\n get status(): SelectionSourceStatus {\n return this.#status;\n }\n\n set status(value: SelectionSourceStatus) {\n if (value !== this.#status) {\n this.#status = value;\n this.emit(\"changed:status\");\n }\n }\n\n async select(\n selectionKind: SelectionKind,\n options: SelectionOptions\n ): Promise<SelectionResult[]> {\n if (selectionKind.type !== \"extent\") {\n throw new Error(`Unsupported selection kind: ${selectionKind.type}`);\n }\n\n if (this.#status !== \"available\") return [];\n\n await new Promise((resolve) => setTimeout(resolve, this.#timeout));\n\n const allPoints = this.#pointFeatures.map((point, index) => {\n const result: SelectionResult = {\n id: index,\n geometry: point\n };\n if (!point.intersectsExtent(selectionKind.extent)) {\n return undefined;\n }\n return result;\n });\n\n const selectedPoints = allPoints.filter((s): s is SelectionResult => s != null);\n const limitedResults =\n selectedPoints.length > options.maxResults\n ? selectedPoints.slice(0, options.maxResults)\n : selectedPoints;\n return limitedResults;\n }\n}\n\n/**\n * A SelectionSource to use an OpenLayers VectorLayer with an OpenLayers VectorSource (e.g. layer of the map).\n * Features are:\n * - using only the extent as selection kind\n * - listening to layer visibility changes and updating the status of the source\n * - limiting the number of returned selection results to the corresponding selection option\n * - throwing an event `changed:status` when the status updates\n */\nexport class VectorLayerSelectionSourceImpl\n extends EventEmitter<SelectionSourceEvents>\n implements VectorLayerSelectionSource\n{\n readonly label: string;\n #status: Exclude<SelectionSourceStatus, string> = { kind: \"available\" };\n #vectorLayer: VectorLayer<VectorSource>;\n #eventHandler: EventsKey;\n #layerNotVisibleReason: string;\n\n constructor(\n vectorLayer: VectorLayer<VectorSource>,\n label: string,\n layerNotVisibleReason: string\n ) {\n super();\n this.label = label;\n this.#vectorLayer = vectorLayer;\n this.#layerNotVisibleReason = layerNotVisibleReason;\n this.#updateStatus();\n this.#eventHandler = this.#vectorLayer.on(\"change:visible\", () => {\n this.#updateStatus();\n });\n }\n\n destroy() {\n unByKey(this.#eventHandler);\n }\n\n get status() {\n return this.#status;\n }\n\n async select(\n selectionKind: SelectionKind,\n options: SelectionOptions\n ): Promise<SelectionResult[]> {\n if (selectionKind.type !== \"extent\") {\n throw new Error(`Unsupported selection kind: ${selectionKind.type}`);\n }\n\n if (this.#status.kind !== \"available\" || this.#vectorLayer.getSource() === null) return [];\n\n const allResults: SelectionResult[] = [];\n this.#vectorLayer\n .getSource()!\n .forEachFeatureIntersectingExtent(selectionKind.extent, (feature) => {\n if (!feature.getGeometry()) return;\n const result: SelectionResult = {\n id: feature.getId()?.toString() ||
|
|
1
|
+
{"version":3,"file":"selectionSources.js","sources":["selectionSources.ts"],"sourcesContent":["// SPDX-FileCopyrightText: 2023 Open Pioneer project (https://github.com/open-pioneer)\n// SPDX-License-Identifier: Apache-2.0\nimport {\n SelectionSource,\n SelectionResult,\n SelectionOptions,\n SelectionSourceStatus,\n SelectionSourceEvents,\n SelectionKind,\n VectorLayerSelectionSource\n} from \"./api\";\nimport { Point } from \"ol/geom\";\nimport { EventEmitter } from \"@open-pioneer/core\";\nimport VectorSource from \"ol/source/Vector\";\nimport VectorLayer from \"ol/layer/Vector\";\nimport { EventsKey } from \"ol/events\";\nimport { unByKey } from \"ol/Observable\";\nimport { v4 as uuid4v } from \"uuid\";\n\nexport const fakeSelectedPointFeatures = [\n new Point([407354, 5754673]), // con terra (Bottom Right)\n new Point([404740, 5757893]) // Schloss (Top Left)\n];\n\nlet count = 0;\n\nexport class FakePointSelectionSource\n extends EventEmitter<SelectionSourceEvents>\n implements SelectionSource\n{\n readonly label = `Fake Selection Source #${++count}`;\n #timeout: number;\n #status: SelectionSourceStatus;\n #pointFeatures: Point[];\n\n constructor(\n timeout?: number,\n status?: SelectionSourceStatus,\n pointFeatures: Point[] = fakeSelectedPointFeatures\n ) {\n super();\n this.#timeout = timeout || 0;\n this.#status = status || \"unavailable\";\n this.#pointFeatures = pointFeatures;\n }\n\n get status(): SelectionSourceStatus {\n return this.#status;\n }\n\n set status(value: SelectionSourceStatus) {\n if (value !== this.#status) {\n this.#status = value;\n this.emit(\"changed:status\");\n }\n }\n\n async select(\n selectionKind: SelectionKind,\n options: SelectionOptions\n ): Promise<SelectionResult[]> {\n if (selectionKind.type !== \"extent\") {\n throw new Error(`Unsupported selection kind: ${selectionKind.type}`);\n }\n\n if (this.#status !== \"available\") return [];\n\n await new Promise((resolve) => setTimeout(resolve, this.#timeout));\n\n const allPoints = this.#pointFeatures.map((point, index) => {\n const result: SelectionResult = {\n id: index,\n geometry: point\n };\n if (!point.intersectsExtent(selectionKind.extent)) {\n return undefined;\n }\n return result;\n });\n\n const selectedPoints = allPoints.filter((s): s is SelectionResult => s != null);\n const limitedResults =\n selectedPoints.length > options.maxResults\n ? selectedPoints.slice(0, options.maxResults)\n : selectedPoints;\n return limitedResults;\n }\n}\n\n/**\n * A SelectionSource to use an OpenLayers VectorLayer with an OpenLayers VectorSource (e.g. layer of the map).\n * Features are:\n * - using only the extent as selection kind\n * - listening to layer visibility changes and updating the status of the source\n * - limiting the number of returned selection results to the corresponding selection option\n * - throwing an event `changed:status` when the status updates\n */\nexport class VectorLayerSelectionSourceImpl\n extends EventEmitter<SelectionSourceEvents>\n implements VectorLayerSelectionSource\n{\n readonly label: string;\n #status: Exclude<SelectionSourceStatus, string> = { kind: \"available\" };\n #vectorLayer: VectorLayer<VectorSource>;\n #eventHandler: EventsKey;\n #layerNotVisibleReason: string;\n\n constructor(\n vectorLayer: VectorLayer<VectorSource>,\n label: string,\n layerNotVisibleReason: string\n ) {\n super();\n this.label = label;\n this.#vectorLayer = vectorLayer;\n this.#layerNotVisibleReason = layerNotVisibleReason;\n this.#updateStatus();\n this.#eventHandler = this.#vectorLayer.on(\"change:visible\", () => {\n this.#updateStatus();\n });\n }\n\n destroy() {\n unByKey(this.#eventHandler);\n }\n\n get status() {\n return this.#status;\n }\n\n async select(\n selectionKind: SelectionKind,\n options: SelectionOptions\n ): Promise<SelectionResult[]> {\n if (selectionKind.type !== \"extent\") {\n throw new Error(`Unsupported selection kind: ${selectionKind.type}`);\n }\n\n if (this.#status.kind !== \"available\" || this.#vectorLayer.getSource() === null) return [];\n\n const allResults: SelectionResult[] = [];\n this.#vectorLayer\n .getSource()!\n .forEachFeatureIntersectingExtent(selectionKind.extent, (feature) => {\n if (!feature.getGeometry()) return;\n\n // TODO: Think about where to implement Date-Formatting, if the dates are already\n // encoded as Strings...\n\n const filteredProperties = { ...feature.getProperties() };\n delete filteredProperties.geometries;\n\n const result: SelectionResult = {\n id: feature.getId()?.toString() || uuid4v(),\n geometry: feature.getGeometry()!,\n properties: filteredProperties\n };\n\n allResults.push(result);\n });\n const selectedFeatures = allResults.filter((s): s is SelectionResult => s != null);\n const limitedFeatures =\n selectedFeatures.length > options.maxResults\n ? selectedFeatures.slice(0, options.maxResults)\n : selectedFeatures;\n return limitedFeatures;\n }\n\n #updateStatus() {\n const layerIsVisible = this.#vectorLayer.getVisible();\n const newStatus: SelectionSourceStatus = layerIsVisible\n ? { kind: \"available\" }\n : { kind: \"unavailable\", reason: this.#layerNotVisibleReason };\n if (newStatus.kind !== this.#status.kind) {\n this.#status = newStatus;\n this.emit(\"changed:status\");\n }\n }\n}\n\n/**\n * For testing purposes only\n */\nexport class NoStatusSelectionSource\n extends EventEmitter<SelectionSourceEvents>\n implements SelectionSource\n{\n readonly label: string = \"Testlabel\";\n\n async select(_: SelectionKind, __: SelectionOptions): Promise<SelectionResult[]> {\n const allPoints = fakeSelectedPointFeatures.map((point, index) => {\n const result: SelectionResult = {\n id: index,\n geometry: point\n };\n return result;\n });\n return allPoints;\n }\n}\n"],"names":["uuid4v"],"mappings":"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"}
|