aldehyde 0.2.480 → 0.2.481

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 (582) hide show
  1. package/LICENSE +201 -201
  2. package/README.md +2 -2
  3. package/lib/controls/2dEditor/2dEditor/index.less +5 -5
  4. package/lib/controls/2dEditor/2dView/index.less +8 -8
  5. package/lib/controls/2dEditor/components/component.less +83 -83
  6. package/lib/controls/action/index.css +8 -8
  7. package/lib/controls/action/index.d.ts.map +1 -1
  8. package/lib/controls/chemstruc/graph.d.ts.map +1 -1
  9. package/lib/controls/chemstruc/index.css +28 -28
  10. package/lib/controls/collapse-card/index.css +8 -8
  11. package/lib/controls/collapse-card/index.d.ts.map +1 -1
  12. package/lib/controls/cquery/cquick-button.d.ts.map +1 -1
  13. package/lib/controls/entity-select/entity-select.d.ts.map +1 -1
  14. package/lib/controls/entity-select/index.css +7 -7
  15. package/lib/controls/entity-select/lab-tree-select.d.ts.map +1 -1
  16. package/lib/controls/entity-select/popover-entity-select.d.ts.map +1 -1
  17. package/lib/controls/file-view/index.less +9 -9
  18. package/lib/controls/html-editor/index.less +67 -67
  19. package/lib/controls/icon-selector/icon/aldehyde-menu-icon/iconfont.css +147 -147
  20. package/lib/controls/password-setter/index.css +2 -2
  21. package/lib/controls/password-setter/index.d.ts.map +1 -1
  22. package/lib/controls/qr-code/index.less +28 -28
  23. package/lib/controls/relation-existion/index.css +3 -3
  24. package/lib/controls/relation-existion/index.d.ts.map +1 -1
  25. package/lib/controls/rfield/index.css +4 -4
  26. package/lib/controls/rfield/index.d.ts.map +1 -1
  27. package/lib/controls/select/index.d.ts.map +1 -1
  28. package/lib/controls/signature/index.d.ts.map +1 -1
  29. package/lib/controls/text/ellipsis-text.d.ts.map +1 -1
  30. package/lib/controls/text/index.less +7 -7
  31. package/lib/controls/upload/index.d.ts.map +1 -1
  32. package/lib/controls/upload/mult-file-upload.d.ts.map +1 -1
  33. package/lib/custom-page/dtmpl-custom-edit-modal-page.d.ts.map +1 -1
  34. package/lib/detail/button/bottom-submit-button-bar.d.ts.map +1 -1
  35. package/lib/detail/button/cquery-button-bar.d.ts.map +1 -1
  36. package/lib/detail/button/fix-right-submit-button-bar.d.ts.map +1 -1
  37. package/lib/detail/button/index.css +42 -42
  38. package/lib/detail/dtmpl.css +67 -67
  39. package/lib/detail/edit/fields-edit-card.d.ts.map +1 -1
  40. package/lib/detail/edit/modal-row-edit.d.ts.map +1 -1
  41. package/lib/detail/edit/popover-edit-card.d.ts.map +1 -1
  42. package/lib/detail/rightbar/index.css +34 -34
  43. package/lib/detail/rightbar/index.d.ts.map +1 -1
  44. package/lib/detail/view/act-dtmpl-view.d.ts.map +1 -1
  45. package/lib/detail/view/field-view-group.d.ts.map +1 -1
  46. package/lib/detail/view/modal-dtmpl-view.d.ts.map +1 -1
  47. package/lib/detail/view/snapshot-timeline.d.ts.map +1 -1
  48. package/lib/detail/view/tab-act-dtmpl-view.d.ts.map +1 -1
  49. package/lib/draw-canvas-edit/components/render/components/index.d.ts +3 -0
  50. package/lib/draw-canvas-edit/components/render/components/index.d.ts.map +1 -0
  51. package/lib/draw-canvas-edit/components/render/components/index.js +3 -0
  52. package/lib/draw-canvas-edit/components/render/components/index.js.map +1 -0
  53. package/lib/draw-canvas-edit/components/render/components/workstation-component.d.ts +31 -0
  54. package/lib/draw-canvas-edit/components/render/components/workstation-component.d.ts.map +1 -0
  55. package/lib/draw-canvas-edit/components/render/components/workstation-component.js +105 -0
  56. package/lib/draw-canvas-edit/components/render/components/workstation-component.js.map +1 -0
  57. package/lib/draw-canvas-edit/components/render/tools/component-factory.d.ts +2 -0
  58. package/lib/draw-canvas-edit/components/render/tools/component-factory.d.ts.map +1 -1
  59. package/lib/draw-canvas-edit/components/render/tools/component-factory.js +10 -42
  60. package/lib/draw-canvas-edit/components/render/tools/component-factory.js.map +1 -1
  61. package/lib/draw-canvas-edit/components/render/types.d.ts +3 -0
  62. package/lib/draw-canvas-edit/components/render/types.d.ts.map +1 -1
  63. package/lib/draw-canvas-edit/components/render/types.js.map +1 -1
  64. package/lib/draw-canvas-edit/index.less +48 -48
  65. package/lib/draw-canvas-view/index.less +59 -59
  66. package/lib/draw-canvas-view/view.d.ts.map +1 -1
  67. package/lib/draw-canvas-view/view.js +19 -6
  68. package/lib/draw-canvas-view/view.js.map +1 -1
  69. package/lib/export/export-frame.css +2 -2
  70. package/lib/export/export-frame.d.ts.map +1 -1
  71. package/lib/export/select-code-export-frame.d.ts.map +1 -1
  72. package/lib/form/dtmpl-form.css +3 -3
  73. package/lib/form/dtmpl-form.d.ts.map +1 -1
  74. package/lib/form/dtmpl-form.js +1 -1
  75. package/lib/form/dtmpl-form.js.map +1 -1
  76. package/lib/form/field-group-form.d.ts.map +1 -1
  77. package/lib/form/form-Item-group.d.ts.map +1 -1
  78. package/lib/form/index.css +12 -12
  79. package/lib/import/excel-import.d.ts.map +1 -1
  80. package/lib/import/index.css +53 -53
  81. package/lib/import/template.css +50 -50
  82. package/lib/layout/common.css +64 -64
  83. package/lib/layout/coverstyle.css +51 -51
  84. package/lib/layout/footer/index.css +5 -5
  85. package/lib/layout/header/index.css +122 -122
  86. package/lib/layout/menu/block.css +7 -7
  87. package/lib/layout/menu/block.d.ts.map +1 -1
  88. package/lib/layout/menu/l2menu-quick-bar.d.ts.map +1 -1
  89. package/lib/layout/menu/menu-2layers.d.ts.map +1 -1
  90. package/lib/layout/menu/message-bar.less +73 -73
  91. package/lib/layout/menu/reset-password.d.ts.map +1 -1
  92. package/lib/layout/menu/user-bar.d.ts.map +1 -1
  93. package/lib/layout/menu/userinfo-bar.d.ts.map +1 -1
  94. package/lib/layout/sidebar/index.css +57 -57
  95. package/lib/layout2/css/header.css +41 -41
  96. package/lib/layout2/css/sider.less +17 -17
  97. package/lib/layout2/css/tabs-layout.less +18 -18
  98. package/lib/layout3/css/header.less +195 -195
  99. package/lib/layout3/css/main.less +161 -161
  100. package/lib/layout3/css/sider.less +32 -32
  101. package/lib/layout3/css/tabs-layout.less +38 -38
  102. package/lib/layout4/css/header.less +196 -196
  103. package/lib/layout4/css/main.less +154 -154
  104. package/lib/layout4/css/sider.less +37 -37
  105. package/lib/layout4/css/tabs-layout.less +42 -42
  106. package/lib/layout5/css/header.less +35 -35
  107. package/lib/layout5/css/sider.less +18 -18
  108. package/lib/list/calendar/index.less +20 -20
  109. package/lib/list/card-list/index.less +154 -154
  110. package/lib/list/gantt/index.less +8 -8
  111. package/lib/list/vertical-list/index.less +208 -208
  112. package/lib/login/index.css +19 -19
  113. package/lib/login/login.d.ts.map +1 -1
  114. package/lib/login/vertify/index.css +143 -143
  115. package/lib/login3/index.less +136 -136
  116. package/lib/lowcode-components/act-table/index.less +26 -26
  117. package/lib/lowcode-components/base-button/index.less +7 -7
  118. package/lib/lowcode-components/base-map/index.js +6 -6
  119. package/lib/lowcode-components/base-radio/index.less +23 -23
  120. package/lib/lowcode-components/base-tabs/index.less +14 -14
  121. package/lib/lowcode-components/border/border10/index.less +26 -26
  122. package/lib/lowcode-components/border/border11/index.js +46 -46
  123. package/lib/lowcode-components/border/border11/index.less +17 -17
  124. package/lib/lowcode-components/border/border12/index.js +13 -13
  125. package/lib/lowcode-components/border/border12/index.less +13 -13
  126. package/lib/lowcode-components/border/border13/index.js +5 -5
  127. package/lib/lowcode-components/border/border13/index.less +13 -13
  128. package/lib/lowcode-components/border/border2/index.less +17 -17
  129. package/lib/lowcode-components/border/border3/index.less +25 -25
  130. package/lib/lowcode-components/border/border4/index.js +2 -2
  131. package/lib/lowcode-components/border/border4/index.less +72 -72
  132. package/lib/lowcode-components/border/border5/index.js +2 -2
  133. package/lib/lowcode-components/border/border5/index.less +35 -35
  134. package/lib/lowcode-components/border/border6/index.less +17 -17
  135. package/lib/lowcode-components/border/border7/index.less +26 -26
  136. package/lib/lowcode-components/border/border8/index.less +13 -13
  137. package/lib/lowcode-components/border/border9/index.js +14 -14
  138. package/lib/lowcode-components/border/border9/index.less +13 -13
  139. package/lib/lowcode-components/decoration/decoration1/index.less +7 -7
  140. package/lib/lowcode-components/decoration/decoration10/index.js +3 -3
  141. package/lib/lowcode-components/decoration/decoration10/index.less +5 -5
  142. package/lib/lowcode-components/decoration/decoration11/index.less +5 -5
  143. package/lib/lowcode-components/decoration/decoration2/index.less +6 -6
  144. package/lib/lowcode-components/decoration/decoration3/index.less +7 -7
  145. package/lib/lowcode-components/decoration/decoration4/index.less +29 -29
  146. package/lib/lowcode-components/decoration/decoration5/index.less +3 -3
  147. package/lib/lowcode-components/decoration/decoration6/index.less +7 -7
  148. package/lib/lowcode-components/decoration/decoration7/index.less +4 -4
  149. package/lib/lowcode-components/decoration/decoration8/index.less +14 -14
  150. package/lib/lowcode-components/decoration/decoration9/index.less +4 -4
  151. package/lib/lowcode-components/effectScatter-map/index.js +6 -6
  152. package/lib/lowcode-components/effectScatter-map-3d/index.js +6 -6
  153. package/lib/lowcode-components/lowcode-view/index.less +19 -19
  154. package/lib/lowcode-components/search-form/index.less +25 -25
  155. package/lib/module/dtmpl-edit-card.d.ts.map +1 -1
  156. package/lib/module/dtmpl-edit-page.d.ts.map +1 -1
  157. package/lib/module/index.less +4 -4
  158. package/lib/module/ltmpl-modal.d.ts.map +1 -1
  159. package/lib/module/ltmpl-table.d.ts.map +1 -1
  160. package/lib/routable/index.less +25 -25
  161. package/lib/table/act-table.d.ts.map +1 -1
  162. package/lib/table/column/index.less +63 -63
  163. package/lib/table/index.css +211 -211
  164. package/lib/table/modal-select-table.d.ts.map +1 -1
  165. package/lib/table/pagination.css +14 -14
  166. package/lib/table/pagination.d.ts.map +1 -1
  167. package/lib/table/relation-table.d.ts.map +1 -1
  168. package/lib/table/select-table.d.ts.map +1 -1
  169. package/lib/table/select-table.js +14 -2
  170. package/lib/table/select-table.js.map +1 -1
  171. package/lib/table/selected-rows-card.d.ts.map +1 -1
  172. package/lib/table/stat/restat.d.ts.map +1 -1
  173. package/lib/tree/act-tree.d.ts.map +1 -1
  174. package/lib/tree/block-menu-auth-tree.d.ts.map +1 -1
  175. package/lib/tree/index.css +22 -22
  176. package/lib/tree/tmpl-tree.d.ts.map +1 -1
  177. package/lib/welcome/components/menu-card.less +96 -96
  178. package/lib/welcome/components/page-card.less +49 -49
  179. package/lib/welcome/components/quick-entrance.less +120 -120
  180. package/lib/welcome/components/user-menus.less +192 -192
  181. package/lib/welcome/components/workbench.less +118 -118
  182. package/lib/welcome/index.css +13 -13
  183. package/package.json +223 -223
  184. package/src/aldehyde/controls/2dEditor/2dEditor/index.less +5 -5
  185. package/src/aldehyde/controls/2dEditor/2dEditor/index.tsx +270 -270
  186. package/src/aldehyde/controls/2dEditor/2dView/index.less +8 -8
  187. package/src/aldehyde/controls/2dEditor/2dView/index.tsx +110 -110
  188. package/src/aldehyde/controls/2dEditor/components/card.tsx +256 -256
  189. package/src/aldehyde/controls/2dEditor/components/component.less +83 -83
  190. package/src/aldehyde/controls/2dEditor/components/data.d.ts +32 -32
  191. package/src/aldehyde/controls/2dEditor/components/hotspot.tsx +80 -80
  192. package/src/aldehyde/controls/2dEditor/components/html-box.tsx +101 -101
  193. package/src/aldehyde/controls/2dEditor/components/image.tsx +99 -99
  194. package/src/aldehyde/controls/2dEditor/components/line.tsx +73 -73
  195. package/src/aldehyde/controls/action/index.css +8 -8
  196. package/src/aldehyde/controls/action/index.tsx +406 -406
  197. package/src/aldehyde/controls/action/utils.tsx +306 -306
  198. package/src/aldehyde/controls/auto-complete/index.tsx +82 -82
  199. package/src/aldehyde/controls/cascader/index.tsx +112 -112
  200. package/src/aldehyde/controls/chemstruc/graph.tsx +185 -185
  201. package/src/aldehyde/controls/chemstruc/index.css +28 -28
  202. package/src/aldehyde/controls/code-editor/sql-code-editor.tsx +73 -73
  203. package/src/aldehyde/controls/collapse-card/index.css +8 -8
  204. package/src/aldehyde/controls/collapse-card/index.tsx +109 -109
  205. package/src/aldehyde/controls/color-picker/index.tsx +21 -21
  206. package/src/aldehyde/controls/counting-tag/index.tsx +53 -53
  207. package/src/aldehyde/controls/cquery/cquick-button.tsx +145 -145
  208. package/src/aldehyde/controls/date-picker/index.tsx +199 -199
  209. package/src/aldehyde/controls/direct-file-view/drawer-file-view.tsx +54 -54
  210. package/src/aldehyde/controls/direct-file-view/index.tsx +145 -145
  211. package/src/aldehyde/controls/direct-upload/index.tsx +139 -139
  212. package/src/aldehyde/controls/entity-select/entity-select.tsx +791 -791
  213. package/src/aldehyde/controls/entity-select/index.css +7 -7
  214. package/src/aldehyde/controls/entity-select/lab-tree-select.tsx +154 -154
  215. package/src/aldehyde/controls/entity-select/popover-entity-select.tsx +205 -205
  216. package/src/aldehyde/controls/entry-control.tsx +418 -418
  217. package/src/aldehyde/controls/enum-badge/index.tsx +42 -42
  218. package/src/aldehyde/controls/enum-tag/index.tsx +45 -45
  219. package/src/aldehyde/controls/field-history/index.tsx +81 -81
  220. package/src/aldehyde/controls/file-export/select-code-export.tsx +40 -40
  221. package/src/aldehyde/controls/file-view/drawer-file-view.tsx +117 -117
  222. package/src/aldehyde/controls/file-view/index.less +9 -9
  223. package/src/aldehyde/controls/file-view/index.tsx +148 -148
  224. package/src/aldehyde/controls/file-view/multi-file-view.tsx +39 -39
  225. package/src/aldehyde/controls/file-view/newin-file-view.tsx +40 -40
  226. package/src/aldehyde/controls/html-editor/draft.tsx +136 -136
  227. package/src/aldehyde/controls/html-editor/index.less +67 -67
  228. package/src/aldehyde/controls/icon-selector/app-icon-selector.tsx +68 -68
  229. package/src/aldehyde/controls/icon-selector/icon/aldehyde-menu-icon/iconfont.css +147 -147
  230. package/src/aldehyde/controls/icon-selector/icon/aldehyde-menu-icon/iconfont.json +240 -240
  231. package/src/aldehyde/controls/icon-selector/pc-icon-selector.tsx +68 -68
  232. package/src/aldehyde/controls/input-number/index.tsx +148 -148
  233. package/src/aldehyde/controls/input-range/index.tsx +59 -59
  234. package/src/aldehyde/controls/password-setter/index.css +2 -2
  235. package/src/aldehyde/controls/password-setter/index.js +88 -88
  236. package/src/aldehyde/controls/progress/index.tsx +74 -74
  237. package/src/aldehyde/controls/qr-code/index.less +28 -28
  238. package/src/aldehyde/controls/qr-code/index.tsx +40 -40
  239. package/src/aldehyde/controls/relation-existion/index.css +3 -3
  240. package/src/aldehyde/controls/relation-existion/index.tsx +144 -144
  241. package/src/aldehyde/controls/rfield/index.css +4 -4
  242. package/src/aldehyde/controls/rfield/index.tsx +225 -225
  243. package/src/aldehyde/controls/select/index.tsx +216 -216
  244. package/src/aldehyde/controls/signature/index.tsx +226 -226
  245. package/src/aldehyde/controls/single-checkbox/index.tsx +18 -18
  246. package/src/aldehyde/controls/steps/index.tsx +59 -59
  247. package/src/aldehyde/controls/text/ellipsis-text.tsx +98 -98
  248. package/src/aldehyde/controls/text/index.less +7 -7
  249. package/src/aldehyde/controls/tree-select/navigation-tree.tsx +122 -122
  250. package/src/aldehyde/controls/tree-select/tree-entity-select.tsx +121 -121
  251. package/src/aldehyde/controls/upload/index.tsx +128 -128
  252. package/src/aldehyde/controls/upload/mult-file-upload.tsx +240 -240
  253. package/src/aldehyde/controls/view-control.tsx +289 -289
  254. package/src/aldehyde/custom-page/custom-detail-modal-page.tsx +69 -69
  255. package/src/aldehyde/custom-page/custom-page-router.tsx +64 -64
  256. package/src/aldehyde/custom-page/def-custom-page.tsx +17 -17
  257. package/src/aldehyde/custom-page/dtmpl-custom-edit-modal-page.tsx +88 -88
  258. package/src/aldehyde/detail/button/bottom-submit-button-bar.tsx +91 -91
  259. package/src/aldehyde/detail/button/cquery-button-bar.tsx +144 -144
  260. package/src/aldehyde/detail/button/edit-button.tsx +61 -61
  261. package/src/aldehyde/detail/button/fix-right-submit-button-bar.tsx +186 -186
  262. package/src/aldehyde/detail/button/index.css +42 -42
  263. package/src/aldehyde/detail/button/inline-edit-button.tsx +40 -40
  264. package/src/aldehyde/detail/button/submit-button-bar.tsx +57 -57
  265. package/src/aldehyde/detail/button/view-button.tsx +64 -64
  266. package/src/aldehyde/detail/dtmpl.css +67 -67
  267. package/src/aldehyde/detail/edit/dtmpl-edit.tsx +279 -279
  268. package/src/aldehyde/detail/edit/fields-edit-card.tsx +145 -145
  269. package/src/aldehyde/detail/edit/modal-row-edit.tsx +95 -95
  270. package/src/aldehyde/detail/edit/popover-edit-card.tsx +167 -167
  271. package/src/aldehyde/detail/edit/popover-editor.tsx +70 -70
  272. package/src/aldehyde/detail/edit/post-result/index.tsx +86 -86
  273. package/src/aldehyde/detail/rightbar/index.css +34 -34
  274. package/src/aldehyde/detail/rightbar/index.tsx +92 -92
  275. package/src/aldehyde/detail/tooltipbar/index.tsx +32 -32
  276. package/src/aldehyde/detail/view/act-dtmpl-view.tsx +288 -288
  277. package/src/aldehyde/detail/view/dtmpl-view.tsx +314 -314
  278. package/src/aldehyde/detail/view/field-view-group.tsx +88 -88
  279. package/src/aldehyde/detail/view/modal-dtmpl-view.tsx +73 -73
  280. package/src/aldehyde/detail/view/snapshot-timeline.tsx +231 -231
  281. package/src/aldehyde/detail/view/tab-act-dtmpl-view.tsx +304 -304
  282. package/src/aldehyde/detail/view/view-compare-panel.tsx +57 -57
  283. package/src/aldehyde/draw-canvas-edit/components/render/components/index.ts +3 -0
  284. package/src/aldehyde/draw-canvas-edit/components/render/components/workstation-component.tsx +104 -0
  285. package/src/aldehyde/draw-canvas-edit/components/render/draws/bg-draw.ts +176 -176
  286. package/src/aldehyde/draw-canvas-edit/components/render/draws/contextmenu-draw.ts +329 -329
  287. package/src/aldehyde/draw-canvas-edit/components/render/graphs/bezier.ts +542 -542
  288. package/src/aldehyde/draw-canvas-edit/components/render/handlers/drag-outside-handlers.ts +72 -72
  289. package/src/aldehyde/draw-canvas-edit/components/render/handlers/selection-handlers.ts +396 -396
  290. package/src/aldehyde/draw-canvas-edit/components/render/index.ts +808 -808
  291. package/src/aldehyde/draw-canvas-edit/components/render/tools/attract-tool.ts +457 -457
  292. package/src/aldehyde/draw-canvas-edit/components/render/tools/component-factory.ts +270 -302
  293. package/src/aldehyde/draw-canvas-edit/components/render/tools/copy-tool.ts +244 -244
  294. package/src/aldehyde/draw-canvas-edit/components/render/tools/import-export-tool.ts +576 -576
  295. package/src/aldehyde/draw-canvas-edit/components/render/tools/index.ts +10 -10
  296. package/src/aldehyde/draw-canvas-edit/components/render/tools/position-tool.ts +191 -191
  297. package/src/aldehyde/draw-canvas-edit/components/render/tools/selection-tool.ts +140 -140
  298. package/src/aldehyde/draw-canvas-edit/components/render/types.ts +294 -291
  299. package/src/aldehyde/draw-canvas-edit/components/setting-form/index.tsx +291 -291
  300. package/src/aldehyde/draw-canvas-edit/constant.ts +5 -5
  301. package/src/aldehyde/draw-canvas-edit/index.less +48 -48
  302. package/src/aldehyde/draw-canvas-edit/index.tsx +201 -201
  303. package/src/aldehyde/draw-canvas-view/index.less +59 -59
  304. package/src/aldehyde/draw-canvas-view/index.tsx +49 -49
  305. package/src/aldehyde/draw-canvas-view/view.tsx +17 -5
  306. package/src/aldehyde/export/export-frame.css +2 -2
  307. package/src/aldehyde/export/export-frame.tsx +301 -301
  308. package/src/aldehyde/export/select-code-export-frame.tsx +212 -212
  309. package/src/aldehyde/form/criteria-form.tsx +604 -604
  310. package/src/aldehyde/form/dtmpl-form.css +3 -3
  311. package/src/aldehyde/form/dtmpl-form.tsx +552 -552
  312. package/src/aldehyde/form/field-group-form.tsx +102 -102
  313. package/src/aldehyde/form/fields-form.tsx +45 -45
  314. package/src/aldehyde/form/form-Item-group.tsx +245 -245
  315. package/src/aldehyde/form/index.css +12 -12
  316. package/src/aldehyde/hooks/use-match-route/index.tsx +62 -62
  317. package/src/aldehyde/hooks/use-tabs/index.tsx +139 -139
  318. package/src/aldehyde/hooks/useVarCssColor.ts +6 -6
  319. package/src/aldehyde/icon/aliIcon.tsx +9 -9
  320. package/src/aldehyde/icon/index.tsx +28 -28
  321. package/src/aldehyde/import/excel-import.tsx +450 -450
  322. package/src/aldehyde/import/index.css +53 -53
  323. package/src/aldehyde/import/template.css +50 -50
  324. package/src/aldehyde/index.tsx +220 -220
  325. package/src/aldehyde/layout/MainPage.tsx +334 -334
  326. package/src/aldehyde/layout/common.css +64 -64
  327. package/src/aldehyde/layout/coverstyle.css +51 -51
  328. package/src/aldehyde/layout/footer/index.css +5 -5
  329. package/src/aldehyde/layout/footer/index.js +17 -17
  330. package/src/aldehyde/layout/header/index.css +122 -122
  331. package/src/aldehyde/layout/header/index.tsx +152 -152
  332. package/src/aldehyde/layout/menu/block.css +7 -7
  333. package/src/aldehyde/layout/menu/block.tsx +174 -174
  334. package/src/aldehyde/layout/menu/l2menu-message-bar.tsx +160 -160
  335. package/src/aldehyde/layout/menu/l2menu-quick-bar.tsx +175 -175
  336. package/src/aldehyde/layout/menu/menu-2layers.tsx +117 -117
  337. package/src/aldehyde/layout/menu/menu-render.tsx +168 -168
  338. package/src/aldehyde/layout/menu/message-bar.less +73 -73
  339. package/src/aldehyde/layout/menu/reset-password.tsx +255 -255
  340. package/src/aldehyde/layout/menu/user-bar.tsx +259 -259
  341. package/src/aldehyde/layout/menu/userinfo-bar.tsx +69 -69
  342. package/src/aldehyde/layout/sidebar/index.css +57 -57
  343. package/src/aldehyde/layout/sidebar/index.tsx +84 -84
  344. package/src/aldehyde/layout2/components/icon-font.tsx +7 -7
  345. package/src/aldehyde/layout2/components/screenfull-button.tsx +21 -21
  346. package/src/aldehyde/layout2/components/search-menu.tsx +85 -85
  347. package/src/aldehyde/layout2/components/system-messages.tsx +75 -75
  348. package/src/aldehyde/layout2/components/theme-button.tsx +65 -65
  349. package/src/aldehyde/layout2/components/user-button.tsx +258 -258
  350. package/src/aldehyde/layout2/components/user-notification.tsx +74 -74
  351. package/src/aldehyde/layout2/css/header.css +41 -41
  352. package/src/aldehyde/layout2/css/sider.less +17 -17
  353. package/src/aldehyde/layout2/css/tabs-layout.less +18 -18
  354. package/src/aldehyde/layout2/header.tsx +278 -278
  355. package/src/aldehyde/layout2/layout-context.tsx +95 -95
  356. package/src/aldehyde/layout2/main.tsx +30 -30
  357. package/src/aldehyde/layout2/page.tsx +315 -315
  358. package/src/aldehyde/layout2/sider.tsx +230 -230
  359. package/src/aldehyde/layout2/tabs/tabs-context.tsx +37 -37
  360. package/src/aldehyde/layout2/tabs/tabs-layout.tsx +146 -146
  361. package/src/aldehyde/layout2/type/layout-type.ts +15 -15
  362. package/src/aldehyde/layout2/util/menu-util.tsx +125 -125
  363. package/src/aldehyde/layout3/components/tabs-layout.tsx +110 -110
  364. package/src/aldehyde/layout3/components/time.tsx +25 -25
  365. package/src/aldehyde/layout3/css/header.less +195 -195
  366. package/src/aldehyde/layout3/css/main.less +161 -161
  367. package/src/aldehyde/layout3/css/sider.less +32 -32
  368. package/src/aldehyde/layout3/css/tabs-layout.less +38 -38
  369. package/src/aldehyde/layout3/header.tsx +187 -187
  370. package/src/aldehyde/layout3/main.tsx +29 -29
  371. package/src/aldehyde/layout3/page.tsx +110 -110
  372. package/src/aldehyde/layout3/sider.tsx +198 -198
  373. package/src/aldehyde/layout4/components/tabs-layout.tsx +110 -110
  374. package/src/aldehyde/layout4/css/header.less +196 -196
  375. package/src/aldehyde/layout4/css/main.less +154 -154
  376. package/src/aldehyde/layout4/css/sider.less +37 -37
  377. package/src/aldehyde/layout4/css/tabs-layout.less +42 -42
  378. package/src/aldehyde/layout4/header.tsx +190 -190
  379. package/src/aldehyde/layout4/main.tsx +29 -29
  380. package/src/aldehyde/layout4/page.tsx +125 -125
  381. package/src/aldehyde/layout4/sider.tsx +201 -201
  382. package/src/aldehyde/layout5/css/header.less +35 -35
  383. package/src/aldehyde/layout5/css/sider.less +18 -18
  384. package/src/aldehyde/layout5/header.tsx +204 -204
  385. package/src/aldehyde/layout5/page.tsx +107 -107
  386. package/src/aldehyde/layout5/sider.tsx +235 -235
  387. package/src/aldehyde/list/calendar/index.less +20 -20
  388. package/src/aldehyde/list/calendar/index.tsx +157 -157
  389. package/src/aldehyde/list/card-list/card-list-item.tsx +111 -111
  390. package/src/aldehyde/list/card-list/index.less +154 -154
  391. package/src/aldehyde/list/card-list/index.tsx +83 -83
  392. package/src/aldehyde/list/gantt/index.less +8 -8
  393. package/src/aldehyde/list/gantt/index.tsx +508 -508
  394. package/src/aldehyde/list/vertical-list/index.less +208 -208
  395. package/src/aldehyde/list/vertical-list/index.tsx +55 -55
  396. package/src/aldehyde/list/vertical-list/item.tsx +136 -136
  397. package/src/aldehyde/locale/LocaleButton.tsx +48 -48
  398. package/src/aldehyde/locale/LocaleProvider.tsx +265 -265
  399. package/src/aldehyde/locale/langMp.ts +45 -45
  400. package/src/aldehyde/locale/translate.ts +80 -80
  401. package/src/aldehyde/locale/useLocale.ts +72 -72
  402. package/src/aldehyde/login/context-setter.tsx +130 -130
  403. package/src/aldehyde/login/index.css +19 -19
  404. package/src/aldehyde/login/login.tsx +255 -255
  405. package/src/aldehyde/login/router-login.tsx +107 -107
  406. package/src/aldehyde/login/vertify/index.css +143 -143
  407. package/src/aldehyde/login/vertify/index.tsx +360 -360
  408. package/src/aldehyde/login/vertify/tool.ts +13 -13
  409. package/src/aldehyde/login2/login-page.tsx +92 -92
  410. package/src/aldehyde/login2/login.tsx +226 -226
  411. package/src/aldehyde/login3/index.less +136 -136
  412. package/src/aldehyde/login3/login-page.tsx +71 -71
  413. package/src/aldehyde/lowcode-components/act-table/index.less +26 -26
  414. package/src/aldehyde/lowcode-components/act-table/index.tsx +139 -139
  415. package/src/aldehyde/lowcode-components/assets/lowcode-constant.tsx +12 -12
  416. package/src/aldehyde/lowcode-components/bar-chart/index.tsx +268 -268
  417. package/src/aldehyde/lowcode-components/base-button/index.less +7 -7
  418. package/src/aldehyde/lowcode-components/base-button/index.tsx +197 -197
  419. package/src/aldehyde/lowcode-components/base-image/index.tsx +220 -220
  420. package/src/aldehyde/lowcode-components/base-map/index.tsx +292 -292
  421. package/src/aldehyde/lowcode-components/base-radio/index.less +23 -23
  422. package/src/aldehyde/lowcode-components/base-radio/index.tsx +157 -157
  423. package/src/aldehyde/lowcode-components/base-table/index.tsx +268 -268
  424. package/src/aldehyde/lowcode-components/base-tabs/index.less +14 -14
  425. package/src/aldehyde/lowcode-components/base-tabs/index.tsx +183 -183
  426. package/src/aldehyde/lowcode-components/base-text/index.tsx +58 -58
  427. package/src/aldehyde/lowcode-components/border/border1/index.tsx +70 -70
  428. package/src/aldehyde/lowcode-components/border/border10/index.less +26 -26
  429. package/src/aldehyde/lowcode-components/border/border10/index.tsx +45 -45
  430. package/src/aldehyde/lowcode-components/border/border11/index.less +17 -17
  431. package/src/aldehyde/lowcode-components/border/border11/index.tsx +232 -232
  432. package/src/aldehyde/lowcode-components/border/border12/index.less +13 -13
  433. package/src/aldehyde/lowcode-components/border/border12/index.tsx +115 -115
  434. package/src/aldehyde/lowcode-components/border/border13/index.less +13 -13
  435. package/src/aldehyde/lowcode-components/border/border13/index.tsx +69 -69
  436. package/src/aldehyde/lowcode-components/border/border2/index.less +17 -17
  437. package/src/aldehyde/lowcode-components/border/border2/index.tsx +51 -51
  438. package/src/aldehyde/lowcode-components/border/border3/index.less +25 -25
  439. package/src/aldehyde/lowcode-components/border/border3/index.tsx +61 -61
  440. package/src/aldehyde/lowcode-components/border/border4/index.less +72 -72
  441. package/src/aldehyde/lowcode-components/border/border4/index.tsx +79 -79
  442. package/src/aldehyde/lowcode-components/border/border5/index.less +35 -35
  443. package/src/aldehyde/lowcode-components/border/border5/index.tsx +75 -75
  444. package/src/aldehyde/lowcode-components/border/border6/index.less +17 -17
  445. package/src/aldehyde/lowcode-components/border/border6/index.tsx +60 -60
  446. package/src/aldehyde/lowcode-components/border/border7/index.less +26 -26
  447. package/src/aldehyde/lowcode-components/border/border7/index.tsx +75 -75
  448. package/src/aldehyde/lowcode-components/border/border8/index.less +13 -13
  449. package/src/aldehyde/lowcode-components/border/border8/index.tsx +84 -84
  450. package/src/aldehyde/lowcode-components/border/border9/index.less +13 -13
  451. package/src/aldehyde/lowcode-components/border/border9/index.tsx +154 -154
  452. package/src/aldehyde/lowcode-components/capsule-bar-chart/index.tsx +290 -290
  453. package/src/aldehyde/lowcode-components/carousel/index.tsx +218 -218
  454. package/src/aldehyde/lowcode-components/circular-progress-chart/index.tsx +263 -263
  455. package/src/aldehyde/lowcode-components/column-3d-chart/index.tsx +438 -438
  456. package/src/aldehyde/lowcode-components/column-chart/index.tsx +293 -293
  457. package/src/aldehyde/lowcode-components/data-number/index.tsx +219 -219
  458. package/src/aldehyde/lowcode-components/data.d.ts +18 -18
  459. package/src/aldehyde/lowcode-components/decoration/decoration1/index.less +7 -7
  460. package/src/aldehyde/lowcode-components/decoration/decoration1/index.tsx +153 -153
  461. package/src/aldehyde/lowcode-components/decoration/decoration10/index.less +5 -5
  462. package/src/aldehyde/lowcode-components/decoration/decoration10/index.tsx +89 -89
  463. package/src/aldehyde/lowcode-components/decoration/decoration11/index.less +5 -5
  464. package/src/aldehyde/lowcode-components/decoration/decoration11/index.tsx +133 -133
  465. package/src/aldehyde/lowcode-components/decoration/decoration2/index.less +6 -6
  466. package/src/aldehyde/lowcode-components/decoration/decoration2/index.tsx +61 -61
  467. package/src/aldehyde/lowcode-components/decoration/decoration3/index.less +7 -7
  468. package/src/aldehyde/lowcode-components/decoration/decoration3/index.tsx +87 -87
  469. package/src/aldehyde/lowcode-components/decoration/decoration4/index.less +29 -29
  470. package/src/aldehyde/lowcode-components/decoration/decoration4/index.tsx +53 -53
  471. package/src/aldehyde/lowcode-components/decoration/decoration5/index.less +3 -3
  472. package/src/aldehyde/lowcode-components/decoration/decoration5/index.tsx +116 -116
  473. package/src/aldehyde/lowcode-components/decoration/decoration6/index.less +7 -7
  474. package/src/aldehyde/lowcode-components/decoration/decoration6/index.tsx +121 -121
  475. package/src/aldehyde/lowcode-components/decoration/decoration7/index.less +4 -4
  476. package/src/aldehyde/lowcode-components/decoration/decoration7/index.tsx +70 -70
  477. package/src/aldehyde/lowcode-components/decoration/decoration8/index.less +14 -14
  478. package/src/aldehyde/lowcode-components/decoration/decoration8/index.tsx +122 -122
  479. package/src/aldehyde/lowcode-components/decoration/decoration9/index.less +4 -4
  480. package/src/aldehyde/lowcode-components/decoration/decoration9/index.tsx +196 -196
  481. package/src/aldehyde/lowcode-components/effectScatter-map/index.tsx +315 -315
  482. package/src/aldehyde/lowcode-components/effectScatter-map-3d/index.tsx +419 -419
  483. package/src/aldehyde/lowcode-components/gauge-chart/index.tsx +254 -254
  484. package/src/aldehyde/lowcode-components/index.ts +130 -130
  485. package/src/aldehyde/lowcode-components/line-bar-chart/index.tsx +300 -300
  486. package/src/aldehyde/lowcode-components/line-chart/index.tsx +290 -290
  487. package/src/aldehyde/lowcode-components/liquid-chart/index.tsx +250 -250
  488. package/src/aldehyde/lowcode-components/lowcode-view/component/assets.ts +478 -478
  489. package/src/aldehyde/lowcode-components/lowcode-view/component/component-controller.ts +153 -153
  490. package/src/aldehyde/lowcode-components/lowcode-view/component/component-definition.ts +23 -23
  491. package/src/aldehyde/lowcode-components/lowcode-view/component/loading.tsx +20 -20
  492. package/src/aldehyde/lowcode-components/lowcode-view/component/util.ts +27 -27
  493. package/src/aldehyde/lowcode-components/lowcode-view/index.less +19 -19
  494. package/src/aldehyde/lowcode-components/lowcode-view/index.tsx +277 -277
  495. package/src/aldehyde/lowcode-components/lowcode-view/interface.ts +189 -189
  496. package/src/aldehyde/lowcode-components/pie-chart/index.tsx +349 -349
  497. package/src/aldehyde/lowcode-components/progress-chart/index.tsx +295 -295
  498. package/src/aldehyde/lowcode-components/radar-chart/index.tsx +322 -322
  499. package/src/aldehyde/lowcode-components/search-form/index.less +25 -25
  500. package/src/aldehyde/lowcode-components/search-form/index.tsx +121 -121
  501. package/src/aldehyde/lowcode-components/stroke-animation/index.tsx +219 -219
  502. package/src/aldehyde/module/block-menu-tree-drawer.tsx +118 -118
  503. package/src/aldehyde/module/criteria-page.tsx1 +175 -175
  504. package/src/aldehyde/module/draggable-modal.tsx +66 -66
  505. package/src/aldehyde/module/dtmpl-edit-card.tsx +437 -437
  506. package/src/aldehyde/module/dtmpl-edit-drawer.tsx +23 -23
  507. package/src/aldehyde/module/dtmpl-edit-modal.tsx +25 -25
  508. package/src/aldehyde/module/dtmpl-edit-page.tsx +558 -558
  509. package/src/aldehyde/module/dtmpl-editor.tsx +165 -165
  510. package/src/aldehyde/module/dtmpl-view-card.tsx +64 -64
  511. package/src/aldehyde/module/dtmpl-view-drawer.tsx +71 -71
  512. package/src/aldehyde/module/dtmpl-view-modal.tsx +56 -56
  513. package/src/aldehyde/module/embed-dtmpl-edit-page.tsx +137 -137
  514. package/src/aldehyde/module/index.less +4 -4
  515. package/src/aldehyde/module/ltmpl-drawer.tsx +60 -60
  516. package/src/aldehyde/module/ltmpl-modal.tsx +63 -63
  517. package/src/aldehyde/module/ltmpl-table.tsx +378 -378
  518. package/src/aldehyde/module/ttmpl-tree.tsx +47 -47
  519. package/src/aldehyde/routable/dtmpl-route.tsx +173 -173
  520. package/src/aldehyde/routable/import-route.tsx +35 -35
  521. package/src/aldehyde/routable/index.less +25 -25
  522. package/src/aldehyde/routable/ltmpl-route.tsx +539 -539
  523. package/src/aldehyde/routable/splitview-ltmpl-route.tsx +377 -377
  524. package/src/aldehyde/routable/ttmpl-route.tsx +93 -93
  525. package/src/aldehyde/routable/withroute.tsx +36 -36
  526. package/src/aldehyde/sso-Login/index.tsx +73 -73
  527. package/src/aldehyde/sso-Login/service/index.js +16 -16
  528. package/src/aldehyde/sso-Login/service/login.js +75 -75
  529. package/src/aldehyde/table/act-table.tsx +1831 -1831
  530. package/src/aldehyde/table/column/column-builder.tsx +864 -864
  531. package/src/aldehyde/table/column/column-selector.tsx +130 -130
  532. package/src/aldehyde/table/column/index.less +63 -63
  533. package/src/aldehyde/table/column/summary-builder.tsx +712 -712
  534. package/src/aldehyde/table/column/theme-color-getter.tsx +25 -25
  535. package/src/aldehyde/table/control-table-x-axis-wrapper.tsx +80 -80
  536. package/src/aldehyde/table/index.css +211 -211
  537. package/src/aldehyde/table/l2-act-table.tsx +91 -91
  538. package/src/aldehyde/table/modal-select-table.tsx +308 -308
  539. package/src/aldehyde/table/page-config-button.tsx +203 -203
  540. package/src/aldehyde/table/pagination.css +14 -14
  541. package/src/aldehyde/table/pagination.tsx +81 -81
  542. package/src/aldehyde/table/query-table.tsx +658 -658
  543. package/src/aldehyde/table/relation-table.tsx +1093 -1093
  544. package/src/aldehyde/table/report-table.tsx +125 -125
  545. package/src/aldehyde/table/resizable-table.tsx +97 -97
  546. package/src/aldehyde/table/select-table.tsx +559 -548
  547. package/src/aldehyde/table/selected-rows-card.tsx +78 -78
  548. package/src/aldehyde/table/stat/restat.tsx +122 -122
  549. package/src/aldehyde/table/table-util.tsx +25 -25
  550. package/src/aldehyde/tmpl/control-type-supportor.tsx +154 -154
  551. package/src/aldehyde/tmpl/hc-data-source.tsx +566 -566
  552. package/src/aldehyde/tmpl/hcservice-v3.tsx +1590 -1590
  553. package/src/aldehyde/tmpl/interface.tsx +919 -919
  554. package/src/aldehyde/tmpl/model-struc-v3.tsx +111 -111
  555. package/src/aldehyde/tmpl/superagent.js +146 -146
  556. package/src/aldehyde/tmpl/tmpl-config-analysis.tsx +585 -585
  557. package/src/aldehyde/tmpl/web-socket.ts +366 -366
  558. package/src/aldehyde/tree/act-tree.tsx +217 -217
  559. package/src/aldehyde/tree/block-menu-auth-tree.tsx +189 -189
  560. package/src/aldehyde/tree/index.css +22 -22
  561. package/src/aldehyde/tree/navigation-tree.tsx +39 -39
  562. package/src/aldehyde/tree/tmpl-tree.tsx +751 -751
  563. package/src/aldehyde/tree/tree-node.tsx +73 -73
  564. package/src/aldehyde/tree/tree-utils.tsx +317 -317
  565. package/src/aldehyde/units/EncryptUtils.js +37 -37
  566. package/src/aldehyde/units/image.d.ts +7 -7
  567. package/src/aldehyde/units/index.tsx +1367 -1367
  568. package/src/aldehyde/units/storage.js +2 -2
  569. package/src/aldehyde/utils/dsu.ts +27 -27
  570. package/src/aldehyde/welcome/HCWelcome.js +404 -404
  571. package/src/aldehyde/welcome/HCWelcome1.js +259 -259
  572. package/src/aldehyde/welcome/components/menu-card.less +96 -96
  573. package/src/aldehyde/welcome/components/menu-card.tsx +70 -70
  574. package/src/aldehyde/welcome/components/page-card.less +49 -49
  575. package/src/aldehyde/welcome/components/page-card.tsx +97 -97
  576. package/src/aldehyde/welcome/components/quick-entrance.less +120 -120
  577. package/src/aldehyde/welcome/components/quick-entrance.tsx +80 -80
  578. package/src/aldehyde/welcome/components/user-menus.less +192 -192
  579. package/src/aldehyde/welcome/components/user-menus.tsx +279 -279
  580. package/src/aldehyde/welcome/components/workbench.less +118 -118
  581. package/src/aldehyde/welcome/components/workbench.tsx +146 -146
  582. package/src/aldehyde/welcome/index.css +13 -13
@@ -1,508 +1,508 @@
1
- import React, { useMemo, useEffect, useState, useRef } from "react";
2
- import { Spin, Empty, theme, Popconfirm, message, Popover, Descriptions, DescriptionsProps } from "antd";
3
- import { Gantt, VTable } from '@visactor/vtable-gantt';
4
- import dayjs, { OpUnitType } from "dayjs";
5
- import cloneDeep from "lodash/cloneDeep";
6
- import HcserviceV3 from "../../tmpl/hcservice-v3";
7
- import { LtmplConfig, ShowViewParam, ColumnConfig } from "../../tmpl/interface";
8
- import { useLocale } from "../../locale/useLocale";
9
- import loadingIcon from "./img/loading-circle.gif";
10
- import "./index.less";
11
-
12
- // 注册树形表格懒加载loading图标
13
- const registerLoadingIcon = () => {
14
- VTable.register.icon('loading', {
15
- type: 'image',
16
- width: 16,
17
- height: 16,
18
- src: loadingIcon,
19
- name: 'loading', //定义图标的名称,在内部会作为缓存的key值
20
- positionType: VTable.TYPES.IconPosition.absoluteRight, // 指定位置,可以在文本的前后,或者在绝对定位在单元格的左侧右侧
21
- marginLeft: 0, // 左侧内容间隔 在特定位置position中起作用
22
- marginRight: 4, // 右侧内容间隔 在特定位置position中起作用
23
- visibleTime: 'always', // 显示时机, 'always' | 'mouseover_cell' | 'click_cell'
24
- hover: {
25
- // 热区大小
26
- width: 22,
27
- height: 22,
28
- bgColor: 'rgba(101,117,168,0.1)'
29
- },
30
- isGif: true
31
- });
32
- }
33
-
34
- // 配置标题,用于提示未配置
35
- const configTitle = {
36
- gttBeginTime: "开始时间",
37
- gttEndTime: "结束时间",
38
- gttProgress: "进度",
39
- gttTimeUint: "时间单位"
40
- };
41
-
42
- const timeFormat = { "year": "YYYY", "month": "YYYY-MM", "day": "YYYY-MM-DD", "hour": "YYYY-MM-DD HH:mm", "minute": "YYYY-MM-DD HH:mm" };
43
-
44
- // 动态设置任务条背景色
45
- const handleProgressBgColor = (args: { startDate?: string, endDate: string, taskRecord: { [key: string]: any }, gttLatestProgressTime: ColumnConfig; gttProgress: ColumnConfig, timeType: OpUnitType }) => {
46
- const { startDate, endDate, taskRecord, gttProgress, timeType, gttLatestProgressTime } = args;
47
- const progress = Number(taskRecord[gttProgress?.id] || 0);
48
- let cBarColor = undefined; // 任务条已完成颜色,默认主题色
49
- let state = "-";
50
- if (taskRecord[gttLatestProgressTime?.id] && progress >= 100) { // 任务延迟完成(任务完成时间>任务结束时间)
51
- const progressTime = dayjs(taskRecord[gttLatestProgressTime?.id]).unix();
52
- const endTime = dayjs(endDate).unix();
53
- if (progressTime > endTime) {
54
- cBarColor = "#ad6800";
55
- state = "延期完成";
56
- }
57
- }
58
- if (progress >= 100) return { barColor: undefined, cBarColor, state: state || "已完成" }; // 已完成
59
- const startTime = dayjs(startDate).startOf(timeType).unix();
60
- const endTime = dayjs(endDate).endOf(timeType).unix();
61
- const progressTime = (endTime - startTime) * progress / 100 + startTime;
62
- const curStartTime = dayjs().startOf(timeType).unix(); // 当前时间开始
63
- const curEndTime = dayjs().endOf(timeType).unix(); // 当前时间结束
64
- if (endTime < curEndTime) return { barColor: "#990000", cBarColor, state: "延期未完成" }; // 延期已结束(未完成,当前时间>任务结束时间)
65
- if (progress > 0) {
66
- if (curEndTime < progressTime) return { barColor: "#52c41a", cBarColor, state: "进度领先" }; // 进度快
67
- if (curStartTime > progressTime) return { barColor: "#faad14", cBarColor, state: "进度滞后" }; // 延期已开始(未完成,当前时间<任务结束时间)
68
- } else if (startTime < curEndTime) { // 延期未开始
69
- return { barColor: "#ff0000", cBarColor, state: "延期未开始" };
70
- }
71
- return { barColor: undefined, cBarColor, state: progress > 0 ? "进行中" : "未开始" };
72
- };
73
-
74
- // 时间刻度配置
75
- const timeScales = {
76
- year: [{ unit: "year", format: "YYYY年" }],
77
- month: [{ unit: "year", format: "YYYY年" }, { unit: "month", format: "MM月" }],
78
- day: [{ unit: "month", format: "MM月" }, { unit: "day", format: "DD日" }],
79
- hour: [{ unit: "day", format: "MM月DD日" }, { unit: "hour", format: "HH:mm" }],
80
- minute: [{ unit: "hour", format: "MM-DD HH:mm" }, { unit: "minute", format: "mm" }]
81
- };
82
- // 智能缩放配置
83
- const zoomScale = ({ translate, colorText }) => {
84
- const timeTypes = ["year", "month", "day", "hour", "minute"];
85
- const levels = timeTypes.map(t => timeScales[t].map(r => ({
86
- unit: r.unit,
87
- step: 1,
88
- format: date => translate("$" + `{${dayjs(date.startDate).format(r.format)}}`),
89
- style: { fontSize: 14, fontWeight: 500, color: colorText }
90
- })));
91
- return { enabled: true, levels }
92
- };
93
-
94
- type Props = {
95
- dataSource?: any[];
96
- serverKey?: string;
97
- sourceId?: string;
98
- loading?: boolean;
99
- ltmplConfig?: LtmplConfig;
100
- onRefresh?: () => void; // 刷新数据
101
- showView?: (showVievParam: ShowViewParam) => void;
102
- errorText?: string;
103
- getChildrenData?: (code?: string) => void;
104
- };
105
-
106
- const Index = (props: Props) => {
107
- const { dataSource, serverKey, sourceId, loading, ltmplConfig, onRefresh, showView, errorText, getChildrenData } = props;
108
- const { extDisplayConfig, gttTableProportion, gttBeginTime, gttEndTime, gttEditable, gttHideTable, gttProgress, gttTableColumns, gttTimeUint, gttType, gttSubOpenRatmplId, gttLatestProgressTime } = ltmplConfig || {};
109
- const { primaryColumn } = extDisplayConfig || {};
110
- const [ganttHeight, setGanttHeight] = useState<number>(120);
111
- const [ganttInstance, setGanttInstance] = useState<any>();
112
- const [popconfirmOpen, setPopconfirmOpen] = useState<boolean>(false);
113
- const [popconfirmRect, setPopconfirmRect] = useState<{ top: number, left: number }>({ top: 0, left: 0 });
114
- const [currentData, setCurrentData] = useState<any>(null);
115
- const [currentChangeData, setCurrentChangeData] = useState<any>(null);
116
- const [ganttData, setGanttData] = useState<object[]>([]);
117
- const [detailOpen, setDetailOpen] = useState<boolean>(false);
118
- const [detailRect, setDetailRect] = useState<{ top: number, left: number }>({ top: 0, left: 0 });
119
- const [expandedCodes, setExpandedCodes] = useState<string[]>([]);
120
- const { translate } = useLocale();
121
- const ganttRef = useRef<HTMLDivElement>(null);
122
- const isEditRef = useRef<boolean>(true); // 甘特图是否编辑Ref
123
- const { token: ganttTheme } = theme.useToken();
124
- const version = localStorage.getItem("version");
125
-
126
- useEffect(() => { // option 中使用,当前存在编辑项,其他项不可编辑
127
- isEditRef.current = !popconfirmOpen;
128
- }, [popconfirmOpen]);
129
-
130
- // 提示信息
131
- const warnMessage = useMemo(() => {
132
- const warnList = ["gttBeginTime", "gttEndTime", "gttProgress", "gttTimeUint"].map((item) => {
133
- if (ltmplConfig[item]) {
134
- return "";
135
- }
136
- return configTitle[item];
137
- }).filter(Boolean).join("、");
138
- return warnList ? `${warnList}${translate("${未配置}")}` : "";
139
- }, [ltmplConfig]);
140
-
141
- // 处理数据
142
- const handleChangeData = (data) => data?.map(r => ({ ...r, hierarchyState: expandedCodes.includes(r.code) ? "expand" : "collapse", type: r[gttType?.id] || "task", children: r.children?.length ? handleChangeData(r.children) : !!gttSubOpenRatmplId }));
143
-
144
- // 数据处理,存在表格类型配置,默认任务条类型
145
- const handleInitData = () => {
146
- let data = dataSource;
147
- if (!gttType?.id && !gttSubOpenRatmplId) {
148
- data = dataSource;
149
- } else { // 存在任务类型配置、存在子任务模板id
150
- data = handleChangeData(dataSource);
151
- }
152
- setGanttData(data);
153
- }
154
-
155
- useEffect(() => {
156
- handleInitData();
157
- }, [dataSource]);
158
-
159
- // 甘特图配置
160
- const option: any = useMemo(() => {
161
- const { buttons } = ltmplConfig;
162
- const { colorBorderSecondary, colorFillQuaternary, colorText, colorPrimaryBorder, colorPrimary } = ganttTheme;
163
- const defStyle = { borderColor: colorBorderSecondary, bgColor: colorFillQuaternary }
164
- const styleMap = { v2: defStyle, v3: { borderColor: "#15325b", bgColor: "#0e346a" }, v4: { ...defStyle, bgColor: "#0a3155" }, v5: defStyle };
165
- const { borderColor, bgColor } = styleMap[version] || defStyle;
166
- const leftColumns = []; // 表格左侧固定列
167
- const rightColumns = []; // 表格右侧固定列
168
- let tableColumns = []; // 表格列
169
- gttTableColumns?.forEach((col, index) => {
170
- const item = {
171
- field: col.id,
172
- title: col.title,
173
- width: col.colWidth || 'auto',
174
- tree: index === 0,
175
- };
176
- if (col.colFixed === "left") {
177
- leftColumns.push(item);
178
- return;
179
- }
180
- if (col.colFixed === "right") {
181
- rightColumns.push(item);
182
- return;
183
- }
184
- tableColumns.push(item);
185
- });
186
- tableColumns = [...leftColumns, ...tableColumns, ...rightColumns];
187
- const isEdit = buttons.includes("dtmplEdit") && gttEditable; // 任务条是否可编辑
188
- return {
189
- overscrollBehavior: 'auto',
190
- records: [],
191
- underlayBackgroundColor: "transparent",
192
- taskListTable: {
193
- tableWidth: (gttHideTable || gttTableProportion === 0) ? 0 : (gttTableProportion || "auto"), // 隐藏表格宽度设置0
194
- columns: tableColumns,
195
- select: { disableSelect: true },
196
- hover: { disableHover: true },
197
- theme: {
198
- headerStyle: {
199
- borderColor,
200
- color: colorText,
201
- borderLineWidth: 1,
202
- fontSize: 14,
203
- fontWeight: 500,
204
- bgColor
205
- },
206
- bodyStyle: {
207
- borderColor,
208
- borderLineWidth: 1,
209
- fontSize: 14,
210
- color: colorText,
211
- bgColor: "transparent"
212
- }
213
- },
214
- frozenColCount: leftColumns.length, // 左侧固定列数
215
- rightFrozenColCount: rightColumns.length, // 右侧固定列数
216
- },
217
- frame: {
218
- outerFrameStyle: {
219
- borderLineWidth: 1,
220
- borderColor,
221
- cornerRadius: 8
222
- },
223
- verticalSplitLine: {
224
- lineColor: borderColor,
225
- lineWidth: 1
226
- },
227
- horizontalSplitLine: {
228
- lineColor: borderColor,
229
- lineWidth: 1
230
- },
231
- verticalSplitLineMoveable: !gttHideTable, // 是否可移动垂直分割线(隐藏表格则不可移动)
232
- verticalSplitLineHighlight: { lineWidth: 1 }
233
- },
234
- grid: {
235
- verticalLine: { lineWidth: 1, lineColor: borderColor },
236
- horizontalLine: { lineWidth: 1, lineColor: borderColor },
237
- },
238
- headerRowHeight: 38,
239
- rowHeight: 38,
240
- taskBar: {
241
- startDateField: gttBeginTime?.id,
242
- endDateField: gttEndTime?.id,
243
- progressField: gttProgress?.id,
244
- resizable: () => isEdit ? isEditRef.current : false, // 存在编辑任务条时其他任务不可编辑
245
- moveable: () => isEdit ? isEditRef.current : false,
246
- progressAdjustable: () => isEdit ? isEditRef.current : false,
247
- hoverBarStyle: { barOverlayColor: 'rgba(99, 144, 0, 0)' },
248
- labelText: `{${primaryColumn?.id}} {${gttProgress?.id}}%`,
249
- labelTextStyle: {
250
- fontFamily: 'Arial',
251
- fontSize: 12,
252
- textAlign: 'left',
253
- textOverflow: 'ellipsis',
254
- color: "#ffffff"
255
- },
256
- barStyle: (args) => {
257
- const { startDate, endDate, taskRecord } = args;
258
- const { barColor, cBarColor } = handleProgressBgColor({ startDate, endDate, taskRecord, gttLatestProgressTime, gttProgress, timeType: gttTimeUint as OpUnitType }) || {};
259
- return {
260
- width: 20,
261
- barColor: barColor || colorPrimaryBorder,
262
- completedBarColor: cBarColor || colorPrimary,
263
- cornerRadius: 8,
264
- }
265
- },
266
- milestoneStyle: {
267
- borderColor,
268
- borderLineWidth: 1,
269
- fillColor: colorPrimary,
270
- width: 15
271
- }
272
- },
273
- markLine: {
274
- scrollToMarkLine: true,
275
- position: "right",
276
- date: dayjs().format(timeFormat[gttTimeUint]),
277
- style: { lineDash: [4, 4] },
278
- },
279
- timelineHeader: {
280
- colWidth: 100,
281
- backgroundColor: bgColor,
282
- horizontalLine: { lineWidth: 1, lineColor: borderColor },
283
- verticalLine: { lineWidth: 1, lineColor: borderColor },
284
- zoomScale: zoomScale({ translate, colorText })
285
- },
286
- scrollStyle: {
287
- scrollRailColor: "transparent",
288
- visible: 'scrolling',
289
- width: 6,
290
- scrollSliderCornerRadius: 4,
291
- scrollSliderColor: colorPrimaryBorder,
292
- }
293
- };
294
- }, [version, ltmplConfig]);
295
-
296
- // 计算甘特图高度
297
- const handleGanttHeight = () => {
298
- const itemHeight = 38;
299
- const temHieght = (dataSource.length + timeScales[gttTimeUint]?.length || 2) * itemHeight + 3;
300
- setGanttHeight(temHieght);
301
- };
302
-
303
- // 设置甘特图时间范围,处理甘特图默认显示范围
304
- const handleUpdateDateRange = () => {
305
- const times = [dayjs().valueOf()];
306
- dataSource.forEach(r => {
307
- const sTime = r[gttBeginTime.id];
308
- const eTime = r[gttEndTime.id];
309
- if (sTime && eTime) {
310
- times.push(dayjs(sTime).valueOf(), dayjs(eTime).valueOf());
311
- }
312
- });
313
- const minTime = Math.min(...times);
314
- const maxTime = Math.max(...times);
315
- const minDate = dayjs(minTime).subtract(2, gttTimeUint as any).format(timeFormat[gttTimeUint]);
316
- const maxDate = dayjs(maxTime).add(2, gttTimeUint as any).format(timeFormat[gttTimeUint]);
317
- ganttInstance.updateDateRange(minDate, maxDate); // 更新甘特图时间范围
318
- };
319
-
320
- // 更新甘特图任务时间、进度
321
- const handleUpdateTask = async () => {
322
- if (!currentChangeData) {
323
- return;
324
- }
325
- let res = await HcserviceV3.postLtmplData(
326
- serverKey,
327
- sourceId,
328
- currentChangeData,
329
- message
330
- );
331
- if (res.status === "success") {
332
- setPopconfirmOpen(false);
333
- setCurrentChangeData(null);
334
- onRefresh();
335
- }
336
- };
337
-
338
- // 甘特图时间变化处理
339
- const changeDateRange = (event, gantt) => {
340
- const { index, record, startDate, endDate, oldEndDate, oldStartDate } = event;
341
- const { top, left, width } = gantt.getTaskBarRelativeRect(index);
342
- const canvasWidth = gantt.getElement().clientWidth;
343
- setPopconfirmOpen(true);
344
- const format = timeFormat[gttTimeUint];
345
- const changeStart = dayjs(oldStartDate).format(format) !== dayjs(startDate).format(format);
346
- const changeEnd = dayjs(oldEndDate).format(format) !== dayjs(endDate).format(format);
347
- const temLeft = (changeStart && changeEnd) ? (left + width / 2) : changeEnd ? (left + width) : left;
348
- setPopconfirmRect({ top: top - 86, left: (temLeft > canvasWidth - 200 || temLeft < 0) ? canvasWidth / 2 : temLeft - 40 });
349
- const dtmplData = { "唯一编码": record.code, [gttBeginTime.id]: startDate, [gttEndTime.id]: endDate };
350
- setCurrentChangeData(dtmplData);
351
- }
352
-
353
- // 甘特图进度变化处理
354
- const changeProgress = (event, gantt) => {
355
- const { index, record, progress } = event;
356
- const { top, left, width } = gantt.getTaskBarRelativeRect(index);
357
- setPopconfirmOpen(true);
358
- setPopconfirmRect({ top: top - 86, left: width * progress / 100 + left - 40 });
359
- const dtmplData = { "唯一编码": record.code, [gttProgress.id]: progress };
360
- setCurrentChangeData(dtmplData);
361
- }
362
-
363
- // 任务条点击查看详情
364
- const handleClickTaskBar = (event) => {
365
- if (!showView) return;
366
- const { buttons } = ltmplConfig;
367
- const { record } = event;
368
- if (buttons.includes("customDetail")) {
369
- showView({ code: record.code, toCustomPage: true });
370
- return;
371
- }
372
- if (buttons.includes("detail")) {
373
- showView({ code: record.code });
374
- return;
375
- }
376
- }
377
-
378
- // 懒加载子节点
379
- const getTaskTreeData = async (event, gantt) => {
380
- const { originData, col, row, hierarchyState } = event;
381
- const itemData = gantt.taskListTableInstance.getRecordByCell(col, row); // 获取当前单元格对应的完整数据
382
- setExpandedCodes(val => hierarchyState === "collapse" ? val.filter(c => c !== itemData.code) : [...val, originData.code]);
383
- if (hierarchyState === "collapse" || originData.children !== true) return;
384
- gantt.taskListTableInstance.setLoadingHierarchyState(col, row);
385
- await getChildrenData(originData.code);
386
- }
387
-
388
- useEffect(() => {
389
- if (dataSource?.length && !ganttInstance && !warnMessage) {
390
- const gantt = new Gantt(ganttRef.current, option);
391
- gantt.zoomScaleManager.setZoomPosition({ minUnit: gttTimeUint, step: 1, colWidth: 100 }); // 设置默认缩放状态
392
- setGanttInstance(gantt);
393
- gantt.on('click_task_bar', handleClickTaskBar);
394
- // 任务时间变化监听
395
- gantt.on('change_date_range', (event) => changeDateRange(event, gantt));
396
- // 任务进度更新监听
397
- gantt.on('progress_update', (event) => changeProgress(event, gantt));
398
- // 鼠标移入任务条事件,显示详情
399
- gantt.on("mouseenter_task_bar", (event) => {
400
- const { x, y } = event.federatedEvent.canvas as any || {};
401
- const { canvasWidth } = gantt.taskListTableInstance || {};
402
- setCurrentData(event.record);
403
- setDetailRect({ top: y + 10, left: x + canvasWidth - 112 });
404
- setDetailOpen(true);
405
- });
406
- // 鼠标移出,隐藏详情弹窗
407
- gantt.on("mouseleave_task_bar", () => {
408
- setCurrentData(undefined);
409
- setDetailOpen(false);
410
- });
411
- // 任务树懒加载
412
- gantt.taskListTableInstance.on("tree_hierarchy_state_change", (event) => getTaskTreeData(event, gantt));
413
- }
414
- }, [dataSource, option]);
415
-
416
- useEffect(() => {
417
- if (ganttInstance && ganttData?.length) {
418
- handleGanttHeight(); // 计算甘特图高度
419
- handleUpdateDateRange();
420
- ganttInstance.updateOption({
421
- ...option, // 处理展开分组表格出现空白异常(重绘整个甘特图)
422
- records: cloneDeep(ganttData) // 更新数据
423
- });
424
- // 重置缩放最大值最小值范围(由于官方 updateOption BUG,默认缩放范围异常,暂时处理方法)
425
- ganttInstance.zoomScaleManager.updateZoomLimits();
426
- }
427
- }, [ganttInstance, ganttData]);
428
-
429
- useEffect(() => {
430
- registerLoadingIcon();
431
- return () => {
432
- ganttInstance?.release();
433
- }
434
- }, []);
435
-
436
- // 任务条详情
437
- const renderDetail = () => {
438
- if (!currentData) return "";
439
- const startDate = currentData[gttBeginTime.id];
440
- const endDate = currentData[gttEndTime.id];
441
- const { state } = handleProgressBgColor({ startDate, endDate, taskRecord: currentData, gttLatestProgressTime, gttProgress, timeType: gttTimeUint as OpUnitType }) || {};
442
- const items: DescriptionsProps['items'] = [
443
- primaryColumn && {
444
- key: primaryColumn.id,
445
- label: primaryColumn.title,
446
- children: currentData[primaryColumn.id],
447
- },
448
- gttBeginTime && {
449
- key: "startTime",
450
- label: "开始时间",
451
- children: dayjs(startDate).format(timeFormat[gttTimeUint])
452
- },
453
- gttEndTime && {
454
- key: "endTime",
455
- label: "结束时间",
456
- children: dayjs(endDate).format(timeFormat[gttTimeUint])
457
- },
458
- gttProgress && {
459
- key: "progress",
460
- label: "进度",
461
- children: `${currentData[gttProgress.id] || 0}%`
462
- },
463
- {
464
- key: "state",
465
- label: "状态",
466
- children: state
467
- }
468
- ].filter(Boolean);
469
- return <Descriptions size="small" style={{ width: 200 }} column={1} items={items} />;
470
- }
471
-
472
- return (
473
- <div className="gantt" style={{ height: ganttHeight }}>
474
- <Spin spinning={loading}>
475
- {(dataSource?.length && !warnMessage) ?
476
- <div ref={ganttRef} style={{ height: "100%", position: "relative" }} /> :
477
- <Empty image={Empty.PRESENTED_IMAGE_SIMPLE} style={{ padding: "32px 0", margin: 0 }} description={warnMessage || errorText || undefined} styles={errorText ? { description: { color: "#ff4d4f" } } : {}} />
478
- }
479
- </Spin>
480
- <Popconfirm
481
- placement="top"
482
- styles={{ root: { height: "fit-content", ...popconfirmRect } }}
483
- title={translate("${确定要[更新]此数据吗}?")}
484
- onConfirm={handleUpdateTask}
485
- onCancel={() => {
486
- setPopconfirmOpen(false);
487
- setCurrentChangeData(null);
488
- ganttInstance.setRecords(cloneDeep(ganttData));
489
- }}
490
- okText={translate("${确定}")}
491
- cancelText={translate("${取消}")}
492
- open={popconfirmOpen}
493
- getPopupContainer={() => ganttRef.current}
494
- destroyOnHidden={true}
495
- />
496
- <Popover
497
- styles={{ root: { ...detailRect } }}
498
- content={() => renderDetail()}
499
- open={detailOpen}
500
- placement="bottom"
501
- autoAdjustOverflow={false}
502
- destroyOnHidden={true}
503
- getPopupContainer={() => ganttRef.current}
504
- />
505
- </div>);
506
- };
507
-
508
- export default Index;
1
+ import React, { useMemo, useEffect, useState, useRef } from "react";
2
+ import { Spin, Empty, theme, Popconfirm, message, Popover, Descriptions, DescriptionsProps } from "antd";
3
+ import { Gantt, VTable } from '@visactor/vtable-gantt';
4
+ import dayjs, { OpUnitType } from "dayjs";
5
+ import cloneDeep from "lodash/cloneDeep";
6
+ import HcserviceV3 from "../../tmpl/hcservice-v3";
7
+ import { LtmplConfig, ShowViewParam, ColumnConfig } from "../../tmpl/interface";
8
+ import { useLocale } from "../../locale/useLocale";
9
+ import loadingIcon from "./img/loading-circle.gif";
10
+ import "./index.less";
11
+
12
+ // 注册树形表格懒加载loading图标
13
+ const registerLoadingIcon = () => {
14
+ VTable.register.icon('loading', {
15
+ type: 'image',
16
+ width: 16,
17
+ height: 16,
18
+ src: loadingIcon,
19
+ name: 'loading', //定义图标的名称,在内部会作为缓存的key值
20
+ positionType: VTable.TYPES.IconPosition.absoluteRight, // 指定位置,可以在文本的前后,或者在绝对定位在单元格的左侧右侧
21
+ marginLeft: 0, // 左侧内容间隔 在特定位置position中起作用
22
+ marginRight: 4, // 右侧内容间隔 在特定位置position中起作用
23
+ visibleTime: 'always', // 显示时机, 'always' | 'mouseover_cell' | 'click_cell'
24
+ hover: {
25
+ // 热区大小
26
+ width: 22,
27
+ height: 22,
28
+ bgColor: 'rgba(101,117,168,0.1)'
29
+ },
30
+ isGif: true
31
+ });
32
+ }
33
+
34
+ // 配置标题,用于提示未配置
35
+ const configTitle = {
36
+ gttBeginTime: "开始时间",
37
+ gttEndTime: "结束时间",
38
+ gttProgress: "进度",
39
+ gttTimeUint: "时间单位"
40
+ };
41
+
42
+ const timeFormat = { "year": "YYYY", "month": "YYYY-MM", "day": "YYYY-MM-DD", "hour": "YYYY-MM-DD HH:mm", "minute": "YYYY-MM-DD HH:mm" };
43
+
44
+ // 动态设置任务条背景色
45
+ const handleProgressBgColor = (args: { startDate?: string, endDate: string, taskRecord: { [key: string]: any }, gttLatestProgressTime: ColumnConfig; gttProgress: ColumnConfig, timeType: OpUnitType }) => {
46
+ const { startDate, endDate, taskRecord, gttProgress, timeType, gttLatestProgressTime } = args;
47
+ const progress = Number(taskRecord[gttProgress?.id] || 0);
48
+ let cBarColor = undefined; // 任务条已完成颜色,默认主题色
49
+ let state = "-";
50
+ if (taskRecord[gttLatestProgressTime?.id] && progress >= 100) { // 任务延迟完成(任务完成时间>任务结束时间)
51
+ const progressTime = dayjs(taskRecord[gttLatestProgressTime?.id]).unix();
52
+ const endTime = dayjs(endDate).unix();
53
+ if (progressTime > endTime) {
54
+ cBarColor = "#ad6800";
55
+ state = "延期完成";
56
+ }
57
+ }
58
+ if (progress >= 100) return { barColor: undefined, cBarColor, state: state || "已完成" }; // 已完成
59
+ const startTime = dayjs(startDate).startOf(timeType).unix();
60
+ const endTime = dayjs(endDate).endOf(timeType).unix();
61
+ const progressTime = (endTime - startTime) * progress / 100 + startTime;
62
+ const curStartTime = dayjs().startOf(timeType).unix(); // 当前时间开始
63
+ const curEndTime = dayjs().endOf(timeType).unix(); // 当前时间结束
64
+ if (endTime < curEndTime) return { barColor: "#990000", cBarColor, state: "延期未完成" }; // 延期已结束(未完成,当前时间>任务结束时间)
65
+ if (progress > 0) {
66
+ if (curEndTime < progressTime) return { barColor: "#52c41a", cBarColor, state: "进度领先" }; // 进度快
67
+ if (curStartTime > progressTime) return { barColor: "#faad14", cBarColor, state: "进度滞后" }; // 延期已开始(未完成,当前时间<任务结束时间)
68
+ } else if (startTime < curEndTime) { // 延期未开始
69
+ return { barColor: "#ff0000", cBarColor, state: "延期未开始" };
70
+ }
71
+ return { barColor: undefined, cBarColor, state: progress > 0 ? "进行中" : "未开始" };
72
+ };
73
+
74
+ // 时间刻度配置
75
+ const timeScales = {
76
+ year: [{ unit: "year", format: "YYYY年" }],
77
+ month: [{ unit: "year", format: "YYYY年" }, { unit: "month", format: "MM月" }],
78
+ day: [{ unit: "month", format: "MM月" }, { unit: "day", format: "DD日" }],
79
+ hour: [{ unit: "day", format: "MM月DD日" }, { unit: "hour", format: "HH:mm" }],
80
+ minute: [{ unit: "hour", format: "MM-DD HH:mm" }, { unit: "minute", format: "mm" }]
81
+ };
82
+ // 智能缩放配置
83
+ const zoomScale = ({ translate, colorText }) => {
84
+ const timeTypes = ["year", "month", "day", "hour", "minute"];
85
+ const levels = timeTypes.map(t => timeScales[t].map(r => ({
86
+ unit: r.unit,
87
+ step: 1,
88
+ format: date => translate("$" + `{${dayjs(date.startDate).format(r.format)}}`),
89
+ style: { fontSize: 14, fontWeight: 500, color: colorText }
90
+ })));
91
+ return { enabled: true, levels }
92
+ };
93
+
94
+ type Props = {
95
+ dataSource?: any[];
96
+ serverKey?: string;
97
+ sourceId?: string;
98
+ loading?: boolean;
99
+ ltmplConfig?: LtmplConfig;
100
+ onRefresh?: () => void; // 刷新数据
101
+ showView?: (showVievParam: ShowViewParam) => void;
102
+ errorText?: string;
103
+ getChildrenData?: (code?: string) => void;
104
+ };
105
+
106
+ const Index = (props: Props) => {
107
+ const { dataSource, serverKey, sourceId, loading, ltmplConfig, onRefresh, showView, errorText, getChildrenData } = props;
108
+ const { extDisplayConfig, gttTableProportion, gttBeginTime, gttEndTime, gttEditable, gttHideTable, gttProgress, gttTableColumns, gttTimeUint, gttType, gttSubOpenRatmplId, gttLatestProgressTime } = ltmplConfig || {};
109
+ const { primaryColumn } = extDisplayConfig || {};
110
+ const [ganttHeight, setGanttHeight] = useState<number>(120);
111
+ const [ganttInstance, setGanttInstance] = useState<any>();
112
+ const [popconfirmOpen, setPopconfirmOpen] = useState<boolean>(false);
113
+ const [popconfirmRect, setPopconfirmRect] = useState<{ top: number, left: number }>({ top: 0, left: 0 });
114
+ const [currentData, setCurrentData] = useState<any>(null);
115
+ const [currentChangeData, setCurrentChangeData] = useState<any>(null);
116
+ const [ganttData, setGanttData] = useState<object[]>([]);
117
+ const [detailOpen, setDetailOpen] = useState<boolean>(false);
118
+ const [detailRect, setDetailRect] = useState<{ top: number, left: number }>({ top: 0, left: 0 });
119
+ const [expandedCodes, setExpandedCodes] = useState<string[]>([]);
120
+ const { translate } = useLocale();
121
+ const ganttRef = useRef<HTMLDivElement>(null);
122
+ const isEditRef = useRef<boolean>(true); // 甘特图是否编辑Ref
123
+ const { token: ganttTheme } = theme.useToken();
124
+ const version = localStorage.getItem("version");
125
+
126
+ useEffect(() => { // option 中使用,当前存在编辑项,其他项不可编辑
127
+ isEditRef.current = !popconfirmOpen;
128
+ }, [popconfirmOpen]);
129
+
130
+ // 提示信息
131
+ const warnMessage = useMemo(() => {
132
+ const warnList = ["gttBeginTime", "gttEndTime", "gttProgress", "gttTimeUint"].map((item) => {
133
+ if (ltmplConfig[item]) {
134
+ return "";
135
+ }
136
+ return configTitle[item];
137
+ }).filter(Boolean).join("、");
138
+ return warnList ? `${warnList}${translate("${未配置}")}` : "";
139
+ }, [ltmplConfig]);
140
+
141
+ // 处理数据
142
+ const handleChangeData = (data) => data?.map(r => ({ ...r, hierarchyState: expandedCodes.includes(r.code) ? "expand" : "collapse", type: r[gttType?.id] || "task", children: r.children?.length ? handleChangeData(r.children) : !!gttSubOpenRatmplId }));
143
+
144
+ // 数据处理,存在表格类型配置,默认任务条类型
145
+ const handleInitData = () => {
146
+ let data = dataSource;
147
+ if (!gttType?.id && !gttSubOpenRatmplId) {
148
+ data = dataSource;
149
+ } else { // 存在任务类型配置、存在子任务模板id
150
+ data = handleChangeData(dataSource);
151
+ }
152
+ setGanttData(data);
153
+ }
154
+
155
+ useEffect(() => {
156
+ handleInitData();
157
+ }, [dataSource]);
158
+
159
+ // 甘特图配置
160
+ const option: any = useMemo(() => {
161
+ const { buttons } = ltmplConfig;
162
+ const { colorBorderSecondary, colorFillQuaternary, colorText, colorPrimaryBorder, colorPrimary } = ganttTheme;
163
+ const defStyle = { borderColor: colorBorderSecondary, bgColor: colorFillQuaternary }
164
+ const styleMap = { v2: defStyle, v3: { borderColor: "#15325b", bgColor: "#0e346a" }, v4: { ...defStyle, bgColor: "#0a3155" }, v5: defStyle };
165
+ const { borderColor, bgColor } = styleMap[version] || defStyle;
166
+ const leftColumns = []; // 表格左侧固定列
167
+ const rightColumns = []; // 表格右侧固定列
168
+ let tableColumns = []; // 表格列
169
+ gttTableColumns?.forEach((col, index) => {
170
+ const item = {
171
+ field: col.id,
172
+ title: col.title,
173
+ width: col.colWidth || 'auto',
174
+ tree: index === 0,
175
+ };
176
+ if (col.colFixed === "left") {
177
+ leftColumns.push(item);
178
+ return;
179
+ }
180
+ if (col.colFixed === "right") {
181
+ rightColumns.push(item);
182
+ return;
183
+ }
184
+ tableColumns.push(item);
185
+ });
186
+ tableColumns = [...leftColumns, ...tableColumns, ...rightColumns];
187
+ const isEdit = buttons.includes("dtmplEdit") && gttEditable; // 任务条是否可编辑
188
+ return {
189
+ overscrollBehavior: 'auto',
190
+ records: [],
191
+ underlayBackgroundColor: "transparent",
192
+ taskListTable: {
193
+ tableWidth: (gttHideTable || gttTableProportion === 0) ? 0 : (gttTableProportion || "auto"), // 隐藏表格宽度设置0
194
+ columns: tableColumns,
195
+ select: { disableSelect: true },
196
+ hover: { disableHover: true },
197
+ theme: {
198
+ headerStyle: {
199
+ borderColor,
200
+ color: colorText,
201
+ borderLineWidth: 1,
202
+ fontSize: 14,
203
+ fontWeight: 500,
204
+ bgColor
205
+ },
206
+ bodyStyle: {
207
+ borderColor,
208
+ borderLineWidth: 1,
209
+ fontSize: 14,
210
+ color: colorText,
211
+ bgColor: "transparent"
212
+ }
213
+ },
214
+ frozenColCount: leftColumns.length, // 左侧固定列数
215
+ rightFrozenColCount: rightColumns.length, // 右侧固定列数
216
+ },
217
+ frame: {
218
+ outerFrameStyle: {
219
+ borderLineWidth: 1,
220
+ borderColor,
221
+ cornerRadius: 8
222
+ },
223
+ verticalSplitLine: {
224
+ lineColor: borderColor,
225
+ lineWidth: 1
226
+ },
227
+ horizontalSplitLine: {
228
+ lineColor: borderColor,
229
+ lineWidth: 1
230
+ },
231
+ verticalSplitLineMoveable: !gttHideTable, // 是否可移动垂直分割线(隐藏表格则不可移动)
232
+ verticalSplitLineHighlight: { lineWidth: 1 }
233
+ },
234
+ grid: {
235
+ verticalLine: { lineWidth: 1, lineColor: borderColor },
236
+ horizontalLine: { lineWidth: 1, lineColor: borderColor },
237
+ },
238
+ headerRowHeight: 38,
239
+ rowHeight: 38,
240
+ taskBar: {
241
+ startDateField: gttBeginTime?.id,
242
+ endDateField: gttEndTime?.id,
243
+ progressField: gttProgress?.id,
244
+ resizable: () => isEdit ? isEditRef.current : false, // 存在编辑任务条时其他任务不可编辑
245
+ moveable: () => isEdit ? isEditRef.current : false,
246
+ progressAdjustable: () => isEdit ? isEditRef.current : false,
247
+ hoverBarStyle: { barOverlayColor: 'rgba(99, 144, 0, 0)' },
248
+ labelText: `{${primaryColumn?.id}} {${gttProgress?.id}}%`,
249
+ labelTextStyle: {
250
+ fontFamily: 'Arial',
251
+ fontSize: 12,
252
+ textAlign: 'left',
253
+ textOverflow: 'ellipsis',
254
+ color: "#ffffff"
255
+ },
256
+ barStyle: (args) => {
257
+ const { startDate, endDate, taskRecord } = args;
258
+ const { barColor, cBarColor } = handleProgressBgColor({ startDate, endDate, taskRecord, gttLatestProgressTime, gttProgress, timeType: gttTimeUint as OpUnitType }) || {};
259
+ return {
260
+ width: 20,
261
+ barColor: barColor || colorPrimaryBorder,
262
+ completedBarColor: cBarColor || colorPrimary,
263
+ cornerRadius: 8,
264
+ }
265
+ },
266
+ milestoneStyle: {
267
+ borderColor,
268
+ borderLineWidth: 1,
269
+ fillColor: colorPrimary,
270
+ width: 15
271
+ }
272
+ },
273
+ markLine: {
274
+ scrollToMarkLine: true,
275
+ position: "right",
276
+ date: dayjs().format(timeFormat[gttTimeUint]),
277
+ style: { lineDash: [4, 4] },
278
+ },
279
+ timelineHeader: {
280
+ colWidth: 100,
281
+ backgroundColor: bgColor,
282
+ horizontalLine: { lineWidth: 1, lineColor: borderColor },
283
+ verticalLine: { lineWidth: 1, lineColor: borderColor },
284
+ zoomScale: zoomScale({ translate, colorText })
285
+ },
286
+ scrollStyle: {
287
+ scrollRailColor: "transparent",
288
+ visible: 'scrolling',
289
+ width: 6,
290
+ scrollSliderCornerRadius: 4,
291
+ scrollSliderColor: colorPrimaryBorder,
292
+ }
293
+ };
294
+ }, [version, ltmplConfig]);
295
+
296
+ // 计算甘特图高度
297
+ const handleGanttHeight = () => {
298
+ const itemHeight = 38;
299
+ const temHieght = (dataSource.length + timeScales[gttTimeUint]?.length || 2) * itemHeight + 3;
300
+ setGanttHeight(temHieght);
301
+ };
302
+
303
+ // 设置甘特图时间范围,处理甘特图默认显示范围
304
+ const handleUpdateDateRange = () => {
305
+ const times = [dayjs().valueOf()];
306
+ dataSource.forEach(r => {
307
+ const sTime = r[gttBeginTime.id];
308
+ const eTime = r[gttEndTime.id];
309
+ if (sTime && eTime) {
310
+ times.push(dayjs(sTime).valueOf(), dayjs(eTime).valueOf());
311
+ }
312
+ });
313
+ const minTime = Math.min(...times);
314
+ const maxTime = Math.max(...times);
315
+ const minDate = dayjs(minTime).subtract(2, gttTimeUint as any).format(timeFormat[gttTimeUint]);
316
+ const maxDate = dayjs(maxTime).add(2, gttTimeUint as any).format(timeFormat[gttTimeUint]);
317
+ ganttInstance.updateDateRange(minDate, maxDate); // 更新甘特图时间范围
318
+ };
319
+
320
+ // 更新甘特图任务时间、进度
321
+ const handleUpdateTask = async () => {
322
+ if (!currentChangeData) {
323
+ return;
324
+ }
325
+ let res = await HcserviceV3.postLtmplData(
326
+ serverKey,
327
+ sourceId,
328
+ currentChangeData,
329
+ message
330
+ );
331
+ if (res.status === "success") {
332
+ setPopconfirmOpen(false);
333
+ setCurrentChangeData(null);
334
+ onRefresh();
335
+ }
336
+ };
337
+
338
+ // 甘特图时间变化处理
339
+ const changeDateRange = (event, gantt) => {
340
+ const { index, record, startDate, endDate, oldEndDate, oldStartDate } = event;
341
+ const { top, left, width } = gantt.getTaskBarRelativeRect(index);
342
+ const canvasWidth = gantt.getElement().clientWidth;
343
+ setPopconfirmOpen(true);
344
+ const format = timeFormat[gttTimeUint];
345
+ const changeStart = dayjs(oldStartDate).format(format) !== dayjs(startDate).format(format);
346
+ const changeEnd = dayjs(oldEndDate).format(format) !== dayjs(endDate).format(format);
347
+ const temLeft = (changeStart && changeEnd) ? (left + width / 2) : changeEnd ? (left + width) : left;
348
+ setPopconfirmRect({ top: top - 86, left: (temLeft > canvasWidth - 200 || temLeft < 0) ? canvasWidth / 2 : temLeft - 40 });
349
+ const dtmplData = { "唯一编码": record.code, [gttBeginTime.id]: startDate, [gttEndTime.id]: endDate };
350
+ setCurrentChangeData(dtmplData);
351
+ }
352
+
353
+ // 甘特图进度变化处理
354
+ const changeProgress = (event, gantt) => {
355
+ const { index, record, progress } = event;
356
+ const { top, left, width } = gantt.getTaskBarRelativeRect(index);
357
+ setPopconfirmOpen(true);
358
+ setPopconfirmRect({ top: top - 86, left: width * progress / 100 + left - 40 });
359
+ const dtmplData = { "唯一编码": record.code, [gttProgress.id]: progress };
360
+ setCurrentChangeData(dtmplData);
361
+ }
362
+
363
+ // 任务条点击查看详情
364
+ const handleClickTaskBar = (event) => {
365
+ if (!showView) return;
366
+ const { buttons } = ltmplConfig;
367
+ const { record } = event;
368
+ if (buttons.includes("customDetail")) {
369
+ showView({ code: record.code, toCustomPage: true });
370
+ return;
371
+ }
372
+ if (buttons.includes("detail")) {
373
+ showView({ code: record.code });
374
+ return;
375
+ }
376
+ }
377
+
378
+ // 懒加载子节点
379
+ const getTaskTreeData = async (event, gantt) => {
380
+ const { originData, col, row, hierarchyState } = event;
381
+ const itemData = gantt.taskListTableInstance.getRecordByCell(col, row); // 获取当前单元格对应的完整数据
382
+ setExpandedCodes(val => hierarchyState === "collapse" ? val.filter(c => c !== itemData.code) : [...val, originData.code]);
383
+ if (hierarchyState === "collapse" || originData.children !== true) return;
384
+ gantt.taskListTableInstance.setLoadingHierarchyState(col, row);
385
+ await getChildrenData(originData.code);
386
+ }
387
+
388
+ useEffect(() => {
389
+ if (dataSource?.length && !ganttInstance && !warnMessage) {
390
+ const gantt = new Gantt(ganttRef.current, option);
391
+ gantt.zoomScaleManager.setZoomPosition({ minUnit: gttTimeUint, step: 1, colWidth: 100 }); // 设置默认缩放状态
392
+ setGanttInstance(gantt);
393
+ gantt.on('click_task_bar', handleClickTaskBar);
394
+ // 任务时间变化监听
395
+ gantt.on('change_date_range', (event) => changeDateRange(event, gantt));
396
+ // 任务进度更新监听
397
+ gantt.on('progress_update', (event) => changeProgress(event, gantt));
398
+ // 鼠标移入任务条事件,显示详情
399
+ gantt.on("mouseenter_task_bar", (event) => {
400
+ const { x, y } = event.federatedEvent.canvas as any || {};
401
+ const { canvasWidth } = gantt.taskListTableInstance || {};
402
+ setCurrentData(event.record);
403
+ setDetailRect({ top: y + 10, left: x + canvasWidth - 112 });
404
+ setDetailOpen(true);
405
+ });
406
+ // 鼠标移出,隐藏详情弹窗
407
+ gantt.on("mouseleave_task_bar", () => {
408
+ setCurrentData(undefined);
409
+ setDetailOpen(false);
410
+ });
411
+ // 任务树懒加载
412
+ gantt.taskListTableInstance.on("tree_hierarchy_state_change", (event) => getTaskTreeData(event, gantt));
413
+ }
414
+ }, [dataSource, option]);
415
+
416
+ useEffect(() => {
417
+ if (ganttInstance && ganttData?.length) {
418
+ handleGanttHeight(); // 计算甘特图高度
419
+ handleUpdateDateRange();
420
+ ganttInstance.updateOption({
421
+ ...option, // 处理展开分组表格出现空白异常(重绘整个甘特图)
422
+ records: cloneDeep(ganttData) // 更新数据
423
+ });
424
+ // 重置缩放最大值最小值范围(由于官方 updateOption BUG,默认缩放范围异常,暂时处理方法)
425
+ ganttInstance.zoomScaleManager.updateZoomLimits();
426
+ }
427
+ }, [ganttInstance, ganttData]);
428
+
429
+ useEffect(() => {
430
+ registerLoadingIcon();
431
+ return () => {
432
+ ganttInstance?.release();
433
+ }
434
+ }, []);
435
+
436
+ // 任务条详情
437
+ const renderDetail = () => {
438
+ if (!currentData) return "";
439
+ const startDate = currentData[gttBeginTime.id];
440
+ const endDate = currentData[gttEndTime.id];
441
+ const { state } = handleProgressBgColor({ startDate, endDate, taskRecord: currentData, gttLatestProgressTime, gttProgress, timeType: gttTimeUint as OpUnitType }) || {};
442
+ const items: DescriptionsProps['items'] = [
443
+ primaryColumn && {
444
+ key: primaryColumn.id,
445
+ label: primaryColumn.title,
446
+ children: currentData[primaryColumn.id],
447
+ },
448
+ gttBeginTime && {
449
+ key: "startTime",
450
+ label: "开始时间",
451
+ children: dayjs(startDate).format(timeFormat[gttTimeUint])
452
+ },
453
+ gttEndTime && {
454
+ key: "endTime",
455
+ label: "结束时间",
456
+ children: dayjs(endDate).format(timeFormat[gttTimeUint])
457
+ },
458
+ gttProgress && {
459
+ key: "progress",
460
+ label: "进度",
461
+ children: `${currentData[gttProgress.id] || 0}%`
462
+ },
463
+ {
464
+ key: "state",
465
+ label: "状态",
466
+ children: state
467
+ }
468
+ ].filter(Boolean);
469
+ return <Descriptions size="small" style={{ width: 200 }} column={1} items={items} />;
470
+ }
471
+
472
+ return (
473
+ <div className="gantt" style={{ height: ganttHeight }}>
474
+ <Spin spinning={loading}>
475
+ {(dataSource?.length && !warnMessage) ?
476
+ <div ref={ganttRef} style={{ height: "100%", position: "relative" }} /> :
477
+ <Empty image={Empty.PRESENTED_IMAGE_SIMPLE} style={{ padding: "32px 0", margin: 0 }} description={warnMessage || errorText || undefined} styles={errorText ? { description: { color: "#ff4d4f" } } : {}} />
478
+ }
479
+ </Spin>
480
+ <Popconfirm
481
+ placement="top"
482
+ styles={{ root: { height: "fit-content", ...popconfirmRect } }}
483
+ title={translate("${确定要[更新]此数据吗}?")}
484
+ onConfirm={handleUpdateTask}
485
+ onCancel={() => {
486
+ setPopconfirmOpen(false);
487
+ setCurrentChangeData(null);
488
+ ganttInstance.setRecords(cloneDeep(ganttData));
489
+ }}
490
+ okText={translate("${确定}")}
491
+ cancelText={translate("${取消}")}
492
+ open={popconfirmOpen}
493
+ getPopupContainer={() => ganttRef.current}
494
+ destroyOnHidden={true}
495
+ />
496
+ <Popover
497
+ styles={{ root: { ...detailRect } }}
498
+ content={() => renderDetail()}
499
+ open={detailOpen}
500
+ placement="bottom"
501
+ autoAdjustOverflow={false}
502
+ destroyOnHidden={true}
503
+ getPopupContainer={() => ganttRef.current}
504
+ />
505
+ </div>);
506
+ };
507
+
508
+ export default Index;