diff --git a/src/components/Editor/Context/PipelineDetails.tsx b/src/components/Editor/Context/PipelineDetails.tsx
index 4436d4d44..f24a7b595 100644
--- a/src/components/Editor/Context/PipelineDetails.tsx
+++ b/src/components/Editor/Context/PipelineDetails.tsx
@@ -12,7 +12,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.tsx b/src/components/PipelineRun/RunDetails.tsx
index 617facaac..6e94efa4b 100644
--- a/src/components/PipelineRun/RunDetails.tsx
+++ b/src/components/PipelineRun/RunDetails.tsx
@@ -1,10 +1,7 @@
-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 { Paragraph, Text } from "@/components/ui/typography";
import { useCheckComponentSpecFromPath } from "@/hooks/useCheckComponentSpecFromPath";
import { useUserDetails } from "@/hooks/useUserDetails";
import { useBackend } from "@/providers/BackendProvider";
@@ -17,6 +14,14 @@ 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 { StatusBar, StatusText } from "../shared/Status";
import { TaskImplementation } from "../shared/TaskDetails";
@@ -52,29 +57,30 @@ 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...
-
+ Loading run details...
+
);
}
if (!configured) {
return (
-
- Configure a backend to view execution artifacts.
-
+
+
+ Configure a backend to view execution artifacts.
+
+
);
}
@@ -86,93 +92,67 @@ 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 +160,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