import { useMemo, useState } from "react"; import { Input, Modal } from "antd"; import { BookOpenText, FileText, Image, Pencil, Search, Video } from "lucide-react"; import { WorkspaceState } from "@/components/layout/workspace-state"; import { getNodeListLabel } from "@/lib/canvas/node-registry"; import { CanvasNodeType, type CanvasNodeData } from "@/types/canvas"; export function CanvasNodeSearchModal({ open, nodes, onClose, onFocus }: { open: boolean; nodes: CanvasNodeData[]; onClose: () => void; onFocus: (nodeId: string) => void }) { const [query, setQuery] = useState(""); const results = useMemo(() => { const keyword = query.trim().toLocaleLowerCase(); if (!keyword) return nodes.slice(0, 40); return nodes.filter((node) => [node.title, node.type, getNodeListLabel(node.type), node.metadata?.prompt, node.metadata?.composerContent, node.metadata?.model, node.metadata?.chapterTitle, node.metadata?.workflowTitle, node.metadata?.workflowDescription, typeof node.metadata?.shotIndex === "number" ? `镜头 ${node.metadata.shotIndex + 1}` : "", ...(node.metadata?.assetTags || [])] .some((value) => typeof value === "string" && value.toLocaleLowerCase().includes(keyword))).slice(0, 80); }, [nodes, query]); return ( setQuery("")} centered> setQuery(event.target.value)} prefix={} placeholder="搜索节点、章节、镜头、模型或标签" />
{results.length ? results.map((node) => ( )) : }
); } function nodeContextLabel(node: CanvasNodeData) { const location = [node.metadata?.chapterTitle, typeof node.metadata?.shotIndex === "number" ? `镜头 ${node.metadata.shotIndex + 1}` : ""].filter(Boolean).join(" · "); return location || node.metadata?.prompt || node.metadata?.composerContent || node.metadata?.workflowDescription || getNodeListLabel(node.type); }