aldehyde 0.2.495 → 0.2.496

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 (578) 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.js +1 -1
  18. package/lib/controls/file-view/index.js.map +1 -1
  19. package/lib/controls/file-view/index.less +9 -9
  20. package/lib/controls/html-editor/index.less +67 -67
  21. package/lib/controls/icon-selector/icon/aldehyde-menu-icon/iconfont.css +147 -147
  22. package/lib/controls/password-setter/index.css +2 -2
  23. package/lib/controls/password-setter/index.d.ts.map +1 -1
  24. package/lib/controls/qr-code/index.less +28 -28
  25. package/lib/controls/relation-existion/index.css +3 -3
  26. package/lib/controls/relation-existion/index.d.ts.map +1 -1
  27. package/lib/controls/rfield/index.css +4 -4
  28. package/lib/controls/rfield/index.d.ts.map +1 -1
  29. package/lib/controls/select/index.d.ts.map +1 -1
  30. package/lib/controls/signature/index.d.ts.map +1 -1
  31. package/lib/controls/text/ellipsis-text.d.ts.map +1 -1
  32. package/lib/controls/text/index.less +7 -7
  33. package/lib/controls/upload/index.d.ts.map +1 -1
  34. package/lib/controls/upload/mult-file-upload.d.ts.map +1 -1
  35. package/lib/custom-page/dtmpl-custom-edit-modal-page.d.ts.map +1 -1
  36. package/lib/detail/button/bottom-submit-button-bar.d.ts.map +1 -1
  37. package/lib/detail/button/cquery-button-bar.d.ts.map +1 -1
  38. package/lib/detail/button/fix-right-submit-button-bar.d.ts.map +1 -1
  39. package/lib/detail/button/index.css +42 -42
  40. package/lib/detail/dtmpl.css +72 -72
  41. package/lib/detail/edit/fields-edit-card.d.ts.map +1 -1
  42. package/lib/detail/edit/modal-row-edit.d.ts.map +1 -1
  43. package/lib/detail/edit/popover-edit-card.d.ts.map +1 -1
  44. package/lib/detail/rightbar/index.css +34 -34
  45. package/lib/detail/rightbar/index.d.ts.map +1 -1
  46. package/lib/detail/view/act-dtmpl-view.d.ts.map +1 -1
  47. package/lib/detail/view/field-view-group.d.ts.map +1 -1
  48. package/lib/detail/view/modal-dtmpl-view.d.ts.map +1 -1
  49. package/lib/detail/view/snapshot-timeline.d.ts.map +1 -1
  50. package/lib/detail/view/tab-act-dtmpl-view.d.ts.map +1 -1
  51. package/lib/draw-canvas-edit/components/render/components/index.less +60 -60
  52. package/lib/draw-canvas-edit/components/render/components/workstation-component.js +6 -6
  53. package/lib/draw-canvas-edit/index.less +48 -48
  54. package/lib/draw-canvas-view/index.less +66 -66
  55. package/lib/export/export-frame.css +2 -2
  56. package/lib/export/export-frame.d.ts.map +1 -1
  57. package/lib/export/select-code-export-frame.d.ts.map +1 -1
  58. package/lib/form/dtmpl-form.css +3 -3
  59. package/lib/form/dtmpl-form.d.ts.map +1 -1
  60. package/lib/form/field-group-form.d.ts.map +1 -1
  61. package/lib/form/form-Item-group.d.ts.map +1 -1
  62. package/lib/form/index.css +12 -12
  63. package/lib/import/excel-import.d.ts.map +1 -1
  64. package/lib/import/index.css +53 -53
  65. package/lib/import/template.css +50 -50
  66. package/lib/layout/common.css +64 -64
  67. package/lib/layout/coverstyle.css +51 -51
  68. package/lib/layout/footer/index.css +5 -5
  69. package/lib/layout/header/index.css +122 -122
  70. package/lib/layout/menu/block.css +7 -7
  71. package/lib/layout/menu/block.d.ts.map +1 -1
  72. package/lib/layout/menu/l2menu-quick-bar.d.ts.map +1 -1
  73. package/lib/layout/menu/menu-2layers.d.ts.map +1 -1
  74. package/lib/layout/menu/message-bar.less +73 -73
  75. package/lib/layout/menu/reset-password.d.ts.map +1 -1
  76. package/lib/layout/menu/user-bar.d.ts.map +1 -1
  77. package/lib/layout/menu/userinfo-bar.d.ts.map +1 -1
  78. package/lib/layout/sidebar/index.css +57 -57
  79. package/lib/layout2/css/header.css +41 -41
  80. package/lib/layout2/css/sider.less +17 -17
  81. package/lib/layout2/css/tabs-layout.less +18 -18
  82. package/lib/layout3/css/header.less +195 -195
  83. package/lib/layout3/css/main.less +161 -161
  84. package/lib/layout3/css/sider.less +32 -32
  85. package/lib/layout3/css/tabs-layout.less +38 -38
  86. package/lib/layout4/css/header.less +196 -196
  87. package/lib/layout4/css/main.less +154 -154
  88. package/lib/layout4/css/sider.less +37 -37
  89. package/lib/layout4/css/tabs-layout.less +42 -42
  90. package/lib/layout5/css/header.less +35 -35
  91. package/lib/layout5/css/sider.less +18 -18
  92. package/lib/list/calendar/index.less +20 -20
  93. package/lib/list/card-list/index.less +154 -154
  94. package/lib/list/gantt/index.less +8 -8
  95. package/lib/list/vertical-list/index.less +208 -208
  96. package/lib/login/index.css +19 -19
  97. package/lib/login/login.d.ts.map +1 -1
  98. package/lib/login/vertify/index.css +143 -143
  99. package/lib/login3/index.less +136 -136
  100. package/lib/lowcode-components/act-table/index.less +26 -26
  101. package/lib/lowcode-components/base-button/index.less +7 -7
  102. package/lib/lowcode-components/base-map/index.js +6 -6
  103. package/lib/lowcode-components/base-radio/index.less +23 -23
  104. package/lib/lowcode-components/base-tabs/index.less +14 -14
  105. package/lib/lowcode-components/border/border10/index.less +26 -26
  106. package/lib/lowcode-components/border/border11/index.js +46 -46
  107. package/lib/lowcode-components/border/border11/index.less +17 -17
  108. package/lib/lowcode-components/border/border12/index.js +13 -13
  109. package/lib/lowcode-components/border/border12/index.less +13 -13
  110. package/lib/lowcode-components/border/border13/index.js +5 -5
  111. package/lib/lowcode-components/border/border13/index.less +13 -13
  112. package/lib/lowcode-components/border/border2/index.less +17 -17
  113. package/lib/lowcode-components/border/border3/index.less +25 -25
  114. package/lib/lowcode-components/border/border4/index.js +2 -2
  115. package/lib/lowcode-components/border/border4/index.less +72 -72
  116. package/lib/lowcode-components/border/border5/index.js +2 -2
  117. package/lib/lowcode-components/border/border5/index.less +35 -35
  118. package/lib/lowcode-components/border/border6/index.less +17 -17
  119. package/lib/lowcode-components/border/border7/index.less +26 -26
  120. package/lib/lowcode-components/border/border8/index.less +13 -13
  121. package/lib/lowcode-components/border/border9/index.js +14 -14
  122. package/lib/lowcode-components/border/border9/index.less +13 -13
  123. package/lib/lowcode-components/decoration/decoration1/index.less +7 -7
  124. package/lib/lowcode-components/decoration/decoration10/index.js +3 -3
  125. package/lib/lowcode-components/decoration/decoration10/index.less +5 -5
  126. package/lib/lowcode-components/decoration/decoration11/index.less +5 -5
  127. package/lib/lowcode-components/decoration/decoration2/index.less +6 -6
  128. package/lib/lowcode-components/decoration/decoration3/index.less +7 -7
  129. package/lib/lowcode-components/decoration/decoration4/index.less +29 -29
  130. package/lib/lowcode-components/decoration/decoration5/index.less +3 -3
  131. package/lib/lowcode-components/decoration/decoration6/index.less +7 -7
  132. package/lib/lowcode-components/decoration/decoration7/index.less +4 -4
  133. package/lib/lowcode-components/decoration/decoration8/index.less +14 -14
  134. package/lib/lowcode-components/decoration/decoration9/index.less +4 -4
  135. package/lib/lowcode-components/effectScatter-map/index.js +6 -6
  136. package/lib/lowcode-components/effectScatter-map-3d/index.js +6 -6
  137. package/lib/lowcode-components/lowcode-view/index.less +19 -19
  138. package/lib/lowcode-components/search-form/index.less +25 -25
  139. package/lib/module/dtmpl-edit-card.d.ts.map +1 -1
  140. package/lib/module/dtmpl-edit-page.d.ts.map +1 -1
  141. package/lib/module/index.less +4 -4
  142. package/lib/module/ltmpl-modal.d.ts.map +1 -1
  143. package/lib/module/ltmpl-table.d.ts.map +1 -1
  144. package/lib/routable/index.less +25 -25
  145. package/lib/table/act-table.d.ts.map +1 -1
  146. package/lib/table/column/index.less +85 -85
  147. package/lib/table/index.css +211 -211
  148. package/lib/table/modal-select-table.d.ts.map +1 -1
  149. package/lib/table/page-chart.less +9 -9
  150. package/lib/table/pagination.css +14 -14
  151. package/lib/table/pagination.d.ts.map +1 -1
  152. package/lib/table/relation-table.d.ts.map +1 -1
  153. package/lib/table/selected-rows-card.d.ts.map +1 -1
  154. package/lib/table/stat/restat.d.ts.map +1 -1
  155. package/lib/tmpl/hcservice-v3.d.ts +1 -1
  156. package/lib/tmpl/hcservice-v3.d.ts.map +1 -1
  157. package/lib/tmpl/hcservice-v3.js +3 -3
  158. package/lib/tmpl/hcservice-v3.js.map +1 -1
  159. package/lib/tree/act-tree.d.ts.map +1 -1
  160. package/lib/tree/block-menu-auth-tree.d.ts.map +1 -1
  161. package/lib/tree/index.css +22 -22
  162. package/lib/tree/tmpl-tree.d.ts.map +1 -1
  163. package/lib/welcome/components/menu-card.less +96 -96
  164. package/lib/welcome/components/page-card.less +49 -49
  165. package/lib/welcome/components/quick-entrance.less +120 -120
  166. package/lib/welcome/components/user-menus.less +192 -192
  167. package/lib/welcome/components/workbench.less +118 -118
  168. package/lib/welcome/index.css +13 -13
  169. package/package.json +224 -224
  170. package/src/aldehyde/controls/2dEditor/2dEditor/index.less +5 -5
  171. package/src/aldehyde/controls/2dEditor/2dEditor/index.tsx +270 -270
  172. package/src/aldehyde/controls/2dEditor/2dView/index.less +8 -8
  173. package/src/aldehyde/controls/2dEditor/2dView/index.tsx +110 -110
  174. package/src/aldehyde/controls/2dEditor/components/card.tsx +256 -256
  175. package/src/aldehyde/controls/2dEditor/components/component.less +83 -83
  176. package/src/aldehyde/controls/2dEditor/components/data.d.ts +32 -32
  177. package/src/aldehyde/controls/2dEditor/components/hotspot.tsx +80 -80
  178. package/src/aldehyde/controls/2dEditor/components/html-box.tsx +101 -101
  179. package/src/aldehyde/controls/2dEditor/components/image.tsx +99 -99
  180. package/src/aldehyde/controls/2dEditor/components/line.tsx +73 -73
  181. package/src/aldehyde/controls/action/index.css +8 -8
  182. package/src/aldehyde/controls/action/index.tsx +406 -406
  183. package/src/aldehyde/controls/action/utils.tsx +306 -306
  184. package/src/aldehyde/controls/auto-complete/index.tsx +82 -82
  185. package/src/aldehyde/controls/cascader/index.tsx +112 -112
  186. package/src/aldehyde/controls/chemstruc/graph.tsx +185 -185
  187. package/src/aldehyde/controls/chemstruc/index.css +28 -28
  188. package/src/aldehyde/controls/code-editor/sql-code-editor.tsx +73 -73
  189. package/src/aldehyde/controls/collapse-card/index.css +8 -8
  190. package/src/aldehyde/controls/collapse-card/index.tsx +109 -109
  191. package/src/aldehyde/controls/color-picker/index.tsx +21 -21
  192. package/src/aldehyde/controls/counting-tag/index.tsx +53 -53
  193. package/src/aldehyde/controls/cquery/cquick-button.tsx +145 -145
  194. package/src/aldehyde/controls/date-picker/index.tsx +199 -199
  195. package/src/aldehyde/controls/direct-file-view/drawer-file-view.tsx +54 -54
  196. package/src/aldehyde/controls/direct-file-view/index.tsx +147 -147
  197. package/src/aldehyde/controls/direct-upload/index.tsx +140 -140
  198. package/src/aldehyde/controls/entity-select/entity-select.tsx +791 -791
  199. package/src/aldehyde/controls/entity-select/index.css +7 -7
  200. package/src/aldehyde/controls/entity-select/lab-tree-select.tsx +154 -154
  201. package/src/aldehyde/controls/entity-select/popover-entity-select.tsx +205 -205
  202. package/src/aldehyde/controls/entry-control.tsx +431 -431
  203. package/src/aldehyde/controls/enum-badge/index.tsx +42 -42
  204. package/src/aldehyde/controls/enum-tag/index.tsx +45 -45
  205. package/src/aldehyde/controls/field-history/index.tsx +81 -81
  206. package/src/aldehyde/controls/file-export/select-code-export.tsx +40 -40
  207. package/src/aldehyde/controls/file-view/drawer-file-view.tsx +117 -117
  208. package/src/aldehyde/controls/file-view/index.less +9 -9
  209. package/src/aldehyde/controls/file-view/index.tsx +148 -148
  210. package/src/aldehyde/controls/file-view/multi-file-view.tsx +39 -39
  211. package/src/aldehyde/controls/file-view/newin-file-view.tsx +40 -40
  212. package/src/aldehyde/controls/html-editor/draft.tsx +136 -136
  213. package/src/aldehyde/controls/html-editor/index.less +67 -67
  214. package/src/aldehyde/controls/icon-selector/app-icon-selector.tsx +68 -68
  215. package/src/aldehyde/controls/icon-selector/icon/aldehyde-menu-icon/iconfont.css +147 -147
  216. package/src/aldehyde/controls/icon-selector/icon/aldehyde-menu-icon/iconfont.json +240 -240
  217. package/src/aldehyde/controls/icon-selector/pc-icon-selector.tsx +68 -68
  218. package/src/aldehyde/controls/input-number/index.tsx +148 -148
  219. package/src/aldehyde/controls/input-range/index.tsx +59 -59
  220. package/src/aldehyde/controls/password-setter/index.css +2 -2
  221. package/src/aldehyde/controls/password-setter/index.js +88 -88
  222. package/src/aldehyde/controls/progress/index.tsx +74 -74
  223. package/src/aldehyde/controls/qr-code/index.less +28 -28
  224. package/src/aldehyde/controls/qr-code/index.tsx +40 -40
  225. package/src/aldehyde/controls/relation-existion/index.css +3 -3
  226. package/src/aldehyde/controls/relation-existion/index.tsx +144 -144
  227. package/src/aldehyde/controls/rfield/index.css +4 -4
  228. package/src/aldehyde/controls/rfield/index.tsx +225 -225
  229. package/src/aldehyde/controls/select/index.tsx +226 -226
  230. package/src/aldehyde/controls/signature/index.tsx +226 -226
  231. package/src/aldehyde/controls/single-checkbox/index.tsx +18 -18
  232. package/src/aldehyde/controls/steps/index.tsx +59 -59
  233. package/src/aldehyde/controls/text/ellipsis-text.tsx +98 -98
  234. package/src/aldehyde/controls/text/index.less +7 -7
  235. package/src/aldehyde/controls/tree-select/navigation-tree.tsx +122 -122
  236. package/src/aldehyde/controls/tree-select/tree-entity-select.tsx +121 -121
  237. package/src/aldehyde/controls/upload/index.tsx +128 -128
  238. package/src/aldehyde/controls/upload/mult-file-upload.tsx +240 -240
  239. package/src/aldehyde/controls/upload-read-excel/index.tsx +43 -43
  240. package/src/aldehyde/controls/view-control.tsx +289 -289
  241. package/src/aldehyde/custom-page/custom-detail-modal-page.tsx +69 -69
  242. package/src/aldehyde/custom-page/custom-page-router.tsx +64 -64
  243. package/src/aldehyde/custom-page/def-custom-page.tsx +17 -17
  244. package/src/aldehyde/custom-page/dtmpl-custom-edit-modal-page.tsx +91 -91
  245. package/src/aldehyde/detail/button/bottom-submit-button-bar.tsx +91 -91
  246. package/src/aldehyde/detail/button/cquery-button-bar.tsx +144 -144
  247. package/src/aldehyde/detail/button/edit-button.tsx +61 -61
  248. package/src/aldehyde/detail/button/fix-right-submit-button-bar.tsx +186 -186
  249. package/src/aldehyde/detail/button/index.css +42 -42
  250. package/src/aldehyde/detail/button/inline-edit-button.tsx +40 -40
  251. package/src/aldehyde/detail/button/submit-button-bar.tsx +57 -57
  252. package/src/aldehyde/detail/button/view-button.tsx +64 -64
  253. package/src/aldehyde/detail/dtmpl.css +72 -72
  254. package/src/aldehyde/detail/edit/dtmpl-edit.tsx +279 -279
  255. package/src/aldehyde/detail/edit/fields-edit-card.tsx +145 -145
  256. package/src/aldehyde/detail/edit/modal-row-edit.tsx +95 -95
  257. package/src/aldehyde/detail/edit/popover-edit-card.tsx +167 -167
  258. package/src/aldehyde/detail/edit/popover-editor.tsx +70 -70
  259. package/src/aldehyde/detail/edit/post-result/index.tsx +86 -86
  260. package/src/aldehyde/detail/rightbar/index.css +34 -34
  261. package/src/aldehyde/detail/rightbar/index.tsx +92 -92
  262. package/src/aldehyde/detail/tooltipbar/index.tsx +32 -32
  263. package/src/aldehyde/detail/view/act-dtmpl-view.tsx +288 -288
  264. package/src/aldehyde/detail/view/dtmpl-view.tsx +334 -334
  265. package/src/aldehyde/detail/view/field-view-group.tsx +88 -88
  266. package/src/aldehyde/detail/view/modal-dtmpl-view.tsx +73 -73
  267. package/src/aldehyde/detail/view/snapshot-timeline.tsx +231 -231
  268. package/src/aldehyde/detail/view/tab-act-dtmpl-view.tsx +304 -304
  269. package/src/aldehyde/detail/view/view-compare-panel.tsx +57 -57
  270. package/src/aldehyde/draw-canvas-edit/components/render/components/index.less +60 -60
  271. package/src/aldehyde/draw-canvas-edit/components/render/components/index.ts +3 -3
  272. package/src/aldehyde/draw-canvas-edit/components/render/components/workstation-component.tsx +220 -220
  273. package/src/aldehyde/draw-canvas-edit/components/render/draws/bg-draw.ts +177 -177
  274. package/src/aldehyde/draw-canvas-edit/components/render/draws/contextmenu-draw.ts +330 -330
  275. package/src/aldehyde/draw-canvas-edit/components/render/draws/graph-draw.ts +249 -249
  276. package/src/aldehyde/draw-canvas-edit/components/render/draws/link-draw.ts +1415 -1415
  277. package/src/aldehyde/draw-canvas-edit/components/render/draws/preview-draw.ts +274 -274
  278. package/src/aldehyde/draw-canvas-edit/components/render/draws/ref-line-draw.ts +71 -71
  279. package/src/aldehyde/draw-canvas-edit/components/render/draws/ruler-draw.ts +166 -166
  280. package/src/aldehyde/draw-canvas-edit/components/render/graphs/bezier.ts +542 -542
  281. package/src/aldehyde/draw-canvas-edit/components/render/handlers/drag-outside-handlers.ts +77 -77
  282. package/src/aldehyde/draw-canvas-edit/components/render/handlers/selection-handlers.ts +410 -410
  283. package/src/aldehyde/draw-canvas-edit/components/render/index.ts +817 -817
  284. package/src/aldehyde/draw-canvas-edit/components/render/tools/attract-tool.ts +457 -457
  285. package/src/aldehyde/draw-canvas-edit/components/render/tools/component-factory.ts +269 -269
  286. package/src/aldehyde/draw-canvas-edit/components/render/tools/copy-tool.ts +244 -244
  287. package/src/aldehyde/draw-canvas-edit/components/render/tools/import-export-tool.ts +588 -588
  288. package/src/aldehyde/draw-canvas-edit/components/render/tools/index.ts +10 -10
  289. package/src/aldehyde/draw-canvas-edit/components/render/tools/position-tool.ts +191 -191
  290. package/src/aldehyde/draw-canvas-edit/components/render/tools/selection-tool.ts +140 -140
  291. package/src/aldehyde/draw-canvas-edit/components/render/types.ts +298 -298
  292. package/src/aldehyde/draw-canvas-edit/components/setting-form/index.tsx +305 -305
  293. package/src/aldehyde/draw-canvas-edit/constant.ts +5 -5
  294. package/src/aldehyde/draw-canvas-edit/index.less +48 -48
  295. package/src/aldehyde/draw-canvas-edit/index.tsx +213 -213
  296. package/src/aldehyde/draw-canvas-view/index.less +66 -66
  297. package/src/aldehyde/draw-canvas-view/index.tsx +49 -49
  298. package/src/aldehyde/draw-canvas-view/view.tsx +237 -237
  299. package/src/aldehyde/export/export-frame.css +2 -2
  300. package/src/aldehyde/export/export-frame.tsx +301 -301
  301. package/src/aldehyde/export/select-code-export-frame.tsx +212 -212
  302. package/src/aldehyde/form/criteria-form.tsx +604 -604
  303. package/src/aldehyde/form/dtmpl-form.css +3 -3
  304. package/src/aldehyde/form/dtmpl-form.tsx +571 -571
  305. package/src/aldehyde/form/field-group-form.tsx +103 -103
  306. package/src/aldehyde/form/fields-form.tsx +45 -45
  307. package/src/aldehyde/form/form-Item-group.tsx +246 -246
  308. package/src/aldehyde/form/index.css +12 -12
  309. package/src/aldehyde/hooks/use-match-route/index.tsx +62 -62
  310. package/src/aldehyde/hooks/use-tabs/index.tsx +139 -139
  311. package/src/aldehyde/hooks/useVarCssColor.ts +6 -6
  312. package/src/aldehyde/icon/aliIcon.tsx +9 -9
  313. package/src/aldehyde/icon/index.tsx +28 -28
  314. package/src/aldehyde/import/excel-import.tsx +450 -450
  315. package/src/aldehyde/import/index.css +53 -53
  316. package/src/aldehyde/import/template.css +50 -50
  317. package/src/aldehyde/index.tsx +220 -220
  318. package/src/aldehyde/layout/MainPage.tsx +334 -334
  319. package/src/aldehyde/layout/common.css +64 -64
  320. package/src/aldehyde/layout/coverstyle.css +51 -51
  321. package/src/aldehyde/layout/footer/index.css +5 -5
  322. package/src/aldehyde/layout/footer/index.js +17 -17
  323. package/src/aldehyde/layout/header/index.css +122 -122
  324. package/src/aldehyde/layout/header/index.tsx +152 -152
  325. package/src/aldehyde/layout/menu/block.css +7 -7
  326. package/src/aldehyde/layout/menu/block.tsx +174 -174
  327. package/src/aldehyde/layout/menu/l2menu-message-bar.tsx +160 -160
  328. package/src/aldehyde/layout/menu/l2menu-quick-bar.tsx +175 -175
  329. package/src/aldehyde/layout/menu/menu-2layers.tsx +117 -117
  330. package/src/aldehyde/layout/menu/menu-render.tsx +168 -168
  331. package/src/aldehyde/layout/menu/message-bar.less +73 -73
  332. package/src/aldehyde/layout/menu/reset-password.tsx +255 -255
  333. package/src/aldehyde/layout/menu/user-bar.tsx +259 -259
  334. package/src/aldehyde/layout/menu/userinfo-bar.tsx +69 -69
  335. package/src/aldehyde/layout/sidebar/index.css +57 -57
  336. package/src/aldehyde/layout/sidebar/index.tsx +84 -84
  337. package/src/aldehyde/layout2/components/icon-font.tsx +7 -7
  338. package/src/aldehyde/layout2/components/screenfull-button.tsx +21 -21
  339. package/src/aldehyde/layout2/components/search-menu.tsx +85 -85
  340. package/src/aldehyde/layout2/components/system-messages.tsx +75 -75
  341. package/src/aldehyde/layout2/components/theme-button.tsx +65 -65
  342. package/src/aldehyde/layout2/components/user-button.tsx +258 -258
  343. package/src/aldehyde/layout2/components/user-notification.tsx +74 -74
  344. package/src/aldehyde/layout2/css/header.css +41 -41
  345. package/src/aldehyde/layout2/css/sider.less +17 -17
  346. package/src/aldehyde/layout2/css/tabs-layout.less +18 -18
  347. package/src/aldehyde/layout2/header.tsx +278 -278
  348. package/src/aldehyde/layout2/layout-context.tsx +95 -95
  349. package/src/aldehyde/layout2/main.tsx +30 -30
  350. package/src/aldehyde/layout2/page.tsx +323 -323
  351. package/src/aldehyde/layout2/sider.tsx +230 -230
  352. package/src/aldehyde/layout2/tabs/tabs-context.tsx +37 -37
  353. package/src/aldehyde/layout2/tabs/tabs-layout.tsx +146 -146
  354. package/src/aldehyde/layout2/type/layout-type.ts +16 -16
  355. package/src/aldehyde/layout2/util/menu-util.tsx +125 -125
  356. package/src/aldehyde/layout3/components/tabs-layout.tsx +110 -110
  357. package/src/aldehyde/layout3/components/time.tsx +25 -25
  358. package/src/aldehyde/layout3/css/header.less +195 -195
  359. package/src/aldehyde/layout3/css/main.less +161 -161
  360. package/src/aldehyde/layout3/css/sider.less +32 -32
  361. package/src/aldehyde/layout3/css/tabs-layout.less +38 -38
  362. package/src/aldehyde/layout3/header.tsx +187 -187
  363. package/src/aldehyde/layout3/main.tsx +29 -29
  364. package/src/aldehyde/layout3/page.tsx +110 -110
  365. package/src/aldehyde/layout3/sider.tsx +198 -198
  366. package/src/aldehyde/layout4/components/tabs-layout.tsx +110 -110
  367. package/src/aldehyde/layout4/css/header.less +196 -196
  368. package/src/aldehyde/layout4/css/main.less +154 -154
  369. package/src/aldehyde/layout4/css/sider.less +37 -37
  370. package/src/aldehyde/layout4/css/tabs-layout.less +42 -42
  371. package/src/aldehyde/layout4/header.tsx +190 -190
  372. package/src/aldehyde/layout4/main.tsx +29 -29
  373. package/src/aldehyde/layout4/page.tsx +125 -125
  374. package/src/aldehyde/layout4/sider.tsx +201 -201
  375. package/src/aldehyde/layout5/css/header.less +35 -35
  376. package/src/aldehyde/layout5/css/sider.less +18 -18
  377. package/src/aldehyde/layout5/header.tsx +204 -204
  378. package/src/aldehyde/layout5/page.tsx +107 -107
  379. package/src/aldehyde/layout5/sider.tsx +235 -235
  380. package/src/aldehyde/list/calendar/index.less +20 -20
  381. package/src/aldehyde/list/calendar/index.tsx +157 -157
  382. package/src/aldehyde/list/card-list/card-list-item.tsx +112 -112
  383. package/src/aldehyde/list/card-list/index.less +154 -154
  384. package/src/aldehyde/list/card-list/index.tsx +83 -83
  385. package/src/aldehyde/list/gantt/index.less +8 -8
  386. package/src/aldehyde/list/gantt/index.tsx +508 -508
  387. package/src/aldehyde/list/vertical-list/index.less +208 -208
  388. package/src/aldehyde/list/vertical-list/index.tsx +55 -55
  389. package/src/aldehyde/list/vertical-list/item.tsx +136 -136
  390. package/src/aldehyde/locale/LocaleButton.tsx +48 -48
  391. package/src/aldehyde/locale/LocaleProvider.tsx +265 -265
  392. package/src/aldehyde/locale/langMp.ts +45 -45
  393. package/src/aldehyde/locale/translate.ts +80 -80
  394. package/src/aldehyde/locale/useLocale.ts +72 -72
  395. package/src/aldehyde/login/context-setter.tsx +130 -130
  396. package/src/aldehyde/login/index.css +19 -19
  397. package/src/aldehyde/login/login.tsx +255 -255
  398. package/src/aldehyde/login/router-login.tsx +107 -107
  399. package/src/aldehyde/login/vertify/index.css +143 -143
  400. package/src/aldehyde/login/vertify/index.tsx +360 -360
  401. package/src/aldehyde/login/vertify/tool.ts +13 -13
  402. package/src/aldehyde/login2/login-page.tsx +92 -92
  403. package/src/aldehyde/login2/login.tsx +227 -227
  404. package/src/aldehyde/login3/index.less +136 -136
  405. package/src/aldehyde/login3/login-page.tsx +71 -71
  406. package/src/aldehyde/lowcode-components/act-table/index.less +26 -26
  407. package/src/aldehyde/lowcode-components/act-table/index.tsx +139 -139
  408. package/src/aldehyde/lowcode-components/assets/lowcode-constant.tsx +12 -12
  409. package/src/aldehyde/lowcode-components/bar-chart/index.tsx +272 -272
  410. package/src/aldehyde/lowcode-components/base-button/index.less +7 -7
  411. package/src/aldehyde/lowcode-components/base-button/index.tsx +197 -197
  412. package/src/aldehyde/lowcode-components/base-image/index.tsx +220 -220
  413. package/src/aldehyde/lowcode-components/base-map/index.tsx +292 -292
  414. package/src/aldehyde/lowcode-components/base-radio/index.less +23 -23
  415. package/src/aldehyde/lowcode-components/base-radio/index.tsx +157 -157
  416. package/src/aldehyde/lowcode-components/base-table/index.tsx +268 -268
  417. package/src/aldehyde/lowcode-components/base-tabs/index.less +14 -14
  418. package/src/aldehyde/lowcode-components/base-tabs/index.tsx +183 -183
  419. package/src/aldehyde/lowcode-components/base-text/index.tsx +58 -58
  420. package/src/aldehyde/lowcode-components/border/border1/index.tsx +70 -70
  421. package/src/aldehyde/lowcode-components/border/border10/index.less +26 -26
  422. package/src/aldehyde/lowcode-components/border/border10/index.tsx +45 -45
  423. package/src/aldehyde/lowcode-components/border/border11/index.less +17 -17
  424. package/src/aldehyde/lowcode-components/border/border11/index.tsx +232 -232
  425. package/src/aldehyde/lowcode-components/border/border12/index.less +13 -13
  426. package/src/aldehyde/lowcode-components/border/border12/index.tsx +115 -115
  427. package/src/aldehyde/lowcode-components/border/border13/index.less +13 -13
  428. package/src/aldehyde/lowcode-components/border/border13/index.tsx +69 -69
  429. package/src/aldehyde/lowcode-components/border/border2/index.less +17 -17
  430. package/src/aldehyde/lowcode-components/border/border2/index.tsx +51 -51
  431. package/src/aldehyde/lowcode-components/border/border3/index.less +25 -25
  432. package/src/aldehyde/lowcode-components/border/border3/index.tsx +61 -61
  433. package/src/aldehyde/lowcode-components/border/border4/index.less +72 -72
  434. package/src/aldehyde/lowcode-components/border/border4/index.tsx +79 -79
  435. package/src/aldehyde/lowcode-components/border/border5/index.less +35 -35
  436. package/src/aldehyde/lowcode-components/border/border5/index.tsx +75 -75
  437. package/src/aldehyde/lowcode-components/border/border6/index.less +17 -17
  438. package/src/aldehyde/lowcode-components/border/border6/index.tsx +60 -60
  439. package/src/aldehyde/lowcode-components/border/border7/index.less +26 -26
  440. package/src/aldehyde/lowcode-components/border/border7/index.tsx +75 -75
  441. package/src/aldehyde/lowcode-components/border/border8/index.less +13 -13
  442. package/src/aldehyde/lowcode-components/border/border8/index.tsx +84 -84
  443. package/src/aldehyde/lowcode-components/border/border9/index.less +13 -13
  444. package/src/aldehyde/lowcode-components/border/border9/index.tsx +154 -154
  445. package/src/aldehyde/lowcode-components/capsule-bar-chart/index.tsx +290 -290
  446. package/src/aldehyde/lowcode-components/carousel/index.tsx +218 -218
  447. package/src/aldehyde/lowcode-components/circular-progress-chart/index.tsx +263 -263
  448. package/src/aldehyde/lowcode-components/column-3d-chart/index.tsx +442 -442
  449. package/src/aldehyde/lowcode-components/column-chart/index.tsx +352 -352
  450. package/src/aldehyde/lowcode-components/data-number/index.tsx +219 -219
  451. package/src/aldehyde/lowcode-components/data.d.ts +19 -19
  452. package/src/aldehyde/lowcode-components/decoration/decoration1/index.less +7 -7
  453. package/src/aldehyde/lowcode-components/decoration/decoration1/index.tsx +153 -153
  454. package/src/aldehyde/lowcode-components/decoration/decoration10/index.less +5 -5
  455. package/src/aldehyde/lowcode-components/decoration/decoration10/index.tsx +89 -89
  456. package/src/aldehyde/lowcode-components/decoration/decoration11/index.less +5 -5
  457. package/src/aldehyde/lowcode-components/decoration/decoration11/index.tsx +133 -133
  458. package/src/aldehyde/lowcode-components/decoration/decoration2/index.less +6 -6
  459. package/src/aldehyde/lowcode-components/decoration/decoration2/index.tsx +61 -61
  460. package/src/aldehyde/lowcode-components/decoration/decoration3/index.less +7 -7
  461. package/src/aldehyde/lowcode-components/decoration/decoration3/index.tsx +87 -87
  462. package/src/aldehyde/lowcode-components/decoration/decoration4/index.less +29 -29
  463. package/src/aldehyde/lowcode-components/decoration/decoration4/index.tsx +53 -53
  464. package/src/aldehyde/lowcode-components/decoration/decoration5/index.less +3 -3
  465. package/src/aldehyde/lowcode-components/decoration/decoration5/index.tsx +116 -116
  466. package/src/aldehyde/lowcode-components/decoration/decoration6/index.less +7 -7
  467. package/src/aldehyde/lowcode-components/decoration/decoration6/index.tsx +121 -121
  468. package/src/aldehyde/lowcode-components/decoration/decoration7/index.less +4 -4
  469. package/src/aldehyde/lowcode-components/decoration/decoration7/index.tsx +70 -70
  470. package/src/aldehyde/lowcode-components/decoration/decoration8/index.less +14 -14
  471. package/src/aldehyde/lowcode-components/decoration/decoration8/index.tsx +122 -122
  472. package/src/aldehyde/lowcode-components/decoration/decoration9/index.less +4 -4
  473. package/src/aldehyde/lowcode-components/decoration/decoration9/index.tsx +196 -196
  474. package/src/aldehyde/lowcode-components/effectScatter-map/index.tsx +315 -315
  475. package/src/aldehyde/lowcode-components/effectScatter-map-3d/index.tsx +419 -419
  476. package/src/aldehyde/lowcode-components/gauge-chart/index.tsx +254 -254
  477. package/src/aldehyde/lowcode-components/index.ts +130 -130
  478. package/src/aldehyde/lowcode-components/line-bar-chart/index.tsx +362 -362
  479. package/src/aldehyde/lowcode-components/line-chart/index.tsx +352 -352
  480. package/src/aldehyde/lowcode-components/liquid-chart/index.tsx +250 -250
  481. package/src/aldehyde/lowcode-components/lowcode-view/component/assets.ts +478 -478
  482. package/src/aldehyde/lowcode-components/lowcode-view/component/component-controller.ts +153 -153
  483. package/src/aldehyde/lowcode-components/lowcode-view/component/component-definition.ts +23 -23
  484. package/src/aldehyde/lowcode-components/lowcode-view/component/loading.tsx +20 -20
  485. package/src/aldehyde/lowcode-components/lowcode-view/component/util.ts +27 -27
  486. package/src/aldehyde/lowcode-components/lowcode-view/index.less +19 -19
  487. package/src/aldehyde/lowcode-components/lowcode-view/index.tsx +279 -279
  488. package/src/aldehyde/lowcode-components/lowcode-view/interface.ts +189 -189
  489. package/src/aldehyde/lowcode-components/pie-chart/index.tsx +353 -353
  490. package/src/aldehyde/lowcode-components/progress-chart/index.tsx +295 -295
  491. package/src/aldehyde/lowcode-components/radar-chart/index.tsx +322 -322
  492. package/src/aldehyde/lowcode-components/search-form/index.less +25 -25
  493. package/src/aldehyde/lowcode-components/search-form/index.tsx +121 -121
  494. package/src/aldehyde/lowcode-components/stroke-animation/index.tsx +219 -219
  495. package/src/aldehyde/module/block-menu-tree-drawer.tsx +118 -118
  496. package/src/aldehyde/module/criteria-page.tsx1 +175 -175
  497. package/src/aldehyde/module/draggable-modal.tsx +66 -66
  498. package/src/aldehyde/module/dtmpl-edit-card.tsx +479 -479
  499. package/src/aldehyde/module/dtmpl-edit-drawer.tsx +24 -24
  500. package/src/aldehyde/module/dtmpl-edit-modal.tsx +26 -26
  501. package/src/aldehyde/module/dtmpl-edit-page.tsx +600 -600
  502. package/src/aldehyde/module/dtmpl-editor.tsx +165 -165
  503. package/src/aldehyde/module/dtmpl-view-card.tsx +64 -64
  504. package/src/aldehyde/module/dtmpl-view-drawer.tsx +71 -71
  505. package/src/aldehyde/module/dtmpl-view-modal.tsx +56 -56
  506. package/src/aldehyde/module/embed-dtmpl-edit-page.tsx +137 -137
  507. package/src/aldehyde/module/index.less +4 -4
  508. package/src/aldehyde/module/ltmpl-drawer.tsx +60 -60
  509. package/src/aldehyde/module/ltmpl-modal.tsx +63 -63
  510. package/src/aldehyde/module/ltmpl-table.tsx +387 -387
  511. package/src/aldehyde/module/ttmpl-tree.tsx +47 -47
  512. package/src/aldehyde/routable/dtmpl-route.tsx +179 -179
  513. package/src/aldehyde/routable/import-route.tsx +42 -42
  514. package/src/aldehyde/routable/index.less +25 -25
  515. package/src/aldehyde/routable/ltmpl-route.tsx +549 -549
  516. package/src/aldehyde/routable/splitview-ltmpl-route.tsx +385 -385
  517. package/src/aldehyde/routable/ttmpl-route.tsx +98 -98
  518. package/src/aldehyde/routable/withroute.tsx +36 -36
  519. package/src/aldehyde/sso-Login/index.tsx +73 -73
  520. package/src/aldehyde/sso-Login/service/index.js +16 -16
  521. package/src/aldehyde/sso-Login/service/login.js +75 -75
  522. package/src/aldehyde/table/act-table.tsx +1865 -1865
  523. package/src/aldehyde/table/column/column-builder.tsx +882 -882
  524. package/src/aldehyde/table/column/column-selector.tsx +130 -130
  525. package/src/aldehyde/table/column/index.less +85 -85
  526. package/src/aldehyde/table/column/summary-builder.tsx +712 -712
  527. package/src/aldehyde/table/column/theme-color-getter.tsx +25 -25
  528. package/src/aldehyde/table/control-table-x-axis-wrapper.tsx +80 -80
  529. package/src/aldehyde/table/index.css +211 -211
  530. package/src/aldehyde/table/l2-act-table.tsx +91 -91
  531. package/src/aldehyde/table/modal-select-table.tsx +308 -308
  532. package/src/aldehyde/table/page-chart.less +9 -9
  533. package/src/aldehyde/table/page-chart.tsx +196 -196
  534. package/src/aldehyde/table/page-config-button.tsx +203 -203
  535. package/src/aldehyde/table/pagination.css +14 -14
  536. package/src/aldehyde/table/pagination.tsx +81 -81
  537. package/src/aldehyde/table/query-table.tsx +668 -668
  538. package/src/aldehyde/table/relation-table.tsx +1078 -1078
  539. package/src/aldehyde/table/report-table.tsx +125 -125
  540. package/src/aldehyde/table/resizable-table.tsx +97 -97
  541. package/src/aldehyde/table/row-table.tsx +45 -45
  542. package/src/aldehyde/table/select-table.tsx +559 -559
  543. package/src/aldehyde/table/selected-rows-card.tsx +78 -78
  544. package/src/aldehyde/table/stat/restat.tsx +122 -122
  545. package/src/aldehyde/table/table-util.tsx +25 -25
  546. package/src/aldehyde/tmpl/control-type-supportor.tsx +154 -154
  547. package/src/aldehyde/tmpl/hc-data-source.tsx +574 -574
  548. package/src/aldehyde/tmpl/hcservice-v3.tsx +1590 -1590
  549. package/src/aldehyde/tmpl/interface.tsx +940 -940
  550. package/src/aldehyde/tmpl/model-struc-v3.tsx +111 -111
  551. package/src/aldehyde/tmpl/superagent.js +146 -146
  552. package/src/aldehyde/tmpl/tmpl-config-analysis.tsx +585 -585
  553. package/src/aldehyde/tmpl/web-socket.ts +366 -366
  554. package/src/aldehyde/tree/act-tree.tsx +219 -219
  555. package/src/aldehyde/tree/block-menu-auth-tree.tsx +189 -189
  556. package/src/aldehyde/tree/index.css +22 -22
  557. package/src/aldehyde/tree/navigation-tree.tsx +39 -39
  558. package/src/aldehyde/tree/tmpl-tree.tsx +751 -751
  559. package/src/aldehyde/tree/tree-node.tsx +73 -73
  560. package/src/aldehyde/tree/tree-utils.tsx +317 -317
  561. package/src/aldehyde/units/EncryptUtils.js +37 -37
  562. package/src/aldehyde/units/image.d.ts +7 -7
  563. package/src/aldehyde/units/index.tsx +1375 -1375
  564. package/src/aldehyde/units/storage.js +2 -2
  565. package/src/aldehyde/utils/dsu.ts +27 -27
  566. package/src/aldehyde/welcome/HCWelcome.js +404 -404
  567. package/src/aldehyde/welcome/HCWelcome1.js +259 -259
  568. package/src/aldehyde/welcome/components/menu-card.less +96 -96
  569. package/src/aldehyde/welcome/components/menu-card.tsx +70 -70
  570. package/src/aldehyde/welcome/components/page-card.less +49 -49
  571. package/src/aldehyde/welcome/components/page-card.tsx +97 -97
  572. package/src/aldehyde/welcome/components/quick-entrance.less +120 -120
  573. package/src/aldehyde/welcome/components/quick-entrance.tsx +80 -80
  574. package/src/aldehyde/welcome/components/user-menus.less +192 -192
  575. package/src/aldehyde/welcome/components/user-menus.tsx +279 -279
  576. package/src/aldehyde/welcome/components/workbench.less +118 -118
  577. package/src/aldehyde/welcome/components/workbench.tsx +146 -146
  578. 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
  }