@@ -55,6 +55,11 @@ export class MapManager {
5555 this . ready = new Promise ( resolve => {
5656 this . map . on ( 'load' , resolve ) ;
5757 } ) ;
58+
59+ // Shared hover tooltip element
60+ this . _tooltip = document . createElement ( 'div' ) ;
61+ this . _tooltip . className = 'map-tooltip' ;
62+ document . body . appendChild ( this . _tooltip ) ;
5863 }
5964
6065 /**
@@ -72,7 +77,7 @@ export class MapManager {
7277 * Register a single layer on the map.
7378 */
7479 registerLayer ( config ) {
75- const { layerId, datasetId, displayName, type, source, sourceLayer, paint, columns } = config ;
80+ const { layerId, datasetId, displayName, type, source, sourceLayer, paint, columns, tooltipFields , defaultVisible } = config ;
7681 const sourceId = `src-${ layerId . replace ( / \/ / g, '-' ) } ` ;
7782 const mapLayerId = `layer-${ layerId . replace ( / \/ / g, '-' ) } ` ;
7883
@@ -85,7 +90,7 @@ export class MapManager {
8590 const layerDef = {
8691 id : mapLayerId ,
8792 source : sourceId ,
88- layout : { visibility : 'none' } ,
93+ layout : { visibility : defaultVisible ? 'visible' : 'none' } ,
8994 } ;
9095
9196 if ( type === 'vector' ) {
@@ -108,11 +113,35 @@ export class MapManager {
108113 displayName,
109114 type,
110115 sourceLayer : sourceLayer || null ,
111- visible : false ,
116+ visible : defaultVisible || false ,
112117 filter : null ,
113118 columns : columns || [ ] ,
114119 defaultPaint : { ...( paint || { } ) } ,
120+ tooltipFields : tooltipFields || null ,
115121 } ) ;
122+
123+ // Wire hover tooltip if fields are declared
124+ if ( tooltipFields && tooltipFields . length > 0 ) {
125+ this . map . on ( 'mousemove' , mapLayerId , ( e ) => {
126+ if ( ! e . features || e . features . length === 0 ) return ;
127+ const props = e . features [ 0 ] . properties ;
128+ const rows = tooltipFields
129+ . filter ( f => props [ f ] !== undefined && props [ f ] !== null && props [ f ] !== '' )
130+ . map ( f => `<tr><th>${ f } </th><td>${ props [ f ] } </td></tr>` )
131+ . join ( '' ) ;
132+ if ( ! rows ) return ;
133+ this . _tooltip . innerHTML = `<table>${ rows } </table>` ;
134+ this . _tooltip . style . display = 'block' ;
135+ this . _tooltip . style . left = ( e . originalEvent . clientX + 12 ) + 'px' ;
136+ this . _tooltip . style . top = ( e . originalEvent . clientY - 12 ) + 'px' ;
137+ this . map . getCanvas ( ) . style . cursor = 'pointer' ;
138+ } ) ;
139+
140+ this . map . on ( 'mouseleave' , mapLayerId , ( ) => {
141+ this . _tooltip . style . display = 'none' ;
142+ this . map . getCanvas ( ) . style . cursor = '' ;
143+ } ) ;
144+ }
116145 }
117146
118147 // ---- Layer Visibility ----
0 commit comments