|
|
@@ -2213,6 +2213,17 @@ export default function ProcessDesigner() {
|
|
|
event.dataTransfer.dropEffect = 'move';
|
|
|
}, []);
|
|
|
|
|
|
+ /** 是否为真正会影响设计内容的变更(排除纯选中态/尺寸测量等 UI 变更) */
|
|
|
+ const isMeaningfulRfChange = useCallback((changes: Array<{ type?: string; dragging?: boolean }>) => {
|
|
|
+ return changes.some((ch) => {
|
|
|
+ // ReactFlow 的 select/dimensions 多为 UI 变化,不应标记“未保存”
|
|
|
+ if (ch.type === 'select' || ch.type === 'dimensions') return false;
|
|
|
+ // position 只有在拖拽时才视为修改(避免点击选中触发的非拖拽 position 事件)
|
|
|
+ if (ch.type === 'position') return Boolean(ch.dragging);
|
|
|
+ return true;
|
|
|
+ });
|
|
|
+ }, []);
|
|
|
+
|
|
|
// 拖拽节点时的水平线磁吸:与画布上其他节点 Y 接近时对齐到同一水平线;节点变更时标记为已修改
|
|
|
const onNodesChange = useCallback(
|
|
|
(changes: NodeChange[]) => {
|
|
|
@@ -2230,23 +2241,23 @@ export default function ProcessDesigner() {
|
|
|
}
|
|
|
return ch;
|
|
|
});
|
|
|
- if (!isLoadingFromServerOrRestoreRef.current) {
|
|
|
+ if (!isLoadingFromServerOrRestoreRef.current && isMeaningfulRfChange(modified as any)) {
|
|
|
setHasUnsavedChanges(true);
|
|
|
}
|
|
|
onNodesChangeBase(modified);
|
|
|
},
|
|
|
- [nodes, onNodesChangeBase]
|
|
|
+ [nodes, onNodesChangeBase, isMeaningfulRfChange]
|
|
|
);
|
|
|
|
|
|
// 边变更时标记为已修改(仅用户操作会触发 onEdgesChange);加载/恢复阶段不标记
|
|
|
const onEdgesChangeWithDirty = useCallback(
|
|
|
(changes: Parameters<typeof onEdgesChange>[0]) => {
|
|
|
- if (!isLoadingFromServerOrRestoreRef.current) {
|
|
|
+ if (!isLoadingFromServerOrRestoreRef.current && isMeaningfulRfChange(changes as any)) {
|
|
|
setHasUnsavedChanges(true);
|
|
|
}
|
|
|
onEdgesChange(changes);
|
|
|
},
|
|
|
- [onEdgesChange]
|
|
|
+ [onEdgesChange, isMeaningfulRfChange]
|
|
|
);
|
|
|
|
|
|
// 更新节点配置
|