diff --git a/.changeset/custom-tooltip.md b/.changeset/custom-tooltip.md new file mode 100644 index 00000000..8b50ae77 --- /dev/null +++ b/.changeset/custom-tooltip.md @@ -0,0 +1,5 @@ +--- +"@serverlessworkflow/diagram-editor": minor +--- + +Implementation of tooltip diff --git a/packages/serverless-workflow-diagram-editor/src/components/ui/shadcn.css b/packages/serverless-workflow-diagram-editor/src/components/ui/shadcn.css index a38626eb..6da3b320 100644 --- a/packages/serverless-workflow-diagram-editor/src/components/ui/shadcn.css +++ b/packages/serverless-workflow-diagram-editor/src/components/ui/shadcn.css @@ -25,6 +25,10 @@ */ .dec-root { + --tooltip-background: hsl(0 0% 100%); + + --tooltip-foreground: hsl(222.2 84% 4.9%); + --sidebar: hsl(0 0% 98%); --sidebar-foreground: hsl(240 5.3% 26.1%); @@ -43,6 +47,10 @@ } .dec-root.dark { + --tooltip-background: hsl(222.2 84% 4.9%); + + --tooltip-foreground: hsl(210 40% 98%); + --sidebar: #2d3748; --sidebar-foreground: hsl(240 4.8% 95.9%); @@ -61,6 +69,10 @@ } @theme inline { + --color-tooltip-background: var(--tooltip-background); + + --color-tooltip-foreground: var(--tooltip-foreground); + --color-sidebar: var(--sidebar); --color-sidebar-foreground: var(--sidebar-foreground); diff --git a/packages/serverless-workflow-diagram-editor/src/components/ui/tooltip.tsx b/packages/serverless-workflow-diagram-editor/src/components/ui/tooltip.tsx index 47e56629..30b4a570 100644 --- a/packages/serverless-workflow-diagram-editor/src/components/ui/tooltip.tsx +++ b/packages/serverless-workflow-diagram-editor/src/components/ui/tooltip.tsx @@ -46,19 +46,23 @@ function TooltipContent({ children, ...props }: React.ComponentProps) { + const [container, setContainer] = React.useState(); + React.useEffect(() => { + setContainer(document.querySelector(".dec-root") ?? undefined); + }, []); return ( - + {children} - + ); diff --git a/packages/serverless-workflow-diagram-editor/src/react-flow/nodes/Nodes.tsx b/packages/serverless-workflow-diagram-editor/src/react-flow/nodes/Nodes.tsx index fa8fefbc..5ea98fcf 100644 --- a/packages/serverless-workflow-diagram-editor/src/react-flow/nodes/Nodes.tsx +++ b/packages/serverless-workflow-diagram-editor/src/react-flow/nodes/Nodes.tsx @@ -28,6 +28,7 @@ import { terminalNodeConfigMap, } from "./taskNodeConfig"; import { getCallSubType, getListenSubType, getRunSubType } from "../../core"; +import { Tooltip, TooltipContent, TooltipTrigger } from "@/components/ui/tooltip"; import { CircleAlert } from "lucide-react"; export const ReactFlowNodeTypes: RF.NodeTypes = { @@ -94,19 +95,21 @@ function TaskNodeBadge({ badge, testId }: BadgeProps) { const isUnknown = !KNOWN_BADGES.has(badge.toLowerCase()); if (isUnknown) { - /* TODO: instead of using the browser default to display tool tip like below, replace with tooltip component when we add it */ return ( - - {badge} - + + + + {badge} + + + {badge} + ); } - return ( {badge} diff --git a/packages/serverless-workflow-diagram-editor/tests/react-flow/nodes/Nodes.test.tsx b/packages/serverless-workflow-diagram-editor/tests/react-flow/nodes/Nodes.test.tsx index 1455adb1..063a2ca4 100644 --- a/packages/serverless-workflow-diagram-editor/tests/react-flow/nodes/Nodes.test.tsx +++ b/packages/serverless-workflow-diagram-editor/tests/react-flow/nodes/Nodes.test.tsx @@ -30,6 +30,7 @@ import { import { DEFAULT_NODE_SIZE } from "../../../src/react-flow/diagram/autoLayout"; import { en } from "../../../src/i18n/locales/en"; import { renderWithProviders } from "../../test-utils/render-helpers"; +import userEvent from "@testing-library/user-event"; function testNode( id: string, @@ -268,7 +269,31 @@ describe("React Flow custom node types", () => { const callBadge = screen.getByTestId("call-node-n1-badge-custom"); expect(callBadge).toBeInTheDocument(); expect(callBadge.textContent).toBe("customCall"); - expect(callBadge).toHaveAttribute("title", "customCall"); + }); + + it("should render the raw value as a custom badge for an unknown subtype and display it in the tooltip", async () => { + const user = userEvent.setup(); + + const nodesWithUnknownBadges = [ + testNode("n1", GraphNodeType.Call, 100, "CallNode", { + call: "customCall", + }), + ]; + + renderWithProviders( +
+ +
, + ); + + const callBadge = screen.getByTestId("call-node-n1-badge-custom"); + await user.hover(callBadge); + const tooltip = await screen.findByRole("tooltip"); + expect(tooltip).toHaveTextContent("customCall"); }); it("should render while/compete badges on container nodes", () => { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 3f9083fe..da58998e 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -7443,4 +7443,4 @@ snapshots: use-sync-external-store: 1.6.0(react@19.2.7) optionalDependencies: '@types/react': 19.2.17 - react: 19.2.7 + react: 19.2.7 \ No newline at end of file