aldehyde 0.2.496 → 0.2.498

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