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.
- package/lib/controls/action/utils.d.ts +1 -1
- package/lib/controls/entity-select/entity-select.d.ts +2 -2
- package/lib/controls/entity-select/entity-select.d.ts.map +1 -1
- package/lib/controls/entity-select/entity-select.js +16 -7
- package/lib/controls/entity-select/entity-select.js.map +1 -1
- package/lib/controls/entry-control.d.ts.map +1 -1
- package/lib/controls/entry-control.js +1 -0
- package/lib/controls/entry-control.js.map +1 -1
- package/lib/controls/select/index.d.ts.map +1 -1
- package/lib/controls/select/index.js +13 -7
- package/lib/controls/select/index.js.map +1 -1
- package/lib/controls/text/index.less +1 -0
- package/lib/controls/view-control.d.ts.map +1 -1
- package/lib/controls/view-control.js +1 -0
- package/lib/controls/view-control.js.map +1 -1
- package/lib/detail/button/edit-button.d.ts.map +1 -1
- package/lib/detail/button/edit-button.js +23 -11
- package/lib/detail/button/edit-button.js.map +1 -1
- package/lib/detail/button/view-button.d.ts.map +1 -1
- package/lib/detail/button/view-button.js +21 -10
- package/lib/detail/button/view-button.js.map +1 -1
- package/lib/draw-canvas/edit/components/asset-bar/index.d.ts.map +1 -1
- package/lib/draw-canvas/edit/components/asset-bar/index.js +1 -0
- package/lib/draw-canvas/edit/components/asset-bar/index.js.map +1 -1
- package/lib/draw-canvas/edit/components/main-header/index.d.ts +5 -0
- package/lib/draw-canvas/edit/components/main-header/index.d.ts.map +1 -1
- package/lib/draw-canvas/edit/components/main-header/index.js +54 -14
- package/lib/draw-canvas/edit/components/main-header/index.js.map +1 -1
- package/lib/draw-canvas/edit/components/render/index.d.ts +4 -0
- package/lib/draw-canvas/edit/components/render/index.d.ts.map +1 -1
- package/lib/draw-canvas/edit/components/render/index.js +20 -14
- package/lib/draw-canvas/edit/components/render/index.js.map +1 -1
- package/lib/draw-canvas/edit/components/render/types.d.ts +5 -1
- package/lib/draw-canvas/edit/components/render/types.d.ts.map +1 -1
- package/lib/draw-canvas/edit/components/setting-form/imag-upload.d.ts +26 -0
- package/lib/draw-canvas/edit/components/setting-form/imag-upload.d.ts.map +1 -0
- package/lib/draw-canvas/edit/components/setting-form/imag-upload.js +83 -0
- package/lib/draw-canvas/edit/components/setting-form/imag-upload.js.map +1 -0
- package/lib/draw-canvas/edit/components/setting-form/index.d.ts +1 -3
- package/lib/draw-canvas/edit/components/setting-form/index.d.ts.map +1 -1
- package/lib/draw-canvas/edit/components/setting-form/index.js +94 -15
- package/lib/draw-canvas/edit/components/setting-form/index.js.map +1 -1
- package/lib/draw-canvas/edit/constant.d.ts +7 -0
- package/lib/draw-canvas/edit/constant.d.ts.map +1 -0
- package/lib/draw-canvas/edit/constant.js +7 -0
- package/lib/draw-canvas/edit/constant.js.map +1 -0
- package/lib/draw-canvas/edit/index.d.ts +4 -1
- package/lib/draw-canvas/edit/index.d.ts.map +1 -1
- package/lib/draw-canvas/edit/index.js +63 -10
- package/lib/draw-canvas/edit/index.js.map +1 -1
- package/lib/draw-canvas/edit/index.less +17 -2
- package/lib/draw-canvas/view/index.d.ts +8 -0
- package/lib/draw-canvas/view/index.d.ts.map +1 -0
- package/lib/draw-canvas/view/index.js +50 -0
- package/lib/draw-canvas/view/index.js.map +1 -0
- package/lib/draw-canvas/view/index.less +60 -0
- package/lib/draw-canvas/view/view.d.ts +10 -0
- package/lib/draw-canvas/view/view.d.ts.map +1 -0
- package/lib/draw-canvas/view/view.js +104 -0
- package/lib/draw-canvas/view/view.js.map +1 -0
- package/lib/form/form-Item-group.d.ts.map +1 -1
- package/lib/form/form-Item-group.js +4 -4
- package/lib/form/form-Item-group.js.map +1 -1
- package/lib/lowcode-components/index.d.ts +2 -0
- package/lib/lowcode-components/index.d.ts.map +1 -1
- package/lib/lowcode-components/index.js +2 -1
- package/lib/lowcode-components/index.js.map +1 -1
- package/lib/lowcode-components/lowcode-view/component/assets.d.ts.map +1 -1
- package/lib/lowcode-components/lowcode-view/component/assets.js +8 -0
- package/lib/lowcode-components/lowcode-view/component/assets.js.map +1 -1
- package/lib/lowcode-components/radar-chart/index.d.ts +51 -0
- package/lib/lowcode-components/radar-chart/index.d.ts.map +1 -0
- package/lib/lowcode-components/radar-chart/index.js +276 -0
- package/lib/lowcode-components/radar-chart/index.js.map +1 -0
- package/lib/module/dtmpl-edit-card.d.ts.map +1 -1
- package/lib/module/dtmpl-edit-card.js +18 -1
- package/lib/module/dtmpl-edit-card.js.map +1 -1
- package/lib/module/dtmpl-edit-page.d.ts.map +1 -1
- package/lib/module/dtmpl-edit-page.js +19 -2
- package/lib/module/dtmpl-edit-page.js.map +1 -1
- package/lib/routable/ltmpl-route.d.ts +2 -0
- package/lib/routable/ltmpl-route.d.ts.map +1 -1
- package/lib/routable/ltmpl-route.js +20 -4
- package/lib/routable/ltmpl-route.js.map +1 -1
- package/lib/table/act-table.d.ts +2 -0
- package/lib/table/act-table.d.ts.map +1 -1
- package/lib/table/act-table.js +4 -4
- package/lib/table/act-table.js.map +1 -1
- package/lib/table/column/column-builder.d.ts.map +1 -1
- package/lib/table/column/column-builder.js +23 -8
- package/lib/table/column/column-builder.js.map +1 -1
- package/lib/table/relation-table.d.ts +3 -0
- package/lib/table/relation-table.d.ts.map +1 -1
- package/lib/tmpl/control-type-supportor.d.ts.map +1 -1
- package/lib/tmpl/control-type-supportor.js +1 -0
- package/lib/tmpl/control-type-supportor.js.map +1 -1
- package/lib/tmpl/hcservice-v3.d.ts +2 -0
- package/lib/tmpl/hcservice-v3.d.ts.map +1 -1
- package/lib/tmpl/hcservice-v3.js +34 -0
- package/lib/tmpl/hcservice-v3.js.map +1 -1
- package/lib/tmpl/interface.d.ts +13 -1
- package/lib/tmpl/interface.d.ts.map +1 -1
- package/lib/tmpl/interface.js.map +1 -1
- package/lib/tmpl/tmpl-config-analysis.js +1 -1
- package/lib/tmpl/tmpl-config-analysis.js.map +1 -1
- package/lib/units/index.d.ts +2 -1
- package/lib/units/index.d.ts.map +1 -1
- package/lib/units/index.js +17 -3
- package/lib/units/index.js.map +1 -1
- package/package.json +4 -1
- package/src/aldehyde/controls/entity-select/entity-select.tsx +18 -8
- package/src/aldehyde/controls/entry-control.tsx +1 -0
- package/src/aldehyde/controls/select/index.tsx +7 -6
- package/src/aldehyde/controls/text/index.less +1 -0
- package/src/aldehyde/controls/view-control.tsx +1 -0
- package/src/aldehyde/detail/button/edit-button.tsx +21 -22
- package/src/aldehyde/detail/button/view-button.tsx +23 -21
- package/src/aldehyde/draw-canvas/edit/components/asset-bar/index.tsx +3 -1
- package/src/aldehyde/draw-canvas/edit/components/main-header/index.tsx +59 -13
- package/src/aldehyde/draw-canvas/edit/components/render/draws/bg-draw.ts +130 -65
- package/src/aldehyde/draw-canvas/edit/components/render/draws/preview-draw.ts +33 -15
- package/src/aldehyde/draw-canvas/edit/components/render/handlers/drag-outside-handlers.ts +19 -22
- package/src/aldehyde/draw-canvas/edit/components/render/handlers/selection-handlers.ts +38 -30
- package/src/aldehyde/draw-canvas/edit/components/render/index.ts +17 -9
- package/src/aldehyde/draw-canvas/edit/components/render/tools/position-tool.ts +40 -58
- package/src/aldehyde/draw-canvas/edit/components/render/types.ts +5 -1
- package/src/aldehyde/draw-canvas/edit/components/setting-form/imag-upload.tsx +118 -0
- package/src/aldehyde/draw-canvas/edit/components/setting-form/index.tsx +111 -16
- package/src/aldehyde/draw-canvas/edit/constant.ts +6 -0
- package/src/aldehyde/draw-canvas/edit/index.less +17 -2
- package/src/aldehyde/draw-canvas/edit/index.tsx +84 -25
- package/src/aldehyde/draw-canvas/view/index.less +60 -0
- package/src/aldehyde/draw-canvas/view/index.tsx +48 -0
- package/src/aldehyde/draw-canvas/view/view.tsx +114 -0
- package/src/aldehyde/form/form-Item-group.tsx +4 -5
- package/src/aldehyde/lowcode-components/index.ts +4 -2
- package/src/aldehyde/lowcode-components/lowcode-view/component/assets.ts +8 -0
- package/src/aldehyde/lowcode-components/radar-chart/index.tsx +323 -0
- package/src/aldehyde/module/dtmpl-edit-card.tsx +18 -1
- package/src/aldehyde/module/dtmpl-edit-page.tsx +19 -2
- package/src/aldehyde/routable/ltmpl-route.tsx +39 -3
- package/src/aldehyde/table/act-table.tsx +7 -4
- package/src/aldehyde/table/column/column-builder.tsx +29 -9
- package/src/aldehyde/tmpl/control-type-supportor.tsx +1 -0
- package/src/aldehyde/tmpl/hcservice-v3.tsx +30 -0
- package/src/aldehyde/tmpl/interface.tsx +13 -1
- package/src/aldehyde/tmpl/tmpl-config-analysis.tsx +1 -1
- 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,
|
|
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
|
|
59
|
-
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
|
|
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
|
-
|
|
278
|
-
if (
|
|
279
|
-
this.
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
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 (
|
|
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
|
-
|
|
39
|
-
|
|
40
|
-
if (
|
|
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 [
|
|
61
|
-
if (
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
if (
|
|
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
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
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
|
|
65
|
+
const contentSize = {
|
|
91
66
|
width: maxX - minX,
|
|
92
67
|
height: maxY - minY
|
|
93
68
|
};
|
|
94
|
-
const
|
|
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
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
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
|
-
|
|
113
|
-
|
|
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 -
|
|
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 -
|
|
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
|
|
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;
|