Skip to content

Commit 9c2249b

Browse files
Release (#760)
2 parents 90236a0 + f4b9ef4 commit 9c2249b

File tree

32 files changed

+1499
-237
lines changed

32 files changed

+1499
-237
lines changed

.gitignore

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
# Logs
2-
logs
32
*.log
43
npm-debug.log*
54
yarn-debug.log*

.prettierignore

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
# Logs
2-
logs
32
*.log
43
npm-debug.log*
54
yarn-debug.log*

package.json

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,17 +23,16 @@
2323
]
2424
},
2525
"dependencies": {
26-
"@dagrejs/dagre": "^1.1.4",
2726
"@fontsource/inter": "^5.2.5",
2827
"@hookform/resolvers": "^3.10.0",
2928
"@radix-ui/react-tabs": "^1.1.3",
3029
"@tanstack/react-query": "^5.72.0",
3130
"@tanstack/react-table": "^8.21.2",
32-
"@tisoap/react-flow-smart-edge": "^3.0.0",
3331
"@zenml-io/react-component-library": "^0.23.1",
3432
"awesome-debounce-promise": "^2.1.0",
3533
"class-variance-authority": "^0.7.1",
3634
"clsx": "^2.1.1",
35+
"elkjs": "^0.10.0",
3736
"featureos-widget": "^0.0.32",
3837
"immer": "^10.1.1",
3938
"jwt-decode": "^4.0.0",

pnpm-lock.yaml

Lines changed: 8 additions & 48 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/app/runs/[id]/Dag.tsx

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,17 @@
11
import AlertCircle from "@/assets/icons/alert-circle.svg?react";
2-
32
import { ArtifactNode } from "@/components/dag-visualizer/ArtifactNode";
43
import { DagControls } from "@/components/dag-visualizer/Controls";
4+
import { ElkEdge } from "@/components/dag-visualizer/elk-edge";
55
import { PreviewArtifactNode } from "@/components/dag-visualizer/PreviewArtifact";
66
import { PreviewStepNode } from "@/components/dag-visualizer/PreviewStep";
7-
import { SmoothStepSmart } from "@/components/dag-visualizer/SmartEdge";
87
import { StepNode } from "@/components/dag-visualizer/StepNode";
98
import { EmptyState } from "@/components/EmptyState";
109
import { Spinner } from "@zenml-io/react-component-library/components/server";
1110
import ReactFlow, { NodeTypes } from "reactflow";
1211
import { useDag } from "./useDag";
1312

1413
const customEdge = {
15-
smart: SmoothStepSmart
14+
elk: ElkEdge
1615
};
1716

1817
const customNodes: NodeTypes = {
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
import { EmptyStateLogs } from "@/components/logs/empty-state-logs";
2+
import { FallbackProps } from "react-error-boundary";
3+
4+
export function LogsTabBoundary({ error }: FallbackProps) {
5+
if (!(error instanceof Error)) throw error;
6+
return <EmptyStateLogs title="Error displaying logs" subtitle={error.message} />;
7+
}
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
import { ErrorFallback } from "@/components/Error";
2+
import { EmptyStateLogs } from "@/components/logs/empty-state-logs";
3+
import { EnhancedLogsViewer } from "@/components/logs/enhanced-log-viewer";
4+
import { LoadingLogs } from "@/components/logs/loading-logs";
5+
import { useRunLogs } from "@/data/pipeline-runs/run-logs";
6+
import { parseLogString } from "@/lib/logs";
7+
import { useMemo } from "react";
8+
import { useParams } from "react-router-dom";
9+
10+
export function LogTab() {
11+
const { runId } = useParams() as {
12+
runId: string;
13+
};
14+
15+
const runLogs = useRunLogs({ runId });
16+
17+
// Parse the log string into LogEntry objects for our enhanced viewer
18+
const parsedLogs = useMemo(() => {
19+
if (!runLogs.data) return [];
20+
return parseLogString(runLogs.data);
21+
}, [runLogs.data]);
22+
23+
if (runLogs.isPending) return <LoadingLogs />;
24+
25+
if (runLogs.isError) {
26+
return <ErrorFallback err={runLogs.error} />;
27+
}
28+
29+
const logs = runLogs.data;
30+
31+
if (!logs) {
32+
return (
33+
<EmptyStateLogs
34+
title="This pipeline run has no logs"
35+
subtitle="It looks like there are no logs associated with this pipeline run"
36+
/>
37+
);
38+
}
39+
40+
return (
41+
<div className="h-full w-full">
42+
<EnhancedLogsViewer logs={parsedLogs} />
43+
</div>
44+
);
45+
}

src/app/runs/[id]/_Tabs/index.tsx

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import MetadataIcon from "@/assets/icons/code-square.svg?react";
22
import Collapse from "@/assets/icons/collapse.svg?react";
33
import Info from "@/assets/icons/info.svg?react";
4+
import Logs from "@/assets/icons/logs.svg?react";
45
import Stack from "@/assets/icons/stack.svg?react";
56
import Tools from "@/assets/icons/tool.svg?react";
67
import {
@@ -17,6 +18,9 @@ import { MetadataTab } from "./Metadata";
1718
import { OverviewTab } from "./Overview";
1819
import { useSelectedTab } from "./service";
1920
import { StackTab } from "./Stack";
21+
import { LogTab } from "./LogTab/logs";
22+
import { ErrorBoundary } from "react-error-boundary";
23+
import { LogsTabBoundary } from "./LogTab/boundary";
2024

2125
type TabsHeaderProps = {
2226
setIsPanelOpen: Dispatch<SetStateAction<boolean>>;
@@ -58,6 +62,10 @@ export function RunsDetailTabs() {
5862
<Stack className="h-5 w-5 shrink-0 fill-theme-text-tertiary group-data-[state=active]/trigger:fill-theme-surface-strong" />
5963
<span>Stack</span>
6064
</TabsTrigger>
65+
<TabsTrigger className="flex items-center gap-2 truncate text-text-md" value="logs">
66+
<Logs className="h-5 w-5 shrink-0 fill-theme-text-tertiary group-data-[state=active]/trigger:fill-theme-surface-strong" />
67+
<span>Logs</span>
68+
</TabsTrigger>
6169
<TabsTrigger
6270
className="flex items-center gap-2 truncate text-text-md"
6371
value="configuration"
@@ -77,6 +85,11 @@ export function RunsDetailTabs() {
7785
<TabsContent className="m-0 mt-5 border-0 bg-transparent p-0" value="stack">
7886
<StackTab />
7987
</TabsContent>
88+
<TabsContent className="m-0 mt-5 border-0 bg-transparent p-0" value="logs">
89+
<ErrorBoundary fallbackRender={LogsTabBoundary}>
90+
<LogTab />
91+
</ErrorBoundary>
92+
</TabsContent>
8093
<TabsContent className="m-0 mt-5 border-0 bg-transparent p-0" value="configuration">
8194
<ConfigurationTab />
8295
</TabsContent>

src/app/runs/[id]/_Tabs/service.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import { z } from "zod";
33

44
const tabParamSchema = z.object({
55
tab: z
6-
.enum(["overview", "configuration", "metadata", "stack"])
6+
.enum(["overview", "configuration", "metadata", "stack", "logs"])
77
.optional()
88
.default("overview")
99
.catch("overview")

src/app/runs/[id]/useDag.tsx

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,8 @@ export function useDag() {
1515
const dagQuery = usePipelineRunDag(
1616
{ runId },
1717
{
18-
refetchInterval: (e) => (e.state.data?.status === "running" ? 3000 : false)
18+
refetchInterval: (e) =>
19+
e.state.data?.status === "running" || e.state.data?.status === "initializing" ? 3000 : false
1920
}
2021
);
2122

@@ -43,12 +44,12 @@ export function useDag() {
4344
const calcDagLayout = useCallback(() => {
4445
if (!dagQuery.data) return;
4546
const nodes = computeNodes(dagQuery.data.nodes, dagQuery.data.status);
46-
const { nodes: layoutedNodes, edges: layoutedEdges } = getLayoutedItems(
47-
nodes,
48-
dagQuery.data.edges
47+
getLayoutedItems(nodes, dagQuery.data.edges).then(
48+
({ nodes: layoutedNodes, edges: layoutedEdges }) => {
49+
setNodes(layoutedNodes);
50+
setEdges(layoutedEdges);
51+
}
4952
);
50-
setNodes(layoutedNodes);
51-
setEdges(layoutedEdges);
5253
}, [dagQuery.data, setNodes, setEdges]);
5354

5455
useEffect(() => {

0 commit comments

Comments
 (0)