@flowgram-vue/free-layout-core 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +22 -0
- package/dist/index.cjs +0 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.js +0 -0
- package/dist/index.js.map +1 -0
- package/dist/typings.cjs +46 -0
- package/dist/typings.cjs.map +1 -0
- package/dist/typings.d.ts +1 -0
- package/dist/typings.js +40 -0
- package/dist/typings.js.map +1 -0
- package/package.json +78 -0
- package/src/composables/index.ts +24 -0
- package/src/composables/typings.ts +97 -0
- package/src/composables/use-current-dom-node.ts +18 -0
- package/src/composables/use-current-entity.ts +15 -0
- package/src/composables/use-node-render-context.ts +18 -0
- package/src/composables/use-node-render.ts +192 -0
- package/src/composables/use-playground-readonly-state.ts +25 -0
- package/src/composables/use-workflow-document.ts +12 -0
- package/src/constants.ts +17 -0
- package/src/entities/index.ts +8 -0
- package/src/entities/workflow-line-entity.ts +640 -0
- package/src/entities/workflow-node-entity.ts +17 -0
- package/src/entities/workflow-port-entity.ts +340 -0
- package/src/entity-datas/index.ts +8 -0
- package/src/entity-datas/workflow-line-render-data.ts +136 -0
- package/src/entity-datas/workflow-node-lines-data.ts +166 -0
- package/src/entity-datas/workflow-node-ports-data.ts +253 -0
- package/src/env.d.ts +10 -0
- package/src/index.ts +18 -0
- package/src/layout/free-layout.ts +166 -0
- package/src/layout/index.ts +6 -0
- package/src/service/index.ts +10 -0
- package/src/service/workflow-drag-service.ts +969 -0
- package/src/service/workflow-hover-service.ts +106 -0
- package/src/service/workflow-operation-base-service.ts +118 -0
- package/src/service/workflow-reset-layout-service.ts +87 -0
- package/src/service/workflow-select-service.ts +128 -0
- package/src/typings/index.ts +19 -0
- package/src/typings/workflow-drag.ts +51 -0
- package/src/typings/workflow-edge.ts +15 -0
- package/src/typings/workflow-json.ts +64 -0
- package/src/typings/workflow-line.ts +71 -0
- package/src/typings/workflow-node.ts +52 -0
- package/src/typings/workflow-operation.ts +40 -0
- package/src/typings/workflow-registry.ts +34 -0
- package/src/typings/workflow-sub-canvas.ts +15 -0
- package/src/utils/build-group-json.ts +47 -0
- package/src/utils/compose.ts +6 -0
- package/src/utils/fit-view.ts +21 -0
- package/src/utils/flow-node-form-data.ts +45 -0
- package/src/utils/get-anti-overlap-position.ts +44 -0
- package/src/utils/get-line-center.ts +22 -0
- package/src/utils/get-url-params.ts +50 -0
- package/src/utils/index.ts +29 -0
- package/src/utils/layout-to-positions.ts +65 -0
- package/src/utils/location-config-to-point.ts +40 -0
- package/src/utils/nanoid.ts +10 -0
- package/src/utils/statics.ts +27 -0
- package/src/vue/index.ts +6 -0
- package/src/vue/node-render-provider.vue +16 -0
- package/src/workflow-commands.ts +14 -0
- package/src/workflow-document-container-module.ts +50 -0
- package/src/workflow-document-contribution.ts +31 -0
- package/src/workflow-document-option.ts +148 -0
- package/src/workflow-document.ts +873 -0
- package/src/workflow-lines-manager.ts +596 -0
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (c) 2025 Bytedance Ltd. and/or its affiliates
|
|
3
|
+
* SPDX-License-Identifier: MIT
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
import { injectable, inject } from 'inversify';
|
|
7
|
+
import {
|
|
8
|
+
type FlowDocumentContribution,
|
|
9
|
+
FlowNodeRenderData,
|
|
10
|
+
FlowNodeTransformData,
|
|
11
|
+
} from '@flowgram-vue/document';
|
|
12
|
+
|
|
13
|
+
import { WorkflowDocument } from './workflow-document';
|
|
14
|
+
import { FreeLayout } from './layout';
|
|
15
|
+
import { WorkflowNodeLinesData, WorkflowNodePortsData } from './entity-datas';
|
|
16
|
+
|
|
17
|
+
@injectable()
|
|
18
|
+
export class WorkflowDocumentContribution implements FlowDocumentContribution<WorkflowDocument> {
|
|
19
|
+
@inject(FreeLayout) freeLayout: FreeLayout;
|
|
20
|
+
|
|
21
|
+
registerDocument(document: WorkflowDocument): void {
|
|
22
|
+
// 注册节点数据
|
|
23
|
+
document.registerNodeDatas(
|
|
24
|
+
FlowNodeTransformData,
|
|
25
|
+
FlowNodeRenderData,
|
|
26
|
+
WorkflowNodePortsData,
|
|
27
|
+
WorkflowNodeLinesData,
|
|
28
|
+
);
|
|
29
|
+
document.registerLayout(this.freeLayout);
|
|
30
|
+
}
|
|
31
|
+
}
|
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (c) 2025 Bytedance Ltd. and/or its affiliates
|
|
3
|
+
* SPDX-License-Identifier: MIT
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
import { FlowNodeErrorData } from '@flowgram-vue/form-core';
|
|
7
|
+
import { FlowDocumentOptions, FlowNodeTransformData, FlowNodeType } from '@flowgram-vue/document';
|
|
8
|
+
import { TransformData } from '@flowgram-vue/core';
|
|
9
|
+
|
|
10
|
+
import { type WorkflowLinesManager } from './workflow-lines-manager';
|
|
11
|
+
import { initFormDataFromJSON, toFormJSON } from './utils/flow-node-form-data';
|
|
12
|
+
import {
|
|
13
|
+
LineColor,
|
|
14
|
+
LineRenderType,
|
|
15
|
+
onDragLineEndParams,
|
|
16
|
+
WorkflowNodeJSON,
|
|
17
|
+
WorkflowNodeMeta,
|
|
18
|
+
} from './typings';
|
|
19
|
+
import {
|
|
20
|
+
type WorkflowLineEntity,
|
|
21
|
+
type WorkflowLinePortInfo,
|
|
22
|
+
type WorkflowNodeEntity,
|
|
23
|
+
type WorkflowPortEntity,
|
|
24
|
+
} from './entities';
|
|
25
|
+
|
|
26
|
+
export const WorkflowDocumentOptions = Symbol('WorkflowDocumentOptions');
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* 线条配置
|
|
30
|
+
*/
|
|
31
|
+
export interface WorkflowDocumentOptions extends FlowDocumentOptions {
|
|
32
|
+
cursors?: {
|
|
33
|
+
grab?: string;
|
|
34
|
+
grabbing?: string;
|
|
35
|
+
};
|
|
36
|
+
/** 双向连接 */
|
|
37
|
+
twoWayConnection?: boolean;
|
|
38
|
+
/** 允许拖拽只读节点 */
|
|
39
|
+
enableReadonlyNodeDragging?: boolean;
|
|
40
|
+
/** 线条颜色 */
|
|
41
|
+
lineColor?: Partial<LineColor>;
|
|
42
|
+
/** 是否显示错误线条 */
|
|
43
|
+
isErrorLine?: (
|
|
44
|
+
fromPort: WorkflowPortEntity | undefined,
|
|
45
|
+
toPort: WorkflowPortEntity | undefined,
|
|
46
|
+
lines: WorkflowLinesManager
|
|
47
|
+
) => boolean;
|
|
48
|
+
/** 是否错误端口 */
|
|
49
|
+
isErrorPort?: (port: WorkflowPortEntity) => boolean;
|
|
50
|
+
/** 是否禁用端口 */
|
|
51
|
+
isDisabledPort?: (port: WorkflowPortEntity) => boolean;
|
|
52
|
+
/** 是否反转线条箭头 */
|
|
53
|
+
isReverseLine?: (line: WorkflowLineEntity) => boolean;
|
|
54
|
+
/** 是否隐藏线条箭头 */
|
|
55
|
+
isHideArrowLine?: (line: WorkflowLineEntity) => boolean;
|
|
56
|
+
/** 是否流动线条 */
|
|
57
|
+
isFlowingLine?: (line: WorkflowLineEntity) => boolean;
|
|
58
|
+
/** 是否禁用线条 */
|
|
59
|
+
isDisabledLine?: (line: WorkflowLineEntity) => boolean;
|
|
60
|
+
/** 拖拽线条结束 */
|
|
61
|
+
onDragLineEnd?: (params: onDragLineEndParams) => Promise<void>;
|
|
62
|
+
/** 获取线条渲染器 */
|
|
63
|
+
setLineRenderType?: (line: WorkflowLineEntity) => LineRenderType | undefined;
|
|
64
|
+
/** 设置线条样式 */
|
|
65
|
+
setLineClassName?: (line: WorkflowLineEntity) => string | undefined;
|
|
66
|
+
/** 能否添加线条 */
|
|
67
|
+
canAddLine?: (
|
|
68
|
+
fromPort: WorkflowPortEntity,
|
|
69
|
+
toPort: WorkflowPortEntity,
|
|
70
|
+
lines: WorkflowLinesManager,
|
|
71
|
+
silent?: boolean
|
|
72
|
+
) => boolean;
|
|
73
|
+
/** 能否删除节点 */
|
|
74
|
+
canDeleteNode?: (node: WorkflowNodeEntity, silent?: boolean) => boolean;
|
|
75
|
+
/** 能否删除线条 */
|
|
76
|
+
canDeleteLine?: (
|
|
77
|
+
line: WorkflowLineEntity,
|
|
78
|
+
newLineInfo?: Required<Omit<WorkflowLinePortInfo, 'data'>>,
|
|
79
|
+
silent?: boolean
|
|
80
|
+
) => boolean;
|
|
81
|
+
/**
|
|
82
|
+
* @param fromPort - 开始点
|
|
83
|
+
* @param oldToPort - 旧的连接点
|
|
84
|
+
* @param newToPort - 新的连接点
|
|
85
|
+
* @param lines - 线条管理器
|
|
86
|
+
*/
|
|
87
|
+
canResetLine?: (
|
|
88
|
+
oldLine: WorkflowLineEntity,
|
|
89
|
+
newLineInfo: Required<WorkflowLinePortInfo>,
|
|
90
|
+
lines: WorkflowLinesManager
|
|
91
|
+
) => boolean;
|
|
92
|
+
/**
|
|
93
|
+
* 是否允许拖入子画布 (loop or group)
|
|
94
|
+
* Whether to allow dragging into the sub-canvas (loop or group)
|
|
95
|
+
* @param params
|
|
96
|
+
*/
|
|
97
|
+
canDropToNode?: (params: {
|
|
98
|
+
dragNodeType?: FlowNodeType;
|
|
99
|
+
dragNode?: WorkflowNodeEntity;
|
|
100
|
+
dropNode?: WorkflowNodeEntity;
|
|
101
|
+
dropNodeType?: FlowNodeType;
|
|
102
|
+
}) => boolean;
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
export const WorkflowDocumentOptionsDefault: WorkflowDocumentOptions = {
|
|
106
|
+
// cursors: {
|
|
107
|
+
// grab: 'url("data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjAiIGhlaWdodD0iMjEiIHZpZXdCb3g9IjAgMCAyMCAyMSIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHBhdGggZmlsbC1ydWxlPSJldmVub2RkIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiIGQ9Ik0xMC40ODczIDIuNjIzNzhDOS45MDczMSAyLjYyMzc4IDkuNDM3MTMgMy4wOTM5NiA5LjQzNzEzIDMuNjczOTZWNS4xNDM3NkM5LjM5NDI4IDQuNDAyNzQgOC43Nzk3OCAzLjgxNTA0IDguMDI4MDIgMy44MTUwNEM3LjI0ODQ4IDMuODE1MDQgNi42MTY1MyA0LjQ0Njk5IDYuNjE2NTMgNS4yMjY1M1YxMS44Mjg5TDUuNjc0MTggMTEuMDA0OUM1LjE1NDg3IDEwLjU1MDkgNC40MDk1IDEwLjQ2MzYgMy43OTkzOCAxMC43ODU1TDMuNjk2OTQgMTAuODM5NkMzLjA2MjE3IDExLjE3NDUgMi45MjI2IDEyLjAyMjggMy40MTY2MiAxMi41NDM0TDcuMzM5NTkgMTYuNjc3NVYxNy4zMjU5QzcuMzM5NTkgMTcuNzg2MiA3LjcxMjY5IDE4LjE1OTMgOC4xNzI5MiAxOC4xNTkzSDEzLjgwODRDMTQuMjY4NyAxOC4xNTkzIDE0LjY0MTcgMTcuNzg2MiAxNC42NDE3IDE3LjMyNTlWMTYuNzkzNUMxNS44MDk0IDE1LjY0ODUgMTYuNDY3MyAxNC4wODE5IDE2LjQ2NzMgMTIuNDQ2NVYxMS40OTY3TDE2LjQ2NzEgNi42MzY4NUMxNi40NjcxIDUuOTU2MyAxNS45MTU0IDUuNDA0NjEgMTUuMjM0OCA1LjQwNDYxQzE0LjU1NDMgNS40MDQ2MSAxNC4wMDI2IDUuOTU2MyAxNC4wMDI2IDYuNjM2ODVMMTQuMDAyMSA1LjA0NzI4QzE0LjAwMjEgNC4zNjY3MyAxMy40NTA0IDMuODE1MDQgMTIuNzY5OCAzLjgxNTA0QzEyLjA4OTMgMy44MTUwNCAxMS41Mzc2IDQuMzY2NzMgMTEuNTM3NiA1LjA0NzI4TDExLjUzNzUgMy42NzM5NUMxMS41Mzc1IDMuMDkzOTYgMTEuMDY3MyAyLjYyMzc4IDEwLjQ4NzMgMi42MjM3OFoiIGZpbGw9IndoaXRlIi8+CjxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBkPSJNMTAuNDg3NCAxLjM3NDAyQzExLjM2MTIgMS4zNzQwMiAxMi4xMjExIDEuODYxMTggMTIuNTEwNSAyLjU3ODY4QzEyLjU5NTggMi41Njk4MyAxMi42ODIzIDIuNTY1MjggMTIuNzcgMi41NjUyOEMxMy44Mjc4IDIuNTY1MjggMTQuNzMxMSAzLjIyNzAxIDE1LjA4ODUgNC4xNTkxMUMxNS4xMzcgNC4xNTYyOSAxNS4xODU4IDQuMTU0ODYgMTUuMjM1IDQuMTU0ODZDMTYuNjA1OSA0LjE1NDg2IDE3LjcxNzIgNS4yNjYxOSAxNy43MTcyIDYuNjM3MDlMMTcuNzE3NCAxMi40NDY3QzE3LjcxNzQgMTQuMjM1NSAxNy4wNjQ0IDE1Ljk1NTkgMTUuODkxOSAxNy4yOTA0VjE3LjMyNjJDMTUuODkxOSAxOC40NzY4IDE0Ljk1OTEgMTkuNDA5NSAxMy44MDg1IDE5LjQwOTVIOC4xNzMwNkM3LjAyMjQ3IDE5LjQwOTUgNi4wODk3MyAxOC40NzY4IDYuMDg5NzMgMTcuMzI2MlYxNy4xNzY0TDIuNTEwMDMgMTMuNDA0MUMxLjQ0NTk5IDEyLjI4MjggMS43NDY2IDEwLjQ1NTUgMy4xMTM3OSA5LjczNDI0TDMuMjE2MjQgOS42ODAxOUMzLjg5MTY4IDkuMzIzODMgNC42NjE4NSA5LjI1NDAxIDUuMzY2NjYgOS40NTE5OFY1LjIyNjc4QzUuMzY2NjYgMy43NTY4NyA2LjU1ODI2IDIuNTY1MjggOC4wMjgxNiAyLjU2NTI4QzguMTcyOTMgMi41NjUyOCA4LjMxNDk5IDIuNTc2ODQgOC40NTM0NyAyLjU5OTA3QzguODM5NDMgMS44NzA0MiA5LjYwNTQ2IDEuMzc0MDIgMTAuNDg3NCAxLjM3NDAyWk0xMi40NDc2IDMuODU3ODdWOS40NzY0NkMxMi40NDc2IDkuNzI4NTIgMTIuMjQzMyA5LjkzMjg1IDExLjk5MTMgOS45MzI4NUMxMS43MzkyIDkuOTMyODUgMTEuNTM0OSA5LjcyODUyIDExLjUzNDkgOS40NzY0NlYzLjc5NjU1QzExLjUzNDkgMy43Nzk1NiAxMS41MzU4IDMuNzYyNzcgMTEuNTM3NiAzLjc0NjI2VjMuNjc0MkMxMS41Mzc2IDMuNDMyODIgMTEuNDU2MiAzLjIxMDQ2IDExLjMxOTMgMy4wMzMwOUMxMS4xMjcyIDIuNzg0MjggMTAuODI2MSAyLjYyNDAyIDEwLjQ4NzQgMi42MjQwMkMxMC4xMjM4IDIuNjI0MDIgOS44MDMzMiAyLjgwODg2IDkuNjE0ODMgMy4wODk3QzkuNTAyNjkgMy4yNTY3OSA5LjQzNzI2IDMuNDU3ODUgOS40MzcyNiAzLjY3NDJWMy43ODU3M0M5LjQzNzM1IDMuNzg5MzMgOS40MzczOSAzLjc5Mjk0IDkuNDM3MzkgMy43OTY1NVY5LjkwMTdDOS40MzczOSAxMC4xNTM3IDkuMjMzMDYgMTAuMzU4MSA4Ljk4MTAxIDEwLjM1ODFDOC43Mjg5NSAxMC4zNTgxIDguNTI0NjIgMTAuMTUzNyA4LjUyNDYyIDkuOTAxN1YzLjkwNTA3QzguNDE3NzMgMy44NjQ5IDguMzA0NjggMy44MzczMiA4LjE4NzI2IDMuODI0MTVDOC4xMzUwNCAzLjgxODI5IDguMDgxOTUgMy44MTUyOCA4LjAyODE2IDMuODE1MjhDNy4yNDg2MSAzLjgxNTI4IDYuNjE2NjYgNC40NDcyMyA2LjYxNjY2IDUuMjI2NzhWMTEuODI5Mkw1LjY3NDMxIDExLjAwNTJDNS41Nzg2OCAxMC45MjE2IDUuNDc1MzcgMTAuODUwNCA1LjM2NjY2IDEwLjc5MTlDNC44ODUwNiAxMC41MzI5IDQuMjk3MjggMTAuNTIzMSAzLjc5OTUyIDEwLjc4NThMMy42OTcwNyAxMC44Mzk4QzMuMDYyMzEgMTEuMTc0NyAyLjkyMjczIDEyLjAyMzEgMy40MTY3NSAxMi41NDM3TDcuMzM5NzMgMTYuNjc3N1YxNy4zMjYyQzcuMzM5NzMgMTcuNzg2NCA3LjcxMjgyIDE4LjE1OTUgOC4xNzMwNiAxOC4xNTk1SDEzLjgwODVDMTQuMjY4OCAxOC4xNTk1IDE0LjY0MTkgMTcuNzg2NCAxNC42NDE5IDE3LjMyNjJWMTYuNzkzOEMxNS43Mzc5IDE1LjcxOSAxNi4zODQ3IDE0LjI3MjggMTYuNDYgMTIuNzQ3QzE2LjQ2NDEgMTIuNjY0MSAxNi40NjY1IDEyLjU4MDkgMTYuNDY3MiAxMi40OTc1TDE2LjQ2NzQgMTIuNDQ2N0wxNi40NjcyIDYuNjM3MDlDMTYuNDY3MiA1Ljk2MjMgMTUuOTI0OCA1LjQxNDE5IDE1LjI1MjIgNS40MDQ5N0wxNS4yMzUgNS40MDQ4NkMxNS4xMjQ2IDUuNDA0ODYgMTUuMDE3NyA1LjQxOTM2IDE0LjkxNTkgNS40NDY1NlY5LjYwMjI2QzE0LjkxNTkgOS44NTQzMSAxNC43MTE2IDEwLjA1ODYgMTQuNDU5NSAxMC4wNTg2QzE0LjIwNzUgMTAuMDU4NiAxNC4wMDMxIDkuODU0MzEgMTQuMDAzMSA5LjYwMjI2VjYuNjA1MTRDMTQuMDAyOSA2LjYxNTc2IDE0LjAwMjcgNi42MjY0MSAxNC4wMDI3IDYuNjM3MDlWOS4yNzcwNUwxNC4wMDIyIDUuMDQ3NTJDMTQuMDAyMiA0Ljg2OTEzIDEzLjk2NDMgNC42OTk2IDEzLjg5NjEgNC41NDY1M0MxMy43MDY0IDQuMTIwNzIgMTMuMjgyMiAzLjgyMjM1IDEyLjc4NzYgMy44MTU0MUwxMi43NyAzLjgxNTI4QzEyLjY1ODQgMy44MTUyOCAxMi41NTA0IDMuODMwMSAxMi40NDc2IDMuODU3ODdaIiBmaWxsPSIjMUQxQzIzIi8+Cjwvc3ZnPg=="), auto',
|
|
108
|
+
// grabbing:
|
|
109
|
+
// 'url("data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjAiIGhlaWdodD0iMjEiIHZpZXdCb3g9IjAgMCAyMCAyMSIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHBhdGggZmlsbC1ydWxlPSJldmVub2RkIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiIGQ9Ik02LjYxODE3IDUuNTk4NzVDNi42MTgxNyA0LjgxOTIgNy4yNTAxMiA0LjE4NzI2IDguMDI5NjcgNC4xODcyNkM4Ljc3ODczIDQuMTg3MjYgOS4zOTE1MiA0Ljc3MDc1IDkuNDM4MjkgNS41MDgwMUM5LjQ1OTkyIDQuOTQ3MSA5LjkyMTQ3IDQuNDk5MDIgMTAuNDg3NyA0LjQ5OTAyQzExLjA2NzcgNC40OTkwMiAxMS41Mzc4IDQuOTY5MiAxMS41Mzc4IDUuNTQ5MTlWOC43NjI0NkwxMS41Mzc5IDYuNzExNUMxMS41Mzc5IDYuMDMwOTUgMTIuMDg5NiA1LjQ3OTI2IDEyLjc3MDIgNS40NzkyNkMxMy40NTA3IDUuNDc5MjYgMTQuMDAyNCA2LjAzMDk1IDE0LjAwMjQgNi43MTE1TDE0LjAwMjQgOC43NjI0NkwxNC4wMDI5IDguMDE5ODNDMTQuMDAyOSA3LjMzOTI5IDE0LjU1NDYgNi43ODc1OSAxNS4yMzUyIDYuNzg3NTlDMTUuOTE1NyA2Ljc4NzU5IDE2LjQ2NzQgNy4zMzkyOCAxNi40Njc0IDguMDE5ODNWMTEuNDk3TDE2LjQ2NzUgMTIuNDQ2N0MxNi40Njc1IDE0LjA4MjEgMTUuODA5NiAxNS42NDg3IDE0LjY0MiAxNi43OTM4VjE3LjMyNjJDMTQuNjQyIDE3Ljc4NjQgMTQuMjY4OSAxOC4xNTk1IDEzLjgwODcgMTguMTU5NUg4LjE3MzE3QzcuNzEyOTMgMTguMTU5NSA3LjMzOTg0IDE3Ljc4NjQgNy4zMzk4NCAxNy4zMjYyVjE1Ljk0MjRMNS4zNDU2MiAxNC43NTM0QzQuNTg5MjQgMTQuMzAyNCA0LjEyNTkxIDEzLjQ4NjcgNC4xMjU4OSAxMi42MDYxTDQuMTI1ODMgOS4yODM4M0M0LjEyNTgyIDguOTU0MjcgNC4zMjAwMyA4LjY1NTY2IDQuNjIxMjkgOC41MjIwNUw2LjYxODE3IDcuNjM2MzRWNS41OTg3NVoiIGZpbGw9IndoaXRlIi8+CjxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBkPSJNMTAuNDg3OCAzLjI0OTAyQzExLjI3OTYgMy4yNDkwMiAxMS45Nzc4IDMuNjQ5MDIgMTIuMzkxNyA0LjI1Nzk2QzEyLjUxNTEgNC4yMzkwNiAxMi42NDE2IDQuMjI5MjYgMTIuNzcwMyA0LjIyOTI2QzEzLjcyMjQgNC4yMjkyNiAxNC41NDkzIDQuNzY1MzEgMTQuOTY1NyA1LjU1MjA3QzE1LjA1NDMgNS41NDI1IDE1LjE0NDIgNS41Mzc1OSAxNS4yMzUzIDUuNTM3NTlDMTYuNjA2MiA1LjUzNzU5IDE3LjcxNzYgNi42NDg5MyAxNy43MTc2IDguMDE5ODNMMTcuNzE3NyAxMi40NDY3QzE3LjcxNzcgMTQuMjM1NSAxNy4wNjQ3IDE1Ljk1NTkgMTUuODkyMSAxNy4yOTA0VjE3LjMyNjJDMTUuODkyMSAxOC40NzY4IDE0Ljk1OTQgMTkuNDA5NSAxMy44MDg4IDE5LjQwOTVIOC4xNzMzMkM3LjAyMjczIDE5LjQwOTUgNi4wODk5OCAxOC40NzY4IDYuMDg5OTggMTcuMzI2MlYxNi42NTI0TDQuNzA1NjMgMTUuODI3QzMuNTcxMDYgMTUuMTUwNSAyLjg3NjA3IDEzLjkyNzEgMi44NzYwNCAxMi42MDYxTDIuODc1OTggOS4yODM4NUMyLjg3NTk2IDguNDU5OTYgMy4zNjE0OSA3LjcxMzQ1IDQuMTE0NjIgNy4zNzk0TDUuMzY4MzIgNi44MjMzM1Y1LjU5ODc1QzUuMzY4MzIgNC4xMjg4NSA2LjU1OTkxIDIuOTM3MjYgOC4wMjk4MiAyLjkzNzI2QzguNjA4MzEgMi45MzcyNiA5LjE0MzU1IDMuMTIxNyA5LjU4MDA1IDMuNDM1MDVDOS44NTg1MyAzLjMxNTMyIDEwLjE2NTQgMy4yNDkwMiAxMC40ODc4IDMuMjQ5MDJaTTEyLjQ0NzkgNS41MjE4NlY5LjQ3NTU3QzEyLjQ0NzkgOS43Mjc2MiAxMi4yNDM2IDkuOTMxOTUgMTEuOTkxNiA5LjkzMTk1QzExLjc1NjggOS45MzE5NSAxMS41NjM0IDkuNzU0NjUgMTEuNTM4IDkuNTI2NjNDMTEuNTM2MSA5LjUwOTg3IDExLjUzNTIgOS40OTI4MyAxMS41MzUyIDkuNDc1NTdWNS40NzE1OEMxMS41MTU0IDUuMjAwODMgMTEuMzkzIDQuOTU4NTggMTEuMjA2NiA0Ljc4MzU4QzExLjAxODggNC42MDcxMSAxMC43NjU5IDQuNDk5MDIgMTAuNDg3OCA0LjQ5OTAyQzEwLjQ3NjYgNC40OTkwMiAxMC40NjU0IDQuNDk5MTkgMTAuNDU0MiA0LjQ5OTU0QzkuOTAzNDcgNC41MTY4NCA5LjQ1OTY0IDQuOTU4MjQgOS40Mzg0NCA1LjUwODAxQzkuNDM4MiA1LjUwNDMgOS40Mzc5NSA1LjUwMDU4IDkuNDM3NjkgNS40OTY4OFY5LjkwMjQzQzkuNDM3NjkgMTAuMTU0NSA5LjIzMzM2IDEwLjM1ODggOC45ODEzMSAxMC4zNTg4QzguNzI5MjUgMTAuMzU4OCA4LjUyNDkyIDEwLjE1NDUgOC41MjQ5MiA5LjkwMjQzVjQuMjc2NTNDOC4zNzA4NiA0LjIxODgyIDguMjA0MDIgNC4xODcyNiA4LjAyOTgyIDQuMTg3MjZDNy4yNTAyNyA0LjE4NzI2IDYuNjE4MzIgNC44MTkyIDYuNjE4MzIgNS41OTg3NUw2LjYxODI3IDkuOTc1OTlDNi42MTgyNyAxMC4yMjggNi40MTM5NCAxMC40MzI0IDYuMTYxODkgMTAuNDMyNEM1LjkwOTgzIDEwLjQzMjQgNS43MDU1IDEwLjIyOCA1LjcwNTUgOS45NzU5OVY4LjA0MTIyTDQuNjIxNDQgOC41MjIwNUM0LjMyMDE4IDguNjU1NjYgNC4xMjU5NyA4Ljk1NDI3IDQuMTI1OTggOS4yODM4M0w0LjEyNjA0IDEyLjYwNjFDNC4xMjYwNiAxMy40ODY3IDQuNTg5MzkgMTQuMzAyNCA1LjM0NTc2IDE0Ljc1MzRMNy4zMzk5OCAxNS45NDI0VjE3LjMyNjJDNy4zMzk5OCAxNy43ODY0IDcuNzEzMDggMTguMTU5NSA4LjE3MzMyIDE4LjE1OTVIMTMuODA4OEMxNC4yNjkgMTguMTU5NSAxNC42NDIxIDE3Ljc4NjQgMTQuNjQyMSAxNy4zMjYyVjE2Ljc5MzhDMTUuNzM4MSAxNS43MTkgMTYuMzg1IDE0LjI3MjggMTYuNDYwMyAxMi43NDdDMTYuNDY0NiAxMi42NiAxNi40NjcgMTIuNTcyOCAxNi40Njc2IDEyLjQ4NTRMMTYuNDY3NyAxMi40NDY3TDE2LjQ2NzYgOC4wMTk4M0MxNi40Njc2IDcuMzQ1MDQgMTUuOTI1MiA2Ljc5NjkzIDE1LjI1MjUgNi43ODc3MUwxNS4yMzUzIDYuNzg3NTlDMTUuMTI1IDYuNzg3NTkgMTUuMDE4IDYuODAyMSAxNC45MTYyIDYuODI5MzFWOS42MDEzNkMxNC45MTYyIDkuODUzNDIgMTQuNzExOSAxMC4wNTc3IDE0LjQ1OTggMTAuMDU3N0MxNC4yMDc4IDEwLjA1NzcgMTQuMDAzNCA5Ljg1MzQxIDE0LjAwMzQgOS42MDEzNlY3Ljk4OTg1QzE0LjAwMzIgNy45OTk4MiAxNC4wMDMxIDguMDA5ODEgMTQuMDAzMSA4LjAxOTgzTDE0LjAwMzQgOS42MDEzNkwxNC4wMDI1IDYuNzExNUMxNC4wMDI1IDYuNDQ5NzQgMTMuOTIwOSA2LjIwNzA1IDEzLjc4MTggNi4wMDc0OEMxMy41NjIgNS42OTI0MiAxMy4xOTg5IDUuNDg0ODMgMTIuNzg3IDUuNDc5MzdMMTIuNzcwMyA1LjQ3OTI2QzEyLjY1ODggNS40NzkyNiAxMi41NTA3IDUuNDk0MDggMTIuNDQ3OSA1LjUyMTg2WiIgZmlsbD0iIzFEMUMyMyIvPgo8L3N2Zz4="), auto',
|
|
110
|
+
// },
|
|
111
|
+
|
|
112
|
+
fromNodeJSON(node, json, isFirstCreate) {
|
|
113
|
+
initFormDataFromJSON(node, json, isFirstCreate);
|
|
114
|
+
return;
|
|
115
|
+
},
|
|
116
|
+
toNodeJSON(node: WorkflowNodeEntity): WorkflowNodeJSON {
|
|
117
|
+
const nodeError = node.getData<FlowNodeErrorData>(FlowNodeErrorData)?.getError();
|
|
118
|
+
// 如果节点有错误,这里抛出错误,避免后面的代码执行异常
|
|
119
|
+
if (nodeError) {
|
|
120
|
+
throw nodeError;
|
|
121
|
+
}
|
|
122
|
+
const transform = node.getData<TransformData>(TransformData)!;
|
|
123
|
+
|
|
124
|
+
let formJSON = toFormJSON(node);
|
|
125
|
+
const metaData: Record<string, unknown> = {};
|
|
126
|
+
|
|
127
|
+
// 持久化子画布位置
|
|
128
|
+
const nodeMeta = node.getNodeMeta<WorkflowNodeMeta>();
|
|
129
|
+
const subCanvas = nodeMeta.subCanvas?.(node);
|
|
130
|
+
if (subCanvas?.isCanvas === false) {
|
|
131
|
+
const canvasNodeTransform =
|
|
132
|
+
subCanvas.canvasNode.getData<FlowNodeTransformData>(FlowNodeTransformData);
|
|
133
|
+
const { x, y } = canvasNodeTransform.transform.position;
|
|
134
|
+
metaData.canvasPosition = { x, y };
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
const json: WorkflowNodeJSON = {
|
|
138
|
+
id: node.id,
|
|
139
|
+
type: node.flowNodeType,
|
|
140
|
+
meta: {
|
|
141
|
+
position: { x: transform.position.x, y: transform.position.y },
|
|
142
|
+
...metaData,
|
|
143
|
+
},
|
|
144
|
+
data: formJSON,
|
|
145
|
+
};
|
|
146
|
+
return json;
|
|
147
|
+
},
|
|
148
|
+
};
|