1+ import AlertCircle from "@/assets/icons/alert-circle.svg?react" ;
2+
13import { ArtifactNode } from "@/components/dag-visualizer/ArtifactNode" ;
4+ import { DagControls } from "@/components/dag-visualizer/Controls" ;
5+ import { PreviewArtifactNode } from "@/components/dag-visualizer/PreviewArtifact" ;
6+ import { PreviewStepNode } from "@/components/dag-visualizer/PreviewStep" ;
27import { SmoothStepSmart } from "@/components/dag-visualizer/SmartEdge" ;
38import { StepNode } from "@/components/dag-visualizer/StepNode" ;
4- import { getLayoutedNodes } from "@/components/dag-visualizer/layout" ;
5- import { usePipelineRunGraph } from "@/data/pipeline-runs/pipeline-run-graph-query" ;
6- import { Spinner } from "@zenml-io/react-component-library" ;
7- import { useCallback , useEffect , useLayoutEffect } from "react" ;
8- import { useParams } from "react-router-dom" ;
9- import ReactFlow , {
10- NodeTypes ,
11- useEdgesState ,
12- useNodesState ,
13- useReactFlow ,
14- useStore
15- } from "reactflow" ;
16- import { DagControls } from "@/components/dag-visualizer/Controls" ;
9+ import { EmptyState } from "@/components/EmptyState" ;
10+ import { Spinner } from "@zenml-io/react-component-library/components/server" ;
11+ import ReactFlow , { NodeTypes } from "reactflow" ;
12+ import { useDag } from "./useDag" ;
1713
1814const customNodes : NodeTypes = {
1915 step : StepNode ,
20- artifact : ArtifactNode
16+ artifact : ArtifactNode ,
17+ previewStep : PreviewStepNode ,
18+ previewArtifact : PreviewArtifactNode
2119} ;
2220
2321const customEdge = {
2422 smart : SmoothStepSmart
2523} ;
2624
2725export function DAG ( ) {
28- const { runId } = useParams ( ) as { runId : string } ;
29- const { data, isPending, isError } = usePipelineRunGraph ( { runId } ) ;
30-
31- const { fitView } = useReactFlow ( ) ;
32- const { width, height } = useStore ( ( state ) => ( { width : state . width , height : state . height } ) ) ;
33-
34- const [ nodes , setNodes , onNodesChange ] = useNodesState ( [ ] ) ;
35- const [ edges , setEdges , onEdgesChange ] = useEdgesState ( [ ] ) ;
36-
37- const onDagreLayout = useCallback ( ( ) => {
38- const layouted = getLayoutedNodes ( data ?. nodes , data ?. edges ) ;
39-
40- setNodes ( [ ...layouted . nodes ] ) ;
41- setEdges ( [ ...layouted . edges ] ) ;
26+ const { pipelineDeployment, pipelineRun, nodes, edges, onEdgesChange, onNodesChange } = useDag ( ) ;
4227
43- window . requestAnimationFrame ( ( ) => {
44- fitView ( ) ;
45- } ) ;
46- } , [ data ?. nodes , data ?. edges ] ) ;
47-
48- useEffect ( ( ) => {
49- fitView ( ) ; // Keep an eye on performance here
50- } , [ width , height ] ) ;
51-
52- useEffect ( ( ) => {
53- const timeout = setTimeout ( ( ) => {
54- fitView ( { duration : 200 } ) ;
55- } , 100 ) ;
56- return ( ) => {
57- clearTimeout ( timeout ) ;
58- } ;
59- } , [ data ] ) ;
60-
61- useLayoutEffect ( ( ) => {
62- onDagreLayout ( ) ;
63- } , [ data ?. nodes , data ?. edges , onDagreLayout ] ) ;
64-
65- if ( isError ) return null ;
28+ if ( pipelineRun . isError || pipelineDeployment . isError ) {
29+ return (
30+ < EmptyState icon = { < AlertCircle className = "h-[120px] w-[120px] fill-neutral-300" /> } >
31+ < p className = "text-center" > There was an error loading the DAG visualization.</ p >
32+ </ EmptyState >
33+ ) ;
34+ }
6635
67- if ( isPending ) {
36+ if ( pipelineRun . isPending || pipelineDeployment . isPending ) {
6837 return (
6938 < div className = "flex h-full flex-col items-center justify-center" >
7039 < Spinner />
@@ -91,7 +60,12 @@ export function DAG() {
9160 onEdgesChange = { onEdgesChange }
9261 fitView
9362 >
94- < DagControls runId = { runId } />
63+ < DagControls
64+ refetch = { ( ) => {
65+ pipelineRun . refetch ( ) ;
66+ pipelineDeployment . refetch ( ) ;
67+ } }
68+ />
9569 </ ReactFlow >
9670 ) ;
9771}
0 commit comments