11import React from 'react'
22
3- import { debounce } from 'lodash'
43import { Focus , Rows2 , Rows3 } from 'lucide-react'
54import {
65 FactoryEdgeWithGradient ,
76 EdgeWithGradient ,
8- type LineageAdjacencyList ,
9- type LineageDetails ,
107 ZOOM_THRESHOLD ,
118 type LineageEdge ,
129 type LineageNodesMap ,
@@ -34,20 +31,21 @@ import {
3431} from '@tobikodata/sqlmesh-common/lineage'
3532
3633import {
34+ type BrandedLineageAdjacencyList ,
35+ type BrandedLineageDetails ,
3736 type ColumnName ,
3837 type EdgeData ,
3938 type ModelColumnID ,
4039 type ModelEdgeId ,
4140 type ModelLineageNodeDetails ,
4241 type ModelNodeId ,
4342 type NodeData ,
44- type NodeType ,
4543 ModelLineageContext ,
4644} from './ModelLineageContext'
4745import { ModelNode } from './ModelNode'
4846import { useModelLineage } from './ModelLineageContext'
49- import type { ModelName } from '@/domain/models'
50- import { getNodeTypeColorVar } from './help'
47+ import type { ModelFQN } from '@/domain/models'
48+ import { NODE_TYPE_COLOR_VAR } from './help'
5149
5250const nodeTypes = {
5351 node : ModelNode ,
@@ -64,9 +62,9 @@ export const ModelLineage = ({
6462 className,
6563 onNodeClick,
6664} : {
67- adjacencyList : LineageAdjacencyList < ModelName >
68- lineageDetails : LineageDetails < ModelName , ModelLineageNodeDetails >
69- selectedModelName ?: ModelName
65+ adjacencyList : BrandedLineageAdjacencyList < ModelFQN >
66+ lineageDetails : BrandedLineageDetails < ModelFQN , ModelLineageNodeDetails >
67+ selectedModelName ?: ModelFQN
7068 className ?: string
7169 onNodeClick ?: (
7270 event : React . MouseEvent < Element , MouseEvent > ,
@@ -98,7 +96,7 @@ export const ModelLineage = ({
9896
9997 const [ showColumns , setShowColumns ] = React . useState ( false )
10098 const [ columnLevelLineage , setColumnLevelLineage ] = React . useState <
101- Map < ModelColumnID , ColumnLevelLineageAdjacencyList < ModelName , ColumnName > >
99+ Map < ModelColumnID , ColumnLevelLineageAdjacencyList < ModelFQN , ColumnName > >
102100 > ( new Map ( ) )
103101 const [ fetchingColumns , setFetchingColumns ] = React . useState <
104102 Set < ModelColumnID >
@@ -108,17 +106,17 @@ export const ModelLineage = ({
108106 adjacencyListColumnLevel,
109107 selectedColumns,
110108 adjacencyListKeysColumnLevel,
111- } = useColumnLevelLineage < ModelName , ColumnName , ModelColumnID > (
109+ } = useColumnLevelLineage < ModelFQN , ColumnName , ModelColumnID > (
112110 columnLevelLineage ,
113111 )
114112
115113 const adjacencyListKeys = React . useMemo ( ( ) => {
116- let keys : ModelName [ ] = [ ]
114+ let keys : ModelFQN [ ] = [ ]
117115
118116 if ( adjacencyListKeysColumnLevel . length > 0 ) {
119117 keys = adjacencyListKeysColumnLevel
120118 } else {
121- keys = Object . keys ( adjacencyList ) as ModelName [ ]
119+ keys = Object . keys ( adjacencyList ) as ModelFQN [ ]
122120 }
123121
124122 return keys
@@ -131,7 +129,7 @@ export const ModelLineage = ({
131129 const node = createNode ( 'node' , nodeId , {
132130 name : detail . name ,
133131 displayName : detail . display_name ,
134- model_type : detail . model_type as NodeType ,
132+ model_type : detail . model_type ,
135133 identifier : detail . identifier ,
136134 kind : detail . kind ,
137135 cron : detail . cron ,
@@ -177,7 +175,7 @@ export const ModelLineage = ({
177175
178176 const transformedNodesMap = React . useMemo ( ( ) => {
179177 return getTransformedNodes <
180- ModelName ,
178+ ModelFQN ,
181179 ModelLineageNodeDetails ,
182180 NodeData ,
183181 ModelNodeId
@@ -201,19 +199,15 @@ export const ModelLineage = ({
201199 data . startColor = 'var(--color-lineage-node-port-edge-source)'
202200 } else {
203201 if ( sourceNode ?. data ?. model_type ) {
204- data . startColor = getNodeTypeColorVar (
205- sourceNode . data . model_type as NodeType ,
206- )
202+ data . startColor = NODE_TYPE_COLOR_VAR [ sourceNode . data . model_type ]
207203 }
208204 }
209205
210206 if ( targetHandleId ) {
211207 data . endColor = 'var(--color-lineage-node-port-edge-target)'
212208 } else {
213209 if ( targetNode ?. data ?. model_type ) {
214- data . endColor = getNodeTypeColorVar (
215- targetNode . data . model_type as NodeType ,
216- )
210+ data . endColor = NODE_TYPE_COLOR_VAR [ targetNode . data . model_type ]
217211 }
218212 }
219213
@@ -237,7 +231,7 @@ export const ModelLineage = ({
237231 const edgesColumnLevel = React . useMemo (
238232 ( ) =>
239233 getEdgesFromColumnLineage <
240- ModelName ,
234+ ModelFQN ,
241235 ColumnName ,
242236 EdgeData ,
243237 ModelEdgeId ,
@@ -254,34 +248,32 @@ export const ModelLineage = ({
254248 return edgesColumnLevel . length > 0
255249 ? edgesColumnLevel
256250 : getTransformedModelEdgesTargetSources <
257- ModelName ,
251+ ModelFQN ,
258252 EdgeData ,
259253 ModelNodeId ,
260254 ModelEdgeId ,
261255 ModelColumnID
262256 > ( adjacencyListKeys , adjacencyList , transformEdge )
263257 } , [ adjacencyListKeys , adjacencyList , transformEdge , edgesColumnLevel ] )
264258
265- const calculateLayout = React . useMemo ( ( ) => {
266- return debounce (
267- (
268- eds : LineageEdge < EdgeData , ModelNodeId , ModelEdgeId , ModelColumnID > [ ] ,
269- nds : LineageNodesMap < NodeData > ,
270- ) => {
271- const { edges, nodesMap } = buildLayout <
272- NodeData ,
273- EdgeData ,
274- ModelNodeId ,
275- ModelEdgeId ,
276- ModelColumnID
277- > ( { edges : eds , nodesMap : nds } )
278- setEdges ( edges )
279- setNodesMap ( nodesMap )
280- setIsBuildingLayout ( false )
281- } ,
282- 200 ,
283- )
284- } , [ ] )
259+ const calculateLayout = React . useCallback (
260+ (
261+ eds : LineageEdge < EdgeData , ModelNodeId , ModelEdgeId , ModelColumnID > [ ] ,
262+ nds : LineageNodesMap < NodeData > ,
263+ ) => {
264+ const { edges, nodesMap } = buildLayout <
265+ NodeData ,
266+ EdgeData ,
267+ ModelNodeId ,
268+ ModelEdgeId ,
269+ ModelColumnID
270+ > ( { edges : eds , nodesMap : nds } )
271+ setEdges ( edges )
272+ setNodesMap ( nodesMap )
273+ setIsBuildingLayout ( false )
274+ } ,
275+ [ edges , nodesMap , setEdges , setNodesMap , setIsBuildingLayout ] ,
276+ )
285277
286278 const nodes = React . useMemo ( ( ) => {
287279 return Object . values ( nodesMap )
@@ -317,27 +309,25 @@ export const ModelLineage = ({
317309 } else {
318310 calculateLayout ( transformedEdges , transformedNodesMap )
319311 }
320- } , [
321- calculateLayout ,
322- showOnlySelectedNodes ,
323- transformedEdges ,
324- transformedNodesMap ,
325- ] )
312+ } , [ showOnlySelectedNodes , transformedEdges , transformedNodesMap ] )
326313
314+ // currentNodeId is passed from the parent component
315+ // we it change we need to reset the selectedNodeId
327316 React . useEffect ( ( ) => {
328317 if ( currentNodeId ) {
329318 setSelectedNodeId ( currentNodeId )
330319 }
331320 } , [ currentNodeId ] )
332321
322+ // When the selectedColumns is empty it measn we dont have any selected columns
323+ // so we need to set the selectedNodeId back to the currentNode.id
324+ // where currentNode derived from currentNodeId if present in nodesMap
325+ // if the currentNode is null we need to set the selectedNodeId to null
333326 React . useEffect ( ( ) => {
334- if (
335- ( selectedColumns . size === 0 && currentNode ?. id !== selectedNodeId ) ||
336- selectedNodeId == null
337- ) {
327+ if ( selectedColumns . size === 0 && selectedNodeId != currentNode ?. id ) {
338328 setSelectedNodeId ( currentNode ?. id || null )
339329 }
340- } , [ selectedColumns , currentNode ?. id , selectedNodeId ] )
330+ } , [ selectedColumns , currentNode ?. id ] )
341331
342332 function toggleColumns ( ) {
343333 setShowColumns ( prev => ! prev )
0 commit comments