@blueking/flow-canvas 0.0.1-beta.4 → 0.0.2
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/README.md +118 -35
- package/dist/index.cjs.js +1 -1
- package/dist/index.d.ts +17 -6
- package/dist/index.esm.js +1067 -932
- package/dist/style.css +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -81,6 +81,7 @@ npm install @antv/x6 @antv/x6-plugin-minimap @antv/x6-plugin-selection @antv/x6-
|
|
|
81
81
|
CanvasRuntime,
|
|
82
82
|
CanvasLayout,
|
|
83
83
|
CanvasToolbar,
|
|
84
|
+
createBuiltinEdgeTypes,
|
|
84
85
|
selectionPlugin,
|
|
85
86
|
snaplinePlugin,
|
|
86
87
|
connectionValidatorPlugin,
|
|
@@ -91,24 +92,19 @@ npm install @antv/x6 @antv/x6-plugin-minimap @antv/x6-plugin-selection @antv/x6-
|
|
|
91
92
|
import '@blueking/flow-canvas/style';
|
|
92
93
|
import MyTaskNode from './components/my-task-node.vue';
|
|
93
94
|
|
|
95
|
+
const builtinEdgeTypes = createBuiltinEdgeTypes();
|
|
96
|
+
|
|
94
97
|
const schema: CanvasSchema = {
|
|
95
98
|
nodeTypes: {
|
|
96
99
|
task: {
|
|
97
100
|
component: MyTaskNode,
|
|
98
101
|
getSize: () => ({ width: 180, height: 60 }),
|
|
99
|
-
getPorts: () => [
|
|
100
|
-
{ id: 'left', group: 'left' },
|
|
101
|
-
{ id: 'right', group: 'right' },
|
|
102
|
-
],
|
|
103
102
|
},
|
|
104
103
|
},
|
|
105
104
|
edgeTypes: {
|
|
106
|
-
|
|
107
|
-
router: { name: 'manhattan', args: { padding: 10 } },
|
|
108
|
-
connector: 'rounded',
|
|
109
|
-
},
|
|
105
|
+
bezier: builtinEdgeTypes.bezier,
|
|
110
106
|
},
|
|
111
|
-
defaultEdgeType: '
|
|
107
|
+
defaultEdgeType: 'bezier',
|
|
112
108
|
};
|
|
113
109
|
|
|
114
110
|
const initialFlowModel: FlowModel = {
|
|
@@ -152,6 +148,8 @@ npm install @antv/x6 @antv/x6-plugin-minimap @antv/x6-plugin-selection @antv/x6-
|
|
|
152
148
|
</script>
|
|
153
149
|
```
|
|
154
150
|
|
|
151
|
+
这个示例刻意省略了 `getPorts`,因为当前版本在未提供 `getPorts` / `node.ports` 时会自动补齐默认四向端口,普通自定义节点通常只需要关注 `component` 和 `getSize`。
|
|
152
|
+
|
|
155
153
|
<br>
|
|
156
154
|
|
|
157
155
|
## 核心 API
|
|
@@ -205,7 +203,7 @@ interface FlowNodeModel {
|
|
|
205
203
|
type: string; // 对应 schema.nodeTypes 的 key
|
|
206
204
|
position: { x: number; y: number };
|
|
207
205
|
label?: string;
|
|
208
|
-
ports?: FlowPortModel[];
|
|
206
|
+
ports?: FlowPortModel[]; // 业务自定义端口;未提供 getPorts() 时优先读取,缺省时引擎自动补四向默认端口
|
|
209
207
|
payload?: Record<string, unknown>; // 业务数据
|
|
210
208
|
extensions?: Record<string, unknown>; // 扩展数据
|
|
211
209
|
}
|
|
@@ -239,6 +237,30 @@ interface CanvasNodeDefinition {
|
|
|
239
237
|
|
|
240
238
|
节点 Vue 组件内可通过 `inject('getNode')` 获取 X6 Node 实例,读取 `node.getData()` 访问 `FlowNodeModel`。
|
|
241
239
|
|
|
240
|
+
#### 端口来源与 `getPorts` 选型
|
|
241
|
+
|
|
242
|
+
`getSize` 是必填;`getPorts` 和 `getBehavior` 都是可选。
|
|
243
|
+
|
|
244
|
+
运行时解析节点端口的优先级如下:
|
|
245
|
+
|
|
246
|
+
1. `definition.getPorts(node)`
|
|
247
|
+
2. `node.ports`
|
|
248
|
+
3. 默认四向端口(top/right/bottom/left)
|
|
249
|
+
|
|
250
|
+
这意味着:
|
|
251
|
+
|
|
252
|
+
- 不写 `getPorts` 且 `node.ports` 也未提供时,引擎会自动补一套默认四向端口,位置位于四条边中点
|
|
253
|
+
- 默认 quick-add 会直接绑定到这套默认端口中的 `group: 'right'`,因此普通自定义节点只定义 `component/getSize/getBehavior` 也能保持默认右侧交互
|
|
254
|
+
- 引擎内置的是四个方向端口组的默认位置和样式模板;默认兜底端口也复用这套约定
|
|
255
|
+
- 如果你想显式禁用端口,需要返回空数组,例如 `getPorts: () => []` 或设置 `node.ports = []`
|
|
256
|
+
|
|
257
|
+
推荐使用方式:
|
|
258
|
+
|
|
259
|
+
- 端口结构按节点类型固定时,用 `getPorts`
|
|
260
|
+
- 端口结构需要根据当前节点数据动态计算时,用 `getPorts`
|
|
261
|
+
- 端口本身属于业务数据、需要随 `FlowModel` 持久化或导入导出时,用 `node.ports`
|
|
262
|
+
- 如果同时提供了 `getPorts` 和 `node.ports`,运行时以前者为准
|
|
263
|
+
|
|
242
264
|
### 边类型定义
|
|
243
265
|
|
|
244
266
|
```typescript
|
|
@@ -347,6 +369,27 @@ const { schema, paletteItems } = createDefaultSchema({
|
|
|
347
369
|
});
|
|
348
370
|
```
|
|
349
371
|
|
|
372
|
+
**在自定义 Schema 中复用内置边类型:**
|
|
373
|
+
|
|
374
|
+
当你没有使用 `createDefaultSchema()`,而是像适配层那样手写 `CanvasSchema` 时,可以通过 `createBuiltinEdgeTypes()` 直接复用引擎内置的 `manhattan` / `bezier` 定义,避免在业务包里重复拷贝一份。
|
|
375
|
+
|
|
376
|
+
```typescript
|
|
377
|
+
import { createBuiltinEdgeTypes, type CanvasSchema } from '@blueking/flow-canvas';
|
|
378
|
+
|
|
379
|
+
const builtinEdgeTypes = createBuiltinEdgeTypes();
|
|
380
|
+
|
|
381
|
+
const schema: CanvasSchema = {
|
|
382
|
+
nodeTypes: {
|
|
383
|
+
/* ... */
|
|
384
|
+
},
|
|
385
|
+
edgeTypes: {
|
|
386
|
+
default: { ...builtinEdgeTypes.manhattan, labelDraggable: true },
|
|
387
|
+
...builtinEdgeTypes,
|
|
388
|
+
},
|
|
389
|
+
defaultEdgeType: 'bezier',
|
|
390
|
+
};
|
|
391
|
+
```
|
|
392
|
+
|
|
350
393
|
**手动定义边类型(不使用 `createDefaultSchema`):**
|
|
351
394
|
|
|
352
395
|
在手动编写 `CanvasSchema` 时,同样可以通过 `edgeTypes` 和 `defaultEdgeType` 配置连线样式:
|
|
@@ -611,7 +654,7 @@ if (result.status === 'applied') {
|
|
|
611
654
|
| editor | `CanvasEditorContext` | 编辑器实例(必填) |
|
|
612
655
|
| graphOptions | `Record<string, unknown>` | 额外 X6 Graph 选项 |
|
|
613
656
|
| nodeActions | `NodeActionsConfig` | 节点快捷操作工具栏配置(见下方详细说明) |
|
|
614
|
-
| quickAdd | `QuickAddConfig` |
|
|
657
|
+
| quickAdd | `QuickAddConfig` | 快捷添加按钮配置(默认绑定右侧端口,见下方详细说明) |
|
|
615
658
|
|
|
616
659
|
| Emit | 参数 | 说明 |
|
|
617
660
|
| -------- | --------------- | -------------------- |
|
|
@@ -619,7 +662,7 @@ if (result.status === 'applied') {
|
|
|
619
662
|
|
|
620
663
|
| Slot | Props | 说明 |
|
|
621
664
|
| --------------- | ------------------------------------------------ | ----------------------------------------------------------- |
|
|
622
|
-
| quick-add-panel | `{ node, api, insertNodeToRight, closePopover }` |
|
|
665
|
+
| quick-add-panel | `{ node, api, insertNodeToRight, closePopover }` | 快捷添加弹层内容,点击绑定端口上的"+"按钮时显示(默认显示提示文字) |
|
|
623
666
|
|
|
624
667
|
#### 节点快捷操作工具栏
|
|
625
668
|
|
|
@@ -665,10 +708,10 @@ if (result.status === 'applied') {
|
|
|
665
708
|
|
|
666
709
|
#### 节点快捷添加按钮(Quick Add)
|
|
667
710
|
|
|
668
|
-
hover
|
|
711
|
+
hover 节点时,指定端口会显示为"+"按钮,支持点击弹出面板和拖拽发起连线。默认绑定右侧 `group: 'right'` 端口。通过 `quickAdd` prop 进行全局配置:
|
|
669
712
|
|
|
670
713
|
```html
|
|
671
|
-
<CanvasRuntime :editor="editor" :quick-add="{ enabled: true }">
|
|
714
|
+
<CanvasRuntime :editor="editor" :quick-add="{ enabled: true, portGroup: 'right' }">
|
|
672
715
|
<template #quick-add-panel="{ node, api, insertNodeToRight, closePopover }">
|
|
673
716
|
<!-- 自定义节点选择面板 -->
|
|
674
717
|
</template>
|
|
@@ -677,10 +720,13 @@ hover 节点时,右侧端口显示为"+"按钮,支持点击弹出面板和
|
|
|
677
720
|
|
|
678
721
|
**QuickAddConfig(全局配置)**
|
|
679
722
|
|
|
680
|
-
| 属性 | 类型 | 默认
|
|
681
|
-
| ------------- | --------- |
|
|
682
|
-
| `enabled` | `boolean` | `true`
|
|
683
|
-
| `tooltipText` | `string` | `''`
|
|
723
|
+
| 属性 | 类型 | 默认 | 说明 |
|
|
724
|
+
| ------------- | --------- | --------- | -------------------------------------------------------------- |
|
|
725
|
+
| `enabled` | `boolean` | `true` | 全局开关 |
|
|
726
|
+
| `tooltipText` | `string` | `''` | 自定义 tooltip 文案(空值使用内置提示) |
|
|
727
|
+
| `portGroup` | `string` | `'right'` | quick-add 默认绑定的端口分组;节点不存在该分组端口时不显示 quick-add |
|
|
728
|
+
| `getPort` | `function` | - | 精确指定当前节点使用哪个 port;优先级高于 `portGroup` |
|
|
729
|
+
| `insertDirection` | `string \| function` | - | 点击 quick-add 插入节点时使用的方向;默认跟随当前绑定 port 的标准方向,不可推断时回退为 `'right'` |
|
|
684
730
|
|
|
685
731
|
**NodeBehaviorConfig 中的快捷添加相关字段(逐节点控制)**
|
|
686
732
|
|
|
@@ -690,13 +736,51 @@ hover 节点时,右侧端口显示为"+"按钮,支持点击弹出面板和
|
|
|
690
736
|
|
|
691
737
|
生效规则:显示 = `global.enabled !== false` AND `perNode.quickAddEnabled !== false`。
|
|
692
738
|
|
|
739
|
+
对于未显式提供 `getPorts` / `node.ports` 的自定义节点,quick-add 会落到引擎自动补齐的默认四向端口上,因此默认右侧交互仍然可用。
|
|
740
|
+
|
|
741
|
+
`getPort(node, ports)` 优先级高于 `portGroup`,适合一个节点存在多个同分组 port,或端口选择依赖节点数据的场景。
|
|
742
|
+
|
|
743
|
+
`insertDirection` 用于控制点击 quick-add 后的插入方向:
|
|
744
|
+
|
|
745
|
+
- 不传时:优先跟随当前绑定 port 的标准方向(`top/right/bottom/left`)
|
|
746
|
+
- 如果当前绑定 port 不是标准方向:回退为 `'right'`
|
|
747
|
+
- 传字符串时:固定使用该方向
|
|
748
|
+
- 传函数时:可根据节点和当前绑定 port 动态决定方向
|
|
749
|
+
|
|
750
|
+
`portGroup` / `getPort` 只控制 quick-add 绑定到哪个端口、"+"按钮显示在哪个端口上,以及拖拽从哪个端口发起。
|
|
751
|
+
|
|
752
|
+
slot 中提供的 `insertNodeToRight` helper 出于兼容仍保留这个名字,但它现在会遵循 `insertDirection` 的配置,不再总是向右插入。
|
|
753
|
+
|
|
754
|
+
**自定义 quick-add 端口选择:**
|
|
755
|
+
|
|
756
|
+
```vue
|
|
757
|
+
<CanvasRuntime
|
|
758
|
+
:editor="editor"
|
|
759
|
+
:quick-add="{
|
|
760
|
+
enabled: true,
|
|
761
|
+
portGroup: 'right',
|
|
762
|
+
getPort: (node, ports) => {
|
|
763
|
+
if (node.type === 'gateway') {
|
|
764
|
+
return ports.find((port) => port.id === 'branch_out_main') ?? null;
|
|
765
|
+
}
|
|
766
|
+
return null; // 返回 null 时退回使用 portGroup
|
|
767
|
+
},
|
|
768
|
+
insertDirection: (node, port) => {
|
|
769
|
+
if (node.type === 'gateway' && port?.group === 'bottom') {
|
|
770
|
+
return 'bottom';
|
|
771
|
+
}
|
|
772
|
+
return null; // 返回 null 时按默认推导
|
|
773
|
+
},
|
|
774
|
+
}" />
|
|
775
|
+
```
|
|
776
|
+
|
|
693
777
|
**quick-add-panel Slot Props**
|
|
694
778
|
|
|
695
779
|
| Prop | 类型 | 说明 |
|
|
696
780
|
| ------------------- | ------------------------------------------------- | ------------------------------- |
|
|
697
781
|
| `node` | `FlowNodeModel` | 当前触发的源节点 |
|
|
698
782
|
| `api` | `CanvasApi` | 画布 API |
|
|
699
|
-
| `insertNodeToRight` | `(node: Omit<FlowNodeModel, 'position'>) => void` | 快捷插入方法(自动连线 +
|
|
783
|
+
| `insertNodeToRight` | `(node: Omit<FlowNodeModel, 'position'>) => void` | 快捷插入方法(自动连线 + 事件);方向遵循 `insertDirection` 配置 |
|
|
700
784
|
| `closePopover` | `() => void` | 关闭弹层 |
|
|
701
785
|
|
|
702
786
|
操作触发后通过 `@ui-event` 发出对应事件:`node.quick-add`(弹层打开时)/ `node.action.quick-insert`(插入成功时)。
|
|
@@ -706,7 +790,7 @@ hover 节点时,右侧端口显示为"+"按钮,支持点击弹出面板和
|
|
|
706
790
|
```vue
|
|
707
791
|
<template>
|
|
708
792
|
<CanvasLayout :editor="editor" :palette-items="paletteItems">
|
|
709
|
-
<CanvasRuntime :editor="editor" :quick-add="{ enabled: true }" @ui-event="handleUiEvent">
|
|
793
|
+
<CanvasRuntime :editor="editor" :quick-add="{ enabled: true, portGroup: 'right' }" @ui-event="handleUiEvent">
|
|
710
794
|
<template #quick-add-panel="{ node, insertNodeToRight, closePopover }">
|
|
711
795
|
<div class="quick-add-menu">
|
|
712
796
|
<div class="quick-add-menu__title">选择节点类型</div>
|
|
@@ -1061,18 +1145,17 @@ const customItems = [
|
|
|
1061
1145
|
### 在 Schema 中注册节点组件
|
|
1062
1146
|
|
|
1063
1147
|
```typescript
|
|
1148
|
+
import { createBuiltinEdgeTypes } from '@blueking/flow-canvas';
|
|
1064
1149
|
import MyTaskNode from './components/my-task-node.vue';
|
|
1065
1150
|
import MyGatewayNode from './components/my-gateway-node.vue';
|
|
1066
1151
|
|
|
1152
|
+
const builtinEdgeTypes = createBuiltinEdgeTypes();
|
|
1153
|
+
|
|
1067
1154
|
const schema: CanvasSchema = {
|
|
1068
1155
|
nodeTypes: {
|
|
1069
1156
|
task: {
|
|
1070
1157
|
component: MyTaskNode,
|
|
1071
1158
|
getSize: () => ({ width: 180, height: 60 }),
|
|
1072
|
-
getPorts: () => [
|
|
1073
|
-
{ id: 'left', group: 'left' },
|
|
1074
|
-
{ id: 'right', group: 'right' },
|
|
1075
|
-
],
|
|
1076
1159
|
getBehavior: (node, ctx) => ({
|
|
1077
1160
|
deletable: true,
|
|
1078
1161
|
copyable: true,
|
|
@@ -1095,18 +1178,14 @@ const schema: CanvasSchema = {
|
|
|
1095
1178
|
},
|
|
1096
1179
|
},
|
|
1097
1180
|
edgeTypes: {
|
|
1098
|
-
|
|
1099
|
-
connector: { name: 'smooth' },
|
|
1100
|
-
style: (_edge, state) => ({
|
|
1101
|
-
stroke: state.hovered ? '#3a84ff' : '#abb5cc',
|
|
1102
|
-
strokeWidth: 2,
|
|
1103
|
-
}),
|
|
1104
|
-
},
|
|
1181
|
+
bezier: builtinEdgeTypes.bezier,
|
|
1105
1182
|
},
|
|
1106
|
-
defaultEdgeType: '
|
|
1183
|
+
defaultEdgeType: 'bezier',
|
|
1107
1184
|
};
|
|
1108
1185
|
```
|
|
1109
1186
|
|
|
1187
|
+
上面这个例子里,`task` 故意不写 `getPorts`,直接复用引擎默认四向端口;`gateway` 保留 `getPorts`,用于演示“当节点需要显式控制端口拓扑时再覆盖默认行为”。
|
|
1188
|
+
|
|
1110
1189
|
<br>
|
|
1111
1190
|
|
|
1112
1191
|
## CanvasApi
|
|
@@ -1132,7 +1211,7 @@ const schema: CanvasSchema = {
|
|
|
1132
1211
|
| exportAsImage(options?) | 导出为 PNG Blob |
|
|
1133
1212
|
| exportAsSVG() | 导出为 SVG 字符串 |
|
|
1134
1213
|
| overlay | `OverlayManager` 实例,提供节点屏幕定位 |
|
|
1135
|
-
| insertNodeToRight(sourceNodeId, node, options?) |
|
|
1214
|
+
| insertNodeToRight(sourceNodeId, node, options?) | 默认在指定节点右侧插入新节点;传 `options.direction` 后可改为上/右/下/左方向,并支持自动连线和重叠检测 |
|
|
1136
1215
|
| getContextMenuItems(position) | 收集插件提供的右键菜单项 |
|
|
1137
1216
|
| onGraphEvent(event, handler) | 监听 X6 底层事件,返回取消函数 |
|
|
1138
1217
|
| unsafeGetGraph() | 获取 X6 Graph 实例(谨慎使用) |
|
|
@@ -1262,6 +1341,7 @@ const myPlugin: CanvasPlugin = {
|
|
|
1262
1341
|
| 导出 | 说明 |
|
|
1263
1342
|
| ------------------------------------------------- | --------------------------------------------------------------------------------- |
|
|
1264
1343
|
| `createEmptyFlowModel()` | 创建一个空的 FlowModel(`version: '1.0'`, 空 nodes/edges) |
|
|
1344
|
+
| `createBuiltinEdgeTypes()` | 返回引擎内置的 `manhattan` / `bezier` 边类型定义,适合自定义 Schema 直接复用 |
|
|
1265
1345
|
| `generateId()` | 生成唯一 ID |
|
|
1266
1346
|
| `applyCanvasCommand(model, cmd)` | 纯函数 reducer,将单条命令应用到 FlowModel,返回新 FlowModel |
|
|
1267
1347
|
| `createCanvasHistory(initialFlowModel, options?)` | 创建独立的历史管理器实例(通常由 `useCanvasEditor` 内部调用,高级场景可直接使用) |
|
|
@@ -1373,8 +1453,11 @@ editor.history.clear();
|
|
|
1373
1453
|
| `CanvasToolbarItem` | 工具栏项配置 |
|
|
1374
1454
|
| `BuiltinToolbarType` | 内置工具类型(`'undo'` / `'redo'` / `'select'` / `'auto-layout'` / `'search'` / `'minimap'` / `'export'` / `'zoom-in'` / `'zoom-out'` / `'reset'` 等) |
|
|
1375
1455
|
| `NodeActionsConfig` | 节点快捷操作工具栏全局配置(showDebug / showDelete / showCopy / showCopyInsert / showDisconnect / insertGap) |
|
|
1376
|
-
| `QuickAddConfig` | 快捷添加按钮全局配置(enabled / tooltipText)
|
|
1377
|
-
| `
|
|
1456
|
+
| `QuickAddConfig` | 快捷添加按钮全局配置(enabled / tooltipText / portGroup / getPort) |
|
|
1457
|
+
| `QuickAddPortResolver` | quick-add 端口选择回调类型;返回具体 port 后,优先级高于 `portGroup` |
|
|
1458
|
+
| `QuickAddInsertDirectionResolver` | quick-add 插入方向回调类型;返回具体方向后,优先级高于默认方向推导 |
|
|
1459
|
+
| `InsertDirection` | 节点插入方向类型(`'top' \| 'right' \| 'bottom' \| 'left'`) |
|
|
1460
|
+
| `InsertNodeOptions` | `insertNodeToRight` 选项(autoWireEdges / gap / source / label / direction) |
|
|
1378
1461
|
| `ExportOptions` | 导出选项(backgroundColor / padding / quality) |
|
|
1379
1462
|
| `ConnectionValidator` | 连接校验函数类型 |
|
|
1380
1463
|
| `ConnectionValidateContext` | 连接校验上下文 |
|