diff --git a/web/app/dashboard/ai-workflows/_components/flowgram-editor-provider.tsx b/web/app/dashboard/ai-workflows/_components/flowgram-editor-provider.tsx index 2f36d5c..a7ba0f5 100644 --- a/web/app/dashboard/ai-workflows/_components/flowgram-editor-provider.tsx +++ b/web/app/dashboard/ai-workflows/_components/flowgram-editor-provider.tsx @@ -6,6 +6,8 @@ import { type FreeLayoutProps, type WorkflowJSON, } from "@flowgram.ai/free-layout-editor" +import { createFreeSnapPlugin } from "@flowgram.ai/free-snap-plugin" +import { createMinimapPlugin } from "@flowgram.ai/minimap-plugin" import type { AIWorkflowDefinition, AIWorkflowNodeSpec } from "@/lib/api/admin" @@ -29,11 +31,17 @@ export function useFlowgramEditorProps({ readonly, initialData: definition as WorkflowJSON, nodeRegistries: buildFlowgramNodeRegistries(nodeSpecs), + fromNodeJSON(_node, json) { + return json + }, + toNodeJSON(_node, json) { + return json + }, materials: { renderDefaultNode: FlowgramNodeRenderer, }, nodeEngine: { - enable: false, + enable: true, }, history: { enable: !readonly, @@ -61,7 +69,35 @@ export function useFlowgramEditorProps({ }, } }, - plugins: () => [], + plugins: () => [ + createMinimapPlugin({ + disableLayer: true, + canvasStyle: { + canvasWidth: 150, + canvasHeight: 84, + canvasPadding: 48, + canvasBackground: "rgba(245, 245, 245, 1)", + canvasBorderRadius: 8, + viewportBackground: "rgba(235, 235, 235, 1)", + viewportBorderRadius: 4, + viewportBorderColor: "rgba(201, 201, 201, 1)", + viewportBorderWidth: 1, + viewportBorderDashLength: 2, + nodeColor: "rgba(255, 255, 255, 1)", + nodeBorderRadius: 2, + nodeBorderWidth: 0.145, + nodeBorderColor: "rgba(6, 7, 9, 0.10)", + overlayColor: "rgba(255, 255, 255, 0)", + }, + }), + createFreeSnapPlugin({ + edgeColor: "#00B2B2", + alignColor: "#00B2B2", + edgeLineWidth: 1, + alignLineWidth: 1, + alignCrossWidth: 8, + }), + ], }), [definition, nodeSpecs, onDefinitionChange, readonly] ) diff --git a/web/app/dashboard/ai-workflows/_components/flowgram-node-registries.tsx b/web/app/dashboard/ai-workflows/_components/flowgram-node-registries.tsx index 2f5e1c8..5626fc4 100644 --- a/web/app/dashboard/ai-workflows/_components/flowgram-node-registries.tsx +++ b/web/app/dashboard/ai-workflows/_components/flowgram-node-registries.tsx @@ -1,4 +1,4 @@ -import type { WorkflowNodeRegistry } from "@flowgram.ai/free-layout-editor" +import { Field, type WorkflowNodeRegistry } from "@flowgram.ai/free-layout-editor" import type { AIWorkflowNodeSpec } from "@/lib/api/admin" @@ -23,13 +23,38 @@ export function buildFlowgramNodeRegistries(nodeSpecs: AIWorkflowNodeSpec[]): Wo type: spec.type, meta: { defaultExpanded: true, + isStart: spec.type === "start", deleteDisable: spec.type === "start" || spec.type === "end", copyDisable: spec.type === "start" || spec.type === "end", defaultPorts: defaultPortsForNodeType(spec.type), }, + formMeta: { + render: () => , + }, })) } +function FlowgramNodeForm({ + nodeType, + fallbackTitle, +}: { + nodeType: string + fallbackTitle: string +}) { + return ( +
+ name="title"> + {({ field }) => ( +
+ {field.value || fallbackTitle} +
+ )} + +
{nodeType}
+
+ ) +} + function defaultPortsForNodeType(type: string) { if (type === "start") { return [{ type: "output" as const }] diff --git a/web/app/dashboard/ai-workflows/_components/flowgram-node-renderer.tsx b/web/app/dashboard/ai-workflows/_components/flowgram-node-renderer.tsx index 8480574..031fa64 100644 --- a/web/app/dashboard/ai-workflows/_components/flowgram-node-renderer.tsx +++ b/web/app/dashboard/ai-workflows/_components/flowgram-node-renderer.tsx @@ -34,11 +34,9 @@ const iconByType: Record> = { } export function FlowgramNodeRenderer(props: WorkflowNodeProps) { - const { selected, node } = useNodeRender() + const { selected, node, form } = useNodeRender() const nodeType = String(node.flowNodeType ?? "") const Icon = iconByType[nodeType] ?? BotIcon - const nodeJSON = node.toJSON?.() as { data?: { title?: string }; title?: string } | undefined - const title = nodeJSON?.data?.title || nodeJSON?.title || nodeType || "节点" return ( -
-
{title}
-
{nodeType}
-
+ {form?.render()}
) diff --git a/web/app/dashboard/ai-workflows/_components/workflow-config-sidebar.tsx b/web/app/dashboard/ai-workflows/_components/workflow-config-sidebar.tsx index 063f1ff..9994b9a 100644 --- a/web/app/dashboard/ai-workflows/_components/workflow-config-sidebar.tsx +++ b/web/app/dashboard/ai-workflows/_components/workflow-config-sidebar.tsx @@ -34,7 +34,7 @@ export function WorkflowConfigSidebar({ : [] return ( -