aldehyde 0.2.474 → 0.2.475

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 (148) hide show
  1. package/lib/controls/action/utils.d.ts +1 -1
  2. package/lib/controls/entity-select/entity-select.d.ts +2 -2
  3. package/lib/controls/entity-select/entity-select.d.ts.map +1 -1
  4. package/lib/controls/entity-select/entity-select.js +16 -7
  5. package/lib/controls/entity-select/entity-select.js.map +1 -1
  6. package/lib/controls/entry-control.d.ts.map +1 -1
  7. package/lib/controls/entry-control.js +1 -0
  8. package/lib/controls/entry-control.js.map +1 -1
  9. package/lib/controls/select/index.d.ts.map +1 -1
  10. package/lib/controls/select/index.js +13 -7
  11. package/lib/controls/select/index.js.map +1 -1
  12. package/lib/controls/text/index.less +1 -0
  13. package/lib/controls/view-control.d.ts.map +1 -1
  14. package/lib/controls/view-control.js +1 -0
  15. package/lib/controls/view-control.js.map +1 -1
  16. package/lib/detail/button/edit-button.d.ts.map +1 -1
  17. package/lib/detail/button/edit-button.js +23 -11
  18. package/lib/detail/button/edit-button.js.map +1 -1
  19. package/lib/detail/button/view-button.d.ts.map +1 -1
  20. package/lib/detail/button/view-button.js +21 -10
  21. package/lib/detail/button/view-button.js.map +1 -1
  22. package/lib/draw-canvas/edit/components/asset-bar/index.d.ts.map +1 -1
  23. package/lib/draw-canvas/edit/components/asset-bar/index.js +1 -0
  24. package/lib/draw-canvas/edit/components/asset-bar/index.js.map +1 -1
  25. package/lib/draw-canvas/edit/components/main-header/index.d.ts +5 -0
  26. package/lib/draw-canvas/edit/components/main-header/index.d.ts.map +1 -1
  27. package/lib/draw-canvas/edit/components/main-header/index.js +54 -14
  28. package/lib/draw-canvas/edit/components/main-header/index.js.map +1 -1
  29. package/lib/draw-canvas/edit/components/render/index.d.ts +4 -0
  30. package/lib/draw-canvas/edit/components/render/index.d.ts.map +1 -1
  31. package/lib/draw-canvas/edit/components/render/index.js +20 -14
  32. package/lib/draw-canvas/edit/components/render/index.js.map +1 -1
  33. package/lib/draw-canvas/edit/components/render/types.d.ts +5 -1
  34. package/lib/draw-canvas/edit/components/render/types.d.ts.map +1 -1
  35. package/lib/draw-canvas/edit/components/setting-form/imag-upload.d.ts +26 -0
  36. package/lib/draw-canvas/edit/components/setting-form/imag-upload.d.ts.map +1 -0
  37. package/lib/draw-canvas/edit/components/setting-form/imag-upload.js +83 -0
  38. package/lib/draw-canvas/edit/components/setting-form/imag-upload.js.map +1 -0
  39. package/lib/draw-canvas/edit/components/setting-form/index.d.ts +1 -3
  40. package/lib/draw-canvas/edit/components/setting-form/index.d.ts.map +1 -1
  41. package/lib/draw-canvas/edit/components/setting-form/index.js +94 -15
  42. package/lib/draw-canvas/edit/components/setting-form/index.js.map +1 -1
  43. package/lib/draw-canvas/edit/constant.d.ts +7 -0
  44. package/lib/draw-canvas/edit/constant.d.ts.map +1 -0
  45. package/lib/draw-canvas/edit/constant.js +7 -0
  46. package/lib/draw-canvas/edit/constant.js.map +1 -0
  47. package/lib/draw-canvas/edit/index.d.ts +4 -1
  48. package/lib/draw-canvas/edit/index.d.ts.map +1 -1
  49. package/lib/draw-canvas/edit/index.js +63 -10
  50. package/lib/draw-canvas/edit/index.js.map +1 -1
  51. package/lib/draw-canvas/edit/index.less +17 -2
  52. package/lib/draw-canvas/view/index.d.ts +8 -0
  53. package/lib/draw-canvas/view/index.d.ts.map +1 -0
  54. package/lib/draw-canvas/view/index.js +50 -0
  55. package/lib/draw-canvas/view/index.js.map +1 -0
  56. package/lib/draw-canvas/view/index.less +60 -0
  57. package/lib/draw-canvas/view/view.d.ts +10 -0
  58. package/lib/draw-canvas/view/view.d.ts.map +1 -0
  59. package/lib/draw-canvas/view/view.js +104 -0
  60. package/lib/draw-canvas/view/view.js.map +1 -0
  61. package/lib/form/form-Item-group.d.ts.map +1 -1
  62. package/lib/form/form-Item-group.js +4 -4
  63. package/lib/form/form-Item-group.js.map +1 -1
  64. package/lib/lowcode-components/index.d.ts +2 -0
  65. package/lib/lowcode-components/index.d.ts.map +1 -1
  66. package/lib/lowcode-components/index.js +2 -1
  67. package/lib/lowcode-components/index.js.map +1 -1
  68. package/lib/lowcode-components/lowcode-view/component/assets.d.ts.map +1 -1
  69. package/lib/lowcode-components/lowcode-view/component/assets.js +8 -0
  70. package/lib/lowcode-components/lowcode-view/component/assets.js.map +1 -1
  71. package/lib/lowcode-components/radar-chart/index.d.ts +51 -0
  72. package/lib/lowcode-components/radar-chart/index.d.ts.map +1 -0
  73. package/lib/lowcode-components/radar-chart/index.js +276 -0
  74. package/lib/lowcode-components/radar-chart/index.js.map +1 -0
  75. package/lib/module/dtmpl-edit-card.d.ts.map +1 -1
  76. package/lib/module/dtmpl-edit-card.js +18 -1
  77. package/lib/module/dtmpl-edit-card.js.map +1 -1
  78. package/lib/module/dtmpl-edit-page.d.ts.map +1 -1
  79. package/lib/module/dtmpl-edit-page.js +19 -2
  80. package/lib/module/dtmpl-edit-page.js.map +1 -1
  81. package/lib/routable/ltmpl-route.d.ts +2 -0
  82. package/lib/routable/ltmpl-route.d.ts.map +1 -1
  83. package/lib/routable/ltmpl-route.js +20 -4
  84. package/lib/routable/ltmpl-route.js.map +1 -1
  85. package/lib/table/act-table.d.ts +2 -0
  86. package/lib/table/act-table.d.ts.map +1 -1
  87. package/lib/table/act-table.js +4 -4
  88. package/lib/table/act-table.js.map +1 -1
  89. package/lib/table/column/column-builder.d.ts.map +1 -1
  90. package/lib/table/column/column-builder.js +23 -8
  91. package/lib/table/column/column-builder.js.map +1 -1
  92. package/lib/table/relation-table.d.ts +3 -0
  93. package/lib/table/relation-table.d.ts.map +1 -1
  94. package/lib/tmpl/control-type-supportor.d.ts.map +1 -1
  95. package/lib/tmpl/control-type-supportor.js +1 -0
  96. package/lib/tmpl/control-type-supportor.js.map +1 -1
  97. package/lib/tmpl/hcservice-v3.d.ts +2 -0
  98. package/lib/tmpl/hcservice-v3.d.ts.map +1 -1
  99. package/lib/tmpl/hcservice-v3.js +34 -0
  100. package/lib/tmpl/hcservice-v3.js.map +1 -1
  101. package/lib/tmpl/interface.d.ts +13 -1
  102. package/lib/tmpl/interface.d.ts.map +1 -1
  103. package/lib/tmpl/interface.js.map +1 -1
  104. package/lib/tmpl/tmpl-config-analysis.js +1 -1
  105. package/lib/tmpl/tmpl-config-analysis.js.map +1 -1
  106. package/lib/units/index.d.ts +2 -1
  107. package/lib/units/index.d.ts.map +1 -1
  108. package/lib/units/index.js +17 -3
  109. package/lib/units/index.js.map +1 -1
  110. package/package.json +4 -1
  111. package/src/aldehyde/controls/entity-select/entity-select.tsx +18 -8
  112. package/src/aldehyde/controls/entry-control.tsx +1 -0
  113. package/src/aldehyde/controls/select/index.tsx +7 -6
  114. package/src/aldehyde/controls/text/index.less +1 -0
  115. package/src/aldehyde/controls/view-control.tsx +1 -0
  116. package/src/aldehyde/detail/button/edit-button.tsx +21 -22
  117. package/src/aldehyde/detail/button/view-button.tsx +23 -21
  118. package/src/aldehyde/draw-canvas/edit/components/asset-bar/index.tsx +3 -1
  119. package/src/aldehyde/draw-canvas/edit/components/main-header/index.tsx +59 -13
  120. package/src/aldehyde/draw-canvas/edit/components/render/draws/bg-draw.ts +130 -65
  121. package/src/aldehyde/draw-canvas/edit/components/render/draws/preview-draw.ts +33 -15
  122. package/src/aldehyde/draw-canvas/edit/components/render/handlers/drag-outside-handlers.ts +19 -22
  123. package/src/aldehyde/draw-canvas/edit/components/render/handlers/selection-handlers.ts +38 -30
  124. package/src/aldehyde/draw-canvas/edit/components/render/index.ts +17 -9
  125. package/src/aldehyde/draw-canvas/edit/components/render/tools/position-tool.ts +40 -58
  126. package/src/aldehyde/draw-canvas/edit/components/render/types.ts +5 -1
  127. package/src/aldehyde/draw-canvas/edit/components/setting-form/imag-upload.tsx +118 -0
  128. package/src/aldehyde/draw-canvas/edit/components/setting-form/index.tsx +111 -16
  129. package/src/aldehyde/draw-canvas/edit/constant.ts +6 -0
  130. package/src/aldehyde/draw-canvas/edit/index.less +17 -2
  131. package/src/aldehyde/draw-canvas/edit/index.tsx +84 -25
  132. package/src/aldehyde/draw-canvas/view/index.less +60 -0
  133. package/src/aldehyde/draw-canvas/view/index.tsx +48 -0
  134. package/src/aldehyde/draw-canvas/view/view.tsx +114 -0
  135. package/src/aldehyde/form/form-Item-group.tsx +4 -5
  136. package/src/aldehyde/lowcode-components/index.ts +4 -2
  137. package/src/aldehyde/lowcode-components/lowcode-view/component/assets.ts +8 -0
  138. package/src/aldehyde/lowcode-components/radar-chart/index.tsx +323 -0
  139. package/src/aldehyde/module/dtmpl-edit-card.tsx +18 -1
  140. package/src/aldehyde/module/dtmpl-edit-page.tsx +19 -2
  141. package/src/aldehyde/routable/ltmpl-route.tsx +39 -3
  142. package/src/aldehyde/table/act-table.tsx +7 -4
  143. package/src/aldehyde/table/column/column-builder.tsx +29 -9
  144. package/src/aldehyde/tmpl/control-type-supportor.tsx +1 -0
  145. package/src/aldehyde/tmpl/hcservice-v3.tsx +30 -0
  146. package/src/aldehyde/tmpl/interface.tsx +13 -1
  147. package/src/aldehyde/tmpl/tmpl-config-analysis.tsx +1 -1
  148. package/src/aldehyde/units/index.tsx +17 -4
@@ -1,7 +1,7 @@
1
1
  import Konva from 'konva';
2
2
  import { nanoid } from 'nanoid';
3
3
  import { Render } from '../index';
4
- import { Handler, AssetInfoPoint, ImageType, AssetType, LinkDrawPoint } from '../types';
4
+ import { Handler, AssetInfoPoint, AssetType, LinkDrawPoint } from '../types';
5
5
  import { RefLineDraw, PreviewDraw } from '../draws';
6
6
 
7
7
  export class DragOutsideHandlers implements Handler {
@@ -25,6 +25,7 @@ export class DragOutsideHandlers implements Handler {
25
25
  },
26
26
  drop: (e: GlobalEventHandlersEventMap['drop']) => {
27
27
  const src = e.dataTransfer?.getData('src');
28
+ const componentType = e.dataTransfer?.getData('componentType'); // 组件类型
28
29
  // 接收连接点信息
29
30
  let morePoints: AssetInfoPoint[] = [];
30
31
  const morePointsTxt = e.dataTransfer?.getData('points') ?? '[]';
@@ -36,37 +37,34 @@ export class DragOutsideHandlers implements Handler {
36
37
  const type = e.dataTransfer?.getData('type');
37
38
  if (src && type) {
38
39
  const stageState = this.render.getStageState();
40
+ const { pageHeight, pageWidth } = this.render.getPageSettings()
39
41
  this.render.stage.setPointersPositions(e);
40
42
  const pos = this.render.stage.getPointerPosition();
41
43
  if (pos) {
42
- this.render.assetTool[
43
- type === ImageType.svg
44
- ? `loadSvg`
45
- : type === ImageType.gif
46
- ? 'loadGif'
47
- : type === 'json'
48
- ? 'loadJson'
49
- : 'loadImg'
50
- ](src).then((target: Konva.Image | Konva.Group) => {
44
+ this.render.assetTool[type === 'json' ? 'loadJson' : ({ svg: "loadSvg", gif: "loadGif" }[type] || "loadImg")](src).then((target: Konva.Image | Konva.Group) => {
51
45
  let group = null;
46
+ let width = target.width();
47
+ let height = target.height();
48
+ if (width > pageWidth || height > pageHeight) {
49
+ const sizeScale = Math.min(pageWidth / width, pageHeight / height);
50
+ width *= sizeScale;
51
+ height *= sizeScale;
52
+ target.setSize({ width, height });
53
+ }
52
54
  // 默认连接点
53
55
  let points: AssetInfoPoint[] = [];
54
- // 图片素材
55
- if (target instanceof Konva.Image) {
56
+ if (target instanceof Konva.Image) { // 图片素材
56
57
  group = new Konva.Group({
57
58
  id: nanoid(),
58
- width: target.width(),
59
- height: target.height(),
59
+ width,
60
+ height,
60
61
  name: 'asset',
61
62
  assetType: AssetType.Image,
62
63
  draggable: true,
64
+ componentType,
63
65
  imageType:
64
66
  type !== 'json'
65
- ? type === ImageType.svg
66
- ? ImageType.svg
67
- : type === ImageType.gif
68
- ? ImageType.gif
69
- : ImageType.other
67
+ ? (["svg", "gif", "other"].includes(type) ? type : "other")
70
68
  : undefined
71
69
  });
72
70
  this.render.setAssetSettings(group, this.render.getAssetSettings(), false);
@@ -77,8 +75,7 @@ export class DragOutsideHandlers implements Handler {
77
75
  { x: group.width() / 2, y: 0, direction: 'top' }, // 上
78
76
  { x: group.width() / 2, y: group.height(), direction: 'bottom' } // 下
79
77
  ];
80
- } else {
81
- // json 素材
78
+ } else {// json 素材
82
79
  target.id(nanoid());
83
80
  target.setAttrs({
84
81
  name: 'asset',
@@ -89,7 +86,7 @@ export class DragOutsideHandlers implements Handler {
89
86
  this.render.linkTool.groupIdCover(group);
90
87
  }
91
88
  target.setAttrs({ x: 0, y: 0 } as any);
92
- this.render.layer.add(group);
89
+ this.render.layer.add(group); // 组件添加到画布
93
90
  const x = this.render.toStageValue(pos.x - stageState.x) - group.width() / 2;
94
91
  const y = this.render.toStageValue(pos.y - stageState.y) - group.height() / 2;
95
92
  group.setAttrs({ x, y });
@@ -82,6 +82,30 @@ export class SelectionHandlers implements Handler {
82
82
  * @param angle 旋转角度
83
83
  * @returns
84
84
  */
85
+
86
+ // 拖动时更新位置
87
+ private updateManualPointsByDrag(rect: { x: number; y: number }, transformerPos?: Konva.Vector2d, isAttract = false) {
88
+ const groups = this.render.transformer.nodes();
89
+ const points = groups.reduce((ps, group) => ps.concat(Array.isArray(group.getAttr('points')) ? group.getAttr('points') : []), [] as LinkDrawPoint[]);
90
+ const pairs = points.reduce((ps, point) => ps.concat(point.pairs ? point.pairs.filter((o) => !o.disabled) : []), [] as LinkDrawPair[]);
91
+ for (const pair of pairs) {
92
+ const fromGroup = groups.find((o) => o.id() === pair.from.groupId);
93
+ const toGroup = groups.find((o) => o.id() === pair.to.groupId);
94
+ if (fromGroup && toGroup) {
95
+ if (fromGroup.attrs.manualPointsMap && fromGroup.attrs.manualPointsMapBefore) {
96
+ let manualPoints = fromGroup.attrs.manualPointsMap[pair.id];
97
+ const manualPointsBefore = fromGroup.attrs.manualPointsMapBefore[pair.id];
98
+ if (Array.isArray(manualPoints) && Array.isArray(manualPointsBefore)) {
99
+ const offsetX = this.render.toStageValue((isAttract ? transformerPos.x : rect.x) - this.transformerMousedownPos.x);
100
+ const offsetY = this.render.toStageValue((isAttract ? transformerPos.y : rect.y) - this.transformerMousedownPos.y);
101
+ manualPoints = manualPointsBefore.map((o: ManualPoint) => ({ x: o.x + offsetX, y: o.y + offsetY }));
102
+ fromGroup.setAttr('manualPointsMap', { ...fromGroup.attrs.manualPointsMap, [pair.id]: manualPoints });
103
+ }
104
+ }
105
+ }
106
+ }
107
+ }
108
+
85
109
  rotatePoint(x: number, y: number, centerX: number, centerY: number, angle: number) {
86
110
  const radians = (angle * Math.PI) / 180; // 将角度转换为弧度
87
111
  // 计算旋转后的坐标
@@ -274,38 +298,22 @@ export class SelectionHandlers implements Handler {
274
298
  },
275
299
  dragmove: () => { // 拖动
276
300
  const rect = this.render.transformer.findOne('.back')!.getClientRect();
277
- const { pos: transformerPos, isAttract } = this.render.attractTool.attractTransformer(rect);
278
- if (isAttract) { // 磁吸偏移
279
- this.selectingNodesPositionByOffset({
280
- x: this.render.toStageValue(transformerPos.x - this.transformerMousedownPos.x),
281
- y: this.render.toStageValue(transformerPos.y - this.transformerMousedownPos.y)
282
- });
283
- }
284
- const groups = this.render.transformer.nodes(); // 拐点也需要移动
285
- const points = groups.reduce((ps, group) => ps.concat(Array.isArray(group.getAttr('points')) ? group.getAttr('points') : []), [] as LinkDrawPoint[]);
286
- const pairs = points.reduce((ps, point) => ps.concat(point.pairs ? point.pairs.filter((o) => !o.disabled) : []), [] as LinkDrawPair[]);
287
- for (const pair of pairs) {
288
- const fromGroup = groups.find((o) => o.id() === pair.from.groupId);
289
- const toGroup = groups.find((o) => o.id() === pair.to.groupId);
290
- if (fromGroup && toGroup) { // 必须成对移动才记录
291
- if (fromGroup.attrs.manualPointsMap && fromGroup.attrs.manualPointsMapBefore) {
292
- let manualPoints = fromGroup.attrs.manualPointsMap[pair.id];
293
- const manualPointsBefore = fromGroup.attrs.manualPointsMapBefore[pair.id];
294
- if (Array.isArray(manualPoints) && Array.isArray(manualPointsBefore)) {
295
- manualPoints = isAttract
296
- ? manualPointsBefore.map((o: ManualPoint) => ({
297
- x: o.x + this.render.toStageValue(transformerPos.x - this.transformerMousedownPos.x),
298
- y: o.y + this.render.toStageValue(transformerPos.y - this.transformerMousedownPos.y)
299
- }))
300
- : manualPointsBefore.map((o: ManualPoint) => ({
301
- x: o.x + this.render.toStageValue(rect.x - this.transformerMousedownPos.x),
302
- y: o.y + this.render.toStageValue(rect.y - this.transformerMousedownPos.y)
303
- }));
304
- fromGroup.setAttr('manualPointsMap', { ...fromGroup.attrs.manualPointsMap, [pair.id]: manualPoints });
305
- }
306
- }
301
+ // 磁吸控制:关闭时跳过磁吸逻辑,让 transformer 自由拖动
302
+ if (this.render.showAttract) {
303
+ const { pos: transformerPos, isAttract } = this.render.attractTool.attractTransformer(rect);
304
+ if (isAttract) { // 磁吸偏移
305
+ this.selectingNodesPositionByOffset({
306
+ x: this.render.toStageValue(transformerPos.x - this.transformerMousedownPos.x),
307
+ y: this.render.toStageValue(transformerPos.y - this.transformerMousedownPos.y)
308
+ });
307
309
  }
310
+ // 拐点磁吸偏移
311
+ this.updateManualPointsByDrag(rect, transformerPos, isAttract);
312
+ } else {
313
+ // 拐点跟随拖动偏移
314
+ this.updateManualPointsByDrag(rect, undefined, false);
308
315
  }
316
+ const groups = this.render.transformer.nodes();
309
317
  for (const group of groups) { // 更新坐标记录
310
318
  this.render.setAssetSettings(group, this.render.getAssetSettings(group), false);
311
319
  }
@@ -73,6 +73,8 @@ export class Render {
73
73
  historyIndex = -1;
74
74
  graphType: GraphType | undefined = undefined; // 画图类型
75
75
  texting = false; // 添加文字中
76
+ showGrid = true; // 显示网格
77
+ showAttract = true; // 显示磁吸
76
78
 
77
79
  // 事件发射器(替代 mitt)
78
80
  private emitter = new SimpleEventEmitter();
@@ -100,11 +102,9 @@ export class Render {
100
102
  this.groupTransformer.add(this.transformer);
101
103
  this.groupTransformer.add(this.selectRect);
102
104
  this.layerCover.add(this.groupTransformer);
103
- // 附加工具
104
- if (!this.config.readonly && this.config.showBg) {
105
- this.draws[BgDraw.name] = new BgDraw(this, this.layerFloor, {
106
- size: this.bgSize
107
- });
105
+
106
+ if (this.config.showBg) { // 背景
107
+ this.draws[BgDraw.name] = new BgDraw(this, this.layerFloor, { size: this.bgSize, showGrid: this.showGrid, readonly: this.config.readonly });
108
108
  }
109
109
 
110
110
  this.draws[LinkDraw.name] = new LinkDraw(this, this.layerCover, {
@@ -465,6 +465,17 @@ export class Render {
465
465
  document.body.style.cursor = this.texting ? 'text' : 'default';
466
466
  }
467
467
 
468
+ // 更改网格显示
469
+ changeShowGrid(show: boolean) {
470
+ this.showGrid = show;
471
+ (this.draws[BgDraw.name] as BgDraw)?.updateOption({ showGrid: show });
472
+ }
473
+
474
+ // 更改磁吸显示
475
+ changeShowAttract(show: boolean) {
476
+ this.showAttract = show;
477
+ }
478
+
468
479
  // 页面设置 默认值
469
480
  static PageSettingsDefault: PageSettings = {
470
481
  // 画布默认尺寸
@@ -489,6 +500,7 @@ export class Render {
489
500
  // 更新页面设置
490
501
  setPageSettings(settings: PageSettings, update = false) {
491
502
  this.stage.setAttr('pageSettings', settings);
503
+ this.emit('page-settings-change', settings);
492
504
  // 更新背景
493
505
  this.updateBackground();
494
506
  if (update) {
@@ -504,10 +516,6 @@ export class Render {
504
516
 
505
517
  // 更新背景
506
518
  updateBackground() {
507
- const background = this.getBackground();
508
- if (background) {
509
- background.fill(this.getPageSettings().background ?? 'transparent');
510
- }
511
519
  this.draws[BgDraw.name]?.draw();
512
520
  this.draws[GraphDraw.name]?.draw();
513
521
  this.draws[LinkDraw.name]?.draw();
@@ -13,6 +13,7 @@ export class PositionTool {
13
13
 
14
14
  // 自适应大小
15
15
  positionFit() {
16
+ const { pageWidth, pageHeight } = this.render.getPageSettings();
16
17
  const children = [
17
18
  ...this.render.layer.getChildren(),
18
19
  ...this.render.layerCover.find('.link-line')
@@ -21,9 +22,7 @@ export class PositionTool {
21
22
  let minX = Infinity,
22
23
  maxX = -Infinity,
23
24
  minY = Infinity,
24
- maxY = -Infinity,
25
- minStartX = Infinity,
26
- minStartY = Infinity;
25
+ maxY = -Infinity;
27
26
 
28
27
  const stageState = this.render.getStageState();
29
28
  for (const node of children) {
@@ -34,64 +33,40 @@ export class PositionTool {
34
33
  width: this.render.toStageValue(rect.width),
35
34
  height: this.render.toStageValue(rect.height)
36
35
  }))(node.getClientRect());
37
- if (x < minX) {
38
- minX = x;
39
- }
40
- if (x + width > maxX) {
41
- maxX = x + width;
42
- }
43
- if (y < minY) {
44
- minY = y;
45
- }
46
- if (y + height > maxY) {
47
- maxY = y + height;
48
- }
49
-
50
- if (x < minStartX) {
51
- minStartX = x;
52
- }
53
- if (y < minStartY) {
54
- minStartY = y;
55
- }
36
+ if (x < minX) minX = x;
37
+ if (x + width > maxX) maxX = x + width;
38
+ if (y < minY) minY = y;
39
+ if (y + height > maxY) maxY = y + height;
56
40
  } else if (node instanceof Konva.Line && node.name() === 'link-line') {
57
41
  // 连线占用空间
58
42
  const points = node.points();
59
43
  for (let i = 0; i < points.length; i += 2) {
60
- const [x, y] = [points[i], points[i + 1]];
61
- if (x < minX) {
62
- minX = x - 1;
63
- }
64
- if (x > maxX) {
65
- maxX = x + 1;
66
- }
67
- if (y < minY) {
68
- minY = y - 1;
69
- }
70
- if (y > maxY) {
71
- maxY = y + 1;
72
- }
73
- if (x < minStartX) {
74
- minStartX = x - 1;
75
- }
76
- if (y < minStartY) {
77
- minStartY = y - 1;
78
- }
44
+ const [px, py] = [points[i], points[i + 1]];
45
+ if (px < minX) minX = px - 1;
46
+ if (px > maxX) maxX = px + 1;
47
+ if (py < minY) minY = py - 1;
48
+ if (py > maxY) maxY = py + 1;
79
49
  }
80
50
  }
81
51
  }
82
52
 
83
- minX === Infinity && (minX = (this.render.stage.width() - this.render.rulerSize) / 2);
84
- maxX === -Infinity && (maxX = minX);
85
- minY === Infinity && (minY = (this.render.stage.height() - this.render.rulerSize) / 2);
86
- maxY === -Infinity && (maxY = minY);
87
- minStartX === Infinity && minX;
88
- minStartY === Infinity && minY;
53
+ // 把画布区域也纳入计算范围(画布从 (0,0) (pageWidth, pageHeight)
54
+ if (0 < minX) minX = 0;
55
+ if (pageWidth > maxX) maxX = pageWidth;
56
+ if (0 < minY) minY = 0;
57
+ if (pageHeight > maxY) maxY = pageHeight;
58
+
59
+ // 没有素材时,以画布自身为准
60
+ if (minX === Infinity) minX = 0;
61
+ if (maxX === -Infinity) maxX = pageWidth;
62
+ if (minY === Infinity) minY = 0;
63
+ if (maxY === -Infinity) maxY = pageHeight;
89
64
 
90
- const assetSize = {
65
+ const contentSize = {
91
66
  width: maxX - minX,
92
67
  height: maxY - minY
93
68
  };
94
- const assetRate = assetSize.width / assetSize.height;
69
+ const contentRate = contentSize.width / contentSize.height;
95
70
 
96
71
  const viewSize = {
97
72
  width: this.render.stage.width() - (this.render.config.readonly ? 0 : this.render.rulerSize),
@@ -100,29 +75,36 @@ export class PositionTool {
100
75
  const viewRate = viewSize.width / viewSize.height;
101
76
  let scale = 1;
102
77
 
103
- if (viewRate > assetRate) {
104
- scale = viewSize.height / assetSize.height;
105
- } else if (viewRate < assetRate) {
106
- scale = viewSize.width / assetSize.width;
78
+ // 设置padding,避免边缘紧贴
79
+ const padding = 20;
80
+ const effectiveWidth = viewSize.width - padding * 2;
81
+ const effectiveHeight = viewSize.height - padding * 2;
82
+
83
+ if (viewRate > contentRate) { // 视口比内容更"扁",以高度为基准
84
+ scale = effectiveHeight / contentSize.height;
85
+ } else { // 视口比内容更"长",以宽度为基准
86
+ scale = effectiveWidth / contentSize.width;
107
87
  }
108
88
 
109
89
  scale = Math.max(0.2, scale);
110
90
  scale = Math.floor(scale * 100) / 100;
111
91
 
112
- if (assetSize.width <= viewSize.width && assetSize.height <= viewSize.height) {
113
- scale = 1;
114
- }
92
+ // 设置缩放比例最大为1(暂时隐藏)
93
+ // if (contentSize.width * scale <= viewSize.width && contentSize.height * scale <= viewSize.height) {
94
+ // scale = Math.min(1, scale);
95
+ // }
96
+
115
97
  this.render.stage.setAttrs({
116
98
  scale: { x: scale, y: scale },
117
99
  position: {
118
100
  x:
119
101
  (this.render.config.readonly ? 0 : this.render.rulerSize) -
120
102
  minX * scale +
121
- (viewSize.width - assetSize.width * scale) / 2,
103
+ (viewSize.width - contentSize.width * scale) / 2,
122
104
  y:
123
105
  (this.render.config.readonly ? 0 : this.render.rulerSize) -
124
106
  minY * scale +
125
- (viewSize.height - assetSize.height * scale) / 2
107
+ (viewSize.height - contentSize.height * scale) / 2
126
108
  }
127
109
  });
128
110
 
@@ -247,7 +247,11 @@ export interface PageSettings {
247
247
  pageWidth: number;
248
248
  pageHeight: number;
249
249
  // 样式设置
250
- background: string;
250
+ background?: string;
251
+ backgroundImg?: { // 背景图
252
+ src: string;
253
+ code: string;
254
+ };
251
255
  stroke: string;
252
256
  strokeWidth: number;
253
257
  fill: string;
@@ -0,0 +1,118 @@
1
+ import React, { useEffect, useState } from "react";
2
+ import { Upload as AntdUpLoad, UploadFile, message } from "antd";
3
+ import { RcFile } from "antd/es/upload";
4
+ import { PlusOutlined } from "@ant-design/icons";
5
+ import { HydrocarbonService, Superagent, ProgramConfig } from "../../../../index";
6
+ import { fileUpload } from "../../constant";
7
+ import { useLocale } from "../../../../locale/useLocale";
8
+
9
+ const { sourceId, serverKey } = fileUpload;
10
+
11
+ // 本地文件上传,处理url
12
+ const handleImgUrl = (basePath: string) => {
13
+ if (basePath.startsWith("http")) {
14
+ return basePath;
15
+ }
16
+ const url = encodeURI(ProgramConfig.joinPath(
17
+ ProgramConfig.joinPath(ProgramConfig.api(), "/v3/files"),
18
+ basePath
19
+ )) +
20
+ `?@token=${ProgramConfig.hydrocarbonToken()}&@programToken=${ProgramConfig.programCode(serverKey)}`;
21
+ return url;
22
+ }
23
+
24
+ const fileInfo = {
25
+ uid: '-1',
26
+ name: 'image.png',
27
+ status: 'done',
28
+ };
29
+
30
+ export interface CommonFilePath {
31
+ fileName?: string;
32
+ contentType?: string;//文件类型
33
+ path?: string;
34
+ iconPath?: string;
35
+ valid?: string;
36
+ baseType?: string;
37
+ basePath?: string;
38
+ };
39
+
40
+
41
+ export interface UploadProps {
42
+ accept?: string;
43
+ size?: number;
44
+ onChange?: (data: { src: string, code: string }) => void;
45
+ value?: { src: string, code: string };
46
+ recordCode?: string; // 当前画面关联数据code,用于图片命名区分
47
+ }
48
+
49
+ const ImageUpload: React.FC<UploadProps> = (props) => {
50
+ const { onChange, accept, size, recordCode, value } = props;
51
+ const [fileList, setFileList] = useState([]);
52
+ const [imgCode, setImgCode] = useState<string>(); // 本地图片code
53
+ const { translate } = useLocale();
54
+
55
+ useEffect(() => {
56
+ setFileList(value?.src ? [{ ...fileInfo, url: handleImgUrl(value?.src) }] : []);
57
+ setImgCode(value?.code);
58
+ }, [value]);
59
+
60
+ const beforeUpload = async (file: RcFile) => {
61
+ if (size && file.size > size * 1024 * 1024) {
62
+ message.warning(translate("${文件大小不能超过}") + `${size}M`);
63
+ return false;
64
+ }
65
+ return true;
66
+ }
67
+
68
+ const handleChange = async (info) => {
69
+ if (info.file.status == "done") {
70
+ const fileKey = info.file.response.fileKey;
71
+ const fileName = info.file.name;
72
+ const data = { valid: "new", fileKey, fileName };
73
+ const result = { 描述: `${recordCode || ""}-${fileName}`, 文件: JSON.stringify(data) };
74
+ const { code } = await HydrocarbonService.postMstrucDtmplData(serverKey, sourceId, result, message);
75
+ setImgCode(code);
76
+ const imgData = await HydrocarbonService.requestMstrucDtmplData(serverKey, sourceId, code, null);
77
+ const basePath = JSON.parse(imgData.fieldMap["文件"] || "{}").base?.path;
78
+ if (basePath) {
79
+ const url = handleImgUrl(basePath);
80
+ setFileList([{ ...info.file, url }]);
81
+ // onChange?.(url);
82
+ onChange?.({ src: url, code });
83
+ } else {
84
+ setFileList([...info.fileList]);
85
+ }
86
+ } else {
87
+ setFileList([...info.fileList]);
88
+ }
89
+ };
90
+
91
+ const handleDelete = async () => {
92
+ await HydrocarbonService.deleteByCode(serverKey, sourceId, [imgCode]);
93
+ setFileList([]);
94
+ onChange?.(null);
95
+ };
96
+
97
+ return (
98
+ <AntdUpLoad
99
+ action={(file) => HydrocarbonService.postFileAction(serverKey, file)}
100
+ headers={Superagent.getHeaderObj(serverKey)}
101
+ name={'file'}
102
+ beforeUpload={beforeUpload}
103
+ listType={'picture-card'}
104
+ fileList={fileList?.length ? fileList as Array<UploadFile> : undefined}
105
+ accept={accept}
106
+ onChange={handleChange}
107
+ onRemove={handleDelete}
108
+ onPreview={() => window.open(fileList[0].url)}
109
+ >
110
+ {fileList.length > 0 ? null : <div className={'upload-btn'}>
111
+ <PlusOutlined />
112
+ <div style={{ marginTop: 8 }}>{translate("${上传图片}")}</div>
113
+ </div>}
114
+ </AntdUpLoad>
115
+ )
116
+ };
117
+
118
+ export default ImageUpload;