feat: 完成工作流开始节点开场表单

- 增加开始节点 startFormMeta/startFormSchema 配置与运行参数解析

- 统一 Admin/UserCenter 开场表单渲染与文件集合输入

- 补充开始表单校验、引用迁移和前端工具测试
This commit is contained in:
2026-04-19 13:57:57 +08:00
parent 8546d927bc
commit 9feb889637
26 changed files with 3391 additions and 172 deletions

View File

@@ -71,6 +71,47 @@
const onRunTest = options.onRunTest;
const { updateEdgeData } = useUpdateEdgeData();
const pendingParentRepairs = new Set<string>();
function scheduleOrphanParentRepair(nodeId: string) {
if (!nodeId || pendingParentRepairs.has(nodeId)) {
return;
}
pendingParentRepairs.add(nodeId);
queueMicrotask(() => {
pendingParentRepairs.delete(nodeId);
const currentNode = getNode(nodeId);
const parentId = asString(currentNode?.parentId).trim();
if (!currentNode || !parentId || getNode(parentId)) {
return;
}
svelteFlow.updateNode(nodeId, {
parentId: undefined
});
});
}
function getResolvedParentId(node: null | Node | undefined) {
const parentId = asString(node?.parentId).trim();
if (!parentId) {
return undefined;
}
if (getNode(parentId)) {
return parentId;
}
if (node?.id) {
scheduleOrphanParentRepair(node.id);
}
return undefined;
}
function repairOrphanParentNodes() {
store.getNodes().forEach((node) => {
if (asString(node.parentId).trim() && !getResolvedParentId(node)) {
scheduleOrphanParentRepair(node.id);
}
});
}
function getEventClientPosition(event: any) {
if (typeof event?.clientX === 'number' && typeof event?.clientY === 'number') {
@@ -353,24 +394,27 @@
const isValidConnection = (conn: any) => {
const sourceNode = getNode(conn.source)!;
const targetNode = getNode(conn.target)!;
const sourceParentId = getResolvedParentId(sourceNode);
const targetParentId = getResolvedParentId(targetNode);
// 阻止循环节点连接到父级节点 或者 父级节点连接到子级节点
if (conn.sourceHandle === 'loop_handle' || sourceNode.parentId) {
if (conn.sourceHandle === 'loop_handle' || sourceParentId) {
const edges = svelteFlow.getEdges();
for (let edge of edges) {
if (edge.target === conn.target) {
const edgeSourceNode = getNode(edge.source) as Node;
if (conn.sourceHandle === 'loop_handle' && edgeSourceNode.parentId !== sourceNode.id) {
const edgeSourceParentId = getResolvedParentId(edgeSourceNode);
if (conn.sourceHandle === 'loop_handle' && edgeSourceParentId !== sourceNode.id) {
return false;
}
if (sourceNode.parentId && edgeSourceNode.parentId !== sourceNode.parentId) {
if (sourceParentId && edgeSourceParentId !== sourceParentId) {
return false;
}
}
}
}
if (!sourceNode.parentId && targetNode.parentId && targetNode.parentId !== sourceNode.id) {
if (!sourceParentId && targetParentId && targetParentId !== sourceNode.id) {
return false;
}
@@ -446,12 +490,14 @@
closeNodePicker();
const toNode = state.toNode as Node;
if (toNode.parentId) {
const targetParentId = getResolvedParentId(toNode);
if (targetParentId) {
return;
}
const fromNode = state.fromNode as Node;
const fromHande = state.fromHandle as any;
const sourceParentId = getResolvedParentId(fromNode);
const newNode = {
position: { ...toNode.position }
@@ -459,8 +505,8 @@
if (fromHande.id === 'loop_handle') {
newNode.parentId = fromNode.id;
} else if (fromNode.parentId) {
newNode.parentId = fromNode.parentId;
} else if (sourceParentId) {
newNode.parentId = sourceParentId;
}
if (newNode.parentId) {
@@ -514,10 +560,11 @@
showEdgePanel = false;
}
const targetNode = getNode(edge.target) as Node;
if (targetNode && targetNode.parentId) {
const targetParentId = getResolvedParentId(targetNode as Node);
if (targetNode && targetParentId) {
const nodeEdges = getEdgesByTarget(edge.target);
// const loopNode = getNode(targetNode.parentId) as Node;
const { x, y } = getNodeRelativePosition(targetNode.parentId);
const { x, y } = getNodeRelativePosition(targetParentId);
if (nodeEdges.length === 0) {
svelteFlow.updateNode(targetNode.id, {
parentId: undefined,
@@ -543,7 +590,7 @@
for (let i = 0; i < nodeEdges.length; i++) {
const edge = nodeEdges[i];
const sourceNode = getNode(edge.source) as Node;
if (sourceNode.parentId || sourceNode.type === 'loopNode') {
if (getResolvedParentId(sourceNode) || sourceNode.type === 'loopNode') {
hasSameParent = true;
break;
}
@@ -680,6 +727,7 @@
onMount(() => {
store.updateEdges((edges) => edges.map((edge) => ensureEdgeVisualDefaults(edge)));
repairOrphanParentNodes();
if (!readonly) {
window.addEventListener('keydown', handleKeyDown);
window.addEventListener('paste', handleGlobalPaste);