aldehyde 0.2.496 → 0.2.498

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 (585) 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 +72 -72
  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.less +60 -60
  50. package/lib/draw-canvas-edit/components/render/components/workstation-component.js +6 -6
  51. package/lib/draw-canvas-edit/index.less +48 -48
  52. package/lib/draw-canvas-view/index.less +66 -66
  53. package/lib/export/export-frame.css +2 -2
  54. package/lib/export/export-frame.d.ts.map +1 -1
  55. package/lib/export/select-code-export-frame.d.ts.map +1 -1
  56. package/lib/form/dtmpl-form.css +3 -3
  57. package/lib/form/dtmpl-form.d.ts.map +1 -1
  58. package/lib/form/field-group-form.d.ts.map +1 -1
  59. package/lib/form/form-Item-group.d.ts.map +1 -1
  60. package/lib/form/index.css +12 -12
  61. package/lib/import/excel-import.d.ts.map +1 -1
  62. package/lib/import/index.css +53 -53
  63. package/lib/import/template.css +50 -50
  64. package/lib/layout/common.css +64 -64
  65. package/lib/layout/coverstyle.css +51 -51
  66. package/lib/layout/footer/index.css +5 -5
  67. package/lib/layout/header/index.css +122 -122
  68. package/lib/layout/menu/block.css +7 -7
  69. package/lib/layout/menu/block.d.ts.map +1 -1
  70. package/lib/layout/menu/l2menu-quick-bar.d.ts.map +1 -1
  71. package/lib/layout/menu/menu-2layers.d.ts.map +1 -1
  72. package/lib/layout/menu/message-bar.less +73 -73
  73. package/lib/layout/menu/reset-password.d.ts.map +1 -1
  74. package/lib/layout/menu/user-bar.d.ts.map +1 -1
  75. package/lib/layout/menu/userinfo-bar.d.ts.map +1 -1
  76. package/lib/layout/sidebar/index.css +57 -57
  77. package/lib/layout2/css/header.css +41 -41
  78. package/lib/layout2/css/sider.less +17 -17
  79. package/lib/layout2/css/tabs-layout.less +18 -18
  80. package/lib/layout3/css/header.less +195 -195
  81. package/lib/layout3/css/main.less +161 -161
  82. package/lib/layout3/css/sider.less +32 -32
  83. package/lib/layout3/css/tabs-layout.less +38 -38
  84. package/lib/layout4/css/header.less +196 -196
  85. package/lib/layout4/css/main.less +154 -154
  86. package/lib/layout4/css/sider.less +37 -37
  87. package/lib/layout4/css/tabs-layout.less +42 -42
  88. package/lib/layout5/css/header.less +35 -35
  89. package/lib/layout5/css/sider.less +18 -18
  90. package/lib/list/calendar/index.less +20 -20
  91. package/lib/list/card-list/index.less +154 -154
  92. package/lib/list/gantt/index.less +8 -8
  93. package/lib/list/vertical-list/index.less +208 -208
  94. package/lib/login/index.css +19 -19
  95. package/lib/login/login.d.ts.map +1 -1
  96. package/lib/login/vertify/index.css +143 -143
  97. package/lib/login3/index.less +136 -136
  98. package/lib/lowcode-components/act-table/index.less +26 -26
  99. package/lib/lowcode-components/base-button/index.less +7 -7
  100. package/lib/lowcode-components/base-map/index.js +6 -6
  101. package/lib/lowcode-components/base-radio/index.less +23 -23
  102. package/lib/lowcode-components/base-tabs/index.less +14 -14
  103. package/lib/lowcode-components/border/border10/index.less +26 -26
  104. package/lib/lowcode-components/border/border11/index.js +46 -46
  105. package/lib/lowcode-components/border/border11/index.less +17 -17
  106. package/lib/lowcode-components/border/border12/index.js +13 -13
  107. package/lib/lowcode-components/border/border12/index.less +13 -13
  108. package/lib/lowcode-components/border/border13/index.js +5 -5
  109. package/lib/lowcode-components/border/border13/index.less +13 -13
  110. package/lib/lowcode-components/border/border2/index.less +17 -17
  111. package/lib/lowcode-components/border/border3/index.less +25 -25
  112. package/lib/lowcode-components/border/border4/index.js +2 -2
  113. package/lib/lowcode-components/border/border4/index.less +72 -72
  114. package/lib/lowcode-components/border/border5/index.js +2 -2
  115. package/lib/lowcode-components/border/border5/index.less +35 -35
  116. package/lib/lowcode-components/border/border6/index.less +17 -17
  117. package/lib/lowcode-components/border/border7/index.less +26 -26
  118. package/lib/lowcode-components/border/border8/index.less +13 -13
  119. package/lib/lowcode-components/border/border9/index.js +14 -14
  120. package/lib/lowcode-components/border/border9/index.less +13 -13
  121. package/lib/lowcode-components/column-3d-chart/index.d.ts.map +1 -1
  122. package/lib/lowcode-components/column-3d-chart/index.js +2 -1
  123. package/lib/lowcode-components/column-3d-chart/index.js.map +1 -1
  124. package/lib/lowcode-components/column-chart/index.d.ts.map +1 -1
  125. package/lib/lowcode-components/column-chart/index.js +3 -2
  126. package/lib/lowcode-components/column-chart/index.js.map +1 -1
  127. package/lib/lowcode-components/decoration/decoration1/index.less +7 -7
  128. package/lib/lowcode-components/decoration/decoration10/index.js +3 -3
  129. package/lib/lowcode-components/decoration/decoration10/index.less +5 -5
  130. package/lib/lowcode-components/decoration/decoration11/index.less +5 -5
  131. package/lib/lowcode-components/decoration/decoration2/index.less +6 -6
  132. package/lib/lowcode-components/decoration/decoration3/index.less +7 -7
  133. package/lib/lowcode-components/decoration/decoration4/index.less +29 -29
  134. package/lib/lowcode-components/decoration/decoration5/index.less +3 -3
  135. package/lib/lowcode-components/decoration/decoration6/index.less +7 -7
  136. package/lib/lowcode-components/decoration/decoration7/index.less +4 -4
  137. package/lib/lowcode-components/decoration/decoration8/index.less +14 -14
  138. package/lib/lowcode-components/decoration/decoration9/index.less +4 -4
  139. package/lib/lowcode-components/effectScatter-map/index.js +6 -6
  140. package/lib/lowcode-components/effectScatter-map-3d/index.js +6 -6
  141. package/lib/lowcode-components/line-bar-chart/index.d.ts.map +1 -1
  142. package/lib/lowcode-components/line-bar-chart/index.js +3 -6
  143. package/lib/lowcode-components/line-bar-chart/index.js.map +1 -1
  144. package/lib/lowcode-components/line-chart/index.d.ts +3 -0
  145. package/lib/lowcode-components/line-chart/index.d.ts.map +1 -1
  146. package/lib/lowcode-components/line-chart/index.js +19 -6
  147. package/lib/lowcode-components/line-chart/index.js.map +1 -1
  148. package/lib/lowcode-components/lowcode-view/index.less +19 -19
  149. package/lib/lowcode-components/search-form/index.less +25 -25
  150. package/lib/module/dtmpl-edit-card.d.ts.map +1 -1
  151. package/lib/module/dtmpl-edit-page.d.ts.map +1 -1
  152. package/lib/module/index.less +4 -4
  153. package/lib/module/ltmpl-modal.d.ts.map +1 -1
  154. package/lib/module/ltmpl-table.d.ts.map +1 -1
  155. package/lib/routable/index.less +25 -25
  156. package/lib/table/act-table.d.ts.map +1 -1
  157. package/lib/table/column/index.less +85 -85
  158. package/lib/table/index.css +211 -211
  159. package/lib/table/modal-select-table.d.ts.map +1 -1
  160. package/lib/table/page-chart.less +9 -9
  161. package/lib/table/pagination.css +14 -14
  162. package/lib/table/pagination.d.ts.map +1 -1
  163. package/lib/table/relation-table.d.ts.map +1 -1
  164. package/lib/table/selected-rows-card.d.ts.map +1 -1
  165. package/lib/table/stat/restat.d.ts.map +1 -1
  166. package/lib/tree/act-tree.d.ts.map +1 -1
  167. package/lib/tree/block-menu-auth-tree.d.ts.map +1 -1
  168. package/lib/tree/index.css +22 -22
  169. package/lib/tree/tmpl-tree.d.ts.map +1 -1
  170. package/lib/welcome/components/menu-card.less +96 -96
  171. package/lib/welcome/components/page-card.less +49 -49
  172. package/lib/welcome/components/quick-entrance.less +120 -120
  173. package/lib/welcome/components/user-menus.less +192 -192
  174. package/lib/welcome/components/workbench.less +118 -118
  175. package/lib/welcome/index.css +13 -13
  176. package/package.json +224 -224
  177. package/src/aldehyde/controls/2dEditor/2dEditor/index.less +5 -5
  178. package/src/aldehyde/controls/2dEditor/2dEditor/index.tsx +270 -270
  179. package/src/aldehyde/controls/2dEditor/2dView/index.less +8 -8
  180. package/src/aldehyde/controls/2dEditor/2dView/index.tsx +110 -110
  181. package/src/aldehyde/controls/2dEditor/components/card.tsx +256 -256
  182. package/src/aldehyde/controls/2dEditor/components/component.less +83 -83
  183. package/src/aldehyde/controls/2dEditor/components/data.d.ts +32 -32
  184. package/src/aldehyde/controls/2dEditor/components/hotspot.tsx +80 -80
  185. package/src/aldehyde/controls/2dEditor/components/html-box.tsx +101 -101
  186. package/src/aldehyde/controls/2dEditor/components/image.tsx +99 -99
  187. package/src/aldehyde/controls/2dEditor/components/line.tsx +73 -73
  188. package/src/aldehyde/controls/action/index.css +8 -8
  189. package/src/aldehyde/controls/action/index.tsx +406 -406
  190. package/src/aldehyde/controls/action/utils.tsx +306 -306
  191. package/src/aldehyde/controls/auto-complete/index.tsx +82 -82
  192. package/src/aldehyde/controls/cascader/index.tsx +112 -112
  193. package/src/aldehyde/controls/chemstruc/graph.tsx +185 -185
  194. package/src/aldehyde/controls/chemstruc/index.css +28 -28
  195. package/src/aldehyde/controls/code-editor/sql-code-editor.tsx +73 -73
  196. package/src/aldehyde/controls/collapse-card/index.css +8 -8
  197. package/src/aldehyde/controls/collapse-card/index.tsx +109 -109
  198. package/src/aldehyde/controls/color-picker/index.tsx +21 -21
  199. package/src/aldehyde/controls/counting-tag/index.tsx +53 -53
  200. package/src/aldehyde/controls/cquery/cquick-button.tsx +145 -145
  201. package/src/aldehyde/controls/date-picker/index.tsx +199 -199
  202. package/src/aldehyde/controls/direct-file-view/drawer-file-view.tsx +54 -54
  203. package/src/aldehyde/controls/direct-file-view/index.tsx +147 -147
  204. package/src/aldehyde/controls/direct-upload/index.tsx +140 -140
  205. package/src/aldehyde/controls/entity-select/entity-select.tsx +791 -791
  206. package/src/aldehyde/controls/entity-select/index.css +7 -7
  207. package/src/aldehyde/controls/entity-select/lab-tree-select.tsx +154 -154
  208. package/src/aldehyde/controls/entity-select/popover-entity-select.tsx +205 -205
  209. package/src/aldehyde/controls/entry-control.tsx +431 -431
  210. package/src/aldehyde/controls/enum-badge/index.tsx +42 -42
  211. package/src/aldehyde/controls/enum-tag/index.tsx +45 -45
  212. package/src/aldehyde/controls/field-history/index.tsx +81 -81
  213. package/src/aldehyde/controls/file-export/select-code-export.tsx +40 -40
  214. package/src/aldehyde/controls/file-view/drawer-file-view.tsx +117 -117
  215. package/src/aldehyde/controls/file-view/index.less +9 -9
  216. package/src/aldehyde/controls/file-view/index.tsx +148 -148
  217. package/src/aldehyde/controls/file-view/multi-file-view.tsx +39 -39
  218. package/src/aldehyde/controls/file-view/newin-file-view.tsx +40 -40
  219. package/src/aldehyde/controls/html-editor/draft.tsx +136 -136
  220. package/src/aldehyde/controls/html-editor/index.less +67 -67
  221. package/src/aldehyde/controls/icon-selector/app-icon-selector.tsx +68 -68
  222. package/src/aldehyde/controls/icon-selector/icon/aldehyde-menu-icon/iconfont.css +147 -147
  223. package/src/aldehyde/controls/icon-selector/icon/aldehyde-menu-icon/iconfont.json +240 -240
  224. package/src/aldehyde/controls/icon-selector/pc-icon-selector.tsx +68 -68
  225. package/src/aldehyde/controls/input-number/index.tsx +148 -148
  226. package/src/aldehyde/controls/input-range/index.tsx +59 -59
  227. package/src/aldehyde/controls/password-setter/index.css +2 -2
  228. package/src/aldehyde/controls/password-setter/index.js +88 -88
  229. package/src/aldehyde/controls/progress/index.tsx +74 -74
  230. package/src/aldehyde/controls/qr-code/index.less +28 -28
  231. package/src/aldehyde/controls/qr-code/index.tsx +40 -40
  232. package/src/aldehyde/controls/relation-existion/index.css +3 -3
  233. package/src/aldehyde/controls/relation-existion/index.tsx +144 -144
  234. package/src/aldehyde/controls/rfield/index.css +4 -4
  235. package/src/aldehyde/controls/rfield/index.tsx +225 -225
  236. package/src/aldehyde/controls/select/index.tsx +226 -226
  237. package/src/aldehyde/controls/signature/index.tsx +226 -226
  238. package/src/aldehyde/controls/single-checkbox/index.tsx +18 -18
  239. package/src/aldehyde/controls/steps/index.tsx +59 -59
  240. package/src/aldehyde/controls/text/ellipsis-text.tsx +98 -98
  241. package/src/aldehyde/controls/text/index.less +7 -7
  242. package/src/aldehyde/controls/tree-select/navigation-tree.tsx +122 -122
  243. package/src/aldehyde/controls/tree-select/tree-entity-select.tsx +121 -121
  244. package/src/aldehyde/controls/upload/index.tsx +128 -128
  245. package/src/aldehyde/controls/upload/mult-file-upload.tsx +240 -240
  246. package/src/aldehyde/controls/upload-read-excel/index.tsx +43 -43
  247. package/src/aldehyde/controls/view-control.tsx +289 -289
  248. package/src/aldehyde/custom-page/custom-detail-modal-page.tsx +69 -69
  249. package/src/aldehyde/custom-page/custom-page-router.tsx +64 -64
  250. package/src/aldehyde/custom-page/def-custom-page.tsx +17 -17
  251. package/src/aldehyde/custom-page/dtmpl-custom-edit-modal-page.tsx +91 -91
  252. package/src/aldehyde/detail/button/bottom-submit-button-bar.tsx +91 -91
  253. package/src/aldehyde/detail/button/cquery-button-bar.tsx +144 -144
  254. package/src/aldehyde/detail/button/edit-button.tsx +61 -61
  255. package/src/aldehyde/detail/button/fix-right-submit-button-bar.tsx +186 -186
  256. package/src/aldehyde/detail/button/index.css +42 -42
  257. package/src/aldehyde/detail/button/inline-edit-button.tsx +40 -40
  258. package/src/aldehyde/detail/button/submit-button-bar.tsx +57 -57
  259. package/src/aldehyde/detail/button/view-button.tsx +64 -64
  260. package/src/aldehyde/detail/dtmpl.css +72 -72
  261. package/src/aldehyde/detail/edit/dtmpl-edit.tsx +279 -279
  262. package/src/aldehyde/detail/edit/fields-edit-card.tsx +145 -145
  263. package/src/aldehyde/detail/edit/modal-row-edit.tsx +95 -95
  264. package/src/aldehyde/detail/edit/popover-edit-card.tsx +167 -167
  265. package/src/aldehyde/detail/edit/popover-editor.tsx +70 -70
  266. package/src/aldehyde/detail/edit/post-result/index.tsx +86 -86
  267. package/src/aldehyde/detail/rightbar/index.css +34 -34
  268. package/src/aldehyde/detail/rightbar/index.tsx +92 -92
  269. package/src/aldehyde/detail/tooltipbar/index.tsx +32 -32
  270. package/src/aldehyde/detail/view/act-dtmpl-view.tsx +288 -288
  271. package/src/aldehyde/detail/view/dtmpl-view.tsx +334 -334
  272. package/src/aldehyde/detail/view/field-view-group.tsx +88 -88
  273. package/src/aldehyde/detail/view/modal-dtmpl-view.tsx +73 -73
  274. package/src/aldehyde/detail/view/snapshot-timeline.tsx +231 -231
  275. package/src/aldehyde/detail/view/tab-act-dtmpl-view.tsx +304 -304
  276. package/src/aldehyde/detail/view/view-compare-panel.tsx +57 -57
  277. package/src/aldehyde/draw-canvas-edit/components/render/components/index.less +60 -60
  278. package/src/aldehyde/draw-canvas-edit/components/render/components/index.ts +3 -3
  279. package/src/aldehyde/draw-canvas-edit/components/render/components/workstation-component.tsx +220 -220
  280. package/src/aldehyde/draw-canvas-edit/components/render/draws/bg-draw.ts +177 -177
  281. package/src/aldehyde/draw-canvas-edit/components/render/draws/contextmenu-draw.ts +330 -330
  282. package/src/aldehyde/draw-canvas-edit/components/render/draws/graph-draw.ts +249 -249
  283. package/src/aldehyde/draw-canvas-edit/components/render/draws/link-draw.ts +1415 -1415
  284. package/src/aldehyde/draw-canvas-edit/components/render/draws/preview-draw.ts +274 -274
  285. package/src/aldehyde/draw-canvas-edit/components/render/draws/ref-line-draw.ts +71 -71
  286. package/src/aldehyde/draw-canvas-edit/components/render/draws/ruler-draw.ts +166 -166
  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 +77 -77
  289. package/src/aldehyde/draw-canvas-edit/components/render/handlers/selection-handlers.ts +410 -410
  290. package/src/aldehyde/draw-canvas-edit/components/render/index.ts +817 -817
  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 +269 -269
  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 +588 -588
  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 +298 -298
  299. package/src/aldehyde/draw-canvas-edit/components/setting-form/index.tsx +305 -305
  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 +213 -213
  303. package/src/aldehyde/draw-canvas-view/index.less +66 -66
  304. package/src/aldehyde/draw-canvas-view/index.tsx +49 -49
  305. package/src/aldehyde/draw-canvas-view/view.tsx +237 -237
  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 +571 -571
  312. package/src/aldehyde/form/field-group-form.tsx +103 -103
  313. package/src/aldehyde/form/fields-form.tsx +45 -45
  314. package/src/aldehyde/form/form-Item-group.tsx +246 -246
  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 +323 -323
  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 +16 -16
  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 +112 -112
  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 +227 -227
  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 +272 -272
  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 +443 -442
  456. package/src/aldehyde/lowcode-components/column-chart/index.tsx +353 -352
  457. package/src/aldehyde/lowcode-components/data-number/index.tsx +219 -219
  458. package/src/aldehyde/lowcode-components/data.d.ts +19 -19
  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 +360 -362
  486. package/src/aldehyde/lowcode-components/line-chart/index.tsx +367 -352
  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 +279 -279
  495. package/src/aldehyde/lowcode-components/lowcode-view/interface.ts +189 -189
  496. package/src/aldehyde/lowcode-components/pie-chart/index.tsx +353 -353
  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 +479 -479
  506. package/src/aldehyde/module/dtmpl-edit-drawer.tsx +24 -24
  507. package/src/aldehyde/module/dtmpl-edit-modal.tsx +26 -26
  508. package/src/aldehyde/module/dtmpl-edit-page.tsx +600 -600
  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 +387 -387
  518. package/src/aldehyde/module/ttmpl-tree.tsx +47 -47
  519. package/src/aldehyde/routable/dtmpl-route.tsx +179 -179
  520. package/src/aldehyde/routable/import-route.tsx +42 -42
  521. package/src/aldehyde/routable/index.less +25 -25
  522. package/src/aldehyde/routable/ltmpl-route.tsx +549 -549
  523. package/src/aldehyde/routable/splitview-ltmpl-route.tsx +385 -385
  524. package/src/aldehyde/routable/ttmpl-route.tsx +98 -98
  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 +1865 -1865
  530. package/src/aldehyde/table/column/column-builder.tsx +882 -882
  531. package/src/aldehyde/table/column/column-selector.tsx +130 -130
  532. package/src/aldehyde/table/column/index.less +85 -85
  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-chart.less +9 -9
  540. package/src/aldehyde/table/page-chart.tsx +196 -196
  541. package/src/aldehyde/table/page-config-button.tsx +203 -203
  542. package/src/aldehyde/table/pagination.css +14 -14
  543. package/src/aldehyde/table/pagination.tsx +81 -81
  544. package/src/aldehyde/table/query-table.tsx +668 -668
  545. package/src/aldehyde/table/relation-table.tsx +1078 -1078
  546. package/src/aldehyde/table/report-table.tsx +125 -125
  547. package/src/aldehyde/table/resizable-table.tsx +97 -97
  548. package/src/aldehyde/table/row-table.tsx +45 -45
  549. package/src/aldehyde/table/select-table.tsx +559 -559
  550. package/src/aldehyde/table/selected-rows-card.tsx +78 -78
  551. package/src/aldehyde/table/stat/restat.tsx +122 -122
  552. package/src/aldehyde/table/table-util.tsx +25 -25
  553. package/src/aldehyde/tmpl/control-type-supportor.tsx +154 -154
  554. package/src/aldehyde/tmpl/hc-data-source.tsx +574 -574
  555. package/src/aldehyde/tmpl/hcservice-v3.tsx +1590 -1590
  556. package/src/aldehyde/tmpl/interface.tsx +940 -940
  557. package/src/aldehyde/tmpl/model-struc-v3.tsx +111 -111
  558. package/src/aldehyde/tmpl/superagent.js +146 -146
  559. package/src/aldehyde/tmpl/tmpl-config-analysis.tsx +585 -585
  560. package/src/aldehyde/tmpl/web-socket.ts +366 -366
  561. package/src/aldehyde/tree/act-tree.tsx +219 -219
  562. package/src/aldehyde/tree/block-menu-auth-tree.tsx +189 -189
  563. package/src/aldehyde/tree/index.css +22 -22
  564. package/src/aldehyde/tree/navigation-tree.tsx +39 -39
  565. package/src/aldehyde/tree/tmpl-tree.tsx +751 -751
  566. package/src/aldehyde/tree/tree-node.tsx +73 -73
  567. package/src/aldehyde/tree/tree-utils.tsx +317 -317
  568. package/src/aldehyde/units/EncryptUtils.js +37 -37
  569. package/src/aldehyde/units/image.d.ts +7 -7
  570. package/src/aldehyde/units/index.tsx +1375 -1375
  571. package/src/aldehyde/units/storage.js +2 -2
  572. package/src/aldehyde/utils/dsu.ts +27 -27
  573. package/src/aldehyde/welcome/HCWelcome.js +404 -404
  574. package/src/aldehyde/welcome/HCWelcome1.js +259 -259
  575. package/src/aldehyde/welcome/components/menu-card.less +96 -96
  576. package/src/aldehyde/welcome/components/menu-card.tsx +70 -70
  577. package/src/aldehyde/welcome/components/page-card.less +49 -49
  578. package/src/aldehyde/welcome/components/page-card.tsx +97 -97
  579. package/src/aldehyde/welcome/components/quick-entrance.less +120 -120
  580. package/src/aldehyde/welcome/components/quick-entrance.tsx +80 -80
  581. package/src/aldehyde/welcome/components/user-menus.less +192 -192
  582. package/src/aldehyde/welcome/components/user-menus.tsx +279 -279
  583. package/src/aldehyde/welcome/components/workbench.less +118 -118
  584. package/src/aldehyde/welcome/components/workbench.tsx +146 -146
  585. package/src/aldehyde/welcome/index.css +13 -13
@@ -1,1865 +1,1865 @@
1
- import React, { ReactNode } from "react";
2
- import {
3
- Button, Card, Checkbox, Col, Divider, Popover, Row, Space, Drawer, Tooltip,
4
- message, Layout, Table, Form as AntdForm, FormInstance, Modal, Input, Alert, Tabs, Radio, Typography,
5
- Dropdown
6
- } from "antd";
7
- import {
8
- ExportOutlined, FundOutlined, LineChartOutlined,
9
- PlusCircleOutlined, PlusOutlined, ReloadOutlined, RetweetOutlined, SearchOutlined,
10
- TableOutlined, ImportOutlined, AppstoreAddOutlined, PlusSquareOutlined, DeleteOutlined
11
- } from "@ant-design/icons";
12
- import _ from "lodash";
13
- import "./index.css";
14
- import {
15
- ActTableMode, ActTableViewModel, AggregateVO, ClassAddConfig, ColumnConfig,
16
- CustomButton, CustomButtonConfig, DoEditParam, DtmplData, JumpConfig, LtmplConfig, QueryKey,
17
- SelectedRow, ShowViewParam, TmplBaseProps,
18
- } from "../tmpl/interface";
19
- import HcserviceV3 from "../tmpl/hcservice-v3";
20
- import HCDataSource from "../tmpl/hc-data-source";
21
- import QueryTable from "./query-table";
22
- import CriteriaForm from "./../form/criteria-form";
23
- import ProgramConfig from "../units";
24
- import ColumnSelector from "./column/column-selector";
25
- import ExportFrame, { ExportType, ExportMode } from "../export/export-frame";
26
- import L2ActTable from "./l2-act-table";
27
- import Restat from "./stat/restat";
28
- import CollapseCard from "../controls/collapse-card";
29
- import ToolTipBar from "../detail/tooltipbar";
30
- import { LocaleContext } from "../locale/LocaleProvider";
31
- import BlockMenuTreeDrawer from "../module/block-menu-tree-drawer";
32
- import ModelSelectTable from "./../table/modal-select-table";
33
- import ColumnBuilder from "./column/column-builder";
34
- import ReportTable from "./report-table";
35
- import EntryControl from "../controls/entry-control";
36
- import DraggableModal from "../module/draggable-modal";
37
- import Icon from "../icon/aliIcon";
38
- import PageConfigButton from "./page-config-button";
39
- import { defPageSizeOptions } from "./pagination"; // 默认分页数
40
- import PageChart from "./page-chart"; // 展示图表
41
- import RowTable from "./row-table";
42
-
43
- const { Content, Sider } = Layout;
44
- const { Text } = Typography;
45
-
46
- type Level = "l1" | "l2";
47
-
48
- const enumTypes = ["select", "multiselect", "texttags", "checkbox", "radio", "steps"];
49
-
50
-
51
- const defaultDisabledColIds: string[] = ["20000", "10000"];
52
-
53
- interface ActTableProps extends TmplBaseProps {
54
- criteriaData: object;
55
- pageNo: number;
56
- pageSize: number;
57
- onChangePage: (pageNo: number, pageSize: number, pageSizeOptions?: number[]) => void;
58
- ltmplConfig: LtmplConfig;
59
- menuId?: string;
60
- showView?: (showVievParam: ShowViewParam) => void;
61
- doCreate?: (addtmplId: string, toCustomPage: boolean) => void;
62
- customCreatable?: boolean;
63
- doEdit?: (doEditParam: DoEditParam) => void;
64
- customEditable?: boolean;
65
- doDelete?: (code: string) => void;
66
- doSearch?: (params: object) => void;
67
- doRAction?: (ractionId: string, mainCode: string) => void;
68
- level?: Level;
69
- funcMode?: ActTableMode;
70
- title?: ReactNode;
71
- tip?: any;
72
- collapsible?: boolean;
73
- initCollapse?: boolean;
74
- readOnly?: boolean;
75
- tableType?: "common" | "report" | "select";
76
- operatable?: boolean;
77
- onSelectChange?: (val: { selectedRows: SelectedRow[], selectedDatas: DtmplData[] }) => void;
78
- defShowType?: ActTableViewModel; // 默认视图
79
- showPagination?: boolean; // 是否显示分页
80
- showAggregates?: boolean; // 是否显示统计数据
81
- userPageConfig?: { [key: string]: any }; // 用户页面配置本地缓存
82
- setUserPageConfig?: (config: { [key: string]: any }) => void; // 更新用户页面配置本地缓存
83
- resetUserPageConfig?: () => void; // 重置用户页面配置本地缓存
84
- allowUserConfig?: boolean; // 是否可用户自定义配置
85
- deleteCallback?: (val: object) => void; // 删除回调
86
- onUpdatePageSizeOptions?: (val: number[]) => void; // 更新分页数数组
87
- showEmpty?: boolean; // 空数据是否显示空状态,默认显示
88
- loadDataCallback?: (val: object[]) => void; // 请求数据回调函数
89
- doEdit2D?: (val: string) => void; // 2D图编辑
90
- doView2D?: (val: string) => void; // 2D图查看
91
- showTableAdd?: boolean; // 是否支持添加列表
92
- }
93
-
94
- interface ActTableStat {
95
- sortedColConfigs?: ColumnConfig[];
96
- queryKey?: QueryKey;
97
- loading?: boolean;
98
- selectedRows?: SelectedRow[];
99
- selectedDatas?: DtmplData[];
100
- hiddenColIds?: string[];
101
- drillingColIds?: string[];
102
- disabledColIds?: string[];
103
- hiddenRowCodes?: string[];
104
- viewModels?: ActTableViewModel[];
105
- showL2ActTable?: boolean;
106
- showL2Chart?: boolean;
107
- recordCode?: string;
108
- record?: DtmplData;
109
- blockMenuTreeDrawerOpen?: boolean;
110
- showCustomCard?: boolean;
111
- customButton?: CustomButton;
112
- customButtonData?: DtmplData[];
113
- showRatmplSelector?: boolean;
114
- aggregateVO?: AggregateVO;
115
- restatParams?: object;
116
- pageInfo?: object;
117
- ltreeData?: object;
118
- userCriteriaData: object;
119
- editings: string[]; // 行内编辑code
120
- delModalOpen?: boolean; // 强删除弹窗是否打开
121
- tabsOptions?: { key: string, value: string, label: React.ReactNode, title?: string, id?: string, ids?: string[] }[]; // tabs选项
122
- tabActiveKey?: string; // Tabs选中项
123
- pageSizeOptions?: number[]; // 设备分页数
124
- customDrawerSize?: number | string; // 自定义页面抽屉宽度
125
- tableNumber?: number; // 添加多表格-显示表格数量
126
- }
127
- let serial_number = new Date().getTime();
128
- let busyReminderTime = 0;
129
- class ActTable extends React.PureComponent<ActTableProps, ActTableStat> {
130
- state = {
131
- //tableColumns: undefined,
132
- sortedColConfigs: undefined,
133
- queryKey: undefined,
134
- loading: true,
135
- disableCols: undefined,
136
- hiddenColIds: defaultDisabledColIds,
137
- selectedRows: [],
138
- selectedDatas: [],
139
- hiddenRowCodes: [],
140
- viewModels: [],
141
- drillingColIds: undefined,
142
- disabledColIds: undefined,
143
- showL2ActTable: false,
144
- showL2Chart: false,
145
- recordCode: undefined,
146
- record: undefined,
147
- blockMenuTreeDrawerOpen: false,
148
- showCustomCard: false,
149
- customButtonData: undefined,
150
- customButton: undefined,
151
- showRatmplSelector: false,
152
- aggregateVO: undefined,
153
- restatParams: undefined,
154
- pageInfo: { pageNo: 1, pageSize: 10 },
155
- ltreeData: {},
156
- userCriteriaData: undefined,
157
- editings: [], // 行内编辑code
158
- delModalOpen: false, // 强删除弹窗是否打开
159
- tabsOptions: [],
160
- tabActiveKey: "all",
161
- pageSizeOptions: defPageSizeOptions,
162
- customDrawerSize: undefined,
163
- tableNumber: 0,
164
- showTableAdd: undefined
165
- };
166
-
167
- static contextType = LocaleContext;
168
- context: React.ContextType<typeof LocaleContext>;
169
- formRef = React.createRef<FormInstance>(); // 可编辑表格的form Ref
170
- isJumpRef = React.createRef<boolean>(); // 是否是action跳转
171
-
172
- static defaultProps = {
173
- criteriaData: {},
174
- funcMode: "complete",
175
- collapsible: false,
176
- initCollapse: false,
177
- readOnly: false,
178
- operatable: true,
179
- showPagination: true,
180
- showAggregates: true,
181
- showEmpty: true,
182
- };
183
-
184
- // 获取标签选项
185
- getTabsOptions = async () => {
186
- const { ltmplConfig, criteriaData, sourceId } = this.props;
187
- const { translate } = this.context;
188
- const { split2TabCriteria, showSplitTabDataCount } = ltmplConfig || {};
189
- if (!split2TabCriteria) {
190
- return;
191
- }
192
- const allIds = [];
193
- let groupCount = [];
194
- if (showSplitTabDataCount) {
195
- groupCount = await HcserviceV3.getLtmplDataGroupCount(sourceId);
196
- }
197
- const options = split2TabCriteria.map(fieldConfig => {
198
- const id = `c_${fieldConfig.id}`;
199
- allIds.push(id);
200
- if (enumTypes.includes(fieldConfig.controlType || fieldConfig.extControlType)) {
201
- const items = HCDataSource.getEnums(fieldConfig.mstrucId);
202
- const options = items.map((item) => {
203
- const count = groupCount.find(r => r[0]?.fieldId === fieldConfig.id && r[0]?.value === item.title)?.[1]?.value;
204
- const countVal = (count || count === 0) ? ` (${count})` : "";
205
- return {
206
- label: <span style={{ padding: "0 10px" }}>{translate("${" + item.title + "}")}{countVal}</span>,
207
- key: item.value,
208
- id,
209
- title: translate("${" + item.title + "}") + countVal,
210
- value: item.value
211
- };
212
- });
213
- if (fieldConfig.relDeduplication && fieldConfig.exceptCodes?.length) {
214
- return options.filter(item => !fieldConfig.exceptCodes.includes(item.key));
215
- }
216
- return options;
217
- }
218
- if ([fieldConfig.controlType, fieldConfig.extControlType].includes("single-checkbox")) {
219
- const count = groupCount.find(r => r[0]?.fieldId === fieldConfig.id)?.[1]?.value;
220
- const countVal = (count || count === 0) ? ` (${count})` : "";
221
- return [{
222
- label: <span style={{ padding: "0 10px" }}>{translate("${" + fieldConfig.title + "}")}{countVal}</span>,
223
- key: "1",
224
- id,
225
- title: translate("${" + fieldConfig.title + "}") + countVal,
226
- value: "1",
227
- }];
228
- }
229
- return [];
230
- })?.flat() || [];
231
- const defOption = {
232
- label: <span style={{ padding: "0 10px" }}>{translate("${全部}")}</span>,
233
- key: "all",
234
- ids: allIds,
235
- title: translate("${全部}"),
236
- value: "all"
237
- };
238
- const temId = Object.keys(criteriaData).find(r => allIds.includes(r));
239
- const tabActiveKey = temId ? criteriaData[temId] : "all";
240
- this.setState({ tabsOptions: [defOption, ...options], tabActiveKey });
241
- }
242
-
243
- loadData = async (
244
- hiddenColIds: string[],
245
- hiddenRowCodes: string[],
246
- sortedColConfigs: ColumnConfig[]
247
- ) => {
248
- const {
249
- sourceId, criteriaData, ltmplConfig,
250
- mainCode, level, pageNo, pageSize, serverKey, defShowType, userPageConfig
251
- } = this.props;
252
-
253
- if (!this.isSameSourceQuery(sourceId, criteriaData)) {
254
- return
255
- }
256
-
257
-
258
- if (!ltmplConfig) {
259
- return;
260
- }
261
- // 处理菜单切换,查询条件清空,重置tab拆解条件选中项
262
- const tabActiveKey = ltmplConfig.split2TabCriteria?.find(r => criteriaData[`c_${r.id}`])?.id;
263
- this.setState({
264
- loading: true,
265
- userCriteriaData: criteriaData,
266
- tabActiveKey: tabActiveKey ? criteriaData[`c_${tabActiveKey}`] : "all"
267
- });
268
- let disabledColIds: string[] = [];
269
- let hiddenColIds_ = [...hiddenColIds];
270
- if (criteriaData && criteriaData["drillingColIds"]) {
271
- let dColIds = [...criteriaData["drillingColIds"]];
272
- ltmplConfig.columns.forEach((item) => {
273
- if (
274
- item.statColType == "dimension" &&
275
- !dColIds.includes(item.id) &&
276
- !hiddenColIds_.includes(item.id)
277
- ) {
278
- hiddenColIds_.push(item.id);
279
- disabledColIds.push(item.id);
280
- }
281
- if (
282
- item.statColType == "dimension" &&
283
- !dColIds.includes(item.id) &&
284
- !disabledColIds.includes(item.id)
285
- ) {
286
- disabledColIds.push(item.id);
287
- }
288
- });
289
- hiddenColIds_ = hiddenColIds_.filter((id) => {
290
- return !dColIds.includes(id);
291
- });
292
- }
293
- ltmplConfig.columns.forEach((item) => {
294
- if (item.hidden) {
295
- hiddenColIds_.push(item.id);
296
- }
297
- });
298
- /** 构建column **/
299
- const { defaultPageSize, showType } = ltmplConfig;
300
-
301
- let pageInfo = {
302
- pageNo: pageNo || 1,
303
- pageSize: pageSize || defaultPageSize || 10,
304
- virtualEndPageNo: undefined,
305
- };
306
- const viewModels = this.state.viewModels.length > 0 ? this.state.viewModels : (userPageConfig?.["viewModels"] || [defShowType || showType || "table"]);
307
-
308
- /** 构建 dataSource **/
309
- //构建过滤条件
310
- const params = { ...criteriaData, ...pageInfo, mainCode };
311
- let queryKey: QueryKey;
312
- if (level && level === "l2") {
313
- queryKey = await HcserviceV3.requestL2LtmplQueryKey(serverKey, sourceId, params);
314
- } else {
315
- if (viewModels.includes("ganttChart")) {
316
- queryKey = await HcserviceV3.requestGttRootQueryKey(serverKey, sourceId, params);
317
- } else {
318
- queryKey = await HcserviceV3.requestLtmplQueryKey(serverKey, sourceId, params);
319
- }
320
- }
321
-
322
- if (!queryKey.sourceId || queryKey.sourceId == this.props.sourceId) {
323
- this.setState({
324
- pageInfo,
325
- disabledColIds, hiddenColIds: hiddenColIds_, hiddenRowCodes,
326
- sortedColConfigs, queryKey, showL2Chart: false, selectedRows: [], selectedDatas: [],
327
- viewModels
328
- });
329
- }
330
- this.setState({
331
- loading: false,
332
- });
333
- };
334
-
335
- doCustomButton = async (customButton: CustomButton, records: DtmplData[]) => {
336
- if (!this.buttonClickable()) {
337
- return;
338
- }
339
- const { serverKey, sourceId } = this.props;
340
- let doType = customButton.doType;
341
- let config: CustomButtonConfig = ProgramConfig.getCustomButtonConfig(customButton.id);
342
- if ("request_refresh" == doType) {
343
- if (config && config.doAction) {
344
- await config.doAction(customButton, records);
345
- } else if (config && config.getRequestUrl) {
346
- let url = await config.getRequestUrl(customButton, records);
347
- await HcserviceV3.doPostRequest(serverKey, url);
348
- } else if (customButton.path) {
349
- let codes = [];
350
- let res = undefined;
351
- if (records != null) {
352
- records.forEach(item => {
353
- codes.push(item.code)
354
- })
355
- }
356
- if (customButton.requestMethod === "get") {
357
- res = await HcserviceV3.doGetRequest(serverKey, customButton.path, { codes });
358
- } else {
359
- res = await HcserviceV3.doPostRequest(serverKey, customButton.path, { codes });
360
- }
361
- if (res?.msg || res?.message) {
362
- message.info(res.msg || res.message);
363
- }
364
- } else {
365
- message.error("Button Config Error");
366
- return;
367
- }
368
- this.doSearchDirect(null);
369
- } else if ("show_window" == doType) {
370
- this.setState({
371
- showCustomCard: true,
372
- customButton,
373
- customButtonData: records,
374
- });
375
- } else {
376
- message.error("Unsuport Button dotype " + doType);
377
- }
378
- };
379
-
380
- renderAboveCustomPage = () => {
381
- return this.renderCustomPage("above-table");
382
- };
383
-
384
- renderOhterCustomPage = () => {
385
- return (
386
- <>
387
- {this.renderCustomPage("under-table")}
388
- {this.renderCustomPage("modal-window")}
389
- {this.renderCustomPage("left-drawer")}
390
- {this.renderCustomPage("right-drawer")}
391
- </>
392
- );
393
- };
394
-
395
- renderCustomPage = (
396
- windowPosition:
397
- | "under-table"
398
- | "above-table"
399
- | "modal-window"
400
- | "left-drawer"
401
- | "right-drawer"
402
- ) => {
403
- const { translate } = this.context;
404
- const { customButton, customButtonData, customDrawerSize } = this.state;
405
-
406
- if (!customButton) {
407
- return "";
408
- }
409
- if (windowPosition && windowPosition != customButton.windowPosition) {
410
- return "";
411
- }
412
-
413
- let customProps = {
414
- customButton: customButton, data: customButtonData,
415
- onOk: () => { this.actTableDoSearch(null) }
416
- , onclose: () => {
417
- this.setState({ customButton: undefined });
418
- }
419
- };
420
-
421
- let config: CustomButtonConfig = ProgramConfig.getCustomButtonConfig(customButton.id);
422
- let page;
423
- if (config && config.getCurrentPage) {
424
- page = config.getCurrentPage(customButton, customButtonData);
425
- }
426
- if (!page) {
427
- page = ProgramConfig.getCustomPage(customButton.id);
428
- }
429
-
430
- if (!page) {
431
- message.error("Not found CustomButton Page");
432
- this.setState({
433
- customButton: undefined
434
- })
435
- return;
436
- }
437
-
438
- let customElement = React.createElement(page, customProps);
439
- if (
440
- customButton.windowPosition == "under-table" ||
441
- customButton.windowPosition == "above-table"
442
- ) {
443
- return (
444
- <Card
445
- id={"CustomCard" + customButton.id}
446
- size={"small"}
447
- style={{ marginTop: "6px" }}
448
- extra={
449
- <Button
450
- size={"small"}
451
- danger={true}
452
- onClick={() => {
453
- this.setState({ customButton: undefined });
454
- }}
455
- >
456
- {translate("${关闭}")}
457
- </Button>
458
- }
459
- >
460
- {customElement}
461
- </Card>
462
- );
463
- } else if (
464
- customButton.windowPosition == "left-drawer" ||
465
- customButton.windowPosition == "right-drawer"
466
- ) {
467
- return (
468
- <Drawer
469
- open={true}
470
- id={"CustomCard" + customButton.id}
471
- placement={
472
- customButton.windowPosition == "right-drawer" ? "right" : "left"
473
- }
474
- resizable={{ onResize: (newSize => this.setState({ customDrawerSize: newSize })) }}
475
- size={customDrawerSize !== undefined ? customDrawerSize : customButton.windowWidth}
476
- onClose={() => {
477
- this.setState({ customButton: undefined });
478
- }}
479
- styles={{ body: { minWidth: customButton.windowWidth } }}
480
- >
481
- {customElement}
482
- </Drawer>
483
- );
484
- } else if (customButton.windowPosition == "modal-window") {
485
- return (
486
- <DraggableModal
487
- open={true}
488
- closable={true}
489
- width={customButton.windowWidth}
490
- style={{ height: customButton.windowHeight }}
491
- onCancel={() => {
492
- this.setState({ customButton: undefined });
493
- }}
494
- >
495
- {customElement}
496
- </DraggableModal>
497
- );
498
- }
499
- };
500
-
501
-
502
- async componentDidMount() {
503
- const { ltmplConfig, tableType, userPageConfig, defShowType, onUpdatePageSizeOptions, setUserPageConfig, pageSize } = this.props;
504
- const { sortedColIds } = userPageConfig || {};
505
- const { translate } = this.context;
506
- let sortedColConfigs = undefined;
507
- if (ltmplConfig) {
508
- sortedColConfigs = tableType == 'report' ? ltmplConfig.columns : [
509
- { id: "10000", title: translate("${排序}"), originalId: "10000" },
510
- { id: "20000", title: translate("${隐藏}"), originalId: "20000" },
511
- ...ltmplConfig.columns,
512
- ];
513
- if (sortedColIds) { // 使用缓存的列排序
514
- sortedColConfigs.sort((a, b) => sortedColIds.indexOf(a.id) - sortedColIds.indexOf(b.id));
515
- }
516
- const temViewModels = userPageConfig?.["viewModels"] || [defShowType || ltmplConfig?.showType || "table"];
517
- this.setState({ viewModels: temViewModels });
518
- if (onUpdatePageSizeOptions && temViewModels.includes("cardList")) { // 初始化是卡片视图,则更新父组件中分页数组
519
- const temPageSizes = Array.from({ length: 7 }, (_, i) => ltmplConfig.rowCardCount * Math.pow(2, i));
520
- onUpdatePageSizeOptions(temPageSizes);
521
- if (setUserPageConfig && !(userPageConfig?.pageSize >= 0)) setUserPageConfig({ pageSize: 1 });
522
- this.setState({ pageSizeOptions: temPageSizes, sortedColConfigs });
523
- } else {
524
- this.loadData(userPageConfig?.hiddenColIds || defaultDisabledColIds, [], sortedColConfigs);
525
- }
526
- }
527
- this.getTabsOptions();
528
- }
529
-
530
- // 卡片列表-更新列表分页数
531
- handleCardListPageSize(preViewModels, viewModels) {
532
- const { ltmplConfig, onChangePage, pageSize, pageNo } = this.props;
533
- const { defaultPageSize } = ltmplConfig || {};
534
- const preIsCard = preViewModels.includes("cardList");
535
- const isCard = viewModels.includes("cardList");
536
- let temPageSizes = defPageSizeOptions;
537
- let temPageSize = defaultPageSize;
538
- if ((!preIsCard && !isCard) || (preIsCard && isCard)) {
539
- return;
540
- }
541
- if (!preIsCard && isCard) { // 普通切换到Card
542
- temPageSizes = Array.from({ length: 7 }, (_, i) => ltmplConfig.rowCardCount * Math.pow(2, i));
543
- temPageSize = temPageSizes.includes(Number(pageSize)) ? pageSize : (temPageSizes.includes(Number(defaultPageSize)) ? defaultPageSize : temPageSizes[1]);
544
- } else if (preIsCard && !isCard) { // card切换到普通
545
- temPageSize = defPageSizeOptions.includes(Number(pageSize)) ? pageSize : (defPageSizeOptions.includes(Number(defaultPageSize)) ? defaultPageSize : defPageSizeOptions[1]);
546
- }
547
- this.setState({ pageSizeOptions: temPageSizes });
548
- onChangePage(pageNo || 1, temPageSize, temPageSizes);
549
- }
550
-
551
- async componentDidUpdate(prevProps, prevState) {
552
- const { sourceId, criteriaData, ltmplConfig, tableType, pageSize, pageNo, userPageConfig, defShowType } = this.props;
553
- // const {userCriteriaData:preUserCriteriaData}=prevState;
554
- const { userCriteriaData } = this.state;
555
- const { translate } = this.context;
556
- let {
557
- ltmplConfig: preLtmplConfig,
558
- criteriaData: preCriteriaData,
559
- sourceId: preSourceId, pageSize: prePageSize, pageNo: prePageNo,
560
- userPageConfig: preUserPageConfig
561
- } = prevProps;
562
- if (!this.isSameSourceQuery(sourceId, criteriaData)) {
563
- return false;
564
- }
565
-
566
- if (prePageSize != pageSize || pageNo != prePageNo) {
567
- this.setState({
568
- pageInfo: { pageNo, pageSize },
569
- userCriteriaData: criteriaData,
570
- })
571
- }
572
- if (!preUserPageConfig && userPageConfig) {
573
- this.setState({ viewModels: userPageConfig?.["viewModels"] || [defShowType || ltmplConfig?.showType || "table"] });
574
- }
575
- if (!_.isEqual(prevState.viewModels, this.state.viewModels)) { // 显示视图变化-更改卡片列表分页条数
576
- this.handleCardListPageSize(prevState.viewModels, this.state.viewModels);
577
- }
578
- let { hiddenColIds, sortedColConfigs } = this.state;
579
- let currentQueryParams = ProgramConfig.transQueryParamsToStr(criteriaData, false, [
580
- "pageSize",
581
- "pageNo",
582
- ]);
583
- let preCurrentQueryParams = ProgramConfig.transQueryParamsToStr(userCriteriaData, false, [
584
- "pageSize",
585
- "pageNo",
586
- ]);
587
- if ((sourceId && preSourceId != sourceId) ||
588
- (ltmplConfig &&
589
- (!preLtmplConfig || ltmplConfig.id != preLtmplConfig.id)) ||
590
- ((currentQueryParams != preCurrentQueryParams) &&
591
- (!criteriaData['menuId'] || preCriteriaData.menuId == criteriaData['menuId']))
592
- ) {
593
- //5秒后允许再次请求数据
594
- //refresh=false;
595
- if (preLtmplConfig && ltmplConfig.id == preLtmplConfig.id) {
596
- await this.loadData(hiddenColIds, [], sortedColConfigs);
597
- } else {
598
- let sColConfigs = undefined;
599
- const { sortedColIds } = userPageConfig || {};
600
- if (ltmplConfig) {
601
- sColConfigs = tableType == 'report' ? ltmplConfig.columns : [
602
- { id: "10000", title: translate("${排序}"), originalId: "10000" },
603
- { id: "20000", title: translate("${隐藏}"), originalId: "20000" },
604
- ...ltmplConfig.columns,
605
- ];
606
- if (sortedColIds) { // 使用缓存的列排序
607
- sColConfigs.sort((a, b) => sortedColIds.indexOf(a.id) - sortedColIds.indexOf(b.id));
608
- }
609
- }
610
- await this.loadData(userPageConfig?.hiddenColIds || defaultDisabledColIds, [], sColConfigs);
611
- }
612
-
613
- } else {
614
- return false;
615
- }
616
- }
617
-
618
- isSameSourceQuery = (sourceId, criteriaData) => {
619
- // action跳转,路由变化时,变化后路由不存在sourceId||menuId,则不触发查询
620
- if (this.isJumpRef.current && !criteriaData['sourceId'] && !criteriaData['menuId']) {
621
- this.isJumpRef.current = false;
622
- return false;
623
- }
624
-
625
- if (sourceId && criteriaData && (criteriaData['sourceId'] && criteriaData['sourceId'] != sourceId)
626
- || (criteriaData['menuId'] && criteriaData['menuId'] != sourceId)) {
627
- return false;
628
- } else {
629
- return true;
630
- }
631
- };
632
-
633
- handleShowChart = () => {
634
- this.setState({
635
- showL2Chart: !this.state.showL2Chart,
636
- });
637
- };
638
-
639
- handleDataAnalysis = () => {
640
- this.setState({
641
- showL2ActTable: !this.state.showL2ActTable,
642
- });
643
- };
644
-
645
- unHiden = () => {
646
- const { ltmplConfig } = this.props;
647
- const { hiddenColIds, sortedColConfigs } = this.state;
648
- this.setState({
649
- hiddenRowCodes: [],
650
- });
651
- };
652
-
653
- onHide = (code: string) => {
654
- const { hiddenRowCodes } = this.state;
655
- let hiddenCodes = [...hiddenRowCodes, code];
656
- this.setState({
657
- hiddenRowCodes: hiddenCodes,
658
- });
659
- };
660
-
661
- changeViewModel = (viewModels) => {
662
- const { setUserPageConfig } = this.props;
663
- const { hiddenColIds, hiddenRowCodes, sortedColConfigs, viewModels: oldViewModels } = this.state;
664
- setUserPageConfig && setUserPageConfig({ viewModels });
665
- this.setState({ viewModels }, () => {
666
- if (viewModels.length && viewModels.includes("ganttChart") !== oldViewModels.includes("ganttChart")) {
667
- this.loadData(hiddenColIds, hiddenRowCodes, sortedColConfigs); // 前后选择是否存在甘特图,刷新数据
668
- }
669
- });
670
- };
671
-
672
- changeHiddenColumns = (hiddenColIds: string[]) => {
673
- const { setUserPageConfig } = this.props;
674
- this.setState({ showL2Chart: false, hiddenColIds });
675
- setUserPageConfig && setUserPageConfig({ hiddenColIds });
676
- };
677
-
678
- doSelectedAction = async (actionId: string, codes, params: object) => {
679
- const { selectedRows } = this.state;
680
- this.doAction(actionId, selectedRows, params);
681
- };
682
-
683
- doAction = async (actionId: string, selectedRows: SelectedRow[], params) => {
684
- const { serverKey } = this.props;
685
- const { hiddenColIds, hiddenRowCodes, sortedColConfigs } = this.state;
686
- this.setState({
687
- loading: true,
688
- });
689
- let result: boolean = await HcserviceV3.postActions(
690
- serverKey,
691
- actionId,
692
- selectedRows,
693
- params
694
- );
695
- if (result) {
696
- //重新加载数据
697
- this.loadData(hiddenColIds, hiddenRowCodes, sortedColConfigs);
698
- } else {
699
- this.setState({
700
- loading: false,
701
- });
702
- }
703
- };
704
-
705
- doRowAction = async (actionId: string, codes: string[], params: object) => {
706
- this.doAction(actionId, [{ title: undefined, code: codes[0] }], params);
707
- };
708
-
709
- doDelete = async () => {
710
- const { sourceId, serverKey, mainCode } = this.props;
711
- const {
712
- selectedRows,
713
- hiddenColIds,
714
- hiddenRowCodes,
715
- sortedColConfigs,
716
- } = this.state;
717
- this.setState({
718
- loading: true,
719
- });
720
- let result: boolean = await HcserviceV3.deleteData(
721
- serverKey,
722
- sourceId,
723
- selectedRows,
724
- mainCode
725
- );
726
- if (result) {
727
- //重新加载数据
728
- this.loadData(hiddenColIds, hiddenRowCodes, sortedColConfigs);
729
- } else {
730
- this.setState({
731
- loading: false,
732
- });
733
- }
734
- };
735
-
736
- doDeleteByCode = async (record: DtmplData) => {
737
- const { sourceId, serverKey, mainCode, doDelete, deleteCallback } = this.props;
738
- const { hiddenColIds, hiddenRowCodes, sortedColConfigs } = this.state;
739
- this.setState({
740
- loading: true,
741
- });
742
- let result: boolean = await HcserviceV3.deleteByCode(
743
- serverKey,
744
- sourceId,
745
- [record.code],
746
- mainCode
747
- );
748
- if (result) {
749
- //重新加载数据
750
- this.loadData(hiddenColIds, hiddenRowCodes, sortedColConfigs);
751
- doDelete && doDelete(record.code);
752
- deleteCallback && deleteCallback(record);
753
- this.setState({ loading: false, delModalOpen: false, recordCode: undefined, record: undefined });
754
- } else {
755
- this.setState({ loading: false });
756
- }
757
- };
758
-
759
- doSelectedCQuery = async (cqueryId: string) => { };
760
-
761
- doJump = async (jump: JumpConfig, record_: DtmplData) => {
762
- let record = record_.fieldMap ? record_.fieldMap : record_;
763
- const version = localStorage.getItem("version") || "";
764
-
765
- let url = null;
766
- let path = jump.path;
767
- if (!path) {
768
- path = "/";
769
- }
770
- //是否以http开头
771
- if (path?.indexOf("#") == 0 || url?.indexOf("/#") == 0) {
772
- url = "";
773
- } else if (
774
- path.indexOf("http://") == 0 ||
775
- path.indexOf("HTTP://") == 0 ||
776
- path.indexOf("https://") == 0 ||
777
- path.indexOf("HTTPS://") == 0
778
- ) {
779
- url = path.split("//")[0] + "//";
780
- path = path.split("//")[1];
781
- } else {
782
- url = `/#/${version}`;
783
- }
784
-
785
- //处理路由参数
786
- let paths = path.split("/");
787
-
788
- let routeParamConfigs = jump.routeParams;
789
- if (routeParamConfigs) {
790
- for (let i = 0; i < paths.length; i++) {
791
- if (paths[i].indexOf(":") == 0) {
792
- let pa = paths[i].substring(1);
793
- //根据参数名匹配参数
794
- for (let p of routeParamConfigs) {
795
- if (p && pa == p.title) {
796
- //赋值替换
797
- let v = record[p.id] ? record[p.id] : p.defaultValue;
798
- paths[i] = v;
799
- break;
800
- }
801
- }
802
- }
803
- }
804
- url = ProgramConfig.joinPath(url, paths.join("/"));
805
- } else {
806
- url = ProgramConfig.joinPath(url, path);
807
- }
808
-
809
- //处理search 参数
810
- let searchParamConfigs = jump.searchParams;
811
- let searchs = [];
812
- //放入token
813
- if (jump.tokenName) {
814
- searchs[0] = jump.tokenName + "=" + ProgramConfig.hydrocarbonToken();
815
- }
816
-
817
- if (searchParamConfigs) {
818
- let initSearchLength = searchs.length;
819
- for (let i = 0; i < searchParamConfigs.length; i++) {
820
- let p = searchParamConfigs[i];
821
- let v = record[p.id] ? record[p.id] : p.defaultValue;
822
- if (!v && p.title == "code") {
823
- v = record_.code;
824
- }
825
- searchs[initSearchLength + i] = p.title + "=" + v;
826
- }
827
- }
828
- if (searchs.length > 0) {
829
- if (url.indexOf("?") != url.length - 1) {
830
- url = url + "?";
831
- }
832
- url = url + searchs.join("&");
833
- }
834
- if (jump.linkTarget == '_self') {
835
- this.isJumpRef.current = true;
836
- window.location.hash = url.substring(url.indexOf("#") + 1);
837
- } else {
838
- debugger
839
- if (url.indexOf("/#") == 0) {
840
- // url=window.location.href.split("#/")[0]+url;
841
- url = window.location.href.split("#/")[0] + url.substring(url.indexOf("/#") + 1);
842
- }
843
- window.open(url);
844
- }
845
- // if (
846
- // url.indexOf("#") == 0 ||
847
- // url.indexOf("/#") == 0 ||
848
- // url.indexOf("//#") == 0
849
- // ) {
850
- // window.location.hash = url.substring(url.indexOf("#") + 1);
851
- // } else {
852
- // window.open(url);
853
- // }
854
- };
855
-
856
- blockMenuTreeDrawerOpen = (record) => {
857
- this.setState({
858
- blockMenuTreeDrawerOpen: true,
859
- recordCode: record.code,
860
- record
861
- })
862
- }
863
-
864
- doRowJump = async (jump: JumpConfig, record: DtmplData) => {
865
- this.doJump(jump, record);
866
- };
867
-
868
- renderExportButton = (title, type: ExportType, sourceId?: string) => {
869
- const { pageNo, pageSize, serverKey, ltmplConfig, tableType } = this.props;
870
-
871
- //let buttons = ltmplConfig?.buttons;
872
-
873
- const { queryKey } = this.state;
874
- const { translate } = this.context;
875
- let exportModes: ExportMode[] = tableType == "report" ?
876
- ["all"] : ["current", "page", "all"];
877
-
878
- return (
879
- <Popover
880
- content={
881
- <ExportFrame //导出组件
882
- currentPage={{
883
- pageNo: pageNo ? pageNo : 1,
884
- pageSize: pageSize ? pageSize : ltmplConfig.defaultPageSize,
885
- }}
886
- exportModes={exportModes}
887
- type={type}
888
- serverKey={serverKey}
889
- queryKey={queryKey}
890
- sourceId={sourceId}
891
- title={translate(
892
- "${" + ltmplConfig.title + "}" + "-" + "${" + title + "}"
893
- )}
894
- />
895
- }
896
- title={translate("${" + title + "}")}
897
- placement="bottomRight"
898
- trigger="click"
899
- >
900
- <Tooltip title={translate("${" + title + "}")}>
901
- <Button
902
- style={{
903
- // marginLeft: "5px",
904
- }}
905
- //为了点击到没有导出模块,使组件不致销毁,丢失导出数据
906
- >{type == "ltmpl-data-excel" ? <ExportOutlined /> : title}
907
- </Button>
908
- </Tooltip>
909
- </Popover>
910
- );
911
- };
912
-
913
- renderFileExportButton = () => {
914
- const { ltmplConfig } = this.props;
915
- let fileExports = ltmplConfig?.topFileExports;
916
- if (fileExports) {
917
- return fileExports.map((fileExport) => {
918
- return this.renderExportButton(
919
- fileExport.title,
920
- "ltmpl-data-filedata",
921
- fileExport.id
922
- );
923
- });
924
- } else {
925
- return <></>;
926
- }
927
- };
928
-
929
- doSelectedJump = async (jump: JumpConfig) => {
930
- const { selectedDatas } = this.state;
931
- if (selectedDatas.length == 1) {
932
- this.doJump(jump, selectedDatas[0]);
933
- }
934
- };
935
-
936
- changeRowSelection = (
937
- selectedRows: SelectedRow[],
938
- selectedDatas: DtmplData[]
939
- ) => {
940
- const { onSelectChange } = this.props;
941
- this.setState({ selectedRows, selectedDatas });
942
- if (onSelectChange) {
943
- onSelectChange({ selectedRows, selectedDatas });
944
- }
945
- };
946
-
947
- onChangeColSort = (sortedColConfigs: ColumnConfig[]) => {
948
- const { setUserPageConfig } = this.props;
949
- this.setState({ sortedColConfigs });
950
- const sortedColIds = sortedColConfigs.map(r => r.id);
951
- setUserPageConfig && setUserPageConfig({ sortedColIds });
952
- };
953
-
954
- // 更新本地缓存列宽度
955
- onChangeResize = (colResize: { [key: string]: number }) => {
956
- const { setUserPageConfig, userPageConfig } = this.props;
957
- const oldColResize = userPageConfig?.colResize || {};
958
- setUserPageConfig && setUserPageConfig({ colResize: { ...oldColResize, ...colResize } });
959
- }
960
-
961
- getAddTmplButton = (classAddConfigs: ClassAddConfig[]) => {
962
- const { translate } = this.context;
963
- if (classAddConfigs && classAddConfigs.length < 1) {
964
- return translate("${没有分类添加按钮}");
965
- }
966
- return classAddConfigs.map((config) => {
967
- return (
968
- <p>
969
- <Button
970
- size={"small"}
971
- type={"text"}
972
- onClick={() => this.props.doCreate(config.id, false)}
973
- >
974
- {config.title}
975
- </Button>
976
- </p>
977
- );
978
- });
979
- };
980
-
981
- // 重置当前页面配置
982
- handleResetUserPageConfig = () => {
983
- const { resetUserPageConfig, ltmplConfig, tableType, defShowType } = this.props;
984
- const { translate } = this.context;
985
- let sortedColConfigs = undefined;
986
- if (ltmplConfig) {
987
- sortedColConfigs = tableType === 'report' ? ltmplConfig.columns : [
988
- { id: "10000", title: translate("${排序}"), originalId: "10000" },
989
- { id: "20000", title: translate("${隐藏}"), originalId: "20000" },
990
- ...ltmplConfig.columns,
991
- ];
992
- }
993
- this.setState({ viewModels: [defShowType || ltmplConfig.showType || "table"], hiddenColIds: defaultDisabledColIds, sortedColConfigs });
994
- resetUserPageConfig();
995
- }
996
-
997
- // 更新当前页面配置
998
- handleUpdateUserPageConfig = (val: { [key: string]: any }) => {
999
- const { sortedColIds, hiddenColIds, viewModels, criteriaData } = val || {};
1000
- const { setUserPageConfig, ltmplConfig, tableType, defShowType, menuId } = this.props;
1001
- const { userCriteriaData } = this.state;
1002
- const { translate } = this.context;
1003
- let sortedColConfigs = undefined;
1004
- if (ltmplConfig) {
1005
- sortedColConfigs = tableType === 'report' ? ltmplConfig.columns : [
1006
- { id: "10000", title: translate("${排序}"), originalId: "10000" },
1007
- { id: "20000", title: translate("${隐藏}"), originalId: "20000" },
1008
- ...ltmplConfig.columns,
1009
- ];
1010
- }
1011
- if (sortedColIds) { // 页面配置更新列排序
1012
- sortedColConfigs.sort((a, b) => sortedColIds.indexOf(a.id) - sortedColIds.indexOf(b.id));
1013
- }
1014
- // 旧过滤参数设置为空
1015
- const oldParms = Object.keys(userCriteriaData || {}).reduce((total, item) => { total[item] = ""; return total; }, {});
1016
- this.actTableDoSearch({ ...oldParms, ...(criteriaData || { menuId }) });
1017
- this.setState({ userCriteriaData: criteriaData, viewModels: viewModels || [defShowType || ltmplConfig.showType || "table"], hiddenColIds: hiddenColIds || defaultDisabledColIds, sortedColConfigs });
1018
- setUserPageConfig({ ...val, criteriaData: undefined });
1019
- }
1020
-
1021
- // 更新多表格数量及缓存
1022
- editRowTableNum = (type: "add" | "delete") => {
1023
- const { ltmplConfig, setUserPageConfig, userPageConfig } = this.props;
1024
- const { rowTableNumber, rowTableCondig } = userPageConfig || {};
1025
- let { defTableSize } = ltmplConfig;
1026
- const temNum = (rowTableNumber || defTableSize || 0) + (type === "add" ? 1 : -1);
1027
- if (setUserPageConfig) {
1028
- const temRowTableCondig = (type === "delete" && rowTableCondig) ? rowTableCondig.slice(0, -1) : rowTableCondig;
1029
- setUserPageConfig({ rowTableNumber: temNum, rowTableCondig: temRowTableCondig }); // 缓存多表格数量
1030
- }
1031
- }
1032
-
1033
- // 渲染顶部操作栏
1034
- renderHeaderButtons = () => {
1035
- let {
1036
- hiddenColIds, viewModels, sortedColConfigs, disabledColIds, showL2Chart,
1037
- showL2ActTable, restatParams, userCriteriaData
1038
- } = this.state;
1039
- const {
1040
- ltmplConfig, sourceId, doCreate, doSearch, menuId,
1041
- funcMode, customCreatable, serverKey, readOnly, userPageConfig, allowUserConfig, showTableAdd
1042
- } = this.props;
1043
- const { translate } = this.context;
1044
- let { buttons } = ltmplConfig;
1045
- const version = localStorage.getItem("version") || "";
1046
-
1047
- return (
1048
- <>
1049
- <Space>
1050
- {userPageConfig && allowUserConfig ? <PageConfigButton menuCode={menuId} handleResetUserPageConfig={this.handleResetUserPageConfig} handleUpdateUserPageConfig={this.handleUpdateUserPageConfig} userCriteriaData={userCriteriaData} /> : ""}
1051
- {(showTableAdd !== false && buttons.includes("showTableAdd")) ?
1052
- <Dropdown styles={{ item: { padding: 0 } }} menu={{
1053
- items: [
1054
- { key: "add", label: <Button type="text" onClick={() => this.editRowTableNum("add")}><PlusSquareOutlined />{translate("${添加列表}")}</Button> },
1055
- { key: "delete", label: <Button type="text" disabled={(userPageConfig?.rowTableNumber || 0) <= 1} onClick={() => this.editRowTableNum("delete")}><DeleteOutlined />{translate("${删除列表}")}</Button> }]
1056
- }} arrow>
1057
- <Button><AppstoreAddOutlined /></Button>
1058
- </Dropdown>
1059
- : ""}
1060
- {funcMode == "common" && this.criteriaFormUseful() ? (
1061
- <Popover trigger="click" content={this.renderCriteriaForm()}>
1062
- <Button>
1063
- <SearchOutlined />
1064
- </Button>
1065
- </Popover>
1066
- ) : null}
1067
- {buttons.includes("ratmplSelect") && !readOnly ? (
1068
- <Button onClick={() => this.setState({ showRatmplSelector: true })}>
1069
- {translate("${选择}")}
1070
- </Button>
1071
- ) : (
1072
- ""
1073
- )}
1074
- {buttons.includes("dtmplAdd") && doCreate && !readOnly ? (
1075
- ltmplConfig.classAddConfigs &&
1076
- ltmplConfig.classAddConfigs.length > 0 ? (
1077
- <Popover
1078
- arrow={false}
1079
- content={this.getAddTmplButton(ltmplConfig.classAddConfigs)}
1080
- placement="bottomRight"
1081
- >
1082
- <Tooltip>
1083
- <Button>
1084
- <PlusOutlined />
1085
- </Button>
1086
- </Tooltip>
1087
- </Popover>
1088
- ) : (
1089
- <Tooltip title={translate("${" + (ltmplConfig.createBtnTitle || "创建") + "}")}>
1090
- <Button onClick={() => doCreate(null, false)}>
1091
- <PlusOutlined />
1092
- </Button>
1093
- </Tooltip>
1094
- )
1095
- ) : (
1096
- ""
1097
- )}
1098
- {(buttons.includes("dtmplCustomAdd") || customCreatable) &&
1099
- doCreate &&
1100
- !readOnly ? (
1101
- <Tooltip title={translate("${" + (ltmplConfig.createBtnTitle || "创建") + "}")}>
1102
- <Button onClick={() => doCreate(null, true)}>
1103
- <PlusCircleOutlined />
1104
- </Button>
1105
- </Tooltip>
1106
- ) : (
1107
- ""
1108
- )}
1109
- {buttons.includes("importLtmplExcel") && !readOnly ? (
1110
- <Tooltip title={translate("${导入}")}>
1111
- <Button
1112
- href={`#/${version}/${sourceId}/importer?menuId=${menuId}`}
1113
- target={"_blank"}
1114
- >
1115
- <ImportOutlined />
1116
- </Button>
1117
- </Tooltip>
1118
- ) : (
1119
- ""
1120
- )}
1121
- {buttons.includes("exportLtmplExcel") && !readOnly
1122
- ? this.renderExportButton("导出", "ltmpl-data-excel")
1123
- : ""}
1124
- {this.renderFileExportButton()}
1125
- {false
1126
- && buttons.includes("showChart") ? (
1127
- <Tooltip
1128
- title={
1129
- showL2Chart
1130
- ? translate("${隐藏}${图表}")
1131
- : translate("${展示}${图表}")
1132
- }
1133
- >
1134
- <Button onClick={this.handleShowChart}>
1135
- <LineChartOutlined />
1136
- </Button>
1137
- </Tooltip>
1138
- ) : (
1139
- ""
1140
- )}
1141
- {buttons.includes("analysis") ? (
1142
- <Tooltip
1143
- title={
1144
- showL2ActTable
1145
- ? translate("${隐藏}${数据分析}")
1146
- : translate("${展示}${数据分析}")
1147
- }
1148
- >
1149
- <Button onClick={this.handleDataAnalysis}>
1150
- <FundOutlined />
1151
- </Button>
1152
- </Tooltip>
1153
- ) : (
1154
- ""
1155
- )}
1156
- {buttons.includes("reStat") && !readOnly ? (
1157
- <Restat
1158
- value={restatParams}
1159
- serverKey={serverKey}
1160
- fields={ltmplConfig.reStatParams}
1161
- sourceId={sourceId}
1162
- onfinish={(restatParams) => {
1163
- this.actTableDoSearch(null);
1164
- this.setState({ restatParams: restatParams });
1165
- }
1166
- }
1167
- ></Restat>
1168
- ) : (
1169
- ""
1170
- )}
1171
- <Popover
1172
- content={
1173
- <Checkbox.Group
1174
- value={viewModels}
1175
- onChange={this.changeViewModel}
1176
- >
1177
- <Row style={{ width: "120px" }}>
1178
- <Col span={24}>
1179
- <Checkbox value={"table"}>{translate("${表格}")}</Checkbox>
1180
- </Col>
1181
- <Col span={24}>
1182
- <Checkbox value={"verticalList"}>
1183
- {translate("${纵向列表}")}
1184
- </Checkbox>
1185
- </Col>
1186
- <Col span={24}>
1187
- <Checkbox value="cardList">
1188
- {translate("${卡片列表}")}
1189
- </Checkbox>
1190
- </Col>
1191
- <Col span={24}>
1192
- <Checkbox value="ganttChart">
1193
- {translate("${甘特图}")}
1194
- </Checkbox>
1195
- </Col>
1196
- <Col span={24}>
1197
- <Checkbox value="calendar">
1198
- {translate("${日历}")}
1199
- </Checkbox>
1200
- </Col>
1201
- {/*<Col span={24}><Checkbox value={'horizontalList'}>横向列表</Checkbox></Col>*/}
1202
- </Row>
1203
- </Checkbox.Group>
1204
- }
1205
- title={translate("${视图}")}
1206
- placement="bottomRight"
1207
- trigger="click"
1208
- >
1209
- <Tooltip title={translate("${选择视图}")}>
1210
- <Button>
1211
- <RetweetOutlined />
1212
- </Button>
1213
- </Tooltip>
1214
- </Popover>
1215
- <Popover
1216
- content={
1217
- <ColumnSelector
1218
- columns={sortedColConfigs}
1219
- disabledColIds={disabledColIds}
1220
- hiddenColIds={hiddenColIds}
1221
- onChangeColSort={this.onChangeColSort}
1222
- onChangeHiddenCols={this.changeHiddenColumns}
1223
- />
1224
- }
1225
- title={translate("${排序和选择列}")}
1226
- placement="bottomRight"
1227
- trigger="click"
1228
- >
1229
- <Tooltip title={translate("${点击排序和选择列}")}>
1230
- <Button>
1231
- <TableOutlined />
1232
- </Button>
1233
- </Tooltip>
1234
- </Popover>
1235
- {doSearch ? (
1236
- <Button
1237
- className="hoverbig"
1238
- title={translate("${刷新}")}
1239
- onClick={() => {
1240
- this.actTableDoSearch(null);
1241
- }}
1242
- >
1243
- <ReloadOutlined />
1244
- </Button>
1245
- ) : (
1246
- ""
1247
- )}
1248
- {/*<Tooltip title={translate("${常用配置}")}>*/}
1249
- {/* <Button*/}
1250
- {/* className="hoverbig"*/}
1251
- {/* onClick={() => {*/}
1252
- {/* //doSearch(null);*/}
1253
- {/* }}*/}
1254
- {/* >*/}
1255
- {/* <SettingOutlined />*/}
1256
- {/* </Button>*/}
1257
- {/*</Tooltip>*/}
1258
-
1259
- </Space>
1260
- </>
1261
- );
1262
- };
1263
-
1264
- criteriaFormUseful = () => {
1265
- const { ltmplConfig } = this.props;
1266
- let { buttons, criteria, updrillButtonConfigs } = ltmplConfig;
1267
- if (
1268
- ((buttons.includes("query") ||
1269
- (updrillButtonConfigs && updrillButtonConfigs.length > 0)) &&
1270
- ((criteria && criteria.length > 0) ||
1271
- buttons.includes("drilling"))) ||
1272
- this.checkBoxUseful() || buttons.includes("multiRowEdit")
1273
- ) {
1274
- return true;
1275
- } else {
1276
- return false;
1277
- }
1278
- };
1279
-
1280
- checkBoxUseful = () => {
1281
- const { ltmplConfig } = this.props;
1282
- let { buttons, jumps, actions, fileExports, customButtons } = ltmplConfig;
1283
- if (
1284
- buttons.includes("batchDelete") ||
1285
- (actions && actions.length > 0) || (customButtons && customButtons.length > 0) ||
1286
- (jumps && jumps.length > 0) || (fileExports && fileExports.length > 0)
1287
- ) {
1288
- return true;
1289
- } else {
1290
- return false;
1291
- }
1292
- };
1293
-
1294
- actTableDoSearch = (data: object) => {
1295
- const { ltreeData } = this.state;
1296
- this.doSearch_(data, ltreeData);
1297
- }
1298
-
1299
- doSearch_ = async (criteriaData, ltreeData) => {
1300
- const { doSearch } = this.props;
1301
-
1302
- let new_serial_number = new Date().getTime();
1303
- if (doSearch && new_serial_number - serial_number > 2000) {
1304
- serial_number = new_serial_number;
1305
- await doSearch({ ...criteriaData, serial_number, ...ltreeData });
1306
- //busyReminderTime=0;
1307
- // }else{
1308
- // if(busyReminder){
1309
- // if(busyReminderTime==1){
1310
- // const { translate } = this.context;
1311
- // message.warning(translate("${系统忙,请稍后再试}"));
1312
- // busyReminderTime=0;
1313
- // }else{
1314
- // busyReminderTime=1;
1315
- // }
1316
- //}
1317
- }
1318
- }
1319
-
1320
- ltreeValueChange = async (v) => {
1321
- let ltreeEntitySelect = this.getLtreeEntitySelectCriteria();
1322
- const { ltreeData } = this.state;
1323
- const { criteriaData } = this.props;
1324
- if (ltreeData && ltreeData["c_" + ltreeEntitySelect.id] != v) {
1325
- let ltreeData_ = {};
1326
- ltreeData_["c_" + ltreeEntitySelect.id] = v;
1327
- await this.doSearch_(criteriaData, ltreeData_);
1328
- this.setState({ ltreeData: ltreeData_ });
1329
- }
1330
- }
1331
-
1332
-
1333
- doSearchDirect = (data: object) => {
1334
-
1335
- let { doSearch } = this.props;
1336
- if (doSearch) {
1337
- doSearch({ ...data, serial_number });
1338
- }
1339
- }
1340
-
1341
-
1342
- buttonClickable = () => {
1343
- let new_serial_number = new Date().getTime();
1344
- if (new_serial_number - serial_number > 1500) {
1345
- serial_number = new_serial_number;
1346
- return true;
1347
- } else {
1348
- return false;
1349
- }
1350
- }
1351
-
1352
- renderCriteriaForm = () => {
1353
- let { loading, selectedRows, selectedDatas, userCriteriaData, editings, tabActiveKey, tabsOptions } = this.state;
1354
- let { ltmplConfig, serverKey, sourceId } = this.props;
1355
- const tabCriteriaId = tabsOptions.find(r => r.key === tabActiveKey)?.id;
1356
- return (
1357
- <CriteriaForm
1358
- key={sourceId}
1359
- serverKey={serverKey}
1360
- loading={loading}
1361
- selectedDatas={selectedDatas}
1362
- selectedRows={selectedRows}
1363
- doCustomButton={this.doCustomButton}
1364
- ltmplConfig={ltmplConfig}
1365
- data={userCriteriaData}
1366
- doCQuery={this.doSelectedCQuery}
1367
- doAction={this.doSelectedAction}
1368
- doDelete={this.doDelete}
1369
- doJump={this.doSelectedJump}
1370
- doSearch={this.actTableDoSearch}
1371
- doMultiRowEdit={this.doMultiRowEdit}
1372
- multiRowEditDisabled={!editings.length}
1373
- tabCriteriaId={tabCriteriaId}
1374
- />
1375
- );
1376
- };
1377
- //暂时无用
1378
- // queryTotal = async () => {
1379
- // const { queryKey} = this.state;
1380
- // const { serverKey }=this.props;
1381
- // let aggregateVO:AggregateVO = await HcserviceV3.requestQueryAggregates(serverKey, queryKey.key);
1382
- // this.setState({
1383
- // aggregateVO,
1384
- // });
1385
- // return aggregateVO;
1386
- // };
1387
-
1388
- getLtreeEntitySelectCriteria = () => {
1389
- let { ltmplConfig } = this.props
1390
-
1391
- if (ltmplConfig && ltmplConfig.criteria) {
1392
- for (let c of ltmplConfig.criteria) {
1393
- if (c?.extControlType == "ltree-entity-select" || c?.extControlType == "ltree-entity-select-value") {
1394
- return c;
1395
- }
1396
- }
1397
- }
1398
- return undefined;
1399
- }
1400
-
1401
- // 行内编辑start
1402
- editRowEdit = (code: string) => {
1403
- this.setState({ editings: [...this.state.editings, code] });
1404
- }
1405
-
1406
- cancelRowEdit = (code: string) => {
1407
- this.setState({ editings: this.state.editings.filter(r => r !== code) });
1408
- }
1409
-
1410
- // 单独提交
1411
- postLtmplData = async (dtmplData) => {
1412
- const { serverKey, sourceId } = this.props;
1413
- let res = await HcserviceV3.postLtmplData(
1414
- serverKey,
1415
- sourceId,
1416
- dtmplData,
1417
- message
1418
- );
1419
- if (res.status === "success") {
1420
- this.cancelRowEdit(dtmplData["唯一编码"]);
1421
- this.actTableDoSearch(undefined);
1422
- this.formRef.current.resetFields([]);
1423
- }
1424
- };
1425
-
1426
- // 批量提交
1427
- postLtmplMultiData = async (dtmplData) => {
1428
- const { serverKey, sourceId } = this.props;
1429
- let res = await HcserviceV3.postLtmplMultiData(
1430
- serverKey,
1431
- sourceId,
1432
- dtmplData,
1433
- message
1434
- );
1435
- if (res.status === "success") {
1436
- this.cancelRowEdit(dtmplData["唯一编码"]);
1437
- this.actTableDoSearch(undefined);
1438
- this.formRef.current.resetFields([]); // 重置表单数据
1439
- this.setState({ editings: [] });
1440
- }
1441
- };
1442
-
1443
- saveRowData = async (data: DtmplData) => {
1444
- const { code } = data;
1445
- let currentForm = this.formRef.current;
1446
- let dtmplData = { "唯一编码": code };
1447
- await currentForm.validateFields().then((values) => {
1448
- for (let key in values) {
1449
- if (values.hasOwnProperty(key) && key.startsWith(code)) {
1450
- dtmplData[key.split("_")[1]] = values[key];
1451
- }
1452
- }
1453
- this.postLtmplData(dtmplData);
1454
- });
1455
- }
1456
-
1457
- // 批量提交
1458
- doMultiRowEdit = async () => {
1459
- const { editings } = this.state;
1460
- if (!editings.length) {
1461
- return;
1462
- }
1463
- let currentForm = this.formRef.current;
1464
- let dtmplData = {};
1465
- await currentForm.validateFields().then((values) => {
1466
- for (let key in values) {
1467
- if (values.hasOwnProperty(key)) {
1468
- const code = key.split("_")[0];
1469
- if (editings.includes(code)) {
1470
- dtmplData[code] = { "唯一编码": code, ...(dtmplData[code] || {}), [key.split("_")[1]]: (values[key] || values[key] === 0) ? values[key] : null }
1471
- }
1472
- }
1473
- }
1474
- this.postLtmplMultiData({ data: JSON.stringify(Object.values(dtmplData)) });
1475
- });
1476
- }
1477
-
1478
- // 批量编辑表单值更新
1479
- doRowEditFormChange = (data: { [key: string]: any }) => {
1480
- const { editings } = this.state;
1481
- const code = Object.keys(data)[0].split("_")[0];
1482
- if (!editings.includes(code)) {
1483
- this.setState({ editings: [...editings, code] });
1484
- }
1485
- }
1486
- // 行内编辑end
1487
-
1488
- // 删除确认弹窗打开
1489
- doDelModalOpen = (record: DtmplData) => {
1490
- this.setState({ record, recordCode: record.code, delModalOpen: true });
1491
- };
1492
-
1493
- // tab页切换查询
1494
- doTabSearch = (val: string) => {
1495
- const { tabsOptions, tabActiveKey } = this.state;
1496
- let new_serial_number = new Date().getTime();
1497
- if (new_serial_number - serial_number < 2000) return;
1498
- if (tabActiveKey === val) return;
1499
- const ids = tabsOptions.find(r => r.key === "all").ids || [];
1500
- const item = tabsOptions.find(r => r.key === val);
1501
- let params = ids?.reduce((total, cur) => {
1502
- total[cur] = (val === "all" || cur !== item.id) ? undefined : val;
1503
- return total;
1504
- }, {});
1505
- this.actTableDoSearch(params);
1506
- this.setState({ tabActiveKey: val });
1507
- }
1508
-
1509
- renderAggregates() { // 统计数据渲染
1510
- const { aggregateVO } = this.state;
1511
- const { ltmplConfig } = this.props;
1512
- const aggregates = aggregateVO?.aggregates || [];
1513
- const columns = ltmplConfig?.columns || [];
1514
- return aggregates?.length ? <div className="aggregates">{aggregates.map(item => {
1515
- const column = columns.find(r => r.id === item.fieldId);
1516
- if (!column) {
1517
- return "";
1518
- }
1519
- const { dataUnit, themeColor, themeIcon } = column;
1520
- return <Card className="aggregate-card" hoverable styles={{ body: { padding: 20 } }}>
1521
- <div style={{ display: "flex", alignItems: "start", justifyContent: "space-between" }}>
1522
- <div style={{ width: "calc(100% - 40px)" }}>
1523
- <p className="title">{item.fieldTitle}</p>
1524
- <div className="value">
1525
- <Text
1526
- style={{ maxWidth: "100%" }}
1527
- ellipsis={{ tooltip: item.value }}
1528
- >
1529
- <span className="number">{item.value}</span>
1530
- </Text>
1531
- {dataUnit ? <span className="unit">{dataUnit}</span> : ""}
1532
- </div>
1533
- </div>
1534
- {themeIcon ?
1535
- <div className="icon" style={{ color: themeColor, background: `${themeColor}26` }}>
1536
- <Icon type={themeIcon} />
1537
- </div> :
1538
- ""}
1539
- </div>
1540
- </Card>
1541
- }).filter(Boolean)
1542
- }</div > : "";
1543
- }
1544
-
1545
- renderContent = () => {
1546
- let {
1547
- queryKey, loading, selectedRows, hiddenRowCodes, viewModels, sortedColConfigs, hiddenColIds, showL2ActTable,
1548
- pageInfo, editings, userCriteriaData, tabsOptions, tabActiveKey, pageSizeOptions
1549
- } = this.state;
1550
- let {
1551
- mainCode, sourceId, ltmplConfig, funcMode, operatable,
1552
- title, collapsible,
1553
- onChangePage, serverKey, criteriaData, showEmpty, loadDataCallback,
1554
- showView, doEdit, doRAction, customEditable, readOnly, tableType, showPagination, showAggregates, userPageConfig,
1555
- doEdit2D, doView2D, showTableAdd, setUserPageConfig
1556
- } = this.props;
1557
- const { translate } = this.context;
1558
-
1559
- if (!ltmplConfig || !sourceId) {
1560
- return (
1561
- <>
1562
- <Card loading={loading}></Card>
1563
- <Table loading={loading}></Table>
1564
- </>
1565
- );
1566
- }
1567
-
1568
- let tableColumns = ColumnBuilder.buildTableColumns(
1569
- {
1570
- ltmplConfig, operatable,
1571
- hiddenColIds, hiddenRowCodes, sortedColConfigs, showView,
1572
- doEdit,
1573
- doRAction, customEditable,
1574
- serverKey, readOnly,
1575
- sourceId, translate, unHiden: this.unHiden,
1576
- onHide: this.onHide, doCustomButton: this.doCustomButton, doRowJump: this.doRowJump,
1577
- blockMenuTreeDrawerOpen: this.blockMenuTreeDrawerOpen,
1578
- doRowAction: this.doRowAction, doDeleteByCode: this.doDeleteByCode, sortColumns: criteriaData["sortColIds"],
1579
- editings, editRowEdit: this.editRowEdit, cancelRowEdit: this.cancelRowEdit, saveRowData: this.saveRowData,
1580
- doDelModalOpen: this.doDelModalOpen, mainCode, criteriaData: userCriteriaData, actTableDoSearch: this.actTableDoSearch,
1581
- columnResize: userPageConfig?.colResize, doEdit2D, doView2D
1582
- }
1583
- );
1584
-
1585
- let { buttons, extDisplayConfig, rowCardCount, customViewPagePath, splitTabShowType } = ltmplConfig;
1586
- let { primaryColumn, primaryColumnLabel, secondColumn, secondColumnLabel, mainPicture, mainPictureLabel, labelColumn, cardShowCols, notDisplayFieldName, colNumOnRow } = extDisplayConfig;
1587
- let displayCriteriaCard: boolean = false;
1588
- if (funcMode == "simple" || funcMode == "common") {
1589
- displayCriteriaCard = false;
1590
- } else if (this.criteriaFormUseful()) {
1591
- displayCriteriaCard = true;
1592
- }
1593
-
1594
- let columnConfigs = [];
1595
- if (sortedColConfigs) {
1596
- for (let colConfig of sortedColConfigs) {
1597
- if (!hiddenColIds.includes(colConfig.id)) {
1598
- columnConfigs.push(colConfig);
1599
- }
1600
- }
1601
- }
1602
-
1603
- const sortColumnData = [];
1604
- if (Array.isArray(criteriaData["sortColIds"])) {
1605
- sortColumnData.push(...criteriaData["sortColIds"]);
1606
- }
1607
-
1608
- let ltreeEntitySelect = this.getLtreeEntitySelectCriteria();
1609
-
1610
- // actTable渲染
1611
- const renderActTable = loading ? (
1612
- <Table loading={loading}></Table>
1613
- ) : (tableType == "report" ? <ReportTable
1614
- tableProps={{ scrollY: ltmplConfig.scrollY, clickDisplayTotal: !ltmplConfig.directShowTotal }}
1615
- serverKey={serverKey} hiddenColIds={hiddenColIds}
1616
- maxSelectedRows={this.checkBoxUseful() ? 1000 : -1}
1617
- columns={tableColumns}
1618
- selectedRows={selectedRows} queryKey={queryKey}
1619
- onChangeRowSelection={this.changeRowSelection}
1620
- leftFixedCols={ltmplConfig.leftFixedCols}
1621
- onChangeResize={this.onChangeResize}
1622
- showEmpty={showEmpty}
1623
- /> :
1624
- <QueryTable key={"querytable" + sourceId} sourceId={sourceId}
1625
- // queryTotal={this.queryTotal}
1626
- tableProps={{ scrollY: ltmplConfig.scrollY, clickDisplayTotal: !ltmplConfig.directShowTotal }}
1627
- serverKey={serverKey}
1628
- onChangePage={onChangePage}
1629
- viewModels={viewModels}
1630
- primaryColumn={primaryColumn}
1631
- columnConfigs={columnConfigs} summaryConfigs={ltmplConfig.totalColumnConfigs}
1632
- maxSelectedRows={this.props?.tableType === "select" || this.checkBoxUseful() ? 10000 : -1}
1633
- selectedRows={selectedRows} columns={tableColumns}
1634
- hiddenRowCodes={hiddenRowCodes}
1635
- pageInfo={pageInfo}
1636
- queryKey={queryKey}
1637
- onChangeRowSelection={this.changeRowSelection}
1638
- subtotalXColumn={
1639
- ltmplConfig.subtotalXColumn == null ||
1640
- ltmplConfig.subtotalXColumn.length <= 0
1641
- ? null
1642
- : ltmplConfig.subtotalXColumn
1643
- }
1644
- groupIColumns={ltmplConfig.groupIColumns}
1645
- doSearch={this.actTableDoSearch}
1646
- sortColumnData={sortColumnData}
1647
- cardListConfig={{ primaryColumn, primaryColumnLabel, secondColumn, secondColumnLabel, mainPicture, mainPictureLabel, labelColumn, cardShowCols, rowCardCount, buttons, customViewPagePath, mainCode, notDisplayFieldName, colNumOnRow }}
1648
- ltmplConfig={ltmplConfig}
1649
- showView={showView}
1650
- showPagination={showPagination}
1651
- onChangeAggregateVO={(val) => this.setState({ aggregateVO: val })}
1652
- onChangeResize={this.onChangeResize}
1653
- pageSizeOptions={pageSizeOptions}
1654
- showEmpty={showEmpty}
1655
- loadDataCallback={loadDataCallback}
1656
- />);
1657
-
1658
- // tab拆解条件渲染
1659
- const renderSplitTab = <>
1660
- {splitTabShowType === "tab" ? <Tabs tabBarGutter={12} size="small" activeKey={tabActiveKey} items={tabsOptions} onChange={this.doTabSearch} tabBarExtraContent={this.renderHeaderButtons()} /> : ""}
1661
- {splitTabShowType === "tag" ? <div className="split-tab" ><Space className="split-tab-left" >{tabsOptions.map(r => <Button style={{ height: "28px" }} size="small" onClick={() => this.doTabSearch(r.key)} shape="round" type={tabActiveKey === r.key ? "primary" : "default"}>{r.title}</Button>)}</Space><div className="split-tab-right">{this.renderHeaderButtons()}</div></div> : ""}
1662
- {splitTabShowType === "radio" ? <div className="split-tab" ><div className="split-tab-left"><Radio.Group onChange={(e) => this.doTabSearch(e.target.value)} value={tabActiveKey} options={tabsOptions} /></div><div className="split-tab-right">{this.renderHeaderButtons()}</div></div> : ""}
1663
- </>;
1664
-
1665
- const renderTable = <Layout hasSider style={{ backgroundColor: "#fff" }}>
1666
- <Sider
1667
- width={ltreeEntitySelect ? 260 : 0}
1668
- theme={"light"}
1669
- style={{ paddingRight: ltreeEntitySelect ? '10px' : "0px" }}
1670
- >
1671
- {ltreeEntitySelect ?
1672
- <EntryControl style={{ width: "300px" }} onChange={this.ltreeValueChange} fieldConfig={ltreeEntitySelect}></EntryControl> : null}
1673
- </Sider>
1674
- <Layout style={{ backgroundColor: "#fff" }}>
1675
- <Content style={{ overflow: "initial" }}>
1676
- {showAggregates ? this.renderAggregates() : ""}
1677
- {displayCriteriaCard ? this.renderCriteriaForm() : null}
1678
- {buttons.includes("rowEdit") ? <AntdForm ref={this.formRef} component={false} onValuesChange={this.doRowEditFormChange}>{renderActTable}</AntdForm> : renderActTable}
1679
- <PageChart ltmplConfig={ltmplConfig} criteriaData={userCriteriaData} />
1680
- </Content>
1681
- </Layout>
1682
- </Layout>;
1683
-
1684
- return (
1685
- <>
1686
- {buttons.includes("analysis") && showL2ActTable ? (
1687
- <div>
1688
- <L2ActTable
1689
- serverKey={serverKey}
1690
- innerQueryKey={queryKey.key}
1691
- sourceId={sourceId}
1692
- />
1693
- <Divider
1694
- dashed
1695
- style={{ borderTopColor: "#40a9ff" }}
1696
- plain
1697
- ></Divider>
1698
- </div>
1699
- ) : (
1700
- ""
1701
- )}
1702
- <div className="actTable">
1703
- {["complete", "common"].includes(funcMode) ?
1704
- <Row>
1705
- <Col span={24}>
1706
- {collapsible ? null : (
1707
- <span>
1708
- {ltmplConfig.header ? (
1709
- <div
1710
- style={{ padding: "6px" }}
1711
- dangerouslySetInnerHTML={{ __html: ltmplConfig.header }}
1712
- ></div>
1713
- ) : null}
1714
- {tabsOptions.length ? renderSplitTab :
1715
- <>
1716
- <h3 >
1717
- <p className="act-table-title" style={{ position: "relative", float: "left", marginBottom: "4px" }}> {!title
1718
- ? translate("${" + ltmplConfig.title + "}")
1719
- : typeof title == "string"
1720
- ? translate("${" + title + "}")
1721
- : title}</p>
1722
- </h3>
1723
- <p className="fr" style={{ marginBottom: "4px" }}>{this.renderHeaderButtons()}</p>
1724
- </>}
1725
- </span>
1726
- )}
1727
- </Col>
1728
- </Row> : null}
1729
- {(showTableAdd !== false && buttons.includes("showTableAdd")) ? <RowTable mainTable={renderTable} ltmplConfig={ltmplConfig} tableNumber={userPageConfig?.rowTableNumber} sourceId={sourceId} rowTableCondig={userPageConfig?.rowTableCondig || []} setUserPageConfig={setUserPageConfig} /> : renderTable}
1730
- {/*此处放页脚*/}
1731
- {ltmplConfig.footer ? (
1732
- <div
1733
- style={{ padding: "6px" }}
1734
- dangerouslySetInnerHTML={{ __html: ltmplConfig.footer }}
1735
- ></div>
1736
- ) : null}
1737
- </div>
1738
- </>
1739
- );
1740
- };
1741
-
1742
- saveRatmplSelect = async (selectedRows: SelectedRow[]) => {
1743
- this.setState({
1744
- showRatmplSelector: false,
1745
- });
1746
- const { serverKey, sourceId, mainCode, doSearch } = this.props;
1747
- if (!selectedRows || selectedRows.length <= 0) {
1748
- return;
1749
- }
1750
-
1751
- //查询
1752
- const codes: string[] = [];
1753
- for (let row of selectedRows) {
1754
- codes.push(row.code);
1755
- }
1756
- await HcserviceV3.saveRatmplSelectCodes(
1757
- serverKey,
1758
- sourceId,
1759
- mainCode,
1760
- codes
1761
- );
1762
- this.actTableDoSearch(null);
1763
- };
1764
-
1765
- render() {
1766
- let { queryKey, loading, blockMenuTreeDrawerOpen, recordCode, record, showRatmplSelector, delModalOpen } = this.state;
1767
- let { sourceId, ltmplConfig, title, collapsible, initCollapse, tip, serverKey, mainCode } = this.props;
1768
- const { strongDeleteConfirmText } = ltmplConfig || {};
1769
- const { translate } = this.context;
1770
- const delFormRef = React.createRef<FormInstance>(); // 强删除表单的form Ref
1771
-
1772
- if (!ltmplConfig || !sourceId) {
1773
- return (
1774
- <>
1775
- <Card loading={loading}></Card>
1776
- <Table loading={loading}></Table>
1777
- </>
1778
- );
1779
- }
1780
-
1781
- return (
1782
- <>
1783
- {this.renderAboveCustomPage()}
1784
- {collapsible ? (
1785
- <CollapseCard
1786
- initCollapse={initCollapse}
1787
- title={
1788
- <>
1789
- {!title ? ltmplConfig.title : title}
1790
- <ToolTipBar
1791
- content={tip ? tip : ltmplConfig ? ltmplConfig.tip : null}
1792
- />
1793
- </>
1794
- }
1795
- id={queryKey + ltmplConfig.id}
1796
- className={`hoverable`}
1797
- styles={{ header: { background: "#f2f4f5" }, body: { padding: "6px" } }}
1798
- loading={loading}
1799
- //暂时注释掉,后续要支持配置。
1800
- extra={this.renderHeaderButtons()}
1801
- >
1802
- {this.renderContent()}
1803
- </CollapseCard>
1804
- ) : (
1805
- <>{this.renderContent()}</>
1806
- )}
1807
- {this.renderOhterCustomPage()}
1808
- <BlockMenuTreeDrawer
1809
- onOk={() => {
1810
- this.setState({
1811
- blockMenuTreeDrawerOpen: false,
1812
- });
1813
- }}
1814
- onCancel={() => {
1815
- this.setState({
1816
- blockMenuTreeDrawerOpen: false,
1817
- });
1818
- }}
1819
- open={blockMenuTreeDrawerOpen}
1820
- roleCode={recordCode}
1821
- />
1822
- {showRatmplSelector ? (
1823
- <ModelSelectTable
1824
- serverKey={serverKey}
1825
- // defaultCriteriaValue={fieldGroupConfig.defaultCriteriaValue}
1826
- // maxSelectedRows={fieldGroupConfig.max}
1827
- open={showRatmplSelector}
1828
- onOK={this.saveRatmplSelect}
1829
- onCancel={() => {
1830
- this.setState({ showRatmplSelector: false });
1831
- }}
1832
- mainCode={mainCode}
1833
- sourceId={sourceId}
1834
- existRelation={"false"}
1835
- />
1836
- ) : ""}
1837
- {delModalOpen ?
1838
- <Modal
1839
- open={delModalOpen}
1840
- title={translate("${确定要[删除]此数据吗}?")}
1841
- onOk={() => delFormRef.current.validateFields().then(() => this.doDeleteByCode(record)).catch(() => { })}
1842
- onCancel={() => this.setState({ record: undefined, recordCode: undefined, delModalOpen: false })}
1843
- >
1844
- <AntdForm ref={delFormRef} layout="vertical">
1845
- <AntdForm.Item noStyle >
1846
- <Alert message={translate("${风险操作,此操作不可逆,是否继续操作}?")} type="warning" showIcon style={{ margin: "12px 0" }} />
1847
- </AntdForm.Item>
1848
- <AntdForm.Item
1849
- label={<div>{translate("${请手动输入}")}<span style={{ color: "#ff4d4f" }}> “ {translate("${" + strongDeleteConfirmText + "}")} ” </span>{translate("${完成验证}")}</div>}
1850
- name="rule"
1851
- rules={[
1852
- { required: true, message: translate("${请输入}" + "${" + strongDeleteConfirmText + "}") },
1853
- { validator: (_, value) => value && value !== translate("${" + strongDeleteConfirmText + "}") ? Promise.reject(new Error(translate("${请输入}" + "${" + strongDeleteConfirmText + "}"))) : Promise.resolve() }
1854
- ]}
1855
- >
1856
- <Input placeholder={translate("${" + strongDeleteConfirmText + "}")} />
1857
- </AntdForm.Item>
1858
- </AntdForm>
1859
- </Modal> : ""}
1860
- </>
1861
- );
1862
- }
1863
- }
1864
-
1865
- export default ActTable;
1
+ import React, { ReactNode } from "react";
2
+ import {
3
+ Button, Card, Checkbox, Col, Divider, Popover, Row, Space, Drawer, Tooltip,
4
+ message, Layout, Table, Form as AntdForm, FormInstance, Modal, Input, Alert, Tabs, Radio, Typography,
5
+ Dropdown
6
+ } from "antd";
7
+ import {
8
+ ExportOutlined, FundOutlined, LineChartOutlined,
9
+ PlusCircleOutlined, PlusOutlined, ReloadOutlined, RetweetOutlined, SearchOutlined,
10
+ TableOutlined, ImportOutlined, AppstoreAddOutlined, PlusSquareOutlined, DeleteOutlined
11
+ } from "@ant-design/icons";
12
+ import _ from "lodash";
13
+ import "./index.css";
14
+ import {
15
+ ActTableMode, ActTableViewModel, AggregateVO, ClassAddConfig, ColumnConfig,
16
+ CustomButton, CustomButtonConfig, DoEditParam, DtmplData, JumpConfig, LtmplConfig, QueryKey,
17
+ SelectedRow, ShowViewParam, TmplBaseProps,
18
+ } from "../tmpl/interface";
19
+ import HcserviceV3 from "../tmpl/hcservice-v3";
20
+ import HCDataSource from "../tmpl/hc-data-source";
21
+ import QueryTable from "./query-table";
22
+ import CriteriaForm from "./../form/criteria-form";
23
+ import ProgramConfig from "../units";
24
+ import ColumnSelector from "./column/column-selector";
25
+ import ExportFrame, { ExportType, ExportMode } from "../export/export-frame";
26
+ import L2ActTable from "./l2-act-table";
27
+ import Restat from "./stat/restat";
28
+ import CollapseCard from "../controls/collapse-card";
29
+ import ToolTipBar from "../detail/tooltipbar";
30
+ import { LocaleContext } from "../locale/LocaleProvider";
31
+ import BlockMenuTreeDrawer from "../module/block-menu-tree-drawer";
32
+ import ModelSelectTable from "./../table/modal-select-table";
33
+ import ColumnBuilder from "./column/column-builder";
34
+ import ReportTable from "./report-table";
35
+ import EntryControl from "../controls/entry-control";
36
+ import DraggableModal from "../module/draggable-modal";
37
+ import Icon from "../icon/aliIcon";
38
+ import PageConfigButton from "./page-config-button";
39
+ import { defPageSizeOptions } from "./pagination"; // 默认分页数
40
+ import PageChart from "./page-chart"; // 展示图表
41
+ import RowTable from "./row-table";
42
+
43
+ const { Content, Sider } = Layout;
44
+ const { Text } = Typography;
45
+
46
+ type Level = "l1" | "l2";
47
+
48
+ const enumTypes = ["select", "multiselect", "texttags", "checkbox", "radio", "steps"];
49
+
50
+
51
+ const defaultDisabledColIds: string[] = ["20000", "10000"];
52
+
53
+ interface ActTableProps extends TmplBaseProps {
54
+ criteriaData: object;
55
+ pageNo: number;
56
+ pageSize: number;
57
+ onChangePage: (pageNo: number, pageSize: number, pageSizeOptions?: number[]) => void;
58
+ ltmplConfig: LtmplConfig;
59
+ menuId?: string;
60
+ showView?: (showVievParam: ShowViewParam) => void;
61
+ doCreate?: (addtmplId: string, toCustomPage: boolean) => void;
62
+ customCreatable?: boolean;
63
+ doEdit?: (doEditParam: DoEditParam) => void;
64
+ customEditable?: boolean;
65
+ doDelete?: (code: string) => void;
66
+ doSearch?: (params: object) => void;
67
+ doRAction?: (ractionId: string, mainCode: string) => void;
68
+ level?: Level;
69
+ funcMode?: ActTableMode;
70
+ title?: ReactNode;
71
+ tip?: any;
72
+ collapsible?: boolean;
73
+ initCollapse?: boolean;
74
+ readOnly?: boolean;
75
+ tableType?: "common" | "report" | "select";
76
+ operatable?: boolean;
77
+ onSelectChange?: (val: { selectedRows: SelectedRow[], selectedDatas: DtmplData[] }) => void;
78
+ defShowType?: ActTableViewModel; // 默认视图
79
+ showPagination?: boolean; // 是否显示分页
80
+ showAggregates?: boolean; // 是否显示统计数据
81
+ userPageConfig?: { [key: string]: any }; // 用户页面配置本地缓存
82
+ setUserPageConfig?: (config: { [key: string]: any }) => void; // 更新用户页面配置本地缓存
83
+ resetUserPageConfig?: () => void; // 重置用户页面配置本地缓存
84
+ allowUserConfig?: boolean; // 是否可用户自定义配置
85
+ deleteCallback?: (val: object) => void; // 删除回调
86
+ onUpdatePageSizeOptions?: (val: number[]) => void; // 更新分页数数组
87
+ showEmpty?: boolean; // 空数据是否显示空状态,默认显示
88
+ loadDataCallback?: (val: object[]) => void; // 请求数据回调函数
89
+ doEdit2D?: (val: string) => void; // 2D图编辑
90
+ doView2D?: (val: string) => void; // 2D图查看
91
+ showTableAdd?: boolean; // 是否支持添加列表
92
+ }
93
+
94
+ interface ActTableStat {
95
+ sortedColConfigs?: ColumnConfig[];
96
+ queryKey?: QueryKey;
97
+ loading?: boolean;
98
+ selectedRows?: SelectedRow[];
99
+ selectedDatas?: DtmplData[];
100
+ hiddenColIds?: string[];
101
+ drillingColIds?: string[];
102
+ disabledColIds?: string[];
103
+ hiddenRowCodes?: string[];
104
+ viewModels?: ActTableViewModel[];
105
+ showL2ActTable?: boolean;
106
+ showL2Chart?: boolean;
107
+ recordCode?: string;
108
+ record?: DtmplData;
109
+ blockMenuTreeDrawerOpen?: boolean;
110
+ showCustomCard?: boolean;
111
+ customButton?: CustomButton;
112
+ customButtonData?: DtmplData[];
113
+ showRatmplSelector?: boolean;
114
+ aggregateVO?: AggregateVO;
115
+ restatParams?: object;
116
+ pageInfo?: object;
117
+ ltreeData?: object;
118
+ userCriteriaData: object;
119
+ editings: string[]; // 行内编辑code
120
+ delModalOpen?: boolean; // 强删除弹窗是否打开
121
+ tabsOptions?: { key: string, value: string, label: React.ReactNode, title?: string, id?: string, ids?: string[] }[]; // tabs选项
122
+ tabActiveKey?: string; // Tabs选中项
123
+ pageSizeOptions?: number[]; // 设备分页数
124
+ customDrawerSize?: number | string; // 自定义页面抽屉宽度
125
+ tableNumber?: number; // 添加多表格-显示表格数量
126
+ }
127
+ let serial_number = new Date().getTime();
128
+ let busyReminderTime = 0;
129
+ class ActTable extends React.PureComponent<ActTableProps, ActTableStat> {
130
+ state = {
131
+ //tableColumns: undefined,
132
+ sortedColConfigs: undefined,
133
+ queryKey: undefined,
134
+ loading: true,
135
+ disableCols: undefined,
136
+ hiddenColIds: defaultDisabledColIds,
137
+ selectedRows: [],
138
+ selectedDatas: [],
139
+ hiddenRowCodes: [],
140
+ viewModels: [],
141
+ drillingColIds: undefined,
142
+ disabledColIds: undefined,
143
+ showL2ActTable: false,
144
+ showL2Chart: false,
145
+ recordCode: undefined,
146
+ record: undefined,
147
+ blockMenuTreeDrawerOpen: false,
148
+ showCustomCard: false,
149
+ customButtonData: undefined,
150
+ customButton: undefined,
151
+ showRatmplSelector: false,
152
+ aggregateVO: undefined,
153
+ restatParams: undefined,
154
+ pageInfo: { pageNo: 1, pageSize: 10 },
155
+ ltreeData: {},
156
+ userCriteriaData: undefined,
157
+ editings: [], // 行内编辑code
158
+ delModalOpen: false, // 强删除弹窗是否打开
159
+ tabsOptions: [],
160
+ tabActiveKey: "all",
161
+ pageSizeOptions: defPageSizeOptions,
162
+ customDrawerSize: undefined,
163
+ tableNumber: 0,
164
+ showTableAdd: undefined
165
+ };
166
+
167
+ static contextType = LocaleContext;
168
+ context: React.ContextType<typeof LocaleContext>;
169
+ formRef = React.createRef<FormInstance>(); // 可编辑表格的form Ref
170
+ isJumpRef = React.createRef<boolean>(); // 是否是action跳转
171
+
172
+ static defaultProps = {
173
+ criteriaData: {},
174
+ funcMode: "complete",
175
+ collapsible: false,
176
+ initCollapse: false,
177
+ readOnly: false,
178
+ operatable: true,
179
+ showPagination: true,
180
+ showAggregates: true,
181
+ showEmpty: true,
182
+ };
183
+
184
+ // 获取标签选项
185
+ getTabsOptions = async () => {
186
+ const { ltmplConfig, criteriaData, sourceId } = this.props;
187
+ const { translate } = this.context;
188
+ const { split2TabCriteria, showSplitTabDataCount } = ltmplConfig || {};
189
+ if (!split2TabCriteria) {
190
+ return;
191
+ }
192
+ const allIds = [];
193
+ let groupCount = [];
194
+ if (showSplitTabDataCount) {
195
+ groupCount = await HcserviceV3.getLtmplDataGroupCount(sourceId);
196
+ }
197
+ const options = split2TabCriteria.map(fieldConfig => {
198
+ const id = `c_${fieldConfig.id}`;
199
+ allIds.push(id);
200
+ if (enumTypes.includes(fieldConfig.controlType || fieldConfig.extControlType)) {
201
+ const items = HCDataSource.getEnums(fieldConfig.mstrucId);
202
+ const options = items.map((item) => {
203
+ const count = groupCount.find(r => r[0]?.fieldId === fieldConfig.id && r[0]?.value === item.title)?.[1]?.value;
204
+ const countVal = (count || count === 0) ? ` (${count})` : "";
205
+ return {
206
+ label: <span style={{ padding: "0 10px" }}>{translate("${" + item.title + "}")}{countVal}</span>,
207
+ key: item.value,
208
+ id,
209
+ title: translate("${" + item.title + "}") + countVal,
210
+ value: item.value
211
+ };
212
+ });
213
+ if (fieldConfig.relDeduplication && fieldConfig.exceptCodes?.length) {
214
+ return options.filter(item => !fieldConfig.exceptCodes.includes(item.key));
215
+ }
216
+ return options;
217
+ }
218
+ if ([fieldConfig.controlType, fieldConfig.extControlType].includes("single-checkbox")) {
219
+ const count = groupCount.find(r => r[0]?.fieldId === fieldConfig.id)?.[1]?.value;
220
+ const countVal = (count || count === 0) ? ` (${count})` : "";
221
+ return [{
222
+ label: <span style={{ padding: "0 10px" }}>{translate("${" + fieldConfig.title + "}")}{countVal}</span>,
223
+ key: "1",
224
+ id,
225
+ title: translate("${" + fieldConfig.title + "}") + countVal,
226
+ value: "1",
227
+ }];
228
+ }
229
+ return [];
230
+ })?.flat() || [];
231
+ const defOption = {
232
+ label: <span style={{ padding: "0 10px" }}>{translate("${全部}")}</span>,
233
+ key: "all",
234
+ ids: allIds,
235
+ title: translate("${全部}"),
236
+ value: "all"
237
+ };
238
+ const temId = Object.keys(criteriaData).find(r => allIds.includes(r));
239
+ const tabActiveKey = temId ? criteriaData[temId] : "all";
240
+ this.setState({ tabsOptions: [defOption, ...options], tabActiveKey });
241
+ }
242
+
243
+ loadData = async (
244
+ hiddenColIds: string[],
245
+ hiddenRowCodes: string[],
246
+ sortedColConfigs: ColumnConfig[]
247
+ ) => {
248
+ const {
249
+ sourceId, criteriaData, ltmplConfig,
250
+ mainCode, level, pageNo, pageSize, serverKey, defShowType, userPageConfig
251
+ } = this.props;
252
+
253
+ if (!this.isSameSourceQuery(sourceId, criteriaData)) {
254
+ return
255
+ }
256
+
257
+
258
+ if (!ltmplConfig) {
259
+ return;
260
+ }
261
+ // 处理菜单切换,查询条件清空,重置tab拆解条件选中项
262
+ const tabActiveKey = ltmplConfig.split2TabCriteria?.find(r => criteriaData[`c_${r.id}`])?.id;
263
+ this.setState({
264
+ loading: true,
265
+ userCriteriaData: criteriaData,
266
+ tabActiveKey: tabActiveKey ? criteriaData[`c_${tabActiveKey}`] : "all"
267
+ });
268
+ let disabledColIds: string[] = [];
269
+ let hiddenColIds_ = [...hiddenColIds];
270
+ if (criteriaData && criteriaData["drillingColIds"]) {
271
+ let dColIds = [...criteriaData["drillingColIds"]];
272
+ ltmplConfig.columns.forEach((item) => {
273
+ if (
274
+ item.statColType == "dimension" &&
275
+ !dColIds.includes(item.id) &&
276
+ !hiddenColIds_.includes(item.id)
277
+ ) {
278
+ hiddenColIds_.push(item.id);
279
+ disabledColIds.push(item.id);
280
+ }
281
+ if (
282
+ item.statColType == "dimension" &&
283
+ !dColIds.includes(item.id) &&
284
+ !disabledColIds.includes(item.id)
285
+ ) {
286
+ disabledColIds.push(item.id);
287
+ }
288
+ });
289
+ hiddenColIds_ = hiddenColIds_.filter((id) => {
290
+ return !dColIds.includes(id);
291
+ });
292
+ }
293
+ ltmplConfig.columns.forEach((item) => {
294
+ if (item.hidden) {
295
+ hiddenColIds_.push(item.id);
296
+ }
297
+ });
298
+ /** 构建column **/
299
+ const { defaultPageSize, showType } = ltmplConfig;
300
+
301
+ let pageInfo = {
302
+ pageNo: pageNo || 1,
303
+ pageSize: pageSize || defaultPageSize || 10,
304
+ virtualEndPageNo: undefined,
305
+ };
306
+ const viewModels = this.state.viewModels.length > 0 ? this.state.viewModels : (userPageConfig?.["viewModels"] || [defShowType || showType || "table"]);
307
+
308
+ /** 构建 dataSource **/
309
+ //构建过滤条件
310
+ const params = { ...criteriaData, ...pageInfo, mainCode };
311
+ let queryKey: QueryKey;
312
+ if (level && level === "l2") {
313
+ queryKey = await HcserviceV3.requestL2LtmplQueryKey(serverKey, sourceId, params);
314
+ } else {
315
+ if (viewModels.includes("ganttChart")) {
316
+ queryKey = await HcserviceV3.requestGttRootQueryKey(serverKey, sourceId, params);
317
+ } else {
318
+ queryKey = await HcserviceV3.requestLtmplQueryKey(serverKey, sourceId, params);
319
+ }
320
+ }
321
+
322
+ if (!queryKey.sourceId || queryKey.sourceId == this.props.sourceId) {
323
+ this.setState({
324
+ pageInfo,
325
+ disabledColIds, hiddenColIds: hiddenColIds_, hiddenRowCodes,
326
+ sortedColConfigs, queryKey, showL2Chart: false, selectedRows: [], selectedDatas: [],
327
+ viewModels
328
+ });
329
+ }
330
+ this.setState({
331
+ loading: false,
332
+ });
333
+ };
334
+
335
+ doCustomButton = async (customButton: CustomButton, records: DtmplData[]) => {
336
+ if (!this.buttonClickable()) {
337
+ return;
338
+ }
339
+ const { serverKey, sourceId } = this.props;
340
+ let doType = customButton.doType;
341
+ let config: CustomButtonConfig = ProgramConfig.getCustomButtonConfig(customButton.id);
342
+ if ("request_refresh" == doType) {
343
+ if (config && config.doAction) {
344
+ await config.doAction(customButton, records);
345
+ } else if (config && config.getRequestUrl) {
346
+ let url = await config.getRequestUrl(customButton, records);
347
+ await HcserviceV3.doPostRequest(serverKey, url);
348
+ } else if (customButton.path) {
349
+ let codes = [];
350
+ let res = undefined;
351
+ if (records != null) {
352
+ records.forEach(item => {
353
+ codes.push(item.code)
354
+ })
355
+ }
356
+ if (customButton.requestMethod === "get") {
357
+ res = await HcserviceV3.doGetRequest(serverKey, customButton.path, { codes });
358
+ } else {
359
+ res = await HcserviceV3.doPostRequest(serverKey, customButton.path, { codes });
360
+ }
361
+ if (res?.msg || res?.message) {
362
+ message.info(res.msg || res.message);
363
+ }
364
+ } else {
365
+ message.error("Button Config Error");
366
+ return;
367
+ }
368
+ this.doSearchDirect(null);
369
+ } else if ("show_window" == doType) {
370
+ this.setState({
371
+ showCustomCard: true,
372
+ customButton,
373
+ customButtonData: records,
374
+ });
375
+ } else {
376
+ message.error("Unsuport Button dotype " + doType);
377
+ }
378
+ };
379
+
380
+ renderAboveCustomPage = () => {
381
+ return this.renderCustomPage("above-table");
382
+ };
383
+
384
+ renderOhterCustomPage = () => {
385
+ return (
386
+ <>
387
+ {this.renderCustomPage("under-table")}
388
+ {this.renderCustomPage("modal-window")}
389
+ {this.renderCustomPage("left-drawer")}
390
+ {this.renderCustomPage("right-drawer")}
391
+ </>
392
+ );
393
+ };
394
+
395
+ renderCustomPage = (
396
+ windowPosition:
397
+ | "under-table"
398
+ | "above-table"
399
+ | "modal-window"
400
+ | "left-drawer"
401
+ | "right-drawer"
402
+ ) => {
403
+ const { translate } = this.context;
404
+ const { customButton, customButtonData, customDrawerSize } = this.state;
405
+
406
+ if (!customButton) {
407
+ return "";
408
+ }
409
+ if (windowPosition && windowPosition != customButton.windowPosition) {
410
+ return "";
411
+ }
412
+
413
+ let customProps = {
414
+ customButton: customButton, data: customButtonData,
415
+ onOk: () => { this.actTableDoSearch(null) }
416
+ , onclose: () => {
417
+ this.setState({ customButton: undefined });
418
+ }
419
+ };
420
+
421
+ let config: CustomButtonConfig = ProgramConfig.getCustomButtonConfig(customButton.id);
422
+ let page;
423
+ if (config && config.getCurrentPage) {
424
+ page = config.getCurrentPage(customButton, customButtonData);
425
+ }
426
+ if (!page) {
427
+ page = ProgramConfig.getCustomPage(customButton.id);
428
+ }
429
+
430
+ if (!page) {
431
+ message.error("Not found CustomButton Page");
432
+ this.setState({
433
+ customButton: undefined
434
+ })
435
+ return;
436
+ }
437
+
438
+ let customElement = React.createElement(page, customProps);
439
+ if (
440
+ customButton.windowPosition == "under-table" ||
441
+ customButton.windowPosition == "above-table"
442
+ ) {
443
+ return (
444
+ <Card
445
+ id={"CustomCard" + customButton.id}
446
+ size={"small"}
447
+ style={{ marginTop: "6px" }}
448
+ extra={
449
+ <Button
450
+ size={"small"}
451
+ danger={true}
452
+ onClick={() => {
453
+ this.setState({ customButton: undefined });
454
+ }}
455
+ >
456
+ {translate("${关闭}")}
457
+ </Button>
458
+ }
459
+ >
460
+ {customElement}
461
+ </Card>
462
+ );
463
+ } else if (
464
+ customButton.windowPosition == "left-drawer" ||
465
+ customButton.windowPosition == "right-drawer"
466
+ ) {
467
+ return (
468
+ <Drawer
469
+ open={true}
470
+ id={"CustomCard" + customButton.id}
471
+ placement={
472
+ customButton.windowPosition == "right-drawer" ? "right" : "left"
473
+ }
474
+ resizable={{ onResize: (newSize => this.setState({ customDrawerSize: newSize })) }}
475
+ size={customDrawerSize !== undefined ? customDrawerSize : customButton.windowWidth}
476
+ onClose={() => {
477
+ this.setState({ customButton: undefined });
478
+ }}
479
+ styles={{ body: { minWidth: customButton.windowWidth } }}
480
+ >
481
+ {customElement}
482
+ </Drawer>
483
+ );
484
+ } else if (customButton.windowPosition == "modal-window") {
485
+ return (
486
+ <DraggableModal
487
+ open={true}
488
+ closable={true}
489
+ width={customButton.windowWidth}
490
+ style={{ height: customButton.windowHeight }}
491
+ onCancel={() => {
492
+ this.setState({ customButton: undefined });
493
+ }}
494
+ >
495
+ {customElement}
496
+ </DraggableModal>
497
+ );
498
+ }
499
+ };
500
+
501
+
502
+ async componentDidMount() {
503
+ const { ltmplConfig, tableType, userPageConfig, defShowType, onUpdatePageSizeOptions, setUserPageConfig, pageSize } = this.props;
504
+ const { sortedColIds } = userPageConfig || {};
505
+ const { translate } = this.context;
506
+ let sortedColConfigs = undefined;
507
+ if (ltmplConfig) {
508
+ sortedColConfigs = tableType == 'report' ? ltmplConfig.columns : [
509
+ { id: "10000", title: translate("${排序}"), originalId: "10000" },
510
+ { id: "20000", title: translate("${隐藏}"), originalId: "20000" },
511
+ ...ltmplConfig.columns,
512
+ ];
513
+ if (sortedColIds) { // 使用缓存的列排序
514
+ sortedColConfigs.sort((a, b) => sortedColIds.indexOf(a.id) - sortedColIds.indexOf(b.id));
515
+ }
516
+ const temViewModels = userPageConfig?.["viewModels"] || [defShowType || ltmplConfig?.showType || "table"];
517
+ this.setState({ viewModels: temViewModels });
518
+ if (onUpdatePageSizeOptions && temViewModels.includes("cardList")) { // 初始化是卡片视图,则更新父组件中分页数组
519
+ const temPageSizes = Array.from({ length: 7 }, (_, i) => ltmplConfig.rowCardCount * Math.pow(2, i));
520
+ onUpdatePageSizeOptions(temPageSizes);
521
+ if (setUserPageConfig && !(userPageConfig?.pageSize >= 0)) setUserPageConfig({ pageSize: 1 });
522
+ this.setState({ pageSizeOptions: temPageSizes, sortedColConfigs });
523
+ } else {
524
+ this.loadData(userPageConfig?.hiddenColIds || defaultDisabledColIds, [], sortedColConfigs);
525
+ }
526
+ }
527
+ this.getTabsOptions();
528
+ }
529
+
530
+ // 卡片列表-更新列表分页数
531
+ handleCardListPageSize(preViewModels, viewModels) {
532
+ const { ltmplConfig, onChangePage, pageSize, pageNo } = this.props;
533
+ const { defaultPageSize } = ltmplConfig || {};
534
+ const preIsCard = preViewModels.includes("cardList");
535
+ const isCard = viewModels.includes("cardList");
536
+ let temPageSizes = defPageSizeOptions;
537
+ let temPageSize = defaultPageSize;
538
+ if ((!preIsCard && !isCard) || (preIsCard && isCard)) {
539
+ return;
540
+ }
541
+ if (!preIsCard && isCard) { // 普通切换到Card
542
+ temPageSizes = Array.from({ length: 7 }, (_, i) => ltmplConfig.rowCardCount * Math.pow(2, i));
543
+ temPageSize = temPageSizes.includes(Number(pageSize)) ? pageSize : (temPageSizes.includes(Number(defaultPageSize)) ? defaultPageSize : temPageSizes[1]);
544
+ } else if (preIsCard && !isCard) { // card切换到普通
545
+ temPageSize = defPageSizeOptions.includes(Number(pageSize)) ? pageSize : (defPageSizeOptions.includes(Number(defaultPageSize)) ? defaultPageSize : defPageSizeOptions[1]);
546
+ }
547
+ this.setState({ pageSizeOptions: temPageSizes });
548
+ onChangePage(pageNo || 1, temPageSize, temPageSizes);
549
+ }
550
+
551
+ async componentDidUpdate(prevProps, prevState) {
552
+ const { sourceId, criteriaData, ltmplConfig, tableType, pageSize, pageNo, userPageConfig, defShowType } = this.props;
553
+ // const {userCriteriaData:preUserCriteriaData}=prevState;
554
+ const { userCriteriaData } = this.state;
555
+ const { translate } = this.context;
556
+ let {
557
+ ltmplConfig: preLtmplConfig,
558
+ criteriaData: preCriteriaData,
559
+ sourceId: preSourceId, pageSize: prePageSize, pageNo: prePageNo,
560
+ userPageConfig: preUserPageConfig
561
+ } = prevProps;
562
+ if (!this.isSameSourceQuery(sourceId, criteriaData)) {
563
+ return false;
564
+ }
565
+
566
+ if (prePageSize != pageSize || pageNo != prePageNo) {
567
+ this.setState({
568
+ pageInfo: { pageNo, pageSize },
569
+ userCriteriaData: criteriaData,
570
+ })
571
+ }
572
+ if (!preUserPageConfig && userPageConfig) {
573
+ this.setState({ viewModels: userPageConfig?.["viewModels"] || [defShowType || ltmplConfig?.showType || "table"] });
574
+ }
575
+ if (!_.isEqual(prevState.viewModels, this.state.viewModels)) { // 显示视图变化-更改卡片列表分页条数
576
+ this.handleCardListPageSize(prevState.viewModels, this.state.viewModels);
577
+ }
578
+ let { hiddenColIds, sortedColConfigs } = this.state;
579
+ let currentQueryParams = ProgramConfig.transQueryParamsToStr(criteriaData, false, [
580
+ "pageSize",
581
+ "pageNo",
582
+ ]);
583
+ let preCurrentQueryParams = ProgramConfig.transQueryParamsToStr(userCriteriaData, false, [
584
+ "pageSize",
585
+ "pageNo",
586
+ ]);
587
+ if ((sourceId && preSourceId != sourceId) ||
588
+ (ltmplConfig &&
589
+ (!preLtmplConfig || ltmplConfig.id != preLtmplConfig.id)) ||
590
+ ((currentQueryParams != preCurrentQueryParams) &&
591
+ (!criteriaData['menuId'] || preCriteriaData.menuId == criteriaData['menuId']))
592
+ ) {
593
+ //5秒后允许再次请求数据
594
+ //refresh=false;
595
+ if (preLtmplConfig && ltmplConfig.id == preLtmplConfig.id) {
596
+ await this.loadData(hiddenColIds, [], sortedColConfigs);
597
+ } else {
598
+ let sColConfigs = undefined;
599
+ const { sortedColIds } = userPageConfig || {};
600
+ if (ltmplConfig) {
601
+ sColConfigs = tableType == 'report' ? ltmplConfig.columns : [
602
+ { id: "10000", title: translate("${排序}"), originalId: "10000" },
603
+ { id: "20000", title: translate("${隐藏}"), originalId: "20000" },
604
+ ...ltmplConfig.columns,
605
+ ];
606
+ if (sortedColIds) { // 使用缓存的列排序
607
+ sColConfigs.sort((a, b) => sortedColIds.indexOf(a.id) - sortedColIds.indexOf(b.id));
608
+ }
609
+ }
610
+ await this.loadData(userPageConfig?.hiddenColIds || defaultDisabledColIds, [], sColConfigs);
611
+ }
612
+
613
+ } else {
614
+ return false;
615
+ }
616
+ }
617
+
618
+ isSameSourceQuery = (sourceId, criteriaData) => {
619
+ // action跳转,路由变化时,变化后路由不存在sourceId||menuId,则不触发查询
620
+ if (this.isJumpRef.current && !criteriaData['sourceId'] && !criteriaData['menuId']) {
621
+ this.isJumpRef.current = false;
622
+ return false;
623
+ }
624
+
625
+ if (sourceId && criteriaData && (criteriaData['sourceId'] && criteriaData['sourceId'] != sourceId)
626
+ || (criteriaData['menuId'] && criteriaData['menuId'] != sourceId)) {
627
+ return false;
628
+ } else {
629
+ return true;
630
+ }
631
+ };
632
+
633
+ handleShowChart = () => {
634
+ this.setState({
635
+ showL2Chart: !this.state.showL2Chart,
636
+ });
637
+ };
638
+
639
+ handleDataAnalysis = () => {
640
+ this.setState({
641
+ showL2ActTable: !this.state.showL2ActTable,
642
+ });
643
+ };
644
+
645
+ unHiden = () => {
646
+ const { ltmplConfig } = this.props;
647
+ const { hiddenColIds, sortedColConfigs } = this.state;
648
+ this.setState({
649
+ hiddenRowCodes: [],
650
+ });
651
+ };
652
+
653
+ onHide = (code: string) => {
654
+ const { hiddenRowCodes } = this.state;
655
+ let hiddenCodes = [...hiddenRowCodes, code];
656
+ this.setState({
657
+ hiddenRowCodes: hiddenCodes,
658
+ });
659
+ };
660
+
661
+ changeViewModel = (viewModels) => {
662
+ const { setUserPageConfig } = this.props;
663
+ const { hiddenColIds, hiddenRowCodes, sortedColConfigs, viewModels: oldViewModels } = this.state;
664
+ setUserPageConfig && setUserPageConfig({ viewModels });
665
+ this.setState({ viewModels }, () => {
666
+ if (viewModels.length && viewModels.includes("ganttChart") !== oldViewModels.includes("ganttChart")) {
667
+ this.loadData(hiddenColIds, hiddenRowCodes, sortedColConfigs); // 前后选择是否存在甘特图,刷新数据
668
+ }
669
+ });
670
+ };
671
+
672
+ changeHiddenColumns = (hiddenColIds: string[]) => {
673
+ const { setUserPageConfig } = this.props;
674
+ this.setState({ showL2Chart: false, hiddenColIds });
675
+ setUserPageConfig && setUserPageConfig({ hiddenColIds });
676
+ };
677
+
678
+ doSelectedAction = async (actionId: string, codes, params: object) => {
679
+ const { selectedRows } = this.state;
680
+ this.doAction(actionId, selectedRows, params);
681
+ };
682
+
683
+ doAction = async (actionId: string, selectedRows: SelectedRow[], params) => {
684
+ const { serverKey } = this.props;
685
+ const { hiddenColIds, hiddenRowCodes, sortedColConfigs } = this.state;
686
+ this.setState({
687
+ loading: true,
688
+ });
689
+ let result: boolean = await HcserviceV3.postActions(
690
+ serverKey,
691
+ actionId,
692
+ selectedRows,
693
+ params
694
+ );
695
+ if (result) {
696
+ //重新加载数据
697
+ this.loadData(hiddenColIds, hiddenRowCodes, sortedColConfigs);
698
+ } else {
699
+ this.setState({
700
+ loading: false,
701
+ });
702
+ }
703
+ };
704
+
705
+ doRowAction = async (actionId: string, codes: string[], params: object) => {
706
+ this.doAction(actionId, [{ title: undefined, code: codes[0] }], params);
707
+ };
708
+
709
+ doDelete = async () => {
710
+ const { sourceId, serverKey, mainCode } = this.props;
711
+ const {
712
+ selectedRows,
713
+ hiddenColIds,
714
+ hiddenRowCodes,
715
+ sortedColConfigs,
716
+ } = this.state;
717
+ this.setState({
718
+ loading: true,
719
+ });
720
+ let result: boolean = await HcserviceV3.deleteData(
721
+ serverKey,
722
+ sourceId,
723
+ selectedRows,
724
+ mainCode
725
+ );
726
+ if (result) {
727
+ //重新加载数据
728
+ this.loadData(hiddenColIds, hiddenRowCodes, sortedColConfigs);
729
+ } else {
730
+ this.setState({
731
+ loading: false,
732
+ });
733
+ }
734
+ };
735
+
736
+ doDeleteByCode = async (record: DtmplData) => {
737
+ const { sourceId, serverKey, mainCode, doDelete, deleteCallback } = this.props;
738
+ const { hiddenColIds, hiddenRowCodes, sortedColConfigs } = this.state;
739
+ this.setState({
740
+ loading: true,
741
+ });
742
+ let result: boolean = await HcserviceV3.deleteByCode(
743
+ serverKey,
744
+ sourceId,
745
+ [record.code],
746
+ mainCode
747
+ );
748
+ if (result) {
749
+ //重新加载数据
750
+ this.loadData(hiddenColIds, hiddenRowCodes, sortedColConfigs);
751
+ doDelete && doDelete(record.code);
752
+ deleteCallback && deleteCallback(record);
753
+ this.setState({ loading: false, delModalOpen: false, recordCode: undefined, record: undefined });
754
+ } else {
755
+ this.setState({ loading: false });
756
+ }
757
+ };
758
+
759
+ doSelectedCQuery = async (cqueryId: string) => { };
760
+
761
+ doJump = async (jump: JumpConfig, record_: DtmplData) => {
762
+ let record = record_.fieldMap ? record_.fieldMap : record_;
763
+ const version = localStorage.getItem("version") || "";
764
+
765
+ let url = null;
766
+ let path = jump.path;
767
+ if (!path) {
768
+ path = "/";
769
+ }
770
+ //是否以http开头
771
+ if (path?.indexOf("#") == 0 || url?.indexOf("/#") == 0) {
772
+ url = "";
773
+ } else if (
774
+ path.indexOf("http://") == 0 ||
775
+ path.indexOf("HTTP://") == 0 ||
776
+ path.indexOf("https://") == 0 ||
777
+ path.indexOf("HTTPS://") == 0
778
+ ) {
779
+ url = path.split("//")[0] + "//";
780
+ path = path.split("//")[1];
781
+ } else {
782
+ url = `/#/${version}`;
783
+ }
784
+
785
+ //处理路由参数
786
+ let paths = path.split("/");
787
+
788
+ let routeParamConfigs = jump.routeParams;
789
+ if (routeParamConfigs) {
790
+ for (let i = 0; i < paths.length; i++) {
791
+ if (paths[i].indexOf(":") == 0) {
792
+ let pa = paths[i].substring(1);
793
+ //根据参数名匹配参数
794
+ for (let p of routeParamConfigs) {
795
+ if (p && pa == p.title) {
796
+ //赋值替换
797
+ let v = record[p.id] ? record[p.id] : p.defaultValue;
798
+ paths[i] = v;
799
+ break;
800
+ }
801
+ }
802
+ }
803
+ }
804
+ url = ProgramConfig.joinPath(url, paths.join("/"));
805
+ } else {
806
+ url = ProgramConfig.joinPath(url, path);
807
+ }
808
+
809
+ //处理search 参数
810
+ let searchParamConfigs = jump.searchParams;
811
+ let searchs = [];
812
+ //放入token
813
+ if (jump.tokenName) {
814
+ searchs[0] = jump.tokenName + "=" + ProgramConfig.hydrocarbonToken();
815
+ }
816
+
817
+ if (searchParamConfigs) {
818
+ let initSearchLength = searchs.length;
819
+ for (let i = 0; i < searchParamConfigs.length; i++) {
820
+ let p = searchParamConfigs[i];
821
+ let v = record[p.id] ? record[p.id] : p.defaultValue;
822
+ if (!v && p.title == "code") {
823
+ v = record_.code;
824
+ }
825
+ searchs[initSearchLength + i] = p.title + "=" + v;
826
+ }
827
+ }
828
+ if (searchs.length > 0) {
829
+ if (url.indexOf("?") != url.length - 1) {
830
+ url = url + "?";
831
+ }
832
+ url = url + searchs.join("&");
833
+ }
834
+ if (jump.linkTarget == '_self') {
835
+ this.isJumpRef.current = true;
836
+ window.location.hash = url.substring(url.indexOf("#") + 1);
837
+ } else {
838
+ debugger
839
+ if (url.indexOf("/#") == 0) {
840
+ // url=window.location.href.split("#/")[0]+url;
841
+ url = window.location.href.split("#/")[0] + url.substring(url.indexOf("/#") + 1);
842
+ }
843
+ window.open(url);
844
+ }
845
+ // if (
846
+ // url.indexOf("#") == 0 ||
847
+ // url.indexOf("/#") == 0 ||
848
+ // url.indexOf("//#") == 0
849
+ // ) {
850
+ // window.location.hash = url.substring(url.indexOf("#") + 1);
851
+ // } else {
852
+ // window.open(url);
853
+ // }
854
+ };
855
+
856
+ blockMenuTreeDrawerOpen = (record) => {
857
+ this.setState({
858
+ blockMenuTreeDrawerOpen: true,
859
+ recordCode: record.code,
860
+ record
861
+ })
862
+ }
863
+
864
+ doRowJump = async (jump: JumpConfig, record: DtmplData) => {
865
+ this.doJump(jump, record);
866
+ };
867
+
868
+ renderExportButton = (title, type: ExportType, sourceId?: string) => {
869
+ const { pageNo, pageSize, serverKey, ltmplConfig, tableType } = this.props;
870
+
871
+ //let buttons = ltmplConfig?.buttons;
872
+
873
+ const { queryKey } = this.state;
874
+ const { translate } = this.context;
875
+ let exportModes: ExportMode[] = tableType == "report" ?
876
+ ["all"] : ["current", "page", "all"];
877
+
878
+ return (
879
+ <Popover
880
+ content={
881
+ <ExportFrame //导出组件
882
+ currentPage={{
883
+ pageNo: pageNo ? pageNo : 1,
884
+ pageSize: pageSize ? pageSize : ltmplConfig.defaultPageSize,
885
+ }}
886
+ exportModes={exportModes}
887
+ type={type}
888
+ serverKey={serverKey}
889
+ queryKey={queryKey}
890
+ sourceId={sourceId}
891
+ title={translate(
892
+ "${" + ltmplConfig.title + "}" + "-" + "${" + title + "}"
893
+ )}
894
+ />
895
+ }
896
+ title={translate("${" + title + "}")}
897
+ placement="bottomRight"
898
+ trigger="click"
899
+ >
900
+ <Tooltip title={translate("${" + title + "}")}>
901
+ <Button
902
+ style={{
903
+ // marginLeft: "5px",
904
+ }}
905
+ //为了点击到没有导出模块,使组件不致销毁,丢失导出数据
906
+ >{type == "ltmpl-data-excel" ? <ExportOutlined /> : title}
907
+ </Button>
908
+ </Tooltip>
909
+ </Popover>
910
+ );
911
+ };
912
+
913
+ renderFileExportButton = () => {
914
+ const { ltmplConfig } = this.props;
915
+ let fileExports = ltmplConfig?.topFileExports;
916
+ if (fileExports) {
917
+ return fileExports.map((fileExport) => {
918
+ return this.renderExportButton(
919
+ fileExport.title,
920
+ "ltmpl-data-filedata",
921
+ fileExport.id
922
+ );
923
+ });
924
+ } else {
925
+ return <></>;
926
+ }
927
+ };
928
+
929
+ doSelectedJump = async (jump: JumpConfig) => {
930
+ const { selectedDatas } = this.state;
931
+ if (selectedDatas.length == 1) {
932
+ this.doJump(jump, selectedDatas[0]);
933
+ }
934
+ };
935
+
936
+ changeRowSelection = (
937
+ selectedRows: SelectedRow[],
938
+ selectedDatas: DtmplData[]
939
+ ) => {
940
+ const { onSelectChange } = this.props;
941
+ this.setState({ selectedRows, selectedDatas });
942
+ if (onSelectChange) {
943
+ onSelectChange({ selectedRows, selectedDatas });
944
+ }
945
+ };
946
+
947
+ onChangeColSort = (sortedColConfigs: ColumnConfig[]) => {
948
+ const { setUserPageConfig } = this.props;
949
+ this.setState({ sortedColConfigs });
950
+ const sortedColIds = sortedColConfigs.map(r => r.id);
951
+ setUserPageConfig && setUserPageConfig({ sortedColIds });
952
+ };
953
+
954
+ // 更新本地缓存列宽度
955
+ onChangeResize = (colResize: { [key: string]: number }) => {
956
+ const { setUserPageConfig, userPageConfig } = this.props;
957
+ const oldColResize = userPageConfig?.colResize || {};
958
+ setUserPageConfig && setUserPageConfig({ colResize: { ...oldColResize, ...colResize } });
959
+ }
960
+
961
+ getAddTmplButton = (classAddConfigs: ClassAddConfig[]) => {
962
+ const { translate } = this.context;
963
+ if (classAddConfigs && classAddConfigs.length < 1) {
964
+ return translate("${没有分类添加按钮}");
965
+ }
966
+ return classAddConfigs.map((config) => {
967
+ return (
968
+ <p>
969
+ <Button
970
+ size={"small"}
971
+ type={"text"}
972
+ onClick={() => this.props.doCreate(config.id, false)}
973
+ >
974
+ {config.title}
975
+ </Button>
976
+ </p>
977
+ );
978
+ });
979
+ };
980
+
981
+ // 重置当前页面配置
982
+ handleResetUserPageConfig = () => {
983
+ const { resetUserPageConfig, ltmplConfig, tableType, defShowType } = this.props;
984
+ const { translate } = this.context;
985
+ let sortedColConfigs = undefined;
986
+ if (ltmplConfig) {
987
+ sortedColConfigs = tableType === 'report' ? ltmplConfig.columns : [
988
+ { id: "10000", title: translate("${排序}"), originalId: "10000" },
989
+ { id: "20000", title: translate("${隐藏}"), originalId: "20000" },
990
+ ...ltmplConfig.columns,
991
+ ];
992
+ }
993
+ this.setState({ viewModels: [defShowType || ltmplConfig.showType || "table"], hiddenColIds: defaultDisabledColIds, sortedColConfigs });
994
+ resetUserPageConfig();
995
+ }
996
+
997
+ // 更新当前页面配置
998
+ handleUpdateUserPageConfig = (val: { [key: string]: any }) => {
999
+ const { sortedColIds, hiddenColIds, viewModels, criteriaData } = val || {};
1000
+ const { setUserPageConfig, ltmplConfig, tableType, defShowType, menuId } = this.props;
1001
+ const { userCriteriaData } = this.state;
1002
+ const { translate } = this.context;
1003
+ let sortedColConfigs = undefined;
1004
+ if (ltmplConfig) {
1005
+ sortedColConfigs = tableType === 'report' ? ltmplConfig.columns : [
1006
+ { id: "10000", title: translate("${排序}"), originalId: "10000" },
1007
+ { id: "20000", title: translate("${隐藏}"), originalId: "20000" },
1008
+ ...ltmplConfig.columns,
1009
+ ];
1010
+ }
1011
+ if (sortedColIds) { // 页面配置更新列排序
1012
+ sortedColConfigs.sort((a, b) => sortedColIds.indexOf(a.id) - sortedColIds.indexOf(b.id));
1013
+ }
1014
+ // 旧过滤参数设置为空
1015
+ const oldParms = Object.keys(userCriteriaData || {}).reduce((total, item) => { total[item] = ""; return total; }, {});
1016
+ this.actTableDoSearch({ ...oldParms, ...(criteriaData || { menuId }) });
1017
+ this.setState({ userCriteriaData: criteriaData, viewModels: viewModels || [defShowType || ltmplConfig.showType || "table"], hiddenColIds: hiddenColIds || defaultDisabledColIds, sortedColConfigs });
1018
+ setUserPageConfig({ ...val, criteriaData: undefined });
1019
+ }
1020
+
1021
+ // 更新多表格数量及缓存
1022
+ editRowTableNum = (type: "add" | "delete") => {
1023
+ const { ltmplConfig, setUserPageConfig, userPageConfig } = this.props;
1024
+ const { rowTableNumber, rowTableCondig } = userPageConfig || {};
1025
+ let { defTableSize } = ltmplConfig;
1026
+ const temNum = (rowTableNumber || defTableSize || 0) + (type === "add" ? 1 : -1);
1027
+ if (setUserPageConfig) {
1028
+ const temRowTableCondig = (type === "delete" && rowTableCondig) ? rowTableCondig.slice(0, -1) : rowTableCondig;
1029
+ setUserPageConfig({ rowTableNumber: temNum, rowTableCondig: temRowTableCondig }); // 缓存多表格数量
1030
+ }
1031
+ }
1032
+
1033
+ // 渲染顶部操作栏
1034
+ renderHeaderButtons = () => {
1035
+ let {
1036
+ hiddenColIds, viewModels, sortedColConfigs, disabledColIds, showL2Chart,
1037
+ showL2ActTable, restatParams, userCriteriaData
1038
+ } = this.state;
1039
+ const {
1040
+ ltmplConfig, sourceId, doCreate, doSearch, menuId,
1041
+ funcMode, customCreatable, serverKey, readOnly, userPageConfig, allowUserConfig, showTableAdd
1042
+ } = this.props;
1043
+ const { translate } = this.context;
1044
+ let { buttons } = ltmplConfig;
1045
+ const version = localStorage.getItem("version") || "";
1046
+
1047
+ return (
1048
+ <>
1049
+ <Space>
1050
+ {userPageConfig && allowUserConfig ? <PageConfigButton menuCode={menuId} handleResetUserPageConfig={this.handleResetUserPageConfig} handleUpdateUserPageConfig={this.handleUpdateUserPageConfig} userCriteriaData={userCriteriaData} /> : ""}
1051
+ {(showTableAdd !== false && buttons.includes("showTableAdd")) ?
1052
+ <Dropdown styles={{ item: { padding: 0 } }} menu={{
1053
+ items: [
1054
+ { key: "add", label: <Button type="text" onClick={() => this.editRowTableNum("add")}><PlusSquareOutlined />{translate("${添加列表}")}</Button> },
1055
+ { key: "delete", label: <Button type="text" disabled={(userPageConfig?.rowTableNumber || 0) <= 1} onClick={() => this.editRowTableNum("delete")}><DeleteOutlined />{translate("${删除列表}")}</Button> }]
1056
+ }} arrow>
1057
+ <Button><AppstoreAddOutlined /></Button>
1058
+ </Dropdown>
1059
+ : ""}
1060
+ {funcMode == "common" && this.criteriaFormUseful() ? (
1061
+ <Popover trigger="click" content={this.renderCriteriaForm()}>
1062
+ <Button>
1063
+ <SearchOutlined />
1064
+ </Button>
1065
+ </Popover>
1066
+ ) : null}
1067
+ {buttons.includes("ratmplSelect") && !readOnly ? (
1068
+ <Button onClick={() => this.setState({ showRatmplSelector: true })}>
1069
+ {translate("${选择}")}
1070
+ </Button>
1071
+ ) : (
1072
+ ""
1073
+ )}
1074
+ {buttons.includes("dtmplAdd") && doCreate && !readOnly ? (
1075
+ ltmplConfig.classAddConfigs &&
1076
+ ltmplConfig.classAddConfigs.length > 0 ? (
1077
+ <Popover
1078
+ arrow={false}
1079
+ content={this.getAddTmplButton(ltmplConfig.classAddConfigs)}
1080
+ placement="bottomRight"
1081
+ >
1082
+ <Tooltip>
1083
+ <Button>
1084
+ <PlusOutlined />
1085
+ </Button>
1086
+ </Tooltip>
1087
+ </Popover>
1088
+ ) : (
1089
+ <Tooltip title={translate("${" + (ltmplConfig.createBtnTitle || "创建") + "}")}>
1090
+ <Button onClick={() => doCreate(null, false)}>
1091
+ <PlusOutlined />
1092
+ </Button>
1093
+ </Tooltip>
1094
+ )
1095
+ ) : (
1096
+ ""
1097
+ )}
1098
+ {(buttons.includes("dtmplCustomAdd") || customCreatable) &&
1099
+ doCreate &&
1100
+ !readOnly ? (
1101
+ <Tooltip title={translate("${" + (ltmplConfig.createBtnTitle || "创建") + "}")}>
1102
+ <Button onClick={() => doCreate(null, true)}>
1103
+ <PlusCircleOutlined />
1104
+ </Button>
1105
+ </Tooltip>
1106
+ ) : (
1107
+ ""
1108
+ )}
1109
+ {buttons.includes("importLtmplExcel") && !readOnly ? (
1110
+ <Tooltip title={translate("${导入}")}>
1111
+ <Button
1112
+ href={`#/${version}/${sourceId}/importer?menuId=${menuId}`}
1113
+ target={"_blank"}
1114
+ >
1115
+ <ImportOutlined />
1116
+ </Button>
1117
+ </Tooltip>
1118
+ ) : (
1119
+ ""
1120
+ )}
1121
+ {buttons.includes("exportLtmplExcel") && !readOnly
1122
+ ? this.renderExportButton("导出", "ltmpl-data-excel")
1123
+ : ""}
1124
+ {this.renderFileExportButton()}
1125
+ {false
1126
+ && buttons.includes("showChart") ? (
1127
+ <Tooltip
1128
+ title={
1129
+ showL2Chart
1130
+ ? translate("${隐藏}${图表}")
1131
+ : translate("${展示}${图表}")
1132
+ }
1133
+ >
1134
+ <Button onClick={this.handleShowChart}>
1135
+ <LineChartOutlined />
1136
+ </Button>
1137
+ </Tooltip>
1138
+ ) : (
1139
+ ""
1140
+ )}
1141
+ {buttons.includes("analysis") ? (
1142
+ <Tooltip
1143
+ title={
1144
+ showL2ActTable
1145
+ ? translate("${隐藏}${数据分析}")
1146
+ : translate("${展示}${数据分析}")
1147
+ }
1148
+ >
1149
+ <Button onClick={this.handleDataAnalysis}>
1150
+ <FundOutlined />
1151
+ </Button>
1152
+ </Tooltip>
1153
+ ) : (
1154
+ ""
1155
+ )}
1156
+ {buttons.includes("reStat") && !readOnly ? (
1157
+ <Restat
1158
+ value={restatParams}
1159
+ serverKey={serverKey}
1160
+ fields={ltmplConfig.reStatParams}
1161
+ sourceId={sourceId}
1162
+ onfinish={(restatParams) => {
1163
+ this.actTableDoSearch(null);
1164
+ this.setState({ restatParams: restatParams });
1165
+ }
1166
+ }
1167
+ ></Restat>
1168
+ ) : (
1169
+ ""
1170
+ )}
1171
+ <Popover
1172
+ content={
1173
+ <Checkbox.Group
1174
+ value={viewModels}
1175
+ onChange={this.changeViewModel}
1176
+ >
1177
+ <Row style={{ width: "120px" }}>
1178
+ <Col span={24}>
1179
+ <Checkbox value={"table"}>{translate("${表格}")}</Checkbox>
1180
+ </Col>
1181
+ <Col span={24}>
1182
+ <Checkbox value={"verticalList"}>
1183
+ {translate("${纵向列表}")}
1184
+ </Checkbox>
1185
+ </Col>
1186
+ <Col span={24}>
1187
+ <Checkbox value="cardList">
1188
+ {translate("${卡片列表}")}
1189
+ </Checkbox>
1190
+ </Col>
1191
+ <Col span={24}>
1192
+ <Checkbox value="ganttChart">
1193
+ {translate("${甘特图}")}
1194
+ </Checkbox>
1195
+ </Col>
1196
+ <Col span={24}>
1197
+ <Checkbox value="calendar">
1198
+ {translate("${日历}")}
1199
+ </Checkbox>
1200
+ </Col>
1201
+ {/*<Col span={24}><Checkbox value={'horizontalList'}>横向列表</Checkbox></Col>*/}
1202
+ </Row>
1203
+ </Checkbox.Group>
1204
+ }
1205
+ title={translate("${视图}")}
1206
+ placement="bottomRight"
1207
+ trigger="click"
1208
+ >
1209
+ <Tooltip title={translate("${选择视图}")}>
1210
+ <Button>
1211
+ <RetweetOutlined />
1212
+ </Button>
1213
+ </Tooltip>
1214
+ </Popover>
1215
+ <Popover
1216
+ content={
1217
+ <ColumnSelector
1218
+ columns={sortedColConfigs}
1219
+ disabledColIds={disabledColIds}
1220
+ hiddenColIds={hiddenColIds}
1221
+ onChangeColSort={this.onChangeColSort}
1222
+ onChangeHiddenCols={this.changeHiddenColumns}
1223
+ />
1224
+ }
1225
+ title={translate("${排序和选择列}")}
1226
+ placement="bottomRight"
1227
+ trigger="click"
1228
+ >
1229
+ <Tooltip title={translate("${点击排序和选择列}")}>
1230
+ <Button>
1231
+ <TableOutlined />
1232
+ </Button>
1233
+ </Tooltip>
1234
+ </Popover>
1235
+ {doSearch ? (
1236
+ <Button
1237
+ className="hoverbig"
1238
+ title={translate("${刷新}")}
1239
+ onClick={() => {
1240
+ this.actTableDoSearch(null);
1241
+ }}
1242
+ >
1243
+ <ReloadOutlined />
1244
+ </Button>
1245
+ ) : (
1246
+ ""
1247
+ )}
1248
+ {/*<Tooltip title={translate("${常用配置}")}>*/}
1249
+ {/* <Button*/}
1250
+ {/* className="hoverbig"*/}
1251
+ {/* onClick={() => {*/}
1252
+ {/* //doSearch(null);*/}
1253
+ {/* }}*/}
1254
+ {/* >*/}
1255
+ {/* <SettingOutlined />*/}
1256
+ {/* </Button>*/}
1257
+ {/*</Tooltip>*/}
1258
+
1259
+ </Space>
1260
+ </>
1261
+ );
1262
+ };
1263
+
1264
+ criteriaFormUseful = () => {
1265
+ const { ltmplConfig } = this.props;
1266
+ let { buttons, criteria, updrillButtonConfigs } = ltmplConfig;
1267
+ if (
1268
+ ((buttons.includes("query") ||
1269
+ (updrillButtonConfigs && updrillButtonConfigs.length > 0)) &&
1270
+ ((criteria && criteria.length > 0) ||
1271
+ buttons.includes("drilling"))) ||
1272
+ this.checkBoxUseful() || buttons.includes("multiRowEdit")
1273
+ ) {
1274
+ return true;
1275
+ } else {
1276
+ return false;
1277
+ }
1278
+ };
1279
+
1280
+ checkBoxUseful = () => {
1281
+ const { ltmplConfig } = this.props;
1282
+ let { buttons, jumps, actions, fileExports, customButtons } = ltmplConfig;
1283
+ if (
1284
+ buttons.includes("batchDelete") ||
1285
+ (actions && actions.length > 0) || (customButtons && customButtons.length > 0) ||
1286
+ (jumps && jumps.length > 0) || (fileExports && fileExports.length > 0)
1287
+ ) {
1288
+ return true;
1289
+ } else {
1290
+ return false;
1291
+ }
1292
+ };
1293
+
1294
+ actTableDoSearch = (data: object) => {
1295
+ const { ltreeData } = this.state;
1296
+ this.doSearch_(data, ltreeData);
1297
+ }
1298
+
1299
+ doSearch_ = async (criteriaData, ltreeData) => {
1300
+ const { doSearch } = this.props;
1301
+
1302
+ let new_serial_number = new Date().getTime();
1303
+ if (doSearch && new_serial_number - serial_number > 2000) {
1304
+ serial_number = new_serial_number;
1305
+ await doSearch({ ...criteriaData, serial_number, ...ltreeData });
1306
+ //busyReminderTime=0;
1307
+ // }else{
1308
+ // if(busyReminder){
1309
+ // if(busyReminderTime==1){
1310
+ // const { translate } = this.context;
1311
+ // message.warning(translate("${系统忙,请稍后再试}"));
1312
+ // busyReminderTime=0;
1313
+ // }else{
1314
+ // busyReminderTime=1;
1315
+ // }
1316
+ //}
1317
+ }
1318
+ }
1319
+
1320
+ ltreeValueChange = async (v) => {
1321
+ let ltreeEntitySelect = this.getLtreeEntitySelectCriteria();
1322
+ const { ltreeData } = this.state;
1323
+ const { criteriaData } = this.props;
1324
+ if (ltreeData && ltreeData["c_" + ltreeEntitySelect.id] != v) {
1325
+ let ltreeData_ = {};
1326
+ ltreeData_["c_" + ltreeEntitySelect.id] = v;
1327
+ await this.doSearch_(criteriaData, ltreeData_);
1328
+ this.setState({ ltreeData: ltreeData_ });
1329
+ }
1330
+ }
1331
+
1332
+
1333
+ doSearchDirect = (data: object) => {
1334
+
1335
+ let { doSearch } = this.props;
1336
+ if (doSearch) {
1337
+ doSearch({ ...data, serial_number });
1338
+ }
1339
+ }
1340
+
1341
+
1342
+ buttonClickable = () => {
1343
+ let new_serial_number = new Date().getTime();
1344
+ if (new_serial_number - serial_number > 1500) {
1345
+ serial_number = new_serial_number;
1346
+ return true;
1347
+ } else {
1348
+ return false;
1349
+ }
1350
+ }
1351
+
1352
+ renderCriteriaForm = () => {
1353
+ let { loading, selectedRows, selectedDatas, userCriteriaData, editings, tabActiveKey, tabsOptions } = this.state;
1354
+ let { ltmplConfig, serverKey, sourceId } = this.props;
1355
+ const tabCriteriaId = tabsOptions.find(r => r.key === tabActiveKey)?.id;
1356
+ return (
1357
+ <CriteriaForm
1358
+ key={sourceId}
1359
+ serverKey={serverKey}
1360
+ loading={loading}
1361
+ selectedDatas={selectedDatas}
1362
+ selectedRows={selectedRows}
1363
+ doCustomButton={this.doCustomButton}
1364
+ ltmplConfig={ltmplConfig}
1365
+ data={userCriteriaData}
1366
+ doCQuery={this.doSelectedCQuery}
1367
+ doAction={this.doSelectedAction}
1368
+ doDelete={this.doDelete}
1369
+ doJump={this.doSelectedJump}
1370
+ doSearch={this.actTableDoSearch}
1371
+ doMultiRowEdit={this.doMultiRowEdit}
1372
+ multiRowEditDisabled={!editings.length}
1373
+ tabCriteriaId={tabCriteriaId}
1374
+ />
1375
+ );
1376
+ };
1377
+ //暂时无用
1378
+ // queryTotal = async () => {
1379
+ // const { queryKey} = this.state;
1380
+ // const { serverKey }=this.props;
1381
+ // let aggregateVO:AggregateVO = await HcserviceV3.requestQueryAggregates(serverKey, queryKey.key);
1382
+ // this.setState({
1383
+ // aggregateVO,
1384
+ // });
1385
+ // return aggregateVO;
1386
+ // };
1387
+
1388
+ getLtreeEntitySelectCriteria = () => {
1389
+ let { ltmplConfig } = this.props
1390
+
1391
+ if (ltmplConfig && ltmplConfig.criteria) {
1392
+ for (let c of ltmplConfig.criteria) {
1393
+ if (c?.extControlType == "ltree-entity-select" || c?.extControlType == "ltree-entity-select-value") {
1394
+ return c;
1395
+ }
1396
+ }
1397
+ }
1398
+ return undefined;
1399
+ }
1400
+
1401
+ // 行内编辑start
1402
+ editRowEdit = (code: string) => {
1403
+ this.setState({ editings: [...this.state.editings, code] });
1404
+ }
1405
+
1406
+ cancelRowEdit = (code: string) => {
1407
+ this.setState({ editings: this.state.editings.filter(r => r !== code) });
1408
+ }
1409
+
1410
+ // 单独提交
1411
+ postLtmplData = async (dtmplData) => {
1412
+ const { serverKey, sourceId } = this.props;
1413
+ let res = await HcserviceV3.postLtmplData(
1414
+ serverKey,
1415
+ sourceId,
1416
+ dtmplData,
1417
+ message
1418
+ );
1419
+ if (res.status === "success") {
1420
+ this.cancelRowEdit(dtmplData["唯一编码"]);
1421
+ this.actTableDoSearch(undefined);
1422
+ this.formRef.current.resetFields([]);
1423
+ }
1424
+ };
1425
+
1426
+ // 批量提交
1427
+ postLtmplMultiData = async (dtmplData) => {
1428
+ const { serverKey, sourceId } = this.props;
1429
+ let res = await HcserviceV3.postLtmplMultiData(
1430
+ serverKey,
1431
+ sourceId,
1432
+ dtmplData,
1433
+ message
1434
+ );
1435
+ if (res.status === "success") {
1436
+ this.cancelRowEdit(dtmplData["唯一编码"]);
1437
+ this.actTableDoSearch(undefined);
1438
+ this.formRef.current.resetFields([]); // 重置表单数据
1439
+ this.setState({ editings: [] });
1440
+ }
1441
+ };
1442
+
1443
+ saveRowData = async (data: DtmplData) => {
1444
+ const { code } = data;
1445
+ let currentForm = this.formRef.current;
1446
+ let dtmplData = { "唯一编码": code };
1447
+ await currentForm.validateFields().then((values) => {
1448
+ for (let key in values) {
1449
+ if (values.hasOwnProperty(key) && key.startsWith(code)) {
1450
+ dtmplData[key.split("_")[1]] = values[key];
1451
+ }
1452
+ }
1453
+ this.postLtmplData(dtmplData);
1454
+ });
1455
+ }
1456
+
1457
+ // 批量提交
1458
+ doMultiRowEdit = async () => {
1459
+ const { editings } = this.state;
1460
+ if (!editings.length) {
1461
+ return;
1462
+ }
1463
+ let currentForm = this.formRef.current;
1464
+ let dtmplData = {};
1465
+ await currentForm.validateFields().then((values) => {
1466
+ for (let key in values) {
1467
+ if (values.hasOwnProperty(key)) {
1468
+ const code = key.split("_")[0];
1469
+ if (editings.includes(code)) {
1470
+ dtmplData[code] = { "唯一编码": code, ...(dtmplData[code] || {}), [key.split("_")[1]]: (values[key] || values[key] === 0) ? values[key] : null }
1471
+ }
1472
+ }
1473
+ }
1474
+ this.postLtmplMultiData({ data: JSON.stringify(Object.values(dtmplData)) });
1475
+ });
1476
+ }
1477
+
1478
+ // 批量编辑表单值更新
1479
+ doRowEditFormChange = (data: { [key: string]: any }) => {
1480
+ const { editings } = this.state;
1481
+ const code = Object.keys(data)[0].split("_")[0];
1482
+ if (!editings.includes(code)) {
1483
+ this.setState({ editings: [...editings, code] });
1484
+ }
1485
+ }
1486
+ // 行内编辑end
1487
+
1488
+ // 删除确认弹窗打开
1489
+ doDelModalOpen = (record: DtmplData) => {
1490
+ this.setState({ record, recordCode: record.code, delModalOpen: true });
1491
+ };
1492
+
1493
+ // tab页切换查询
1494
+ doTabSearch = (val: string) => {
1495
+ const { tabsOptions, tabActiveKey } = this.state;
1496
+ let new_serial_number = new Date().getTime();
1497
+ if (new_serial_number - serial_number < 2000) return;
1498
+ if (tabActiveKey === val) return;
1499
+ const ids = tabsOptions.find(r => r.key === "all").ids || [];
1500
+ const item = tabsOptions.find(r => r.key === val);
1501
+ let params = ids?.reduce((total, cur) => {
1502
+ total[cur] = (val === "all" || cur !== item.id) ? undefined : val;
1503
+ return total;
1504
+ }, {});
1505
+ this.actTableDoSearch(params);
1506
+ this.setState({ tabActiveKey: val });
1507
+ }
1508
+
1509
+ renderAggregates() { // 统计数据渲染
1510
+ const { aggregateVO } = this.state;
1511
+ const { ltmplConfig } = this.props;
1512
+ const aggregates = aggregateVO?.aggregates || [];
1513
+ const columns = ltmplConfig?.columns || [];
1514
+ return aggregates?.length ? <div className="aggregates">{aggregates.map(item => {
1515
+ const column = columns.find(r => r.id === item.fieldId);
1516
+ if (!column) {
1517
+ return "";
1518
+ }
1519
+ const { dataUnit, themeColor, themeIcon } = column;
1520
+ return <Card className="aggregate-card" hoverable styles={{ body: { padding: 20 } }}>
1521
+ <div style={{ display: "flex", alignItems: "start", justifyContent: "space-between" }}>
1522
+ <div style={{ width: "calc(100% - 40px)" }}>
1523
+ <p className="title">{item.fieldTitle}</p>
1524
+ <div className="value">
1525
+ <Text
1526
+ style={{ maxWidth: "100%" }}
1527
+ ellipsis={{ tooltip: item.value }}
1528
+ >
1529
+ <span className="number">{item.value}</span>
1530
+ </Text>
1531
+ {dataUnit ? <span className="unit">{dataUnit}</span> : ""}
1532
+ </div>
1533
+ </div>
1534
+ {themeIcon ?
1535
+ <div className="icon" style={{ color: themeColor, background: `${themeColor}26` }}>
1536
+ <Icon type={themeIcon} />
1537
+ </div> :
1538
+ ""}
1539
+ </div>
1540
+ </Card>
1541
+ }).filter(Boolean)
1542
+ }</div > : "";
1543
+ }
1544
+
1545
+ renderContent = () => {
1546
+ let {
1547
+ queryKey, loading, selectedRows, hiddenRowCodes, viewModels, sortedColConfigs, hiddenColIds, showL2ActTable,
1548
+ pageInfo, editings, userCriteriaData, tabsOptions, tabActiveKey, pageSizeOptions
1549
+ } = this.state;
1550
+ let {
1551
+ mainCode, sourceId, ltmplConfig, funcMode, operatable,
1552
+ title, collapsible,
1553
+ onChangePage, serverKey, criteriaData, showEmpty, loadDataCallback,
1554
+ showView, doEdit, doRAction, customEditable, readOnly, tableType, showPagination, showAggregates, userPageConfig,
1555
+ doEdit2D, doView2D, showTableAdd, setUserPageConfig
1556
+ } = this.props;
1557
+ const { translate } = this.context;
1558
+
1559
+ if (!ltmplConfig || !sourceId) {
1560
+ return (
1561
+ <>
1562
+ <Card loading={loading}></Card>
1563
+ <Table loading={loading}></Table>
1564
+ </>
1565
+ );
1566
+ }
1567
+
1568
+ let tableColumns = ColumnBuilder.buildTableColumns(
1569
+ {
1570
+ ltmplConfig, operatable,
1571
+ hiddenColIds, hiddenRowCodes, sortedColConfigs, showView,
1572
+ doEdit,
1573
+ doRAction, customEditable,
1574
+ serverKey, readOnly,
1575
+ sourceId, translate, unHiden: this.unHiden,
1576
+ onHide: this.onHide, doCustomButton: this.doCustomButton, doRowJump: this.doRowJump,
1577
+ blockMenuTreeDrawerOpen: this.blockMenuTreeDrawerOpen,
1578
+ doRowAction: this.doRowAction, doDeleteByCode: this.doDeleteByCode, sortColumns: criteriaData["sortColIds"],
1579
+ editings, editRowEdit: this.editRowEdit, cancelRowEdit: this.cancelRowEdit, saveRowData: this.saveRowData,
1580
+ doDelModalOpen: this.doDelModalOpen, mainCode, criteriaData: userCriteriaData, actTableDoSearch: this.actTableDoSearch,
1581
+ columnResize: userPageConfig?.colResize, doEdit2D, doView2D
1582
+ }
1583
+ );
1584
+
1585
+ let { buttons, extDisplayConfig, rowCardCount, customViewPagePath, splitTabShowType } = ltmplConfig;
1586
+ let { primaryColumn, primaryColumnLabel, secondColumn, secondColumnLabel, mainPicture, mainPictureLabel, labelColumn, cardShowCols, notDisplayFieldName, colNumOnRow } = extDisplayConfig;
1587
+ let displayCriteriaCard: boolean = false;
1588
+ if (funcMode == "simple" || funcMode == "common") {
1589
+ displayCriteriaCard = false;
1590
+ } else if (this.criteriaFormUseful()) {
1591
+ displayCriteriaCard = true;
1592
+ }
1593
+
1594
+ let columnConfigs = [];
1595
+ if (sortedColConfigs) {
1596
+ for (let colConfig of sortedColConfigs) {
1597
+ if (!hiddenColIds.includes(colConfig.id)) {
1598
+ columnConfigs.push(colConfig);
1599
+ }
1600
+ }
1601
+ }
1602
+
1603
+ const sortColumnData = [];
1604
+ if (Array.isArray(criteriaData["sortColIds"])) {
1605
+ sortColumnData.push(...criteriaData["sortColIds"]);
1606
+ }
1607
+
1608
+ let ltreeEntitySelect = this.getLtreeEntitySelectCriteria();
1609
+
1610
+ // actTable渲染
1611
+ const renderActTable = loading ? (
1612
+ <Table loading={loading}></Table>
1613
+ ) : (tableType == "report" ? <ReportTable
1614
+ tableProps={{ scrollY: ltmplConfig.scrollY, clickDisplayTotal: !ltmplConfig.directShowTotal }}
1615
+ serverKey={serverKey} hiddenColIds={hiddenColIds}
1616
+ maxSelectedRows={this.checkBoxUseful() ? 1000 : -1}
1617
+ columns={tableColumns}
1618
+ selectedRows={selectedRows} queryKey={queryKey}
1619
+ onChangeRowSelection={this.changeRowSelection}
1620
+ leftFixedCols={ltmplConfig.leftFixedCols}
1621
+ onChangeResize={this.onChangeResize}
1622
+ showEmpty={showEmpty}
1623
+ /> :
1624
+ <QueryTable key={"querytable" + sourceId} sourceId={sourceId}
1625
+ // queryTotal={this.queryTotal}
1626
+ tableProps={{ scrollY: ltmplConfig.scrollY, clickDisplayTotal: !ltmplConfig.directShowTotal }}
1627
+ serverKey={serverKey}
1628
+ onChangePage={onChangePage}
1629
+ viewModels={viewModels}
1630
+ primaryColumn={primaryColumn}
1631
+ columnConfigs={columnConfigs} summaryConfigs={ltmplConfig.totalColumnConfigs}
1632
+ maxSelectedRows={this.props?.tableType === "select" || this.checkBoxUseful() ? 10000 : -1}
1633
+ selectedRows={selectedRows} columns={tableColumns}
1634
+ hiddenRowCodes={hiddenRowCodes}
1635
+ pageInfo={pageInfo}
1636
+ queryKey={queryKey}
1637
+ onChangeRowSelection={this.changeRowSelection}
1638
+ subtotalXColumn={
1639
+ ltmplConfig.subtotalXColumn == null ||
1640
+ ltmplConfig.subtotalXColumn.length <= 0
1641
+ ? null
1642
+ : ltmplConfig.subtotalXColumn
1643
+ }
1644
+ groupIColumns={ltmplConfig.groupIColumns}
1645
+ doSearch={this.actTableDoSearch}
1646
+ sortColumnData={sortColumnData}
1647
+ cardListConfig={{ primaryColumn, primaryColumnLabel, secondColumn, secondColumnLabel, mainPicture, mainPictureLabel, labelColumn, cardShowCols, rowCardCount, buttons, customViewPagePath, mainCode, notDisplayFieldName, colNumOnRow }}
1648
+ ltmplConfig={ltmplConfig}
1649
+ showView={showView}
1650
+ showPagination={showPagination}
1651
+ onChangeAggregateVO={(val) => this.setState({ aggregateVO: val })}
1652
+ onChangeResize={this.onChangeResize}
1653
+ pageSizeOptions={pageSizeOptions}
1654
+ showEmpty={showEmpty}
1655
+ loadDataCallback={loadDataCallback}
1656
+ />);
1657
+
1658
+ // tab拆解条件渲染
1659
+ const renderSplitTab = <>
1660
+ {splitTabShowType === "tab" ? <Tabs tabBarGutter={12} size="small" activeKey={tabActiveKey} items={tabsOptions} onChange={this.doTabSearch} tabBarExtraContent={this.renderHeaderButtons()} /> : ""}
1661
+ {splitTabShowType === "tag" ? <div className="split-tab" ><Space className="split-tab-left" >{tabsOptions.map(r => <Button style={{ height: "28px" }} size="small" onClick={() => this.doTabSearch(r.key)} shape="round" type={tabActiveKey === r.key ? "primary" : "default"}>{r.title}</Button>)}</Space><div className="split-tab-right">{this.renderHeaderButtons()}</div></div> : ""}
1662
+ {splitTabShowType === "radio" ? <div className="split-tab" ><div className="split-tab-left"><Radio.Group onChange={(e) => this.doTabSearch(e.target.value)} value={tabActiveKey} options={tabsOptions} /></div><div className="split-tab-right">{this.renderHeaderButtons()}</div></div> : ""}
1663
+ </>;
1664
+
1665
+ const renderTable = <Layout hasSider style={{ backgroundColor: "#fff" }}>
1666
+ <Sider
1667
+ width={ltreeEntitySelect ? 260 : 0}
1668
+ theme={"light"}
1669
+ style={{ paddingRight: ltreeEntitySelect ? '10px' : "0px" }}
1670
+ >
1671
+ {ltreeEntitySelect ?
1672
+ <EntryControl style={{ width: "300px" }} onChange={this.ltreeValueChange} fieldConfig={ltreeEntitySelect}></EntryControl> : null}
1673
+ </Sider>
1674
+ <Layout style={{ backgroundColor: "#fff" }}>
1675
+ <Content style={{ overflow: "initial" }}>
1676
+ {showAggregates ? this.renderAggregates() : ""}
1677
+ {displayCriteriaCard ? this.renderCriteriaForm() : null}
1678
+ {buttons.includes("rowEdit") ? <AntdForm ref={this.formRef} component={false} onValuesChange={this.doRowEditFormChange}>{renderActTable}</AntdForm> : renderActTable}
1679
+ <PageChart ltmplConfig={ltmplConfig} criteriaData={userCriteriaData} />
1680
+ </Content>
1681
+ </Layout>
1682
+ </Layout>;
1683
+
1684
+ return (
1685
+ <>
1686
+ {buttons.includes("analysis") && showL2ActTable ? (
1687
+ <div>
1688
+ <L2ActTable
1689
+ serverKey={serverKey}
1690
+ innerQueryKey={queryKey.key}
1691
+ sourceId={sourceId}
1692
+ />
1693
+ <Divider
1694
+ dashed
1695
+ style={{ borderTopColor: "#40a9ff" }}
1696
+ plain
1697
+ ></Divider>
1698
+ </div>
1699
+ ) : (
1700
+ ""
1701
+ )}
1702
+ <div className="actTable">
1703
+ {["complete", "common"].includes(funcMode) ?
1704
+ <Row>
1705
+ <Col span={24}>
1706
+ {collapsible ? null : (
1707
+ <span>
1708
+ {ltmplConfig.header ? (
1709
+ <div
1710
+ style={{ padding: "6px" }}
1711
+ dangerouslySetInnerHTML={{ __html: ltmplConfig.header }}
1712
+ ></div>
1713
+ ) : null}
1714
+ {tabsOptions.length ? renderSplitTab :
1715
+ <>
1716
+ <h3 >
1717
+ <p className="act-table-title" style={{ position: "relative", float: "left", marginBottom: "4px" }}> {!title
1718
+ ? translate("${" + ltmplConfig.title + "}")
1719
+ : typeof title == "string"
1720
+ ? translate("${" + title + "}")
1721
+ : title}</p>
1722
+ </h3>
1723
+ <p className="fr" style={{ marginBottom: "4px" }}>{this.renderHeaderButtons()}</p>
1724
+ </>}
1725
+ </span>
1726
+ )}
1727
+ </Col>
1728
+ </Row> : null}
1729
+ {(showTableAdd !== false && buttons.includes("showTableAdd")) ? <RowTable mainTable={renderTable} ltmplConfig={ltmplConfig} tableNumber={userPageConfig?.rowTableNumber} sourceId={sourceId} rowTableCondig={userPageConfig?.rowTableCondig || []} setUserPageConfig={setUserPageConfig} /> : renderTable}
1730
+ {/*此处放页脚*/}
1731
+ {ltmplConfig.footer ? (
1732
+ <div
1733
+ style={{ padding: "6px" }}
1734
+ dangerouslySetInnerHTML={{ __html: ltmplConfig.footer }}
1735
+ ></div>
1736
+ ) : null}
1737
+ </div>
1738
+ </>
1739
+ );
1740
+ };
1741
+
1742
+ saveRatmplSelect = async (selectedRows: SelectedRow[]) => {
1743
+ this.setState({
1744
+ showRatmplSelector: false,
1745
+ });
1746
+ const { serverKey, sourceId, mainCode, doSearch } = this.props;
1747
+ if (!selectedRows || selectedRows.length <= 0) {
1748
+ return;
1749
+ }
1750
+
1751
+ //查询
1752
+ const codes: string[] = [];
1753
+ for (let row of selectedRows) {
1754
+ codes.push(row.code);
1755
+ }
1756
+ await HcserviceV3.saveRatmplSelectCodes(
1757
+ serverKey,
1758
+ sourceId,
1759
+ mainCode,
1760
+ codes
1761
+ );
1762
+ this.actTableDoSearch(null);
1763
+ };
1764
+
1765
+ render() {
1766
+ let { queryKey, loading, blockMenuTreeDrawerOpen, recordCode, record, showRatmplSelector, delModalOpen } = this.state;
1767
+ let { sourceId, ltmplConfig, title, collapsible, initCollapse, tip, serverKey, mainCode } = this.props;
1768
+ const { strongDeleteConfirmText } = ltmplConfig || {};
1769
+ const { translate } = this.context;
1770
+ const delFormRef = React.createRef<FormInstance>(); // 强删除表单的form Ref
1771
+
1772
+ if (!ltmplConfig || !sourceId) {
1773
+ return (
1774
+ <>
1775
+ <Card loading={loading}></Card>
1776
+ <Table loading={loading}></Table>
1777
+ </>
1778
+ );
1779
+ }
1780
+
1781
+ return (
1782
+ <>
1783
+ {this.renderAboveCustomPage()}
1784
+ {collapsible ? (
1785
+ <CollapseCard
1786
+ initCollapse={initCollapse}
1787
+ title={
1788
+ <>
1789
+ {!title ? ltmplConfig.title : title}
1790
+ <ToolTipBar
1791
+ content={tip ? tip : ltmplConfig ? ltmplConfig.tip : null}
1792
+ />
1793
+ </>
1794
+ }
1795
+ id={queryKey + ltmplConfig.id}
1796
+ className={`hoverable`}
1797
+ styles={{ header: { background: "#f2f4f5" }, body: { padding: "6px" } }}
1798
+ loading={loading}
1799
+ //暂时注释掉,后续要支持配置。
1800
+ extra={this.renderHeaderButtons()}
1801
+ >
1802
+ {this.renderContent()}
1803
+ </CollapseCard>
1804
+ ) : (
1805
+ <>{this.renderContent()}</>
1806
+ )}
1807
+ {this.renderOhterCustomPage()}
1808
+ <BlockMenuTreeDrawer
1809
+ onOk={() => {
1810
+ this.setState({
1811
+ blockMenuTreeDrawerOpen: false,
1812
+ });
1813
+ }}
1814
+ onCancel={() => {
1815
+ this.setState({
1816
+ blockMenuTreeDrawerOpen: false,
1817
+ });
1818
+ }}
1819
+ open={blockMenuTreeDrawerOpen}
1820
+ roleCode={recordCode}
1821
+ />
1822
+ {showRatmplSelector ? (
1823
+ <ModelSelectTable
1824
+ serverKey={serverKey}
1825
+ // defaultCriteriaValue={fieldGroupConfig.defaultCriteriaValue}
1826
+ // maxSelectedRows={fieldGroupConfig.max}
1827
+ open={showRatmplSelector}
1828
+ onOK={this.saveRatmplSelect}
1829
+ onCancel={() => {
1830
+ this.setState({ showRatmplSelector: false });
1831
+ }}
1832
+ mainCode={mainCode}
1833
+ sourceId={sourceId}
1834
+ existRelation={"false"}
1835
+ />
1836
+ ) : ""}
1837
+ {delModalOpen ?
1838
+ <Modal
1839
+ open={delModalOpen}
1840
+ title={translate("${确定要[删除]此数据吗}?")}
1841
+ onOk={() => delFormRef.current.validateFields().then(() => this.doDeleteByCode(record)).catch(() => { })}
1842
+ onCancel={() => this.setState({ record: undefined, recordCode: undefined, delModalOpen: false })}
1843
+ >
1844
+ <AntdForm ref={delFormRef} layout="vertical">
1845
+ <AntdForm.Item noStyle >
1846
+ <Alert message={translate("${风险操作,此操作不可逆,是否继续操作}?")} type="warning" showIcon style={{ margin: "12px 0" }} />
1847
+ </AntdForm.Item>
1848
+ <AntdForm.Item
1849
+ label={<div>{translate("${请手动输入}")}<span style={{ color: "#ff4d4f" }}> “ {translate("${" + strongDeleteConfirmText + "}")} ” </span>{translate("${完成验证}")}</div>}
1850
+ name="rule"
1851
+ rules={[
1852
+ { required: true, message: translate("${请输入}" + "${" + strongDeleteConfirmText + "}") },
1853
+ { validator: (_, value) => value && value !== translate("${" + strongDeleteConfirmText + "}") ? Promise.reject(new Error(translate("${请输入}" + "${" + strongDeleteConfirmText + "}"))) : Promise.resolve() }
1854
+ ]}
1855
+ >
1856
+ <Input placeholder={translate("${" + strongDeleteConfirmText + "}")} />
1857
+ </AntdForm.Item>
1858
+ </AntdForm>
1859
+ </Modal> : ""}
1860
+ </>
1861
+ );
1862
+ }
1863
+ }
1864
+
1865
+ export default ActTable;