1
+ import { createElement , Fragment , ReactNode } from 'react'
1
2
import { Container , useDimensions } from '@nivo/core'
2
- import { useTreeMap } from './hooks'
3
+ import { useCustomLayerProps , useTreeMap } from './hooks'
3
4
import { TreeMapNodes } from './TreeMapNodes'
4
- import { DefaultTreeMapDatum , TreeMapCommonProps , TreeMapHtmlProps } from './types'
5
- import { htmlDefaultProps } from './defaults'
5
+ import { DefaultTreeMapDatum , TreeMapCommonProps , TreeMapHtmlProps , LayerId } from './types'
6
+ import { htmlDefaultProps , svgDefaultProps } from './defaults'
6
7
7
8
type InnerTreeMapHtmlProps < Datum extends object > = Omit <
8
9
TreeMapHtmlProps < Datum > ,
@@ -22,6 +23,7 @@ const InnerTreeMapHtml = <Datum extends object>({
22
23
width,
23
24
height,
24
25
margin : partialMargin ,
26
+ layers = svgDefaultProps . layers as NonNullable < TreeMapHtmlProps < Datum > [ 'layers' ] > ,
25
27
colors = htmlDefaultProps . colors as TreeMapCommonProps < Datum > [ 'colors' ] ,
26
28
colorBy = htmlDefaultProps . colorBy as TreeMapCommonProps < Datum > [ 'colorBy' ] ,
27
29
nodeOpacity = htmlDefaultProps . nodeOpacity ,
@@ -81,6 +83,32 @@ const InnerTreeMapHtml = <Datum extends object>({
81
83
parentLabelTextColor,
82
84
} )
83
85
86
+ const layerById : Record < LayerId , ReactNode > = {
87
+ nodes : null ,
88
+ }
89
+
90
+ if ( layers . includes ( 'nodes' ) ) {
91
+ layerById . nodes = (
92
+ < TreeMapNodes < Datum >
93
+ key = "nodes"
94
+ nodes = { nodes }
95
+ nodeComponent = { nodeComponent }
96
+ borderWidth = { borderWidth }
97
+ enableLabel = { enableLabel }
98
+ labelSkipSize = { labelSkipSize }
99
+ enableParentLabel = { enableParentLabel }
100
+ isInteractive = { isInteractive }
101
+ onMouseEnter = { onMouseEnter }
102
+ onMouseMove = { onMouseMove }
103
+ onMouseLeave = { onMouseLeave }
104
+ onClick = { onClick }
105
+ tooltip = { tooltip }
106
+ />
107
+ )
108
+ }
109
+
110
+ const customLayerProps = useCustomLayerProps < Datum > ( { nodes } )
111
+
84
112
return (
85
113
< div
86
114
role = { role }
@@ -94,20 +122,13 @@ const InnerTreeMapHtml = <Datum extends object>({
94
122
} }
95
123
>
96
124
< div style = { { position : 'absolute' , top : margin . top , left : margin . left } } >
97
- < TreeMapNodes < Datum >
98
- nodes = { nodes }
99
- nodeComponent = { nodeComponent }
100
- borderWidth = { borderWidth }
101
- enableLabel = { enableLabel }
102
- labelSkipSize = { labelSkipSize }
103
- enableParentLabel = { enableParentLabel }
104
- isInteractive = { isInteractive }
105
- onMouseEnter = { onMouseEnter }
106
- onMouseMove = { onMouseMove }
107
- onMouseLeave = { onMouseLeave }
108
- onClick = { onClick }
109
- tooltip = { tooltip }
110
- />
125
+ { layers . map ( ( layer , i ) => {
126
+ if ( typeof layer === 'function' ) {
127
+ return < Fragment key = { i } > { createElement ( layer , customLayerProps ) } </ Fragment >
128
+ }
129
+
130
+ return layerById ?. [ layer ] ?? null
131
+ } ) }
111
132
</ div >
112
133
</ div >
113
134
)
0 commit comments