@@ -100,6 +100,14 @@ export interface MlWmsLoaderProps {
100100 * A function to set the feature info active state
101101 */
102102 setFeatureInfoActive ?: ( val : boolean | ( ( current : boolean ) => boolean ) ) => void ;
103+ /**
104+ * Callback function that is called after the featureInfoRequest has succeeded
105+ */
106+ featureInfoSuccess ?: ( content : string , lngLat : { lng : number ; lat : number } ) => void ;
107+ /**
108+ * If true, displays a marker at the feature info location
109+ */
110+ featureInfoMarkerEnabled ?: boolean ;
103111 /**
104112 * The WMS configuration object
105113 */
@@ -121,6 +129,14 @@ export interface MlWmsLoaderProps {
121129 */
122130 buttons ?: React . JSX . Element ;
123131 sortable ?: boolean ;
132+ /**
133+ * Array of layer Names (IDs) that should be visible at start. If not provided, default visibility logic applies.
134+ */
135+ visibleLayersAtStart ?: string [ ] ;
136+ /**
137+ * If true, renders the layer list UI. If false, only the WMS layer is rendered without UI controls.
138+ */
139+ showLayerList ?: boolean ;
124140}
125141
126142export interface WmsLayer {
@@ -170,8 +186,10 @@ const defaultProps = {
170186 TRANSPARENT : 'TRUE' ,
171187 } ,
172188 featureInfoEnabled : true ,
189+ featureInfoMarkerEnabled : true ,
173190 zoomToExtent : false ,
174191 showDeleteButton : false ,
192+ showLayerList : true ,
175193} ;
176194/**
177195 * Loads a WMS getCapabilities xml document and adds a MlWmsLayer component for each layer that is
@@ -289,6 +307,7 @@ const MlWmsLoader = (props: MlWmsLoaderProps) => {
289307 QUERY_LAYERS : layers
290308 . map ( ( layer : LayerType ) => ( layer . visible && layer . queryable ? layer . Name : undefined ) )
291309 . filter ( ( n ) => n ) ,
310+ STYLES : '' ,
292311 WIDTH : 100 ,
293312 HEIGHT : 100 ,
294313 srs : 'EPSG:3857' ,
@@ -327,6 +346,7 @@ const MlWmsLoader = (props: MlWmsLoaderProps) => {
327346 . then ( ( text ) => {
328347 setFeatureInfoLngLat ( ev . lngLat ) ;
329348 setFeatureInfoContent ( text ) ;
349+ props . featureInfoSuccess ?.( text , ev . lngLat ) ;
330350 } )
331351 . catch ( ( error ) => console . log ( error ) ) ;
332352 } ,
@@ -383,8 +403,11 @@ const MlWmsLoader = (props: MlWmsLoaderProps) => {
383403 if ( idx === 0 ) {
384404 _LatLonBoundingBox = layer . EX_GeographicBoundingBox || layer ?. LatLonBoundingBox || [ ] ;
385405 }
406+ const isVisible = props . visibleLayersAtStart
407+ ? props . visibleLayersAtStart . includes ( layer . Name || '' )
408+ : true ;
386409 return {
387- visible : capabilities ?. Capability ?. Layer ?. Layer ?. length > 2 ? idx > 1 : true ,
410+ visible : isVisible ,
388411 Attribution : { Title : '' } ,
389412 // eslint-disable-next-line @typescript-eslint/no-unused-vars
390413 ...( ( { CRS , ..._layer } ) => _layer ) ( layer ) ,
@@ -398,8 +421,12 @@ const MlWmsLoader = (props: MlWmsLoaderProps) => {
398421 if ( idx === 0 ) {
399422 _LatLonBoundingBox = layer . EX_GeographicBoundingBox || layer ?. LatLonBoundingBox || [ ] ;
400423 }
424+ const isVisible =
425+ props . visibleLayersAtStart && layer . Name
426+ ? props . visibleLayersAtStart . includes ( layer . Name )
427+ : false ;
401428 return {
402- visible : false ,
429+ visible : isVisible ,
403430 Attribution : { Title : '' } ,
404431 // eslint-disable-next-line @typescript-eslint/no-unused-vars
405432 ...( ( { CRS , ..._layer } ) => _layer ) ( layer ) ,
@@ -527,57 +554,60 @@ const MlWmsLoader = (props: MlWmsLoaderProps) => {
527554 ) }
528555 { wmsUrl && (
529556 < >
530- { props . layerId && props . sortable && (
531- < SortableContainer layerId = { props . layerId } > { listContent } </ SortableContainer >
557+ { props . showLayerList && (
558+ < >
559+ { props . sortable && < SortableContainer > { listContent } </ SortableContainer > }
560+ { ! props . sortable && listContent }
561+ < Box sx = { { display : open ? 'block' : 'none' } } >
562+ < List dense component = "div" disablePadding sx = { { paddingLeft : '18px' } } >
563+ { wmsUrl &&
564+ layers ?. map ?.( ( layer , idx ) => {
565+ return layer ?. Name ? (
566+ < ListItem
567+ key = { layer . Name + idx }
568+ secondaryAction = { < > { layer ?. queryable && < InfoIcon /> } </ > }
569+ >
570+ < ListItemIcon sx = { { minWidth : '30px' } } >
571+ < Checkbox
572+ checked = { layer . visible }
573+ sx = { { padding : 0 } }
574+ onClick = { ( ) => {
575+ const _layers : Array < LayerType > = [ ...layers ] ;
576+ _layers [ idx ] . visible = ! _layers [ idx ] . visible ;
577+ setLayers ( [ ..._layers ] ) ;
578+ } }
579+ />
580+ </ ListItemIcon >
581+ < ListItemText primary = { layer ?. Title } variant = "layerlist" />
582+ </ ListItem >
583+ ) : (
584+ < > </ >
585+ ) ;
586+ } ) }
587+ </ List >
588+ </ Box >
589+ </ >
590+ ) }
591+ { wmsUrl && layers ?. length && (
592+ < MlWmsLayer
593+ key = { mapHook . componentId }
594+ layerId = { props . layerId || mapHook . componentId }
595+ url = { wmsUrl }
596+ attribution = { attribution }
597+ visible = { visible }
598+ urlParameters = { {
599+ ...props . wmsUrlParameters ,
600+ layers : layers
601+ ?. filter ?.( ( layer ) => layer . visible )
602+ . map ( ( el ) => el . Name )
603+ . reverse ( )
604+ . join ( ',' ) ,
605+ } }
606+ insertBeforeLayer = { props ?. insertBeforeLayer }
607+ />
532608 ) }
533- { props . layerId && ! props . sortable && listContent }
534- < Box sx = { { display : open ? 'block' : 'none' } } >
535- < List dense component = "div" disablePadding sx = { { paddingLeft : '18px' } } >
536- { wmsUrl &&
537- layers ?. map ?.( ( layer , idx ) => {
538- return layer ?. Name ? (
539- < ListItem
540- key = { layer . Name + idx }
541- secondaryAction = { < > { layer ?. queryable && < InfoIcon /> } </ > }
542- >
543- < ListItemIcon sx = { { minWidth : '30px' } } >
544- < Checkbox
545- checked = { layer . visible }
546- sx = { { padding : 0 } }
547- onClick = { ( ) => {
548- const _layers : Array < LayerType > = [ ...layers ] ;
549- _layers [ idx ] . visible = ! _layers [ idx ] . visible ;
550- setLayers ( [ ..._layers ] ) ;
551- } }
552- />
553- </ ListItemIcon >
554- < ListItemText primary = { layer ?. Title } variant = "layerlist" />
555- </ ListItem >
556- ) : (
557- < > </ >
558- ) ;
559- } ) }
560- </ List >
561- { wmsUrl && layers ?. length && (
562- < MlWmsLayer
563- key = { mapHook . componentId }
564- url = { wmsUrl }
565- attribution = { attribution }
566- visible = { visible }
567- urlParameters = { {
568- ...props . wmsUrlParameters ,
569- layers : layers
570- ?. filter ?.( ( layer ) => layer . visible )
571- . map ( ( el ) => el . Name )
572- . reverse ( )
573- . join ( ',' ) ,
574- } }
575- insertBeforeLayer = { props ?. insertBeforeLayer }
576- />
577- ) }
578- </ Box >
579609
580- { props . featureInfoEnabled && featureInfoLngLat && (
610+ { props . featureInfoEnabled && props . featureInfoMarkerEnabled && featureInfoLngLat && (
581611 < MlMarker { ...featureInfoLngLat } content = { featureInfoContent } />
582612 ) }
583613 </ >
0 commit comments