From 75c3c6d928019483258fae78241bec8485d08cce Mon Sep 17 00:00:00 2001 From: Hendrik Oenings Date: Fri, 7 Aug 2026 17:44:54 +0200 Subject: [PATCH] feat(core)!: rework markers for cluster usage The current implementation used `selectedBaseFeature` to keep track of which feature to select when zooming in and out. This did not work properly, and is not intuitive either. Therefore, we split the (meant) hovered or selected feature and its (rendered) hovered or selected cluster. If the layer does not use clustering, cluster and feature are equivalent. This has the additional advantage that `isSelectable` does no longer consider the cluster, but an actual feature, such that the implementation is automatically cluster-agnostical now. This allows the GFI plugin to adapt this new API. When `bindWithCoreHoverSelect` is used now, the synchronization with the markers is now truly bi-directional and wrapped in a single, easy-to-understand composable. To allow the synchronization from the details view back to the marker store, the selected feature is moved to the GFI main store as a shared state between list view and details view. One could possibly split these changes into two or three (still atomical) commits. However, the changes only make sense in the context of this refactoring idea, and are therefore combined to one commit on purpose. --- examples/generic/index.js | 10 +- .../github-io/components/HeroPolarMap.vue | 9 +- examples/snowbox/index.js | 10 +- src/core/components/PolarContainer.ce.vue | 6 +- src/core/components/PolarMap.ce.vue | 5 +- src/core/composables/useClusterMarker.ts | 71 ++++ src/core/stores/index.ts | 64 ++- src/core/stores/marker.ts | 271 +++++++++++-- src/core/types/marker.ts | 26 -- src/core/utils/map/resolveClusterClick.ts | 17 + src/core/utils/map/setupMarkers.ts | 369 ------------------ src/plugins/gfi/components/GfiFeature.ce.vue | 22 +- .../gfi/components/GfiFeatureList.ce.vue | 16 +- .../composables/useBindWithCoreHoverSelect.ts | 143 ++++--- .../gfi/composables/useSelectedFeatures.ts | 125 +++++- src/plugins/gfi/store.ts | 32 +- src/plugins/gfi/stores/feature.ts | 69 ++-- src/plugins/gfi/stores/list.ts | 77 ++-- src/plugins/gfi/stores/main.ts | 11 +- 19 files changed, 708 insertions(+), 645 deletions(-) create mode 100644 src/core/composables/useClusterMarker.ts create mode 100644 src/core/utils/map/resolveClusterClick.ts delete mode 100644 src/core/utils/map/setupMarkers.ts diff --git a/examples/generic/index.js b/examples/generic/index.js index cb3edfba1d..74060a739a 100644 --- a/examples/generic/index.js +++ b/examples/generic/index.js @@ -11,15 +11,7 @@ let colorScheme = 'light' // arbitrary condition for testing const isEvenId = (mmlid) => Number(mmlid.slice(-1)) % 2 === 0 - -// NOTE: This function is only usable if the layer is clustered -const isReportSelectable = (feature) => - feature - .get('features') - .reduce( - (accumulator, current) => isEvenId(current.get('mmlid')) || accumulator, - false - ) +const isReportSelectable = (feature) => isEvenId(feature.get('mmlid')) const map = await createMap( 'polarstern', diff --git a/examples/github-io/components/HeroPolarMap.vue b/examples/github-io/components/HeroPolarMap.vue index 7ee52c1526..2a0067a995 100644 --- a/examples/github-io/components/HeroPolarMap.vue +++ b/examples/github-io/components/HeroPolarMap.vue @@ -7,7 +7,6 @@ diff --git a/src/plugins/gfi/composables/useBindWithCoreHoverSelect.ts b/src/plugins/gfi/composables/useBindWithCoreHoverSelect.ts index cc0973d220..c2e0883837 100644 --- a/src/plugins/gfi/composables/useBindWithCoreHoverSelect.ts +++ b/src/plugins/gfi/composables/useBindWithCoreHoverSelect.ts @@ -1,108 +1,103 @@ import type { Feature } from 'ol' import type { ShallowRef } from 'vue' -import ClusterSource from 'ol/source/Cluster' import { markRaw, watch } from 'vue' -import { useCoreStore } from '@/core/stores' -import getCluster from '@/lib/getCluster' - import { useGfiMainStore } from '../stores/main' import { filterSelectableFeatures } from '../utils/filterSelectableFeatures' type CoreFeature = Feature | null -type GfiFeature = Record - -function assignCoreToGfi(target: ShallowRef, feature: CoreFeature) { +type CoreFeatures = Feature[] +type GfiFeature = { layerId: string; feature: Feature } | null +type GfiFeatures = Partial> + +function assignCoreToGfiCluster( + target: ShallowRef, + features: CoreFeatures, + referenceOrder?: CoreFeatures +) { const gfiMainStore = useGfiMainStore() - - if (feature === null) { - target.value = markRaw({}) - return + const layerId = features[0]?.get('_polarLayerId') + const layerConfiguration = gfiMainStore.getLayerConfiguration(layerId) + + if (referenceOrder) { + features.sort((a, b) => { + const getIndex = (feature) => referenceOrder.indexOf(feature) + return getIndex(a) - getIndex(b) + }) } - const layerId = feature.get('_polarLayerId') - const newFeatures = filterSelectableFeatures( - feature.get('features') || [feature], - gfiMainStore.getLayerConfiguration(layerId)?.isSelectable + target.value = markRaw( + Object.groupBy( + filterSelectableFeatures(features, layerConfiguration?.isSelectable), + (feature) => feature.get('_polarLayerId') + ) ) - target.value = markRaw({ - ...(newFeatures.length ? { [layerId]: markRaw(newFeatures) } : {}), - }) } -function assignGfiToCore( +function assignGfiToCoreFeature( target: ShallowRef, - featureMap: GfiFeature + feature: GfiFeature ) { - const coreStore = useCoreStore() - - const features = Object.entries(featureMap).flatMap(([layerId, features]) => - features.map((feature) => ({ layerId, feature })) - ) - - // The second condition is necessary for TypeScript checks. - if (features.length <= 0 || !features[0]) { + if (!feature) { target.value = null return } + target.value = markRaw(feature.feature) +} - const targetFeature = target.value - const targetLayerId = targetFeature?.get('_polarLayerId') - const targetClusterFeatures = - targetFeature?.get('features') || (targetFeature ? [targetFeature] : []) - if ( - targetLayerId === features[0].layerId && - targetClusterFeatures.length === features.length && - features.every(({ feature }) => targetClusterFeatures.includes(feature)) - ) { +function assignCoreToGfiFeature( + target: ShallowRef, + feature: CoreFeature +) { + if (!feature) { + target.value = null return } - - const { feature, layerId } = features[0] - feature.set('_polarLayerId', layerId, true) - target.value = markRaw( - coreStore.getLayer(layerId)?.getSource() instanceof ClusterSource - ? getCluster(coreStore.map, feature, '_polarLayerId') - : feature - ) + target.value = markRaw({ + layerId: feature.get('_polarLayerId'), + feature, + }) } -export function useBindWithCoreHoverSelect( - hoveredFeatures: ShallowRef>, - selectedFeatures: ShallowRef>, - coreHoveredFeature: ShallowRef, - coreSelectedFeature: ShallowRef +function bindWithWatcher( + target: ShallowRef, + source: ShallowRef, + handler: (target: ShallowRef, source: S, extra?: E) => void, + extra?: ShallowRef ) { watch( - coreHoveredFeature, - (feature) => { - assignCoreToGfi(hoveredFeatures, feature) - }, - { immediate: true } - ) - - watch( - coreSelectedFeature, - (feature) => { - assignCoreToGfi(selectedFeatures, feature) + source, + (value) => { + handler(target, value, extra?.value) }, - { immediate: true } + { + immediate: true, + } ) +} - watch( - hoveredFeatures, - (featureMap) => { - assignGfiToCore(coreHoveredFeature, featureMap) - }, - { immediate: true } - ) +export function useBindWithCoreHoverSelect( + hoveredFeature: ShallowRef, + coreHoveredFeature: ShallowRef, + hoveredFeatures: ShallowRef, + coreHoveredFeatures: ShallowRef, + selectedFeature: ShallowRef, + coreSelectedFeature: ShallowRef, + selectedFeatures: ShallowRef, + coreSelectedFeatures: ShallowRef, + referenceOrder: ShallowRef +) { + bindWithWatcher(hoveredFeature, coreHoveredFeature, assignCoreToGfiFeature) + bindWithWatcher(coreHoveredFeature, hoveredFeature, assignGfiToCoreFeature) + bindWithWatcher(hoveredFeatures, coreHoveredFeatures, assignCoreToGfiCluster) - watch( + bindWithWatcher(selectedFeature, coreSelectedFeature, assignCoreToGfiFeature) + bindWithWatcher(coreSelectedFeature, selectedFeature, assignGfiToCoreFeature) + bindWithWatcher( selectedFeatures, - (featureMap) => { - assignGfiToCore(coreSelectedFeature, featureMap) - }, - { immediate: true } + coreSelectedFeatures, + assignCoreToGfiCluster, + referenceOrder ) } diff --git a/src/plugins/gfi/composables/useSelectedFeatures.ts b/src/plugins/gfi/composables/useSelectedFeatures.ts index 66422da7ec..59976baa6b 100644 --- a/src/plugins/gfi/composables/useSelectedFeatures.ts +++ b/src/plugins/gfi/composables/useSelectedFeatures.ts @@ -1,28 +1,115 @@ import type { Feature as GeoJsonFeature } from 'geojson' -import type { Feature } from 'ol' +import type { Feature as OlFeature } from 'ol' +import { isEqual, mapValues } from 'es-toolkit' import { GeoJSON } from 'ol/format' -import { computed, ref, shallowRef } from 'vue' +import { computed, shallowRef } from 'vue' +interface Feature { + geojsonFeature: GeoJsonFeature + olFeature?: OlFeature +} + +/** + * The GFI plugin may be used either with a vector layer or using GFI requests. + * If a vector layer is used, we have OpenLayers features that are converted to GeoJSON features. + * Otherwise, the response are just GeoJSON features. + * + * This composable considers this and allows for both scenarios: + * For vector layers, both features are updated. + * For GFI requests, only the GeoJSON features are used. + */ export function useSelectedFeatures() { - const selectedFeatures = shallowRef>({}) - const featureInformation = ref>({}) + const features = shallowRef>({}) + const feature = shallowRef<(Feature & { layerId: string }) | null>(null) + + const olFeatures = computed>({ + get: () => + mapValues(features.value, (list) => + list + .filter( + (feature): feature is Feature & { olFeature: Feature } => + 'olFeature' in feature + ) + .map(({ olFeature }) => olFeature) + ), + set: (value) => { + features.value = mapValues(value, (list) => + list.map((olFeature) => ({ + olFeature, + geojsonFeature: new GeoJSON().writeFeatureObject(olFeature), + })) + ) + }, + }) + + const geojsonFeatures = computed>({ + get: () => + mapValues(features.value, (list) => + list.map(({ geojsonFeature }) => geojsonFeature) + ), + set: (value) => { + features.value = mapValues(value, (list) => + list.map((geojsonFeature) => ({ geojsonFeature })) + ) + }, + }) + + const olFeature = computed<{ + layerId: string + feature: OlFeature + } | null>({ + get: () => + feature.value?.olFeature + ? { + layerId: feature.value.layerId, + feature: feature.value.olFeature, + } + : null, + set: (value) => { + if (value === null) { + feature.value = null + return + } + const layerId = value.layerId + feature.value = { + layerId, + olFeature: value.feature, + geojsonFeature: new GeoJSON().writeFeatureObject(value.feature), + } + }, + }) + + const geojsonFeature = computed<{ + layerId: string + feature: GeoJsonFeature + } | null>({ + get: () => + feature.value + ? { + layerId: feature.value.layerId, + feature: feature.value.geojsonFeature, + } + : null, + set: (value) => { + if (value === null) { + feature.value = null + return + } + const layerId = value.layerId + const item = features.value[layerId]?.find(({ geojsonFeature }) => + isEqual(geojsonFeature, value.feature) + ) + feature.value = item + ? { ...item, layerId } + : { layerId, geojsonFeature: value.feature } + }, + }) return { - selectedFeatures: computed({ - get: () => selectedFeatures.value, - set: (value) => { - selectedFeatures.value = value - featureInformation.value = Object.fromEntries( - Object.entries(value).map(([layerId, features]) => [ - layerId, - features.map((feature) => - new GeoJSON().writeFeatureObject(feature) - ), - ]) - ) - }, - }), - featureInformation, + olFeatures, + olFeature, + geojsonFeatures, + geojsonFeature, } } diff --git a/src/plugins/gfi/store.ts b/src/plugins/gfi/store.ts index 4f7de3e0e7..b8457a7aec 100644 --- a/src/plugins/gfi/store.ts +++ b/src/plugins/gfi/store.ts @@ -5,6 +5,7 @@ /* eslint-enable tsdoc/syntax */ import { acceptHMRUpdate, defineStore, storeToRefs } from 'pinia' +import { readonly } from 'vue' import { useGfiFeatureStore } from './stores/feature' import { useGfiListStore } from './stores/list' @@ -43,35 +44,49 @@ export const useGfiStore = defineStore('plugins/gfi', () => { renderType: gfiMainStoreRefs.renderType, /** - * Hovered features. + * Hovered feature. + * This is a feature whose hovering state is originated at the plugin. + * * This is only used for the list view. * * @alpha */ - hoveredFeatures: gfiListStoreRefs.hoveredFeatures, + hoveredFeature: gfiListStoreRefs.hoveredFeature, /** - * Mark feature as hovered. + * Hovered features. + * The hovering state may be originated either from {@link hoveredFeature} or by other means. + * * This is only used for the list view. * + * @readonly + * @alpha + */ + hoveredFeatures: readonly(gfiListStoreRefs.hoveredFeatures), + + /** + * Selected feature. + * This is only used if the feature is loaded from the list view. + * * @alpha */ - hover: gfiListStore.hover, + selectedFeature: gfiMainStoreRefs.olFeature, /** * Selected features. * This is only used if the feature is loaded from the list view. * + * @readonly * @alpha */ - selectedFeatures: gfiMainStoreRefs.selectedFeatures, + selectedFeatures: readonly(gfiMainStoreRefs.olFeatures), /** * Feature information for the currently selected feature(s). * * @alpha */ - featureInformation: gfiMainStoreRefs.featureInformation, + featureInformation: gfiMainStoreRefs.geojsonFeatures, /** * List of features that should be displayed in a list view. @@ -177,12 +192,9 @@ export const useGfiStore = defineStore('plugins/gfi', () => { * Selected feature for the detail view. * This is the currently shown feature. * - * To mutate this value, change `featureIndex`. - * - * @readonly * @alpha */ - feature: gfiFeatureStoreRefs.selectedFeature, + feature: gfiMainStoreRefs.geojsonFeature, /** * Properties for the selected feature in detail view. diff --git a/src/plugins/gfi/stores/feature.ts b/src/plugins/gfi/stores/feature.ts index 56be4518e4..ef48a45b6d 100644 --- a/src/plugins/gfi/stores/feature.ts +++ b/src/plugins/gfi/stores/feature.ts @@ -5,7 +5,7 @@ import type { GfiLayerConfiguration, RequestGfiParameters } from '../types' import { rawLayerList } from '@masterportal/masterportalapi' import { debounce, isEqual } from 'es-toolkit' import { acceptHMRUpdate, defineStore } from 'pinia' -import { computed, nextTick, onScopeDispose, ref, watch } from 'vue' +import { computed, nextTick, onScopeDispose, watch } from 'vue' import { useRefStore } from '@/composables/useRefStore' import { useStoreWatcher } from '@/composables/useStoreWatcher' @@ -85,10 +85,10 @@ export const useGfiFeatureStore = defineStore('plugins/gfi/feature', () => { if (options.toggleSelection) { Object.entries(result).forEach(([layerId, features]) => { - if (!gfiMainStore.featureInformation[layerId]) { - gfiMainStore.featureInformation[layerId] = [] + if (!gfiMainStore.geojsonFeatures[layerId]) { + gfiMainStore.geojsonFeatures[layerId] = [] } - const layerFeatureList = gfiMainStore.featureInformation[layerId] + const layerFeatureList = gfiMainStore.geojsonFeatures[layerId] features.forEach((feature) => { const oldFeatureIndex = layerFeatureList.findIndex((oldFeature) => @@ -104,7 +104,7 @@ export const useGfiFeatureStore = defineStore('plugins/gfi/feature', () => { return } - gfiMainStore.featureInformation = result + gfiMainStore.geojsonFeatures = result } const waitMs = computed(() => gfiMainStore.configuration.waitMs || 50) @@ -118,7 +118,7 @@ export const useGfiFeatureStore = defineStore('plugins/gfi/feature', () => { coordinate as RequestGfiParameters['coordinateOrExtent'] ) } else { - gfiMainStore.featureInformation = {} + gfiMainStore.geojsonFeatures = {} } }, { immediate: true } @@ -136,7 +136,7 @@ export const useGfiFeatureStore = defineStore('plugins/gfi/feature', () => { gfiMainStore.configuration.multiSelect?.toggleSelection ?? true, }) } else { - gfiMainStore.featureInformation = {} + gfiMainStore.geojsonFeatures = {} } }) } @@ -161,20 +161,30 @@ export const useGfiFeatureStore = defineStore('plugins/gfi/feature', () => { } const visibleFeatures = computed(() => - Object.entries(gfiMainStore.featureInformation) + Object.entries(gfiMainStore.geojsonFeatures) .filter(([layerId]) => gfiMainStore.configuration.layers[layerId]?.window) .flatMap(([layerId, features]) => features.map((feature) => ({ layerId, feature })) ) ) - const selectedFeatureIndex = ref(0) - const selectedFeature = computed( - () => visibleFeatures.value[selectedFeatureIndex.value] - ) + const selectedFeatureIndex = computed({ + get: () => + visibleFeatures.value.findIndex((feature) => + isEqual(feature, gfiMainStore.geojsonFeature) + ), + set: (value) => { + const feature = visibleFeatures.value[value] + if (feature) { + gfiMainStore.geojsonFeature = feature + } + }, + }) const selectedFeatureLayerConfiguration = computed(() => - gfiMainStore.getLayerConfiguration(selectedFeature.value?.layerId || '') + gfiMainStore.getLayerConfiguration( + gfiMainStore.geojsonFeature?.layerId || '' + ) ) const exportPropertyLayerConfiguration = computed( @@ -183,7 +193,7 @@ export const useGfiFeatureStore = defineStore('plugins/gfi/feature', () => { const exportProperty = computed(() => exportPropertyLayerConfiguration.value - ? selectedFeature.value?.feature.properties?.[ + ? gfiMainStore.geojsonFeature?.feature.properties?.[ exportPropertyLayerConfiguration.value ] : null @@ -196,8 +206,8 @@ export const useGfiFeatureStore = defineStore('plugins/gfi/feature', () => { ) const title = computed(() => - titleLayerConfiguration.value && selectedFeature.value - ? titleLayerConfiguration.value(selectedFeature.value.feature) + titleLayerConfiguration.value && gfiMainStore.geojsonFeature + ? titleLayerConfiguration.value(gfiMainStore.geojsonFeature.feature) : null ) @@ -207,7 +217,7 @@ export const useGfiFeatureStore = defineStore('plugins/gfi/feature', () => { const selectedFeatureProperties = computed(() => Object.fromEntries( - Object.entries(selectedFeature.value?.feature.properties || {}) + Object.entries(gfiMainStore.geojsonFeature?.feature.properties || {}) .filter( ([key]) => (!selectedFeaturePropertiesLayerConfiguration.value || @@ -222,15 +232,10 @@ export const useGfiFeatureStore = defineStore('plugins/gfi/feature', () => { ) watch( - visibleFeatures, - () => { - selectedFeatureIndex.value = 0 - }, - { deep: true } - ) - - watch( - [() => gfiMainStore.configuration.coordinateTarget, selectedFeature], + [ + () => gfiMainStore.configuration.coordinateTarget, + () => gfiMainStore.geojsonFeature, + ], ([target, feature], [, oldFeature]) => { if (target && !feature && oldFeature) { const targetStore = useRefStore(target) @@ -257,11 +262,14 @@ export const useGfiFeatureStore = defineStore('plugins/gfi/feature', () => { void nextTick(() => { const iconMenuStore = coreStore.getPluginStore('iconMenu') if (iconMenuStore) { - watch(selectedFeature, (newFeature) => { - if (newFeature) { - iconMenuStore.openMenuById(PluginId) + watch( + () => gfiMainStore.geojsonFeature, + (newFeature) => { + if (newFeature) { + iconMenuStore.openMenuById(PluginId) + } } - }) + ) } }) } @@ -269,7 +277,6 @@ export const useGfiFeatureStore = defineStore('plugins/gfi/feature', () => { return { visibleFeatures, selectedFeatureIndex, - selectedFeature, selectedFeatureProperties, exportProperty, title, diff --git a/src/plugins/gfi/stores/list.ts b/src/plugins/gfi/stores/list.ts index 8779bc6a1a..236d0643a2 100644 --- a/src/plugins/gfi/stores/list.ts +++ b/src/plugins/gfi/stores/list.ts @@ -2,7 +2,7 @@ import type { Feature } from 'ol' import type { FeatureList } from '../types' import { acceptHMRUpdate, defineStore, storeToRefs } from 'pinia' -import { computed, markRaw, ref, shallowRef } from 'vue' +import { computed, markRaw, ref, shallowRef, watch } from 'vue' import { useOlVectorSources } from '@/composables/useOlVectorSources' import { useRefStore } from '@/composables/useRefStore' @@ -24,32 +24,11 @@ export const useGfiListStore = defineStore('plugins/gfi/list', () => { const configuration = computed(() => gfiMainStore.configuration.featureList) + const hoveredFeature = shallowRef<{ + layerId: string + feature: Feature + } | null>(null) const hoveredFeatures = shallowRef>({}) - if (configuration.value?.bindWithCoreHoverSelect) { - useBindWithCoreHoverSelect( - hoveredFeatures, - gfiMainStoreRefs.selectedFeatures, - coreStoreRefs.hoveredFeature, - coreStoreRefs.selectedFeature - ) - } - - function hover(data: { layerId: string; feature: Feature } | null) { - if (data === null) { - if (Object.keys(hoveredFeatures.value).length) { - hoveredFeatures.value = markRaw({}) - } - return - } - - const { layerId, feature } = data - if (hoveredFeatures.value[layerId]?.includes(feature)) { - return - } - hoveredFeatures.value = markRaw({ - [layerId]: markRaw([feature]), - }) - } const activeLayers = computed((): string[] => { if (!configuration.value) { @@ -170,8 +149,12 @@ export const useGfiListStore = defineStore('plugins/gfi/list', () => { paginatedFeatures.value.map((feature) => ({ ...feature, get hovered() { - return Object.values(hoveredFeatures.value).some((features) => - features.includes(feature.feature) + return ( + Object.values(hoveredFeatures.value).some((features) => + features.includes(feature.feature) + ) || + (configuration.value?.bindWithCoreHoverSelect && + coreStore.hoveredClusterFeatures.includes(feature.feature)) ) }, text: { @@ -182,10 +165,46 @@ export const useGfiListStore = defineStore('plugins/gfi/list', () => { })) ) + if (configuration.value?.bindWithCoreHoverSelect) { + useBindWithCoreHoverSelect( + // hovered feature + hoveredFeature, + coreStoreRefs.hoveredFeature, + // hovered cluster + hoveredFeatures, + coreStoreRefs.hoveredClusterFeatures, + // selected feature + gfiMainStoreRefs.olFeature, + coreStoreRefs.selectedFeature, + // selected cluster + gfiMainStoreRefs.olFeatures, + coreStoreRefs.selectedClusterFeatures, + // reference order + computed(() => flatFeatures.value.map(({ feature }) => feature)) + ) + } else { + watch(hoveredFeature, (value) => { + if (value === null) { + hoveredFeatures.value = {} + return + } + const { layerId, feature } = value + hoveredFeatures.value = { [layerId]: [feature] } + }) + watch(gfiMainStoreRefs.olFeature, (value) => { + if (value === null) { + gfiMainStore.olFeatures = {} + return + } + const { layerId, feature } = value + gfiMainStore.olFeatures = { [layerId]: [feature] } + }) + } + return { features, + hoveredFeature, hoveredFeatures, - hover, flatFeatures, paginationActive, pageLength, diff --git a/src/plugins/gfi/stores/main.ts b/src/plugins/gfi/stores/main.ts index 19b8093e68..70c030875a 100644 --- a/src/plugins/gfi/stores/main.ts +++ b/src/plugins/gfi/stores/main.ts @@ -35,7 +35,8 @@ export const useGfiMainStore = defineStore('plugins/gfi/main', () => { return configuration.value.layers[layerId] } - const { selectedFeatures, featureInformation } = useSelectedFeatures() + const { olFeatures, olFeature, geojsonFeatures, geojsonFeature } = + useSelectedFeatures() const customHighlightStyle = computed( () => @@ -51,7 +52,7 @@ export const useGfiMainStore = defineStore('plugins/gfi/main', () => { }) ) const highlightedFeatures = computed(() => - Object.entries(featureInformation.value) + Object.entries(geojsonFeatures.value) .filter(([layerId]) => getLayerConfiguration(layerId)?.geometry ?? true) .flatMap(([, features]) => features) ) @@ -65,8 +66,10 @@ export const useGfiMainStore = defineStore('plugins/gfi/main', () => { configuration, renderType, getLayerConfiguration, - selectedFeatures, - featureInformation, + olFeatures, + olFeature, + geojsonFeatures, + geojsonFeature, } })