aldehyde 0.2.472 → 0.2.474
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/entity-select/entity-select.js +1 -1
- package/lib/controls/entity-select/entity-select.js.map +1 -1
- package/lib/controls/entry-control.js +2 -2
- package/lib/controls/entry-control.js.map +1 -1
- package/lib/controls/icon-selector/icon/phonenode-menu-icon/iconfont.css +47 -3
- package/lib/controls/icon-selector/icon/phonenode-menu-icon/iconfont.js +12 -12
- package/lib/controls/icon-selector/icon/phonenode-menu-icon/iconfont.js.map +1 -1
- package/lib/controls/icon-selector/icon/phonenode-menu-icon/iconfont.json +77 -0
- package/lib/controls/icon-selector/icon/phonenode-menu-icon/iconfont.ttf +0 -0
- package/lib/controls/icon-selector/icon/phonenode-menu-icon/iconfont.woff +0 -0
- package/lib/controls/icon-selector/icon/phonenode-menu-icon/iconfont.woff2 +0 -0
- package/lib/draw-canvas/edit/components/asset-bar/index.d.ts +5 -0
- package/lib/draw-canvas/edit/components/asset-bar/index.d.ts.map +1 -0
- package/lib/draw-canvas/edit/components/asset-bar/index.js +78 -0
- package/lib/draw-canvas/edit/components/asset-bar/index.js.map +1 -0
- package/lib/draw-canvas/edit/components/asset-bar/index.less +36 -0
- package/lib/draw-canvas/edit/components/main-header/index.d.ts +14 -0
- package/lib/draw-canvas/edit/components/main-header/index.d.ts.map +1 -0
- package/lib/draw-canvas/edit/components/main-header/index.js +163 -0
- package/lib/draw-canvas/edit/components/main-header/index.js.map +1 -0
- package/lib/draw-canvas/edit/components/main-header/index.less +21 -0
- package/lib/draw-canvas/edit/components/render/index.d.ts +86 -0
- package/lib/draw-canvas/edit/components/render/index.d.ts.map +1 -0
- package/lib/draw-canvas/edit/components/render/index.js +686 -0
- package/lib/draw-canvas/edit/components/render/index.js.map +1 -0
- package/lib/draw-canvas/edit/components/render/types.d.ts +243 -0
- package/lib/draw-canvas/edit/components/render/types.d.ts.map +1 -0
- package/lib/draw-canvas/edit/components/render/types.js +66 -0
- package/lib/draw-canvas/edit/components/render/types.js.map +1 -0
- package/lib/draw-canvas/edit/components/setting-form/index.d.ts +19 -0
- package/lib/draw-canvas/edit/components/setting-form/index.d.ts.map +1 -0
- package/lib/draw-canvas/edit/components/setting-form/index.js +164 -0
- package/lib/draw-canvas/edit/components/setting-form/index.js.map +1 -0
- package/lib/draw-canvas/edit/index.d.ts +5 -0
- package/lib/draw-canvas/edit/index.d.ts.map +1 -0
- package/lib/draw-canvas/edit/index.js +112 -0
- package/lib/draw-canvas/edit/index.js.map +1 -0
- package/lib/draw-canvas/edit/index.less +34 -0
- package/lib/form/form-Item-group.d.ts.map +1 -1
- package/lib/form/form-Item-group.js +1 -1
- package/lib/form/form-Item-group.js.map +1 -1
- package/lib/icon/local-aliIcon/iconfont.js +5 -5
- package/lib/icon/local-aliIcon/iconfont.js.map +1 -1
- package/lib/table/relation-table.d.ts +4 -0
- package/lib/table/relation-table.d.ts.map +1 -1
- package/lib/tmpl/hcservice-v3.d.ts +1 -0
- package/lib/tmpl/hcservice-v3.d.ts.map +1 -1
- package/lib/tmpl/hcservice-v3.js +27 -0
- package/lib/tmpl/hcservice-v3.js.map +1 -1
- package/lib/tmpl/interface.d.ts +4 -0
- package/lib/tmpl/interface.d.ts.map +1 -1
- package/lib/tmpl/interface.js.map +1 -1
- package/lib/units/index.d.ts +1 -0
- package/lib/units/index.d.ts.map +1 -1
- package/lib/units/index.js +16 -0
- package/lib/units/index.js.map +1 -1
- package/package.json +1 -1
- package/src/aldehyde/controls/entity-select/entity-select.tsx +1 -1
- package/src/aldehyde/controls/entry-control.tsx +2 -2
- package/src/aldehyde/controls/icon-selector/icon/phonenode-menu-icon/iconfont.css +47 -3
- package/src/aldehyde/controls/icon-selector/icon/phonenode-menu-icon/iconfont.js +1 -1
- package/src/aldehyde/controls/icon-selector/icon/phonenode-menu-icon/iconfont.json +77 -0
- package/src/aldehyde/controls/icon-selector/icon/phonenode-menu-icon/iconfont.ttf +0 -0
- package/src/aldehyde/controls/icon-selector/icon/phonenode-menu-icon/iconfont.woff +0 -0
- package/src/aldehyde/controls/icon-selector/icon/phonenode-menu-icon/iconfont.woff2 +0 -0
- package/src/aldehyde/draw-canvas/edit/components/asset-bar/index.less +36 -0
- package/src/aldehyde/draw-canvas/edit/components/asset-bar/index.tsx +93 -0
- package/src/aldehyde/draw-canvas/edit/components/main-header/index.less +21 -0
- package/src/aldehyde/draw-canvas/edit/components/main-header/index.tsx +187 -0
- package/src/aldehyde/draw-canvas/edit/components/render/draws/bg-draw.ts +98 -0
- package/src/aldehyde/draw-canvas/edit/components/render/draws/contextmenu-draw.ts +307 -0
- package/src/aldehyde/draw-canvas/edit/components/render/draws/graph-draw.ts +251 -0
- package/src/aldehyde/draw-canvas/edit/components/render/draws/index.ts +7 -0
- package/src/aldehyde/draw-canvas/edit/components/render/draws/link-draw.ts +1416 -0
- package/src/aldehyde/draw-canvas/edit/components/render/draws/preview-draw.ts +257 -0
- package/src/aldehyde/draw-canvas/edit/components/render/draws/ref-line-draw.ts +72 -0
- package/src/aldehyde/draw-canvas/edit/components/render/draws/ruler-draw.ts +167 -0
- package/src/aldehyde/draw-canvas/edit/components/render/graphs/base-graph.ts +241 -0
- package/src/aldehyde/draw-canvas/edit/components/render/graphs/bezier.ts +542 -0
- package/src/aldehyde/draw-canvas/edit/components/render/graphs/circle.ts +700 -0
- package/src/aldehyde/draw-canvas/edit/components/render/graphs/curve.ts +501 -0
- package/src/aldehyde/draw-canvas/edit/components/render/graphs/index.ts +6 -0
- package/src/aldehyde/draw-canvas/edit/components/render/graphs/line.ts +494 -0
- package/src/aldehyde/draw-canvas/edit/components/render/graphs/rect.ts +681 -0
- package/src/aldehyde/draw-canvas/edit/components/render/handlers/drag-handlers.ts +69 -0
- package/src/aldehyde/draw-canvas/edit/components/render/handlers/drag-outside-handlers.ts +162 -0
- package/src/aldehyde/draw-canvas/edit/components/render/handlers/graph-handlers.ts +108 -0
- package/src/aldehyde/draw-canvas/edit/components/render/handlers/index.ts +9 -0
- package/src/aldehyde/draw-canvas/edit/components/render/handlers/key-move-handlers.ts +50 -0
- package/src/aldehyde/draw-canvas/edit/components/render/handlers/link-handlers.ts +46 -0
- package/src/aldehyde/draw-canvas/edit/components/render/handlers/selection-handlers.ts +385 -0
- package/src/aldehyde/draw-canvas/edit/components/render/handlers/shutcut-handlers.ts +46 -0
- package/src/aldehyde/draw-canvas/edit/components/render/handlers/text-handlers.ts +82 -0
- package/src/aldehyde/draw-canvas/edit/components/render/handlers/zoom-handlers.ts +60 -0
- package/src/aldehyde/draw-canvas/edit/components/render/index.ts +768 -0
- package/src/aldehyde/draw-canvas/edit/components/render/tools/align-tool.ts +91 -0
- package/src/aldehyde/draw-canvas/edit/components/render/tools/asset-tool.ts +142 -0
- package/src/aldehyde/draw-canvas/edit/components/render/tools/attract-tool.ts +440 -0
- package/src/aldehyde/draw-canvas/edit/components/render/tools/copy-tool.ts +269 -0
- package/src/aldehyde/draw-canvas/edit/components/render/tools/import-export-tool.ts +603 -0
- package/src/aldehyde/draw-canvas/edit/components/render/tools/index.ts +9 -0
- package/src/aldehyde/draw-canvas/edit/components/render/tools/link-tool.ts +225 -0
- package/src/aldehyde/draw-canvas/edit/components/render/tools/position-tool.ts +212 -0
- package/src/aldehyde/draw-canvas/edit/components/render/tools/selection-tool.ts +132 -0
- package/src/aldehyde/draw-canvas/edit/components/render/tools/z-index-tool.ts +227 -0
- package/src/aldehyde/draw-canvas/edit/components/render/types.ts +287 -0
- package/src/aldehyde/draw-canvas/edit/components/render/utils/a-star.ts +116 -0
- package/src/aldehyde/draw-canvas/edit/components/render/utils/bezier-scene-func.ts +73 -0
- package/src/aldehyde/draw-canvas/edit/components/setting-form/index.tsx +200 -0
- package/src/aldehyde/draw-canvas/edit/index.less +34 -0
- package/src/aldehyde/draw-canvas/edit/index.tsx +138 -0
- package/src/aldehyde/form/form-Item-group.tsx +1 -0
- package/src/aldehyde/icon/local-aliIcon/iconfont.js +1 -1
- package/src/aldehyde/tmpl/hcservice-v3.tsx +14 -0
- package/src/aldehyde/tmpl/interface.tsx +2 -0
- package/src/aldehyde/units/index.tsx +15 -0
|
@@ -0,0 +1,200 @@
|
|
|
1
|
+
import React, { useEffect, useMemo, useState } from 'react';
|
|
2
|
+
import { Form as AntdForm, Collapse } from "antd";
|
|
3
|
+
import _ from "lodash";
|
|
4
|
+
import FormItemGroup from "../../../../form/form-Item-group";
|
|
5
|
+
import { PageSettings, AssetSettings, LinkSettings } from '../render/types';
|
|
6
|
+
import type Konva from 'konva';
|
|
7
|
+
|
|
8
|
+
const FormItem = AntdForm.Item;
|
|
9
|
+
|
|
10
|
+
// 坐标配置
|
|
11
|
+
const positionSetting = {
|
|
12
|
+
title: "坐标",
|
|
13
|
+
isGroup: true,
|
|
14
|
+
fields: [
|
|
15
|
+
{ title: "X", noStyle: true, id: "x", extControlType: "float", colSpan: 1, style: { width: "100%" } },
|
|
16
|
+
{ title: "Y", noStyle: true, id: "y", extControlType: "float", colSpan: 1, style: { width: "100%" } }
|
|
17
|
+
]
|
|
18
|
+
};
|
|
19
|
+
|
|
20
|
+
// 旋转角度配置
|
|
21
|
+
const rotationSetting = { fields: [{ title: "旋转角度", id: "rotation", extControlType: "int", min: -3600, max: 3600, style: { width: "100%" } }] };
|
|
22
|
+
|
|
23
|
+
// 基础图形配置(矩形、圆形等)
|
|
24
|
+
const baseGraphSetting = [
|
|
25
|
+
{
|
|
26
|
+
fields: [
|
|
27
|
+
{ title: "线条颜色", id: "stroke", extControlType: "color", style: { width: "100%" } },
|
|
28
|
+
{ title: "线宽", id: "strokeWidth", extControlType: "int", min: 0, style: { width: "100%" } },
|
|
29
|
+
{ title: "填充颜色", id: "fill", extControlType: "color", style: { width: "100%" } },
|
|
30
|
+
]
|
|
31
|
+
},
|
|
32
|
+
positionSetting,
|
|
33
|
+
rotationSetting
|
|
34
|
+
];
|
|
35
|
+
|
|
36
|
+
// 线条配置(折线、曲线等)
|
|
37
|
+
const linesSetting = [
|
|
38
|
+
{ title: "线条颜色", id: "stroke", extControlType: "color", style: { width: "100%" } },
|
|
39
|
+
{ title: "线宽", id: "strokeWidth", extControlType: "int", min: 0, style: { width: "100%" } },
|
|
40
|
+
{ title: "开始箭头", id: "arrowStart", extControlType: "yes-no-switch", style: { width: "100%" } },
|
|
41
|
+
{ title: "结束箭头", id: "arrowEnd", extControlType: "yes-no-switch", style: { width: "100%" } }
|
|
42
|
+
];
|
|
43
|
+
|
|
44
|
+
// 默认画布、组件配置
|
|
45
|
+
const defFormConfig = {
|
|
46
|
+
pageSetting: [ // 画布
|
|
47
|
+
{
|
|
48
|
+
title: "基本信息",
|
|
49
|
+
groups: [
|
|
50
|
+
{
|
|
51
|
+
title: "画布尺寸",
|
|
52
|
+
isGroup: true,
|
|
53
|
+
fields: [
|
|
54
|
+
{ title: "宽", noStyle: true, id: "pageWidth", extControlType: "int", colSpan: 1, min: 0, style: { width: "100%" } },
|
|
55
|
+
{ title: "高", noStyle: true, id: "pageHeight", extControlType: "int", colSpan: 1, min: 0, style: { width: "100%" } }
|
|
56
|
+
]
|
|
57
|
+
},
|
|
58
|
+
{
|
|
59
|
+
fields: [
|
|
60
|
+
{ title: "背景色", id: "background", extControlType: "color", style: { width: "100%" } },
|
|
61
|
+
{ title: "背景图", id: "backgroundImg", extControlType: "picture", style: { width: "100%" } }
|
|
62
|
+
]
|
|
63
|
+
}
|
|
64
|
+
],
|
|
65
|
+
}
|
|
66
|
+
],
|
|
67
|
+
linkSetting: [{ title: "基本信息", fields: linesSetting }], // 连线配置
|
|
68
|
+
Rect: [{ title: "基本信息", groups: baseGraphSetting }],
|
|
69
|
+
Circle: [{ title: "基本信息", groups: baseGraphSetting }],
|
|
70
|
+
Bezier: [{ title: "基本信息", groups: [{ fields: linesSetting }, positionSetting] }],
|
|
71
|
+
Curve: [{ title: "基本信息", groups: [{ fields: linesSetting }, positionSetting] }],
|
|
72
|
+
Text: [{
|
|
73
|
+
title: "基本信息",
|
|
74
|
+
groups: [
|
|
75
|
+
{
|
|
76
|
+
fields: [
|
|
77
|
+
{ title: "文本", id: "text", extControlType: "textarea", style: { width: "100%" } },
|
|
78
|
+
{ title: "文本颜色", id: "textFill", extControlType: "color", style: { width: "100%" } },
|
|
79
|
+
{ title: "字体大小", id: "fontSize", extControlType: "int", min: 1, style: { width: "100%" } },
|
|
80
|
+
]
|
|
81
|
+
},
|
|
82
|
+
positionSetting
|
|
83
|
+
]
|
|
84
|
+
}]
|
|
85
|
+
};
|
|
86
|
+
|
|
87
|
+
interface Props {
|
|
88
|
+
pageSettings?: PageSettings; // 画布配置
|
|
89
|
+
onPageSettingsChange: (s: PageSettings) => void; // 更新画布配置
|
|
90
|
+
assetCurrent?: Konva.Node; // 当前选中组件
|
|
91
|
+
assetSettings?: AssetSettings; // 当前选中组件配置
|
|
92
|
+
onAssetSettingsChange: (s: AssetSettings) => void; // 更新当前选中组件配置
|
|
93
|
+
linkCurrent?: Konva.Line; // 当前选中连线
|
|
94
|
+
linkSettings?: LinkSettings; // 当前选中连线配置
|
|
95
|
+
onLinkSettingsChange: (s: LinkSettings) => void; // 更新当前选中连线配置
|
|
96
|
+
formConfig?: { [key: string]: any }; // 表单配置
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
const Index = (props: Props) => {
|
|
100
|
+
const { pageSettings, onPageSettingsChange, assetCurrent, assetSettings, onAssetSettingsChange, linkCurrent, linkSettings, onLinkSettingsChange, formConfig } = props;
|
|
101
|
+
const formData = assetCurrent ? assetSettings : (linkCurrent ? linkSettings : pageSettings);
|
|
102
|
+
const [form] = AntdForm.useForm();
|
|
103
|
+
const [formConfigs, setFormConfigs] = useState<{ [key: string]: any }>([]);
|
|
104
|
+
|
|
105
|
+
// FormItem渲染
|
|
106
|
+
const renderFormItem = (item: { [key: string]: any }) => {
|
|
107
|
+
if (item.groups) {
|
|
108
|
+
return item.groups.map(r => {
|
|
109
|
+
if (r?.isGroup) { // 表单分组显示
|
|
110
|
+
return <FormItem label={r.title} layout='vertical' style={{ margin: "12px 0", paddingInline: "8px" }}>
|
|
111
|
+
<FormItemGroup fields={r.fields || undefined} valueMap={undefined} />
|
|
112
|
+
</FormItem>;
|
|
113
|
+
}
|
|
114
|
+
return <FormItemGroup layout='vertical' fields={r.fields || undefined} valueMap={undefined} />;
|
|
115
|
+
});
|
|
116
|
+
}
|
|
117
|
+
return <FormItemGroup layout='vertical' fields={item.fields || undefined} valueMap={undefined} />;
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
// 当前表单配置
|
|
121
|
+
const currentFormConfig = useMemo(() => {
|
|
122
|
+
let temFormConfig = formConfig || (linkCurrent ? defFormConfig["linkSetting"] : defFormConfig["pageSetting"]);
|
|
123
|
+
if (assetCurrent) {
|
|
124
|
+
const assetType = assetCurrent.getAttr("assetType");
|
|
125
|
+
const graphType = assetCurrent.getAttr("graphType");
|
|
126
|
+
temFormConfig = defFormConfig[assetType === "Text" ? "Text" : graphType] || temFormConfig;
|
|
127
|
+
}
|
|
128
|
+
const configArr = temFormConfig.map(r => r.groups ? r.groups.map(i => i.fields) : r.fields).flat(Infinity);
|
|
129
|
+
setFormConfigs(configArr);
|
|
130
|
+
return temFormConfig;
|
|
131
|
+
}, [formConfig, linkCurrent, assetCurrent]);
|
|
132
|
+
|
|
133
|
+
const fieldGroupList = () => {
|
|
134
|
+
const items = currentFormConfig?.map((item, index) => ({
|
|
135
|
+
key: index,
|
|
136
|
+
label: item.title,
|
|
137
|
+
children: renderFormItem(item)
|
|
138
|
+
}));
|
|
139
|
+
return <Collapse bordered={false} size="small" defaultActiveKey={0} items={items} />;
|
|
140
|
+
};
|
|
141
|
+
|
|
142
|
+
// 更新数据
|
|
143
|
+
const onValuesChange = (val: { [key: string]: any }) => {
|
|
144
|
+
const temVal = val;
|
|
145
|
+
Object.keys(val).forEach((key) => { // 使用公共表单组件,转换指定类型值
|
|
146
|
+
const extControlType = formConfigs.find((item: any) => item.id === key)?.extControlType;
|
|
147
|
+
if (["yes-no-switch"].includes(extControlType)) { // 处理是否转换boolean值
|
|
148
|
+
temVal[key] = val[key] === "是" ? true : false;
|
|
149
|
+
return;
|
|
150
|
+
}
|
|
151
|
+
if (["float", "int"].includes(extControlType)) { // 处理数字类型转换
|
|
152
|
+
temVal[key] = Number(val[key] || 0);
|
|
153
|
+
return;
|
|
154
|
+
}
|
|
155
|
+
});
|
|
156
|
+
if (assetCurrent) { // 当前选中组件
|
|
157
|
+
onAssetSettingsChange({ ...assetSettings, ...temVal });
|
|
158
|
+
return;
|
|
159
|
+
}
|
|
160
|
+
if (linkCurrent) { // 当前选中连线
|
|
161
|
+
onLinkSettingsChange({ ...linkSettings, ...temVal });
|
|
162
|
+
return;
|
|
163
|
+
}
|
|
164
|
+
// 默认画布配置
|
|
165
|
+
onPageSettingsChange({ ...pageSettings, ...temVal });
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
// 表单数据实时回显更新
|
|
169
|
+
const formSetFieldsValue = () => {
|
|
170
|
+
const temVal = _.cloneDeep(formData);
|
|
171
|
+
Object.keys(temVal).forEach((key) => { // 使用公共表单组件,转换指定类型值
|
|
172
|
+
const extControlType = formConfigs.find((item: any) => item.id === key)?.extControlType;
|
|
173
|
+
if (["yes-no-switch"].includes(extControlType)) { // 处理是否转换boolean值
|
|
174
|
+
temVal[key] = temVal[key] === true ? "是" : "否";
|
|
175
|
+
return;
|
|
176
|
+
}
|
|
177
|
+
});
|
|
178
|
+
form.setFieldsValue(temVal);
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
// 表单数据实时回显更新
|
|
182
|
+
useEffect(() => {
|
|
183
|
+
if (formConfigs?.length && formData) {
|
|
184
|
+
formSetFieldsValue();
|
|
185
|
+
}
|
|
186
|
+
}, [formData, formConfigs]);
|
|
187
|
+
|
|
188
|
+
return <AntdForm
|
|
189
|
+
scrollToFirstError={true}
|
|
190
|
+
labelWrap={true}
|
|
191
|
+
size="small"
|
|
192
|
+
form={form}
|
|
193
|
+
onValuesChange={onValuesChange}
|
|
194
|
+
// onFinish={onValuesChange}
|
|
195
|
+
>
|
|
196
|
+
{fieldGroupList()}
|
|
197
|
+
</AntdForm>;
|
|
198
|
+
};
|
|
199
|
+
|
|
200
|
+
export default Index;
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
.draw {
|
|
2
|
+
width: 100%;
|
|
3
|
+
height: 100%;
|
|
4
|
+
display: flex;
|
|
5
|
+
flex-direction: column;
|
|
6
|
+
|
|
7
|
+
*:focus-visible {
|
|
8
|
+
outline: none;
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
.draw-content {
|
|
12
|
+
display: flex;
|
|
13
|
+
flex-grow: 1;
|
|
14
|
+
|
|
15
|
+
.left {
|
|
16
|
+
overflow: auto;
|
|
17
|
+
border-right: 1px solid #ccc;
|
|
18
|
+
flex-shrink: 0;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
.center {
|
|
22
|
+
width: 0;
|
|
23
|
+
flex-grow: 1;
|
|
24
|
+
background-color: rgba(0, 0, 0, 0.05);
|
|
25
|
+
z-index: 1;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
.right {
|
|
29
|
+
width: 220px;
|
|
30
|
+
background-color: #f5f5f5;
|
|
31
|
+
border-left: 1px solid #ccc;
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
}
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
import React, { useEffect, useRef, useState, useCallback } from 'react';
|
|
2
|
+
import { Render } from './components/render';
|
|
3
|
+
import { GraphType, PageSettings, AssetSettings, LinkSettings } from './components/render/types';
|
|
4
|
+
import MainHeader from './components/main-header';
|
|
5
|
+
import AssetBar from './components/asset-bar';
|
|
6
|
+
import SettingForm from "./components/setting-form";
|
|
7
|
+
import type Konva from 'konva';
|
|
8
|
+
import './index.less';
|
|
9
|
+
|
|
10
|
+
const Index = () => {
|
|
11
|
+
const boardRef = useRef<HTMLDivElement>(null); // 画布边框
|
|
12
|
+
const stageRef = useRef<HTMLDivElement>(null); // 画布
|
|
13
|
+
const renderRef = useRef<Render | null>(null); // 渲染器实例
|
|
14
|
+
const observerRef = useRef<ResizeObserver | null>(null); // 监听尺寸变化
|
|
15
|
+
const [graphType, setGraphType] = useState<GraphType>(); // 当前画图类型
|
|
16
|
+
const [pageSettings, setPageSettings] = useState<PageSettings>(); // 画布设置
|
|
17
|
+
const [assetSettings, setAssetSettings] = useState<AssetSettings>(); // 当前选中组件设置
|
|
18
|
+
const [linkSettings, setLinkSettings] = useState<LinkSettings>(); // 当前连线设置
|
|
19
|
+
const [assetCurrent, setAssetCurrent] = useState<Konva.Node>(); // 当前选中组件
|
|
20
|
+
const [linkCurrent, setLinkCurrent] = useState<Konva.Line>(); // 当前选中连线
|
|
21
|
+
const [texting, setTexting] = useState<boolean>(false); // 添加文本状态
|
|
22
|
+
const assetCurrentRef = useRef<Konva.Node>(null); // 当前选中组件Ref
|
|
23
|
+
|
|
24
|
+
// 初始化渲染器
|
|
25
|
+
const initRender = useCallback((width: number, height: number) => {
|
|
26
|
+
if (renderRef.current || !stageRef.current) return;
|
|
27
|
+
const render = new Render(stageRef.current, {
|
|
28
|
+
width, height,
|
|
29
|
+
showBg: true, showRuler: true, showRefLine: true,
|
|
30
|
+
showPreview: true, showContextmenu: true,
|
|
31
|
+
attractResize: true, attractBg: true, attractNode: true,
|
|
32
|
+
});
|
|
33
|
+
renderRef.current = render;
|
|
34
|
+
// 初始化设置
|
|
35
|
+
setPageSettings(render.getPageSettings());
|
|
36
|
+
// 事件绑定
|
|
37
|
+
render.on('page-settings-change', setPageSettings); // 监听画布配置变化
|
|
38
|
+
render.on('selection-change', (nodes: Konva.Node[]) => { // 监听选中组件
|
|
39
|
+
assetCurrentRef.current = nodes.length === 1 ? nodes[0] : undefined;
|
|
40
|
+
setAssetCurrent(assetCurrentRef.current);
|
|
41
|
+
setAssetSettings(nodes.length === 1 ? render.getAssetSettings(nodes[0]) : undefined);
|
|
42
|
+
});
|
|
43
|
+
render.on('link-selection-change', (link?: Konva.Line) => { // 监听选中连线
|
|
44
|
+
setLinkCurrent(link);
|
|
45
|
+
setLinkSettings(link ? render.getLinkSettings(link) : undefined);
|
|
46
|
+
});
|
|
47
|
+
render.on('asset-position-change', (nodes: Konva.Node[]) => { // 监听组件位置变化
|
|
48
|
+
const node = nodes.find(n => n.id() === assetCurrentRef.current?.id());
|
|
49
|
+
if (node) {
|
|
50
|
+
const position = node.position();
|
|
51
|
+
setAssetSettings(s => s ? { ...s, x: +position.x.toFixed(1), y: +position.y.toFixed(1) } : undefined);
|
|
52
|
+
}
|
|
53
|
+
});
|
|
54
|
+
render.on('asset-rotation-change', (nodes: Konva.Node[]) => { // 监听组件旋转
|
|
55
|
+
const node = nodes.find(n => n.id() === assetCurrentRef.current?.id());
|
|
56
|
+
if (node) {
|
|
57
|
+
const rotation = node.rotation();
|
|
58
|
+
setAssetSettings(s => s ? { ...s, rotation: +rotation.toFixed(1) } : undefined);
|
|
59
|
+
}
|
|
60
|
+
});
|
|
61
|
+
render.on('texting-change', setTexting); // 监听插入文本状态
|
|
62
|
+
render.on('graph-type-change', setGraphType); // 监听插入基础图形类型
|
|
63
|
+
}, []);
|
|
64
|
+
|
|
65
|
+
// 监听尺寸变化
|
|
66
|
+
useEffect(() => {
|
|
67
|
+
if (!boardRef.current) return;
|
|
68
|
+
const observer = new ResizeObserver(() => {
|
|
69
|
+
const { width, height } = boardRef.current.getBoundingClientRect();
|
|
70
|
+
if (renderRef.current) {
|
|
71
|
+
renderRef.current.resize(width, height);
|
|
72
|
+
} else {
|
|
73
|
+
initRender(width, height);
|
|
74
|
+
}
|
|
75
|
+
})
|
|
76
|
+
observer.observe(boardRef.current);
|
|
77
|
+
observerRef.current = observer;
|
|
78
|
+
return () => observer.disconnect();
|
|
79
|
+
}, [])
|
|
80
|
+
|
|
81
|
+
// 更新画布配置
|
|
82
|
+
const handlePageSetting = (val: { [key: string]: any }) => {
|
|
83
|
+
if (!(renderRef.current)) {
|
|
84
|
+
return;
|
|
85
|
+
}
|
|
86
|
+
renderRef.current.setPageSettings({ ...pageSettings, ...val }, true);
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
// 更新组件配置
|
|
90
|
+
const handleAssetSettings = (val: { [key: string]: any }) => {
|
|
91
|
+
if (!(assetCurrent && renderRef.current)) {
|
|
92
|
+
return;
|
|
93
|
+
}
|
|
94
|
+
setAssetSettings({ ...assetSettings, ...val });
|
|
95
|
+
renderRef.current.setAssetSettings(assetCurrent, { ...assetSettings, ...val }, true);
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
// 更新连线配置
|
|
99
|
+
const handleLinkSettings = (val: { [key: string]: any }) => {
|
|
100
|
+
if (!(linkCurrent && renderRef.current)) {
|
|
101
|
+
return;
|
|
102
|
+
}
|
|
103
|
+
setLinkSettings({ ...linkSettings, ...val });
|
|
104
|
+
renderRef.current.setLinkSettings(linkCurrent, { ...linkSettings, ...val }, true);
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
return (
|
|
108
|
+
<div className="draw">
|
|
109
|
+
<MainHeader
|
|
110
|
+
render={renderRef.current}
|
|
111
|
+
graphType={graphType}
|
|
112
|
+
texting={texting}
|
|
113
|
+
onGraphTypeChange={(val) => renderRef.current.changeGraphType(val)}
|
|
114
|
+
onTexting={() => renderRef.current.changeTexting(true)}
|
|
115
|
+
/>
|
|
116
|
+
<div className='draw-content'>
|
|
117
|
+
<div className='left'><AssetBar /></div>
|
|
118
|
+
<div className='center' ref={boardRef} >
|
|
119
|
+
<div ref={stageRef} />
|
|
120
|
+
</div>
|
|
121
|
+
<div className='right'>
|
|
122
|
+
<SettingForm
|
|
123
|
+
pageSettings={pageSettings}
|
|
124
|
+
onPageSettingsChange={handlePageSetting}
|
|
125
|
+
assetCurrent={assetCurrent}
|
|
126
|
+
assetSettings={assetSettings}
|
|
127
|
+
onAssetSettingsChange={handleAssetSettings}
|
|
128
|
+
linkCurrent={linkCurrent}
|
|
129
|
+
linkSettings={linkSettings}
|
|
130
|
+
onLinkSettingsChange={handleLinkSettings}
|
|
131
|
+
/>
|
|
132
|
+
</div>
|
|
133
|
+
</div>
|
|
134
|
+
</div>
|
|
135
|
+
)
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
export default Index;
|
|
@@ -141,6 +141,7 @@ export default class FormItemGroup extends React.PureComponent<
|
|
|
141
141
|
return (
|
|
142
142
|
<FormItem
|
|
143
143
|
label={translate("${" + item.title + "}")}
|
|
144
|
+
noStyle={item.noStyle || false}
|
|
144
145
|
hidden={item.hidden}
|
|
145
146
|
name={fieldConfig.controlType == "field-history" ? undefined : item[nameAttr]}
|
|
146
147
|
key={item.id}
|