fix: 修复工作流节点交互与旧浏览器兼容

- 修复 Tinyflow Vue wrapper 可选 boolean 默认关闭节点拖拽和连线的问题

- 为 Tinyflow 增加 structuredClone 兼容与 Chrome 90 构建目标

- 增加节点交互归一化与 Tab 空值防御
This commit is contained in:
2026-06-23 15:59:03 +08:00
parent 999a21e2d9
commit 03ad011f64
11 changed files with 183 additions and 14 deletions

View File

@@ -0,0 +1,59 @@
import type { Node } from '@xyflow/svelte';
import type { CustomNode, TinyflowOptions } from '../types';
export const DEFAULT_NODE_DRAG_HANDLE = '.tf-node-drag-handle';
export type TinyflowNodeNormalizer = (node: Node) => Node;
function shouldUseDefaultDragHandle(
node: Node,
customNodes?: Record<string, CustomNode>,
) {
if (Object.prototype.hasOwnProperty.call(node, 'dragHandle')) {
return false;
}
const customNode = node.type ? customNodes?.[node.type] : undefined;
return customNode?.presentation !== 'plain';
}
export function createTinyflowNodeNormalizer(
options?: TinyflowOptions,
): TinyflowNodeNormalizer {
const readonly = options?.readonly === true;
const nodesDraggable = options?.nodesDraggable ?? !readonly;
const nodesConnectable = options?.nodesConnectable ?? !readonly;
const elementsSelectable = options?.elementsSelectable ?? !readonly;
return (node) => {
const nextNode = { ...node };
if (nodesDraggable) {
if (nextNode.draggable === false) {
delete nextNode.draggable;
}
if (shouldUseDefaultDragHandle(nextNode, options?.customNodes)) {
nextNode.dragHandle = DEFAULT_NODE_DRAG_HANDLE;
}
} else {
nextNode.draggable = false;
}
if (nodesConnectable) {
if (nextNode.connectable === false) {
delete nextNode.connectable;
}
} else {
nextNode.connectable = false;
}
if (elementsSelectable) {
if (nextNode.selectable === false) {
delete nextNode.selectable;
}
} else {
nextNode.selectable = false;
}
return nextNode;
};
}