From 81695ad60924860fcee16ab7c9daded317c85bcb Mon Sep 17 00:00:00 2001 From: Aagya-Sharma Date: Thu, 7 Nov 2024 16:39:43 +0545 Subject: [PATCH 1/3] feat:copy button in artifact and step node --- .../dag-visualizer/ArtifactNode.tsx | 10 +++- .../dag-visualizer/NodeCopyButton.tsx | 52 +++++++++++++++++++ src/components/dag-visualizer/StepNode.tsx | 11 +++- 3 files changed, 71 insertions(+), 2 deletions(-) create mode 100644 src/components/dag-visualizer/NodeCopyButton.tsx diff --git a/src/components/dag-visualizer/ArtifactNode.tsx b/src/components/dag-visualizer/ArtifactNode.tsx index 89570f45d..1ca93d319 100644 --- a/src/components/dag-visualizer/ArtifactNode.tsx +++ b/src/components/dag-visualizer/ArtifactNode.tsx @@ -4,6 +4,7 @@ import { NodeProps, useStore } from "reactflow"; import { ArtifactIcon } from "../ArtifactIcon"; import { ArtifactSheet } from "../artifacts/artifact-node-sheet"; import { BaseNode } from "./BaseNode"; +import { CopyNodeButton } from "./NodeCopyButton"; export function ArtifactNode({ data, selected }: NodeProps) { const { unselectNodesAndEdges } = useStore((state) => ({ @@ -30,7 +31,7 @@ export function ArtifactNode({ data, selected }: NodeProps diff --git a/src/components/dag-visualizer/NodeCopyButton.tsx b/src/components/dag-visualizer/NodeCopyButton.tsx new file mode 100644 index 000000000..024f2e106 --- /dev/null +++ b/src/components/dag-visualizer/NodeCopyButton.tsx @@ -0,0 +1,52 @@ +import Copy from "@/assets/icons/copy.svg?react"; +import { useState } from "react"; +import { + Tooltip, + TooltipContent, + TooltipProvider, + TooltipTrigger +} from "@zenml-io/react-component-library/components/client"; + +export function CopyNodeButton({ code, type }: { code: string; type: string }) { + const [copied, setCopied] = useState(false); + const [tooltipOpen, setTooltipOpen] = useState(false); + + function copyToClipboard(code: string) { + if (navigator.clipboard) { + navigator.clipboard.writeText(code); + setCopied(true); + setTooltipOpen(true); + + setTimeout(() => { + setTooltipOpen(false); + setCopied(false); + }, 2000); + } + } + return ( + + + +
+
{ + e.stopPropagation(); // Prevent the click event from bubbling up + copyToClipboard(code); + }} + > + +
+
+
+ + {copied ? "Copied!" : `Copy code to load ${type}`} + +
+
+ ); +} diff --git a/src/components/dag-visualizer/StepNode.tsx b/src/components/dag-visualizer/StepNode.tsx index 181270c82..a84fba63e 100644 --- a/src/components/dag-visualizer/StepNode.tsx +++ b/src/components/dag-visualizer/StepNode.tsx @@ -4,6 +4,8 @@ import { NodeProps, ReactFlowState, useStore } from "reactflow"; import { BaseNode } from "./BaseNode"; import { StepSheet } from "../steps/step-sheet"; import { ExecutionStatusIcon, getExecutionStatusBackgroundColor } from "../ExecutionStatus"; +import { CopyNodeButton } from "./NodeCopyButton"; +import { useParams } from "react-router-dom"; const selector = (state: ReactFlowState) => ({ unselectAll: state.unselectNodesAndEdges @@ -11,6 +13,7 @@ const selector = (state: ReactFlowState) => ({ export function StepNode({ data, selected }: NodeProps) { const { unselectAll } = useStore(selector); + const { runId } = useParams() as { runId: string }; function openChangeHandler(isOpen: boolean) { if (!isOpen) { @@ -28,7 +31,7 @@ export function StepNode({ data, selected }: NodeProps) { From 5db4b5088d15a87c633e23a64f5e77b2fff7f41a Mon Sep 17 00:00:00 2001 From: Cahllagerfeld <43843195+Cahllagerfeld@users.noreply.github.com> Date: Mon, 11 Nov 2024 11:48:41 +0000 Subject: [PATCH 2/3] fix: more changes --- .../dag-visualizer/ArtifactNode.tsx | 11 ++++-- .../dag-visualizer/NodeCopyButton.tsx | 37 ++++++++++--------- src/components/dag-visualizer/StepNode.tsx | 20 +++++----- 3 files changed, 38 insertions(+), 30 deletions(-) diff --git a/src/components/dag-visualizer/ArtifactNode.tsx b/src/components/dag-visualizer/ArtifactNode.tsx index 1ca93d319..742607844 100644 --- a/src/components/dag-visualizer/ArtifactNode.tsx +++ b/src/components/dag-visualizer/ArtifactNode.tsx @@ -1,5 +1,5 @@ +import Copy from "@/assets/icons/copy.svg?react"; import { ArtifactVersion } from "@/types/artifact-versions"; - import { NodeProps, useStore } from "reactflow"; import { ArtifactIcon } from "../ArtifactIcon"; import { ArtifactSheet } from "../artifacts/artifact-node-sheet"; @@ -31,7 +31,7 @@ export function ArtifactNode({ data, selected }: NodeProps diff --git a/src/components/dag-visualizer/NodeCopyButton.tsx b/src/components/dag-visualizer/NodeCopyButton.tsx index 024f2e106..39390997a 100644 --- a/src/components/dag-visualizer/NodeCopyButton.tsx +++ b/src/components/dag-visualizer/NodeCopyButton.tsx @@ -1,13 +1,18 @@ -import Copy from "@/assets/icons/copy.svg?react"; -import { useState } from "react"; +import { HTMLAttributes, useState } from "react"; import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from "@zenml-io/react-component-library/components/client"; +import { cn } from "@zenml-io/react-component-library/utilities"; -export function CopyNodeButton({ code, type }: { code: string; type: string }) { +export function CopyNodeButton({ + className, + code, + type, + ...rest +}: HTMLAttributes & { code: string; type: "artifact" | "step" }) { const [copied, setCopied] = useState(false); const [tooltipOpen, setTooltipOpen] = useState(false); @@ -27,21 +32,17 @@ export function CopyNodeButton({ code, type }: { code: string; type: string }) { -
-
{ - e.stopPropagation(); // Prevent the click event from bubbling up - copyToClipboard(code); - }} - > - -
-
+
{ + e.stopPropagation(); // Prevent the click event from bubbling up + copyToClipboard(code); + }} + >
{copied ? "Copied!" : `Copy code to load ${type}`} diff --git a/src/components/dag-visualizer/StepNode.tsx b/src/components/dag-visualizer/StepNode.tsx index a84fba63e..a53509e24 100644 --- a/src/components/dag-visualizer/StepNode.tsx +++ b/src/components/dag-visualizer/StepNode.tsx @@ -1,11 +1,11 @@ +import Copy from "@/assets/icons/copy.svg?react"; import { Step } from "@/types/steps"; import { clsx } from "clsx"; import { NodeProps, ReactFlowState, useStore } from "reactflow"; -import { BaseNode } from "./BaseNode"; -import { StepSheet } from "../steps/step-sheet"; import { ExecutionStatusIcon, getExecutionStatusBackgroundColor } from "../ExecutionStatus"; +import { StepSheet } from "../steps/step-sheet"; +import { BaseNode } from "./BaseNode"; import { CopyNodeButton } from "./NodeCopyButton"; -import { useParams } from "react-router-dom"; const selector = (state: ReactFlowState) => ({ unselectAll: state.unselectNodesAndEdges @@ -13,7 +13,6 @@ const selector = (state: ReactFlowState) => ({ export function StepNode({ data, selected }: NodeProps) { const { unselectAll } = useStore(selector); - const { runId } = useParams() as { runId: string }; function openChangeHandler(isOpen: boolean) { if (!isOpen) { @@ -27,11 +26,10 @@ export function StepNode({ data, selected }: NodeProps) { return ( - {/* TODO check shadow in design system */} From dff72b811f19f5cc1594032dcc1e53af81f0d70f Mon Sep 17 00:00:00 2001 From: Cahllagerfeld <43843195+Cahllagerfeld@users.noreply.github.com> Date: Mon, 11 Nov 2024 12:57:52 +0000 Subject: [PATCH 3/3] fix: Code --- src/components/dag-visualizer/ArtifactNode.tsx | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/components/dag-visualizer/ArtifactNode.tsx b/src/components/dag-visualizer/ArtifactNode.tsx index 742607844..1aa0361be 100644 --- a/src/components/dag-visualizer/ArtifactNode.tsx +++ b/src/components/dag-visualizer/ArtifactNode.tsx @@ -52,9 +52,9 @@ export function ArtifactNode({ data, selected }: NodeProps