@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,995 @@
1
+ <template>
2
+ <div class="epx-page-designer-widget-tree" :class="{'is-dragging': dragState && !!dragState.widget}">
3
+ <div class="epx-page-designer-widget-tree__header">
4
+ <span>{{$t('Outline of the component')}}</span>
5
+ <i class="el-icon-close" @click="$emit('close')"></i>
6
+ </div>
7
+ <div
8
+ class="epx-page-designer-widget-tree__container"
9
+ @dragenter="onTreeDragEnter"
10
+ @dragover="onTreeDragOver"
11
+ @dragleave="onTreeDragLeave"
12
+ @drop="onTreeDrop"
13
+ >
14
+ <ul ref="rootList" class="epx-page-designer-widget-tree__list">
15
+ <template v-for="(widget, index) in widgetList" :key="widget.id">
16
+ <!-- 根级占位虚线框 -->
17
+ <li
18
+ v-if="showRootPlaceholderAt(index)"
19
+
20
+ class="epx-page-designer-widget-tree-item epx-page-designer-widget-tree-item--placeholder"
21
+ @dragover.prevent="onPlaceholderDragOver"
22
+ @dragenter="onPlaceholderDragEnter"
23
+ @drop.prevent="onTreeDrop"
24
+ >
25
+ <div class="epx-page-designer-widget-tree-item__placeholder-box"></div>
26
+ </li>
27
+ <epx-page-designer-widget-tree-item
28
+
29
+ :designer="designer"
30
+ :widget="widget"
31
+ :level="0"
32
+ :parent-widget="null"
33
+ :index="index"
34
+ :dragging-id="dragState && dragState.widget && dragState.widget.id"
35
+ :placeholder="placeholder"
36
+ :drop-hint="dropHint"
37
+ @add="openAddDialog"
38
+ @add-template="openTemplateDialog"
39
+ @drag-start="handleItemDragStart"
40
+ @hover-for-drop="handleItemHoverForDrop"
41
+ @drag-end="handleItemDragEnd"
42
+ @library-hover-for-drop="handleLibraryHoverForDrop"
43
+ @library-drop="handleLibraryDrop"
44
+ />
45
+ </template>
46
+ <!-- 末尾占位虚线框 -->
47
+ <li
48
+ v-if="showRootPlaceholderAt(widgetList.length)"
49
+ :key="'root-placeholder-end'"
50
+ class="epx-page-designer-widget-tree-item epx-page-designer-widget-tree-item--placeholder"
51
+ @dragover.prevent="onPlaceholderDragOver"
52
+ @dragenter="onPlaceholderDragEnter"
53
+ @drop.prevent="onTreeDrop"
54
+ >
55
+ <div class="epx-page-designer-widget-tree-item__placeholder-box"></div>
56
+ </li>
57
+ </ul>
58
+ <el-button class="epx-page-designer-widget-tree__add root" type="primary" size="default" @click.stop="openAddDialog(null)">+ {{$t('new add component')}}</el-button>
59
+ </div>
60
+ <el-dialog
61
+ :title="$t('Page Component Query')"
62
+ :model-value="!!showModal"
63
+ width="960px"
64
+ append-to-body
65
+ @close="showModal = false;addToParentWidget = null"
66
+ >
67
+ <epx-visual-component-library-dialog @click="addComponent"></epx-visual-component-library-dialog>
68
+ </el-dialog>
69
+ <el-dialog
70
+ title="保存模板"
71
+ :model-value="!!showTemplateModal"
72
+ width="520px"
73
+ append-to-body
74
+ @close="showTemplateModal = false"
75
+ >
76
+ <div class="epx-page-designer__template-form-item">
77
+ <label for="">模板编号:</label>
78
+ <el-input size="default" v-model="template.ID"></el-input>
79
+ </div>
80
+ <div class="epx-page-designer__template-form-item">
81
+ <label for="">模板名称:</label>
82
+ <el-input size="default" v-model="template.NAME"></el-input>
83
+ </div>
84
+ <div class="epx-page-designer__template-form-item">
85
+ <label for="">缩略图:</label>
86
+ <epx-photo v-model="template.PICTURE" :fieldConfigs="{attriName: 'PICTURE', attriLabel: '缩略图', state: 'EDIT'}"></epx-photo>
87
+ </div>
88
+ <div class="epx-page-designer__template-form-item" v-if="clientConfig.CODE==='frame'">
89
+ <label for="">应用级别:</label>
90
+ <el-radio-group v-model="template.LEVEL">
91
+ <el-radio label="01" value="01">平台级</el-radio>
92
+ <el-radio label="03" value="03">系统级</el-radio>
93
+ </el-radio-group>
94
+ </div>
95
+ <template v-slot:footer><div class="dialog-footer">
96
+ <el-button @click="showTemplateModal = false">取 消</el-button>
97
+ <el-button type="primary" @click="saveAsTemplate">确 定</el-button>
98
+ </div></template>
99
+ </el-dialog>
100
+ </div>
101
+ </template>
102
+ <script>
103
+ import { getWidgetChildren } from '../designer'
104
+
105
+ export default {
106
+ name: 'epx-page-designer-widget-tree',
107
+ components: {
108
+ },
109
+ props: {
110
+ designer: {
111
+ type: Object
112
+ },
113
+ isFloating: {
114
+ type: Boolean,
115
+ default: false
116
+ }
117
+ },
118
+ data () {
119
+ return {
120
+ dragtInContext: null,
121
+ showModal: false,
122
+ showTemplateModal: false,
123
+ template: {
124
+ NAME: '',
125
+ LEVEL: '03'
126
+ },
127
+ // 拖拽状态(仅用于大纲树内部拖拽排序)
128
+ dragState: null,
129
+ // 占位符位置:{ parentId: string | null, index: number }
130
+ placeholder: null,
131
+ // hover 提示:{ widgetId: string|null, invalid: boolean }
132
+ dropHint: null,
133
+ // 组件库原生拖拽状态(仅用于显示虚线占位框并在 drop 时插入)
134
+ libraryDragActive: false,
135
+ // 上一次占位符位置,用于防抖动
136
+ lastPlaceholder: null,
137
+ // 节流定时器
138
+ hoverThrottleTimer: null
139
+ }
140
+ },
141
+ computed: {
142
+ widgetList: {
143
+ get () {
144
+ return this.designer.widgetList
145
+ },
146
+ set (v) {
147
+ this.designer.widgetList = v
148
+ }
149
+ }
150
+ },
151
+ watch: {
152
+ // 监听预览区域的拖拽状态,同步显示占位符
153
+ 'designer.previewDragTarget': {
154
+ handler (target) {
155
+ if (target) {
156
+ if (target.widgetId) {
157
+ // 容器内部拖拽
158
+ const widget = this.designer.getWidgetItemById(target.widgetId)
159
+ if (widget) {
160
+ this.placeholder = {
161
+ parentId: target.widgetId,
162
+ index: typeof target.index === 'number' ? target.index : 0
163
+ }
164
+ this.libraryDragActive = true
165
+
166
+ // 自动滚动到目标位置
167
+ this.$nextTick(() => {
168
+ this.scrollToWidget(target.widgetId)
169
+ })
170
+ }
171
+ } else if (target.position === 'root') {
172
+ // 根级拖拽
173
+ this.placeholder = {
174
+ parentId: null,
175
+ index: typeof target.index === 'number' ? target.index : 0
176
+ }
177
+ this.libraryDragActive = true
178
+
179
+ // 自动滚动到根级占位符位置
180
+ this.$nextTick(() => {
181
+ this.scrollToRootPlaceholder(target.index)
182
+ })
183
+ }
184
+ } else {
185
+ // 清除占位符,但保持 libraryDragActive
186
+ this.placeholder = null
187
+ }
188
+ }
189
+ }
190
+ },
191
+ methods: {
192
+ onPlaceholderDragOver (e) {
193
+ // 占位符上的 dragover 事件,保持拖拽状态,不让占位符消失
194
+ e.preventDefault()
195
+ e.stopPropagation()
196
+ if (this.isDraggingFromLibrary(e)) {
197
+ // 根据是否有正在拖拽的组件来判断拖拽类型
198
+ const isDraggingWidget = this.designer.dragState.dragSource === 'preview'
199
+ e.dataTransfer.dropEffect = isDraggingWidget ? 'move' : 'copy'
200
+ }
201
+ },
202
+ onPlaceholderDragEnter (e) {
203
+ // 占位符上的 dragenter 事件,防止触发 dragleave
204
+ e.stopPropagation()
205
+ },
206
+ isDraggingFromLibrary (e) {
207
+ if (!e || !e.dataTransfer || !e.dataTransfer.types) return false
208
+ return e.dataTransfer.types.includes('text/plain')
209
+ },
210
+ parseLibraryDragPayload (e) {
211
+ const DRAG_PAYLOAD_PREFIX = 'page-designer-widget:'
212
+ const TEMPLATE_PAYLOAD_PREFIX = 'page-designer-template:'
213
+ if (!e || !e.dataTransfer) return null
214
+ try {
215
+ const raw = e.dataTransfer.getData('text/plain') || ''
216
+
217
+ // 检查是否是组件重排序拖拽(从预览区域拖拽)
218
+ try {
219
+ const data = JSON.parse(raw)
220
+ if (data && data.type === 'widget-reorder') {
221
+ return { isWidgetReorder: true, ...data }
222
+ }
223
+ } catch (_) {
224
+ // 不是 JSON 或不是重排序,继续检查其他类型
225
+ }
226
+
227
+ // 检查是否是模板
228
+ if (raw.startsWith(TEMPLATE_PAYLOAD_PREFIX)) {
229
+ const templateData = JSON.parse(raw.slice(TEMPLATE_PAYLOAD_PREFIX.length))
230
+ return { isTemplate: true, ...templateData }
231
+ }
232
+
233
+ // 检查是否是组件
234
+ if (raw.startsWith(DRAG_PAYLOAD_PREFIX)) {
235
+ return JSON.parse(raw.slice(DRAG_PAYLOAD_PREFIX.length))
236
+ }
237
+
238
+ return null
239
+ } catch (err) {
240
+ return null
241
+ }
242
+ },
243
+ resetLibraryDragState () {
244
+ // 大纲内部拖拽进行中时,不清理内部拖拽的占位状态
245
+ if (this.dragState) return
246
+ this.libraryDragActive = false
247
+ this.placeholder = null
248
+ this.dropHint = null
249
+ this.lastPlaceholder = null
250
+ // 清理节流定时器
251
+ if (this.hoverThrottleTimer) {
252
+ clearTimeout(this.hoverThrottleTimer)
253
+ this.hoverThrottleTimer = null
254
+ }
255
+ },
256
+ notifyDragEnd () {
257
+ // 通知 PageDesigner 拖拽结束,关闭悬浮窗
258
+ if (this.designer && this.designer.vueInstance) {
259
+ this.designer.emitEvent('drag-end')
260
+ }
261
+ },
262
+ isIdInSubtree (rootWidget, id) {
263
+ if (!rootWidget || !id) return false
264
+ if (rootWidget.id === id) return true
265
+ const items = rootWidget.items || []
266
+ for (const child of items) {
267
+ if (this.isIdInSubtree(child, id)) return true
268
+ }
269
+ return false
270
+ },
271
+ /**
272
+ * 判断根级是否在某个 index 位置显示占位虚线框
273
+ */
274
+ showRootPlaceholderAt (index) {
275
+ if (!this.placeholder || this.placeholder.parentId !== null) return false
276
+ return this.placeholder.index === index
277
+ },
278
+ /**
279
+ * 根级计算插入位置(组件库拖拽 hover 在树空白处时)
280
+ */
281
+ getRootInsertIndex (e) {
282
+ const listEl = this.$refs.rootList
283
+ if (!listEl) return 0
284
+ const y = e.clientY
285
+ const children = [...listEl.children].filter(el => el && el.dataset && el.dataset.treeWidgetId)
286
+ if (children.length === 0) return 0
287
+ for (let i = 0; i < children.length; i++) {
288
+ const r = children[i].getBoundingClientRect()
289
+ if (r.top + r.height / 2 > y) return i
290
+ }
291
+ return children.length
292
+ },
293
+ onTreeDragEnter (e) {
294
+ if (!this.isDraggingFromLibrary(e)) return
295
+ this.libraryDragActive = true
296
+ },
297
+ onTreeDragOver (e) {
298
+ if (!this.isDraggingFromLibrary(e)) return
299
+ // 允许 drop
300
+ e.preventDefault()
301
+
302
+ // 手动更新悬浮窗位置,确保流畅跟随
303
+ if (this.designer && this.designer.updateDragGhostPosition) {
304
+ this.designer.updateDragGhostPosition(e.clientX, e.clientY)
305
+ }
306
+
307
+ const isDraggingWidget = this.designer.dragState.dragSource === 'preview'
308
+ e.dataTransfer.dropEffect = isDraggingWidget ? 'move' : 'copy'
309
+ // 只有 hover 在树的“空白区域/根级列表”时才走这里;Item header 会 stopPropagation
310
+ this.libraryDragActive = true
311
+ this.dropHint = null
312
+ this.placeholder = {
313
+ parentId: null,
314
+ index: this.getRootInsertIndex(e)
315
+ }
316
+ },
317
+ onTreeDragLeave (e) {
318
+ if (!this.isDraggingFromLibrary(e)) return
319
+ // 离开整个 tree 容器则清理(进入子元素不清理)
320
+ if (this.$el && !this.$el.contains(e.relatedTarget)) {
321
+ this.resetLibraryDragState()
322
+ }
323
+ },
324
+ onTreeDrop (e) {
325
+ if (!this.isDraggingFromLibrary(e)) return
326
+ e.preventDefault()
327
+ const payload = this.parseLibraryDragPayload(e)
328
+ if (!payload) {
329
+ this.resetLibraryDragState()
330
+ return
331
+ }
332
+
333
+ // 处理组件重排序(从预览区域拖拽)
334
+ if (payload.isWidgetReorder) {
335
+ this.handleWidgetReorderToTree(payload)
336
+ this.resetLibraryDragState()
337
+ // 注意:不在这里调用 notifyDragEnd,让 dragend 事件自然触发
338
+ return
339
+ }
340
+
341
+ // 处理模板或组件
342
+ if (payload.isTemplate) {
343
+ this.insertTemplateByPlaceholder(payload)
344
+ } else if (payload.code) {
345
+ this.insertLibraryWidgetByPlaceholder(payload)
346
+ }
347
+
348
+ this.resetLibraryDragState()
349
+ // 注意:不在这里调用 notifyDragEnd,让 dragend 事件自然触发
350
+ },
351
+ /**
352
+ * TreeItem 发起拖拽开始
353
+ */
354
+ handleItemDragStart ({ widget, parentWidget }) {
355
+ if (!widget) return
356
+ const parentList = parentWidget ? (parentWidget.items || []) : this.widgetList
357
+ const sourceIndex = parentList.findIndex(item => item.id === widget.id)
358
+ if (sourceIndex === -1) return
359
+
360
+ this.dragState = {
361
+ widget,
362
+ parentWidget: parentWidget || null,
363
+ sourceIndex,
364
+ invalid: false,
365
+ // 标记本次拖拽过程中是否真正发生过“移动/hover 到目标位置”
366
+ hasMoved: false
367
+ }
368
+ // 初始占位位置:保持在当前索引之后,视觉上与原项目并存
369
+ this.placeholder = {
370
+ parentId: parentWidget ? parentWidget.id : null,
371
+ index: sourceIndex + 1
372
+ }
373
+ this.dropHint = null
374
+
375
+ document.addEventListener('mouseup', this.handleDocumentMouseUp)
376
+ },
377
+ /**
378
+ * TreeItem 上鼠标移动,用于更新占位位置
379
+ * - 如果目标是容器,则占位在该容器的第一个子元素位置
380
+ * - 如果是普通组件,根据鼠标在上半部分 / 下半部分,决定占位在上面还是下面
381
+ */
382
+ handleItemHoverForDrop ({ widget, parentWidget, index, isContainer, position }) {
383
+ if (!this.dragState || !widget) return
384
+ if (this.dragState.widget && this.dragState.widget.id === widget.id) return
385
+
386
+ // 不允许拖到自己或自己的子孙节点区域(包含 before/after/inside)
387
+ const invalid = this.isIdInSubtree(this.dragState.widget, widget.id)
388
+ this.dragState.invalid = !!invalid
389
+ this.dropHint = { widgetId: widget.id, invalid: !!invalid }
390
+ if (invalid) return
391
+
392
+ // 一旦进入合法的 hover 计算,认为本次拖拽已经产生了有效移动
393
+ this.dragState.hasMoved = true
394
+
395
+ // 容器中间区域:作为容器的第一个子元素
396
+ if (isContainer && position === 'inside') {
397
+ this.placeholder = {
398
+ parentId: widget.id,
399
+ index: 0
400
+ }
401
+ return
402
+ }
403
+
404
+ // 其他情况(容器的上 / 下边界 & 普通组件):作为同级兄弟节点进行 before/after 排序
405
+ const baseIndex = typeof index === 'number' ? index : 0
406
+ const offset = position === 'before' ? 0 : 1
407
+ this.placeholder = {
408
+ parentId: parentWidget ? parentWidget.id : null,
409
+ index: baseIndex + offset
410
+ }
411
+ },
412
+ /**
413
+ * 文档级 mouseup:完成一次拖拽排序
414
+ * 如果在大纲树外部松手,则视为取消拖拽,不做任何排序变更
415
+ */
416
+ handleDocumentMouseUp (e) {
417
+ // 如果鼠标松手位置不在当前大纲树内部,则直接取消拖拽
418
+ if (e && e.target && e.target.closest && !e.target.closest('.epx-page-designer-widget-tree')) {
419
+ this.resetDragState()
420
+ return
421
+ }
422
+
423
+ // 如果还没产生过任何有效移动(没有 hover 到任何合法目标),认为只是“长按误触”,直接取消
424
+ if (this.dragState && !this.dragState.hasMoved) {
425
+ this.resetDragState()
426
+ return
427
+ }
428
+
429
+ if (!this.dragState || !this.placeholder || this.dragState.invalid) {
430
+ this.resetDragState()
431
+ return
432
+ }
433
+
434
+ const { widget, parentWidget, sourceIndex } = this.dragState
435
+ const sourceList = parentWidget ? (parentWidget.items || []) : this.widgetList
436
+
437
+ if (!sourceList || sourceIndex < 0 || sourceIndex >= sourceList.length) {
438
+ this.resetDragState()
439
+ return
440
+ }
441
+
442
+ // 目标父级
443
+ let targetParent = null
444
+ if (this.placeholder.parentId) {
445
+ targetParent = this.designer.getWidgetItemById
446
+ ? this.designer.getWidgetItemById(this.placeholder.parentId)
447
+ : null
448
+ }
449
+
450
+ // 确保容器有 items 数组(使用响应式方法)
451
+ if (targetParent && !targetParent.items) {
452
+ this.designer.updateWidget(targetParent.id, { items: [] })
453
+ }
454
+
455
+ const targetList = targetParent ? targetParent.items : this.widgetList
456
+ let targetIndex = this.placeholder.index
457
+
458
+ // 同一列表内部排序时,移除原位置后需要修正目标 index
459
+ const sameList = targetList === sourceList
460
+
461
+ // 先从源列表中移除
462
+ sourceList.splice(sourceIndex, 1)
463
+
464
+ if (sameList && targetIndex > sourceIndex) {
465
+ targetIndex = targetIndex - 1
466
+ }
467
+ if (targetIndex < 0) targetIndex = 0
468
+ if (targetIndex > targetList.length) targetIndex = targetList.length
469
+
470
+ targetList.splice(targetIndex, 0, widget)
471
+
472
+ // 更新选中 & 历史
473
+ this.designer.setSelected && this.designer.setSelected(widget)
474
+ this.designer.emitHistoryChange && this.designer.emitHistoryChange()
475
+
476
+ this.resetDragState()
477
+ },
478
+ /**
479
+ * TreeItem 内部触发的拖拽结束(在组件 header 区域松手)
480
+ */
481
+ handleItemDragEnd (payload) {
482
+ // 复用统一的 mouseup 结束逻辑
483
+ this.handleDocumentMouseUp(payload && payload.event)
484
+ },
485
+ resetDragState () {
486
+ document.removeEventListener('mouseup', this.handleDocumentMouseUp)
487
+ this.dragState = null
488
+ this.placeholder = null
489
+ this.dropHint = null
490
+ },
491
+ handleLibraryHoverForDrop (ctx) {
492
+ if (!ctx || !ctx.event || !this.isDraggingFromLibrary(ctx.event)) return
493
+
494
+ // 节流:限制更新频率
495
+ if (this.hoverThrottleTimer) return
496
+ this.hoverThrottleTimer = setTimeout(() => {
497
+ this.hoverThrottleTimer = null
498
+ }, 50) // 50ms 节流
499
+
500
+ this.libraryDragActive = true
501
+ this.dropHint = { widgetId: ctx.widget && ctx.widget.id, invalid: false }
502
+
503
+ let newPlaceholder
504
+ // inside:放入容器第一个子元素位置(与大纲内部拖拽一致)
505
+ if (ctx.isContainer && ctx.position === 'inside') {
506
+ newPlaceholder = { parentId: ctx.widget.id, index: 0 }
507
+ } else {
508
+ // before/after:同级插入
509
+ const baseIndex = typeof ctx.index === 'number' ? ctx.index : 0
510
+ const offset = ctx.position === 'before' ? 0 : 1
511
+ newPlaceholder = {
512
+ parentId: ctx.parentWidget ? ctx.parentWidget.id : null,
513
+ index: baseIndex + offset
514
+ }
515
+ }
516
+
517
+ // 防抖动:只有位置真正改变时才更新
518
+ if (!this.lastPlaceholder ||
519
+ this.lastPlaceholder.parentId !== newPlaceholder.parentId ||
520
+ this.lastPlaceholder.index !== newPlaceholder.index) {
521
+ this.placeholder = newPlaceholder
522
+ this.lastPlaceholder = { ...newPlaceholder }
523
+ }
524
+ },
525
+ handleLibraryDrop (ctx) {
526
+ if (!ctx || !ctx.event || !this.isDraggingFromLibrary(ctx.event)) return
527
+ ctx.event.preventDefault()
528
+ const payload = this.parseLibraryDragPayload(ctx.event)
529
+ if (!payload) {
530
+ this.resetLibraryDragState()
531
+ return
532
+ }
533
+
534
+ // 如果还未产生占位(极少数情况),按 drop 点给一个兜底位置
535
+ if (!this.placeholder) {
536
+ if (ctx.widget && ctx.isContainer) {
537
+ const items = ctx.widget.items || []
538
+ this.placeholder = { parentId: ctx.widget.id, index: items.length }
539
+ } else {
540
+ const baseIndex = typeof ctx.index === 'number' ? ctx.index : (this.widgetList || []).length
541
+ this.placeholder = { parentId: ctx.parentWidget ? ctx.parentWidget.id : null, index: baseIndex + 1 }
542
+ }
543
+ }
544
+
545
+ // 处理组件重排序(从预览区域拖拽)
546
+ if (payload.isWidgetReorder) {
547
+ this.handleWidgetReorderToTree(payload)
548
+ this.resetLibraryDragState()
549
+ // 注意:不在这里调用 notifyDragEnd,让 dragend 事件自然触发
550
+ return
551
+ }
552
+
553
+ // 处理模板或组件
554
+ if (payload.isTemplate) {
555
+ this.insertTemplateByPlaceholder(payload)
556
+ } else if (payload.code) {
557
+ this.insertLibraryWidgetByPlaceholder(payload)
558
+ }
559
+
560
+ this.resetLibraryDragState()
561
+ // 注意:不在这里调用 notifyDragEnd,让 dragend 事件自然触发
562
+ },
563
+ insertLibraryWidgetByPlaceholder (payload) {
564
+ const widgetInfo = this.designer.getWidgetByType(payload.code) || {}
565
+ const widget = {
566
+ id: this.designer.genId(payload.code),
567
+ contentType: payload.code,
568
+ title: payload.title || widgetInfo.TITLE
569
+ }
570
+ if (payload.custom) widget.type = 'custom'
571
+ if (widgetInfo.CODE === 'chart') {
572
+ this.designer.updateWidgetConfig(widget.id, { metaId: this.designer.page.metaId })
573
+ }
574
+
575
+ let targetParent = null
576
+ if (this.placeholder && this.placeholder.parentId) {
577
+ targetParent = this.designer.getWidgetItemById
578
+ ? this.designer.getWidgetItemById(this.placeholder.parentId)
579
+ : null
580
+ // 非容器不允许作为“放入”的父级:回退到根级
581
+ if (targetParent) {
582
+ const parentInfo = this.designer.getWidgetByType(targetParent.contentType, targetParent.type) || {}
583
+ if (parentInfo.CONTAINER !== '1') targetParent = null
584
+ }
585
+ }
586
+
587
+ // 确保容器有 items 数组(使用响应式方法)
588
+ if (targetParent && !targetParent.items) {
589
+ this.designer.updateWidget(targetParent.id, { items: [] })
590
+ }
591
+
592
+ const targetList = targetParent ? targetParent.items : this.widgetList
593
+ let index = this.placeholder ? this.placeholder.index : targetList.length
594
+ if (index < 0) index = 0
595
+ if (index > targetList.length) index = targetList.length
596
+ targetList.splice(index, 0, widget)
597
+
598
+ this.designer.setSelected && this.designer.setSelected(widget)
599
+ this.designer.emitHistoryChange && this.designer.emitHistoryChange()
600
+ },
601
+ insertTemplateByPlaceholder (payload) {
602
+ const { items, itemConfigs, templateJs } = payload
603
+ if (!items || !items.length) return
604
+
605
+ // 确定插入位置
606
+ let targetParent = null
607
+ if (this.placeholder && this.placeholder.parentId) {
608
+ targetParent = this.designer.getWidgetItemById
609
+ ? this.designer.getWidgetItemById(this.placeholder.parentId)
610
+ : null
611
+ // 非容器不允许作为"放入"的父级:回退到根级
612
+ if (targetParent) {
613
+ const parentInfo = this.designer.getWidgetByType(targetParent.contentType, targetParent.type) || {}
614
+ if (parentInfo.CONTAINER !== '1') targetParent = null
615
+ }
616
+ }
617
+
618
+ // 确保容器有 items 数组(使用响应式方法)
619
+ if (targetParent && !targetParent.items) {
620
+ this.designer.updateWidget(targetParent.id, { items: [] })
621
+ }
622
+
623
+ const targetList = targetParent ? targetParent.items : this.widgetList
624
+ let index = this.placeholder ? this.placeholder.index : targetList.length
625
+ if (index < 0) index = 0
626
+ if (index > targetList.length) index = targetList.length
627
+
628
+ // 插入模板组件
629
+ targetList.splice(index, 0, ...items)
630
+
631
+ // 更新组件配置
632
+ this.designer.mergeWidgetConfig(itemConfigs)
633
+
634
+ // 处理模板 JS
635
+ if (templateJs) {
636
+ let { JS = '' } = this.designer.pageConfig
637
+ const result = JS.match(/export\sfunction\s(\w+)/g)
638
+ const events = []
639
+ if (result) {
640
+ result.forEach(item => {
641
+ events.push(item.replace(/export\sfunction\s/, ''))
642
+ })
643
+ }
644
+ const templateJsResult = templateJs.split(/export\s+function\s+/)
645
+ templateJsResult.forEach(item => {
646
+ const funtionStr = item.replace(/\/\*(\n|.)+?\*\/[\n\s]+$/, '')
647
+ if (funtionStr.replace(/[\n\s]+/g, '').length > 0) {
648
+ const funtionName = funtionStr.split(/\s+\(/)[0]
649
+ if (![...new Set(events)].includes(funtionName)) {
650
+ JS += 'export function ' + funtionStr.replace(/^\w+/, funtionName)
651
+ }
652
+ }
653
+ })
654
+ this.designer.updatePageConfig({ JS })
655
+ }
656
+
657
+ this.designer.setSelected && this.designer.setSelected(items[0])
658
+ this.designer.emitHistoryChange && this.designer.emitHistoryChange()
659
+ },
660
+ openAddDialog (v) {
661
+ this.showModal = true
662
+ this.addToParentWidget = v
663
+ },
664
+ addComponent (v, type) {
665
+ if (type === 'template') {
666
+ this.addTemplate(v)
667
+ } else {
668
+ this.designer.addWidgetByInfo(v, this.addToParentWidget)
669
+ }
670
+ this.showModal = false
671
+ },
672
+ addTemplate (template) {
673
+ const content = template.CONTENT
674
+ if (content) {
675
+ const config = JSON.parse(content)
676
+ const { items, itemConfigs, JS: templateJs } = config
677
+ const formatConfig = (arr) => {
678
+ arr.forEach(compItem => {
679
+ const oldId = compItem.id
680
+ const newId = compItem.contentType + '_' + this.$util.genId()
681
+ if (itemConfigs[oldId]) {
682
+ itemConfigs[newId] = itemConfigs[oldId]
683
+ delete itemConfigs[oldId]
684
+ }
685
+ compItem.id = newId
686
+ const children = getWidgetChildren(compItem)
687
+ if (children.length > 0) {
688
+ formatConfig(children)
689
+ }
690
+ })
691
+ }
692
+ formatConfig(items)
693
+ this.designer.addWidgets(items, this.addToParentWidget)
694
+ this.designer.mergeWidgetConfig(itemConfigs)
695
+ // 获取原JS函数,不存在添加
696
+ if (templateJs) {
697
+ let { JS = '' } = this.designer.pageConfig
698
+ const result = JS.match(/export\sfunction\s(\w+)/g)
699
+ const events = []
700
+ if (result) {
701
+ result.forEach(item => {
702
+ events.push(item.replace(/export\sfunction\s/, ''))
703
+ })
704
+ }
705
+
706
+ const templateJsResult = templateJs.split(/export\s+function\s+/)
707
+ templateJsResult.forEach(item => {
708
+ const funtionStr = item.replace(/\/\*(\n|.)+?\*\/[\n\s]+$/, '')
709
+ if (funtionStr.replace(/[\n\s]+/g, '').length > 0) {
710
+ const funtionName = funtionStr.split(/\s+\(/)[0]
711
+ if (![...new Set(events)].includes(funtionName)) {
712
+ JS += 'export function ' + funtionStr.replace(/^\w+/, funtionName)
713
+ }
714
+ }
715
+ })
716
+ this.designer.updatePageConfig({ JS })
717
+ }
718
+ }
719
+ },
720
+ openTemplateDialog (v) {
721
+ this.showTemplateModal = true
722
+ this.template = {
723
+ NAME: '',
724
+ LEVEL: '03',
725
+ CONTENT: JSON.stringify(v)
726
+ }
727
+ },
728
+ saveAsTemplate () {
729
+ if (!this.template.ID) {
730
+ this.$message.error('请输入模板编号')
731
+ return
732
+ }
733
+ if (!this.template.NAME) {
734
+ this.$message.error('请输入模板名称')
735
+ return
736
+ }
737
+ const params = {
738
+ 'bean.CLIENT': this.CLIENT,
739
+ 'bean.SYSTEM': this.SYSTEM,
740
+ 'bean.ID': this.template.ID,
741
+ 'bean.NAME': this.template.NAME,
742
+ 'bean.TYPE': '01',
743
+ 'bean.LEVEL': this.template.LEVEL,
744
+ 'bean.PICTURE': this.template.PICTURE,
745
+ 'bean.CONTENT': this.template.CONTENT
746
+ }
747
+ this.$http.save({
748
+ entityId: 'FM_TEMPLATE',
749
+ ...params
750
+ })
751
+ .then(() => {
752
+ this.$message.success('保存成功')
753
+ this.showTemplateModal = false
754
+ })
755
+ .catch(err => {
756
+ this.$message.error(err.message)
757
+ })
758
+ },
759
+ // 滚动到指定组件位置
760
+ scrollToWidget (widgetId) {
761
+ const treeContainer = this.$el.querySelector('.epx-page-designer-widget-tree__list')
762
+ if (!treeContainer) return
763
+
764
+ const targetElement = treeContainer.querySelector(`[data-tree-widget-id="${widgetId}"]`)
765
+ if (!targetElement) return
766
+
767
+ const containerRect = treeContainer.getBoundingClientRect()
768
+ const targetRect = targetElement.getBoundingClientRect()
769
+
770
+ // 检查元素是否在可视区域内
771
+ const isVisible = targetRect.top >= containerRect.top && targetRect.bottom <= containerRect.bottom
772
+
773
+ if (!isVisible) {
774
+ // 滚动到元素位置,留一些边距
775
+ const scrollTop = targetElement.offsetTop - treeContainer.offsetTop - 100
776
+ treeContainer.scrollTo({
777
+ top: Math.max(0, scrollTop),
778
+ behavior: 'smooth'
779
+ })
780
+ }
781
+ },
782
+ // 滚动到根级占位符位置
783
+ scrollToRootPlaceholder (index) {
784
+ const treeContainer = this.$el.querySelector('.epx-page-designer-widget-tree__list')
785
+ if (!treeContainer) return
786
+
787
+ const rootItems = treeContainer.querySelectorAll('[data-tree-widget-id]')
788
+ if (!rootItems || rootItems.length === 0) return
789
+
790
+ let targetElement
791
+ if (index >= rootItems.length) {
792
+ // 滚动到最后一个元素
793
+ targetElement = rootItems[rootItems.length - 1]
794
+ } else if (index > 0) {
795
+ // 滚动到 index 位置的元素
796
+ targetElement = rootItems[index]
797
+ } else {
798
+ // 滚动到第一个元素
799
+ targetElement = rootItems[0]
800
+ }
801
+
802
+ if (targetElement) {
803
+ const containerRect = treeContainer.getBoundingClientRect()
804
+ const targetRect = targetElement.getBoundingClientRect()
805
+
806
+ const isVisible = targetRect.top >= containerRect.top && targetRect.bottom <= containerRect.bottom
807
+
808
+ if (!isVisible) {
809
+ const scrollTop = targetElement.offsetTop - treeContainer.offsetTop - 100
810
+ treeContainer.scrollTo({
811
+ top: Math.max(0, scrollTop),
812
+ behavior: 'smooth'
813
+ })
814
+ }
815
+ }
816
+ },
817
+ /**
818
+ * 处理从预览区域拖拽组件到大纲树
819
+ */
820
+ handleWidgetReorderToTree (payload) {
821
+ const { widgetId, parentWidgetId } = payload
822
+ if (!widgetId) return
823
+
824
+ // 获取被拖拽的组件
825
+ const sourceWidget = this.designer.getWidgetItemById(widgetId)
826
+ if (!sourceWidget) return
827
+
828
+ // 确定目标位置
829
+ let targetParent = null
830
+ if (this.placeholder && this.placeholder.parentId) {
831
+ targetParent = this.designer.getWidgetItemById(this.placeholder.parentId)
832
+ // 非容器不允许作为"放入"的父级:回退到根级
833
+ if (targetParent) {
834
+ const parentInfo = this.designer.getWidgetByType(targetParent.contentType, targetParent.type) || {}
835
+ if (parentInfo.CONTAINER !== '1') targetParent = null
836
+ }
837
+ }
838
+
839
+ // 确保容器有 items 数组
840
+ if (targetParent && !targetParent.items) {
841
+ this.designer.updateWidget(targetParent.id, { items: [] })
842
+ }
843
+
844
+ const targetList = targetParent ? targetParent.items : this.widgetList
845
+ let targetIndex = this.placeholder ? this.placeholder.index : targetList.length
846
+
847
+ // 标准化 ID 比较
848
+ const sourceParentId = parentWidgetId || null
849
+ const targetParentId = targetParent ? targetParent.id : null
850
+
851
+ // 如果是同一个容器内移动,需要先找到源索引
852
+ let sourceIndex = -1
853
+ if (sourceParentId === targetParentId) {
854
+ sourceIndex = targetList.findIndex(w => w.id === widgetId)
855
+
856
+ // 如果目标位置在源位置之后,需要调整索引
857
+ if (sourceIndex !== -1 && targetIndex > sourceIndex) {
858
+ targetIndex = targetIndex - 1
859
+ }
860
+ }
861
+
862
+ // 从源位置删除
863
+ if (parentWidgetId) {
864
+ // 从容器中删除
865
+ const sourceParent = this.designer.getWidgetItemById(parentWidgetId)
866
+ if (sourceParent && sourceParent.items) {
867
+ const sourceList = [...sourceParent.items]
868
+ const idx = sourceList.findIndex(w => w.id === widgetId)
869
+ if (idx !== -1) {
870
+ sourceList.splice(idx, 1)
871
+ this.designer.updateWidget(sourceParent.id, { items: sourceList })
872
+ }
873
+ }
874
+ } else {
875
+ // 从根级删除
876
+ const rootList = [...this.widgetList]
877
+ const idx = rootList.findIndex(w => w.id === widgetId)
878
+ if (idx !== -1) {
879
+ rootList.splice(idx, 1)
880
+ this.widgetList = rootList
881
+ }
882
+ }
883
+
884
+ // 插入到目标位置(在删除之后重新获取 targetList,因为 this.widgetList 可能已经改变)
885
+ const finalTargetList = targetParent ? targetParent.items : this.widgetList
886
+ if (targetIndex < 0) targetIndex = 0
887
+ if (targetIndex > finalTargetList.length) targetIndex = finalTargetList.length
888
+
889
+ finalTargetList.splice(targetIndex, 0, sourceWidget)
890
+
891
+ // 如果是插入到容器,需要更新容器
892
+ if (targetParent) {
893
+ this.designer.updateWidget(targetParent.id, { items: [...finalTargetList] })
894
+ }
895
+
896
+ this.designer.setSelected && this.designer.setSelected(sourceWidget)
897
+ this.designer.emitHistoryChange && this.designer.emitHistoryChange()
898
+ }
899
+ },
900
+ created () {
901
+ // 组件库原生拖拽结束时,清理大纲占位状态
902
+ if (this.designer && this.designer.handleEvent) {
903
+ this.designer.handleEvent('library-drag-end', () => {
904
+ this.resetLibraryDragState()
905
+ })
906
+ }
907
+ }
908
+ }
909
+ </script>
910
+
911
+ <style lang="scss">
912
+ @include b(page-designer-widget-tree) {
913
+ margin-left: 2px;
914
+ width: 360px;
915
+ height: 100%;
916
+ display: flex;
917
+ flex-direction: column;
918
+ background: var(--epx-bg-card);
919
+ position: relative;
920
+ .el-dialog {
921
+ height: 500px
922
+ }
923
+ @include when(dragging) {
924
+ .epx-page-designer-widget-tree-item, .epx-page-designer-widget-tree-item__header {
925
+ cursor: move!important;;
926
+ }
927
+ }
928
+ @include e(header) {
929
+ height: 48px;
930
+ display: flex;
931
+ justify-content: space-between;
932
+ align-items: center;
933
+ padding: 0 20px;
934
+ border-bottom: 1px solid #e3e3e3;
935
+ >span {
936
+ font-size: var(--epx-font-size-l);
937
+ font-weight: 600;
938
+ }
939
+ >i {
940
+ color: rgba(0, 0, 0, 0.65);
941
+ cursor: pointer;
942
+ }
943
+ }
944
+ @include e(container) {
945
+ flex: 1;
946
+ overflow: auto;
947
+ position: relative;
948
+ >.epx-page-designer-widget-tree__list {
949
+ padding-bottom: 4px;
950
+ }
951
+ }
952
+ @include e(list) {
953
+ min-height: 25px;
954
+ }
955
+ @include e(drag-ghost) {
956
+ width: 100%!important;
957
+ font-size: 0;
958
+ height: 0px;
959
+ box-sizing: border-box;
960
+ background: $--color-primary;
961
+ outline-width: 0;
962
+ .epx-page-designer-widget-tree-item__container {
963
+ height: 0;
964
+ overflow: hidden;
965
+ }
966
+ &::after {
967
+ content: '';
968
+ position: absolute;
969
+ width: 100%;
970
+ border-top: 1px solid;
971
+ @include border_color_primary;
972
+ }
973
+ }
974
+ @include e(drag-in-ghost) {
975
+ @include bg_color_primary(.2)
976
+ }
977
+ @include e(add) {
978
+ margin: 16px 20px;
979
+ display: block;
980
+ width: calc(100% - 40px);
981
+ }
982
+ }
983
+ .epx-page-designer__template-form-item {
984
+ display: flex;
985
+ padding: 16px 0;
986
+ align-items: center;
987
+ >label {
988
+ width: 80px;
989
+ flex-shrink: 0;
990
+ }
991
+ .el-input {
992
+ width: 220px;
993
+ }
994
+ }
995
+ </style>