ice-entity-designer 0.0.21 → 0.0.23

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.
Files changed (43) hide show
  1. package/README.md +96 -1
  2. package/dist/index.cjs +3 -3
  3. package/dist/index.mjs +3 -3
  4. package/dist/index.umd.js +3 -3
  5. package/dist/react.cjs +3 -3
  6. package/dist/react.mjs +3 -3
  7. package/dist/types/bpmn/BpmnDesigner.d.mts +50 -0
  8. package/dist/types/bpmn/BpmnDesigner.d.ts +50 -0
  9. package/dist/types/bpmn/bpmn_shapes.d.mts +61 -0
  10. package/dist/types/bpmn/bpmn_shapes.d.ts +61 -0
  11. package/dist/types/bpmn/bpmn_validate.d.mts +24 -0
  12. package/dist/types/bpmn/bpmn_validate.d.ts +24 -0
  13. package/dist/types/bpmn/bpmn_xml.d.mts +46 -0
  14. package/dist/types/bpmn/bpmn_xml.d.ts +46 -0
  15. package/dist/types/flow/FlowDesigner.d.mts +23 -1
  16. package/dist/types/flow/FlowDesigner.d.ts +23 -1
  17. package/dist/types/flow/FlowEdge.d.mts +8 -0
  18. package/dist/types/flow/FlowEdge.d.ts +8 -0
  19. package/dist/types/flow/FlowNode.d.mts +40 -3
  20. package/dist/types/flow/FlowNode.d.ts +40 -3
  21. package/dist/types/ice-render/ICE.d.mts +36 -0
  22. package/dist/types/ice-render/ICE.d.ts +36 -0
  23. package/dist/types/ice-render/cross-platform/Path2DRecorder.d.mts +76 -0
  24. package/dist/types/ice-render/cross-platform/Path2DRecorder.d.ts +76 -0
  25. package/dist/types/ice-render/cross-platform/PolyfillPath2D.d.mts +8 -18
  26. package/dist/types/ice-render/cross-platform/PolyfillPath2D.d.ts +8 -18
  27. package/dist/types/ice-render/export/SvgExporter.d.mts +54 -0
  28. package/dist/types/ice-render/export/SvgExporter.d.ts +54 -0
  29. package/dist/types/ice-render/graphic/ICEComponent.d.mts +29 -7
  30. package/dist/types/ice-render/graphic/ICEComponent.d.ts +29 -7
  31. package/dist/types/ice-render/graphic/ICEPath.d.mts +7 -0
  32. package/dist/types/ice-render/graphic/ICEPath.d.ts +7 -0
  33. package/dist/types/ice-render/graphic/container/ICEGroup.d.mts +10 -0
  34. package/dist/types/ice-render/graphic/container/ICEGroup.d.ts +10 -0
  35. package/dist/types/ice-render/graphic/link/ICEPolyLine.d.mts +17 -0
  36. package/dist/types/ice-render/graphic/link/ICEPolyLine.d.ts +17 -0
  37. package/dist/types/ice-render/graphic/text/ICEText.d.mts +21 -0
  38. package/dist/types/ice-render/graphic/text/ICEText.d.ts +21 -0
  39. package/dist/types/ice-render/index.d.mts +2 -0
  40. package/dist/types/ice-render/index.d.ts +2 -0
  41. package/dist/types/index.d.mts +5 -0
  42. package/dist/types/index.d.ts +5 -0
  43. package/package.json +1 -1
package/README.md CHANGED
@@ -9,7 +9,7 @@
9
9
  <p align="center">
10
10
  <a href="./LICENSE"><img alt="license" src="https://img.shields.io/badge/license-MIT-047857.svg" /></a>
11
11
  <img alt="engine bundled" src="https://img.shields.io/badge/engine-bundled-047857.svg" />
12
- <img alt="tests" src="https://img.shields.io/badge/jest-15%20passed-047857.svg" />
12
+ <img alt="tests" src="https://img.shields.io/badge/jest-168%20passed-047857.svg" />
13
13
  <img alt="typescript" src="https://img.shields.io/badge/TypeScript-4.6-3178c6.svg" />
14
14
  </p>
15
15
 
@@ -58,6 +58,21 @@ IED(ice entity designer)是基于 [ice-render](https://github.com/ice-render
58
58
  - Undo / Redo(基于项目快照,最多 100 步)。
59
59
  - 项目级保存 / 加载(`serializeProject()` / `loadProject()`)。
60
60
 
61
+ ### BPMN 2.0 记法(`BpmnDesigner`)
62
+
63
+ 在**同一套节点 / 连线 / 历史 / 快照机制**上装载 BPMN 2.0 的业务记法,不另起一套模型:
64
+
65
+ - 八类图元:事件圆(开始 / 中间 / 结束 × 无 / 消息 / 定时 / 错误 / 终止触发)、网关菱形(排他 / 并行 /
66
+ 包容 / 事件)、任务与子流程(用户 / 服务 / 脚本 / 发送 / 接收 / 手动角标)、数据对象、文本注释、池、泳道。
67
+ - **池 → 泳道 → 节点是真嵌套**(引擎的容器能力),拖动池或泳道时内部图元与挂在它们上面的连线一起走;
68
+ 池的标题带与泳道的标题带不参与内容区,不会被内部图元压住。
69
+ - 三种流:`sequence` 顺序流、`message` 消息流(跨参与者,虚线 + 实心箭头)、`association` 关联
70
+ (数据对象 / 注释);顺序流可带条件表达式与「默认流」斜杠标记,标记是派生装饰,放在工具层、不污染文档。
71
+ - **BPMN 语义校验**:每个池至少一个开始事件、顺序流不得跨池、消息流应连接不同参与者、网关分支是否齐全、
72
+ 从开始事件的可达性等。
73
+ - **BPMN 2.0 XML 互操作**:`toBpmnXml()` 导出(含 `BPMNDI` 布局信息)、`fromBpmnXml()` 导入;
74
+ 这是**保布局的交换格式**,不是执行模型(条件只作为文本往返,无令牌仿真 / 边界事件订阅 / 多实例元数据)。
75
+
61
76
  ## 3. 界面预览
62
77
 
63
78
  完整的 ER 模型(电商交易 + 用户权限):
@@ -82,6 +97,12 @@ IED(ice entity designer)是基于 [ice-render](https://github.com/ice-render
82
97
 
83
98
  <img src="./tests/assets/flowchart-editor.png" alt="流程图编辑器示例" />
84
99
 
100
+ 再加一层业务记法就是 **BPMN 2.0**(`tests/bpmn-editor.html`):池 / 泳道真嵌套(拖动银行池,内部泳道、
101
+ 任务和连线一起平移)、事件 / 网关 / 任务角标 / 数据对象 / 注释、顺序流 + 条件与默认流标记、
102
+ 跨池的消息流,右侧面板按图元类型给出网关类型、事件种类、任务类型等属性,并内置语义校验与 BPMN 2.0 XML 导出:
103
+
104
+ <img src="./tests/assets/bpmn-editor.png" alt="BPMN 2.0 编辑器示例(信用卡申请审批)" />
105
+
85
106
  ## 4. 快速开始
86
107
 
87
108
  ```bash
@@ -95,6 +116,7 @@ npm run build
95
116
  |---|---|
96
117
  | `tests/entity-editor.html` | 交互式编辑器:实时编辑字段、创建/删除实体与关系、校验与保存加载;右侧面板含「TypeORM Schema」标签页 |
97
118
  | `tests/flowchart-editor.html` | 流程图编辑器:四类节点形状、拖拽、连线(含分支标签)、撤销重做、localStorage 存取与 JSON 导出;纯 DOM 面板,只依赖 `dist` 产物 |
119
+ | `tests/bpmn-editor.html` | BPMN 2.0 编辑器:信用卡申请审批案例(两个池 / 三条泳道)、八类图元、条件与默认流标记、语义校验、BPMN 2.0 XML 导入导出 |
98
120
  | [`ice-entity-designer-react-demo`](../ice-entity-designer-react-demo) | 独立的 React 集成示例工程(webpack + TypeScript),涵盖 ref / hook / onChange / 受控模式 |
99
121
 
100
122
  ```bash
@@ -183,6 +205,7 @@ flow.undo(); // 100 步历史
183
205
  | 样式 | 节点:`fillColor` / `strokeColor` / `textColor` / `fontSize`(`updateNode` 即时生效);连线:`style.strokeStyle`(线色,同时作为箭头填充)/ `style.lineWidth`、`labelStyle.fillStyle`(标签颜色),全部随快照存取 |
184
206
  | 增删改查 | `nodes` / `edges` / `selected` / `select()` / `updateNode()` / `updateEdge()` / `remove()`(删节点级联删连线)/ `clear()` |
185
207
  | 历史与快照 | `undo()` / `redo()` / `canUndo()` / `canRedo()`、`serialize()` / `toSnapshot()` / `load()`(返回 `{ loaded, nodes, edges, skipped }`)。文档 **v2 直接复用引擎的序列化机制**:`{ version: 2, kind: 'flowchart', scene: <引擎 Serializer 产物> }`,因此自定义 `data` 与任何新增 state 字段自动往返;v1(`nodes`/`edges` 数组)仍可读,导出统一为 v2 |
208
+ | 导出 | `toSvg(options)` —— 导出**矢量** SVG(放大不糊、可进设计工具/打印);与画布同一口径 |
186
209
  | 视图与订阅 | `fitViewport(padding)`、`subscribe()`、`dispose()` |
187
210
 
188
211
  自定义形状(判定菱形 / 输入输出平行四边形)在 `src/flow/flow_shapes.ts`,走的是引擎的 `ICEPath` 子类机制。
@@ -191,6 +214,69 @@ flow.undo(); // 100 步历史
191
214
  可运行的完整示例见 `tests/flowchart-editor.html`;React 用法见 [6.6](#66-流程图的-react-绑定);
192
215
  AI Agent 生成流程图的 JSON DSL 见 `ice-entity-designer-dsl`。
193
216
 
217
+ #### 5.3 BPMN 2.0(`BpmnDesigner`)
218
+
219
+ `BpmnDesigner` 继承 `FlowDesigner`,只补 BPMN 特有的事:顺序流上的条件 / 默认流标记(派生装饰,
220
+ 放在工具层、不进文档)与语义校验。其余能力(建节点 / 连线、选择、增删改、撤销重做、快照、适应视图、订阅)全部沿用:
221
+
222
+ ```js
223
+ import { ICE, BpmnDesigner, toBpmnXml, fromBpmnXml } from 'ice-entity-designer';
224
+
225
+ const ice = new ICE().init('canvas-1');
226
+ const bpmn = new BpmnDesigner(ice);
227
+ ice.alignmentGuide.enable({ threshold: 6 }); // 引擎自带的对齐标尺,BPMN 场景同样开启
228
+
229
+ // 池 / 泳道也是节点;节点按几何**自动嵌进最内层容器**(泳道优先于池)
230
+ const bank = bpmn.createNode('bpmnPool', { title: '银行', left: 60, top: 60, width: 1180, height: 340 });
231
+ bpmn.createNode('bpmnLane', { title: '受理岗', left: 60, top: 92, width: 1180, height: 150 });
232
+ const submit = bpmn.createNode('bpmnEvent', { title: '申请提交', eventKind: 'start', left: 240, top: 120 });
233
+ const verify = bpmn.createNode('bpmnTask', { title: '身份核验', taskType: 'service', left: 400, top: 100 });
234
+ const gateway = bpmn.createNode('bpmnGateway', { title: '是否通过', gatewayType: 'exclusive', left: 880, top: 255 });
235
+
236
+ bpmn.createEdge({ sourceId: submit.state.id, targetId: verify.state.id, label: '受理' });
237
+ bpmn.createEdge({ sourceId: verify.state.id, targetId: gateway.state.id, condition: '评分 >= 600', isDefault: true });
238
+
239
+ bpmn.validateBpmn(); // BPMN 语义问题列表(每个池一个开始事件、顺序流不跨池…)
240
+ const xml = toBpmnXml(bpmn); // BPMN 2.0 XML + BPMNDI 布局
241
+ const report = fromBpmnXml(xml, bpmn); // 导入并重建(含池 / 泳道容器)
242
+ ```
243
+
244
+ | 能力 | API |
245
+ |---|---|
246
+ | 节点类型 | `createNode('bpmnEvent' \| 'bpmnTask' \| 'bpmnGateway' \| 'bpmnSubprocess' \| 'bpmnDataObject' \| 'bpmnAnnotation' \| 'bpmnPool' \| 'bpmnLane', props)`;预设见 `FLOW_NODE_KINDS` |
247
+ | 语义属性 | 事件 `eventKind`(start / intermediate / end)+ `trigger`;网关 `gatewayType`;任务 / 子流程 `taskType` —— `updateNode()` 改完立即重建形状与角标 |
248
+ | 连线 | `createEdge({ sourceId, targetId, flowType: 'sequence' \| 'message' \| 'association', label, condition, isDefault, linkShape })`;线型与箭头由 `flowType` 派生 |
249
+ | 容器 | 池 `bpmnPool`(顶部 32px 标题带)、泳道 `bpmnLane`(左侧 32px 标题带);建节点时按几何自动嵌套,拖动容器时内部图元与连线一起走 |
250
+ | 校验与互操作 | `validateBpmn()`、`toBpmnXml(designer)`、`fromBpmnXml(xml, designer)` |
251
+ | 其余 | 与 `FlowDesigner` 完全相同:`nodes` / `edges` / `select()` / `updateNode()` / `updateEdge()` / `remove()` / `undo()` / `redo()` / `serialize()` / `load()` / `fitViewport()` / `subscribe()` |
252
+
253
+ BPMN 节点同样是**复合组件**(形状 + 角标 + 标记由 state 派生),内部子组件不写进文档、载入时重建。
254
+ AI Agent 生成 BPMN 的 JSON DSL(`kind: 'bpmn'`)见 `ice-entity-designer-dsl`。
255
+
256
+ #### 5.4 导出:矢量 SVG(与画布同一口径)
257
+
258
+ 画布的 `toDataURL()` 是**光栅快照**(分辨率写死、放大就糊)。需要出图给文档、打印或设计工具时用
259
+ **矢量导出** —— 它复用引擎的 `exportSvg()`,从组件树 + 路径命令流重新生成 SVG,与画布逐像素同一口径
260
+ (绘制顺序、世界矩阵、样式合并、透明度、祖先裁剪、虚线、渐变、阴影、连线标签):
261
+
262
+ ```js
263
+ // 流程图 / BPMN(应用层,FlowDesigner 与 BpmnDesigner 都有)
264
+ const svg = designer.toSvg(); // 内容自适应 + 透明背景
265
+ const svg = designer.toSvg({ background: '#ffffff', padding: 16 });
266
+ const svg = designer.toSvg({ area: 'viewport' }); // 当前视口所见即所导
267
+
268
+ // 任何场景(ER / 流程图 / BPMN 都能用,含 `{ svg, width, height }` 版本)
269
+ const svg = IED.exportSvg(ice, { scale: 2 });
270
+ const { svg, width, height } = IED.exportSvgResult(ice, { padding: 12 });
271
+ ```
272
+
273
+ `tests/bpmn-editor.html` 与 `tests/flowchart-editor.html` 上都有「导出 SVG」按钮,点一下即可下载
274
+ (BPMN 案例导出的池/泳道/事件/网关/连线/标签都是矢量)。服务端出图见引擎的 `ICE.headless()`。
275
+
276
+ 限制(与引擎一致):阴影用 `feDropShadow` 近似(模糊观感不会与画布逐像素相同);SVG 与 canvas 的
277
+ 字形栅格化是两套实现,文字位置**对齐口径一致、逐像素允许微差**;导出的是**静态瞬间**(蚂蚁线动画
278
+ 只保留当前相位)。
279
+
194
280
  ## 6. 在 React 中使用
195
281
 
196
282
  包内置 React 绑定(子路径导出 `ice-entity-designer/react`),不需要自己写 ref / effect 胶水代码。
@@ -327,6 +413,10 @@ export default function FlowEditor() {
327
413
 
328
414
  `onChange` 的语义与 ER 一致:任何改变模型的入口都会触发;额外多了一条——**画布上拖动节点也会触发**(`FlowDesigner` 订阅了引擎的 `BEFORE_MOVE` / `AFTER_MOVE`,并按帧合并),所以用 `onChange` 做自动保存能拿到拖拽后的最新坐标。
329
415
 
416
+ BPMN 目前走**命令式** `BpmnDesigner`(见 [5.3](#53-bpmn-20bpmndesigner)):它继承 `FlowDesigner`,
417
+ 需要的容器嵌套 / 语义校验 / XML 互操作都在命令式实例上,暂未额外提供 React 组件;
418
+ React 里可沿用 `createFlowSession` 的模式自建一层封装。
419
+
330
420
  ## 7. 项目结构
331
421
 
332
422
  ```
@@ -337,6 +427,11 @@ src/
337
427
  │ ├── FlowNode.ts # 节点:四类预设(起止 / 处理 / 判定 / 输入输出)+ 居中标题
338
428
  │ ├── FlowEdge.ts # 连线:正交 / 贝塞尔 + 箭头 + 分支标签,插槽吸附
339
429
  │ └── FlowDesigner.ts # 应用层:建节点/连线、选择、增删改、历史、快照存取、适应视图
430
+ ├── bpmn/ # BPMN 2.0(FlowDesigner 之上的业务记法)
431
+ │ ├── bpmn_shapes.ts # 形状:事件圆 / 网关菱形 / 任务角标 / 子流程标记 / 数据对象 / 注释 / 池泳道
432
+ │ ├── BpmnDesigner.ts # 应用层:容器真嵌套(池→泳道→节点)、条件与默认流标记、语义校验
433
+ │ ├── bpmn_validate.ts # BPMN 语义校验(开始事件 / 跨池顺序流 / 网关分支 / 可达性)
434
+ │ └── bpmn_xml.ts # BPMN 2.0 XML 导入导出(含 BPMNDI 布局)
340
435
  ├── er-component/
341
436
  │ ├── Entity.ts # 实体:表头 + 字段列表 + 约束标记 + TypeORM 序列化
342
437
  │ └── Relation.ts # 关系:基数 / 箭头 / 标签语义 / 连接槽位