4
4
* @copyright 2024 3Liz
5
5
* @license MPL-2.0
6
6
*/
7
- import { mainEventDispatcher } from '../modules/Globals.js' ;
7
+ import { mainEventDispatcher , mainLizmap } from '../modules/Globals.js' ;
8
8
import { TooltipLayersConfig } from './config/Tooltip.js' ;
9
9
import WMS from '../modules/WMS.js' ;
10
10
import GeoJSON from 'ol/format/GeoJSON.js' ;
@@ -32,6 +32,13 @@ export default class Tooltip {
32
32
this . _activeTooltipLayer ;
33
33
this . _tooltipLayers = new Map ( ) ;
34
34
this . activeLayerOrder = null ;
35
+
36
+ mainLizmap . state . rootMapGroup . addListener (
37
+ evt => {
38
+ this . _applyFilter ( evt . name ) ;
39
+ } ,
40
+ 'layer.filter.token.changed'
41
+ ) ;
35
42
}
36
43
37
44
/**
@@ -103,6 +110,7 @@ export default class Tooltip {
103
110
104
111
if ( tooltipLayer ) {
105
112
this . _activeTooltipLayer = tooltipLayer ;
113
+ this . _applyFilter ( layerName ) ;
106
114
} else {
107
115
const url = `${ lizUrls . service . replace ( 'service?' , 'features/tooltips?' ) } &layerId=${ layerTooltipCfg . id } ` ;
108
116
@@ -116,15 +124,18 @@ export default class Tooltip {
116
124
stroke : stroke ,
117
125
} ) ;
118
126
127
+ // Initially hidden, will be set to 1 when features are loaded and filter is applied
128
+ // to avoid visual flickering
129
+ // Using the visible property of the layer does not work
119
130
this . _activeTooltipLayer = new VectorLayer ( {
131
+ opacity : 0 ,
120
132
source : new VectorSource ( {
121
133
url : url ,
122
134
format : new GeoJSON ( ) ,
123
135
} ) ,
124
136
style : vectorStyle
125
137
} ) ;
126
138
127
-
128
139
// Handle points layers with QGIS style
129
140
if ( this . _displayLayerStyle ) {
130
141
const wmsParams = {
@@ -154,6 +165,7 @@ export default class Tooltip {
154
165
155
166
// Load tooltip layer
156
167
this . _activeTooltipLayer . once ( 'sourceready' , ( ) => {
168
+ this . _applyFilter ( layerName ) ;
157
169
mainEventDispatcher . dispatch ( 'tooltip.loaded' ) ;
158
170
} ) ;
159
171
@@ -270,4 +282,54 @@ export default class Tooltip {
270
282
this . activeLayerOrder = null ;
271
283
mainEventDispatcher . dispatch ( 'tooltip.deactivated' ) ;
272
284
}
285
+
286
+ _applyFilter ( layerName ) {
287
+ const tooltipLayer = this . _tooltipLayers . get ( layerName ) ;
288
+
289
+ if ( ! tooltipLayer ) {
290
+ // No tooltip layer for this feature type
291
+ return ;
292
+ }
293
+
294
+ const expFilter = mainLizmap . state . rootMapGroup . getMapLayerByName ( layerName ) . itemState . expressionFilter ;
295
+ let featureIds = [ ] ;
296
+
297
+ const hideFilteredFeatures = ( ) => {
298
+ for ( const feature of tooltipLayer . getSource ( ) . getFeatures ( ) ) {
299
+ // If the feature id is not in the list, hide it
300
+ if ( featureIds . length === 0 || featureIds . includes ( feature . getId ( ) ) ) {
301
+ feature . setStyle ( null ) ;
302
+ } else {
303
+ feature . setStyle ( new Style ( { } ) ) ;
304
+ }
305
+ }
306
+ // Display the layer now all styles are applied
307
+ tooltipLayer . setOpacity ( 1 ) ;
308
+ } ;
309
+
310
+ if ( ! expFilter ) {
311
+ hideFilteredFeatures ( ) ;
312
+ return ;
313
+ }
314
+
315
+ if ( expFilter . startsWith ( '$id IN ' ) ) {
316
+ const re = / [ ( ) ] / g;
317
+ featureIds = expFilter . replace ( '$id IN ' , '' ) . replace ( re , '' ) . split ( ',' ) . map ( Number ) ;
318
+ hideFilteredFeatures ( ) ;
319
+ } else {
320
+ const wfsParams = {
321
+ TYPENAME : layerName ,
322
+ // No geometry needed
323
+ GEOMETRYNAME : 'none' ,
324
+ // Force to return only the featureId
325
+ PROPERTYNAME : 'no_feature_properties' ,
326
+ // Filter
327
+ EXP_FILTER : expFilter
328
+ } ;
329
+ mainLizmap . wfs . getFeature ( wfsParams ) . then ( result => {
330
+ featureIds = result . features . map ( f => parseInt ( f . id . split ( '.' ) [ 1 ] ) ) ;
331
+ hideFilteredFeatures ( ) ;
332
+ } ) ;
333
+ }
334
+ }
273
335
}
0 commit comments