From 1bccc0a43aff7ce78c873911e433b5c570b40873 Mon Sep 17 00:00:00 2001 From: Camiel van Schoonhoven Date: Tue, 9 Dec 2025 10:37:48 -0800 Subject: [PATCH] Cleanup RunDetails --- .../Editor/Context/PipelineDetails.tsx | 2 +- .../PipelineRun/RunDetails.test.tsx | 6 +- src/components/PipelineRun/RunDetails.tsx | 204 +++++++----------- .../shared/ArtifactsList/ArtifactsList.tsx | 103 --------- .../PipelineIO.tsx | 0 5 files changed, 88 insertions(+), 227 deletions(-) delete mode 100644 src/components/shared/ArtifactsList/ArtifactsList.tsx rename src/components/shared/{ArtifactsList => Execution}/PipelineIO.tsx (100%) diff --git a/src/components/Editor/Context/PipelineDetails.tsx b/src/components/Editor/Context/PipelineDetails.tsx index 20aecef28..9bcc91417 100644 --- a/src/components/Editor/Context/PipelineDetails.tsx +++ b/src/components/Editor/Context/PipelineDetails.tsx @@ -13,7 +13,7 @@ import { useComponentSpec } from "@/providers/ComponentSpecProvider"; import { getComponentFileFromList } from "@/utils/componentStore"; import { USER_PIPELINES_LIST_NAME } from "@/utils/constants"; -import PipelineIO from "../../shared/ArtifactsList/PipelineIO"; +import PipelineIO from "../../shared/Execution/PipelineIO"; import { PipelineValidationList } from "./PipelineValidationList"; import RenamePipeline from "./RenamePipeline"; diff --git a/src/components/PipelineRun/RunDetails.test.tsx b/src/components/PipelineRun/RunDetails.test.tsx index 19b33c511..8c82c7b23 100644 --- a/src/components/PipelineRun/RunDetails.test.tsx +++ b/src/components/PipelineRun/RunDetails.test.tsx @@ -17,6 +17,8 @@ import * as executionService from "@/services/executionService"; import type { ComponentSpec } from "@/utils/componentSpec"; import { RunDetails } from "./RunDetails"; +import { ContextPanelProvider } from "@/providers/ContextPanelProvider"; +import { ReactFlowProvider } from "@xyflow/react"; // Mock the hooks and services vi.mock("@tanstack/react-router", async (importOriginal) => { @@ -181,7 +183,9 @@ describe("", () => { - {children} + + {children} + diff --git a/src/components/PipelineRun/RunDetails.tsx b/src/components/PipelineRun/RunDetails.tsx index 5fe164ad7..9e7cc0a5d 100644 --- a/src/components/PipelineRun/RunDetails.tsx +++ b/src/components/PipelineRun/RunDetails.tsx @@ -1,9 +1,5 @@ -import { Frown } from "lucide-react"; - -import { ArtifactsList } from "@/components/shared/ArtifactsList/ArtifactsList"; import { CopyText } from "@/components/shared/CopyText/CopyText"; import { BlockStack, InlineStack } from "@/components/ui/layout"; -import { Spinner } from "@/components/ui/spinner"; import { Text } from "@/components/ui/typography"; import { useCheckComponentSpecFromPath } from "@/hooks/useCheckComponentSpecFromPath"; import { useUserDetails } from "@/hooks/useUserDetails"; @@ -17,7 +13,16 @@ import { isStatusInProgress, } from "@/services/executionService"; +import { + ActionBlock, + type ActionOrReactNode, +} from "../shared/ContextPanel/Blocks/ActionBlock"; +import { ContentBlock } from "../shared/ContextPanel/Blocks/ContentBlock"; +import { ListBlock } from "../shared/ContextPanel/Blocks/ListBlock"; +import { TextBlock } from "../shared/ContextPanel/Blocks/TextBlock"; +import PipelineIO from "../shared/Execution/PipelineIO"; import { InfoBox } from "../shared/InfoBox"; +import { LoadingScreen } from "../shared/LoadingScreen"; import { StatusBar, StatusText } from "../shared/Status"; import { TaskImplementation } from "../shared/TaskDetails"; import { CancelPipelineRunButton } from "./components/CancelPipelineRunButton"; @@ -52,29 +57,25 @@ export const RunDetails = () => { if (error || !details || !state || !componentSpec) { return ( -
- -
- Error loading run details. -
-
+ + + Pipeline Run could not be loaded. + + ); } if (isLoading) { - return ( -
- -

Loading run details...

-
- ); + return ; } if (!configured) { return ( - - Configure a backend to view execution artifacts. - + + + Configure a backend to view execution artifacts. + + ); } @@ -86,93 +87,71 @@ export const RunDetails = () => { const annotations = componentSpec.metadata?.annotations || {}; + const actions: ActionOrReactNode[] = []; + + actions.push( + , + ); + + if (canAccessEditorSpec && componentSpec.name) { + actions.push( + , + ); + } + + actions.push( + , + ); + + if (isInProgress && isRunCreator) { + actions.push(); + } + + if (isComplete) { + actions.push( + , + ); + } + return ( {componentSpec.name ?? "Unnamed Pipeline"} - - - {canAccessEditorSpec && componentSpec.name && ( - - )} - - {isInProgress && isRunCreator && ( - - )} - {isComplete && } - + {metadata && ( - - - Run Info - -
- {metadata.id && ( - - - Run Id: - -
- - {metadata.id} - -
-
- )} - {metadata.root_execution_id && ( - - - Execution Id: - -
- - {metadata.root_execution_id} - -
-
- )} - {metadata.created_by && ( - - - Created by: - -
{metadata.created_by}
-
- )} - {metadata.created_at && ( - - - Created at: - -
{new Date(metadata.created_at).toLocaleString()}
-
- )} -
-
+ )} {componentSpec.description && ( - - - Description - - - {componentSpec.description} - - + )} - - - Status - + {runStatus} @@ -180,39 +159,20 @@ export const RunDetails = () => { - + {Object.keys(annotations).length > 0 && ( - - - Annotations - -
    - {Object.entries(annotations).map(([key, value]) => ( -
  • - - {key}: - {" "} - - {String(value)} - -
  • - ))} -
-
+ ({ + label: key, + value: String(value), + }))} + marker="none" + /> )} - ({ - name: input.name, - type: typeof input.type === "string" ? input.type : "object", - value: input.value ?? input.default, - }))} - outputs={(componentSpec.outputs ?? []).map((output) => ({ - name: output.name, - type: typeof output.type === "string" ? output.type : "object", - }))} - /> +
); }; diff --git a/src/components/shared/ArtifactsList/ArtifactsList.tsx b/src/components/shared/ArtifactsList/ArtifactsList.tsx deleted file mode 100644 index 726ad4e64..000000000 --- a/src/components/shared/ArtifactsList/ArtifactsList.tsx +++ /dev/null @@ -1,103 +0,0 @@ -import { type ReactNode } from "react"; - -import { CopyText } from "@/components/shared/CopyText/CopyText"; -import { BlockStack, InlineStack } from "@/components/ui/layout"; -import { Text } from "@/components/ui/typography"; - -interface ArtifactItem { - name: string; - type: string; - value?: string; - actions?: ReactNode; -} - -interface ArtifactsSectionProps { - title: string; - items: ArtifactItem[]; - emptyMessage?: string; - disableCopy?: boolean; -} - -const ArtifactsSection = ({ - title, - items, - emptyMessage = "None", - disableCopy = false, -}: ArtifactsSectionProps) => ( - - - {title} - - {items.length > 0 ? ( - - {items.map((item) => ( - - - - {item.name}: - - {item.value !== undefined ? ( - !disableCopy ? ( - - {item.value || "No value"} - - ) : ( - - {item.value || "No value"} - - ) - ) : ( - - — - - )} - - - {item.type} - - {item.actions} - - ))} - - ) : ( - - {emptyMessage} - - )} - -); - -interface ArtifactsListProps { - inputs: ArtifactItem[]; - outputs: ArtifactItem[]; -} - -export const ArtifactsList = ({ inputs, outputs }: ArtifactsListProps) => ( - - - Artifacts - - - - - - -); diff --git a/src/components/shared/ArtifactsList/PipelineIO.tsx b/src/components/shared/Execution/PipelineIO.tsx similarity index 100% rename from src/components/shared/ArtifactsList/PipelineIO.tsx rename to src/components/shared/Execution/PipelineIO.tsx