aldehyde 0.2.488 → 0.2.490

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 (576) 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/decoration/decoration1/index.less +7 -7
  122. package/lib/lowcode-components/decoration/decoration10/index.js +3 -3
  123. package/lib/lowcode-components/decoration/decoration10/index.less +5 -5
  124. package/lib/lowcode-components/decoration/decoration11/index.less +5 -5
  125. package/lib/lowcode-components/decoration/decoration2/index.less +6 -6
  126. package/lib/lowcode-components/decoration/decoration3/index.less +7 -7
  127. package/lib/lowcode-components/decoration/decoration4/index.less +29 -29
  128. package/lib/lowcode-components/decoration/decoration5/index.less +3 -3
  129. package/lib/lowcode-components/decoration/decoration6/index.less +7 -7
  130. package/lib/lowcode-components/decoration/decoration7/index.less +4 -4
  131. package/lib/lowcode-components/decoration/decoration8/index.less +14 -14
  132. package/lib/lowcode-components/decoration/decoration9/index.less +4 -4
  133. package/lib/lowcode-components/effectScatter-map/index.js +6 -6
  134. package/lib/lowcode-components/effectScatter-map-3d/index.js +6 -6
  135. package/lib/lowcode-components/lowcode-view/index.less +19 -19
  136. package/lib/lowcode-components/search-form/index.less +25 -25
  137. package/lib/module/dtmpl-edit-card.d.ts.map +1 -1
  138. package/lib/module/dtmpl-edit-page.d.ts.map +1 -1
  139. package/lib/module/index.less +4 -4
  140. package/lib/module/ltmpl-modal.d.ts.map +1 -1
  141. package/lib/module/ltmpl-table.d.ts.map +1 -1
  142. package/lib/routable/index.less +25 -25
  143. package/lib/table/act-table.d.ts.map +1 -1
  144. package/lib/table/column/index.less +85 -85
  145. package/lib/table/index.css +211 -211
  146. package/lib/table/modal-select-table.d.ts.map +1 -1
  147. package/lib/table/page-chart.d.ts +1 -1
  148. package/lib/table/page-chart.d.ts.map +1 -1
  149. package/lib/table/page-chart.js +4 -1
  150. package/lib/table/page-chart.js.map +1 -1
  151. package/lib/table/page-chart.less +9 -9
  152. package/lib/table/pagination.css +14 -14
  153. package/lib/table/pagination.d.ts.map +1 -1
  154. package/lib/table/relation-table.d.ts.map +1 -1
  155. package/lib/table/selected-rows-card.d.ts.map +1 -1
  156. package/lib/table/stat/restat.d.ts.map +1 -1
  157. package/lib/tree/act-tree.d.ts.map +1 -1
  158. package/lib/tree/block-menu-auth-tree.d.ts.map +1 -1
  159. package/lib/tree/index.css +22 -22
  160. package/lib/tree/tmpl-tree.d.ts.map +1 -1
  161. package/lib/welcome/components/menu-card.less +96 -96
  162. package/lib/welcome/components/page-card.less +49 -49
  163. package/lib/welcome/components/quick-entrance.less +120 -120
  164. package/lib/welcome/components/user-menus.less +192 -192
  165. package/lib/welcome/components/workbench.less +118 -118
  166. package/lib/welcome/index.css +13 -13
  167. package/package.json +224 -224
  168. package/src/aldehyde/controls/2dEditor/2dEditor/index.less +5 -5
  169. package/src/aldehyde/controls/2dEditor/2dEditor/index.tsx +270 -270
  170. package/src/aldehyde/controls/2dEditor/2dView/index.less +8 -8
  171. package/src/aldehyde/controls/2dEditor/2dView/index.tsx +110 -110
  172. package/src/aldehyde/controls/2dEditor/components/card.tsx +256 -256
  173. package/src/aldehyde/controls/2dEditor/components/component.less +83 -83
  174. package/src/aldehyde/controls/2dEditor/components/data.d.ts +32 -32
  175. package/src/aldehyde/controls/2dEditor/components/hotspot.tsx +80 -80
  176. package/src/aldehyde/controls/2dEditor/components/html-box.tsx +101 -101
  177. package/src/aldehyde/controls/2dEditor/components/image.tsx +99 -99
  178. package/src/aldehyde/controls/2dEditor/components/line.tsx +73 -73
  179. package/src/aldehyde/controls/action/index.css +8 -8
  180. package/src/aldehyde/controls/action/index.tsx +406 -406
  181. package/src/aldehyde/controls/action/utils.tsx +306 -306
  182. package/src/aldehyde/controls/auto-complete/index.tsx +82 -82
  183. package/src/aldehyde/controls/cascader/index.tsx +112 -112
  184. package/src/aldehyde/controls/chemstruc/graph.tsx +185 -185
  185. package/src/aldehyde/controls/chemstruc/index.css +28 -28
  186. package/src/aldehyde/controls/code-editor/sql-code-editor.tsx +73 -73
  187. package/src/aldehyde/controls/collapse-card/index.css +8 -8
  188. package/src/aldehyde/controls/collapse-card/index.tsx +109 -109
  189. package/src/aldehyde/controls/color-picker/index.tsx +21 -21
  190. package/src/aldehyde/controls/counting-tag/index.tsx +53 -53
  191. package/src/aldehyde/controls/cquery/cquick-button.tsx +145 -145
  192. package/src/aldehyde/controls/date-picker/index.tsx +199 -199
  193. package/src/aldehyde/controls/direct-file-view/drawer-file-view.tsx +54 -54
  194. package/src/aldehyde/controls/direct-file-view/index.tsx +147 -147
  195. package/src/aldehyde/controls/direct-upload/index.tsx +140 -140
  196. package/src/aldehyde/controls/entity-select/entity-select.tsx +791 -791
  197. package/src/aldehyde/controls/entity-select/index.css +7 -7
  198. package/src/aldehyde/controls/entity-select/lab-tree-select.tsx +154 -154
  199. package/src/aldehyde/controls/entity-select/popover-entity-select.tsx +205 -205
  200. package/src/aldehyde/controls/entry-control.tsx +431 -431
  201. package/src/aldehyde/controls/enum-badge/index.tsx +42 -42
  202. package/src/aldehyde/controls/enum-tag/index.tsx +45 -45
  203. package/src/aldehyde/controls/field-history/index.tsx +81 -81
  204. package/src/aldehyde/controls/file-export/select-code-export.tsx +40 -40
  205. package/src/aldehyde/controls/file-view/drawer-file-view.tsx +117 -117
  206. package/src/aldehyde/controls/file-view/index.less +9 -9
  207. package/src/aldehyde/controls/file-view/index.tsx +148 -148
  208. package/src/aldehyde/controls/file-view/multi-file-view.tsx +39 -39
  209. package/src/aldehyde/controls/file-view/newin-file-view.tsx +40 -40
  210. package/src/aldehyde/controls/html-editor/draft.tsx +136 -136
  211. package/src/aldehyde/controls/html-editor/index.less +67 -67
  212. package/src/aldehyde/controls/icon-selector/app-icon-selector.tsx +68 -68
  213. package/src/aldehyde/controls/icon-selector/icon/aldehyde-menu-icon/iconfont.css +147 -147
  214. package/src/aldehyde/controls/icon-selector/icon/aldehyde-menu-icon/iconfont.json +240 -240
  215. package/src/aldehyde/controls/icon-selector/pc-icon-selector.tsx +68 -68
  216. package/src/aldehyde/controls/input-number/index.tsx +148 -148
  217. package/src/aldehyde/controls/input-range/index.tsx +59 -59
  218. package/src/aldehyde/controls/password-setter/index.css +2 -2
  219. package/src/aldehyde/controls/password-setter/index.js +88 -88
  220. package/src/aldehyde/controls/progress/index.tsx +74 -74
  221. package/src/aldehyde/controls/qr-code/index.less +28 -28
  222. package/src/aldehyde/controls/qr-code/index.tsx +40 -40
  223. package/src/aldehyde/controls/relation-existion/index.css +3 -3
  224. package/src/aldehyde/controls/relation-existion/index.tsx +144 -144
  225. package/src/aldehyde/controls/rfield/index.css +4 -4
  226. package/src/aldehyde/controls/rfield/index.tsx +225 -225
  227. package/src/aldehyde/controls/select/index.tsx +226 -226
  228. package/src/aldehyde/controls/signature/index.tsx +226 -226
  229. package/src/aldehyde/controls/single-checkbox/index.tsx +18 -18
  230. package/src/aldehyde/controls/steps/index.tsx +59 -59
  231. package/src/aldehyde/controls/text/ellipsis-text.tsx +98 -98
  232. package/src/aldehyde/controls/text/index.less +7 -7
  233. package/src/aldehyde/controls/tree-select/navigation-tree.tsx +122 -122
  234. package/src/aldehyde/controls/tree-select/tree-entity-select.tsx +121 -121
  235. package/src/aldehyde/controls/upload/index.tsx +128 -128
  236. package/src/aldehyde/controls/upload/mult-file-upload.tsx +240 -240
  237. package/src/aldehyde/controls/upload-read-excel/index.tsx +43 -43
  238. package/src/aldehyde/controls/view-control.tsx +289 -289
  239. package/src/aldehyde/custom-page/custom-detail-modal-page.tsx +69 -69
  240. package/src/aldehyde/custom-page/custom-page-router.tsx +64 -64
  241. package/src/aldehyde/custom-page/def-custom-page.tsx +17 -17
  242. package/src/aldehyde/custom-page/dtmpl-custom-edit-modal-page.tsx +88 -88
  243. package/src/aldehyde/detail/button/bottom-submit-button-bar.tsx +91 -91
  244. package/src/aldehyde/detail/button/cquery-button-bar.tsx +144 -144
  245. package/src/aldehyde/detail/button/edit-button.tsx +61 -61
  246. package/src/aldehyde/detail/button/fix-right-submit-button-bar.tsx +186 -186
  247. package/src/aldehyde/detail/button/index.css +42 -42
  248. package/src/aldehyde/detail/button/inline-edit-button.tsx +40 -40
  249. package/src/aldehyde/detail/button/submit-button-bar.tsx +57 -57
  250. package/src/aldehyde/detail/button/view-button.tsx +64 -64
  251. package/src/aldehyde/detail/dtmpl.css +72 -72
  252. package/src/aldehyde/detail/edit/dtmpl-edit.tsx +279 -279
  253. package/src/aldehyde/detail/edit/fields-edit-card.tsx +145 -145
  254. package/src/aldehyde/detail/edit/modal-row-edit.tsx +95 -95
  255. package/src/aldehyde/detail/edit/popover-edit-card.tsx +167 -167
  256. package/src/aldehyde/detail/edit/popover-editor.tsx +70 -70
  257. package/src/aldehyde/detail/edit/post-result/index.tsx +86 -86
  258. package/src/aldehyde/detail/rightbar/index.css +34 -34
  259. package/src/aldehyde/detail/rightbar/index.tsx +92 -92
  260. package/src/aldehyde/detail/tooltipbar/index.tsx +32 -32
  261. package/src/aldehyde/detail/view/act-dtmpl-view.tsx +288 -288
  262. package/src/aldehyde/detail/view/dtmpl-view.tsx +334 -334
  263. package/src/aldehyde/detail/view/field-view-group.tsx +88 -88
  264. package/src/aldehyde/detail/view/modal-dtmpl-view.tsx +73 -73
  265. package/src/aldehyde/detail/view/snapshot-timeline.tsx +231 -231
  266. package/src/aldehyde/detail/view/tab-act-dtmpl-view.tsx +304 -304
  267. package/src/aldehyde/detail/view/view-compare-panel.tsx +57 -57
  268. package/src/aldehyde/draw-canvas-edit/components/render/components/index.less +60 -60
  269. package/src/aldehyde/draw-canvas-edit/components/render/components/index.ts +3 -3
  270. package/src/aldehyde/draw-canvas-edit/components/render/components/workstation-component.tsx +220 -220
  271. package/src/aldehyde/draw-canvas-edit/components/render/draws/bg-draw.ts +177 -177
  272. package/src/aldehyde/draw-canvas-edit/components/render/draws/contextmenu-draw.ts +330 -330
  273. package/src/aldehyde/draw-canvas-edit/components/render/draws/graph-draw.ts +249 -249
  274. package/src/aldehyde/draw-canvas-edit/components/render/draws/link-draw.ts +1415 -1415
  275. package/src/aldehyde/draw-canvas-edit/components/render/draws/preview-draw.ts +274 -274
  276. package/src/aldehyde/draw-canvas-edit/components/render/draws/ref-line-draw.ts +71 -71
  277. package/src/aldehyde/draw-canvas-edit/components/render/draws/ruler-draw.ts +166 -166
  278. package/src/aldehyde/draw-canvas-edit/components/render/graphs/bezier.ts +542 -542
  279. package/src/aldehyde/draw-canvas-edit/components/render/handlers/drag-outside-handlers.ts +77 -77
  280. package/src/aldehyde/draw-canvas-edit/components/render/handlers/selection-handlers.ts +410 -410
  281. package/src/aldehyde/draw-canvas-edit/components/render/index.ts +817 -817
  282. package/src/aldehyde/draw-canvas-edit/components/render/tools/attract-tool.ts +457 -457
  283. package/src/aldehyde/draw-canvas-edit/components/render/tools/component-factory.ts +269 -269
  284. package/src/aldehyde/draw-canvas-edit/components/render/tools/copy-tool.ts +244 -244
  285. package/src/aldehyde/draw-canvas-edit/components/render/tools/import-export-tool.ts +588 -588
  286. package/src/aldehyde/draw-canvas-edit/components/render/tools/index.ts +10 -10
  287. package/src/aldehyde/draw-canvas-edit/components/render/tools/position-tool.ts +191 -191
  288. package/src/aldehyde/draw-canvas-edit/components/render/tools/selection-tool.ts +140 -140
  289. package/src/aldehyde/draw-canvas-edit/components/render/types.ts +298 -298
  290. package/src/aldehyde/draw-canvas-edit/components/setting-form/index.tsx +305 -305
  291. package/src/aldehyde/draw-canvas-edit/constant.ts +5 -5
  292. package/src/aldehyde/draw-canvas-edit/index.less +48 -48
  293. package/src/aldehyde/draw-canvas-edit/index.tsx +213 -213
  294. package/src/aldehyde/draw-canvas-view/index.less +66 -66
  295. package/src/aldehyde/draw-canvas-view/index.tsx +49 -49
  296. package/src/aldehyde/draw-canvas-view/view.tsx +237 -237
  297. package/src/aldehyde/export/export-frame.css +2 -2
  298. package/src/aldehyde/export/export-frame.tsx +301 -301
  299. package/src/aldehyde/export/select-code-export-frame.tsx +212 -212
  300. package/src/aldehyde/form/criteria-form.tsx +604 -604
  301. package/src/aldehyde/form/dtmpl-form.css +3 -3
  302. package/src/aldehyde/form/dtmpl-form.tsx +571 -571
  303. package/src/aldehyde/form/field-group-form.tsx +103 -103
  304. package/src/aldehyde/form/fields-form.tsx +45 -45
  305. package/src/aldehyde/form/form-Item-group.tsx +246 -246
  306. package/src/aldehyde/form/index.css +12 -12
  307. package/src/aldehyde/hooks/use-match-route/index.tsx +62 -62
  308. package/src/aldehyde/hooks/use-tabs/index.tsx +139 -139
  309. package/src/aldehyde/hooks/useVarCssColor.ts +6 -6
  310. package/src/aldehyde/icon/aliIcon.tsx +9 -9
  311. package/src/aldehyde/icon/index.tsx +28 -28
  312. package/src/aldehyde/import/excel-import.tsx +450 -450
  313. package/src/aldehyde/import/index.css +53 -53
  314. package/src/aldehyde/import/template.css +50 -50
  315. package/src/aldehyde/index.tsx +220 -220
  316. package/src/aldehyde/layout/MainPage.tsx +334 -334
  317. package/src/aldehyde/layout/common.css +64 -64
  318. package/src/aldehyde/layout/coverstyle.css +51 -51
  319. package/src/aldehyde/layout/footer/index.css +5 -5
  320. package/src/aldehyde/layout/footer/index.js +17 -17
  321. package/src/aldehyde/layout/header/index.css +122 -122
  322. package/src/aldehyde/layout/header/index.tsx +152 -152
  323. package/src/aldehyde/layout/menu/block.css +7 -7
  324. package/src/aldehyde/layout/menu/block.tsx +174 -174
  325. package/src/aldehyde/layout/menu/l2menu-message-bar.tsx +160 -160
  326. package/src/aldehyde/layout/menu/l2menu-quick-bar.tsx +175 -175
  327. package/src/aldehyde/layout/menu/menu-2layers.tsx +117 -117
  328. package/src/aldehyde/layout/menu/menu-render.tsx +168 -168
  329. package/src/aldehyde/layout/menu/message-bar.less +73 -73
  330. package/src/aldehyde/layout/menu/reset-password.tsx +255 -255
  331. package/src/aldehyde/layout/menu/user-bar.tsx +259 -259
  332. package/src/aldehyde/layout/menu/userinfo-bar.tsx +69 -69
  333. package/src/aldehyde/layout/sidebar/index.css +57 -57
  334. package/src/aldehyde/layout/sidebar/index.tsx +84 -84
  335. package/src/aldehyde/layout2/components/icon-font.tsx +7 -7
  336. package/src/aldehyde/layout2/components/screenfull-button.tsx +21 -21
  337. package/src/aldehyde/layout2/components/search-menu.tsx +85 -85
  338. package/src/aldehyde/layout2/components/system-messages.tsx +75 -75
  339. package/src/aldehyde/layout2/components/theme-button.tsx +65 -65
  340. package/src/aldehyde/layout2/components/user-button.tsx +258 -258
  341. package/src/aldehyde/layout2/components/user-notification.tsx +74 -74
  342. package/src/aldehyde/layout2/css/header.css +41 -41
  343. package/src/aldehyde/layout2/css/sider.less +17 -17
  344. package/src/aldehyde/layout2/css/tabs-layout.less +18 -18
  345. package/src/aldehyde/layout2/header.tsx +278 -278
  346. package/src/aldehyde/layout2/layout-context.tsx +95 -95
  347. package/src/aldehyde/layout2/main.tsx +30 -30
  348. package/src/aldehyde/layout2/page.tsx +315 -315
  349. package/src/aldehyde/layout2/sider.tsx +230 -230
  350. package/src/aldehyde/layout2/tabs/tabs-context.tsx +37 -37
  351. package/src/aldehyde/layout2/tabs/tabs-layout.tsx +146 -146
  352. package/src/aldehyde/layout2/type/layout-type.ts +15 -15
  353. package/src/aldehyde/layout2/util/menu-util.tsx +125 -125
  354. package/src/aldehyde/layout3/components/tabs-layout.tsx +110 -110
  355. package/src/aldehyde/layout3/components/time.tsx +25 -25
  356. package/src/aldehyde/layout3/css/header.less +195 -195
  357. package/src/aldehyde/layout3/css/main.less +161 -161
  358. package/src/aldehyde/layout3/css/sider.less +32 -32
  359. package/src/aldehyde/layout3/css/tabs-layout.less +38 -38
  360. package/src/aldehyde/layout3/header.tsx +187 -187
  361. package/src/aldehyde/layout3/main.tsx +29 -29
  362. package/src/aldehyde/layout3/page.tsx +110 -110
  363. package/src/aldehyde/layout3/sider.tsx +198 -198
  364. package/src/aldehyde/layout4/components/tabs-layout.tsx +110 -110
  365. package/src/aldehyde/layout4/css/header.less +196 -196
  366. package/src/aldehyde/layout4/css/main.less +154 -154
  367. package/src/aldehyde/layout4/css/sider.less +37 -37
  368. package/src/aldehyde/layout4/css/tabs-layout.less +42 -42
  369. package/src/aldehyde/layout4/header.tsx +190 -190
  370. package/src/aldehyde/layout4/main.tsx +29 -29
  371. package/src/aldehyde/layout4/page.tsx +125 -125
  372. package/src/aldehyde/layout4/sider.tsx +201 -201
  373. package/src/aldehyde/layout5/css/header.less +35 -35
  374. package/src/aldehyde/layout5/css/sider.less +18 -18
  375. package/src/aldehyde/layout5/header.tsx +204 -204
  376. package/src/aldehyde/layout5/page.tsx +107 -107
  377. package/src/aldehyde/layout5/sider.tsx +235 -235
  378. package/src/aldehyde/list/calendar/index.less +20 -20
  379. package/src/aldehyde/list/calendar/index.tsx +157 -157
  380. package/src/aldehyde/list/card-list/card-list-item.tsx +112 -112
  381. package/src/aldehyde/list/card-list/index.less +154 -154
  382. package/src/aldehyde/list/card-list/index.tsx +83 -83
  383. package/src/aldehyde/list/gantt/index.less +8 -8
  384. package/src/aldehyde/list/gantt/index.tsx +508 -508
  385. package/src/aldehyde/list/vertical-list/index.less +208 -208
  386. package/src/aldehyde/list/vertical-list/index.tsx +55 -55
  387. package/src/aldehyde/list/vertical-list/item.tsx +136 -136
  388. package/src/aldehyde/locale/LocaleButton.tsx +48 -48
  389. package/src/aldehyde/locale/LocaleProvider.tsx +265 -265
  390. package/src/aldehyde/locale/langMp.ts +45 -45
  391. package/src/aldehyde/locale/translate.ts +80 -80
  392. package/src/aldehyde/locale/useLocale.ts +72 -72
  393. package/src/aldehyde/login/context-setter.tsx +130 -130
  394. package/src/aldehyde/login/index.css +19 -19
  395. package/src/aldehyde/login/login.tsx +255 -255
  396. package/src/aldehyde/login/router-login.tsx +107 -107
  397. package/src/aldehyde/login/vertify/index.css +143 -143
  398. package/src/aldehyde/login/vertify/index.tsx +360 -360
  399. package/src/aldehyde/login/vertify/tool.ts +13 -13
  400. package/src/aldehyde/login2/login-page.tsx +92 -92
  401. package/src/aldehyde/login2/login.tsx +227 -227
  402. package/src/aldehyde/login3/index.less +136 -136
  403. package/src/aldehyde/login3/login-page.tsx +71 -71
  404. package/src/aldehyde/lowcode-components/act-table/index.less +26 -26
  405. package/src/aldehyde/lowcode-components/act-table/index.tsx +139 -139
  406. package/src/aldehyde/lowcode-components/assets/lowcode-constant.tsx +12 -12
  407. package/src/aldehyde/lowcode-components/bar-chart/index.tsx +272 -272
  408. package/src/aldehyde/lowcode-components/base-button/index.less +7 -7
  409. package/src/aldehyde/lowcode-components/base-button/index.tsx +197 -197
  410. package/src/aldehyde/lowcode-components/base-image/index.tsx +220 -220
  411. package/src/aldehyde/lowcode-components/base-map/index.tsx +292 -292
  412. package/src/aldehyde/lowcode-components/base-radio/index.less +23 -23
  413. package/src/aldehyde/lowcode-components/base-radio/index.tsx +157 -157
  414. package/src/aldehyde/lowcode-components/base-table/index.tsx +268 -268
  415. package/src/aldehyde/lowcode-components/base-tabs/index.less +14 -14
  416. package/src/aldehyde/lowcode-components/base-tabs/index.tsx +183 -183
  417. package/src/aldehyde/lowcode-components/base-text/index.tsx +58 -58
  418. package/src/aldehyde/lowcode-components/border/border1/index.tsx +70 -70
  419. package/src/aldehyde/lowcode-components/border/border10/index.less +26 -26
  420. package/src/aldehyde/lowcode-components/border/border10/index.tsx +45 -45
  421. package/src/aldehyde/lowcode-components/border/border11/index.less +17 -17
  422. package/src/aldehyde/lowcode-components/border/border11/index.tsx +232 -232
  423. package/src/aldehyde/lowcode-components/border/border12/index.less +13 -13
  424. package/src/aldehyde/lowcode-components/border/border12/index.tsx +115 -115
  425. package/src/aldehyde/lowcode-components/border/border13/index.less +13 -13
  426. package/src/aldehyde/lowcode-components/border/border13/index.tsx +69 -69
  427. package/src/aldehyde/lowcode-components/border/border2/index.less +17 -17
  428. package/src/aldehyde/lowcode-components/border/border2/index.tsx +51 -51
  429. package/src/aldehyde/lowcode-components/border/border3/index.less +25 -25
  430. package/src/aldehyde/lowcode-components/border/border3/index.tsx +61 -61
  431. package/src/aldehyde/lowcode-components/border/border4/index.less +72 -72
  432. package/src/aldehyde/lowcode-components/border/border4/index.tsx +79 -79
  433. package/src/aldehyde/lowcode-components/border/border5/index.less +35 -35
  434. package/src/aldehyde/lowcode-components/border/border5/index.tsx +75 -75
  435. package/src/aldehyde/lowcode-components/border/border6/index.less +17 -17
  436. package/src/aldehyde/lowcode-components/border/border6/index.tsx +60 -60
  437. package/src/aldehyde/lowcode-components/border/border7/index.less +26 -26
  438. package/src/aldehyde/lowcode-components/border/border7/index.tsx +75 -75
  439. package/src/aldehyde/lowcode-components/border/border8/index.less +13 -13
  440. package/src/aldehyde/lowcode-components/border/border8/index.tsx +84 -84
  441. package/src/aldehyde/lowcode-components/border/border9/index.less +13 -13
  442. package/src/aldehyde/lowcode-components/border/border9/index.tsx +154 -154
  443. package/src/aldehyde/lowcode-components/capsule-bar-chart/index.tsx +290 -290
  444. package/src/aldehyde/lowcode-components/carousel/index.tsx +218 -218
  445. package/src/aldehyde/lowcode-components/circular-progress-chart/index.tsx +263 -263
  446. package/src/aldehyde/lowcode-components/column-3d-chart/index.tsx +442 -442
  447. package/src/aldehyde/lowcode-components/column-chart/index.tsx +297 -297
  448. package/src/aldehyde/lowcode-components/data-number/index.tsx +219 -219
  449. package/src/aldehyde/lowcode-components/data.d.ts +19 -19
  450. package/src/aldehyde/lowcode-components/decoration/decoration1/index.less +7 -7
  451. package/src/aldehyde/lowcode-components/decoration/decoration1/index.tsx +153 -153
  452. package/src/aldehyde/lowcode-components/decoration/decoration10/index.less +5 -5
  453. package/src/aldehyde/lowcode-components/decoration/decoration10/index.tsx +89 -89
  454. package/src/aldehyde/lowcode-components/decoration/decoration11/index.less +5 -5
  455. package/src/aldehyde/lowcode-components/decoration/decoration11/index.tsx +133 -133
  456. package/src/aldehyde/lowcode-components/decoration/decoration2/index.less +6 -6
  457. package/src/aldehyde/lowcode-components/decoration/decoration2/index.tsx +61 -61
  458. package/src/aldehyde/lowcode-components/decoration/decoration3/index.less +7 -7
  459. package/src/aldehyde/lowcode-components/decoration/decoration3/index.tsx +87 -87
  460. package/src/aldehyde/lowcode-components/decoration/decoration4/index.less +29 -29
  461. package/src/aldehyde/lowcode-components/decoration/decoration4/index.tsx +53 -53
  462. package/src/aldehyde/lowcode-components/decoration/decoration5/index.less +3 -3
  463. package/src/aldehyde/lowcode-components/decoration/decoration5/index.tsx +116 -116
  464. package/src/aldehyde/lowcode-components/decoration/decoration6/index.less +7 -7
  465. package/src/aldehyde/lowcode-components/decoration/decoration6/index.tsx +121 -121
  466. package/src/aldehyde/lowcode-components/decoration/decoration7/index.less +4 -4
  467. package/src/aldehyde/lowcode-components/decoration/decoration7/index.tsx +70 -70
  468. package/src/aldehyde/lowcode-components/decoration/decoration8/index.less +14 -14
  469. package/src/aldehyde/lowcode-components/decoration/decoration8/index.tsx +122 -122
  470. package/src/aldehyde/lowcode-components/decoration/decoration9/index.less +4 -4
  471. package/src/aldehyde/lowcode-components/decoration/decoration9/index.tsx +196 -196
  472. package/src/aldehyde/lowcode-components/effectScatter-map/index.tsx +315 -315
  473. package/src/aldehyde/lowcode-components/effectScatter-map-3d/index.tsx +419 -419
  474. package/src/aldehyde/lowcode-components/gauge-chart/index.tsx +254 -254
  475. package/src/aldehyde/lowcode-components/index.ts +130 -130
  476. package/src/aldehyde/lowcode-components/line-bar-chart/index.tsx +304 -304
  477. package/src/aldehyde/lowcode-components/line-chart/index.tsx +294 -294
  478. package/src/aldehyde/lowcode-components/liquid-chart/index.tsx +250 -250
  479. package/src/aldehyde/lowcode-components/lowcode-view/component/assets.ts +478 -478
  480. package/src/aldehyde/lowcode-components/lowcode-view/component/component-controller.ts +153 -153
  481. package/src/aldehyde/lowcode-components/lowcode-view/component/component-definition.ts +23 -23
  482. package/src/aldehyde/lowcode-components/lowcode-view/component/loading.tsx +20 -20
  483. package/src/aldehyde/lowcode-components/lowcode-view/component/util.ts +27 -27
  484. package/src/aldehyde/lowcode-components/lowcode-view/index.less +19 -19
  485. package/src/aldehyde/lowcode-components/lowcode-view/index.tsx +277 -277
  486. package/src/aldehyde/lowcode-components/lowcode-view/interface.ts +189 -189
  487. package/src/aldehyde/lowcode-components/pie-chart/index.tsx +353 -353
  488. package/src/aldehyde/lowcode-components/progress-chart/index.tsx +295 -295
  489. package/src/aldehyde/lowcode-components/radar-chart/index.tsx +322 -322
  490. package/src/aldehyde/lowcode-components/search-form/index.less +25 -25
  491. package/src/aldehyde/lowcode-components/search-form/index.tsx +121 -121
  492. package/src/aldehyde/lowcode-components/stroke-animation/index.tsx +219 -219
  493. package/src/aldehyde/module/block-menu-tree-drawer.tsx +118 -118
  494. package/src/aldehyde/module/criteria-page.tsx1 +175 -175
  495. package/src/aldehyde/module/draggable-modal.tsx +66 -66
  496. package/src/aldehyde/module/dtmpl-edit-card.tsx +477 -477
  497. package/src/aldehyde/module/dtmpl-edit-drawer.tsx +23 -23
  498. package/src/aldehyde/module/dtmpl-edit-modal.tsx +25 -25
  499. package/src/aldehyde/module/dtmpl-edit-page.tsx +597 -597
  500. package/src/aldehyde/module/dtmpl-editor.tsx +165 -165
  501. package/src/aldehyde/module/dtmpl-view-card.tsx +64 -64
  502. package/src/aldehyde/module/dtmpl-view-drawer.tsx +71 -71
  503. package/src/aldehyde/module/dtmpl-view-modal.tsx +56 -56
  504. package/src/aldehyde/module/embed-dtmpl-edit-page.tsx +137 -137
  505. package/src/aldehyde/module/index.less +4 -4
  506. package/src/aldehyde/module/ltmpl-drawer.tsx +60 -60
  507. package/src/aldehyde/module/ltmpl-modal.tsx +63 -63
  508. package/src/aldehyde/module/ltmpl-table.tsx +379 -379
  509. package/src/aldehyde/module/ttmpl-tree.tsx +47 -47
  510. package/src/aldehyde/routable/dtmpl-route.tsx +173 -173
  511. package/src/aldehyde/routable/import-route.tsx +35 -35
  512. package/src/aldehyde/routable/index.less +25 -25
  513. package/src/aldehyde/routable/ltmpl-route.tsx +539 -539
  514. package/src/aldehyde/routable/splitview-ltmpl-route.tsx +377 -377
  515. package/src/aldehyde/routable/ttmpl-route.tsx +93 -93
  516. package/src/aldehyde/routable/withroute.tsx +36 -36
  517. package/src/aldehyde/sso-Login/index.tsx +73 -73
  518. package/src/aldehyde/sso-Login/service/index.js +16 -16
  519. package/src/aldehyde/sso-Login/service/login.js +75 -75
  520. package/src/aldehyde/table/act-table.tsx +1844 -1844
  521. package/src/aldehyde/table/column/column-builder.tsx +876 -876
  522. package/src/aldehyde/table/column/column-selector.tsx +130 -130
  523. package/src/aldehyde/table/column/index.less +85 -85
  524. package/src/aldehyde/table/column/summary-builder.tsx +712 -712
  525. package/src/aldehyde/table/column/theme-color-getter.tsx +25 -25
  526. package/src/aldehyde/table/control-table-x-axis-wrapper.tsx +80 -80
  527. package/src/aldehyde/table/index.css +211 -211
  528. package/src/aldehyde/table/l2-act-table.tsx +91 -91
  529. package/src/aldehyde/table/modal-select-table.tsx +308 -308
  530. package/src/aldehyde/table/page-chart.less +9 -9
  531. package/src/aldehyde/table/page-chart.tsx +196 -192
  532. package/src/aldehyde/table/page-config-button.tsx +203 -203
  533. package/src/aldehyde/table/pagination.css +14 -14
  534. package/src/aldehyde/table/pagination.tsx +81 -81
  535. package/src/aldehyde/table/query-table.tsx +668 -668
  536. package/src/aldehyde/table/relation-table.tsx +1078 -1078
  537. package/src/aldehyde/table/report-table.tsx +125 -125
  538. package/src/aldehyde/table/resizable-table.tsx +97 -97
  539. package/src/aldehyde/table/row-table.tsx +22 -22
  540. package/src/aldehyde/table/select-table.tsx +559 -559
  541. package/src/aldehyde/table/selected-rows-card.tsx +78 -78
  542. package/src/aldehyde/table/stat/restat.tsx +122 -122
  543. package/src/aldehyde/table/table-util.tsx +25 -25
  544. package/src/aldehyde/tmpl/control-type-supportor.tsx +154 -154
  545. package/src/aldehyde/tmpl/hc-data-source.tsx +574 -574
  546. package/src/aldehyde/tmpl/hcservice-v3.tsx +1590 -1590
  547. package/src/aldehyde/tmpl/interface.tsx +936 -936
  548. package/src/aldehyde/tmpl/model-struc-v3.tsx +111 -111
  549. package/src/aldehyde/tmpl/superagent.js +146 -146
  550. package/src/aldehyde/tmpl/tmpl-config-analysis.tsx +585 -585
  551. package/src/aldehyde/tmpl/web-socket.ts +366 -366
  552. package/src/aldehyde/tree/act-tree.tsx +217 -217
  553. package/src/aldehyde/tree/block-menu-auth-tree.tsx +189 -189
  554. package/src/aldehyde/tree/index.css +22 -22
  555. package/src/aldehyde/tree/navigation-tree.tsx +39 -39
  556. package/src/aldehyde/tree/tmpl-tree.tsx +751 -751
  557. package/src/aldehyde/tree/tree-node.tsx +73 -73
  558. package/src/aldehyde/tree/tree-utils.tsx +317 -317
  559. package/src/aldehyde/units/EncryptUtils.js +37 -37
  560. package/src/aldehyde/units/image.d.ts +7 -7
  561. package/src/aldehyde/units/index.tsx +1367 -1367
  562. package/src/aldehyde/units/storage.js +2 -2
  563. package/src/aldehyde/utils/dsu.ts +27 -27
  564. package/src/aldehyde/welcome/HCWelcome.js +404 -404
  565. package/src/aldehyde/welcome/HCWelcome1.js +259 -259
  566. package/src/aldehyde/welcome/components/menu-card.less +96 -96
  567. package/src/aldehyde/welcome/components/menu-card.tsx +70 -70
  568. package/src/aldehyde/welcome/components/page-card.less +49 -49
  569. package/src/aldehyde/welcome/components/page-card.tsx +97 -97
  570. package/src/aldehyde/welcome/components/quick-entrance.less +120 -120
  571. package/src/aldehyde/welcome/components/quick-entrance.tsx +80 -80
  572. package/src/aldehyde/welcome/components/user-menus.less +192 -192
  573. package/src/aldehyde/welcome/components/user-menus.tsx +279 -279
  574. package/src/aldehyde/welcome/components/workbench.less +118 -118
  575. package/src/aldehyde/welcome/components/workbench.tsx +146 -146
  576. package/src/aldehyde/welcome/index.css +13 -13
@@ -1,589 +1,589 @@
1
- import Konva from 'konva';
2
- import { nanoid } from 'nanoid';
3
- import { Render } from '../index';
4
- import { LinkDraw, GraphDraw, RulerDraw, PreviewDraw } from '../draws';
5
- import { AssetSettings, AssetType } from '../types';
6
- import { BezierSceneFunc } from '../utils/bezier-scene-func';
7
-
8
- // 导入导出
9
-
10
- export class ImportExportTool {
11
-
12
- private render: Render;
13
- constructor(render: Render) {
14
- this.render = render;
15
- }
16
-
17
- /**
18
- * 获得显示内容
19
- * @param withLink 是否包含线条
20
- * @returns
21
- */
22
- getView(withLink: boolean = false) {
23
- // 复制画布
24
- const copy = this.render.stage.clone();
25
- // 提取 main layer 备用
26
- const main = copy.find('#main')[0] as Konva.Layer;
27
- const cover = copy.find('#cover')[0] as Konva.Layer;
28
- // 暂时清空所有 layer
29
- const copyChildren = copy.getChildren();
30
- copy.removeChildren();
31
- if (main && cover) {
32
- // 提取节点
33
- let nodes = main.getChildren((node) => !this.render.ignore(node));
34
- // 移除多余结构
35
- for (const node of nodes) {
36
- // 如果当前被选中,listening 会是 false,需恢复
37
- node.listening(true);
38
- // 恢复 draggable(因为,绘制 Graph 的时候,不允许直接拖动其他素材)
39
- node.draggable(!this.render.config.readonly && !node.attrs.locked);
40
- for (const child of (node as Konva.Group).children) {
41
- if (this.render.ignoreSelect(child)) {
42
- child.remove();
43
- }
44
- }
45
- }
46
-
47
- if (withLink) {
48
- // 从 Link group 中提取 连接线
49
- const linkDraw = cover.children.find((o) => o.attrs.name === LinkDraw.NAME) as Konva.Group;
50
- if (linkDraw) {
51
- nodes = nodes.concat(linkDraw.children.filter((o) => o.attrs.name === 'link-line'));
52
- }
53
- }
54
-
55
- // 重新装载节点
56
- const layer = new Konva.Layer();
57
- layer.add(...nodes);
58
- nodes = layer.getChildren();
59
-
60
- for (const node of nodes) {
61
- if (node.attrs.nodeMousedownPos) {
62
- // 修正正在选中的节点透明度
63
- node.setAttrs({ opacity: copy.attrs.lastOpacity ?? 1 });
64
- }
65
- }
66
-
67
- // 重新装载 layer
68
- copy.add(layer);
69
- main.removeChildren();
70
- cover.removeChildren();
71
- }
72
-
73
- copyChildren.forEach((o) => o.destroy());
74
- // 返回可视节点和 layer
75
- return copy;
76
- }
77
-
78
- // 保存
79
- save() {
80
- const copy = this.getView();
81
- const json = copy.toJSON();
82
- copy.destroy();
83
- // 通过 stage api 导出 json
84
- return json;
85
- }
86
-
87
- // 加载 image(用于导入)
88
- loadImage(src: string) {
89
- return new Promise<HTMLImageElement | null>((resolve) => {
90
- const img = new Image();
91
- img.onload = () => {
92
- // 返回加载完成的图片 element
93
- resolve(img);
94
- };
95
- img.onerror = () => {
96
- resolve(null);
97
- };
98
- img.src = src;
99
- });
100
- }
101
-
102
- // 汇总图片组件
103
- getImgNodes(nodes: Konva.Node[] = []) {
104
- const temNodes = nodes.map(node => {
105
- if (node instanceof Konva.Group) {
106
- return this.getImgNodes(node.getChildren());
107
- } else if (node instanceof Konva.Image) {
108
- return node;
109
- }
110
- }).flat(Infinity).filter(Boolean);
111
- return temNodes;
112
- }
113
-
114
- // 恢复图片(用于导入)
115
- async restoreImage(nodes: Konva.Node[] = []) {
116
- const imgNodes = this.getImgNodes(nodes);
117
- const tasks = imgNodes.map(node => {
118
- // 处理图片
119
- if (node.attrs.svgXML) { // svg 素材
120
- return this.render.assetTool.loadSvgXML(node.attrs.svgXML);
121
- } else if (node.attrs.gif) { // gif 素材
122
- return this.render.assetTool.loadGif(node.attrs.gif);
123
- } else if (node.attrs.src) { // 其他图片素材
124
- return this.loadImage(node.attrs.src);
125
- }
126
- });
127
- Promise.all(tasks).then(res => {
128
- res.forEach((imageNode, index) => {
129
- const node = imgNodes[index];
130
- // 处理图片
131
- if (imageNode && node) {
132
- if (node.attrs.svgXML) { // svg 素材
133
- node.image(imageNode.image());
134
- } else if (node.attrs.gif) { // gif 素材
135
- node.image(imageNode.image());
136
- } else if (node.attrs.src) { // 其他图片素材
137
- node.image(imageNode);
138
- }
139
- }
140
- })
141
- });
142
- }
143
-
144
- // 恢复图形
145
- restoreGraph(nodes: Konva.Node[] = []) {
146
- for (const node of nodes) {
147
- if (node instanceof Konva.Group && node.attrs.assetType === AssetType.Graph) {
148
- if (node.attrs.graphType === "Bezier") {
149
- const graph = node.findOne('.graph');
150
- if (graph instanceof Konva.Arrow) {
151
- graph.sceneFunc(BezierSceneFunc);
152
- }
153
- }
154
- const hoverRect = node.findOne('.hoverRect');
155
- if (hoverRect instanceof Konva.Rect) {
156
- hoverRect.on('mouseenter', () => {
157
- // 防止进入调整点,重复处理
158
- if (!node.attrs.hoverAnchor) {
159
- node.setAttr('hover', true);
160
- this.render.redraw([GraphDraw.NAME]);
161
- }
162
- setTimeout(() => {
163
- // 调整产生 redraw,导致离开调整点不触发其 mouseleave(进入其他元素区域除外)
164
- // 在此静态补充"离开调整点"
165
- // 不影响正常处理(调整点会不停 hoverAnchor = true)
166
- node.setAttr('hoverAnchor', false);
167
- });
168
-
169
- // 显示 连接点
170
- this.render.linkTool.pointsVisible(true, node);
171
- });
172
- hoverRect.on('mouseleave', () => {
173
- // 延迟事件,使调整点的 mouseleave 优先
174
- setTimeout(() => {
175
- // 防止进入调整点,重复处理
176
- // 补充 2,快速调整会漏掉
177
- if (!node.attrs.hoverAnchor) {
178
- node.setAttr('hover', false);
179
- node.setAttr('hoverAnchor', false);
180
- this.render.redraw([GraphDraw.NAME]);
181
- }
182
- });
183
- // 隐藏 连接点
184
- this.render.linkTool.pointsVisible(false, node);
185
- // 隐藏 hover 框
186
- node.findOne('#hoverRect')?.visible(false);
187
- });
188
- }
189
- }
190
- }
191
- }
192
-
193
- // 恢复(导入)
194
- async restore(json: string, silent = false) {
195
- if (!Object.keys(JSON.parse(json)).length) {
196
- return;
197
- }
198
- const readonly = this.render.config.readonly;
199
- try {
200
- this.render.emit('loading', true);
201
- // 清空选择
202
- this.render.selectionTool.selectingClear();
203
- this.render.linkTool.selectingClear();
204
- // 清空 main layer 节点
205
- this.render.layer.getChildren().forEach((o) => o.destroy());
206
- this.render.layer.removeChildren();
207
- // 加载 json,提取节点
208
- const container = document.createElement('div');
209
- // 反序列化
210
- const stage = Konva.Node.create(json, container);
211
- const main = stage.getChildren()[0];
212
- const nodes = main.getChildren();
213
- // 恢复节点图片素材
214
- await this.restoreImage(nodes);
215
- await this.restoreGraph(nodes);
216
- for (const node of nodes) {
217
- // 重置旧数据节点为可 draggable
218
- node.draggable(!readonly && !node.attrs.locked);
219
- // 组件鼠标移入移出事件
220
- this.render.componentFactory.groupMouseenter({ group: node });
221
- this.render.componentFactory.groupMouseleave({ group: node });
222
- if (readonly) {
223
- this.render.componentFactory.readonlyInitComponentSetting({ node });
224
- }
225
- }
226
- this.render.layer.add(...nodes); // 插入节点
227
- // 同步页面设置
228
- this.render.stage.setAttr('pageSettings', stage.attrs.pageSettings);
229
- this.render.emit('page-settings-change', this.render.getPageSettings());
230
- // 更新背景
231
- this.render.updateBackground();
232
- // 上一步、下一步 无需更新 history 记录
233
- if (!silent) {
234
- // 更新历史
235
- this.render.updateHistory();
236
- }
237
- // 隐藏 连接点
238
- this.render.linkTool.pointsVisible(false);
239
- // 重绘
240
- this.render.redraw([
241
- GraphDraw.NAME,
242
- LinkDraw.NAME,
243
- RulerDraw.NAME,
244
- PreviewDraw.NAME
245
- ]);
246
- stage.destroy();
247
- } catch (e) {
248
- console.error(e);
249
- } finally {
250
- this.render.emit('loading', false);
251
- }
252
- }
253
-
254
- // 获取图片
255
- getImage(pixelRatio = 1, bgColor?: string) {
256
- // 在 getAssetView 的基础上,增加背景即可
257
- const copy = this.getAssetView();
258
- // 背景层
259
- const bgLayer = new Konva.Layer();
260
- // 背景矩形
261
- const bg = new Konva.Rect({ listening: false });
262
-
263
- bg.setAttrs({
264
- x: 0,
265
- y: 0,
266
- width: copy.width(),
267
- height: copy.height(),
268
- fill: bgColor ?? this.render.getPageSettings().background
269
- });
270
- // 添加背景
271
- bgLayer.add(bg);
272
- const children = copy.getChildren() as Konva.Layer[];
273
- copy.removeChildren();
274
- copy.add(bgLayer);
275
- copy.add(children[0], ...children.slice(1));
276
- const url = copy.toDataURL({ pixelRatio });
277
- copy.destroy();
278
- // 通过 stage api 导出图片
279
- return url;
280
- }
281
-
282
- // 获取元素图片
283
- getAssetImage(pixelRatio = 1, bgColor?: string) {
284
- // 获取可视节点和 layer
285
- const copy = this.getAssetView();
286
- // 背景层
287
- const bgLayer = new Konva.Layer();
288
- // 背景矩形
289
- const bg = new Konva.Rect({ listening: false });
290
- bg.setAttrs({
291
- x: -copy.x(),
292
- y: -copy.y(),
293
- width: copy.width(),
294
- height: copy.height(),
295
- fill: bgColor ?? this.render.getPageSettings().background
296
- });
297
- // 添加背景
298
- bgLayer.add(bg);
299
- // 插入背景
300
- const children = copy.getChildren();
301
- copy.removeChildren();
302
- copy.add(bgLayer);
303
- copy.add(children[0], ...children.slice(1));
304
- const url = copy.toDataURL({ pixelRatio });
305
- copy.destroy();
306
- // 通过 stage api 导出图片
307
- return url;
308
- }
309
-
310
- // blob to base64 url
311
- blobToBase64(blob: Blob, type: string): Promise<string> {
312
- return new Promise((resolve) => {
313
- const file = new File([blob], 'image', { type });
314
- const fileReader = new FileReader();
315
- fileReader.readAsDataURL(file);
316
- fileReader.onload = function () {
317
- resolve((this.result as string) ?? '');
318
- };
319
- });
320
- }
321
-
322
- // 替换 svg blob: 链接
323
- parseSvgImage(urls: string[]): Promise<string[]> {
324
- return new Promise((resolve) => {
325
- if (urls.length > 0) {
326
- Promise.all(urls.map((o) => fetch(o))).then((rs: Response[]) => {
327
- // fetch
328
- // 替换为 svg 嵌套
329
- Promise.all(rs.map((o) => o.text())).then((xmls: string[]) => {
330
- // svg xml
331
- resolve(xmls);
332
- });
333
- });
334
- } else {
335
- resolve([]);
336
- }
337
- });
338
- }
339
-
340
- // 替换其他 image 链接
341
- parseOtherImage(urls: string[]): Promise<string[]> {
342
- return new Promise((resolve) => {
343
- if (urls.length > 0) {
344
- Promise.all(urls.map((o) => fetch(o))).then((rs: Response[]) => {
345
- // fetch
346
- // 替换为 base64 url image
347
- Promise.all(rs.map((o) => o.blob())).then((bs: Blob[]) => {
348
- // blob
349
- Promise.all(bs.map((o) => this.blobToBase64(o, 'image/*'))).then((urls: string[]) => {
350
- // base64
351
- resolve(urls);
352
- });
353
- });
354
- });
355
- } else {
356
- resolve([]);
357
- }
358
- });
359
- }
360
-
361
- // 替换 image 链接
362
- parseImage(xml: string): Promise<string> {
363
- return new Promise((resolve) => {
364
- // 找出 blob:http 图片链接(目前发现只有 svg 是)
365
- const svgs = xml.match(/(?<=xlink:href=")blob:https?:\/\/[^"]+(?=")/g) ?? [];
366
- // 其他图片转为 base64
367
- const imgs = xml.match(/(?<=xlink:href=")(?<!blob:)[^"]+(?=")/g) ?? [];
368
- Promise.all([this.parseSvgImage(svgs), this.parseOtherImage(imgs)]).then(
369
- ([svgXmls, imgUrls]) => {
370
- // svg xml
371
- svgs.forEach((svg, idx) => {
372
- // 替换
373
- xml = xml.replace(
374
- new RegExp(`<image[^><]* xlink:href="${svg}"[^><]*/>`),
375
- svgXmls[idx].match(/<svg[^><]*>.*<\/svg>/)?.[0] ?? '' // 仅保留 svg 结构
376
- );
377
- });
378
- // base64
379
- imgs.forEach((img, idx) => {
380
- // 替换
381
- xml = xml.replace(`"${img}"`, `"${imgUrls[idx]}"`);
382
- });
383
- // 替换完成
384
- resolve(xml);
385
- }
386
- );
387
- });
388
- }
389
-
390
- /**
391
- * 获得显示内容(用于另存为元素)
392
- * @returns Konva.Stage
393
- */
394
- getAssetView() {
395
- const copy = this.getView(true);
396
- const children = copy.getChildren()[0].getChildren();
397
- const nodes: Konva.Stage | Konva.Layer | Konva.Group | Konva.Node[] = [...children];
398
-
399
- let minX = Infinity,
400
- maxX = -Infinity,
401
- minY = Infinity,
402
- maxY = -Infinity,
403
- minStartX = Infinity,
404
- minStartY = Infinity;
405
-
406
- const stageState = this.render.getStageState();
407
- for (const node of nodes) {
408
- if (node instanceof Konva.Group) {
409
- const { x, y, width, height } = ((rect) => ({
410
- x: this.render.toStageValue(rect.x - stageState.x),
411
- y: this.render.toStageValue(rect.y - stageState.y),
412
- width: this.render.toStageValue(rect.width),
413
- height: this.render.toStageValue(rect.height)
414
- }))(node.getClientRect());
415
- if (x < minX) {
416
- minX = x;
417
- }
418
- if (x + width > maxX) {
419
- maxX = x + width;
420
- }
421
- if (y < minY) {
422
- minY = y;
423
- }
424
- if (y + height > maxY) {
425
- maxY = y + height;
426
- }
427
- if (x < minStartX) {
428
- minStartX = x;
429
- }
430
- if (y < minStartY) {
431
- minStartY = y;
432
- }
433
-
434
- // 移除辅助元素
435
- if (node instanceof Konva.Group) {
436
- const clickMask = node.findOne('#click-mask');
437
- if (clickMask) {
438
- clickMask.destroy();
439
- }
440
- }
441
- } else if (node instanceof Konva.Line && node.name() === 'link-line') {
442
- // 连线占用空间
443
- const points = node.points();
444
- for (let i = 0; i < points.length; i += 2) {
445
- const [x, y] = [points[i], points[i + 1]];
446
- if (x < minX) {
447
- minX = x - 1;
448
- }
449
- if (x > maxX) {
450
- maxX = x + 1;
451
- }
452
- if (y < minY) {
453
- minY = y - 1;
454
- }
455
- if (y > maxY) {
456
- maxY = y + 1;
457
- }
458
- if (x < minStartX) {
459
- minStartX = x - 1;
460
- }
461
- if (y < minStartY) {
462
- minStartY = y - 1;
463
- }
464
- }
465
- }
466
- }
467
-
468
- for (const node of nodes) {
469
- if (node instanceof Konva.Group) {
470
- node.x(node.x() - minStartX);
471
- node.y(node.y() - minStartY);
472
- } else if (node instanceof Konva.Line && node.name() === 'link-line') {
473
- const points = node.points();
474
- for (let i = 0; i < points.length; i += 2) {
475
- points[i] = points[i] - minStartX;
476
- points[i + 1] = points[i + 1] - minStartY;
477
- }
478
- node.points(points);
479
- }
480
- }
481
-
482
- copy.x(0);
483
- copy.y(0);
484
- copy.width(maxX - minX);
485
- copy.height(maxY - minY);
486
- copy.scale({ x: 1, y: 1 });
487
- return copy;
488
- }
489
-
490
- /**
491
- * 获得元素(用于另存为元素)
492
- * @returns Konva.Stage
493
- */
494
- getAsset() {
495
- const copy = this.getAssetView();
496
- // 添加背景
497
- const background = this.render.getBackground();
498
- background.width(copy.width());
499
- background.height(copy.height());
500
- copy.children[0].add(background);
501
- background.moveToBottom();
502
- const json = copy.toJSON();
503
- const obj = JSON.parse(json);
504
- const assets = obj.children[0].children;
505
-
506
- for (const asset of assets) {
507
- if (asset.attrs.name === 'asset') {
508
- asset.attrs.name = 'sub-asset';
509
- }
510
- if (asset.attrs.selected) {
511
- asset.attrs.selected = false;
512
- }
513
- }
514
-
515
- this.render.linkTool.jsonIdCover(assets);
516
-
517
- // 通过 stage api 导出 json
518
- const result = JSON.stringify({
519
- ...obj.children[0],
520
- className: 'Group',
521
- attrs: {
522
- width: copy.width(),
523
- height: copy.height(),
524
- x: 0,
525
- y: 0
526
- }
527
- });
528
-
529
- copy.destroy();
530
- return result;
531
- }
532
-
533
- /**
534
- * 添加文字素材
535
- * @param pos 落点位置
536
- * @param settings 设置项
537
- * @returns
538
- */
539
- addTextAsset(pos: Konva.Vector2d, settings?: Partial<AssetSettings>) {
540
- // 获取页面默认设置
541
- const pageSettings = this.render.getPageSettings();
542
-
543
- // 合并设置
544
- const assetSettings: AssetSettings = {
545
- stroke: "#000000",
546
- strokeWidth: 1,
547
- fill: "#000000",
548
- arrowStart: false,
549
- arrowEnd: false,
550
- fontSize: pageSettings.fontSize,
551
- textFill: pageSettings.textFill,
552
- text: 'Text',
553
- x: pos.x,
554
- y: pos.y,
555
- rotation: 0,
556
- tension: 0.5,
557
- ...settings
558
- };
559
-
560
- const group = new Konva.Group({
561
- id: nanoid(),
562
- name: 'asset',
563
- assetType: AssetType.Text,
564
- draggable: true,
565
- position: { x: pos.x, y: pos.y }
566
- });
567
-
568
- group.setAttr('assetSettings', assetSettings);
569
-
570
- const text = new Konva.Text({
571
- text: assetSettings.text,
572
- fill: assetSettings.textFill,
573
- fontSize: assetSettings.fontSize,
574
- draggable: false,
575
- name: 'text-node'
576
- });
577
-
578
- const bg = new Konva.Rect({
579
- width: text.width(),
580
- height: text.height()
581
- });
582
-
583
- group.add(text);
584
- group.add(bg);
585
- this.render.layer.add(group);
586
- this.render.layer.draw();
587
- return group;
588
- }
1
+ import Konva from 'konva';
2
+ import { nanoid } from 'nanoid';
3
+ import { Render } from '../index';
4
+ import { LinkDraw, GraphDraw, RulerDraw, PreviewDraw } from '../draws';
5
+ import { AssetSettings, AssetType } from '../types';
6
+ import { BezierSceneFunc } from '../utils/bezier-scene-func';
7
+
8
+ // 导入导出
9
+
10
+ export class ImportExportTool {
11
+
12
+ private render: Render;
13
+ constructor(render: Render) {
14
+ this.render = render;
15
+ }
16
+
17
+ /**
18
+ * 获得显示内容
19
+ * @param withLink 是否包含线条
20
+ * @returns
21
+ */
22
+ getView(withLink: boolean = false) {
23
+ // 复制画布
24
+ const copy = this.render.stage.clone();
25
+ // 提取 main layer 备用
26
+ const main = copy.find('#main')[0] as Konva.Layer;
27
+ const cover = copy.find('#cover')[0] as Konva.Layer;
28
+ // 暂时清空所有 layer
29
+ const copyChildren = copy.getChildren();
30
+ copy.removeChildren();
31
+ if (main && cover) {
32
+ // 提取节点
33
+ let nodes = main.getChildren((node) => !this.render.ignore(node));
34
+ // 移除多余结构
35
+ for (const node of nodes) {
36
+ // 如果当前被选中,listening 会是 false,需恢复
37
+ node.listening(true);
38
+ // 恢复 draggable(因为,绘制 Graph 的时候,不允许直接拖动其他素材)
39
+ node.draggable(!this.render.config.readonly && !node.attrs.locked);
40
+ for (const child of (node as Konva.Group).children) {
41
+ if (this.render.ignoreSelect(child)) {
42
+ child.remove();
43
+ }
44
+ }
45
+ }
46
+
47
+ if (withLink) {
48
+ // 从 Link group 中提取 连接线
49
+ const linkDraw = cover.children.find((o) => o.attrs.name === LinkDraw.NAME) as Konva.Group;
50
+ if (linkDraw) {
51
+ nodes = nodes.concat(linkDraw.children.filter((o) => o.attrs.name === 'link-line'));
52
+ }
53
+ }
54
+
55
+ // 重新装载节点
56
+ const layer = new Konva.Layer();
57
+ layer.add(...nodes);
58
+ nodes = layer.getChildren();
59
+
60
+ for (const node of nodes) {
61
+ if (node.attrs.nodeMousedownPos) {
62
+ // 修正正在选中的节点透明度
63
+ node.setAttrs({ opacity: copy.attrs.lastOpacity ?? 1 });
64
+ }
65
+ }
66
+
67
+ // 重新装载 layer
68
+ copy.add(layer);
69
+ main.removeChildren();
70
+ cover.removeChildren();
71
+ }
72
+
73
+ copyChildren.forEach((o) => o.destroy());
74
+ // 返回可视节点和 layer
75
+ return copy;
76
+ }
77
+
78
+ // 保存
79
+ save() {
80
+ const copy = this.getView();
81
+ const json = copy.toJSON();
82
+ copy.destroy();
83
+ // 通过 stage api 导出 json
84
+ return json;
85
+ }
86
+
87
+ // 加载 image(用于导入)
88
+ loadImage(src: string) {
89
+ return new Promise<HTMLImageElement | null>((resolve) => {
90
+ const img = new Image();
91
+ img.onload = () => {
92
+ // 返回加载完成的图片 element
93
+ resolve(img);
94
+ };
95
+ img.onerror = () => {
96
+ resolve(null);
97
+ };
98
+ img.src = src;
99
+ });
100
+ }
101
+
102
+ // 汇总图片组件
103
+ getImgNodes(nodes: Konva.Node[] = []) {
104
+ const temNodes = nodes.map(node => {
105
+ if (node instanceof Konva.Group) {
106
+ return this.getImgNodes(node.getChildren());
107
+ } else if (node instanceof Konva.Image) {
108
+ return node;
109
+ }
110
+ }).flat(Infinity).filter(Boolean);
111
+ return temNodes;
112
+ }
113
+
114
+ // 恢复图片(用于导入)
115
+ async restoreImage(nodes: Konva.Node[] = []) {
116
+ const imgNodes = this.getImgNodes(nodes);
117
+ const tasks = imgNodes.map(node => {
118
+ // 处理图片
119
+ if (node.attrs.svgXML) { // svg 素材
120
+ return this.render.assetTool.loadSvgXML(node.attrs.svgXML);
121
+ } else if (node.attrs.gif) { // gif 素材
122
+ return this.render.assetTool.loadGif(node.attrs.gif);
123
+ } else if (node.attrs.src) { // 其他图片素材
124
+ return this.loadImage(node.attrs.src);
125
+ }
126
+ });
127
+ Promise.all(tasks).then(res => {
128
+ res.forEach((imageNode, index) => {
129
+ const node = imgNodes[index];
130
+ // 处理图片
131
+ if (imageNode && node) {
132
+ if (node.attrs.svgXML) { // svg 素材
133
+ node.image(imageNode.image());
134
+ } else if (node.attrs.gif) { // gif 素材
135
+ node.image(imageNode.image());
136
+ } else if (node.attrs.src) { // 其他图片素材
137
+ node.image(imageNode);
138
+ }
139
+ }
140
+ })
141
+ });
142
+ }
143
+
144
+ // 恢复图形
145
+ restoreGraph(nodes: Konva.Node[] = []) {
146
+ for (const node of nodes) {
147
+ if (node instanceof Konva.Group && node.attrs.assetType === AssetType.Graph) {
148
+ if (node.attrs.graphType === "Bezier") {
149
+ const graph = node.findOne('.graph');
150
+ if (graph instanceof Konva.Arrow) {
151
+ graph.sceneFunc(BezierSceneFunc);
152
+ }
153
+ }
154
+ const hoverRect = node.findOne('.hoverRect');
155
+ if (hoverRect instanceof Konva.Rect) {
156
+ hoverRect.on('mouseenter', () => {
157
+ // 防止进入调整点,重复处理
158
+ if (!node.attrs.hoverAnchor) {
159
+ node.setAttr('hover', true);
160
+ this.render.redraw([GraphDraw.NAME]);
161
+ }
162
+ setTimeout(() => {
163
+ // 调整产生 redraw,导致离开调整点不触发其 mouseleave(进入其他元素区域除外)
164
+ // 在此静态补充"离开调整点"
165
+ // 不影响正常处理(调整点会不停 hoverAnchor = true)
166
+ node.setAttr('hoverAnchor', false);
167
+ });
168
+
169
+ // 显示 连接点
170
+ this.render.linkTool.pointsVisible(true, node);
171
+ });
172
+ hoverRect.on('mouseleave', () => {
173
+ // 延迟事件,使调整点的 mouseleave 优先
174
+ setTimeout(() => {
175
+ // 防止进入调整点,重复处理
176
+ // 补充 2,快速调整会漏掉
177
+ if (!node.attrs.hoverAnchor) {
178
+ node.setAttr('hover', false);
179
+ node.setAttr('hoverAnchor', false);
180
+ this.render.redraw([GraphDraw.NAME]);
181
+ }
182
+ });
183
+ // 隐藏 连接点
184
+ this.render.linkTool.pointsVisible(false, node);
185
+ // 隐藏 hover 框
186
+ node.findOne('#hoverRect')?.visible(false);
187
+ });
188
+ }
189
+ }
190
+ }
191
+ }
192
+
193
+ // 恢复(导入)
194
+ async restore(json: string, silent = false) {
195
+ if (!Object.keys(JSON.parse(json)).length) {
196
+ return;
197
+ }
198
+ const readonly = this.render.config.readonly;
199
+ try {
200
+ this.render.emit('loading', true);
201
+ // 清空选择
202
+ this.render.selectionTool.selectingClear();
203
+ this.render.linkTool.selectingClear();
204
+ // 清空 main layer 节点
205
+ this.render.layer.getChildren().forEach((o) => o.destroy());
206
+ this.render.layer.removeChildren();
207
+ // 加载 json,提取节点
208
+ const container = document.createElement('div');
209
+ // 反序列化
210
+ const stage = Konva.Node.create(json, container);
211
+ const main = stage.getChildren()[0];
212
+ const nodes = main.getChildren();
213
+ // 恢复节点图片素材
214
+ await this.restoreImage(nodes);
215
+ await this.restoreGraph(nodes);
216
+ for (const node of nodes) {
217
+ // 重置旧数据节点为可 draggable
218
+ node.draggable(!readonly && !node.attrs.locked);
219
+ // 组件鼠标移入移出事件
220
+ this.render.componentFactory.groupMouseenter({ group: node });
221
+ this.render.componentFactory.groupMouseleave({ group: node });
222
+ if (readonly) {
223
+ this.render.componentFactory.readonlyInitComponentSetting({ node });
224
+ }
225
+ }
226
+ this.render.layer.add(...nodes); // 插入节点
227
+ // 同步页面设置
228
+ this.render.stage.setAttr('pageSettings', stage.attrs.pageSettings);
229
+ this.render.emit('page-settings-change', this.render.getPageSettings());
230
+ // 更新背景
231
+ this.render.updateBackground();
232
+ // 上一步、下一步 无需更新 history 记录
233
+ if (!silent) {
234
+ // 更新历史
235
+ this.render.updateHistory();
236
+ }
237
+ // 隐藏 连接点
238
+ this.render.linkTool.pointsVisible(false);
239
+ // 重绘
240
+ this.render.redraw([
241
+ GraphDraw.NAME,
242
+ LinkDraw.NAME,
243
+ RulerDraw.NAME,
244
+ PreviewDraw.NAME
245
+ ]);
246
+ stage.destroy();
247
+ } catch (e) {
248
+ console.error(e);
249
+ } finally {
250
+ this.render.emit('loading', false);
251
+ }
252
+ }
253
+
254
+ // 获取图片
255
+ getImage(pixelRatio = 1, bgColor?: string) {
256
+ // 在 getAssetView 的基础上,增加背景即可
257
+ const copy = this.getAssetView();
258
+ // 背景层
259
+ const bgLayer = new Konva.Layer();
260
+ // 背景矩形
261
+ const bg = new Konva.Rect({ listening: false });
262
+
263
+ bg.setAttrs({
264
+ x: 0,
265
+ y: 0,
266
+ width: copy.width(),
267
+ height: copy.height(),
268
+ fill: bgColor ?? this.render.getPageSettings().background
269
+ });
270
+ // 添加背景
271
+ bgLayer.add(bg);
272
+ const children = copy.getChildren() as Konva.Layer[];
273
+ copy.removeChildren();
274
+ copy.add(bgLayer);
275
+ copy.add(children[0], ...children.slice(1));
276
+ const url = copy.toDataURL({ pixelRatio });
277
+ copy.destroy();
278
+ // 通过 stage api 导出图片
279
+ return url;
280
+ }
281
+
282
+ // 获取元素图片
283
+ getAssetImage(pixelRatio = 1, bgColor?: string) {
284
+ // 获取可视节点和 layer
285
+ const copy = this.getAssetView();
286
+ // 背景层
287
+ const bgLayer = new Konva.Layer();
288
+ // 背景矩形
289
+ const bg = new Konva.Rect({ listening: false });
290
+ bg.setAttrs({
291
+ x: -copy.x(),
292
+ y: -copy.y(),
293
+ width: copy.width(),
294
+ height: copy.height(),
295
+ fill: bgColor ?? this.render.getPageSettings().background
296
+ });
297
+ // 添加背景
298
+ bgLayer.add(bg);
299
+ // 插入背景
300
+ const children = copy.getChildren();
301
+ copy.removeChildren();
302
+ copy.add(bgLayer);
303
+ copy.add(children[0], ...children.slice(1));
304
+ const url = copy.toDataURL({ pixelRatio });
305
+ copy.destroy();
306
+ // 通过 stage api 导出图片
307
+ return url;
308
+ }
309
+
310
+ // blob to base64 url
311
+ blobToBase64(blob: Blob, type: string): Promise<string> {
312
+ return new Promise((resolve) => {
313
+ const file = new File([blob], 'image', { type });
314
+ const fileReader = new FileReader();
315
+ fileReader.readAsDataURL(file);
316
+ fileReader.onload = function () {
317
+ resolve((this.result as string) ?? '');
318
+ };
319
+ });
320
+ }
321
+
322
+ // 替换 svg blob: 链接
323
+ parseSvgImage(urls: string[]): Promise<string[]> {
324
+ return new Promise((resolve) => {
325
+ if (urls.length > 0) {
326
+ Promise.all(urls.map((o) => fetch(o))).then((rs: Response[]) => {
327
+ // fetch
328
+ // 替换为 svg 嵌套
329
+ Promise.all(rs.map((o) => o.text())).then((xmls: string[]) => {
330
+ // svg xml
331
+ resolve(xmls);
332
+ });
333
+ });
334
+ } else {
335
+ resolve([]);
336
+ }
337
+ });
338
+ }
339
+
340
+ // 替换其他 image 链接
341
+ parseOtherImage(urls: string[]): Promise<string[]> {
342
+ return new Promise((resolve) => {
343
+ if (urls.length > 0) {
344
+ Promise.all(urls.map((o) => fetch(o))).then((rs: Response[]) => {
345
+ // fetch
346
+ // 替换为 base64 url image
347
+ Promise.all(rs.map((o) => o.blob())).then((bs: Blob[]) => {
348
+ // blob
349
+ Promise.all(bs.map((o) => this.blobToBase64(o, 'image/*'))).then((urls: string[]) => {
350
+ // base64
351
+ resolve(urls);
352
+ });
353
+ });
354
+ });
355
+ } else {
356
+ resolve([]);
357
+ }
358
+ });
359
+ }
360
+
361
+ // 替换 image 链接
362
+ parseImage(xml: string): Promise<string> {
363
+ return new Promise((resolve) => {
364
+ // 找出 blob:http 图片链接(目前发现只有 svg 是)
365
+ const svgs = xml.match(/(?<=xlink:href=")blob:https?:\/\/[^"]+(?=")/g) ?? [];
366
+ // 其他图片转为 base64
367
+ const imgs = xml.match(/(?<=xlink:href=")(?<!blob:)[^"]+(?=")/g) ?? [];
368
+ Promise.all([this.parseSvgImage(svgs), this.parseOtherImage(imgs)]).then(
369
+ ([svgXmls, imgUrls]) => {
370
+ // svg xml
371
+ svgs.forEach((svg, idx) => {
372
+ // 替换
373
+ xml = xml.replace(
374
+ new RegExp(`<image[^><]* xlink:href="${svg}"[^><]*/>`),
375
+ svgXmls[idx].match(/<svg[^><]*>.*<\/svg>/)?.[0] ?? '' // 仅保留 svg 结构
376
+ );
377
+ });
378
+ // base64
379
+ imgs.forEach((img, idx) => {
380
+ // 替换
381
+ xml = xml.replace(`"${img}"`, `"${imgUrls[idx]}"`);
382
+ });
383
+ // 替换完成
384
+ resolve(xml);
385
+ }
386
+ );
387
+ });
388
+ }
389
+
390
+ /**
391
+ * 获得显示内容(用于另存为元素)
392
+ * @returns Konva.Stage
393
+ */
394
+ getAssetView() {
395
+ const copy = this.getView(true);
396
+ const children = copy.getChildren()[0].getChildren();
397
+ const nodes: Konva.Stage | Konva.Layer | Konva.Group | Konva.Node[] = [...children];
398
+
399
+ let minX = Infinity,
400
+ maxX = -Infinity,
401
+ minY = Infinity,
402
+ maxY = -Infinity,
403
+ minStartX = Infinity,
404
+ minStartY = Infinity;
405
+
406
+ const stageState = this.render.getStageState();
407
+ for (const node of nodes) {
408
+ if (node instanceof Konva.Group) {
409
+ const { x, y, width, height } = ((rect) => ({
410
+ x: this.render.toStageValue(rect.x - stageState.x),
411
+ y: this.render.toStageValue(rect.y - stageState.y),
412
+ width: this.render.toStageValue(rect.width),
413
+ height: this.render.toStageValue(rect.height)
414
+ }))(node.getClientRect());
415
+ if (x < minX) {
416
+ minX = x;
417
+ }
418
+ if (x + width > maxX) {
419
+ maxX = x + width;
420
+ }
421
+ if (y < minY) {
422
+ minY = y;
423
+ }
424
+ if (y + height > maxY) {
425
+ maxY = y + height;
426
+ }
427
+ if (x < minStartX) {
428
+ minStartX = x;
429
+ }
430
+ if (y < minStartY) {
431
+ minStartY = y;
432
+ }
433
+
434
+ // 移除辅助元素
435
+ if (node instanceof Konva.Group) {
436
+ const clickMask = node.findOne('#click-mask');
437
+ if (clickMask) {
438
+ clickMask.destroy();
439
+ }
440
+ }
441
+ } else if (node instanceof Konva.Line && node.name() === 'link-line') {
442
+ // 连线占用空间
443
+ const points = node.points();
444
+ for (let i = 0; i < points.length; i += 2) {
445
+ const [x, y] = [points[i], points[i + 1]];
446
+ if (x < minX) {
447
+ minX = x - 1;
448
+ }
449
+ if (x > maxX) {
450
+ maxX = x + 1;
451
+ }
452
+ if (y < minY) {
453
+ minY = y - 1;
454
+ }
455
+ if (y > maxY) {
456
+ maxY = y + 1;
457
+ }
458
+ if (x < minStartX) {
459
+ minStartX = x - 1;
460
+ }
461
+ if (y < minStartY) {
462
+ minStartY = y - 1;
463
+ }
464
+ }
465
+ }
466
+ }
467
+
468
+ for (const node of nodes) {
469
+ if (node instanceof Konva.Group) {
470
+ node.x(node.x() - minStartX);
471
+ node.y(node.y() - minStartY);
472
+ } else if (node instanceof Konva.Line && node.name() === 'link-line') {
473
+ const points = node.points();
474
+ for (let i = 0; i < points.length; i += 2) {
475
+ points[i] = points[i] - minStartX;
476
+ points[i + 1] = points[i + 1] - minStartY;
477
+ }
478
+ node.points(points);
479
+ }
480
+ }
481
+
482
+ copy.x(0);
483
+ copy.y(0);
484
+ copy.width(maxX - minX);
485
+ copy.height(maxY - minY);
486
+ copy.scale({ x: 1, y: 1 });
487
+ return copy;
488
+ }
489
+
490
+ /**
491
+ * 获得元素(用于另存为元素)
492
+ * @returns Konva.Stage
493
+ */
494
+ getAsset() {
495
+ const copy = this.getAssetView();
496
+ // 添加背景
497
+ const background = this.render.getBackground();
498
+ background.width(copy.width());
499
+ background.height(copy.height());
500
+ copy.children[0].add(background);
501
+ background.moveToBottom();
502
+ const json = copy.toJSON();
503
+ const obj = JSON.parse(json);
504
+ const assets = obj.children[0].children;
505
+
506
+ for (const asset of assets) {
507
+ if (asset.attrs.name === 'asset') {
508
+ asset.attrs.name = 'sub-asset';
509
+ }
510
+ if (asset.attrs.selected) {
511
+ asset.attrs.selected = false;
512
+ }
513
+ }
514
+
515
+ this.render.linkTool.jsonIdCover(assets);
516
+
517
+ // 通过 stage api 导出 json
518
+ const result = JSON.stringify({
519
+ ...obj.children[0],
520
+ className: 'Group',
521
+ attrs: {
522
+ width: copy.width(),
523
+ height: copy.height(),
524
+ x: 0,
525
+ y: 0
526
+ }
527
+ });
528
+
529
+ copy.destroy();
530
+ return result;
531
+ }
532
+
533
+ /**
534
+ * 添加文字素材
535
+ * @param pos 落点位置
536
+ * @param settings 设置项
537
+ * @returns
538
+ */
539
+ addTextAsset(pos: Konva.Vector2d, settings?: Partial<AssetSettings>) {
540
+ // 获取页面默认设置
541
+ const pageSettings = this.render.getPageSettings();
542
+
543
+ // 合并设置
544
+ const assetSettings: AssetSettings = {
545
+ stroke: "#000000",
546
+ strokeWidth: 1,
547
+ fill: "#000000",
548
+ arrowStart: false,
549
+ arrowEnd: false,
550
+ fontSize: pageSettings.fontSize,
551
+ textFill: pageSettings.textFill,
552
+ text: 'Text',
553
+ x: pos.x,
554
+ y: pos.y,
555
+ rotation: 0,
556
+ tension: 0.5,
557
+ ...settings
558
+ };
559
+
560
+ const group = new Konva.Group({
561
+ id: nanoid(),
562
+ name: 'asset',
563
+ assetType: AssetType.Text,
564
+ draggable: true,
565
+ position: { x: pos.x, y: pos.y }
566
+ });
567
+
568
+ group.setAttr('assetSettings', assetSettings);
569
+
570
+ const text = new Konva.Text({
571
+ text: assetSettings.text,
572
+ fill: assetSettings.textFill,
573
+ fontSize: assetSettings.fontSize,
574
+ draggable: false,
575
+ name: 'text-node'
576
+ });
577
+
578
+ const bg = new Konva.Rect({
579
+ width: text.width(),
580
+ height: text.height()
581
+ });
582
+
583
+ group.add(text);
584
+ group.add(bg);
585
+ this.render.layer.add(group);
586
+ this.render.layer.draw();
587
+ return group;
588
+ }
589
589
  }