aldehyde 0.2.473 → 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 +3 -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/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 +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 +79 -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 +19 -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 +203 -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 +90 -0
- package/lib/draw-canvas/edit/components/render/index.d.ts.map +1 -0
- package/lib/draw-canvas/edit/components/render/index.js +692 -0
- package/lib/draw-canvas/edit/components/render/index.js.map +1 -0
- package/lib/draw-canvas/edit/components/render/types.d.ts +247 -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/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 +17 -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 +243 -0
- package/lib/draw-canvas/edit/components/setting-form/index.js.map +1 -0
- 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 +8 -0
- package/lib/draw-canvas/edit/index.d.ts.map +1 -0
- package/lib/draw-canvas/edit/index.js +165 -0
- package/lib/draw-canvas/edit/index.js.map +1 -0
- package/lib/draw-canvas/edit/index.less +49 -0
- 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/icon/local-aliIcon/iconfont.js +5 -5
- package/lib/icon/local-aliIcon/iconfont.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 +7 -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 +3 -0
- package/lib/tmpl/hcservice-v3.d.ts.map +1 -1
- package/lib/tmpl/hcservice-v3.js +61 -0
- package/lib/tmpl/hcservice-v3.js.map +1 -1
- package/lib/tmpl/interface.d.ts +17 -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 +3 -1
- package/lib/units/index.d.ts.map +1 -1
- package/lib/units/index.js +33 -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 +3 -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/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.less +36 -0
- package/src/aldehyde/draw-canvas/edit/components/asset-bar/index.tsx +95 -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 +233 -0
- package/src/aldehyde/draw-canvas/edit/components/render/draws/bg-draw.ts +163 -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 +275 -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 +159 -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 +393 -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 +776 -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 +194 -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 +291 -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/imag-upload.tsx +118 -0
- package/src/aldehyde/draw-canvas/edit/components/setting-form/index.tsx +295 -0
- package/src/aldehyde/draw-canvas/edit/constant.ts +6 -0
- package/src/aldehyde/draw-canvas/edit/index.less +49 -0
- package/src/aldehyde/draw-canvas/edit/index.tsx +197 -0
- 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 +5 -5
- package/src/aldehyde/icon/local-aliIcon/iconfont.js +1 -1
- 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 +44 -0
- package/src/aldehyde/tmpl/interface.tsx +15 -1
- package/src/aldehyde/tmpl/tmpl-config-analysis.tsx +1 -1
- package/src/aldehyde/units/index.tsx +31 -3
|
@@ -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;
|
|
@@ -0,0 +1,295 @@
|
|
|
1
|
+
import React, { useEffect, useMemo, useState } from 'react';
|
|
2
|
+
import { Form as AntdForm, Collapse, Row, Col } from "antd";
|
|
3
|
+
import _ from "lodash";
|
|
4
|
+
import FormItemGroup from "../../../../form/form-Item-group";
|
|
5
|
+
import { FieldConfig } from "../../../../tmpl/interface";
|
|
6
|
+
import { PageSettings, AssetSettings, LinkSettings } from '../render/types';
|
|
7
|
+
import type Konva from 'konva';
|
|
8
|
+
import { ProgramConfig } from "../../../../index";
|
|
9
|
+
import { useLocale } from "../../../../locale/useLocale";
|
|
10
|
+
import ImageUpload from "./imag-upload";
|
|
11
|
+
|
|
12
|
+
const FormItem = AntdForm.Item;
|
|
13
|
+
|
|
14
|
+
// 基本配置
|
|
15
|
+
const baseSetting = [
|
|
16
|
+
{ title: "ID", id: "id", extControlType: "text", disabled: true, style: { width: "100%" } },
|
|
17
|
+
];
|
|
18
|
+
|
|
19
|
+
// 数据源配置
|
|
20
|
+
const defDataSourceSetting = { title: "数据源", id: "dataSource", extControlType: "select", options: [], style: { width: "100%" } };
|
|
21
|
+
|
|
22
|
+
// 坐标配置
|
|
23
|
+
const positionSetting = {
|
|
24
|
+
title: "坐标",
|
|
25
|
+
isGroup: true,
|
|
26
|
+
fields: [
|
|
27
|
+
{ title: "X", noStyle: true, id: "x", extControlType: "float", colSpan: 1, style: { width: "100%" } },
|
|
28
|
+
{ title: "Y", noStyle: true, id: "y", extControlType: "float", colSpan: 1, style: { width: "100%" } }
|
|
29
|
+
]
|
|
30
|
+
};
|
|
31
|
+
|
|
32
|
+
// 旋转角度配置
|
|
33
|
+
const rotationSetting = { fields: [{ title: "旋转角度", id: "rotation", extControlType: "int", min: -3600, max: 3600, style: { width: "100%" } }] };
|
|
34
|
+
|
|
35
|
+
// 基础图形配置(矩形、圆形等)
|
|
36
|
+
const baseGraphSetting = [
|
|
37
|
+
{
|
|
38
|
+
fields: [
|
|
39
|
+
{ title: "线条颜色", id: "stroke", extControlType: "color", style: { width: "100%" } },
|
|
40
|
+
{ title: "线宽", id: "strokeWidth", extControlType: "int", min: 0, style: { width: "100%" } },
|
|
41
|
+
{ title: "填充颜色", id: "fill", extControlType: "color", style: { width: "100%" } },
|
|
42
|
+
]
|
|
43
|
+
},
|
|
44
|
+
positionSetting,
|
|
45
|
+
rotationSetting
|
|
46
|
+
];
|
|
47
|
+
|
|
48
|
+
// 线条配置(折线、曲线等)
|
|
49
|
+
const linesSetting = [
|
|
50
|
+
{ title: "线条颜色", id: "stroke", extControlType: "color", style: { width: "100%" } },
|
|
51
|
+
{ title: "线宽", id: "strokeWidth", extControlType: "int", min: 0, style: { width: "100%" } },
|
|
52
|
+
{ title: "开始箭头", id: "arrowStart", extControlType: "yes-no-switch", style: { width: "100%" } },
|
|
53
|
+
{ title: "结束箭头", id: "arrowEnd", extControlType: "yes-no-switch", style: { width: "100%" } }
|
|
54
|
+
];
|
|
55
|
+
|
|
56
|
+
// 默认画布、组件配置
|
|
57
|
+
const defFormConfig = {
|
|
58
|
+
pageSetting: [ // 画布
|
|
59
|
+
{
|
|
60
|
+
title: "基本信息",
|
|
61
|
+
groups: [
|
|
62
|
+
{
|
|
63
|
+
title: "画布尺寸",
|
|
64
|
+
isGroup: true,
|
|
65
|
+
fields: [
|
|
66
|
+
{ title: "宽", noStyle: true, id: "pageWidth", extControlType: "int", colSpan: 1, min: 0, style: { width: "100%" } },
|
|
67
|
+
{ title: "高", noStyle: true, id: "pageHeight", extControlType: "int", colSpan: 1, min: 0, style: { width: "100%" } }
|
|
68
|
+
]
|
|
69
|
+
},
|
|
70
|
+
{
|
|
71
|
+
fields: [
|
|
72
|
+
{ title: "背景色", id: "background", extControlType: "color", style: { width: "100%" } },
|
|
73
|
+
{ title: "背景图", id: "backgroundImg", extControlType: "picture", style: { width: "100%" } }
|
|
74
|
+
]
|
|
75
|
+
}
|
|
76
|
+
],
|
|
77
|
+
}
|
|
78
|
+
],
|
|
79
|
+
linkSetting: [{ title: "基本信息", fields: linesSetting }], // 连线配置
|
|
80
|
+
Rect: [{ title: "基本信息", groups: baseGraphSetting }],
|
|
81
|
+
Circle: [{ title: "基本信息", groups: baseGraphSetting }],
|
|
82
|
+
Bezier: [{ title: "基本信息", groups: [{ fields: linesSetting }, positionSetting] }],
|
|
83
|
+
Curve: [{ title: "基本信息", groups: [{ fields: linesSetting }, positionSetting] }],
|
|
84
|
+
Text: [{
|
|
85
|
+
title: "基本信息",
|
|
86
|
+
groups: [
|
|
87
|
+
{
|
|
88
|
+
fields: [
|
|
89
|
+
{ title: "默认文本", id: "text", extControlType: "textarea", style: { width: "100%" } },
|
|
90
|
+
{ title: "文本颜色", id: "textFill", extControlType: "color", style: { width: "100%" } },
|
|
91
|
+
{ title: "字体大小", id: "fontSize", extControlType: "int", min: 1, style: { width: "100%" } }
|
|
92
|
+
]
|
|
93
|
+
},
|
|
94
|
+
positionSetting
|
|
95
|
+
]
|
|
96
|
+
}]
|
|
97
|
+
};
|
|
98
|
+
|
|
99
|
+
interface Props {
|
|
100
|
+
pageSettings?: PageSettings; // 画布配置
|
|
101
|
+
onPageSettingsChange: (s: PageSettings) => void; // 更新画布配置
|
|
102
|
+
assetCurrent?: Konva.Node; // 当前选中组件
|
|
103
|
+
assetSettings?: AssetSettings; // 当前选中组件配置
|
|
104
|
+
onAssetSettingsChange: (s: AssetSettings) => void; // 更新当前选中组件配置
|
|
105
|
+
linkCurrent?: Konva.Line; // 当前选中连线
|
|
106
|
+
linkSettings?: LinkSettings; // 当前选中连线配置
|
|
107
|
+
onLinkSettingsChange: (s: LinkSettings) => void; // 更新当前选中连线配置
|
|
108
|
+
recordCode?: string; // 当前画面关联数据code
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
const Index = (props: Props) => {
|
|
112
|
+
const { pageSettings, onPageSettingsChange, assetCurrent, assetSettings, onAssetSettingsChange, linkCurrent, linkSettings, onLinkSettingsChange, recordCode } = props;
|
|
113
|
+
const formData = assetCurrent ? assetSettings : (linkCurrent ? linkSettings : pageSettings);
|
|
114
|
+
const [form] = AntdForm.useForm();
|
|
115
|
+
const [formConfigs, setFormConfigs] = useState<{ [key: string]: any }>([]);
|
|
116
|
+
const { translate } = useLocale();
|
|
117
|
+
|
|
118
|
+
// 自定义表单项
|
|
119
|
+
const customFormItem = (items: { [key: string]: any }[], layout?: "vertical" | "horizontal") => {
|
|
120
|
+
const entryControls = items.map(item => {
|
|
121
|
+
const { extControlType } = item || {};
|
|
122
|
+
if (!extControlType) {
|
|
123
|
+
return null;
|
|
124
|
+
}
|
|
125
|
+
let entryControl;
|
|
126
|
+
switch (extControlType) {
|
|
127
|
+
case "picture":
|
|
128
|
+
entryControl = <ImageUpload recordCode={recordCode} />;
|
|
129
|
+
break;
|
|
130
|
+
default:
|
|
131
|
+
break;
|
|
132
|
+
}
|
|
133
|
+
if (!entryControl) {
|
|
134
|
+
return null;
|
|
135
|
+
}
|
|
136
|
+
const colSpan = item.colSpan || 2;
|
|
137
|
+
return <Col key={item.id} span={12 * colSpan} style={{ width: "stretch" }}>
|
|
138
|
+
<FormItem
|
|
139
|
+
layout={layout}
|
|
140
|
+
label={translate("${" + item.title + "}")}
|
|
141
|
+
noStyle={item.noStyle || false}
|
|
142
|
+
hidden={item.hidden}
|
|
143
|
+
name={item.id}
|
|
144
|
+
key={item.id}
|
|
145
|
+
labelCol={{ span: 24 }}
|
|
146
|
+
wrapperCol={{ span: 24 }}
|
|
147
|
+
tooltip={!item.tip ? undefined : item.tip}
|
|
148
|
+
style={{ margin: "4px 4px 12px" }}
|
|
149
|
+
>{entryControl}</FormItem>
|
|
150
|
+
</Col>;
|
|
151
|
+
}).filter(Boolean);
|
|
152
|
+
return <Row gutter={[16, 0]} key={1}>{entryControls}</Row>;
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
// 处理表单组件使用公共组件or自定义组件
|
|
156
|
+
const handleFormItemType = (fields: FieldConfig[], layout?: "vertical" | "horizontal") => {
|
|
157
|
+
const customTypes = ["picture"]; // 自定义组件类型
|
|
158
|
+
const temArr = fields?.reduce((total, item) => {
|
|
159
|
+
const isCustom = customTypes.includes(item.extControlType || "");
|
|
160
|
+
const lastItem = total[total.length - 1];
|
|
161
|
+
if (lastItem && ((lastItem.type === "custom" && isCustom) || (lastItem.type === "default" && !isCustom))) {
|
|
162
|
+
lastItem.fields.push(item);
|
|
163
|
+
total[total.length - 1] = lastItem;
|
|
164
|
+
} else {
|
|
165
|
+
total.push({ type: isCustom ? "custom" : "default", fields: [item] });
|
|
166
|
+
}
|
|
167
|
+
return total;
|
|
168
|
+
}, []) || [];
|
|
169
|
+
return temArr.map(item => item.type === "default" ? <FormItemGroup layout={layout} fields={item.fields || undefined} valueMap={undefined} /> : customFormItem(item.fields, layout));
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
// FormItem渲染
|
|
173
|
+
const renderFormItem = (item: { [key: string]: any }) => {
|
|
174
|
+
if (item.groups) {
|
|
175
|
+
return item.groups.map(r => {
|
|
176
|
+
if (r?.isGroup) { // 表单分组显示
|
|
177
|
+
return <FormItem label={r.title} layout='vertical' style={{ marginBottom: "12px", paddingInline: "4px" }}>
|
|
178
|
+
{handleFormItemType(r.fields)}
|
|
179
|
+
</FormItem>;
|
|
180
|
+
}
|
|
181
|
+
return handleFormItemType(r.fields, "vertical");
|
|
182
|
+
});
|
|
183
|
+
}
|
|
184
|
+
return handleFormItemType(item.fields, "vertical");
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
// 当前表单配置
|
|
188
|
+
const currentFormConfig = useMemo(() => {
|
|
189
|
+
let temFormConfig: any = linkCurrent ? defFormConfig["linkSetting"] : defFormConfig["pageSetting"];
|
|
190
|
+
if (assetCurrent) {
|
|
191
|
+
const assetType = assetCurrent.getAttr("assetType");
|
|
192
|
+
const graphType = assetCurrent.getAttr("graphType");
|
|
193
|
+
const componentType = assetCurrent.getAttr("componentType"); // 组件类型-用于匹配表单等
|
|
194
|
+
temFormConfig = defFormConfig[assetType === "Text" ? "Text" : graphType];
|
|
195
|
+
if (!temFormConfig) { // 默认表单不存在配置则获取组件中的表单配置
|
|
196
|
+
const currentItem: any = ProgramConfig.get2DComponentByType(componentType);
|
|
197
|
+
const { config, dataSource, alterDataSources } = currentItem || {};
|
|
198
|
+
temFormConfig = JSON.parse(config || "[]");
|
|
199
|
+
if (dataSource || alterDataSources) { // 数据源配置
|
|
200
|
+
const temArr = [dataSource, ...(alterDataSources || [])].filter(Boolean).map(r => {
|
|
201
|
+
const [key, label] = r.split("@R@");
|
|
202
|
+
return { label, value: key };
|
|
203
|
+
});
|
|
204
|
+
const dataSourceSetting = { title: "数据", fields: [{ ...defDataSourceSetting, options: temArr, defValue: dataSource ? temArr[0]?.value : undefined }] };
|
|
205
|
+
temFormConfig = [dataSourceSetting, ...temFormConfig];
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
const configArr = temFormConfig.map(r => r.groups ? r.groups.map(i => i.fields) : r.fields).flat(Infinity);
|
|
210
|
+
setFormConfigs(configArr);
|
|
211
|
+
return temFormConfig;
|
|
212
|
+
}, [assetCurrent, linkCurrent]);
|
|
213
|
+
|
|
214
|
+
const fieldGroupList = () => {
|
|
215
|
+
const renderId = handleFormItemType(baseSetting, "vertical");
|
|
216
|
+
const items = currentFormConfig?.map((item, index) => ({
|
|
217
|
+
key: index,
|
|
218
|
+
label: item.title,
|
|
219
|
+
children: assetCurrent && item.title === "基本信息" ? [renderId, ...renderFormItem(item)] : renderFormItem(item)
|
|
220
|
+
}));
|
|
221
|
+
return <Collapse bordered={false} size="small" defaultActiveKey={[0, 1]} items={items} />;
|
|
222
|
+
};
|
|
223
|
+
|
|
224
|
+
// 更新数据
|
|
225
|
+
const onValuesChange = (val: { [key: string]: any }) => {
|
|
226
|
+
const temVal = val;
|
|
227
|
+
Object.keys(val).forEach((key) => { // 使用公共表单组件,转换指定类型值
|
|
228
|
+
const extControlType = formConfigs.find((item: any) => item.id === key)?.extControlType;
|
|
229
|
+
if (["yes-no-switch"].includes(extControlType)) { // 处理是否转换boolean值
|
|
230
|
+
temVal[key] = val[key] === "是" ? true : false;
|
|
231
|
+
return;
|
|
232
|
+
}
|
|
233
|
+
if (["float", "int"].includes(extControlType)) { // 处理数字类型转换
|
|
234
|
+
temVal[key] = Number(val[key] || 0);
|
|
235
|
+
return;
|
|
236
|
+
}
|
|
237
|
+
});
|
|
238
|
+
if (assetCurrent) { // 当前选中组件
|
|
239
|
+
onAssetSettingsChange({ ...assetSettings, ...temVal });
|
|
240
|
+
return;
|
|
241
|
+
}
|
|
242
|
+
if (linkCurrent) { // 当前选中连线
|
|
243
|
+
onLinkSettingsChange({ ...linkSettings, ...temVal });
|
|
244
|
+
return;
|
|
245
|
+
}
|
|
246
|
+
// 画布背景图片颜色-只能设置一个
|
|
247
|
+
let background = pageSettings.background;
|
|
248
|
+
let backgroundImg = pageSettings.backgroundImg;
|
|
249
|
+
if (val.background || val.backgroundImg) {
|
|
250
|
+
background = null;
|
|
251
|
+
backgroundImg = null;
|
|
252
|
+
}
|
|
253
|
+
form.setFieldsValue({ background, backgroundImg, ...temVal });
|
|
254
|
+
// 默认画布配置
|
|
255
|
+
onPageSettingsChange({ ...pageSettings, background, backgroundImg, ...temVal });
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
// 表单数据实时回显更新
|
|
259
|
+
const formSetFieldsValue = () => {
|
|
260
|
+
const nodeId = assetCurrent?.getAttr("id");
|
|
261
|
+
const temVal = _.cloneDeep(formData);
|
|
262
|
+
Object.keys(temVal).forEach((key) => { // 使用公共表单组件,转换指定类型值
|
|
263
|
+
const extControlType = formConfigs.find((item: any) => item.id === key)?.extControlType;
|
|
264
|
+
if (["yes-no-switch"].includes(extControlType)) { // 处理是否转换boolean值
|
|
265
|
+
temVal[key] = temVal[key] === true ? "是" : "否";
|
|
266
|
+
return;
|
|
267
|
+
}
|
|
268
|
+
});
|
|
269
|
+
const dataSourceConfig = formConfigs.find((item: any) => item.id === "dataSource");
|
|
270
|
+
if (dataSourceConfig) { // 数据源-无配置设置默认值
|
|
271
|
+
temVal["dataSource"] = temVal["dataSource"] || dataSourceConfig.defValue;
|
|
272
|
+
}
|
|
273
|
+
form.setFieldsValue({ ...temVal, id: nodeId });
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
// 表单数据实时回显更新
|
|
277
|
+
useEffect(() => {
|
|
278
|
+
if (formConfigs?.length && formData) {
|
|
279
|
+
formSetFieldsValue();
|
|
280
|
+
}
|
|
281
|
+
}, [formData, formConfigs]);
|
|
282
|
+
|
|
283
|
+
return <AntdForm
|
|
284
|
+
scrollToFirstError={true}
|
|
285
|
+
labelWrap={true}
|
|
286
|
+
size="small"
|
|
287
|
+
form={form}
|
|
288
|
+
onValuesChange={onValuesChange}
|
|
289
|
+
// onFinish={onValuesChange}
|
|
290
|
+
>
|
|
291
|
+
{fieldGroupList()}
|
|
292
|
+
</AntdForm>;
|
|
293
|
+
};
|
|
294
|
+
|
|
295
|
+
export default Index;
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
.draw {
|
|
2
|
+
width: 100%;
|
|
3
|
+
height: 100%;
|
|
4
|
+
|
|
5
|
+
.ant-spin,
|
|
6
|
+
.ant-spin-container {
|
|
7
|
+
width: 100%;
|
|
8
|
+
height: 100%;
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
.draw-main {
|
|
12
|
+
width: 100%;
|
|
13
|
+
height: 100%;
|
|
14
|
+
display: flex;
|
|
15
|
+
flex-direction: column;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
*:focus-visible {
|
|
19
|
+
outline: none;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
.draw-content {
|
|
23
|
+
display: flex;
|
|
24
|
+
flex-grow: 1;
|
|
25
|
+
|
|
26
|
+
.left {
|
|
27
|
+
overflow: auto;
|
|
28
|
+
border-right: 1px solid #ccc;
|
|
29
|
+
flex-shrink: 0;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
.center {
|
|
33
|
+
width: 0;
|
|
34
|
+
flex-grow: 1;
|
|
35
|
+
background-color: rgba(0, 0, 0, 0.05);
|
|
36
|
+
z-index: 1;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
.right {
|
|
40
|
+
width: 220px;
|
|
41
|
+
background-color: #f5f5f5;
|
|
42
|
+
border-left: 1px solid #ccc;
|
|
43
|
+
|
|
44
|
+
.ant-input-disabled .ant-input-suffix {
|
|
45
|
+
display: none;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
}
|
|
@@ -0,0 +1,197 @@
|
|
|
1
|
+
import React, { useEffect, useRef, useState, useCallback } from 'react';
|
|
2
|
+
import { gunzipSync, strFromU8 } from 'fflate';
|
|
3
|
+
import { Spin } from "antd";
|
|
4
|
+
import { hexToUint8Array } from 'uint8array-extras';
|
|
5
|
+
import HcserviceV3 from "../../tmpl/hcservice-v3";
|
|
6
|
+
import { Render } from './components/render';
|
|
7
|
+
import { GraphType, PageSettings, AssetSettings, LinkSettings } from './components/render/types';
|
|
8
|
+
import MainHeader from './components/main-header';
|
|
9
|
+
import AssetBar from './components/asset-bar';
|
|
10
|
+
import SettingForm from "./components/setting-form";
|
|
11
|
+
import type Konva from 'konva';
|
|
12
|
+
import './index.less';
|
|
13
|
+
|
|
14
|
+
interface Props {
|
|
15
|
+
recordCode: string
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
const Index = (props: Props) => {
|
|
19
|
+
const { recordCode } = props;
|
|
20
|
+
const boardRef = useRef<HTMLDivElement>(null); // 画布边框
|
|
21
|
+
const stageRef = useRef<HTMLDivElement>(null); // 画布
|
|
22
|
+
const renderRef = useRef<Render | null>(null); // 渲染器实例
|
|
23
|
+
const observerRef = useRef<ResizeObserver | null>(null); // 监听尺寸变化
|
|
24
|
+
const [graphType, setGraphType] = useState<GraphType>(); // 当前画图类型
|
|
25
|
+
const [pageSettings, setPageSettings] = useState<PageSettings>(); // 画布设置
|
|
26
|
+
const [assetSettings, setAssetSettings] = useState<AssetSettings>(); // 当前选中组件设置
|
|
27
|
+
const [linkSettings, setLinkSettings] = useState<LinkSettings>(); // 当前连线设置
|
|
28
|
+
const [assetCurrent, setAssetCurrent] = useState<Konva.Node>(); // 当前选中组件
|
|
29
|
+
const [linkCurrent, setLinkCurrent] = useState<Konva.Line>(); // 当前选中连线
|
|
30
|
+
const [texting, setTexting] = useState<boolean>(false); // 添加文本状态
|
|
31
|
+
const [showGrid, setShowGrid] = useState<boolean>(true); // 是否显示网格
|
|
32
|
+
const [showAttract, setShowAttract] = useState<boolean>(true); // 是否显示磁吸
|
|
33
|
+
const assetCurrentRef = useRef<Konva.Node>(null); // 当前选中组件Ref
|
|
34
|
+
const [loading, setLoading] = useState<boolean>(false);
|
|
35
|
+
|
|
36
|
+
// 获取视图数据
|
|
37
|
+
const getViewData = async () => {
|
|
38
|
+
setLoading(true);
|
|
39
|
+
const data = await HcserviceV3.getDiagram2DConfig(recordCode);
|
|
40
|
+
const content = data?.[0]?.content;
|
|
41
|
+
if (!content) {
|
|
42
|
+
setLoading(false);
|
|
43
|
+
return;
|
|
44
|
+
}
|
|
45
|
+
const temByteArray = hexToUint8Array(content.replace(/^0x/i, ""));
|
|
46
|
+
// 1. 将压缩的 ByteArray 解压回原始的 Uint8Array
|
|
47
|
+
const decompressedBuffer = gunzipSync(temByteArray);
|
|
48
|
+
// 2. 将 Uint8Array 转换回普通字符串
|
|
49
|
+
const originalData = strFromU8(decompressedBuffer);
|
|
50
|
+
setLoading(false);
|
|
51
|
+
// 重置画面数据
|
|
52
|
+
await renderRef.current.importExportTool.restore(originalData as string);
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
useEffect(() => {
|
|
56
|
+
if (recordCode) {
|
|
57
|
+
getViewData();
|
|
58
|
+
}
|
|
59
|
+
}, [recordCode]);
|
|
60
|
+
|
|
61
|
+
// 初始化渲染器
|
|
62
|
+
const initRender = useCallback((width: number, height: number) => {
|
|
63
|
+
if (renderRef.current || !stageRef.current) return;
|
|
64
|
+
const render = new Render(stageRef.current, {
|
|
65
|
+
width, height,
|
|
66
|
+
showBg: true, showRuler: true, showRefLine: true,
|
|
67
|
+
showPreview: false, showContextmenu: true,
|
|
68
|
+
attractResize: true, attractBg: true, attractNode: true,
|
|
69
|
+
});
|
|
70
|
+
renderRef.current = render;
|
|
71
|
+
// 初始化设置
|
|
72
|
+
setPageSettings(render.getPageSettings());
|
|
73
|
+
// 事件绑定
|
|
74
|
+
render.on('page-settings-change', setPageSettings); // 监听画布配置变化
|
|
75
|
+
render.on('selection-change', (nodes: Konva.Node[]) => { // 监听选中组件
|
|
76
|
+
assetCurrentRef.current = nodes.length === 1 ? nodes[0] : undefined;
|
|
77
|
+
setAssetCurrent(assetCurrentRef.current);
|
|
78
|
+
setAssetSettings(nodes.length === 1 ? render.getAssetSettings(nodes[0]) : undefined);
|
|
79
|
+
});
|
|
80
|
+
render.on('link-selection-change', (link?: Konva.Line) => { // 监听选中连线
|
|
81
|
+
setLinkCurrent(link);
|
|
82
|
+
setLinkSettings(link ? render.getLinkSettings(link) : undefined);
|
|
83
|
+
});
|
|
84
|
+
render.on('asset-position-change', (nodes: Konva.Node[]) => { // 监听组件位置变化
|
|
85
|
+
const node = nodes.find(n => n.id() === assetCurrentRef.current?.id());
|
|
86
|
+
if (node) {
|
|
87
|
+
const position = node.position();
|
|
88
|
+
setAssetSettings(s => s ? { ...s, x: +position.x.toFixed(1), y: +position.y.toFixed(1) } : undefined);
|
|
89
|
+
}
|
|
90
|
+
});
|
|
91
|
+
render.on('asset-rotation-change', (nodes: Konva.Node[]) => { // 监听组件旋转
|
|
92
|
+
const node = nodes.find(n => n.id() === assetCurrentRef.current?.id());
|
|
93
|
+
if (node) {
|
|
94
|
+
const rotation = node.rotation();
|
|
95
|
+
setAssetSettings(s => s ? { ...s, rotation: +rotation.toFixed(1) } : undefined);
|
|
96
|
+
}
|
|
97
|
+
});
|
|
98
|
+
render.on('texting-change', setTexting); // 监听插入文本状态
|
|
99
|
+
render.on('graph-type-change', setGraphType); // 监听插入基础图形类型
|
|
100
|
+
}, []);
|
|
101
|
+
|
|
102
|
+
// 监听尺寸变化
|
|
103
|
+
useEffect(() => {
|
|
104
|
+
if (!boardRef.current) return;
|
|
105
|
+
const observer = new ResizeObserver(() => {
|
|
106
|
+
const { width, height } = boardRef.current.getBoundingClientRect();
|
|
107
|
+
if (renderRef.current) {
|
|
108
|
+
renderRef.current.resize(width, height);
|
|
109
|
+
} else {
|
|
110
|
+
initRender(width, height);
|
|
111
|
+
}
|
|
112
|
+
})
|
|
113
|
+
observer.observe(boardRef.current);
|
|
114
|
+
observerRef.current = observer;
|
|
115
|
+
return () => observer.disconnect();
|
|
116
|
+
}, [])
|
|
117
|
+
|
|
118
|
+
// 更新画布配置
|
|
119
|
+
const handlePageSetting = (val: { [key: string]: any }) => {
|
|
120
|
+
if (!(renderRef.current)) {
|
|
121
|
+
return;
|
|
122
|
+
}
|
|
123
|
+
renderRef.current.setPageSettings({ ...pageSettings, ...val }, true);
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
// 更新组件配置
|
|
127
|
+
const handleAssetSettings = (val: { [key: string]: any }) => {
|
|
128
|
+
if (!(assetCurrent && renderRef.current)) {
|
|
129
|
+
return;
|
|
130
|
+
}
|
|
131
|
+
setAssetSettings({ ...assetSettings, ...val });
|
|
132
|
+
renderRef.current.setAssetSettings(assetCurrent, { ...assetSettings, ...val }, true);
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
// 更新连线配置
|
|
136
|
+
const handleLinkSettings = (val: { [key: string]: any }) => {
|
|
137
|
+
if (!(linkCurrent && renderRef.current)) {
|
|
138
|
+
return;
|
|
139
|
+
}
|
|
140
|
+
setLinkSettings({ ...linkSettings, ...val });
|
|
141
|
+
renderRef.current.setLinkSettings(linkCurrent, { ...linkSettings, ...val }, true);
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
// 更改磁吸显示
|
|
145
|
+
const handleShowAttract = (val: boolean) => {
|
|
146
|
+
setShowAttract(val);
|
|
147
|
+
renderRef.current.changeShowAttract(val);
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
// 更改网格显示
|
|
151
|
+
const handleShowGrid = (val: boolean) => {
|
|
152
|
+
setShowGrid(val);
|
|
153
|
+
renderRef.current.changeShowGrid(val);
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
return (
|
|
157
|
+
<div className="draw">
|
|
158
|
+
<Spin spinning={loading}>
|
|
159
|
+
<div className='draw-main'>
|
|
160
|
+
<MainHeader
|
|
161
|
+
render={renderRef.current}
|
|
162
|
+
graphType={graphType}
|
|
163
|
+
texting={texting}
|
|
164
|
+
onGraphTypeChange={(val) => renderRef.current.changeGraphType(val)}
|
|
165
|
+
onTexting={() => renderRef.current.changeTexting(true)}
|
|
166
|
+
recordCode={recordCode}
|
|
167
|
+
setShowGrid={handleShowGrid}
|
|
168
|
+
showGrid={showGrid}
|
|
169
|
+
setShowAttract={handleShowAttract}
|
|
170
|
+
showAttract={showAttract}
|
|
171
|
+
/>
|
|
172
|
+
<div className='draw-content'>
|
|
173
|
+
<div className='left'><AssetBar /></div>
|
|
174
|
+
<div className='center' ref={boardRef} >
|
|
175
|
+
<div ref={stageRef} />
|
|
176
|
+
</div>
|
|
177
|
+
<div className='right'>
|
|
178
|
+
<SettingForm
|
|
179
|
+
pageSettings={pageSettings}
|
|
180
|
+
onPageSettingsChange={handlePageSetting}
|
|
181
|
+
assetCurrent={assetCurrent}
|
|
182
|
+
assetSettings={assetSettings}
|
|
183
|
+
onAssetSettingsChange={handleAssetSettings}
|
|
184
|
+
linkCurrent={linkCurrent}
|
|
185
|
+
linkSettings={linkSettings}
|
|
186
|
+
onLinkSettingsChange={handleLinkSettings}
|
|
187
|
+
recordCode={recordCode}
|
|
188
|
+
/>
|
|
189
|
+
</div>
|
|
190
|
+
</div>
|
|
191
|
+
</div>
|
|
192
|
+
</Spin>
|
|
193
|
+
</div>
|
|
194
|
+
)
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
export default Index;
|