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.
Files changed (203) hide show
  1. package/lib/controls/action/utils.d.ts +1 -1
  2. package/lib/controls/entity-select/entity-select.d.ts +2 -2
  3. package/lib/controls/entity-select/entity-select.d.ts.map +1 -1
  4. package/lib/controls/entity-select/entity-select.js +16 -7
  5. package/lib/controls/entity-select/entity-select.js.map +1 -1
  6. package/lib/controls/entry-control.d.ts.map +1 -1
  7. package/lib/controls/entry-control.js +3 -2
  8. package/lib/controls/entry-control.js.map +1 -1
  9. package/lib/controls/icon-selector/icon/phonenode-menu-icon/iconfont.css +47 -3
  10. package/lib/controls/icon-selector/icon/phonenode-menu-icon/iconfont.js +12 -12
  11. package/lib/controls/icon-selector/icon/phonenode-menu-icon/iconfont.js.map +1 -1
  12. package/lib/controls/icon-selector/icon/phonenode-menu-icon/iconfont.json +77 -0
  13. package/lib/controls/icon-selector/icon/phonenode-menu-icon/iconfont.ttf +0 -0
  14. package/lib/controls/icon-selector/icon/phonenode-menu-icon/iconfont.woff +0 -0
  15. package/lib/controls/icon-selector/icon/phonenode-menu-icon/iconfont.woff2 +0 -0
  16. package/lib/controls/select/index.d.ts.map +1 -1
  17. package/lib/controls/select/index.js +13 -7
  18. package/lib/controls/select/index.js.map +1 -1
  19. package/lib/controls/text/index.less +1 -0
  20. package/lib/controls/view-control.d.ts.map +1 -1
  21. package/lib/controls/view-control.js +1 -0
  22. package/lib/controls/view-control.js.map +1 -1
  23. package/lib/detail/button/edit-button.d.ts.map +1 -1
  24. package/lib/detail/button/edit-button.js +23 -11
  25. package/lib/detail/button/edit-button.js.map +1 -1
  26. package/lib/detail/button/view-button.d.ts.map +1 -1
  27. package/lib/detail/button/view-button.js +21 -10
  28. package/lib/detail/button/view-button.js.map +1 -1
  29. package/lib/draw-canvas/edit/components/asset-bar/index.d.ts +5 -0
  30. package/lib/draw-canvas/edit/components/asset-bar/index.d.ts.map +1 -0
  31. package/lib/draw-canvas/edit/components/asset-bar/index.js +79 -0
  32. package/lib/draw-canvas/edit/components/asset-bar/index.js.map +1 -0
  33. package/lib/draw-canvas/edit/components/asset-bar/index.less +36 -0
  34. package/lib/draw-canvas/edit/components/main-header/index.d.ts +19 -0
  35. package/lib/draw-canvas/edit/components/main-header/index.d.ts.map +1 -0
  36. package/lib/draw-canvas/edit/components/main-header/index.js +203 -0
  37. package/lib/draw-canvas/edit/components/main-header/index.js.map +1 -0
  38. package/lib/draw-canvas/edit/components/main-header/index.less +21 -0
  39. package/lib/draw-canvas/edit/components/render/index.d.ts +90 -0
  40. package/lib/draw-canvas/edit/components/render/index.d.ts.map +1 -0
  41. package/lib/draw-canvas/edit/components/render/index.js +692 -0
  42. package/lib/draw-canvas/edit/components/render/index.js.map +1 -0
  43. package/lib/draw-canvas/edit/components/render/types.d.ts +247 -0
  44. package/lib/draw-canvas/edit/components/render/types.d.ts.map +1 -0
  45. package/lib/draw-canvas/edit/components/render/types.js +66 -0
  46. package/lib/draw-canvas/edit/components/render/types.js.map +1 -0
  47. package/lib/draw-canvas/edit/components/setting-form/imag-upload.d.ts +26 -0
  48. package/lib/draw-canvas/edit/components/setting-form/imag-upload.d.ts.map +1 -0
  49. package/lib/draw-canvas/edit/components/setting-form/imag-upload.js +83 -0
  50. package/lib/draw-canvas/edit/components/setting-form/imag-upload.js.map +1 -0
  51. package/lib/draw-canvas/edit/components/setting-form/index.d.ts +17 -0
  52. package/lib/draw-canvas/edit/components/setting-form/index.d.ts.map +1 -0
  53. package/lib/draw-canvas/edit/components/setting-form/index.js +243 -0
  54. package/lib/draw-canvas/edit/components/setting-form/index.js.map +1 -0
  55. package/lib/draw-canvas/edit/constant.d.ts +7 -0
  56. package/lib/draw-canvas/edit/constant.d.ts.map +1 -0
  57. package/lib/draw-canvas/edit/constant.js +7 -0
  58. package/lib/draw-canvas/edit/constant.js.map +1 -0
  59. package/lib/draw-canvas/edit/index.d.ts +8 -0
  60. package/lib/draw-canvas/edit/index.d.ts.map +1 -0
  61. package/lib/draw-canvas/edit/index.js +165 -0
  62. package/lib/draw-canvas/edit/index.js.map +1 -0
  63. package/lib/draw-canvas/edit/index.less +49 -0
  64. package/lib/draw-canvas/view/index.d.ts +8 -0
  65. package/lib/draw-canvas/view/index.d.ts.map +1 -0
  66. package/lib/draw-canvas/view/index.js +50 -0
  67. package/lib/draw-canvas/view/index.js.map +1 -0
  68. package/lib/draw-canvas/view/index.less +60 -0
  69. package/lib/draw-canvas/view/view.d.ts +10 -0
  70. package/lib/draw-canvas/view/view.d.ts.map +1 -0
  71. package/lib/draw-canvas/view/view.js +104 -0
  72. package/lib/draw-canvas/view/view.js.map +1 -0
  73. package/lib/form/form-Item-group.d.ts.map +1 -1
  74. package/lib/form/form-Item-group.js +4 -4
  75. package/lib/form/form-Item-group.js.map +1 -1
  76. package/lib/icon/local-aliIcon/iconfont.js +5 -5
  77. package/lib/icon/local-aliIcon/iconfont.js.map +1 -1
  78. package/lib/lowcode-components/index.d.ts +2 -0
  79. package/lib/lowcode-components/index.d.ts.map +1 -1
  80. package/lib/lowcode-components/index.js +2 -1
  81. package/lib/lowcode-components/index.js.map +1 -1
  82. package/lib/lowcode-components/lowcode-view/component/assets.d.ts.map +1 -1
  83. package/lib/lowcode-components/lowcode-view/component/assets.js +8 -0
  84. package/lib/lowcode-components/lowcode-view/component/assets.js.map +1 -1
  85. package/lib/lowcode-components/radar-chart/index.d.ts +51 -0
  86. package/lib/lowcode-components/radar-chart/index.d.ts.map +1 -0
  87. package/lib/lowcode-components/radar-chart/index.js +276 -0
  88. package/lib/lowcode-components/radar-chart/index.js.map +1 -0
  89. package/lib/module/dtmpl-edit-card.d.ts.map +1 -1
  90. package/lib/module/dtmpl-edit-card.js +18 -1
  91. package/lib/module/dtmpl-edit-card.js.map +1 -1
  92. package/lib/module/dtmpl-edit-page.d.ts.map +1 -1
  93. package/lib/module/dtmpl-edit-page.js +19 -2
  94. package/lib/module/dtmpl-edit-page.js.map +1 -1
  95. package/lib/routable/ltmpl-route.d.ts +2 -0
  96. package/lib/routable/ltmpl-route.d.ts.map +1 -1
  97. package/lib/routable/ltmpl-route.js +20 -4
  98. package/lib/routable/ltmpl-route.js.map +1 -1
  99. package/lib/table/act-table.d.ts +2 -0
  100. package/lib/table/act-table.d.ts.map +1 -1
  101. package/lib/table/act-table.js +4 -4
  102. package/lib/table/act-table.js.map +1 -1
  103. package/lib/table/column/column-builder.d.ts.map +1 -1
  104. package/lib/table/column/column-builder.js +23 -8
  105. package/lib/table/column/column-builder.js.map +1 -1
  106. package/lib/table/relation-table.d.ts +7 -0
  107. package/lib/table/relation-table.d.ts.map +1 -1
  108. package/lib/tmpl/control-type-supportor.d.ts.map +1 -1
  109. package/lib/tmpl/control-type-supportor.js +1 -0
  110. package/lib/tmpl/control-type-supportor.js.map +1 -1
  111. package/lib/tmpl/hcservice-v3.d.ts +3 -0
  112. package/lib/tmpl/hcservice-v3.d.ts.map +1 -1
  113. package/lib/tmpl/hcservice-v3.js +61 -0
  114. package/lib/tmpl/hcservice-v3.js.map +1 -1
  115. package/lib/tmpl/interface.d.ts +17 -1
  116. package/lib/tmpl/interface.d.ts.map +1 -1
  117. package/lib/tmpl/interface.js.map +1 -1
  118. package/lib/tmpl/tmpl-config-analysis.js +1 -1
  119. package/lib/tmpl/tmpl-config-analysis.js.map +1 -1
  120. package/lib/units/index.d.ts +3 -1
  121. package/lib/units/index.d.ts.map +1 -1
  122. package/lib/units/index.js +33 -3
  123. package/lib/units/index.js.map +1 -1
  124. package/package.json +4 -1
  125. package/src/aldehyde/controls/entity-select/entity-select.tsx +18 -8
  126. package/src/aldehyde/controls/entry-control.tsx +3 -2
  127. package/src/aldehyde/controls/icon-selector/icon/phonenode-menu-icon/iconfont.css +47 -3
  128. package/src/aldehyde/controls/icon-selector/icon/phonenode-menu-icon/iconfont.js +1 -1
  129. package/src/aldehyde/controls/icon-selector/icon/phonenode-menu-icon/iconfont.json +77 -0
  130. package/src/aldehyde/controls/icon-selector/icon/phonenode-menu-icon/iconfont.ttf +0 -0
  131. package/src/aldehyde/controls/icon-selector/icon/phonenode-menu-icon/iconfont.woff +0 -0
  132. package/src/aldehyde/controls/icon-selector/icon/phonenode-menu-icon/iconfont.woff2 +0 -0
  133. package/src/aldehyde/controls/select/index.tsx +7 -6
  134. package/src/aldehyde/controls/text/index.less +1 -0
  135. package/src/aldehyde/controls/view-control.tsx +1 -0
  136. package/src/aldehyde/detail/button/edit-button.tsx +21 -22
  137. package/src/aldehyde/detail/button/view-button.tsx +23 -21
  138. package/src/aldehyde/draw-canvas/edit/components/asset-bar/index.less +36 -0
  139. package/src/aldehyde/draw-canvas/edit/components/asset-bar/index.tsx +95 -0
  140. package/src/aldehyde/draw-canvas/edit/components/main-header/index.less +21 -0
  141. package/src/aldehyde/draw-canvas/edit/components/main-header/index.tsx +233 -0
  142. package/src/aldehyde/draw-canvas/edit/components/render/draws/bg-draw.ts +163 -0
  143. package/src/aldehyde/draw-canvas/edit/components/render/draws/contextmenu-draw.ts +307 -0
  144. package/src/aldehyde/draw-canvas/edit/components/render/draws/graph-draw.ts +251 -0
  145. package/src/aldehyde/draw-canvas/edit/components/render/draws/index.ts +7 -0
  146. package/src/aldehyde/draw-canvas/edit/components/render/draws/link-draw.ts +1416 -0
  147. package/src/aldehyde/draw-canvas/edit/components/render/draws/preview-draw.ts +275 -0
  148. package/src/aldehyde/draw-canvas/edit/components/render/draws/ref-line-draw.ts +72 -0
  149. package/src/aldehyde/draw-canvas/edit/components/render/draws/ruler-draw.ts +167 -0
  150. package/src/aldehyde/draw-canvas/edit/components/render/graphs/base-graph.ts +241 -0
  151. package/src/aldehyde/draw-canvas/edit/components/render/graphs/bezier.ts +542 -0
  152. package/src/aldehyde/draw-canvas/edit/components/render/graphs/circle.ts +700 -0
  153. package/src/aldehyde/draw-canvas/edit/components/render/graphs/curve.ts +501 -0
  154. package/src/aldehyde/draw-canvas/edit/components/render/graphs/index.ts +6 -0
  155. package/src/aldehyde/draw-canvas/edit/components/render/graphs/line.ts +494 -0
  156. package/src/aldehyde/draw-canvas/edit/components/render/graphs/rect.ts +681 -0
  157. package/src/aldehyde/draw-canvas/edit/components/render/handlers/drag-handlers.ts +69 -0
  158. package/src/aldehyde/draw-canvas/edit/components/render/handlers/drag-outside-handlers.ts +159 -0
  159. package/src/aldehyde/draw-canvas/edit/components/render/handlers/graph-handlers.ts +108 -0
  160. package/src/aldehyde/draw-canvas/edit/components/render/handlers/index.ts +9 -0
  161. package/src/aldehyde/draw-canvas/edit/components/render/handlers/key-move-handlers.ts +50 -0
  162. package/src/aldehyde/draw-canvas/edit/components/render/handlers/link-handlers.ts +46 -0
  163. package/src/aldehyde/draw-canvas/edit/components/render/handlers/selection-handlers.ts +393 -0
  164. package/src/aldehyde/draw-canvas/edit/components/render/handlers/shutcut-handlers.ts +46 -0
  165. package/src/aldehyde/draw-canvas/edit/components/render/handlers/text-handlers.ts +82 -0
  166. package/src/aldehyde/draw-canvas/edit/components/render/handlers/zoom-handlers.ts +60 -0
  167. package/src/aldehyde/draw-canvas/edit/components/render/index.ts +776 -0
  168. package/src/aldehyde/draw-canvas/edit/components/render/tools/align-tool.ts +91 -0
  169. package/src/aldehyde/draw-canvas/edit/components/render/tools/asset-tool.ts +142 -0
  170. package/src/aldehyde/draw-canvas/edit/components/render/tools/attract-tool.ts +440 -0
  171. package/src/aldehyde/draw-canvas/edit/components/render/tools/copy-tool.ts +269 -0
  172. package/src/aldehyde/draw-canvas/edit/components/render/tools/import-export-tool.ts +603 -0
  173. package/src/aldehyde/draw-canvas/edit/components/render/tools/index.ts +9 -0
  174. package/src/aldehyde/draw-canvas/edit/components/render/tools/link-tool.ts +225 -0
  175. package/src/aldehyde/draw-canvas/edit/components/render/tools/position-tool.ts +194 -0
  176. package/src/aldehyde/draw-canvas/edit/components/render/tools/selection-tool.ts +132 -0
  177. package/src/aldehyde/draw-canvas/edit/components/render/tools/z-index-tool.ts +227 -0
  178. package/src/aldehyde/draw-canvas/edit/components/render/types.ts +291 -0
  179. package/src/aldehyde/draw-canvas/edit/components/render/utils/a-star.ts +116 -0
  180. package/src/aldehyde/draw-canvas/edit/components/render/utils/bezier-scene-func.ts +73 -0
  181. package/src/aldehyde/draw-canvas/edit/components/setting-form/imag-upload.tsx +118 -0
  182. package/src/aldehyde/draw-canvas/edit/components/setting-form/index.tsx +295 -0
  183. package/src/aldehyde/draw-canvas/edit/constant.ts +6 -0
  184. package/src/aldehyde/draw-canvas/edit/index.less +49 -0
  185. package/src/aldehyde/draw-canvas/edit/index.tsx +197 -0
  186. package/src/aldehyde/draw-canvas/view/index.less +60 -0
  187. package/src/aldehyde/draw-canvas/view/index.tsx +48 -0
  188. package/src/aldehyde/draw-canvas/view/view.tsx +114 -0
  189. package/src/aldehyde/form/form-Item-group.tsx +5 -5
  190. package/src/aldehyde/icon/local-aliIcon/iconfont.js +1 -1
  191. package/src/aldehyde/lowcode-components/index.ts +4 -2
  192. package/src/aldehyde/lowcode-components/lowcode-view/component/assets.ts +8 -0
  193. package/src/aldehyde/lowcode-components/radar-chart/index.tsx +323 -0
  194. package/src/aldehyde/module/dtmpl-edit-card.tsx +18 -1
  195. package/src/aldehyde/module/dtmpl-edit-page.tsx +19 -2
  196. package/src/aldehyde/routable/ltmpl-route.tsx +39 -3
  197. package/src/aldehyde/table/act-table.tsx +7 -4
  198. package/src/aldehyde/table/column/column-builder.tsx +29 -9
  199. package/src/aldehyde/tmpl/control-type-supportor.tsx +1 -0
  200. package/src/aldehyde/tmpl/hcservice-v3.tsx +44 -0
  201. package/src/aldehyde/tmpl/interface.tsx +15 -1
  202. package/src/aldehyde/tmpl/tmpl-config-analysis.tsx +1 -1
  203. 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,6 @@
1
+ export const fileUpload = {
2
+ name: '文件模型上传',
3
+ sourceId: '505356896556589056',
4
+ serverKey: "localDevopsServer",
5
+ type: 'dtmpl',
6
+ };
@@ -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;