11import React from 'react'
22
3- import { Focus , LockOpen , Lock , Rows2 , Rows3 } from 'lucide-react'
3+ import { Focus , Rows2 , Rows3 } from 'lucide-react'
44
55import {
66 type LineageNode ,
@@ -78,9 +78,11 @@ export const ModelLineage = ({
7878 ? toNodeID < ModelNodeId > ( selectedModelName )
7979 : null
8080
81+ // Store all nodes to keep track of the position and to reuse nodes
82+ const allNodesMap = React . useRef < LineageNodesMap < NodeData , ModelNodeId > > ( { } )
83+
8184 const [ zoom , setZoom ] = React . useState ( ZOOM_THRESHOLD )
8285 const [ isBuildingLayout , setIsBuildingLayout ] = React . useState ( false )
83- const [ nodesDraggable , setNodesDraggable ] = React . useState ( false )
8486 const [ edges , setEdges ] = React . useState <
8587 LineageEdge <
8688 EdgeData ,
@@ -153,14 +155,15 @@ export const ModelLineage = ({
153155 tags : detail . tags || [ ] ,
154156 columns,
155157 } )
158+
156159 const selectedColumnsCount = new Set (
157160 Object . keys ( columns ?? { } ) . map ( k => toPortID ( detail . name , k ) ) ,
158161 ) . intersection ( selectedColumns ) . size
159162 // We are trying to project the node hight so we are including the ceiling and floor heights
160163 const nodeBaseHeight = calculateNodeBaseHeight ( {
161164 includeNodeFooterHeight : false ,
162165 includeCeilingHeight : true ,
163- includeFloorHeight : true ,
166+ includeFloorHeight : false ,
164167 } )
165168 const nodeDetailsHeight = calculateNodeDetailsHeight ( {
166169 nodeDetailsCount : 0 ,
@@ -193,7 +196,7 @@ export const ModelLineage = ({
193196 ModelLineageNodeDetails ,
194197 NodeData ,
195198 ModelNodeId
196- > ( adjacencyListKeys , lineageDetails , transformNode )
199+ > ( adjacencyListKeys , lineageDetails , transformNode , allNodesMap . current )
197200 } , [ adjacencyListKeys , lineageDetails , transformNode ] )
198201
199202 const transformEdge = React . useCallback (
@@ -293,7 +296,10 @@ export const ModelLineage = ({
293296 ModelColumnLeftHandleId
294297 > [ ] ,
295298 nds : LineageNodesMap < NodeData , ModelNodeId > ,
299+ buildingLayoutId : NodeJS . Timeout ,
296300 ) => {
301+ clearTimeout ( buildingLayoutId )
302+
297303 const layoutNodesMap = buildLayout <
298304 NodeData ,
299305 EdgeData ,
@@ -304,19 +310,22 @@ export const ModelLineage = ({
304310 ModelColumnLeftHandleId
305311 > ( { edges : eds , nodesMap : nds } )
306312
313+ allNodesMap . current = { ...allNodesMap . current , ...layoutNodesMap }
314+
307315 setEdges ( eds )
308316 setNodesMap ( layoutNodesMap )
309317 setIsBuildingLayout ( false )
310318 } ,
311- [ ] ,
319+ [ allNodesMap . current ] ,
312320 )
313321
314322 const nodes = React . useMemo ( ( ) => {
315323 return Object . values ( nodesMap )
316324 } , [ nodesMap ] )
317325
318- const currentNode = currentNodeId ? nodesMap [ currentNodeId ] : null
319- const selectedNode = selectedNodeId ? nodesMap [ selectedNodeId ] : null
326+ const selectedNode = selectedNodeId
327+ ? allNodesMap . current [ selectedNodeId ]
328+ : null
320329
321330 const handleReset = React . useCallback ( ( ) => {
322331 setShowColumns ( false )
@@ -325,12 +334,14 @@ export const ModelLineage = ({
325334 setShowOnlySelectedNodes ( false )
326335 setSelectedNodes ( new Set ( ) )
327336 setSelectedEdges ( new Set ( ) )
328- setSelectedNodeId ( null )
337+ setSelectedNodeId ( currentNodeId )
329338 setColumnLevelLineage ( new Map ( ) )
330- } , [ ] )
339+ } , [ currentNodeId ] )
331340
332341 React . useEffect ( ( ) => {
333- setIsBuildingLayout ( true )
342+ const buildingLayoutId = setTimeout ( ( ) => {
343+ setIsBuildingLayout ( true )
344+ } , 500 )
334345
335346 if ( showOnlySelectedNodes ) {
336347 const onlySelectedNodesMap = getOnlySelectedNodes < NodeData , ModelNodeId > (
@@ -340,27 +351,15 @@ export const ModelLineage = ({
340351 const onlySelectedEdges = transformedEdges . filter ( edge =>
341352 selectedEdges . has ( edge . id as ModelEdgeId ) ,
342353 )
343- calculateLayout ( onlySelectedEdges , onlySelectedNodesMap )
354+ calculateLayout ( onlySelectedEdges , onlySelectedNodesMap , buildingLayoutId )
344355 } else {
345- calculateLayout ( transformedEdges , transformedNodesMap )
356+ calculateLayout ( transformedEdges , transformedNodesMap , buildingLayoutId )
346357 }
347358 } , [ showOnlySelectedNodes , transformedEdges , transformedNodesMap ] )
348359
349- // currentNodeId is passed from the parent component
350- // we it change we need to reset the selectedNodeId
351- React . useEffect ( ( ) => {
352- setSelectedNodeId ( currentNodeId )
353- } , [ currentNodeId ] )
354-
355- // When the selectedColumns is empty it measn we dont have any selected columns
356- // so we need to set the selectedNodeId back to the currentNode.id
357- // where currentNode derived from currentNodeId if present in nodesMap
358- // if the currentNode is null we need to set the selectedNodeId to null
359360 React . useEffect ( ( ) => {
360- if ( selectedColumns . size === 0 && selectedNodeId != currentNode ?. id ) {
361- setSelectedNodeId ( currentNode ?. id || null )
362- }
363- } , [ selectedColumns , currentNode ?. id ] )
361+ handleReset ( )
362+ } , [ handleReset ] )
364363
365364 function toggleColumns ( ) {
366365 setShowColumns ( prev => ! prev )
@@ -380,7 +379,6 @@ export const ModelLineage = ({
380379 selectedNodeId,
381380 selectedNode,
382381 currentNodeId,
383- currentNode,
384382 zoom,
385383 edges,
386384 nodes,
@@ -414,7 +412,6 @@ export const ModelLineage = ({
414412 onNodeClick = { onNodeClick }
415413 isBuildingLayout = { isBuildingLayout }
416414 showControlOnlySelectedNodes = { selectedColumns . size === 0 }
417- nodesDraggable = { nodesDraggable }
418415 controls = {
419416 < >
420417 < LineageControlButton
@@ -435,13 +432,6 @@ export const ModelLineage = ({
435432 >
436433 < LineageControlIcon Icon = { Focus } />
437434 </ LineageControlButton >
438- < LineageControlButton
439- text = { nodesDraggable ? 'Lock nodes' : 'Unlock nodes' }
440- onClick = { ( ) => setNodesDraggable ( prev => ! prev ) }
441- disabled = { isBuildingLayout }
442- >
443- < LineageControlIcon Icon = { nodesDraggable ? Lock : LockOpen } />
444- </ LineageControlButton >
445435 </ >
446436 }
447437 />
0 commit comments