@@ -13,7 +13,7 @@ import {FormattedMessage} from '@kepler.gl/localization';
1313import { Layer , LayerBaseConfig , VisualChannel , VisualChannelDescription } from '@kepler.gl/layers' ;
1414import { LayerVisConfig , MapState , RGBColor } from '@kepler.gl/types' ;
1515import { getDistanceScales } from 'viewport-mercator-project' ;
16- import { ArrowDown , ArrowRight } from '../common/icons' ;
16+ import { ArrowDown , ArrowRight , EyeSeen , EyeUnseen } from '../common/icons' ;
1717import PanelHeaderActionFactory from '../side-panel/panel-header-action' ;
1818
1919interface StyledMapControlLegendProps {
@@ -73,6 +73,26 @@ export const StyledMapControlLegend = styled.div<StyledMapControlLegendProps>`
7373 }
7474` ;
7575
76+ const StyledLegendHeaderRow = styled . div `
77+ display: flex;
78+ align-items: center;
79+ justify-content: space-between;
80+ ` ;
81+
82+ const StyledVisibilityToggle = styled . div < { isVisible : boolean } > `
83+ cursor: pointer;
84+ color: ${ props => ( props . isVisible ? props . theme . textColor : props . theme . subtextColor ) } ;
85+ display: flex;
86+ align-items: center;
87+ margin-left: 8px;
88+ opacity: ${ props => ( props . isVisible ? 1 : 0.5 ) } ;
89+
90+ &:hover {
91+ color: ${ props => props . theme . textColorHl } ;
92+ opacity: 1;
93+ }
94+ ` ;
95+
7696export const VisualChannelMetric = ( { name} ) => {
7797 return (
7898 < div className = "legend--layer__title" >
@@ -300,16 +320,41 @@ export type LayerLegendHeaderProps = {
300320 showLayerName ?: boolean ;
301321 } ;
302322 isExport ?: boolean ;
323+ onToggleLayerVisibility ?: ( layer : Layer ) => void ;
303324} ;
304325
305326const isRadiusChannel = visualChannel =>
306327 [ CHANNEL_SCALES . radius ] . includes ( visualChannel . channelScaleType ) ;
307328
308329export function LayerLegendHeaderFactory ( ) {
309- const LayerLegendHeader : React . FC < LayerLegendHeaderProps > = ( { options, layer} ) => {
310- return options ?. showLayerName !== false ? (
311- < div className = "legend--layer_name" > { layer . config . label } </ div >
312- ) : null ;
330+ const LayerLegendHeader : React . FC < LayerLegendHeaderProps > = ( {
331+ options,
332+ layer,
333+ onToggleLayerVisibility
334+ } ) => {
335+ const isVisible = layer . config . isVisible ;
336+ const onToggle = useCallback ( ( ) => {
337+ if ( onToggleLayerVisibility ) {
338+ onToggleLayerVisibility ( layer ) ;
339+ }
340+ } , [ layer , onToggleLayerVisibility ] ) ;
341+
342+ if ( options ?. showLayerName === false ) {
343+ return null ;
344+ }
345+
346+ return (
347+ < StyledLegendHeaderRow >
348+ < div className = "legend--layer_name" style = { { opacity : isVisible ? 1 : 0.5 } } >
349+ { layer . config . label }
350+ </ div >
351+ { onToggleLayerVisibility ? (
352+ < StyledVisibilityToggle isVisible = { isVisible } onClick = { onToggle } >
353+ { isVisible ? < EyeSeen height = "12px" /> : < EyeUnseen height = "12px" /> }
354+ </ StyledVisibilityToggle >
355+ ) : null }
356+ </ StyledLegendHeaderRow >
357+ ) ;
313358 } ;
314359 return LayerLegendHeader ;
315360}
@@ -421,6 +466,7 @@ export type MapLegendProps = {
421466 disableEdit ?: boolean ;
422467 isExport ?: boolean ;
423468 onLayerVisConfigChange ?: ( oldLayer : Layer , newVisConfig : Partial < LayerVisConfig > ) => void ;
469+ onToggleLayerVisibility ?: ( layer : Layer ) => void ;
424470 actionIcons ?: MapLegendIcons ;
425471} ;
426472
@@ -438,6 +484,7 @@ function MapLegendFactory(
438484 disableEdit,
439485 isExport,
440486 onLayerVisConfigChange,
487+ onToggleLayerVisibility,
441488 actionIcons = defaultActionIcons
442489 } ) => (
443490 < div className = "map-legend" >
@@ -454,7 +501,12 @@ function MapLegendFactory(
454501 key = { index }
455502 width = { containerW }
456503 >
457- < LayerLegendHeader isExport = { isExport } options = { options } layer = { layer } />
504+ < LayerLegendHeader
505+ isExport = { isExport }
506+ options = { options }
507+ layer = { layer }
508+ onToggleLayerVisibility = { onToggleLayerVisibility }
509+ />
458510 < LayerLegendContent
459511 containerW = { containerW }
460512 layer = { layer }
0 commit comments