aldehyde 0.2.479 → 0.2.480

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 (153) hide show
  1. package/lib/controls/2dEditor/components/card.js +2 -2
  2. package/lib/controls/2dEditor/components/card.js.map +1 -1
  3. package/lib/controls/entity-select/entity-select.js +3 -3
  4. package/lib/controls/entity-select/entity-select.js.map +1 -1
  5. package/lib/draw-canvas-edit/components/asset-bar/index.d.ts +1 -0
  6. package/lib/draw-canvas-edit/components/asset-bar/index.d.ts.map +1 -1
  7. package/lib/draw-canvas-edit/components/asset-bar/index.js +8 -6
  8. package/lib/draw-canvas-edit/components/asset-bar/index.js.map +1 -1
  9. package/lib/draw-canvas-edit/components/main-header/index.less +3 -0
  10. package/lib/draw-canvas-edit/components/render/draws/bg-draw.d.ts.map +1 -1
  11. package/lib/draw-canvas-edit/components/render/draws/bg-draw.js +14 -1
  12. package/lib/draw-canvas-edit/components/render/draws/bg-draw.js.map +1 -1
  13. package/lib/draw-canvas-edit/components/render/draws/contextmenu-draw.d.ts.map +1 -1
  14. package/lib/draw-canvas-edit/components/render/draws/contextmenu-draw.js +30 -6
  15. package/lib/draw-canvas-edit/components/render/draws/contextmenu-draw.js.map +1 -1
  16. package/lib/draw-canvas-edit/components/render/graphs/bezier.js +3 -3
  17. package/lib/draw-canvas-edit/components/render/graphs/bezier.js.map +1 -1
  18. package/lib/draw-canvas-edit/components/render/graphs/circle.js +2 -2
  19. package/lib/draw-canvas-edit/components/render/graphs/circle.js.map +1 -1
  20. package/lib/draw-canvas-edit/components/render/graphs/curve.js +3 -3
  21. package/lib/draw-canvas-edit/components/render/graphs/curve.js.map +1 -1
  22. package/lib/draw-canvas-edit/components/render/graphs/line.js +3 -3
  23. package/lib/draw-canvas-edit/components/render/graphs/line.js.map +1 -1
  24. package/lib/draw-canvas-edit/components/render/graphs/rect.js +2 -2
  25. package/lib/draw-canvas-edit/components/render/graphs/rect.js.map +1 -1
  26. package/lib/draw-canvas-edit/components/render/handlers/drag-outside-handlers.d.ts +1 -1
  27. package/lib/draw-canvas-edit/components/render/handlers/drag-outside-handlers.d.ts.map +1 -1
  28. package/lib/draw-canvas-edit/components/render/handlers/drag-outside-handlers.js +58 -122
  29. package/lib/draw-canvas-edit/components/render/handlers/drag-outside-handlers.js.map +1 -1
  30. package/lib/draw-canvas-edit/components/render/handlers/graph-handlers.d.ts.map +1 -1
  31. package/lib/draw-canvas-edit/components/render/handlers/graph-handlers.js +2 -1
  32. package/lib/draw-canvas-edit/components/render/handlers/graph-handlers.js.map +1 -1
  33. package/lib/draw-canvas-edit/components/render/handlers/selection-handlers.d.ts.map +1 -1
  34. package/lib/draw-canvas-edit/components/render/handlers/selection-handlers.js +11 -4
  35. package/lib/draw-canvas-edit/components/render/handlers/selection-handlers.js.map +1 -1
  36. package/lib/draw-canvas-edit/components/render/index.d.ts +3 -1
  37. package/lib/draw-canvas-edit/components/render/index.d.ts.map +1 -1
  38. package/lib/draw-canvas-edit/components/render/index.js +37 -26
  39. package/lib/draw-canvas-edit/components/render/index.js.map +1 -1
  40. package/lib/draw-canvas-edit/components/render/tools/attract-tool.d.ts +2 -1
  41. package/lib/draw-canvas-edit/components/render/tools/attract-tool.d.ts.map +1 -1
  42. package/lib/draw-canvas-edit/components/render/tools/attract-tool.js +33 -8
  43. package/lib/draw-canvas-edit/components/render/tools/attract-tool.js.map +1 -1
  44. package/lib/draw-canvas-edit/components/render/tools/component-factory.d.ts +62 -0
  45. package/lib/draw-canvas-edit/components/render/tools/component-factory.d.ts.map +1 -0
  46. package/lib/draw-canvas-edit/components/render/tools/component-factory.js +289 -0
  47. package/lib/draw-canvas-edit/components/render/tools/component-factory.js.map +1 -0
  48. package/lib/draw-canvas-edit/components/render/tools/copy-tool.d.ts +0 -2
  49. package/lib/draw-canvas-edit/components/render/tools/copy-tool.d.ts.map +1 -1
  50. package/lib/draw-canvas-edit/components/render/tools/copy-tool.js +23 -45
  51. package/lib/draw-canvas-edit/components/render/tools/copy-tool.js.map +1 -1
  52. package/lib/draw-canvas-edit/components/render/tools/import-export-tool.d.ts.map +1 -1
  53. package/lib/draw-canvas-edit/components/render/tools/import-export-tool.js +20 -41
  54. package/lib/draw-canvas-edit/components/render/tools/import-export-tool.js.map +1 -1
  55. package/lib/draw-canvas-edit/components/render/tools/index.d.ts +1 -0
  56. package/lib/draw-canvas-edit/components/render/tools/index.d.ts.map +1 -1
  57. package/lib/draw-canvas-edit/components/render/tools/index.js +1 -0
  58. package/lib/draw-canvas-edit/components/render/tools/index.js.map +1 -1
  59. package/lib/draw-canvas-edit/components/render/tools/selection-tool.d.ts.map +1 -1
  60. package/lib/draw-canvas-edit/components/render/tools/selection-tool.js +32 -19
  61. package/lib/draw-canvas-edit/components/render/tools/selection-tool.js.map +1 -1
  62. package/lib/draw-canvas-edit/components/render/types.d.ts +8 -6
  63. package/lib/draw-canvas-edit/components/render/types.d.ts.map +1 -1
  64. package/lib/draw-canvas-edit/components/render/types.js.map +1 -1
  65. package/lib/draw-canvas-edit/components/setting-form/imag-upload.d.ts.map +1 -1
  66. package/lib/draw-canvas-edit/components/setting-form/imag-upload.js +2 -2
  67. package/lib/draw-canvas-edit/components/setting-form/imag-upload.js.map +1 -1
  68. package/lib/draw-canvas-edit/components/setting-form/index.d.ts.map +1 -1
  69. package/lib/draw-canvas-edit/components/setting-form/index.js +3 -5
  70. package/lib/draw-canvas-edit/components/setting-form/index.js.map +1 -1
  71. package/lib/draw-canvas-edit/index.d.ts.map +1 -1
  72. package/lib/draw-canvas-edit/index.js +4 -1
  73. package/lib/draw-canvas-edit/index.js.map +1 -1
  74. package/lib/draw-canvas-view/index.d.ts.map +1 -1
  75. package/lib/draw-canvas-view/index.js +4 -2
  76. package/lib/draw-canvas-view/index.js.map +1 -1
  77. package/lib/draw-canvas-view/view.d.ts +2 -0
  78. package/lib/draw-canvas-view/view.d.ts.map +1 -1
  79. package/lib/draw-canvas-view/view.js +46 -35
  80. package/lib/draw-canvas-view/view.js.map +1 -1
  81. package/lib/form/criteria-form.js +17 -17
  82. package/lib/form/criteria-form.js.map +1 -1
  83. package/lib/form/dtmpl-form.d.ts.map +1 -1
  84. package/lib/form/dtmpl-form.js +9 -0
  85. package/lib/form/dtmpl-form.js.map +1 -1
  86. package/lib/form/form-Item-group.js +2 -2
  87. package/lib/form/form-Item-group.js.map +1 -1
  88. package/lib/module/dtmpl-edit-card.js +4 -4
  89. package/lib/module/dtmpl-edit-card.js.map +1 -1
  90. package/lib/module/dtmpl-edit-page.d.ts.map +1 -1
  91. package/lib/module/dtmpl-edit-page.js +7 -4
  92. package/lib/module/dtmpl-edit-page.js.map +1 -1
  93. package/lib/table/act-table.js +8 -8
  94. package/lib/table/act-table.js.map +1 -1
  95. package/lib/table/modal-select-table.d.ts +2 -2
  96. package/lib/table/modal-select-table.d.ts.map +1 -1
  97. package/lib/table/modal-select-table.js +10 -10
  98. package/lib/table/modal-select-table.js.map +1 -1
  99. package/lib/table/relation-table.d.ts +2 -2
  100. package/lib/table/relation-table.js +1 -1
  101. package/lib/table/relation-table.js.map +1 -1
  102. package/lib/table/select-table.js +2 -2
  103. package/lib/table/select-table.js.map +1 -1
  104. package/lib/tmpl/hc-data-source.js +2 -2
  105. package/lib/tmpl/hc-data-source.js.map +1 -1
  106. package/lib/tmpl/interface.d.ts +7 -7
  107. package/lib/tmpl/interface.d.ts.map +1 -1
  108. package/lib/tmpl/tmpl-config-analysis.d.ts.map +1 -1
  109. package/lib/tmpl/tmpl-config-analysis.js +23 -23
  110. package/lib/tmpl/tmpl-config-analysis.js.map +1 -1
  111. package/lib/units/index.js +3 -3
  112. package/lib/units/index.js.map +1 -1
  113. package/package.json +1 -1
  114. package/src/aldehyde/controls/2dEditor/components/card.tsx +2 -2
  115. package/src/aldehyde/controls/entity-select/entity-select.tsx +3 -3
  116. package/src/aldehyde/draw-canvas-edit/components/asset-bar/index.tsx +8 -6
  117. package/src/aldehyde/draw-canvas-edit/components/main-header/index.less +3 -0
  118. package/src/aldehyde/draw-canvas-edit/components/render/draws/bg-draw.ts +17 -1
  119. package/src/aldehyde/draw-canvas-edit/components/render/draws/contextmenu-draw.ts +30 -6
  120. package/src/aldehyde/draw-canvas-edit/components/render/graphs/bezier.ts +3 -3
  121. package/src/aldehyde/draw-canvas-edit/components/render/graphs/circle.ts +2 -2
  122. package/src/aldehyde/draw-canvas-edit/components/render/graphs/curve.ts +3 -3
  123. package/src/aldehyde/draw-canvas-edit/components/render/graphs/line.ts +3 -3
  124. package/src/aldehyde/draw-canvas-edit/components/render/graphs/rect.ts +2 -2
  125. package/src/aldehyde/draw-canvas-edit/components/render/handlers/drag-outside-handlers.ts +45 -130
  126. package/src/aldehyde/draw-canvas-edit/components/render/handlers/graph-handlers.ts +7 -1
  127. package/src/aldehyde/draw-canvas-edit/components/render/handlers/selection-handlers.ts +11 -5
  128. package/src/aldehyde/draw-canvas-edit/components/render/index.ts +38 -29
  129. package/src/aldehyde/draw-canvas-edit/components/render/tools/attract-tool.ts +30 -10
  130. package/src/aldehyde/draw-canvas-edit/components/render/tools/component-factory.ts +302 -0
  131. package/src/aldehyde/draw-canvas-edit/components/render/tools/copy-tool.ts +24 -46
  132. package/src/aldehyde/draw-canvas-edit/components/render/tools/import-export-tool.ts +22 -46
  133. package/src/aldehyde/draw-canvas-edit/components/render/tools/index.ts +1 -0
  134. package/src/aldehyde/draw-canvas-edit/components/render/tools/selection-tool.ts +34 -23
  135. package/src/aldehyde/draw-canvas-edit/components/render/types.ts +6 -6
  136. package/src/aldehyde/draw-canvas-edit/components/setting-form/imag-upload.tsx +2 -1
  137. package/src/aldehyde/draw-canvas-edit/components/setting-form/index.tsx +3 -5
  138. package/src/aldehyde/draw-canvas-edit/index.tsx +4 -1
  139. package/src/aldehyde/draw-canvas-view/index.tsx +3 -1
  140. package/src/aldehyde/draw-canvas-view/view.tsx +228 -212
  141. package/src/aldehyde/form/criteria-form.tsx +18 -18
  142. package/src/aldehyde/form/dtmpl-form.tsx +9 -0
  143. package/src/aldehyde/form/form-Item-group.tsx +2 -2
  144. package/src/aldehyde/module/dtmpl-edit-card.tsx +4 -4
  145. package/src/aldehyde/module/dtmpl-edit-page.tsx +7 -4
  146. package/src/aldehyde/table/act-table.tsx +8 -8
  147. package/src/aldehyde/table/modal-select-table.tsx +10 -10
  148. package/src/aldehyde/table/relation-table.tsx +1 -1
  149. package/src/aldehyde/table/select-table.tsx +2 -2
  150. package/src/aldehyde/tmpl/hc-data-source.tsx +2 -2
  151. package/src/aldehyde/tmpl/interface.tsx +7 -7
  152. package/src/aldehyde/tmpl/tmpl-config-analysis.tsx +23 -24
  153. package/src/aldehyde/units/index.tsx +3 -3
@@ -0,0 +1,302 @@
1
+ import Konva from 'konva';
2
+ import { nanoid } from 'nanoid';
3
+ import { Render } from '../index';
4
+ import { AssetType, AssetInfoPoint, AssetSettings, LinkDrawPoint } from '../types';
5
+ import { handleImgUrl } from "../../asset-bar/index";
6
+
7
+ // 统一组件创建
8
+
9
+ interface workstationSettings extends AssetSettings {
10
+ workstationNumber: string; // 工位编号
11
+ }
12
+
13
+ export interface CreateImageComponentOptions {
14
+ src: string;
15
+ type: string;
16
+ componentType?: string;
17
+ }
18
+
19
+ export interface CreateJsonComponentOptions {
20
+ src: string;
21
+ }
22
+
23
+ export class ComponentFactory {
24
+ private render: Render;
25
+
26
+ constructor(render: Render) {
27
+ this.render = render;
28
+ }
29
+
30
+ /**
31
+ * 创建图片组件(svg、gif、png等)
32
+ */
33
+ async createImageComponent(options: CreateImageComponentOptions) {
34
+ const { src, type, componentType } = options;
35
+ const { pageHeight, pageWidth } = this.render.getPageSettings()
36
+ const target = await this.render.assetTool[{ svg: "loadSvg", gif: "loadGif" }[type] || "loadImg"](handleImgUrl(src));
37
+ let width = target.width();
38
+ let height = target.height();
39
+ if (width > pageWidth || height > pageHeight) { // 原图尺寸超过页面大小时进行缩放
40
+ const sizeScale = Math.min(pageWidth / width, pageHeight / height);
41
+ width *= sizeScale;
42
+ height *= sizeScale;
43
+ target.setSize({ width, height });
44
+ }
45
+ const group = new Konva.Group({
46
+ id: nanoid(),
47
+ width,
48
+ height,
49
+ name: 'asset',
50
+ assetType: AssetType.Image,
51
+ draggable: true,
52
+ componentType,
53
+ componentSrc: src,
54
+ imageType: ["svg", "gif", "other"].includes(type) ? type : "other"
55
+ });
56
+ this.render.setAssetSettings(group, this.render.getAssetSettings(), false);
57
+ group.add(target);
58
+ const points: AssetInfoPoint[] = [
59
+ { x: 0, y: group.height() / 2, direction: 'left' }, // 左
60
+ { x: group.width(), y: group.height() / 2, direction: 'right' }, // 右
61
+ { x: group.width() / 2, y: 0, direction: 'top' }, // 上
62
+ { x: group.width() / 2, y: group.height(), direction: 'bottom' } // 下
63
+ ];
64
+ return { group, points };
65
+ }
66
+
67
+ /**
68
+ * 创建 JSON 组合组件
69
+ */
70
+ async createJsonComponent(options: CreateJsonComponentOptions) {
71
+ const { src } = options;
72
+ const { pageHeight, pageWidth } = this.render.getPageSettings()
73
+ const target = await this.render.assetTool["loadJson"](handleImgUrl(src));
74
+ let width = target.width();
75
+ let height = target.height();
76
+ if (width > pageWidth || height > pageHeight) { // 原图尺寸超过页面大小时进行缩放
77
+ const sizeScale = Math.min(pageWidth / width, pageHeight / height);
78
+ width *= sizeScale;
79
+ height *= sizeScale;
80
+ target.setSize({ width, height });
81
+ }
82
+ target.id(nanoid());
83
+ target.setAttrs({
84
+ name: 'asset',
85
+ assetType: AssetType.Json,
86
+ draggable: true
87
+ });
88
+ target.setAttrs({ x: 0, y: 0 } as any);
89
+ this.render.linkTool.groupIdCover(target);
90
+ return { group: target };
91
+ }
92
+
93
+ // 创建Tooltip
94
+ createTooltipComponent(props: { x: number, y: number }) {
95
+ const { x = 0, y = 0 } = props;
96
+ // 创建一个标签容器
97
+ const tooltip = new Konva.Label({ name: "tooltip", x, y, opacity: 0.75, visible: false, listening: false });
98
+ // 往标签上面添加带箭头的背景形状
99
+ tooltip.add(
100
+ new Konva.Tag({
101
+ fill: 'black',
102
+ pointerDirection: 'down', // 箭头方向
103
+ pointerWidth: 6,
104
+ pointerHeight: 6,
105
+ cornerRadius: 4,
106
+ lineJoin: 'round'
107
+ })
108
+ );
109
+ // 往标签上面添加文字
110
+ const tooltipText = new Konva.Text({
111
+ name: "tooltip-text",
112
+ text: '提示框',
113
+ fontSize: 12,
114
+ padding: 4,
115
+ fill: 'white'
116
+ });
117
+ tooltip.add(tooltipText);
118
+ return tooltip;
119
+ }
120
+
121
+ // 更新Tooltip
122
+ updateTooltipText(node: Konva.Group, newText: string) {
123
+ const tooltipNode = node.findOne('.tooltip') as Konva.Label;
124
+ if (!tooltipNode) {
125
+ return;
126
+ }
127
+ const textNode = tooltipNode.findOne('.tooltip-text') as Konva.Text;
128
+ textNode.setAttr("text", newText);
129
+ }
130
+
131
+ /**
132
+ * 根据 componentType 创建特定类型组件
133
+ */
134
+ async createTypedComponent(options: CreateImageComponentOptions) {
135
+ const { src, type, componentType } = options;
136
+ const { themeToken } = this.render.config || {};
137
+ let comGroup: { group: Konva.Group; points: AssetInfoPoint[] };
138
+ let group: Konva.Group;
139
+ let points: AssetInfoPoint[];
140
+ switch (componentType) {
141
+ case "workstation": // 工位
142
+ const workstationNodes = this.render.getAllAssets()?.filter(asset => asset.componentType === "workstation");
143
+ const order = Math.max(...workstationNodes.map(asset => asset.settings.order), 0) + 1; // 当前工位序号,自增
144
+ comGroup = await this.createImageComponent({ src, type, componentType });
145
+ group = comGroup.group;
146
+ points = comGroup.points;
147
+ const fontSize = Math.min(group.width(), group.height()) * 0.5;
148
+ const text = new Konva.Text({
149
+ name: "order",
150
+ text: `${order}`,
151
+ fontSize, // 字体大小随半径变化
152
+ fontFamily: 'Arial',
153
+ fill: themeToken.colorPrimary || "#000000",
154
+ align: 'center',
155
+ offsetX: 0,
156
+ offsetY: 0,
157
+ width: group.width()
158
+ });
159
+ text.x(0);
160
+ text.y(group.height() / 2 - text.height() / 7);
161
+ const tooltip = this.createTooltipComponent({ x: group.width() / 2, y: group.height() / 2 });
162
+ group.add(text);
163
+ group.add(tooltip);
164
+ this.render.setAssetSettings(group, { ...this.render.getAssetSettings(group), order }, true);
165
+ break;
166
+ default:
167
+ comGroup = await this.createImageComponent({ src, type, componentType });
168
+ group = comGroup.group;
169
+ points = comGroup.points;
170
+ break;
171
+ }
172
+ return { group, points };
173
+ }
174
+
175
+ // 创建组件连接点
176
+ createComponentLinkPoints(props: { showPoints: string, points: AssetInfoPoint[], group: Konva.Group }) {
177
+ const { showPoints, points, group } = props;
178
+ if (showPoints === "true") {
179
+ // 连接点信息
180
+ group.setAttrs({
181
+ points: points.map((o) => ({ ...o, id: nanoid(), groupId: group.id(), visible: false, pairs: [], direction: o.direction }) as LinkDrawPoint)
182
+ });
183
+ // 连接点锚点
184
+ for (const point of group.getAttr('points') ?? []) {
185
+ group.add(
186
+ new Konva.Circle({
187
+ name: 'link-anchor',
188
+ id: point.id,
189
+ x: point.x,
190
+ y: point.y,
191
+ radius: this.render.toStageValue(1),
192
+ stroke: 'rgba(0,0,255,1)',
193
+ strokeWidth: this.render.toStageValue(2),
194
+ visible: false,
195
+ direction: point.direction,
196
+ })
197
+ );
198
+ }
199
+ }
200
+ }
201
+
202
+ // 渲染页组件设置鼠标移入移出样式
203
+ setCursorPointer = (node: Konva.Group) => {
204
+ node.on('mouseenter', function () {
205
+ const container = this.getStage().getContent();
206
+ container.style.cursor = 'pointer';
207
+ });
208
+ node.on('mouseleave', function () {
209
+ const container = this.getStage().getContent();
210
+ container.style.cursor = 'default';
211
+ });
212
+ }
213
+
214
+ // 只读页面组件初始化更新
215
+ readonlyInitComponentSetting(props: { node: Konva.Group }) {
216
+ const { node } = props;
217
+ const { componentType } = node.getAttrs() || {};
218
+ switch (componentType) {
219
+ case "workstation": // 工位
220
+ const orderText = node.findOne(".order");
221
+ orderText?.visible?.(false); // 只读页面不显示工位序号
222
+ this.setCursorPointer(node);
223
+ break;
224
+ default:
225
+ break;
226
+ }
227
+ }
228
+
229
+ // 更新组件设置
230
+ updateComponentSetting(props: { node: Konva.Group, settings: AssetSettings }) {
231
+ const { node, settings } = props;
232
+ const { componentType } = node.getAttrs() || {};
233
+ switch (componentType) {
234
+ case "workstation":
235
+ this.updateTooltipText(node, (settings as workstationSettings).workstationNumber); // 工位编号弹窗
236
+ node.findOne(".order")?.setAttr("text", settings.order); // 工位序号显示
237
+ break;
238
+ default:
239
+ break;
240
+ }
241
+ }
242
+
243
+ // 克隆组件更新组件配置
244
+ updateCloneNodeSetting(nodes: Konva.Group[]) {
245
+ const allAssets = this.render.getAllAssets();
246
+ const workstationOrders = allAssets?.filter(asset => asset.componentType === "workstation")?.map(asset => asset.settings.order) || []; // 工位组件自增序号
247
+ nodes.forEach(node => {
248
+ const { componentType } = node.getAttrs() || {};
249
+ switch (componentType) {
250
+ case "workstation": // 工位
251
+ const order = Math.max(...workstationOrders, 0) + 1; // 当前工位序号,自增
252
+ workstationOrders.push(order);
253
+ const orderText = node.findOne(".order");
254
+ this.render.setAssetSettings(node, { ...this.render.getAssetSettings(node), order }, true);
255
+ orderText.setAttr("text", order);
256
+ break;
257
+ default:
258
+ break;
259
+ }
260
+ });
261
+ }
262
+
263
+ // 克隆已有节点(用于复制粘贴)
264
+ cloneNodes(nodes: Konva.Node[]): Konva.Node[] {
265
+ const clones: Konva.Group[] = [];
266
+ for (const node of nodes) {
267
+ if (node instanceof Konva.Transformer) {
268
+ // 复制已选择:递归处理 selectingNodes
269
+ const backup = [...this.render.selectionTool.selectingNodes];
270
+ this.render.selectionTool.selectingClear();
271
+ this.render.linkTool.selectingClear();
272
+ return this.cloneNodes(backup);
273
+ }
274
+ const newNode = node.clone();
275
+ clones.push(newNode);
276
+ }
277
+ this.updateCloneNodeSetting(clones);
278
+ return clones;
279
+ }
280
+
281
+ // 组件鼠标移入事件
282
+ groupMouseenter = ({ group }) => {
283
+ group.off('mouseenter');
284
+ group.on('mouseenter', () => {
285
+ this.render.linkTool.pointsVisible(true, group); // 显示 连接点
286
+ const tooltipNode = group.findOne(".tooltip");
287
+ if (tooltipNode) { // 组件存在tooltip且存在文本显示
288
+ const isText = tooltipNode.findOne(".tooltip-text")?.getAttr("text");
289
+ if (isText) tooltipNode.visible(true);
290
+ }
291
+ });
292
+ };
293
+
294
+ // 组件鼠标移出事件
295
+ groupMouseleave = ({ group }) => {
296
+ group.off('mouseleave');
297
+ group.on('mouseleave', () => {
298
+ this.render.linkTool.pointsVisible(false, group);
299
+ group.findOne(".tooltip")?.visible(false);
300
+ });
301
+ };
302
+ }
@@ -183,25 +183,14 @@ export class CopyTool {
183
183
 
184
184
  for (const node of nodes) {
185
185
  if (node instanceof Konva.Group) {
186
- node.off('mouseenter');
187
- node.on('mouseenter', () => {
188
- // 显示 连接点
189
- this.render.linkTool.pointsVisible(true, node);
190
- });
191
- node.off('mouseleave');
192
- node.on('mouseleave', () => {
193
- // 隐藏 连接点
194
- this.render.linkTool.pointsVisible(false, node);
195
- // 隐藏 hover 框
196
- node.findOne('#hoverRect')?.visible(false);
197
- });
198
-
186
+ // 重新绑定鼠标事件
187
+ this.render.componentFactory.groupMouseenter({ group: node });
188
+ this.render.componentFactory.groupMouseleave({ group: node });
199
189
  // 使新节点产生偏移
200
190
  node.setAttrs({
201
191
  x: node.x() + this.render.toStageValue(this.render.bgSize) * this.pasteCount,
202
- y: node.y() + this.render.toStageValue(this.render.bgSize) * this.pasteCount
192
+ y: node.y() + this.render.toStageValue(this.render.bgSize) * this.pasteCount,
203
193
  });
204
-
205
194
  // 拐点也需要偏移
206
195
  if (node.attrs.manualPointsMap) {
207
196
  const manualPointsMap = {} as ManualPointsMap;
@@ -214,9 +203,9 @@ export class CopyTool {
214
203
  for (const pairId in manualPointsMap) {
215
204
  const manualPoints = manualPointsMap[pairId];
216
205
  if (Array.isArray(manualPoints)) {
217
- manualPointsMap[pairId] = manualPoints.map((o) => ({
206
+ manualPointsMap[pairId] = manualPoints.map((o: any) => ({
218
207
  x: o.x + this.render.toStageValue(this.render.bgSize) * this.pasteCount,
219
- y: o.y + this.render.toStageValue(this.render.bgSize) * this.pasteCount
208
+ y: o.y + this.render.toStageValue(this.render.bgSize) * this.pasteCount,
220
209
  }));
221
210
  }
222
211
  }
@@ -230,38 +219,27 @@ export class CopyTool {
230
219
  /**
231
220
  * 复制粘贴
232
221
  * @param nodes 节点数组
233
- * @param skip 跳过检查
234
- * @returns 复制的元素
235
222
  */
236
223
  copy(nodes: Konva.Node[]) {
237
- const clones: Konva.Group[] = [];
238
- for (const node of nodes) {
239
- if (node instanceof Konva.Transformer) {
240
- // 复制已选择
241
- const backup = [...this.render.selectionTool.selectingNodes];
242
- this.render.selectionTool.selectingClear();
243
- this.render.linkTool.selectingClear();
244
- this.copy(backup);
245
- return;
246
- } else {
247
- // 复制未选择(先记录,后处理)
248
- clones.push(node.clone());
249
- }
250
- }
251
- // 刷新 id、事件
224
+ // 使用 ComponentFactory 克隆节点
225
+ const clones = this.render.componentFactory.cloneNodes(nodes);
226
+ // 刷新 id、事件、偏移
252
227
  this.nodesIdCover(clones);
253
228
  // 插入新节点
254
- this.render.layer.add(...clones);
255
- // 选中复制内容
256
- this.render.selectionTool.select(clones);
257
- // 更新历史
258
- this.render.updateHistory();
259
- // 重绘
260
- this.render.redraw([
261
- GraphDraw.name,
262
- LinkDraw.name,
263
- RulerDraw.name,
264
- PreviewDraw.name
265
- ]);
229
+ const validGroups = clones.filter((o) => o instanceof Konva.Group) as Konva.Group[];
230
+ if (validGroups.length > 0) {
231
+ this.render.layer.add(...validGroups);
232
+ // 选中复制内容
233
+ this.render.selectionTool.select(validGroups);
234
+ // 更新历史
235
+ this.render.updateHistory();
236
+ // 重绘
237
+ this.render.redraw([
238
+ GraphDraw.name,
239
+ LinkDraw.name,
240
+ RulerDraw.name,
241
+ PreviewDraw.name
242
+ ]);
243
+ }
266
244
  }
267
245
  }
@@ -36,7 +36,7 @@ export class ImportExportTool {
36
36
  // 如果当前被选中,listening 会是 false,需恢复
37
37
  node.listening(true);
38
38
  // 恢复 draggable(因为,绘制 Graph 的时候,不允许直接拖动其他素材)
39
- node.draggable(!this.render.config.readonly);
39
+ node.draggable(!this.render.config.readonly && !node.attrs.locked);
40
40
  for (const child of (node as Konva.Group).children) {
41
41
  if (this.render.ignoreSelect(child)) {
42
42
  child.remove();
@@ -107,29 +107,21 @@ export class ImportExportTool {
107
107
  await this.restoreImage(node.getChildren());
108
108
  } else if (node instanceof Konva.Image) {
109
109
  // 处理图片
110
- if (node.attrs.svgXML) {
111
- // svg 素材
110
+ if (node.attrs.svgXML) { // svg 素材
112
111
  const blob = new Blob([node.attrs.svgXML], { type: 'image/svg+xml' });
113
- // dataurl
114
112
  const url = URL.createObjectURL(blob);
115
- // 加载为图片 element
116
113
  const image = await this.loadImage(url);
117
- if (image) {
118
- // 设置图片
114
+ if (image) { // 设置图片
119
115
  node.image(image);
120
116
  }
121
- } else if (node.attrs.gif) {
122
- // gif 素材
117
+ } else if (node.attrs.gif) { // gif 素材
123
118
  const imageNode = await this.render.assetTool.loadGif(node.attrs.gif);
124
119
  if (imageNode) {
125
- // 设置图片
126
120
  node.image(imageNode.image());
127
121
  }
128
- } else if (node.attrs.src) {
129
- // 其他图片素材
122
+ } else if (node.attrs.src) { // 其他图片素材
130
123
  const image = await this.loadImage(node.attrs.src);
131
124
  if (image) {
132
- // 设置图片
133
125
  node.image(image);
134
126
  }
135
127
  }
@@ -186,9 +178,12 @@ export class ImportExportTool {
186
178
  }
187
179
  }
188
180
 
189
- // 恢复
181
+ // 恢复(导入)
190
182
  async restore(json: string, silent = false) {
191
-
183
+ if (!Object.keys(JSON.parse(json)).length) {
184
+ return;
185
+ }
186
+ const readonly = this.render.config.readonly;
192
187
  try {
193
188
  this.render.emit('loading', true);
194
189
  // 清空选择
@@ -197,9 +192,9 @@ export class ImportExportTool {
197
192
  // 清空 main layer 节点
198
193
  this.render.layer.getChildren().forEach((o) => o.destroy());
199
194
  this.render.layer.removeChildren();
200
-
201
195
  // 加载 json,提取节点
202
196
  const container = document.createElement('div');
197
+ // 反序列化
203
198
  const stage = Konva.Node.create(json, container);
204
199
  const main = stage.getChildren()[0];
205
200
  const nodes = main.getChildren();
@@ -208,34 +203,15 @@ export class ImportExportTool {
208
203
  await this.restoreGraph(nodes);
209
204
  for (const node of nodes) {
210
205
  // 重置旧数据节点为可 draggable
211
- // 为了使旧数据和新节点一样
212
- // 可以直接被拖动
213
- node.draggable(!this.render.config.readonly);
214
- node.off('mouseenter');
215
- node.on('mouseenter', () => {
216
- // 显示 连接点
217
- this.render.linkTool.pointsVisible(true, node);
218
- });
219
- // 恢复的时候,恢复 hoverRect
220
- node.add(
221
- new Konva.Rect({
222
- id: 'hoverRect',
223
- width: node.width(),
224
- height: node.height(),
225
- fill: 'rgba(0,255,0,0.3)',
226
- visible: false
227
- })
228
- );
229
- node.off('mouseleave');
230
- node.on('mouseleave', () => {
231
- // 隐藏 连接点
232
- this.render.linkTool.pointsVisible(false, node);
233
- // 隐藏 hover 框
234
- node.findOne('#hoverRect')?.visible(false);
235
- });
206
+ node.draggable(!readonly && !node.attrs.locked);
207
+ // 组件鼠标移入移出事件
208
+ this.render.componentFactory.groupMouseenter({ group: node });
209
+ this.render.componentFactory.groupMouseleave({ group: node });
210
+ if (readonly) {
211
+ this.render.componentFactory.readonlyInitComponentSetting({ node });
212
+ }
236
213
  }
237
- // 往 main layer 插入新节点
238
- this.render.layer.add(...nodes);
214
+ this.render.layer.add(...nodes); // 插入节点
239
215
  // 同步页面设置
240
216
  this.render.stage.setAttr('pageSettings', stage.attrs.pageSettings);
241
217
  this.render.emit('page-settings-change', this.render.getPageSettings());
@@ -554,9 +530,9 @@ export class ImportExportTool {
554
530
 
555
531
  // 合并设置
556
532
  const assetSettings: AssetSettings = {
557
- stroke: pageSettings.stroke,
558
- strokeWidth: pageSettings.strokeWidth,
559
- fill: pageSettings.fill,
533
+ stroke: "#000000",
534
+ strokeWidth: 1,
535
+ fill: "#000000",
560
536
  arrowStart: false,
561
537
  arrowEnd: false,
562
538
  fontSize: pageSettings.fontSize,
@@ -7,3 +7,4 @@ export { ImportExportTool } from './import-export-tool';
7
7
  export { AlignTool } from './align-tool';
8
8
  export { LinkTool } from './link-tool';
9
9
  export { AttractTool } from './attract-tool';
10
+ export { ComponentFactory } from './component-factory';
@@ -49,28 +49,6 @@ export class SelectionTool {
49
49
 
50
50
  // 选择节点
51
51
  select(nodes: Konva.Node[]) {
52
- if (nodes.length > 1) {
53
- // 多选 不能改变大小/旋转
54
- this.render.transformer.resizeEnabled(false);
55
- this.render.transformer.rotateEnabled(false);
56
- } else {
57
- if (nodes.length === 1) {
58
- const target = nodes[0];
59
- // 图形 不能改变大小
60
- this.render.transformer.resizeEnabled(
61
- target.attrs.assetType === AssetType.Graph ? false : true
62
- );
63
- this.render.transformer.rotateEnabled(
64
- target.attrs.assetType === AssetType.Graph &&
65
- ["Line", "Curve", "Bezier"].includes(target.attrs.graphType)
66
- ? false
67
- : true
68
- );
69
- } else {
70
- this.render.transformer.resizeEnabled(true);
71
- }
72
- }
73
-
74
52
  // 清除连接线选中
75
53
  this.render.linkTool.selectingClear();
76
54
  // 选择变化了
@@ -96,6 +74,9 @@ export class SelectionTool {
96
74
  listening: false, // 不可交互
97
75
  opacity: node.opacity() * 0.8 // 设置透明度
98
76
  });
77
+ if (node instanceof Konva.Group) {
78
+ node.findOne(".tooltip")?.visible(false); // 存在tooltip,选中组件时隐藏
79
+ }
99
80
  }
100
81
 
101
82
  // 提升层次
@@ -109,6 +90,36 @@ export class SelectionTool {
109
90
  // 选中的节点,放进 transformer
110
91
  this.render.transformer.nodes(this.selectingNodes);
111
92
  }
93
+
94
+ // 设置 transformer 的 resize/rotate/draggable(必须在 selectingClear 和 transformer.nodes 之后)
95
+ const allLocked = nodes.length > 0 && nodes.every((n) => !!n.attrs.locked);
96
+ if (allLocked) {
97
+ this.render.transformer.resizeEnabled(false);
98
+ this.render.transformer.rotateEnabled(false);
99
+ this.render.transformer.draggable(false);
100
+ } else {
101
+ this.render.transformer.draggable(true);
102
+ if (nodes.length > 1) {
103
+ // 多选:允许改变大小和旋转
104
+ this.render.transformer.resizeEnabled(true);
105
+ this.render.transformer.rotateEnabled(true);
106
+ } else if (nodes.length === 1) {
107
+ const target = nodes[0];
108
+ // 图形 不能改变大小
109
+ this.render.transformer.resizeEnabled(
110
+ target.attrs.assetType === AssetType.Graph ? false : true
111
+ );
112
+ this.render.transformer.rotateEnabled(
113
+ target.attrs.assetType === AssetType.Graph &&
114
+ ["Line", "Curve", "Bezier"].includes(target.attrs.graphType)
115
+ ? false
116
+ : true
117
+ );
118
+ } else {
119
+ this.render.transformer.resizeEnabled(true);
120
+ }
121
+ }
122
+
112
123
  // 重绘
113
124
  this.render.redraw([GraphDraw.name, LinkDraw.name]);
114
125
  }
@@ -124,7 +135,7 @@ export class SelectionTool {
124
135
 
125
136
  // 选择所有节点
126
137
  selectAll() {
127
- const nodes = this.render.layer.find('.asset') as Konva.Node[];
138
+ const nodes = this.render.layer.find('.asset') as Konva.Group[];
128
139
  this.select(nodes);
129
140
  }
130
141
  }
@@ -13,6 +13,7 @@ export interface RenderConfig {
13
13
  attractBg?: boolean;
14
14
  attractNode?: boolean;
15
15
  readonly?: boolean;
16
+ themeToken?: { [key: string]: any };
16
17
  }
17
18
 
18
19
  export type RenderEvents = {
@@ -252,9 +253,6 @@ export interface PageSettings {
252
253
  src: string;
253
254
  code: string;
254
255
  };
255
- stroke: string;
256
- strokeWidth: number;
257
- fill: string;
258
256
  linkStroke: string;
259
257
  linkStrokeWidth: number;
260
258
  fontSize: number;
@@ -265,9 +263,9 @@ export interface PageSettings {
265
263
  * 素材设置
266
264
  */
267
265
  export interface AssetSettings {
268
- stroke: string;
269
- strokeWidth: number;
270
- fill: string;
266
+ stroke?: string;
267
+ strokeWidth?: number;
268
+ fill?: string;
271
269
  arrowStart: boolean;
272
270
  arrowEnd: boolean;
273
271
  fontSize: number;
@@ -277,6 +275,8 @@ export interface AssetSettings {
277
275
  y: number;
278
276
  rotation: number;
279
277
  tension: number;
278
+ dataSource?: string;
279
+ order?: number; // 序号(工位自增序号)
280
280
  }
281
281
 
282
282
  /**
@@ -79,7 +79,7 @@ const ImageUpload: React.FC<UploadProps> = (props) => {
79
79
  const url = handleImgUrl(basePath);
80
80
  setFileList([{ ...info.file, url }]);
81
81
  // onChange?.(url);
82
- onChange?.({ src: url, code });
82
+ onChange?.({ src: basePath, code });
83
83
  } else {
84
84
  setFileList([...info.fileList]);
85
85
  }
@@ -106,6 +106,7 @@ const ImageUpload: React.FC<UploadProps> = (props) => {
106
106
  onChange={handleChange}
107
107
  onRemove={handleDelete}
108
108
  onPreview={() => window.open(fileList[0].url)}
109
+ styles={{ root: { overflow: "hidden" } }}
109
110
  >
110
111
  {fileList.length > 0 ? null : <div className={'upload-btn'}>
111
112
  <PlusOutlined />