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
@@ -4,4 +4,5 @@
4
4
  text-overflow: ellipsis;
5
5
  width: fit-content;
6
6
  max-width: 100%;
7
+ min-width: 100%;
7
8
  }
@@ -147,6 +147,7 @@ function renderControl(
147
147
  case "textarea":
148
148
  case "text-view":
149
149
  case "preselect":
150
+ case "scan-code":
150
151
  if (holderType == "table") {
151
152
  viewControl = (
152
153
  <EllipsisText
@@ -1,5 +1,5 @@
1
1
  import React from "react";
2
- import { Button } from "antd";
2
+ import { Button, Tooltip } from "antd";
3
3
  import { DoEditParam, DtmplData, LtmplConfig } from "../../tmpl/interface";
4
4
  import { EditOutlined } from "@ant-design/icons";
5
5
  import ActionUtils from "../../controls/action/utils";
@@ -13,26 +13,23 @@ interface EditButtonProps {
13
13
 
14
14
  const EditButton: React.FC<EditButtonProps> = (props) => {
15
15
  const { doEdit, data, ltmplConfig } = props;
16
+ const { classEditConfigs, buttonEditAction, editBtnTitle } = ltmplConfig || {};
16
17
  let button = undefined;
17
- if (ltmplConfig.classEditConfigs) {
18
- ltmplConfig.classEditConfigs.forEach((classEditConfig) => {
18
+ if (classEditConfigs) {
19
+ classEditConfigs.forEach((classEditConfig) => {
19
20
  if (
20
21
  !button &&
21
22
  ActionUtils.isShow(classEditConfig.preposes, [data], undefined)
22
23
  ) {
24
+ const btnProps: any = {
25
+ size: "small",
26
+ type: "dashed",
27
+ onClick: () => doEdit({ code: data.code, mode: "update", dtmplSourceId: classEditConfig.id })
28
+ };
23
29
  button = (
24
- <Button
25
- size="small"
26
- type="dashed"
27
- icon={<EditOutlined />}
28
- onClick={() =>
29
- doEdit({
30
- code: data.code,
31
- mode: "update",
32
- dtmplSourceId: classEditConfig.id,
33
- })
34
- }
35
- ></Button>
30
+ (!editBtnTitle || editBtnTitle?.length < 4) ?
31
+ <Button {...btnProps}>{editBtnTitle || <EditOutlined />}</Button> :
32
+ <Tooltip title={editBtnTitle}><Button {...btnProps} icon={<EditOutlined />} /></Tooltip>
36
33
  );
37
34
  }
38
35
  });
@@ -42,18 +39,20 @@ const EditButton: React.FC<EditButtonProps> = (props) => {
42
39
  if (
43
40
  !button &&
44
41
  ActionUtils.isShow(
45
- ltmplConfig.buttonEditAction?.preposes,
42
+ buttonEditAction?.preposes,
46
43
  [data],
47
44
  undefined
48
45
  )
49
46
  ) {
47
+ const btnProps: any = {
48
+ size: "small",
49
+ type: "dashed",
50
+ onClick: () => doEdit({ code: data.code, mode: "update" })
51
+ };
50
52
  button = (
51
- <Button
52
- size="small"
53
- type="dashed"
54
- icon={<EditOutlined />}
55
- onClick={() => doEdit({ code: data.code, mode: "update" })}
56
- ></Button>
53
+ (!editBtnTitle || editBtnTitle?.length < 4) ?
54
+ <Button {...btnProps}>{editBtnTitle || <EditOutlined />}</Button> :
55
+ <Tooltip title={editBtnTitle}><Button {...btnProps} icon={<EditOutlined />} /></Tooltip>
57
56
  );
58
57
  }
59
58
 
@@ -1,5 +1,5 @@
1
1
  import React from "react";
2
- import { Button } from "antd";
2
+ import { Button, Tooltip } from "antd";
3
3
  import { DtmplData, LtmplConfig, ShowViewParam } from "../../tmpl/interface";
4
4
  import { AlignCenterOutlined } from "@ant-design/icons";
5
5
  import ActionUtils from "../../controls/action/utils";
@@ -14,25 +14,24 @@ interface ViewButtonProps {
14
14
 
15
15
  const ViewButton: React.FC<ViewButtonProps> = (props) => {
16
16
  const { showView, data, ltmplConfig, buttonType = "primary" } = props;
17
+ const { classViewConfigs, detailBtnTitle, buttonViewAction } = ltmplConfig || {};
17
18
  let button = undefined;
18
- if (ltmplConfig.classViewConfigs) {
19
- ltmplConfig.classViewConfigs.forEach((classViewConfig) => {
19
+ if (classViewConfigs) {
20
+ classViewConfigs.forEach((classViewConfig) => {
20
21
  if (
21
22
  !button &&
22
23
  ActionUtils.isShow(classViewConfig.preposes, [data], undefined)
23
24
  ) {
25
+ const btnProps: any = {
26
+ size: "small",
27
+ type: buttonType,
28
+ onClick: () => showView({ code: data.code, dtmplSourceId: classViewConfig.id, })
29
+ };
24
30
  button = (
25
- <Button
26
- size="small"
27
- type={buttonType}
28
- icon={<AlignCenterOutlined />}
29
- onClick={() =>
30
- showView({
31
- code: data.code,
32
- dtmplSourceId: classViewConfig.id,
33
- })
34
- }
35
- ></Button>
31
+ (!detailBtnTitle || detailBtnTitle?.length < 4) ?
32
+ <Button {...btnProps} >
33
+ {detailBtnTitle || <AlignCenterOutlined />}
34
+ </Button> : <Tooltip title={detailBtnTitle}><Button {...btnProps} icon={<AlignCenterOutlined />} /></Tooltip>
36
35
  );
37
36
  }
38
37
  });
@@ -42,18 +41,21 @@ const ViewButton: React.FC<ViewButtonProps> = (props) => {
42
41
  if (
43
42
  !button &&
44
43
  ActionUtils.isShow(
45
- ltmplConfig.buttonViewAction?.preposes,
44
+ buttonViewAction?.preposes,
46
45
  [data],
47
46
  undefined
48
47
  )
49
48
  ) {
49
+ const btnProps: any = {
50
+ size: "small",
51
+ type: buttonType,
52
+ onClick: () => showView({ code: data.code })
53
+ };
50
54
  button = (
51
- <Button
52
- size="small"
53
- type={buttonType}
54
- icon={<AlignCenterOutlined />}
55
- onClick={() => showView({ code: data.code })}
56
- ></Button>
55
+ (!detailBtnTitle || detailBtnTitle?.length < 4) ?
56
+ <Button {...btnProps}>
57
+ {detailBtnTitle || <AlignCenterOutlined />}
58
+ </Button> : <Tooltip title={detailBtnTitle}><Button {...btnProps} icon={<AlignCenterOutlined />} /></Tooltip>
57
59
  );
58
60
  }
59
61
 
@@ -0,0 +1,36 @@
1
+ .asset-bar {
2
+ background-color: #f5f5f5;
3
+ width: 200px;
4
+ min-height: 100%;
5
+
6
+ .asset-list {
7
+ display: flex;
8
+ flex-wrap: wrap;
9
+ padding: 4px;
10
+ margin: 0;
11
+ list-style: none;
12
+
13
+ &>li {
14
+ width: 20%;
15
+ padding-top: 20%;
16
+ flex-shrink: 0;
17
+ cursor: move;
18
+ position: relative;
19
+ border-radius: 4px;
20
+
21
+ &:hover {
22
+ background-color: #ddd;
23
+ }
24
+
25
+ &>img {
26
+ position: absolute;
27
+ top: 6px;
28
+ left: 6px;
29
+ object-fit: contain;
30
+ width: calc(100% - 12px);
31
+ height: calc(100% - 12px);
32
+ pointer-events: none;
33
+ }
34
+ }
35
+ }
36
+ }
@@ -0,0 +1,95 @@
1
+ import React, { DragEvent, useEffect, useMemo, useState } from 'react';
2
+ import { Collapse, Empty, Tooltip } from "antd";
3
+ import { ProgramConfig } from "../../../../index";
4
+ import './index.less';
5
+
6
+ // 组件分组配置
7
+ const assetGroups = [
8
+ { key: 'SVG', label: '矢量图' },
9
+ { key: 'picture', label: '图片' },
10
+ { key: 'gif', label: 'GIF' },
11
+ // { key: 'composite', label: '图形组合 (JSON)' },
12
+ { key: 'other', label: '其他' }
13
+ ];
14
+
15
+ const handleImgUrl = (val: string) => {
16
+ let src = val;
17
+ if (src.startsWith("http")) {
18
+ return src;
19
+ }
20
+ if (src.includes("@R@")) {
21
+ const text = src.split("@R@")[1];
22
+ if (text.startsWith("http")) {
23
+ return text;
24
+ }
25
+ src = text;
26
+ }
27
+ const url = encodeURI(ProgramConfig.joinPath(
28
+ ProgramConfig.joinPath(ProgramConfig.api(), "/v3/files"),
29
+ src
30
+ )) +
31
+ `?@token=${ProgramConfig.hydrocarbonToken()}&@programToken=${ProgramConfig.programCode()}`;
32
+ return url;
33
+ }
34
+
35
+
36
+ interface AssetItem {
37
+ body: {
38
+ path: string;
39
+ suffix: string;
40
+ };
41
+ type: string; // 组件类型
42
+ }
43
+
44
+ const AssetList = () => {
45
+ const [activeKey, setActiveKey] = useState<string[]>(["SVG"]);
46
+ const [component2D, setComponent2D] = useState<any>({});
47
+
48
+ // 拖拽
49
+ const handleDragStart = (e: DragEvent, item: AssetItem) => {
50
+ if (!item?.body) {
51
+ return;
52
+ }
53
+ const url = handleImgUrl(item.body.path);
54
+ e.dataTransfer.setData('src', url);
55
+ e.dataTransfer.setData('type', item.body.suffix);
56
+ e.dataTransfer.setData('componentType', item.type); // 组件类型
57
+ // e.dataTransfer.setData('points', '[]');
58
+ };
59
+
60
+ const get2DComponent = async () => {
61
+ if (!activeKey?.length) {
62
+ return;
63
+ }
64
+ const res = await ProgramConfig.get2DComponent(activeKey);
65
+ setComponent2D(res);
66
+ }
67
+
68
+ useEffect(() => {
69
+ get2DComponent();
70
+ }, [activeKey])
71
+
72
+ // 组件渲染
73
+ const assetNodes = useMemo(() => {
74
+ const temArr = assetGroups?.map(r => ({
75
+ ...r,
76
+ children: component2D[r.key]?.length ? <ul className="asset-list">
77
+ {component2D[r.key].map((item, idx) => {
78
+ const temDom = <li key={idx} draggable onDragStart={(e) => handleDragStart(e, item)}>
79
+ <img src={handleImgUrl(item?.body?.path)} alt="" />
80
+ </li>;
81
+ return item.title ? <Tooltip title={item.title}>{temDom}</Tooltip> : temDom;
82
+ })}
83
+ </ul> : <Empty image={Empty.PRESENTED_IMAGE_SIMPLE} style={{ margin: 0 }} />
84
+ }));
85
+ return temArr || [];
86
+ }, [component2D]);
87
+
88
+ return (
89
+ <div className="asset-bar">
90
+ <Collapse size="small" onChange={setActiveKey} bordered={false} items={assetNodes} activeKey={activeKey} />
91
+ </div>
92
+ )
93
+ };
94
+
95
+ export default AssetList;
@@ -0,0 +1,21 @@
1
+ .main-header {
2
+ padding: 4px 8px;
3
+ display: flex;
4
+ justify-content: space-between;
5
+ align-items: center;
6
+ background: var(--ant-layout-body-bg);
7
+
8
+ button {
9
+ padding: 4px 8px;
10
+ font-size: 16px;
11
+ display: flex;
12
+ align-items: center;
13
+ justify-content: center;
14
+
15
+ &.active {
16
+ background-color: var(--ant-color-primary);
17
+ color: #fff;
18
+ }
19
+
20
+ }
21
+ }
@@ -0,0 +1,233 @@
1
+ import React, { useState, useEffect, useCallback, useMemo } from 'react';
2
+ import { Dropdown, Modal, Space, Button, Divider, Tooltip } from 'antd';
3
+ import { ImportOutlined, ExportOutlined, SaveOutlined, QuestionCircleOutlined, MergeCellsOutlined, NumberOutlined } from '@ant-design/icons';
4
+ import { gzipSync, strToU8 } from 'fflate';
5
+ import { uint8ArrayToHex } from 'uint8array-extras';
6
+ import HcserviceV3 from "../../../../tmpl/hcservice-v3";
7
+ import IconFont from "../../../../icon/aliIcon";
8
+ import { Render } from '../render';
9
+ import { GraphType, LinkType, AlignType } from '../render/types';
10
+ import * as Draws from '../render/draws';
11
+ import './index.less';
12
+
13
+ // 布局类型
14
+ const alignTypes = [
15
+ { label: '垂直居中', value: 'Middle', icon: "icon-middle-L" },
16
+ { label: '左对齐', value: 'Left', icon: "icon-left-L" },
17
+ { label: '右对齐', value: 'Right', icon: "icon-right-L" },
18
+ { label: '水平居中', value: 'Center', icon: "icon-center-L" },
19
+ { label: '上对齐', value: 'Top', icon: "icon-top-L" },
20
+ { label: '下对齐', value: 'Bottom', icon: "icon-bottom-L" }
21
+ ];
22
+
23
+ // 连线类型
24
+ const lineTypes = [
25
+ { label: '折线', value: 'curve', icon: "icon-zhexian" },
26
+ { label: '贝塞尔曲线', value: 'bezier', icon: "icon-bezier" },
27
+ { label: '自动', value: 'auto', icon: "icon-zhexian-auto" },
28
+ ];
29
+
30
+ // 图形类型
31
+ const graphTypes = [
32
+ { label: '折线', value: 'Curve', icon: "icon-zhexian" },
33
+ { label: '贝塞尔曲线', value: 'Bezier', icon: "icon-bezier" },
34
+ { label: '矩形', value: 'Rect', icon: 'icon-rect' },
35
+ { label: '圆', value: 'Circle', icon: 'icon-circle' },
36
+ ];
37
+
38
+ interface MainHeaderProps {
39
+ render: Render | null;
40
+ graphType?: GraphType; // 图类型
41
+ texting?: boolean; // 添加文本状态
42
+ showGrid?: boolean; // 显示网格
43
+ showAttract?: boolean; // 显示磁吸
44
+ onGraphTypeChange: (type: GraphType | undefined) => void; // 更新图类型
45
+ onTexting: (texting: boolean) => void;
46
+ setShowGrid?: (show: boolean) => void;
47
+ setShowAttract?: (show: boolean) => void;
48
+ recordCode: string;
49
+ }
50
+
51
+ const MainHeader = (props: MainHeaderProps) => {
52
+ const { render, graphType, onGraphTypeChange, onTexting, texting, recordCode, showGrid, setShowGrid, showAttract, setShowAttract } = props;
53
+ const [scale, setScale] = useState<number>(100); // 缩放
54
+ const [history, setHistory] = useState<string[]>([]); // 历史记录
55
+ const [historyIndex, setHistoryIndex] = useState(-1); // 当前历史记录标签
56
+ const [selection, setSelection] = useState<unknown[]>([]); // 选中组件
57
+ const [currentLinkType, setCurrentLinkType] = useState<LinkType>("curve"); // 连接线类型
58
+ const [showShortCut, setShowShortCut] = useState<boolean>(false); // 快捷键显示
59
+ const [loading, setLoading] = useState<boolean>(false);
60
+
61
+ // 文件导入
62
+ const handleRestore = useCallback(() => {
63
+ if (!render) return;
64
+ const input = document.createElement('input');
65
+ input.type = 'file';
66
+ input.accept = '.json';
67
+ input.onchange = () => {
68
+ const file = input.files?.[0];
69
+ if (file) {
70
+ const reader = new FileReader();
71
+ reader.onload = async () => {
72
+ await render.importExportTool.restore(reader.result as string);
73
+ render.positionTool.positionFit();
74
+ }
75
+ reader.readAsText(file);
76
+ }
77
+ }
78
+ input.click();
79
+ }, [render]);
80
+
81
+ // 保存
82
+ const handleSave = async () => {
83
+ if (!recordCode) {
84
+ return;
85
+ }
86
+ setLoading(true);
87
+ const data = render.importExportTool.save();
88
+ // 1. 将普通字符串转换为 Uint8Array
89
+ const dataBuffer = strToU8(data);
90
+ // 2. 压缩为 ByteArray
91
+ const content = gzipSync(dataBuffer, { level: 9 });
92
+ // 3. 将 Uint8Array 转为 16进制字符串
93
+ const hexString = uint8ArrayToHex(content);
94
+ await HcserviceV3.postDiagram2DConfig(recordCode, hexString);
95
+ setLoading(false);
96
+ }
97
+
98
+ // 数据导出
99
+ const handleExport = useCallback((type: 'json' | 'svg' | 'asset' | 'png' | 'assetPng', action?: "save" | "download") => {
100
+ if (!render) return;
101
+ switch (type) {
102
+ case 'json':
103
+ if (action === "save") {
104
+ handleSave();
105
+ } else {
106
+ download("data.json", render.importExportTool.save());
107
+ }
108
+ return;
109
+ case 'asset':
110
+ download("asset.json", render.importExportTool.getAsset());
111
+ return;
112
+ case 'png':
113
+ download('image.png', render.importExportTool.getAssetImage(2));
114
+ return;
115
+ case 'assetPng':
116
+ download('image.png', render.importExportTool.getAssetImage());
117
+ return;
118
+ }
119
+ }, [render]);
120
+
121
+ // 下载辅助函数
122
+ const download = (name: string, content: string) => {
123
+ const a = document.createElement('a');
124
+ a.download = name;
125
+ a.href = content.startsWith('blob:') ? content : URL.createObjectURL(new Blob([content]));
126
+ a.click();
127
+ }
128
+
129
+ // 工具操作
130
+ const handleAlign = useCallback((type: AlignType) => {
131
+ render?.alignTool.align(type);
132
+ }, [render])
133
+
134
+ // 更改组件连接线类型
135
+ const handleLinkType = useCallback((type: LinkType) => {
136
+ (render?.draws[Draws.LinkDraw.name] as unknown as { changeLinkType: (t: LinkType) => void })?.changeLinkType(type);
137
+ }, [render])
138
+
139
+ // 重置缩放
140
+ const handleScale = useCallback((action: 'fit' | 'reset' | 'position') => {
141
+ const tool = render?.positionTool;
142
+ if (!tool) return;
143
+ action === 'fit' ? tool.positionFit() : action === 'reset' ? tool.positionZoomReset() : tool.positionReset();
144
+ }, [render])
145
+
146
+ // 更改图类型
147
+ const handleGraph = (type: GraphType) => onGraphTypeChange(graphType === type ? undefined : type);
148
+
149
+ // 绑定事件
150
+ useEffect(() => {
151
+ if (!render) return;
152
+ render.on('selection-change', setSelection);
153
+ render.on('history-change', ({ records, index }: { records: string[]; index: number }) => {
154
+ setHistory(records);
155
+ setHistoryIndex(index);
156
+ });
157
+ render.on('link-type-change', setCurrentLinkType);
158
+ render.on('scale-change', (v: number) => setScale(v * 100));
159
+ render.on('loading', setLoading);
160
+ }, [render]);
161
+
162
+ // 是否选中多个组件
163
+ const isSelects = useMemo(() => selection.length <= 1, [selection]);
164
+
165
+ // 缩放菜单选项
166
+ const scaleMenu = [
167
+ { key: "fit", label: <a onClick={() => handleScale('fit')}>自适应</a> },
168
+ { key: "reset", label: <a onClick={() => handleScale('reset')}>重置位置及缩放</a> },
169
+ { key: "position", label: <a onClick={() => handleScale('position')}>仅重置位置</a> }
170
+ ];
171
+
172
+ return (
173
+ <div className="main-header">
174
+ <Space size={4} separator={<Divider vertical styles={{ root: { margin: "0 4px" } }} />}>
175
+ <Dropdown menu={{ items: scaleMenu }}>
176
+ <span style={{ cursor: "pointer" }}>{`${scale.toFixed(0)}%`}</span>
177
+ </Dropdown>
178
+ <Tooltip title="撤销">
179
+ <Button type="text" onClick={() => render?.prevHistory()} disabled={historyIndex <= 0} >↶</Button>
180
+ </Tooltip>
181
+ <Tooltip title="恢复">
182
+ <Button type="text" onClick={() => render?.nextHistory()} disabled={historyIndex >= history.length - 1} >↷</Button>
183
+ </Tooltip>
184
+ {alignTypes.map(type => (
185
+ <Tooltip title={type.label}>
186
+ <Button type="text" key={type.value} onClick={() => handleAlign(type.value as AlignType)} disabled={isSelects} ><IconFont type={type.icon} /></Button>
187
+ </Tooltip>
188
+ ))}
189
+ {lineTypes.map(type => (
190
+ <Tooltip title={`连接线:${type.label}`}>
191
+ <Button type="text" key={type.value} onClick={() => handleLinkType(type.value as LinkType)} disabled={currentLinkType === type.value}><IconFont type={type.icon} /></Button>
192
+ </Tooltip>
193
+ ))}
194
+ {graphTypes.map(type => (
195
+ <Tooltip title={`画${type.label}`}>
196
+ <Button type="text" key={type.value} onClick={() => handleGraph(type.value as GraphType)} className={graphType === type.value ? 'active' : ''} ><IconFont type={type.icon} /></Button>
197
+ </Tooltip>
198
+ ))}
199
+ <Tooltip title="插入文字">
200
+ <Button type="text" onClick={() => onTexting(true)} className={texting ? "active" : ""} ><IconFont type="icon-wenben" /></Button>
201
+ </Tooltip>
202
+ <Tooltip title="网格">
203
+ <Button type="text" onClick={() => setShowGrid(!showGrid)} className={showGrid ? "active" : ""} ><NumberOutlined /></Button>
204
+ </Tooltip>
205
+ <Tooltip title="磁吸">
206
+ <Button type="text" onClick={() => setShowAttract(!showAttract)} className={showAttract ? "active" : ""} ><MergeCellsOutlined /></Button>
207
+ </Tooltip>
208
+ </Space>
209
+ <Space size={4} separator={<Divider vertical styles={{ root: { margin: "0 4px" } }} />}>
210
+ <Tooltip title="快捷键">
211
+ <Button type="text" onClick={() => setShowShortCut(true)} ><QuestionCircleOutlined /></Button>
212
+ </Tooltip>
213
+ <Tooltip title="导入">
214
+ <Button type="text" onClick={handleRestore} ><ImportOutlined /></Button>
215
+ </Tooltip>
216
+ <Tooltip title="导出">
217
+ <Button type="text" onClick={() => handleExport("json")} ><ExportOutlined /></Button>
218
+ </Tooltip>
219
+ <Tooltip title="保存">
220
+ <Button loading={loading} type="text" onClick={() => handleExport("json", "save")} ><SaveOutlined /></Button>
221
+ </Tooltip>
222
+ </Space>
223
+ {showShortCut &&
224
+ <Modal title="快捷键" width={600} footer={null} open={showShortCut} onCancel={() => setShowShortCut(false)}>
225
+ <p>1、复制、粘贴、多选、全选、删除、上一步、下一步等快捷键与一般文档编辑器类似;</p>
226
+ <p>2、放大缩小,【Win】鼠标上滚动下滚动,【Mac】触控板双指放大、缩小;</p>
227
+ <p>3、画布拖动,在空白处,【Win】右键按下移动,【Mac】control + 触控板三指移动;</p>
228
+ </Modal>}
229
+ </div >
230
+ )
231
+ }
232
+
233
+ export default MainHeader;