From afc67bc0b9403b04b74e31e3050b1bbb502ca0ae Mon Sep 17 00:00:00 2001 From: BennyKok Date: Mon, 25 Dec 2023 20:36:44 +0800 Subject: [PATCH] feat(web): workflow details page, showing custom node dependencies --- web/bun.lockb | Bin 342035 -> 342489 bytes web/package.json | 1 + web/src/app/workflows/[workflow_id]/page.tsx | 2 + web/src/components/VersionSelect.tsx | 167 ++++++++++++++++++- web/src/db/schema.ts | 12 +- 5 files changed, 175 insertions(+), 7 deletions(-) diff --git a/web/bun.lockb b/web/bun.lockb index 704c77856d4c6a6812eeaa561e2094e61e85a67d..3e3f3673cd327480659b74b3af483213cbf01844 100755 GIT binary patch delta 61862 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 Dde4#6 diff --git a/web/package.json b/web/package.json index 22d78c6..262e558 100644 --- a/web/package.json +++ b/web/package.json @@ -56,6 +56,7 @@ "react-use-websocket": "^4.5.0", "shikiji": "^0.9.3", "sonner": "^1.2.4", + "swr": "^2.2.4", "tailwind-merge": "^2.1.0", "tailwindcss-animate": "^1.0.7", "uuid": "^9.0.1", diff --git a/web/src/app/workflows/[workflow_id]/page.tsx b/web/src/app/workflows/[workflow_id]/page.tsx index b026a4e..16d3218 100644 --- a/web/src/app/workflows/[workflow_id]/page.tsx +++ b/web/src/app/workflows/[workflow_id]/page.tsx @@ -8,6 +8,7 @@ import { MachineSelect, RunWorkflowButton, VersionSelect, + ViewWorkflowDetailsButton, } from "@/components/VersionSelect"; import { Card, @@ -47,6 +48,7 @@ export default async function Page({ + diff --git a/web/src/components/VersionSelect.tsx b/web/src/components/VersionSelect.tsx index 99888f7..54aa702 100644 --- a/web/src/components/VersionSelect.tsx +++ b/web/src/components/VersionSelect.tsx @@ -3,6 +3,7 @@ import { callServerPromise } from "./callServerPromise"; import { LoadingIcon } from "@/components/LoadingIcon"; import AutoForm, { AutoFormSubmit } from "@/components/ui/auto-form"; +import { Badge } from "@/components/ui/badge"; import { Button } from "@/components/ui/button"; import { Dialog, @@ -27,15 +28,25 @@ import { SelectTrigger, SelectValue, } from "@/components/ui/select"; +import { + Table, + TableBody, + TableCell, + TableHead, + TableHeader, + TableRow, +} from "@/components/ui/table"; +import type { workflowAPINodeType } from "@/db/schema"; import { getInputsFromWorkflow } from "@/lib/getInputsFromWorkflow"; import { createRun } from "@/server/createRun"; import { createDeployments } from "@/server/curdDeploments"; import type { getMachines } from "@/server/curdMachine"; import type { findFirstTableWithVersion } from "@/server/findFirstTableWithVersion"; -import { Copy, MoreVertical, Play } from "lucide-react"; +import { Copy, ExternalLink, Info, MoreVertical, Play } from "lucide-react"; import { parseAsInteger, useQueryState } from "next-usequerystate"; import { useMemo, useState } from "react"; import { toast } from "sonner"; +import useSWR from "swr"; import { z } from "zod"; export function VersionSelect({ @@ -329,3 +340,157 @@ export function getWorkflowVersionFromVersionIndex( return workflow_version; } + +export default async function fetcher( + input: RequestInfo, + init?: RequestInit +): Promise { + const res = await fetch(input, init); + return res.json(); +} + +export function ViewWorkflowDetailsButton({ + workflow, +}: { + workflow: Awaited>; +}) { + const [version] = useQueryState("version", { + defaultValue: workflow?.versions[0].version ?? 1, + ...parseAsInteger, + }); + const [isLoading, setIsLoading] = useState(false); + + const [open, setOpen] = useState(false); + + const { + data, + error, + isLoading: isNodesIndexLoading, + } = useSWR( + "https://raw.githubusercontent.com/ltdrdata/ComfyUI-Manager/main/extension-node-map.json", + fetcher + ); + + const groupedByAuxName = useMemo(() => { + if (!data) return null; + + console.log(data); + + const workflow_version = getWorkflowVersionFromVersionIndex( + workflow, + version + ); + + const api = workflow_version?.workflow_api; + + if (!api) return null; + + const crossCheckedApi = Object.entries(api) + .map(([_, value]) => { + const classType = value.class_type; + const classTypeData = Object.entries(data).find(([_, nodeArray]) => + nodeArray[0].includes(classType) + ); + return classTypeData ? { node: value, classTypeData } : null; + }) + .filter((item) => item !== null); + + console.log(crossCheckedApi); + + const groupedByAuxName = crossCheckedApi.reduce( + (acc, data) => { + if (!data) return acc; + + const { node, classTypeData } = data; + const auxName = classTypeData[1][1].title_aux; + console.log(auxName); + if (!acc[auxName]) { + acc[auxName] = { + url: classTypeData[0], + node: [], + }; + } + acc[auxName].node.push(node); + return acc; + }, + {} as Record< + string, + { + node: z.infer[]; + url: string; + } + > + ); + + console.log(groupedByAuxName); + + return groupedByAuxName; + }, [version, data]); + + return ( + + + + + + + Workflow Details + + View your custom nodes, models, external files used in this workflow + + + +
+ + + + File + Output + + + + {groupedByAuxName && + Object.entries(groupedByAuxName).map(([key, group]) => { + // const filePath + return ( + + + + {key} + + + + + {group.node.map((x) => ( + + {x.class_type} + + ))} + + + ); + })} + +
+
+ +
+ +
+ {/* */} + {/*
{view}
*/} +
+
+ ); +} diff --git a/web/src/db/schema.ts b/web/src/db/schema.ts index d237818..f4b1dc2 100644 --- a/web/src/db/schema.ts +++ b/web/src/db/schema.ts @@ -51,12 +51,12 @@ export const workflowType = z.any(); // ), // }); -export const workflowAPIType = z.record( - z.object({ - inputs: z.record(z.any()), - class_type: z.string().optional(), - }) -); +export const workflowAPINodeType = z.object({ + inputs: z.record(z.any()), + class_type: z.string().optional(), +}); + +export const workflowAPIType = z.record(workflowAPINodeType); export const workflowVersionTable = dbSchema.table("workflow_versions", { workflow_id: uuid("workflow_id")