@@ -36,13 +36,32 @@ export const useGfiStore = defineStore('plugins/gfi', () => {
3636
3737 const watchHandles = ref < WatchHandle [ ] > ( [ ] )
3838
39+ const hoveredFeatures = ref < Record < string , Feature [ ] > > ( { } )
40+ const selectedFeatures = ref < Record < string , Feature [ ] > > ( { } )
41+
3942 const featureInformation = ref < Record < string , GeoJsonFeature [ ] > > ( { } )
4043
44+ watch (
45+ selectedFeatures ,
46+ ( features ) => {
47+ featureInformation . value = Object . fromEntries (
48+ Object . entries ( features ) . map ( ( [ layerId , features ] ) => [
49+ layerId ,
50+ features . map ( ( feature ) => serializeFeature ( feature ) ) ,
51+ ] )
52+ )
53+ } ,
54+ { immediate : true , deep : true }
55+ )
56+
4157 const listFeatures = computed ( ( ) => {
4258 // We want to re-calculate on extent changes, as the features change then.
4359 // eslint-disable-next-line @typescript-eslint/no-unused-expressions
4460 coreStore . extent
4561
62+ // TODO: We also want to re-calculate when the features are actually loaded.
63+ // Currently, we need an extent change to reload the list.
64+
4665 if ( ! configuration . value . featureList ) {
4766 return { }
4867 }
@@ -85,13 +104,92 @@ export const useGfiStore = defineStore('plugins/gfi', () => {
85104 ( feature ) =>
86105 ! layerConfiguration . isSelectable ||
87106 layerConfiguration . isSelectable ( serializeFeature ( feature ) )
88- ) ,
107+ )
108+ . map ( ( feature ) => ( {
109+ feature,
110+ ...( configuration . value . featureList ?. bindWithCoreHoverSelect
111+ ? {
112+ hovered :
113+ coreStore . hoveredFeature === feature ||
114+ coreStore . hoveredFeature
115+ ?. get ( 'features' )
116+ ?. includes ( feature ) ,
117+ }
118+ : { } ) ,
119+ } ) ) ,
89120 ]
90121 } )
91- . filter ( ( layer ) : layer is [ string , Feature [ ] ] => Boolean ( layer ) )
122+ . filter (
123+ (
124+ layer
125+ ) : layer is [ string , { feature : Feature ; hovered ?: boolean } [ ] ] =>
126+ Boolean ( layer )
127+ )
92128 )
93129 } )
94130
131+ watch (
132+ [
133+ ( ) => configuration . value . featureList ?. bindWithCoreHoverSelect ,
134+ ( ) => coreStore . selectedFeature ,
135+ ] ,
136+ ( [ bindMarkers , feature ] ) => {
137+ if ( bindMarkers && feature ) {
138+ featureInformation . value [ feature . get ( '_polarLayerId' ) ] = feature . get (
139+ 'features'
140+ )
141+ ? feature . get ( 'features' ) . map ( ( feature ) => serializeFeature ( feature ) )
142+ : [ serializeFeature ( feature as Feature ) ]
143+ }
144+ } ,
145+ { immediate : true , deep : true }
146+ )
147+
148+ watch (
149+ [
150+ ( ) => configuration . value . featureList ?. bindWithCoreHoverSelect ,
151+ ( ) => hoveredFeatures . value ,
152+ ] ,
153+ ( [ bindMarkers , featureMap ] ) => {
154+ if ( bindMarkers ) {
155+ const features = Object . entries ( featureMap ) . flatMap (
156+ ( [ layerId , features ] ) =>
157+ features . map ( ( feature ) => ( { layerId, feature } ) )
158+ )
159+
160+ // The second condition is necessary for TypeScript checks.
161+ if ( features . length <= 0 || ! features [ 0 ] ) {
162+ coreStore . hoveredFeature = null
163+ return
164+ }
165+
166+ features [ 0 ] . feature . set ( '_polarLayerId' , features [ 0 ] . layerId )
167+ coreStore . hoveredFeature = features [ 0 ] . feature
168+ }
169+ } ,
170+ { immediate : true , deep : true }
171+ )
172+
173+ watch (
174+ [
175+ ( ) => configuration . value . featureList ?. bindWithCoreHoverSelect ,
176+ ( ) => selectedFeatures . value ,
177+ ] ,
178+ ( [ bindMarkers , featureMap ] ) => {
179+ if ( bindMarkers ) {
180+ const features = Object . values ( featureMap ) . flat ( )
181+
182+ if ( features . length <= 0 ) {
183+ coreStore . selectedFeature = null
184+ return
185+ }
186+
187+ coreStore . selectedFeature = features [ 0 ] as Feature
188+ }
189+ } ,
190+ { immediate : true , deep : true }
191+ )
192+
95193 async function getFeatureInfo ( coordinate : [ number , number ] ) {
96194 let result = Object . fromEntries (
97195 (
@@ -182,6 +280,12 @@ export const useGfiStore = defineStore('plugins/gfi', () => {
182280 /** @alpha */
183281 configuration,
184282
283+ /** @alpha */
284+ hoveredFeatures,
285+
286+ /** @alpha */
287+ selectedFeatures,
288+
185289 /** @alpha */
186290 featureInformation,
187291
0 commit comments