-
-
- {filename}
-
- (Read Only)
-
+
+
+
+
+ {filename}
+
+ (Read Only)
+
+ {showFullscreenButton && (
+ )}
+
+
+
+
- ) : (
-
{compactButton}
- )}
- {shouldRenderInlineCode && (
-
- )}
+
);
diff --git a/src/components/shared/ReactFlow/FlowCanvas/TaskNode/TaskOverview/IOSection/IOCell/IOCodeViewer.tsx b/src/components/shared/ReactFlow/FlowCanvas/TaskNode/TaskOverview/IOSection/IOCell/IOCodeViewer.tsx
index c3ec71e2d..39269b3b3 100644
--- a/src/components/shared/ReactFlow/FlowCanvas/TaskNode/TaskOverview/IOSection/IOCell/IOCodeViewer.tsx
+++ b/src/components/shared/ReactFlow/FlowCanvas/TaskNode/TaskOverview/IOSection/IOCell/IOCodeViewer.tsx
@@ -1,3 +1,5 @@
+import { useState } from "react";
+
import { CodeViewer } from "@/components/shared/CodeViewer";
import { safeJsonParse } from "@/utils/string";
@@ -11,6 +13,8 @@ interface IOCodeViewerProps {
}
const IOCodeViewer = ({ title, value }: IOCodeViewerProps) => {
+ const [isFullScreen, setIsFullScreen] = useState(false);
+
const { parsed, isValidJson } = safeJsonParse(value);
if (!isValidJson) {
@@ -29,7 +33,14 @@ const IOCodeViewer = ({ title, value }: IOCodeViewerProps) => {
return (
-
+ setIsFullScreen(false)}
+ onExpand={() => setIsFullScreen(true)}
+ />
);
};
diff --git a/src/components/shared/ReactFlow/FlowCanvas/TaskNode/TaskOverview/TaskOverview.tsx b/src/components/shared/ReactFlow/FlowCanvas/TaskNode/TaskOverview/TaskOverview.tsx
index 7bdb7d43c..840294d24 100644
--- a/src/components/shared/ReactFlow/FlowCanvas/TaskNode/TaskOverview/TaskOverview.tsx
+++ b/src/components/shared/ReactFlow/FlowCanvas/TaskNode/TaskOverview/TaskOverview.tsx
@@ -5,16 +5,15 @@ import {
LogsIcon,
Parentheses,
} from "lucide-react";
+import { useState } from "react";
import type { TooltipButtonProps } from "@/components/shared/Buttons/TooltipButton";
import TooltipButton from "@/components/shared/Buttons/TooltipButton";
+import { CodeViewer } from "@/components/shared/CodeViewer";
import { ComponentDetailsDialog } from "@/components/shared/Dialogs";
import { ComponentFavoriteToggle } from "@/components/shared/FavoriteComponentToggle";
import { StatusIcon } from "@/components/shared/Status";
-import {
- TaskDetails,
- TaskImplementation,
-} from "@/components/shared/TaskDetails";
+import { TaskDetails } from "@/components/shared/TaskDetails";
import { Icon } from "@/components/ui/icon";
import { BlockStack, InlineStack } from "@/components/ui/layout";
import { Tabs, TabsContent, TabsList, TabsTrigger } from "@/components/ui/tabs";
@@ -22,6 +21,7 @@ import { Text } from "@/components/ui/typography";
import { useExecutionDataOptional } from "@/providers/ExecutionDataProvider";
import { type TaskNodeContextType } from "@/providers/TaskNodeProvider";
import { isGraphImplementation } from "@/utils/componentSpec";
+import { componentSpecToText } from "@/utils/yaml";
import ArgumentsSection from "../ArgumentsEditor/ArgumentsSection";
import ConfigurationSection from "./ConfigurationSection";
@@ -38,6 +38,8 @@ interface TaskOverviewProps {
const TaskOverview = ({ taskNode, actions }: TaskOverviewProps) => {
const { name, taskSpec, taskId, state, callbacks } = taskNode;
+ const [isYamlFullscreen, setIsYamlFullscreen] = useState(false);
+
const executionData = useExecutionDataOptional();
const details = executionData?.details;
@@ -65,114 +67,130 @@ const TaskOverview = ({ taskNode, actions }: TaskOverviewProps) => {
...(actions?.map((action) => (
)) ?? []),
-
,
+
setIsYamlFullscreen(true)}
+ key="view-yaml-action"
+ >
+
+ ,
];
return (
-
-
- {isSubgraph && }
-
- {name}
-
- {canRename && }
-
-
- {readOnly && }
-
-
-
-
-
-
- {readOnly ? (
-
- ) : (
-
- )}
- {readOnly ? "Artifacts" : "Arguments"}
-
-
-
- Details
-
+ <>
+
+
+ {isSubgraph && }
+
+ {name}
+
+ {canRename && }
+
+
+ {readOnly && }
+
- {readOnly && !isSubgraph && (
-
-
- Logs
+
+
+
+
+ {readOnly ? (
+
+ ) : (
+
+ )}
+ {readOnly ? "Artifacts" : "Arguments"}
- )}
- {!readOnly && (
-
-
- Configuration
+
+
+ Details
- )}
-
-
-
-
-
- {!readOnly && (
- <>
-
-
-
- >
- )}
- {readOnly && (
-
+
+ Logs
+
+ )}
+ {!readOnly && (
+
+
+ Configuration
+
+ )}
+
+
+
- )}
-
- {readOnly && !isSubgraph && (
-
- {!!executionId && (
-
-
+
+ {!readOnly && (
+ <>
+
-
+
+
+ >
+ )}
+ {readOnly && (
+
)}
-
-
- )}
- {!readOnly && (
-
-
- )}
-
-
-
+ {readOnly && !isSubgraph && (
+
+ {!!executionId && (
+
+
+
+ )}
+
+
+ )}
+ {!readOnly && (
+
+
+
+ )}
+
+
+
+ {isYamlFullscreen && (
+
setIsYamlFullscreen(false)}
+ />
+ )}
+ >
);
};
diff --git a/src/components/shared/ReactFlow/FlowCanvas/TaskNode/TaskOverview/logs.tsx b/src/components/shared/ReactFlow/FlowCanvas/TaskNode/TaskOverview/logs.tsx
index fd028b843..d95d910e2 100644
--- a/src/components/shared/ReactFlow/FlowCanvas/TaskNode/TaskOverview/logs.tsx
+++ b/src/components/shared/ReactFlow/FlowCanvas/TaskNode/TaskOverview/logs.tsx
@@ -18,6 +18,9 @@ const LogDisplay = ({
system_error_exception_full?: string;
};
}) => {
+ const [isLogsFullScreen, setIsLogsFullScreen] = useState(false);
+ const [isErrorsFullScreen, setIsErrorsFullScreen] = useState(false);
+
if (!logs.log_text && !logs.system_error_exception_full) {
return No logs available
;
}
@@ -36,6 +39,9 @@ const LogDisplay = ({
code={logs.log_text || ""}
language="text"
filename="Execution Logs"
+ isFullscreen={isLogsFullScreen}
+ onClose={() => setIsLogsFullScreen(false)}
+ onExpand={() => setIsLogsFullScreen(true)}
/>
)}
@@ -45,6 +51,9 @@ const LogDisplay = ({
code={logs.system_error_exception_full || ""}
language="text"
filename="System Error Logs"
+ isFullscreen={isErrorsFullScreen}
+ onClose={() => setIsErrorsFullScreen(false)}
+ onExpand={() => setIsErrorsFullScreen(true)}
/>