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