feat: 完成工作流开始节点开场表单
- 增加开始节点 startFormMeta/startFormSchema 配置与运行参数解析 - 统一 Admin/UserCenter 开场表单渲染与文件集合输入 - 补充开始表单校验、引用迁移和前端工具测试
This commit is contained in:
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user