@epxing/designer 0.0.0-stage → 5.3.0-beta.2

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 (491) hide show
  1. package/API.md +160 -0
  2. package/README.md +45 -2
  3. package/dist/_virtual/_plugin-vue_export-helper.js +10 -0
  4. package/dist/_virtual/preload-helper.js +88 -0
  5. package/dist/assets/default-icon-2193FMjv.png +0 -0
  6. package/dist/assets/technology_bg-oWIS2awO.jpg +0 -0
  7. package/dist/assets/theme_black-Ctdygcr4.png +0 -0
  8. package/dist/assets/theme_technology-DJk-2e7g.png +0 -0
  9. package/dist/assets/theme_white-uMQ6JYml.png +0 -0
  10. package/dist/src/assets/images/dashboard/theme_black.png.js +4 -0
  11. package/dist/src/assets/images/dashboard/theme_technology.png.js +4 -0
  12. package/dist/src/assets/images/dashboard/theme_white.png.js +4 -0
  13. package/dist/src/assets/images/default-icon.png.js +4 -0
  14. package/dist/src/index.js +53 -0
  15. package/dist/src/page-designer/PageConfigPreview.js +102 -0
  16. package/dist/src/page-designer/PageDesigner.js +844 -0
  17. package/dist/src/page-designer/designer.js +1120 -0
  18. package/dist/src/page-designer/index.js +52 -0
  19. package/dist/src/page-designer/mixins/dragSourceMixin.js +95 -0
  20. package/dist/src/page-designer/page-variable-panel/JsonEditor.js +106 -0
  21. package/dist/src/page-designer/page-variable-panel/PageVariablePanel.js +939 -0
  22. package/dist/src/page-designer/page-variable-panel/index.js +7 -0
  23. package/dist/src/page-designer/page-variable-panel/jsonlint.js +230 -0
  24. package/dist/src/page-designer/previews/add-form/Preview.js +8 -0
  25. package/dist/src/page-designer/previews/add-form/Preview.vue.js +328 -0
  26. package/dist/src/page-designer/previews/add-form-item/Preview.js +194 -0
  27. package/dist/src/page-designer/previews/button/Preview.js +30 -0
  28. package/dist/src/page-designer/previews/card/Preview.js +87 -0
  29. package/dist/src/page-designer/previews/carousel/CarouselItemPreview.js +33 -0
  30. package/dist/src/page-designer/previews/carousel/Preview.js +61 -0
  31. package/dist/src/page-designer/previews/collapse/CollapseItemPreview.js +118 -0
  32. package/dist/src/page-designer/previews/collapse/Preview.js +35 -0
  33. package/dist/src/page-designer/previews/dropdown/Preview.js +68 -0
  34. package/dist/src/page-designer/previews/entity-list/Preview.js +522 -0
  35. package/dist/src/page-designer/previews/entity-sub-list/Preview.js +352 -0
  36. package/dist/src/page-designer/previews/entity-virtual-list/Preview.js +11 -0
  37. package/dist/src/page-designer/previews/form-field/preview/Checkbox.js +91 -0
  38. package/dist/src/page-designer/previews/form-field/preview/Date.js +77 -0
  39. package/dist/src/page-designer/previews/form-field/preview/Input.js +74 -0
  40. package/dist/src/page-designer/previews/form-field/preview/InputNumber.js +74 -0
  41. package/dist/src/page-designer/previews/form-field/preview/Object.js +77 -0
  42. package/dist/src/page-designer/previews/form-field/preview/Radio.js +146 -0
  43. package/dist/src/page-designer/previews/form-field/preview/Select.js +78 -0
  44. package/dist/src/page-designer/previews/form-field/preview/Textarea.js +78 -0
  45. package/dist/src/page-designer/previews/grid/Preview.js +139 -0
  46. package/dist/src/page-designer/previews/html/Preview.js +18 -0
  47. package/dist/src/page-designer/previews/icon/Preview.js +20 -0
  48. package/dist/src/page-designer/previews/image/Preview.js +36 -0
  49. package/dist/src/page-designer/previews/index.js +74 -0
  50. package/dist/src/page-designer/previews/layout/ColumnPreview.js +47 -0
  51. package/dist/src/page-designer/previews/layout/Preview.js +110 -0
  52. package/dist/src/page-designer/previews/num/Preview.js +132 -0
  53. package/dist/src/page-designer/previews/page-tabs/Preview.js +75 -0
  54. package/dist/src/page-designer/previews/step/Preview.js +207 -0
  55. package/dist/src/page-designer/previews/tabs/Preview.js +95 -0
  56. package/dist/src/page-designer/previews/tabs/tab-pane/Preview.js +33 -0
  57. package/dist/src/page-designer/previews/text/Preview.js +38 -0
  58. package/dist/src/page-designer/previews/text-editor/Preview.js +23 -0
  59. package/dist/src/page-designer/previews/video/Preview.js +10 -0
  60. package/dist/src/page-designer/setting-panel/Advance.js +281 -0
  61. package/dist/src/page-designer/setting-panel/CodeEditor.js +94 -0
  62. package/dist/src/page-designer/setting-panel/Property.js +165 -0
  63. package/dist/src/page-designer/setting-panel/Setting.js +296 -0
  64. package/dist/src/page-designer/setting-panel/Style.js +1591 -0
  65. package/dist/src/page-designer/setting-panel/css-editor/CssEditor.js +98 -0
  66. package/dist/src/page-designer/setting-panel/css-editor/css-hint.js +84 -0
  67. package/dist/src/page-designer/setting-panel/index.js +11 -0
  68. package/dist/src/page-designer/template-attribute-panel/TemplateAttributePanel.js +487 -0
  69. package/dist/src/page-designer/template-attribute-panel/index.js +5 -0
  70. package/dist/src/page-designer/template-library/Library.js +219 -0
  71. package/dist/src/page-designer/template-library/index.js +5 -0
  72. package/dist/src/page-designer/widget-library/Base.js +170 -0
  73. package/dist/src/page-designer/widget-library/Library.js +213 -0
  74. package/dist/src/page-designer/widget-library/index.js +7 -0
  75. package/dist/src/page-designer/widget-preview/Container.js +80 -0
  76. package/dist/src/page-designer/widget-preview/DragGhost.js +54 -0
  77. package/dist/src/page-designer/widget-preview/DropZoneOverlay.js +42 -0
  78. package/dist/src/page-designer/widget-preview/HoverOverlay.js +61 -0
  79. package/dist/src/page-designer/widget-preview/Mixin.js +260 -0
  80. package/dist/src/page-designer/widget-preview/Placeholder.js +28 -0
  81. package/dist/src/page-designer/widget-preview/Preview.js +277 -0
  82. package/dist/src/page-designer/widget-preview/PreviewItem.js +83 -0
  83. package/dist/src/page-designer/widget-preview/SelectedOverlay.js +332 -0
  84. package/dist/src/page-designer/widget-preview/Template.js +66 -0
  85. package/dist/src/page-designer/widget-preview/WidgetWrapper.js +170 -0
  86. package/dist/src/page-designer/widget-preview/directive.js +159 -0
  87. package/dist/src/page-designer/widget-preview/dropPosition.js +50 -0
  88. package/dist/src/page-designer/widget-preview/index.js +23 -0
  89. package/dist/src/page-designer/widget-preview/overlayPositionMixin.js +87 -0
  90. package/dist/src/page-designer/widget-preview/resolvePreviewName.js +32 -0
  91. package/dist/src/page-designer/widget-tree/Item.js +580 -0
  92. package/dist/src/page-designer/widget-tree/Tree.js +855 -0
  93. package/dist/src/page-designer/widget-tree/index.js +7 -0
  94. package/dist/src/visual/AddForm.js +172 -0
  95. package/dist/src/visual/AddFormItem.js +480 -0
  96. package/dist/src/visual/AppIndex.js +243 -0
  97. package/dist/src/visual/ApplyForm.js +135 -0
  98. package/dist/src/visual/AttributeList.js +344 -0
  99. package/dist/src/visual/BasePage.js +77 -0
  100. package/dist/src/visual/Button.js +5 -0
  101. package/dist/src/visual/Button.vue.js +89 -0
  102. package/dist/src/visual/CardNum.js +74 -0
  103. package/dist/src/visual/CategoryList.js +569 -0
  104. package/dist/src/visual/Chart.js +27 -0
  105. package/dist/src/visual/ChartNew.js +5 -0
  106. package/dist/src/visual/ChartNew.vue.js +54 -0
  107. package/dist/src/visual/CheckForm.js +110 -0
  108. package/dist/src/visual/ClientList.js +41 -0
  109. package/dist/src/visual/CodeManage.js +113 -0
  110. package/dist/src/visual/Component.js +6 -0
  111. package/dist/src/visual/Component.vue.js +1332 -0
  112. package/dist/src/visual/ComponentList.js +280 -0
  113. package/dist/src/visual/Config.js +8 -0
  114. package/dist/src/visual/Config.vue.js +862 -0
  115. package/dist/src/visual/ConfigItem.js +8 -0
  116. package/dist/src/visual/ConfigItem.vue.js +192 -0
  117. package/dist/src/visual/ConfigSelectItems.js +8 -0
  118. package/dist/src/visual/ConfigSelectItems.vue.js +260 -0
  119. package/dist/src/visual/CreatePage.js +389 -0
  120. package/dist/src/visual/DashboardDiv.js +58 -0
  121. package/dist/src/visual/DashboardTabs.js +9 -0
  122. package/dist/src/visual/DashboardTabs.vue.js +127 -0
  123. package/dist/src/visual/DashboardWidget.js +5 -0
  124. package/dist/src/visual/DashboardWidget.vue.js +62 -0
  125. package/dist/src/visual/DblogList.js +82 -0
  126. package/dist/src/visual/EntityAddPage.js +49 -0
  127. package/dist/src/visual/EntityApplyPage.js +54 -0
  128. package/dist/src/visual/EntityCardList.js +455 -0
  129. package/dist/src/visual/EntityCheckPage.js +66 -0
  130. package/dist/src/visual/EntityFindPage.js +45 -0
  131. package/dist/src/visual/EntityList.js +6 -0
  132. package/dist/src/visual/EntityList.vue.js +1221 -0
  133. package/dist/src/visual/EntityListPage.js +43 -0
  134. package/dist/src/visual/EntityNoSubmitSubList.js +267 -0
  135. package/dist/src/visual/EntityRightSubList.js +29 -0
  136. package/dist/src/visual/EntitySubAdd.js +10 -0
  137. package/dist/src/visual/EntitySubGridItem.js +66 -0
  138. package/dist/src/visual/EntitySubList.js +434 -0
  139. package/dist/src/visual/EntityTreeFindPage.js +32 -0
  140. package/dist/src/visual/EntityTreeManage.js +49 -0
  141. package/dist/src/visual/EntityTreePage.js +42 -0
  142. package/dist/src/visual/ExcelPreview.js +10 -0
  143. package/dist/src/visual/FormField.js +5 -0
  144. package/dist/src/visual/FormField.vue.js +121 -0
  145. package/dist/src/visual/HeaderNew.js +161 -0
  146. package/dist/src/visual/Html.js +8 -0
  147. package/dist/src/visual/Html.vue.js +109 -0
  148. package/dist/src/visual/Import.js +53 -0
  149. package/dist/src/visual/InterfaceSubList.js +21 -0
  150. package/dist/src/visual/ListFirst.js +704 -0
  151. package/dist/src/visual/MEntityAddPage.js +66 -0
  152. package/dist/src/visual/MEntityList.js +485 -0
  153. package/dist/src/visual/MEntityListPage.js +40 -0
  154. package/dist/src/visual/MEntitySubList.js +237 -0
  155. package/dist/src/visual/MetaList.js +23 -0
  156. package/dist/src/visual/ModuleIndexPage.js +67 -0
  157. package/dist/src/visual/ModuleList.js +47 -0
  158. package/dist/src/visual/NavAddForm.js +173 -0
  159. package/dist/src/visual/NavFormCatalogItem.js +44 -0
  160. package/dist/src/visual/NumItem.js +70 -0
  161. package/dist/src/visual/NumStatistic.js +6 -0
  162. package/dist/src/visual/NumStatistic.vue.js +81 -0
  163. package/dist/src/visual/OrgChart.js +107 -0
  164. package/dist/src/visual/PageCatalog.js +27 -0
  165. package/dist/src/visual/PageConfig.js +223 -0
  166. package/dist/src/visual/PageTabs.js +49 -0
  167. package/dist/src/visual/Progress.js +40 -0
  168. package/dist/src/visual/ProgressItem.js +44 -0
  169. package/dist/src/visual/SystemManager.js +77 -0
  170. package/dist/src/visual/Title.js +45 -0
  171. package/dist/src/visual/TodoList.js +14 -0
  172. package/dist/src/visual/UserFormItem.js +41 -0
  173. package/dist/src/visual/UserManage.js +35 -0
  174. package/dist/src/visual/chart/CircularPie.js +9 -0
  175. package/dist/src/visual/chart/Column.js +70 -0
  176. package/dist/src/visual/chart/HoriColumn.js +9 -0
  177. package/dist/src/visual/chart/Line.js +9 -0
  178. package/dist/src/visual/chart/Pie.js +9 -0
  179. package/dist/src/visual/config/Background.js +526 -0
  180. package/dist/src/visual/config/Chart.js +154 -0
  181. package/dist/src/visual/config/Checkbox.js +63 -0
  182. package/dist/src/visual/config/Color.js +41 -0
  183. package/dist/src/visual/config/DesignReport.js +24 -0
  184. package/dist/src/visual/config/Event.js +304 -0
  185. package/dist/src/visual/config/Field.js +520 -0
  186. package/dist/src/visual/config/Font.js +202 -0
  187. package/dist/src/visual/config/FormItem.js +23 -0
  188. package/dist/src/visual/config/Function.js +114 -0
  189. package/dist/src/visual/config/Html.js +111 -0
  190. package/dist/src/visual/config/Image.js +102 -0
  191. package/dist/src/visual/config/Input.js +177 -0
  192. package/dist/src/visual/config/Input.vue.js +479 -0
  193. package/dist/src/visual/config/LazyDialog.js +41 -0
  194. package/dist/src/visual/config/List.js +65 -0
  195. package/dist/src/visual/config/ListField.js +2080 -0
  196. package/dist/src/visual/config/MField.js +733 -0
  197. package/dist/src/visual/config/Number.js +37 -0
  198. package/dist/src/visual/config/Object.js +168 -0
  199. package/dist/src/visual/config/Operate.js +1109 -0
  200. package/dist/src/visual/config/OperateItem.js +1186 -0
  201. package/dist/src/visual/config/Options.js +8 -0
  202. package/dist/src/visual/config/Options.vue.js +278 -0
  203. package/dist/src/visual/config/OrderField.js +505 -0
  204. package/dist/src/visual/config/Page.js +76 -0
  205. package/dist/src/visual/config/Params.js +353 -0
  206. package/dist/src/visual/config/Radio.js +127 -0
  207. package/dist/src/visual/config/Row.js +104 -0
  208. package/dist/src/visual/config/Scope.js +350 -0
  209. package/dist/src/visual/config/Select.js +95 -0
  210. package/dist/src/visual/config/Switch.js +37 -0
  211. package/dist/src/visual/config/Textarea.js +175 -0
  212. package/dist/src/visual/config/Textarea.vue.js +507 -0
  213. package/dist/src/visual/config/Tree.js +138 -0
  214. package/dist/src/visual/config/remote-cache.js +30 -0
  215. package/dist/src/visual/config/show-condition.js +20 -0
  216. package/dist/src/visual/config/variable-sources.js +27 -0
  217. package/dist/src/visual/config/wait-ref.js +19 -0
  218. package/dist/src/visual/config-page/ComponentLibrary.js +170 -0
  219. package/dist/src/visual/config-page/ComponentLibraryDialog.js +250 -0
  220. package/dist/src/visual/config-page/ComponentList.js +9 -0
  221. package/dist/src/visual/config-page/ComponentList.vue.js +292 -0
  222. package/dist/src/visual/config-page/ComponentPreview.js +8 -0
  223. package/dist/src/visual/config-page/ComponentPreview.vue.js +151 -0
  224. package/dist/src/visual/config-page/ConfigOption.js +13 -0
  225. package/dist/src/visual/config-page/ConfigPanel.js +302 -0
  226. package/dist/src/visual/config-page/Dashboard.js +2160 -0
  227. package/dist/src/visual/config-page/DashboardDesign.js +606 -0
  228. package/dist/src/visual/config-page/DashboardGlobalConfig.js +6 -0
  229. package/dist/src/visual/config-page/DashboardGlobalConfig.vue.js +292 -0
  230. package/dist/src/visual/config-page/DashboardMobile.js +1115 -0
  231. package/dist/src/visual/config-page/DashboardSetting.js +86 -0
  232. package/dist/src/visual/config-page/PagePreview.js +8 -0
  233. package/dist/src/visual/config-page/PagePreview.vue.js +72 -0
  234. package/dist/src/visual/config-page/StyleConfig.js +979 -0
  235. package/dist/src/visual/config-page/VisualConfigPage.js +645 -0
  236. package/dist/src/visual/config-page/dashboard-theme-setting/Background.js +180 -0
  237. package/dist/src/visual/config-page/dashboard-theme-setting/Border.js +314 -0
  238. package/dist/src/visual/config-page/dashboard-theme-setting/Font.js +192 -0
  239. package/dist/src/visual/config-page/dashboard-theme-setting/Index.js +545 -0
  240. package/dist/src/visual/config-page/dashboard-theme-setting/Shadow.js +174 -0
  241. package/dist/src/visual/config-page/index.js +90 -0
  242. package/dist/src/visual/index.js +151 -0
  243. package/dist/src/visual/mixins/innerGridMixin.js +122 -0
  244. package/dist/src/visual/search/Filter.js +49 -0
  245. package/dist/src/visual/step/Index.js +8 -0
  246. package/dist/src/visual/step/Index.vue.js +485 -0
  247. package/dist/src/visual/step/Item.js +139 -0
  248. package/dist/src/visual/widgets/CardFormItemVisual.js +45 -0
  249. package/dist/src/visual/widgets/CarouselVisual.js +8 -0
  250. package/dist/src/visual/widgets/CarouselVisual.vue.js +303 -0
  251. package/dist/src/visual/widgets/CollapseVisual.js +8 -0
  252. package/dist/src/visual/widgets/CollapseVisual.vue.js +202 -0
  253. package/dist/src/visual/widgets/DropdownVisual.js +8 -0
  254. package/dist/src/visual/widgets/DropdownVisual.vue.js +955 -0
  255. package/dist/src/visual/widgets/LayoutConfig.js +8 -0
  256. package/dist/src/visual/widgets/LayoutConfig.vue.js +168 -0
  257. package/dist/src/visual/widgets/ListVisual.js +349 -0
  258. package/dist/src/visual/widgets/MEntityListFindVisual.js +76 -0
  259. package/dist/src/visual/widgets/ProcessFormItemVisual.js +5 -0
  260. package/dist/src/visual/widgets/ProcessFormItemVisual.vue.js +45 -0
  261. package/dist/src/visual/widgets/TabsConfig.js +8 -0
  262. package/dist/src/visual/widgets/TabsConfig.vue.js +343 -0
  263. package/dist/style.css +9907 -0
  264. package/package.json +104 -3
  265. package/src/index.js +27 -0
  266. package/src/page-designer/PageConfigPreview.vue +103 -0
  267. package/src/page-designer/PageDesigner.vue +1017 -0
  268. package/src/page-designer/designer.js +1299 -0
  269. package/src/page-designer/index.js +38 -0
  270. package/src/page-designer/mixins/dragSourceMixin.js +113 -0
  271. package/src/page-designer/page-variable-panel/JsonEditor.vue +109 -0
  272. package/src/page-designer/page-variable-panel/PageVariablePanel.vue +781 -0
  273. package/src/page-designer/page-variable-panel/index.js +6 -0
  274. package/src/page-designer/page-variable-panel/jsonlint.js +2 -0
  275. package/src/page-designer/previews/add-form/Preview.vue +331 -0
  276. package/src/page-designer/previews/add-form-item/Preview.vue +167 -0
  277. package/src/page-designer/previews/button/Preview.vue +27 -0
  278. package/src/page-designer/previews/card/Preview.vue +78 -0
  279. package/src/page-designer/previews/carousel/CarouselItemPreview.vue +32 -0
  280. package/src/page-designer/previews/carousel/Preview.vue +36 -0
  281. package/src/page-designer/previews/collapse/CollapseItemPreview.vue +136 -0
  282. package/src/page-designer/previews/collapse/Preview.vue +28 -0
  283. package/src/page-designer/previews/dropdown/Preview.vue +21 -0
  284. package/src/page-designer/previews/entity-list/Preview.vue +382 -0
  285. package/src/page-designer/previews/entity-sub-list/Preview.vue +283 -0
  286. package/src/page-designer/previews/entity-virtual-list/Preview.vue +14 -0
  287. package/src/page-designer/previews/form-field/preview/Checkbox.vue +57 -0
  288. package/src/page-designer/previews/form-field/preview/Date.vue +56 -0
  289. package/src/page-designer/previews/form-field/preview/Input.vue +53 -0
  290. package/src/page-designer/previews/form-field/preview/InputNumber.vue +53 -0
  291. package/src/page-designer/previews/form-field/preview/Object.vue +53 -0
  292. package/src/page-designer/previews/form-field/preview/Radio.vue +69 -0
  293. package/src/page-designer/previews/form-field/preview/Select.vue +55 -0
  294. package/src/page-designer/previews/form-field/preview/Textarea.vue +57 -0
  295. package/src/page-designer/previews/grid/Preview.vue +156 -0
  296. package/src/page-designer/previews/html/Preview.vue +11 -0
  297. package/src/page-designer/previews/icon/Preview.vue +12 -0
  298. package/src/page-designer/previews/image/Preview.vue +37 -0
  299. package/src/page-designer/previews/index.js +74 -0
  300. package/src/page-designer/previews/layout/ColumnPreview.vue +89 -0
  301. package/src/page-designer/previews/layout/Preview.vue +96 -0
  302. package/src/page-designer/previews/num/Preview.vue +100 -0
  303. package/src/page-designer/previews/page-tabs/Preview.vue +53 -0
  304. package/src/page-designer/previews/step/Preview.vue +190 -0
  305. package/src/page-designer/previews/tabs/Preview.vue +66 -0
  306. package/src/page-designer/previews/tabs/tab-pane/Preview.vue +32 -0
  307. package/src/page-designer/previews/text/Preview.vue +26 -0
  308. package/src/page-designer/previews/text-editor/Preview.vue +14 -0
  309. package/src/page-designer/previews/video/Preview.vue +9 -0
  310. package/src/page-designer/setting-panel/Advance.vue +175 -0
  311. package/src/page-designer/setting-panel/CodeEditor.vue +88 -0
  312. package/src/page-designer/setting-panel/Property.vue +163 -0
  313. package/src/page-designer/setting-panel/Setting.vue +271 -0
  314. package/src/page-designer/setting-panel/Style.vue +1096 -0
  315. package/src/page-designer/setting-panel/css-editor/CssEditor.vue +93 -0
  316. package/src/page-designer/setting-panel/css-editor/css-hint.js +58 -0
  317. package/src/page-designer/setting-panel/index.js +10 -0
  318. package/src/page-designer/template-attribute-panel/TemplateAttributePanel.vue +383 -0
  319. package/src/page-designer/template-attribute-panel/index.js +2 -0
  320. package/src/page-designer/template-library/Library.vue +153 -0
  321. package/src/page-designer/template-library/index.js +4 -0
  322. package/src/page-designer/widget-library/Base.vue +156 -0
  323. package/src/page-designer/widget-library/Library.vue +282 -0
  324. package/src/page-designer/widget-library/index.js +6 -0
  325. package/src/page-designer/widget-preview/Container.vue +89 -0
  326. package/src/page-designer/widget-preview/DragGhost.vue +83 -0
  327. package/src/page-designer/widget-preview/DropZoneOverlay.vue +51 -0
  328. package/src/page-designer/widget-preview/HoverOverlay.vue +85 -0
  329. package/src/page-designer/widget-preview/Mixin.js +285 -0
  330. package/src/page-designer/widget-preview/Placeholder.vue +22 -0
  331. package/src/page-designer/widget-preview/Preview.vue +322 -0
  332. package/src/page-designer/widget-preview/PreviewItem.vue +162 -0
  333. package/src/page-designer/widget-preview/SelectedOverlay.vue +340 -0
  334. package/src/page-designer/widget-preview/Template.vue +77 -0
  335. package/src/page-designer/widget-preview/WidgetWrapper.vue +197 -0
  336. package/src/page-designer/widget-preview/directive.js +258 -0
  337. package/src/page-designer/widget-preview/dropPosition.js +51 -0
  338. package/src/page-designer/widget-preview/index.js +23 -0
  339. package/src/page-designer/widget-preview/overlayPositionMixin.js +88 -0
  340. package/src/page-designer/widget-preview/resolvePreviewName.js +33 -0
  341. package/src/page-designer/widget-tree/Item.vue +719 -0
  342. package/src/page-designer/widget-tree/Tree.vue +995 -0
  343. package/src/page-designer/widget-tree/index.js +6 -0
  344. package/src/visual/AddForm.vue +172 -0
  345. package/src/visual/AddFormItem.vue +482 -0
  346. package/src/visual/AppIndex.vue +245 -0
  347. package/src/visual/ApplyForm.vue +140 -0
  348. package/src/visual/AttributeList.vue +344 -0
  349. package/src/visual/BasePage.vue +76 -0
  350. package/src/visual/Button.vue +80 -0
  351. package/src/visual/CardNum.vue +73 -0
  352. package/src/visual/CategoryList.vue +563 -0
  353. package/src/visual/Chart.vue +29 -0
  354. package/src/visual/ChartNew.vue +49 -0
  355. package/src/visual/CheckForm.vue +106 -0
  356. package/src/visual/ClientList.vue +42 -0
  357. package/src/visual/CodeManage.vue +116 -0
  358. package/src/visual/Component.vue +1342 -0
  359. package/src/visual/ComponentList.vue +280 -0
  360. package/src/visual/Config.vue +881 -0
  361. package/src/visual/ConfigItem.vue +218 -0
  362. package/src/visual/ConfigSelectItems.vue +445 -0
  363. package/src/visual/CreatePage.vue +389 -0
  364. package/src/visual/DashboardDiv.vue +197 -0
  365. package/src/visual/DashboardTabs.vue +118 -0
  366. package/src/visual/DashboardWidget.vue +55 -0
  367. package/src/visual/DblogList.vue +84 -0
  368. package/src/visual/EntityAddPage.vue +52 -0
  369. package/src/visual/EntityApplyPage.vue +57 -0
  370. package/src/visual/EntityCardList.vue +449 -0
  371. package/src/visual/EntityCheckPage.vue +69 -0
  372. package/src/visual/EntityFindPage.vue +55 -0
  373. package/src/visual/EntityList.vue +838 -0
  374. package/src/visual/EntityListPage.vue +97 -0
  375. package/src/visual/EntityNoSubmitSubList.vue +273 -0
  376. package/src/visual/EntityRightSubList.vue +32 -0
  377. package/src/visual/EntitySubAdd.vue +11 -0
  378. package/src/visual/EntitySubGridItem.vue +67 -0
  379. package/src/visual/EntitySubList.vue +440 -0
  380. package/src/visual/EntityTreeFindPage.vue +36 -0
  381. package/src/visual/EntityTreeManage.vue +50 -0
  382. package/src/visual/EntityTreePage.vue +45 -0
  383. package/src/visual/ExcelPreview.vue +11 -0
  384. package/src/visual/FormField.vue +113 -0
  385. package/src/visual/HeaderNew.vue +176 -0
  386. package/src/visual/Html.vue +104 -0
  387. package/src/visual/Import.vue +55 -0
  388. package/src/visual/InterfaceSubList.vue +23 -0
  389. package/src/visual/ListFirst.vue +614 -0
  390. package/src/visual/MEntityAddPage.vue +71 -0
  391. package/src/visual/MEntityList.vue +488 -0
  392. package/src/visual/MEntityListPage.vue +46 -0
  393. package/src/visual/MEntitySubList.vue +237 -0
  394. package/src/visual/MetaList.vue +24 -0
  395. package/src/visual/ModuleIndexPage.vue +70 -0
  396. package/src/visual/ModuleList.vue +46 -0
  397. package/src/visual/NavAddForm.vue +177 -0
  398. package/src/visual/NavFormCatalogItem.vue +47 -0
  399. package/src/visual/NumItem.vue +69 -0
  400. package/src/visual/NumStatistic.vue +242 -0
  401. package/src/visual/OrgChart.vue +113 -0
  402. package/src/visual/PageCatalog.vue +26 -0
  403. package/src/visual/PageConfig.vue +278 -0
  404. package/src/visual/PageTabs.vue +55 -0
  405. package/src/visual/Progress.vue +39 -0
  406. package/src/visual/ProgressItem.vue +43 -0
  407. package/src/visual/SystemManager.vue +80 -0
  408. package/src/visual/Title.vue +44 -0
  409. package/src/visual/TodoList.vue +18 -0
  410. package/src/visual/UserFormItem.vue +49 -0
  411. package/src/visual/UserManage.vue +36 -0
  412. package/src/visual/chart/CircularPie.vue +7 -0
  413. package/src/visual/chart/Column.vue +73 -0
  414. package/src/visual/chart/HoriColumn.vue +7 -0
  415. package/src/visual/chart/Line.vue +7 -0
  416. package/src/visual/chart/Pie.vue +7 -0
  417. package/src/visual/config/Background.vue +398 -0
  418. package/src/visual/config/Chart.vue +139 -0
  419. package/src/visual/config/Checkbox.vue +64 -0
  420. package/src/visual/config/Color.vue +40 -0
  421. package/src/visual/config/DesignReport.vue +20 -0
  422. package/src/visual/config/Event.vue +220 -0
  423. package/src/visual/config/Field.vue +597 -0
  424. package/src/visual/config/Font.vue +149 -0
  425. package/src/visual/config/FormItem.vue +25 -0
  426. package/src/visual/config/Function.vue +78 -0
  427. package/src/visual/config/Html.vue +98 -0
  428. package/src/visual/config/Image.vue +132 -0
  429. package/src/visual/config/Input.vue +712 -0
  430. package/src/visual/config/LazyDialog.vue +44 -0
  431. package/src/visual/config/List.vue +68 -0
  432. package/src/visual/config/ListField.vue +1714 -0
  433. package/src/visual/config/MField.vue +601 -0
  434. package/src/visual/config/Number.vue +41 -0
  435. package/src/visual/config/Object.vue +177 -0
  436. package/src/visual/config/Operate.vue +1083 -0
  437. package/src/visual/config/OperateItem.vue +917 -0
  438. package/src/visual/config/Options.vue +330 -0
  439. package/src/visual/config/OrderField.vue +587 -0
  440. package/src/visual/config/Page.vue +45 -0
  441. package/src/visual/config/Params.vue +228 -0
  442. package/src/visual/config/Radio.vue +93 -0
  443. package/src/visual/config/Row.vue +78 -0
  444. package/src/visual/config/Scope.vue +363 -0
  445. package/src/visual/config/Select.vue +93 -0
  446. package/src/visual/config/Switch.vue +36 -0
  447. package/src/visual/config/Textarea.vue +754 -0
  448. package/src/visual/config/Tree.vue +135 -0
  449. package/src/visual/config/remote-cache.js +35 -0
  450. package/src/visual/config/show-condition.js +21 -0
  451. package/src/visual/config/variable-sources.js +27 -0
  452. package/src/visual/config/wait-ref.js +17 -0
  453. package/src/visual/config-page/ComponentLibrary.vue +220 -0
  454. package/src/visual/config-page/ComponentLibraryDialog.vue +262 -0
  455. package/src/visual/config-page/ComponentList.vue +580 -0
  456. package/src/visual/config-page/ComponentPreview.vue +206 -0
  457. package/src/visual/config-page/ConfigOption.vue +16 -0
  458. package/src/visual/config-page/ConfigPanel.vue +301 -0
  459. package/src/visual/config-page/Dashboard.vue +2331 -0
  460. package/src/visual/config-page/DashboardDesign.vue +656 -0
  461. package/src/visual/config-page/DashboardGlobalConfig.vue +158 -0
  462. package/src/visual/config-page/DashboardMobile.vue +1118 -0
  463. package/src/visual/config-page/DashboardSetting.vue +47 -0
  464. package/src/visual/config-page/PagePreview.vue +105 -0
  465. package/src/visual/config-page/StyleConfig.vue +656 -0
  466. package/src/visual/config-page/VisualConfigPage.vue +746 -0
  467. package/src/visual/config-page/dashboard-theme-setting/Background.vue +98 -0
  468. package/src/visual/config-page/dashboard-theme-setting/Border.vue +185 -0
  469. package/src/visual/config-page/dashboard-theme-setting/Font.vue +101 -0
  470. package/src/visual/config-page/dashboard-theme-setting/Index.vue +471 -0
  471. package/src/visual/config-page/dashboard-theme-setting/Shadow.vue +102 -0
  472. package/src/visual/config-page/index.js +93 -0
  473. package/src/visual/index.js +23 -0
  474. package/src/visual/mixins/innerGridMixin.js +128 -0
  475. package/src/visual/search/Filter.vue +50 -0
  476. package/src/visual/step/Index.vue +361 -0
  477. package/src/visual/step/Item.vue +140 -0
  478. package/src/visual/widgets/CardFormItemVisual.vue +46 -0
  479. package/src/visual/widgets/CarouselVisual.vue +291 -0
  480. package/src/visual/widgets/CollapseVisual.vue +203 -0
  481. package/src/visual/widgets/DropdownVisual.vue +541 -0
  482. package/src/visual/widgets/LayoutConfig.vue +186 -0
  483. package/src/visual/widgets/ListVisual.vue +349 -0
  484. package/src/visual/widgets/MEntityListFindVisual.vue +77 -0
  485. package/src/visual/widgets/ProcessFormItemVisual.vue +58 -0
  486. package/src/visual/widgets/TabsConfig.vue +266 -0
  487. package/types/index.d.ts +22 -0
  488. package/types/page-designer.d.ts +3 -0
  489. package/types/visual-component.d.ts +1 -0
  490. package/types/visual-entity-list.d.ts +1 -0
  491. package/types/visual-entity-sub-list.d.ts +1 -0
@@ -0,0 +1,1120 @@
1
+ import '../../style.css';
2
+ import { cloneDeep, isEmpty } from "lodash-es";
3
+ import { effectScope, reactive, toRaw, markRaw, watch } from "vue";
4
+ import util from "@epxing/core/src/runtime-utils/util";
5
+ import storage from "@epxing/utils/src/storage";
6
+ const { genId } = util;
7
+ const defaultPageConfig = {};
8
+ function getWidgetSlots(widget) {
9
+ const { slots } = widget || {};
10
+ if (!slots || typeof slots !== "object") return [];
11
+ return Object.keys(slots).filter((name) => slots[name] && slots[name].id).map((name) => ({ name, widget: slots[name] }));
12
+ }
13
+ function getWidgetChildren(widget) {
14
+ const { items = [] } = widget || {};
15
+ return [...items, ...getWidgetSlots(widget).map((slot) => slot.widget)];
16
+ }
17
+ function createDesigner(vueInstance) {
18
+ const designerEvents = /* @__PURE__ */ new Map();
19
+ const widgetInfoIndex = /* @__PURE__ */ new Map();
20
+ const templateIndex = /* @__PURE__ */ new Map();
21
+ let widgetIndex = /* @__PURE__ */ new Map();
22
+ let indexDirty = true;
23
+ const rebuildIndex = () => {
24
+ widgetIndex = /* @__PURE__ */ new Map();
25
+ const walk = (list, parent, slotName) => {
26
+ for (const item of toRaw(list) || []) {
27
+ const raw = toRaw(item);
28
+ if (!raw || !raw.id) continue;
29
+ if (!widgetIndex.has(raw.id)) widgetIndex.set(raw.id, { widget: raw, parent, slotName });
30
+ walk(raw.items, raw, "");
31
+ for (const slot of getWidgetSlots(raw)) walk([slot.widget], raw, slot.name);
32
+ }
33
+ };
34
+ walk(state.widgetList, null, "");
35
+ indexDirty = false;
36
+ };
37
+ const lookup = (id) => {
38
+ if (indexDirty) rebuildIndex();
39
+ return widgetIndex.get(id);
40
+ };
41
+ const asReactive = (obj) => obj ? reactive(obj) : obj;
42
+ let saveTimer = null;
43
+ const scope = effectScope(true);
44
+ const state = reactive({
45
+ version: "2.0",
46
+ mode: "page",
47
+ terminal: "pc",
48
+ page: {},
49
+ // 页面
50
+ widgetList: [],
51
+ // 组件列表
52
+ widgetConfig: {},
53
+ // 组件配置
54
+ templateLibrary: [],
55
+ // 模板列表
56
+ templateAttributeTree: [],
57
+ // 模板配置参数
58
+ pageConfig: {},
59
+ // 页面配置
60
+ allWidgets: [],
61
+ formConfig: { cssCode: "" },
62
+ selectedId: null,
63
+ selectedWidget: null,
64
+ selectedWidgetName: null,
65
+ // 选中组件名称(唯一)
66
+ // 悬浮组件状态
67
+ hoverWidgetId: null,
68
+ hoverWidget: null,
69
+ hoverParentWidget: null,
70
+ // 拖拽时当前悬停的放置目标 { type: 'root' | 'container', widgetId: string | null }
71
+ dragOverTarget: null,
72
+ // 当前放置目标对应的 DOM 元素,用于独立浮层定位
73
+ dragOverTargetElement: null,
74
+ vueInstance,
75
+ formWidget: null,
76
+ // 表单设计容器
77
+ cssClassList: [],
78
+ // 自定义样式列表
79
+ historyData: {
80
+ index: -1,
81
+ // index: 0,
82
+ maxStep: 20,
83
+ steps: []
84
+ },
85
+ initDesigner(resetFormJson) {
86
+ this.widgetList = [];
87
+ this.widgetConfig = {};
88
+ this.pageConfig = cloneDeep(defaultPageConfig);
89
+ if (!resetFormJson) {
90
+ this.initHistoryData();
91
+ }
92
+ },
93
+ clearDesigner(skipHistoryChange) {
94
+ const emptyWidgetListFlag = this.widgetList.length === 0;
95
+ this.widgetList = [];
96
+ this.widgetConfig = {};
97
+ this.selectedId = null;
98
+ this.selectedWidget = {};
99
+ this.pageConfig = cloneDeep(defaultPageConfig);
100
+ if (skipHistoryChange) ;
101
+ else if (!emptyWidgetListFlag) {
102
+ this.emitHistoryChange();
103
+ } else {
104
+ this.saveCurrentHistoryStep();
105
+ }
106
+ },
107
+ initWidgetList(componentList) {
108
+ this.allWidgets = markRaw([...componentList]);
109
+ widgetInfoIndex.clear();
110
+ for (const con of this.allWidgets) {
111
+ if (con && con.CODE) widgetInfoIndex.set(con.CODE, con);
112
+ }
113
+ },
114
+ initTemplateLibrary(templateLibrary) {
115
+ this.templateLibrary = markRaw(templateLibrary || []);
116
+ templateIndex.clear();
117
+ for (const tpl of this.templateLibrary) {
118
+ if (tpl && tpl.ID) templateIndex.set(tpl.ID, tpl);
119
+ }
120
+ },
121
+ setTemplateAttributeTree(data) {
122
+ this.templateAttributeTree = data;
123
+ },
124
+ loadFormJson(page) {
125
+ this.page = page;
126
+ const { isComponent, isTemplate, config: formJson = {} } = page;
127
+ if (isComponent) this.mode = "component";
128
+ if (isTemplate) this.mode = "template";
129
+ let modifiedFlag = false;
130
+ if (formJson) {
131
+ const { items: widgetList = [], itemConfigs: widgetConfig = {}, ...pageConfig } = formJson;
132
+ if (widgetList) {
133
+ this.widgetList = widgetList;
134
+ this.widgetConfig = widgetConfig;
135
+ modifiedFlag = true;
136
+ }
137
+ if (pageConfig) {
138
+ this.pageConfig = { ...pageConfig };
139
+ modifiedFlag = true;
140
+ }
141
+ if (pageConfig.version !== this.version) {
142
+ this.upgradePageConfig();
143
+ this.upgradeWidgetConfig();
144
+ }
145
+ }
146
+ this.initHistoryData();
147
+ if (modifiedFlag) {
148
+ this.emitEvent("form-json-imported", []);
149
+ }
150
+ return modifiedFlag;
151
+ },
152
+ setSelected(selected) {
153
+ if (!selected) {
154
+ this.clearSelected();
155
+ return;
156
+ }
157
+ this.selectedWidget = selected;
158
+ if (selected.id) {
159
+ this.selectedId = selected.id;
160
+ }
161
+ },
162
+ // 根据组件 id 设置悬浮组件
163
+ setHoverById(id) {
164
+ if (!id) {
165
+ this.clearHover();
166
+ return;
167
+ }
168
+ const widget = this.getWidgetItemById(id);
169
+ if (!widget) {
170
+ this.clearHover();
171
+ return;
172
+ }
173
+ const parentWidget = this.findParentWidget(id);
174
+ this.hoverWidgetId = id;
175
+ this.hoverWidget = widget;
176
+ this.hoverParentWidget = parentWidget || null;
177
+ this.emitEvent("hover-change", {
178
+ widget,
179
+ parentWidget: this.hoverParentWidget
180
+ });
181
+ },
182
+ // 清理悬浮组件状态
183
+ clearHover() {
184
+ this.hoverWidgetId = null;
185
+ this.hoverWidget = null;
186
+ this.hoverParentWidget = null;
187
+ this.emitEvent("hover-change", {
188
+ widget: null,
189
+ parentWidget: null
190
+ });
191
+ },
192
+ setDragOverTarget(target) {
193
+ this.dragOverTarget = target;
194
+ },
195
+ setDragOverTargetElement(el) {
196
+ this.dragOverTargetElement = el;
197
+ },
198
+ clearDragOverTarget() {
199
+ this.dragOverTarget = null;
200
+ this.dragOverTargetElement = null;
201
+ },
202
+ // 拖拽插入位置线 { top, left, width } 视口坐标,用于 fixed 定位
203
+ dragInsertLine: null,
204
+ setDragInsertLine(rect) {
205
+ this.dragInsertLine = rect;
206
+ },
207
+ clearDragInsertLine() {
208
+ this.dragInsertLine = null;
209
+ },
210
+ // 预览区域拖拽状态(用于同步到大纲树)
211
+ previewDragTarget: null,
212
+ // { widgetId, index, position }
213
+ previewDragTargetThrottle: null,
214
+ // 节流定时器
215
+ setPreviewDragTarget(target) {
216
+ const current = this.previewDragTarget;
217
+ const isSame = current && target && current.widgetId === target.widgetId && current.index === target.index && current.position === target.position;
218
+ if (isSame) return;
219
+ if (this.previewDragTargetThrottle) {
220
+ clearTimeout(this.previewDragTargetThrottle);
221
+ }
222
+ this.previewDragTargetThrottle = setTimeout(() => {
223
+ this.previewDragTarget = target;
224
+ this.previewDragTargetThrottle = null;
225
+ }, 16);
226
+ },
227
+ clearPreviewDragTarget() {
228
+ if (this.previewDragTargetThrottle) {
229
+ clearTimeout(this.previewDragTargetThrottle);
230
+ this.previewDragTargetThrottle = null;
231
+ }
232
+ this.previewDragTarget = null;
233
+ },
234
+ // 统一的拖拽状态管理
235
+ dragState: {
236
+ isDragging: false,
237
+ // 是否正在拖拽
238
+ isNativeDragging: false,
239
+ // 是否是原生 HTML5 拖拽
240
+ dragSource: null,
241
+ // 拖拽来源:'library' | 'preview' | 'template' | 'tree'
242
+ dragData: null,
243
+ // 拖拽数据
244
+ ghostVisible: false,
245
+ // 拖拽悬浮窗是否可见
246
+ ghostTitle: "",
247
+ // 悬浮窗标题
248
+ ghostIcon: "",
249
+ // 悬浮窗图标
250
+ ghostPosition: { x: 0, y: 0 }
251
+ // 悬浮窗位置
252
+ },
253
+ // 开始拖拽
254
+ startDrag(options = {}) {
255
+ const { source, data, title, icon, x, y, isNative = false } = options;
256
+ this.dragState.isDragging = true;
257
+ this.dragState.isNativeDragging = isNative;
258
+ this.dragState.dragSource = source;
259
+ this.dragState.dragData = data;
260
+ this.dragState.ghostVisible = true;
261
+ this.dragState.ghostTitle = title || "";
262
+ this.dragState.ghostIcon = icon || "";
263
+ this.dragState.ghostPosition = { x: x || 0, y: y || 0 };
264
+ if (source === "preview" && this.vueInstance) {
265
+ this.emitEvent("close-left-panel");
266
+ }
267
+ this.emitEvent("drag-state-change", { ...this.dragState });
268
+ },
269
+ // 更新拖拽悬浮窗位置
270
+ updateDragGhostPosition(x, y) {
271
+ if (this.dragState.isDragging) {
272
+ this.dragState.ghostPosition = { x, y };
273
+ this.emitEvent("drag-ghost-move", { x, y });
274
+ }
275
+ },
276
+ // 结束拖拽
277
+ endDrag() {
278
+ this.dragState.isDragging = false;
279
+ this.dragState.isNativeDragging = false;
280
+ this.dragState.dragSource = null;
281
+ this.dragState.dragData = null;
282
+ this.dragState.ghostVisible = false;
283
+ this.dragState.ghostTitle = "";
284
+ this.dragState.ghostIcon = "";
285
+ this.dragState.ghostPosition = { x: 0, y: 0 };
286
+ this.clearDragOverTarget();
287
+ this.clearDragInsertLine();
288
+ this.clearPreviewDragTarget();
289
+ this.emitEvent("drag-state-change", { ...this.dragState });
290
+ },
291
+ // 获取当前拖拽状态
292
+ getDragState() {
293
+ return { ...this.dragState };
294
+ },
295
+ // ========== 统一的拖拽处理方法 ==========
296
+ /**
297
+ * 解析拖拽数据
298
+ * @param {DataTransfer} dataTransfer - 拖拽事件的 dataTransfer 对象
299
+ * @returns {Object|null} 解析后的拖拽数据 { type, payload }
300
+ */
301
+ parseDragData(dataTransfer) {
302
+ if (!dataTransfer || !dataTransfer.types || !dataTransfer.types.includes("text/plain")) {
303
+ return null;
304
+ }
305
+ try {
306
+ const raw = dataTransfer.getData("text/plain");
307
+ if (!raw) return null;
308
+ if (raw.startsWith("page-designer-widget:")) {
309
+ const payload = JSON.parse(raw.slice("page-designer-widget:".length));
310
+ return { type: "library", payload };
311
+ }
312
+ if (raw.startsWith("page-designer-template:")) {
313
+ const payload = JSON.parse(raw.slice("page-designer-template:".length));
314
+ return { type: "template", payload };
315
+ }
316
+ const data = JSON.parse(raw);
317
+ if (data && data.type === "widget-reorder") {
318
+ return { type: "reorder", payload: data };
319
+ }
320
+ return null;
321
+ } catch (e) {
322
+ return null;
323
+ }
324
+ },
325
+ /**
326
+ * 处理拖拽放置
327
+ * @param {Object} options - 放置选项
328
+ * @param {DataTransfer} options.dataTransfer - 拖拽数据
329
+ * @param {Object} options.target - 放置目标 { type: 'root'|'container'|'slot', widgetId, index, slotName }
330
+ * @returns {boolean} 是否成功处理
331
+ */
332
+ handleDrop(options = {}) {
333
+ const { dataTransfer, target } = options;
334
+ if (!dataTransfer || !target) {
335
+ return false;
336
+ }
337
+ const dragData = this.parseDragData(dataTransfer);
338
+ if (!dragData) {
339
+ return false;
340
+ }
341
+ const { type, payload } = dragData;
342
+ switch (type) {
343
+ case "library":
344
+ return this.handleLibraryDrop(payload, target);
345
+ case "template":
346
+ return this.handleTemplateDrop(payload, target);
347
+ case "reorder":
348
+ return this.handleReorderDrop(payload, target);
349
+ default:
350
+ return false;
351
+ }
352
+ },
353
+ /**
354
+ * 处理组件库拖拽放置
355
+ * @param {Object} payload - 组件数据 { code, title, custom }
356
+ * @param {Object} target - 放置目标
357
+ */
358
+ handleLibraryDrop(payload, target) {
359
+ const { code, title, custom } = payload;
360
+ if (!code) return false;
361
+ const widgetInfo = this.getWidgetByType(code) || {};
362
+ const widget = {
363
+ id: this.genId(code),
364
+ contentType: code,
365
+ title: title || widgetInfo.TITLE
366
+ };
367
+ if (custom) widget.type = "custom";
368
+ if (widgetInfo.CODE === "chart") {
369
+ this.updateWidgetConfig(widget.id, { metaId: this.page.metaId });
370
+ }
371
+ this.insertWidget(widget, target);
372
+ this.setSelected(widget);
373
+ this.emitHistoryChange();
374
+ return true;
375
+ },
376
+ /**
377
+ * 处理模板库拖拽放置
378
+ * @param {Object} payload - 模板数据 { items, itemConfigs, templateJs }
379
+ * @param {Object} target - 放置目标
380
+ */
381
+ handleTemplateDrop(payload, target) {
382
+ const { items, itemConfigs, templateJs } = payload;
383
+ if (!items || !items.length) return false;
384
+ if (target.type === "slot" && items.length > 1) {
385
+ this.vueInstance && this.vueInstance.$message && this.vueInstance.$message("插槽只能放置一个组件");
386
+ return false;
387
+ }
388
+ this.insertWidgets(items, target);
389
+ this.mergeWidgetConfig(itemConfigs);
390
+ if (templateJs) {
391
+ this.mergeTemplateJs(templateJs);
392
+ }
393
+ this.setSelected(items[0]);
394
+ this.emitHistoryChange();
395
+ return true;
396
+ },
397
+ /**
398
+ * 处理组件重排序拖拽放置
399
+ * @param {Object} payload - 拖拽数据 { widgetId, parentWidgetId }
400
+ * @param {Object} target - 放置目标
401
+ */
402
+ handleReorderDrop(payload, target) {
403
+ const { widgetId, parentWidgetId } = payload;
404
+ if (!widgetId) {
405
+ return false;
406
+ }
407
+ const sourceWidget = this.getWidgetItemById(widgetId);
408
+ if (!sourceWidget) {
409
+ return false;
410
+ }
411
+ const sourceParentId = parentWidgetId || null;
412
+ const targetParentId = target.widgetId || null;
413
+ if (target.type === "slot") {
414
+ if (this.isDescendantWidget(target.widgetId, sourceWidget)) return false;
415
+ this.removeWidgetFromParent(sourceWidget);
416
+ if (!this.insertWidget(sourceWidget, target)) return false;
417
+ this.setSelected(sourceWidget);
418
+ this.emitHistoryChange();
419
+ return true;
420
+ }
421
+ if (this.findWidgetSlot(widgetId)) {
422
+ return this.moveWidgetToAnotherContainer(sourceWidget, sourceParentId, target);
423
+ }
424
+ if (sourceParentId === targetParentId) {
425
+ return this.moveWidgetInSameContainer(sourceWidget, target);
426
+ }
427
+ return this.moveWidgetToAnotherContainer(sourceWidget, sourceParentId, target);
428
+ },
429
+ /**
430
+ * 在同一容器内移动组件
431
+ * @param {Object} widget - 要移动的组件
432
+ * @param {Object} target - 目标位置
433
+ */
434
+ moveWidgetInSameContainer(widget, target) {
435
+ const list = target.widgetId ? this.getWidgetItemById(target.widgetId).items : this.widgetList;
436
+ if (!list) {
437
+ return false;
438
+ }
439
+ const sourceIndex = list.findIndex((w) => w.id === widget.id);
440
+ if (sourceIndex === -1) {
441
+ return false;
442
+ }
443
+ let targetIndex = target.index;
444
+ if (targetIndex > sourceIndex) {
445
+ targetIndex = targetIndex + 1;
446
+ }
447
+ if (sourceIndex === targetIndex || sourceIndex + 1 === targetIndex) {
448
+ return false;
449
+ }
450
+ list.splice(sourceIndex, 1);
451
+ if (targetIndex > sourceIndex) {
452
+ targetIndex = targetIndex - 1;
453
+ }
454
+ list.splice(targetIndex, 0, widget);
455
+ if (target.widgetId) {
456
+ this.updateWidget(target.widgetId, { items: [...list] });
457
+ } else {
458
+ this.widgetList = [...list];
459
+ }
460
+ this.setSelected(widget);
461
+ this.emitHistoryChange();
462
+ return true;
463
+ },
464
+ /**
465
+ * 跨容器移动组件
466
+ * @param {Object} widget - 要移动的组件
467
+ * @param {string} sourceParentId - 源容器 ID
468
+ * @param {Object} target - 目标位置
469
+ */
470
+ moveWidgetToAnotherContainer(widget, sourceParentId, target) {
471
+ const sourceSlot = this.findWidgetSlot(widget.id);
472
+ if (sourceSlot) {
473
+ this.clearWidgetSlot(sourceSlot.parent, sourceSlot.slotName);
474
+ } else if (sourceParentId) {
475
+ const sourceParent = this.getWidgetItemById(sourceParentId);
476
+ if (sourceParent && sourceParent.items) {
477
+ const sourceList = [...sourceParent.items];
478
+ const sourceIndex = sourceList.findIndex((w) => w.id === widget.id);
479
+ if (sourceIndex !== -1) {
480
+ sourceList.splice(sourceIndex, 1);
481
+ this.updateWidget(sourceParent.id, { items: sourceList });
482
+ }
483
+ }
484
+ } else {
485
+ const rootList = [...this.widgetList];
486
+ const sourceIndex = rootList.findIndex((w) => w.id === widget.id);
487
+ if (sourceIndex !== -1) {
488
+ rootList.splice(sourceIndex, 1);
489
+ this.widgetList = rootList;
490
+ }
491
+ }
492
+ this.insertWidget(widget, target);
493
+ this.setSelected(widget);
494
+ this.emitHistoryChange();
495
+ return true;
496
+ },
497
+ /**
498
+ * 插入单个组件到指定位置
499
+ * @param {Object} widget - 要插入的组件
500
+ * @param {Object} target - 目标位置 { type: 'root'|'container'|'slot', widgetId, index, slotName }
501
+ */
502
+ insertWidget(widget, target) {
503
+ if (target.type === "slot") {
504
+ return this.setWidgetSlot(target.widgetId, target.slotName, widget);
505
+ }
506
+ if (target.type === "root" || !target.widgetId) {
507
+ const list = [...this.widgetList];
508
+ list.splice(target.index, 0, widget);
509
+ this.widgetList = list;
510
+ } else {
511
+ const container = this.getWidgetItemById(target.widgetId);
512
+ if (!container) return false;
513
+ if (!container.items) {
514
+ this.updateWidget(container.id, { items: [] });
515
+ }
516
+ const list = [...container.items || []];
517
+ list.splice(target.index, 0, widget);
518
+ this.updateWidget(container.id, { items: list });
519
+ }
520
+ return true;
521
+ },
522
+ /**
523
+ * 插入多个组件到指定位置
524
+ * @param {Array} widgets - 要插入的组件数组
525
+ * @param {Object} target - 目标位置
526
+ */
527
+ insertWidgets(widgets, target) {
528
+ if (!widgets || !widgets.length) return false;
529
+ if (target.type === "slot") {
530
+ return this.insertWidget(widgets[0], target);
531
+ }
532
+ if (target.type === "root" || !target.widgetId) {
533
+ const list = [...this.widgetList];
534
+ list.splice(target.index, 0, ...widgets);
535
+ this.widgetList = list;
536
+ } else {
537
+ const container = this.getWidgetItemById(target.widgetId);
538
+ if (!container) return false;
539
+ if (!container.items) {
540
+ this.updateWidget(container.id, { items: [] });
541
+ }
542
+ const list = [...container.items || []];
543
+ list.splice(target.index, 0, ...widgets);
544
+ this.updateWidget(container.id, { items: list });
545
+ }
546
+ return true;
547
+ },
548
+ /**
549
+ * 合并模板 JS 到页面 JS
550
+ * @param {string} templateJs - 模板的 JS 代码
551
+ */
552
+ mergeTemplateJs(templateJs) {
553
+ let { JS = "" } = this.pageConfig;
554
+ const result = JS.match(/export\sfunction\s(\w+)/g);
555
+ const events = [];
556
+ if (result) {
557
+ result.forEach((item) => {
558
+ events.push(item.replace(/export\sfunction\s/, ""));
559
+ });
560
+ }
561
+ const templateJsResult = templateJs.split(/export\s+function\s+/);
562
+ templateJsResult.forEach((item) => {
563
+ const funtionStr = item.replace(/\/\*(\n|.)+?\*\/[\n\s]+$/, "");
564
+ if (funtionStr.replace(/[\n\s]+/g, "").length > 0) {
565
+ const funtionName = funtionStr.split(/\s+\(/)[0];
566
+ if (![...new Set(events)].includes(funtionName)) {
567
+ JS += "export function " + funtionStr.replace(/^\w+/, funtionName);
568
+ }
569
+ }
570
+ });
571
+ this.updatePageConfig({ JS });
572
+ },
573
+ updateSelectedWidgetNameAndLabel(selectedWidget, newName, newLabel) {
574
+ this.selectedWidgetName = newName;
575
+ if (!!newLabel && Object.keys(selectedWidget.options).indexOf("label") > -1) {
576
+ selectedWidget.options.label = newLabel;
577
+ }
578
+ },
579
+ clearSelected() {
580
+ this.selectedId = null;
581
+ this.selectedWidgetName = null;
582
+ this.selectedWidget = null;
583
+ },
584
+ // 检查组件是否可以移动(只有字段组件可以拖入子表单)
585
+ checkWidgetMove(evt) {
586
+ var _a, _b;
587
+ if ((_a = evt.draggedContext) == null ? void 0 : _a.element) {
588
+ const wgCategory = evt.draggedContext.element.category;
589
+ if (((_b = evt.to) == null ? void 0 : _b.className) === "sub-form-table" && wgCategory === "container") {
590
+ return false;
591
+ }
592
+ }
593
+ return true;
594
+ },
595
+ // 检查字段组件是否可以移动
596
+ checkFieldMove(evt) {
597
+ var _a, _b;
598
+ if ((_a = evt.draggedContext) == null ? void 0 : _a.element) {
599
+ const wgType = String(evt.draggedContext.element.type);
600
+ if (((_b = evt.to) == null ? void 0 : _b.className) === "sub-form-table" && wgType === "slot") {
601
+ return false;
602
+ }
603
+ }
604
+ return true;
605
+ },
606
+ // 走索引 O(1);多个同 CODE 取最后一个(与原 forEach 覆盖语义一致),未命中返回 null
607
+ getWidgetByType(typeName, type) {
608
+ if (type === "template") return templateIndex.get(typeName) || null;
609
+ return widgetInfoIndex.get(typeName) || null;
610
+ },
611
+ getContainerByType(typeName) {
612
+ let foundCon = null;
613
+ this.allWidgets.forEach((con) => {
614
+ if (con.CONTAINER === "1" && !!con.type && con.type === typeName) {
615
+ foundCon = con;
616
+ }
617
+ });
618
+ return foundCon;
619
+ },
620
+ getFieldWidgetByType(typeName) {
621
+ let foundWidget = null;
622
+ this.allWidgets.forEach((widget) => {
623
+ if (widget.CONTAINER !== "1" && !!widget.type && widget.type === typeName) {
624
+ foundWidget = widget;
625
+ }
626
+ });
627
+ return foundWidget;
628
+ },
629
+ hasConfig(widget, configName) {
630
+ let originalWidget = null;
631
+ if (widget.CONTAINER === "1") {
632
+ originalWidget = this.getContainerByType(widget.type);
633
+ } else {
634
+ originalWidget = this.getFieldWidgetByType(widget.type);
635
+ }
636
+ if (!originalWidget || !originalWidget.options) {
637
+ return false;
638
+ }
639
+ return Object.keys(originalWidget.options).indexOf(configName) > -1;
640
+ },
641
+ // 走索引;未命中返回 undefined(与原递归实现一致)
642
+ getWidgetItemById(id) {
643
+ const entry = lookup(id);
644
+ return entry ? asReactive(entry.widget) : void 0;
645
+ },
646
+ /**
647
+ * 查找组件所在的插槽位置
648
+ * @param { String } targetId 组件 id
649
+ * @returns { { parent: Object, slotName: String } | null } 不在插槽里返回 null
650
+ */
651
+ findWidgetSlot(targetId) {
652
+ const entry = lookup(targetId);
653
+ return entry && entry.slotName ? { parent: asReactive(entry.parent), slotName: entry.slotName } : null;
654
+ },
655
+ /**
656
+ * 判断 targetId 是否在 widget 自身或其子孙(含插槽)里,
657
+ * 用于阻止把组件拖进自己的插槽造成死循环
658
+ */
659
+ isDescendantWidget(targetId, widget) {
660
+ if (!widget || !targetId) return false;
661
+ if (widget.id === targetId) return true;
662
+ return getWidgetChildren(widget).some((child) => this.isDescendantWidget(targetId, child));
663
+ },
664
+ /**
665
+ * 往插槽里放组件(已有组件时替换)
666
+ */
667
+ setWidgetSlot(ownerId, slotName, widget) {
668
+ const owner = this.getWidgetItemById(ownerId);
669
+ if (!owner || !slotName) return false;
670
+ this.updateWidget(ownerId, { slots: { ...owner.slots || {}, [slotName]: widget } });
671
+ return true;
672
+ },
673
+ /**
674
+ * 清空插槽(插槽全空时把 slots 一起删掉,避免配置里留空对象)
675
+ */
676
+ clearWidgetSlot(owner, slotName) {
677
+ if (!owner || !owner.slots) return false;
678
+ const slots = { ...owner.slots };
679
+ delete slots[slotName];
680
+ this.updateWidget(owner.id, { slots: Object.keys(slots).length > 0 ? slots : null });
681
+ return true;
682
+ },
683
+ /**
684
+ * 把组件从当前位置摘掉(插槽 / 容器 / 根级都支持),用于移动
685
+ */
686
+ removeWidgetFromParent(widget) {
687
+ const slotInfo = this.findWidgetSlot(widget.id);
688
+ if (slotInfo) {
689
+ return this.clearWidgetSlot(slotInfo.parent, slotInfo.slotName);
690
+ }
691
+ const parent = this.findParentWidget(widget.id);
692
+ if (parent && parent.items) {
693
+ const list = [...parent.items];
694
+ const index2 = list.findIndex((item) => item.id === widget.id);
695
+ if (index2 === -1) return false;
696
+ list.splice(index2, 1);
697
+ this.updateWidget(parent.id, { items: list });
698
+ return true;
699
+ }
700
+ const rootList = [...this.widgetList];
701
+ const index = rootList.findIndex((item) => item.id === widget.id);
702
+ if (index === -1) return false;
703
+ rootList.splice(index, 1);
704
+ this.widgetList = rootList;
705
+ return true;
706
+ },
707
+ updateWidget(key, property) {
708
+ const widget = this.getWidgetItemById(key);
709
+ if (widget) {
710
+ for (const key2 in property) {
711
+ if (property[key2] === null) {
712
+ delete widget[key2];
713
+ } else {
714
+ widget[key2] = property[key2];
715
+ }
716
+ }
717
+ }
718
+ },
719
+ updateWidgetConfig(key, configs, type) {
720
+ const property = {};
721
+ for (const configKey in configs) {
722
+ if (configKey.includes("componentName") || configKey === "span" || configKey === "flex") {
723
+ property[configKey.replace("componentName", "title")] = configs[configKey];
724
+ }
725
+ }
726
+ this.updateWidget(key, property);
727
+ const entry = this.widgetConfig[key];
728
+ if (type === "cover" || !entry) {
729
+ const next = { ...configs };
730
+ for (const k in next) {
731
+ if (next[k] === null) delete next[k];
732
+ }
733
+ this.widgetConfig[key] = next;
734
+ return;
735
+ }
736
+ for (const k in configs) {
737
+ if (configs[k] === null) delete entry[k];
738
+ else entry[k] = configs[k];
739
+ }
740
+ },
741
+ // 批量并入多条组件配置(模板拖入 / 复制 / 拆分模板),逐 key 新增而不整体替换 widgetConfig
742
+ mergeWidgetConfig(configs) {
743
+ for (const key in configs) {
744
+ if (configs[key] !== void 0) this.widgetConfig[key] = configs[key];
745
+ }
746
+ },
747
+ updatePageConfig(configs) {
748
+ this.pageConfig = { ...this.pageConfig, ...configs };
749
+ },
750
+ upgradeWidgetConfig() {
751
+ const ids = [];
752
+ const upgradeWidget = (arr, parentId) => {
753
+ arr.forEach((item) => {
754
+ const oldId = item.id;
755
+ if (parentId) {
756
+ while (ids.includes(item.id)) {
757
+ const code = item.contentType.replace(/-/g, "_");
758
+ item.id = code + "_" + util.genId();
759
+ }
760
+ ids.push(item.id);
761
+ item.i = item.id;
762
+ if (!item.css && !isEmpty(item.style)) {
763
+ let cssStr = ":current {";
764
+ for (const key in item.style) {
765
+ const kebabCase = key.replace(/([A-Z])/g, ($1) => {
766
+ return "-" + $1.toLocaleLowerCase();
767
+ });
768
+ cssStr += `\r
769
+ ${kebabCase}: ${item.style[key]};`;
770
+ }
771
+ cssStr += "\r\n}";
772
+ item.css = cssStr;
773
+ delete item.style;
774
+ }
775
+ const oldKey = parentId + "-" + oldId;
776
+ const oldWidgetConifg = this.widgetConfig[oldKey];
777
+ if (oldWidgetConifg) {
778
+ delete this.widgetConfig[oldKey];
779
+ this.widgetConfig[item.id] = { ...this.widgetConfig[item.id], ...oldWidgetConifg };
780
+ } else if (item.id !== oldId && this.widgetConfig[oldId]) {
781
+ this.widgetConfig[item.id] = { ...this.widgetConfig[oldId] };
782
+ }
783
+ }
784
+ const children = getWidgetChildren(item);
785
+ if (children.length > 0) {
786
+ upgradeWidget(children, parentId ? parentId + "-" + oldId : oldId);
787
+ }
788
+ });
789
+ };
790
+ upgradeWidget(this.widgetList);
791
+ },
792
+ upgradePageConfig() {
793
+ const { css, style } = this.pageConfig;
794
+ if (!css && !isEmpty(style)) {
795
+ let cssStr = ":current {";
796
+ for (const key in style) {
797
+ const kebabCase = key.replace(/([A-Z])/g, ($1) => {
798
+ return "-" + $1.toLocaleLowerCase();
799
+ });
800
+ cssStr += `\r
801
+ ${kebabCase}: ${style[key]};`;
802
+ }
803
+ cssStr += "\r\n}";
804
+ delete this.pageConfig.style;
805
+ this.pageConfig = { ...this.pageConfig, css: cssStr };
806
+ }
807
+ },
808
+ moveUpWidget(parentList, indexOfParentList) {
809
+ if (parentList) {
810
+ if (indexOfParentList === 0) {
811
+ this.vueInstance.$message(this.vueInstance.i18nt("designer.hint.moveUpFirstChildHint"));
812
+ return;
813
+ }
814
+ const tempWidget = parentList[indexOfParentList];
815
+ parentList.splice(indexOfParentList, 1);
816
+ parentList.splice(indexOfParentList - 1, 0, tempWidget);
817
+ }
818
+ },
819
+ moveDownWidget(parentList, indexOfParentList) {
820
+ if (parentList) {
821
+ if (indexOfParentList === parentList.length - 1) {
822
+ this.vueInstance.$message(this.vueInstance.i18nt("designer.hint.moveDownLastChildHint"));
823
+ return;
824
+ }
825
+ const tempWidget = parentList[indexOfParentList];
826
+ parentList.splice(indexOfParentList, 1);
827
+ parentList.splice(indexOfParentList + 1, 0, tempWidget);
828
+ }
829
+ },
830
+ copyNewFieldWidget(origin) {
831
+ const newWidget = cloneDeep(origin);
832
+ const tempId = genId();
833
+ newWidget.id = newWidget.type.replace(/-/g, "") + tempId;
834
+ newWidget.options.name = newWidget.id;
835
+ newWidget.options.label = newWidget.options.label || newWidget.type.toLowerCase();
836
+ delete newWidget.displayName;
837
+ return newWidget;
838
+ },
839
+ copyNewContainerWidget(origin) {
840
+ const newCon = genId(origin);
841
+ newCon.id = newCon.type.replace(/-/g, "") + genId();
842
+ newCon.options.name = newCon.id;
843
+ const newTabPane = cloneDeep(this.getContainerByType("tab-pane"));
844
+ newTabPane.id = "tab-pane-" + genId();
845
+ newTabPane.options.name = "tab1";
846
+ newTabPane.options.label = "tab 1";
847
+ newCon.tabs.push(newTabPane);
848
+ delete newCon.displayName;
849
+ return newCon;
850
+ },
851
+ addWidgetByInfo(widgetInfo, parentWidget) {
852
+ const widget = {
853
+ id: widgetInfo.CODE + "_" + genId(),
854
+ contentType: widgetInfo.CODE,
855
+ title: widgetInfo.TITLE
856
+ };
857
+ if (widgetInfo.COMPONENT_SOURCE === "custom") {
858
+ widget.type = "custom";
859
+ }
860
+ if (parentWidget) {
861
+ if (!parentWidget.items) {
862
+ parentWidget.items = [widget];
863
+ } else {
864
+ parentWidget.items.push(widget);
865
+ }
866
+ } else {
867
+ this.widgetList.push(widget);
868
+ }
869
+ if (widgetInfo.CODE === "chart") {
870
+ this.updateWidgetConfig(widget.id, { metaId: this.page.metaId });
871
+ }
872
+ this.setSelected(widget);
873
+ },
874
+ addWidgets(widgets, parentWidget, option = {}) {
875
+ const { defaultSelected = true } = option;
876
+ if (parentWidget) {
877
+ if (!parentWidget.items) {
878
+ parentWidget.items = [...widgets];
879
+ } else {
880
+ parentWidget.items.push(...widgets);
881
+ }
882
+ } else {
883
+ this.widgetList.push(...widgets);
884
+ }
885
+ if (defaultSelected) this.setSelected(widgets[widgets.length - 1]);
886
+ },
887
+ addWidget(widget, parentWidget, option = {}) {
888
+ const { defaultSelected = true } = option;
889
+ if (parentWidget) {
890
+ if (!parentWidget.items) {
891
+ parentWidget.items = [widget];
892
+ } else {
893
+ parentWidget.items.push(widget);
894
+ }
895
+ } else {
896
+ this.widgetList.push(widget);
897
+ }
898
+ if (defaultSelected) this.setSelected(widget);
899
+ },
900
+ // 查找父组件(公共方法):插槽里的组件返回插槽宿主;根级返回 null;不存在返回 undefined
901
+ findParentWidget(targetId) {
902
+ const entry = lookup(targetId);
903
+ return entry ? asReactive(entry.parent) : void 0;
904
+ },
905
+ copyWidget(widget, parentWidget) {
906
+ if (this.findWidgetSlot(widget.id)) {
907
+ this.vueInstance && this.vueInstance.$message && this.vueInstance.$message("插槽内的组件不支持复制");
908
+ return;
909
+ }
910
+ const newWidget = cloneDeep(widget);
911
+ newWidget.id = widget.contentType + "_" + genId();
912
+ const newConfigs = {
913
+ [newWidget.id]: cloneDeep(this.widgetConfig[widget.id])
914
+ };
915
+ const formatWidget = (arr) => {
916
+ for (const item of arr) {
917
+ const newId = item.contentType + "_" + genId();
918
+ newConfigs[newId] = cloneDeep(this.widgetConfig[item.id]);
919
+ item.id = newId;
920
+ formatWidget(getWidgetChildren(item));
921
+ }
922
+ };
923
+ formatWidget(getWidgetChildren(newWidget));
924
+ if (parentWidget) {
925
+ if (!parentWidget.items) {
926
+ parentWidget.items = [newWidget];
927
+ } else {
928
+ parentWidget.items.push(newWidget);
929
+ }
930
+ } else {
931
+ this.widgetList.push(newWidget);
932
+ }
933
+ this.mergeWidgetConfig(newConfigs);
934
+ this.setSelected(newWidget);
935
+ },
936
+ deleteWidget(widget, parentWidget) {
937
+ delete this.widgetConfig[widget.id];
938
+ const slotInfo = this.findWidgetSlot(widget.id);
939
+ if (slotInfo) {
940
+ this.clearWidgetSlot(slotInfo.parent, slotInfo.slotName);
941
+ if (this.selectedId === widget.id) this.clearSelected();
942
+ return 0;
943
+ }
944
+ if (parentWidget && parentWidget.items) {
945
+ const index = parentWidget.items.findIndex((item) => item.id === widget.id);
946
+ if (index !== -1) {
947
+ parentWidget.items.splice(index, 1);
948
+ return index;
949
+ }
950
+ } else {
951
+ const index = this.widgetList.findIndex((item) => item.id === widget.id);
952
+ if (index !== -1) {
953
+ this.widgetList.splice(index, 1);
954
+ return index;
955
+ }
956
+ }
957
+ },
958
+ addContainerByDbClick(container) {
959
+ const newCon = this.copyNewContainerWidget(container);
960
+ this.widgetList.push(newCon);
961
+ this.setSelected(newCon);
962
+ },
963
+ addFieldByDbClick(widget) {
964
+ const newWidget = this.copyNewFieldWidget(widget);
965
+ if (!!this.selectedWidget && this.selectedWidget.type === "tab") {
966
+ let activeTab = this.selectedWidget.tabs[0];
967
+ this.selectedWidget.tabs.forEach((tabPane) => {
968
+ if (tabPane.options.active) {
969
+ activeTab = tabPane;
970
+ }
971
+ });
972
+ !!activeTab && activeTab.widgetList.push(newWidget);
973
+ } else if (!!this.selectedWidget && !!this.selectedWidget.widgetList) {
974
+ this.selectedWidget.widgetList.push(newWidget);
975
+ } else {
976
+ this.widgetList.push(newWidget);
977
+ }
978
+ this.setSelected(newWidget);
979
+ this.emitHistoryChange();
980
+ },
981
+ addTabPaneOfTabs(tabsWidget) {
982
+ const tabPanes = tabsWidget.tabs;
983
+ const newTabPane = cloneDeep(this.getContainerByType("tab-pane"));
984
+ newTabPane.id = "tab-pane-" + genId();
985
+ newTabPane.options.name = newTabPane.id;
986
+ newTabPane.options.label = "tab " + (tabPanes.length + 1);
987
+ tabPanes.push(newTabPane);
988
+ },
989
+ deleteTabPaneOfTabs(tabsWidget, tpIdx) {
990
+ tabsWidget.tabs.splice(tpIdx, 1);
991
+ },
992
+ emitEvent(evtName, evtData) {
993
+ const handlers = designerEvents.get(evtName);
994
+ if (handlers) handlers.slice().forEach((handler) => handler(evtData));
995
+ },
996
+ handleEvent(evtName, callback) {
997
+ const handlers = designerEvents.get(evtName);
998
+ if (handlers) handlers.push(callback);
999
+ else designerEvents.set(evtName, [callback]);
1000
+ },
1001
+ offEvent(evtName, callback) {
1002
+ const handlers = designerEvents.get(evtName);
1003
+ if (!handlers) return;
1004
+ if (!callback) {
1005
+ designerEvents.delete(evtName);
1006
+ return;
1007
+ }
1008
+ const index = handlers.indexOf(callback);
1009
+ if (index > -1) handlers.splice(index, 1);
1010
+ },
1011
+ // 快照存三段 JSON 字符串:无响应式、内存紧凑(此前每步 cloneDeep 三份全量数据且全部深度代理);
1012
+ // toRaw 脱掉顶层代理,减少序列化时的 Proxy 开销
1013
+ takeSnapshot() {
1014
+ return {
1015
+ widgetList: JSON.stringify(toRaw(this.widgetList)),
1016
+ widgetConfig: JSON.stringify(toRaw(this.widgetConfig)),
1017
+ pageConfig: JSON.stringify(toRaw(this.pageConfig))
1018
+ };
1019
+ },
1020
+ applySnapshot(snapshot) {
1021
+ this.widgetList = JSON.parse(snapshot.widgetList);
1022
+ this.widgetConfig = JSON.parse(snapshot.widgetConfig);
1023
+ this.pageConfig = JSON.parse(snapshot.pageConfig);
1024
+ },
1025
+ // 加载页面后重置为单步历史,首次操作即可撤销回初始状态
1026
+ initHistoryData() {
1027
+ this.historyData.index = 0;
1028
+ this.historyData.steps = [this.takeSnapshot()];
1029
+ },
1030
+ emitHistoryChange() {
1031
+ if (this.historyData.index === this.historyData.maxStep - 1) {
1032
+ this.historyData.steps.shift();
1033
+ } else {
1034
+ this.historyData.index++;
1035
+ }
1036
+ this.historyData.steps[this.historyData.index] = this.takeSnapshot();
1037
+ this.savePageContentToStorage();
1038
+ if (this.historyData.index < this.historyData.steps.length - 1) {
1039
+ this.historyData.steps = this.historyData.steps.slice(0, this.historyData.index + 1);
1040
+ }
1041
+ },
1042
+ saveCurrentHistoryStep() {
1043
+ this.historyData.steps[this.historyData.index] = this.takeSnapshot();
1044
+ this.savePageContentToStorage();
1045
+ },
1046
+ undoHistoryStep() {
1047
+ if (this.historyData.index !== 0) {
1048
+ this.historyData.index--;
1049
+ }
1050
+ this.applySnapshot(this.historyData.steps[this.historyData.index]);
1051
+ },
1052
+ redoHistoryStep() {
1053
+ if (this.historyData.index !== this.historyData.steps.length - 1) {
1054
+ this.historyData.index++;
1055
+ }
1056
+ this.applySnapshot(this.historyData.steps[this.historyData.index]);
1057
+ },
1058
+ undoEnabled() {
1059
+ return this.historyData.index > 0 && this.historyData.steps.length > 0;
1060
+ },
1061
+ redoEnabled() {
1062
+ return this.historyData.index < this.historyData.steps.length - 1;
1063
+ },
1064
+ // 300ms 防抖:连续操作只写一次 localStorage;直接复用快照字符串,不再重复 stringify
1065
+ savePageContentToStorage() {
1066
+ if (saveTimer) clearTimeout(saveTimer);
1067
+ saveTimer = setTimeout(() => {
1068
+ saveTimer = null;
1069
+ const snapshot = this.historyData.steps[this.historyData.index] || this.takeSnapshot();
1070
+ storage.set("widget__list__backup", snapshot.widgetList);
1071
+ storage.set("widget__config__backup", snapshot.widgetConfig);
1072
+ storage.set("page__config__backup", snapshot.pageConfig);
1073
+ }, 300);
1074
+ },
1075
+ loadPageContentFromStorage() {
1076
+ const widgetListBackup = storage.get("widget__list__backup");
1077
+ if (widgetListBackup) {
1078
+ this.widgetList = JSON.parse(widgetListBackup);
1079
+ }
1080
+ const widgetConfigBackup = storage.get("widget__config__backup");
1081
+ if (widgetConfigBackup) {
1082
+ Object.assign(this.widgetConfig, JSON.parse(widgetConfigBackup));
1083
+ }
1084
+ const pageConfigBackup = storage.get("page__config__backup");
1085
+ if (pageConfigBackup) {
1086
+ Object.assign(this.pageConfig, JSON.parse(pageConfigBackup));
1087
+ }
1088
+ },
1089
+ isExistId(id) {
1090
+ return lookup(id) !== void 0;
1091
+ },
1092
+ // 停掉索引 watch 与待写入的 storage 定时器;PageDesigner.beforeUnmount 调用
1093
+ dispose() {
1094
+ scope.stop();
1095
+ if (saveTimer) {
1096
+ clearTimeout(saveTimer);
1097
+ saveTimer = null;
1098
+ }
1099
+ },
1100
+ genId(widgetCode) {
1101
+ const code = widgetCode.replace(/-/g, "_");
1102
+ let id = code + "_" + util.genId();
1103
+ while (this.isExistId(id)) {
1104
+ id = code + "_" + util.genId();
1105
+ }
1106
+ return id;
1107
+ }
1108
+ });
1109
+ scope.run(() => {
1110
+ watch(() => state.widgetList, () => {
1111
+ indexDirty = true;
1112
+ }, { deep: true, flush: "sync" });
1113
+ });
1114
+ return state;
1115
+ }
1116
+ export {
1117
+ createDesigner,
1118
+ getWidgetChildren,
1119
+ getWidgetSlots
1120
+ };