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

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 +159 -0
  2. package/README.md +44 -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 +52 -0
  15. package/dist/src/page-designer/PageConfigPreview.js +101 -0
  16. package/dist/src/page-designer/PageDesigner.js +843 -0
  17. package/dist/src/page-designer/designer.js +1119 -0
  18. package/dist/src/page-designer/index.js +51 -0
  19. package/dist/src/page-designer/mixins/dragSourceMixin.js +94 -0
  20. package/dist/src/page-designer/page-variable-panel/JsonEditor.js +105 -0
  21. package/dist/src/page-designer/page-variable-panel/PageVariablePanel.js +938 -0
  22. package/dist/src/page-designer/page-variable-panel/index.js +6 -0
  23. package/dist/src/page-designer/page-variable-panel/jsonlint.js +229 -0
  24. package/dist/src/page-designer/previews/add-form/Preview.js +7 -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 +193 -0
  27. package/dist/src/page-designer/previews/button/Preview.js +29 -0
  28. package/dist/src/page-designer/previews/card/Preview.js +86 -0
  29. package/dist/src/page-designer/previews/carousel/CarouselItemPreview.js +32 -0
  30. package/dist/src/page-designer/previews/carousel/Preview.js +60 -0
  31. package/dist/src/page-designer/previews/collapse/CollapseItemPreview.js +117 -0
  32. package/dist/src/page-designer/previews/collapse/Preview.js +34 -0
  33. package/dist/src/page-designer/previews/dropdown/Preview.js +67 -0
  34. package/dist/src/page-designer/previews/entity-list/Preview.js +521 -0
  35. package/dist/src/page-designer/previews/entity-sub-list/Preview.js +351 -0
  36. package/dist/src/page-designer/previews/entity-virtual-list/Preview.js +10 -0
  37. package/dist/src/page-designer/previews/form-field/preview/Checkbox.js +90 -0
  38. package/dist/src/page-designer/previews/form-field/preview/Date.js +76 -0
  39. package/dist/src/page-designer/previews/form-field/preview/Input.js +73 -0
  40. package/dist/src/page-designer/previews/form-field/preview/InputNumber.js +73 -0
  41. package/dist/src/page-designer/previews/form-field/preview/Object.js +76 -0
  42. package/dist/src/page-designer/previews/form-field/preview/Radio.js +145 -0
  43. package/dist/src/page-designer/previews/form-field/preview/Select.js +77 -0
  44. package/dist/src/page-designer/previews/form-field/preview/Textarea.js +77 -0
  45. package/dist/src/page-designer/previews/grid/Preview.js +138 -0
  46. package/dist/src/page-designer/previews/html/Preview.js +17 -0
  47. package/dist/src/page-designer/previews/icon/Preview.js +19 -0
  48. package/dist/src/page-designer/previews/image/Preview.js +35 -0
  49. package/dist/src/page-designer/previews/index.js +73 -0
  50. package/dist/src/page-designer/previews/layout/ColumnPreview.js +46 -0
  51. package/dist/src/page-designer/previews/layout/Preview.js +109 -0
  52. package/dist/src/page-designer/previews/num/Preview.js +131 -0
  53. package/dist/src/page-designer/previews/page-tabs/Preview.js +74 -0
  54. package/dist/src/page-designer/previews/step/Preview.js +206 -0
  55. package/dist/src/page-designer/previews/tabs/Preview.js +94 -0
  56. package/dist/src/page-designer/previews/tabs/tab-pane/Preview.js +32 -0
  57. package/dist/src/page-designer/previews/text/Preview.js +37 -0
  58. package/dist/src/page-designer/previews/text-editor/Preview.js +22 -0
  59. package/dist/src/page-designer/previews/video/Preview.js +9 -0
  60. package/dist/src/page-designer/setting-panel/Advance.js +280 -0
  61. package/dist/src/page-designer/setting-panel/CodeEditor.js +93 -0
  62. package/dist/src/page-designer/setting-panel/Property.js +164 -0
  63. package/dist/src/page-designer/setting-panel/Setting.js +295 -0
  64. package/dist/src/page-designer/setting-panel/Style.js +1590 -0
  65. package/dist/src/page-designer/setting-panel/css-editor/CssEditor.js +97 -0
  66. package/dist/src/page-designer/setting-panel/css-editor/css-hint.js +83 -0
  67. package/dist/src/page-designer/setting-panel/index.js +10 -0
  68. package/dist/src/page-designer/template-attribute-panel/TemplateAttributePanel.js +486 -0
  69. package/dist/src/page-designer/template-attribute-panel/index.js +4 -0
  70. package/dist/src/page-designer/template-library/Library.js +218 -0
  71. package/dist/src/page-designer/template-library/index.js +4 -0
  72. package/dist/src/page-designer/widget-library/Base.js +169 -0
  73. package/dist/src/page-designer/widget-library/Library.js +212 -0
  74. package/dist/src/page-designer/widget-library/index.js +6 -0
  75. package/dist/src/page-designer/widget-preview/Container.js +79 -0
  76. package/dist/src/page-designer/widget-preview/DragGhost.js +53 -0
  77. package/dist/src/page-designer/widget-preview/DropZoneOverlay.js +41 -0
  78. package/dist/src/page-designer/widget-preview/HoverOverlay.js +60 -0
  79. package/dist/src/page-designer/widget-preview/Mixin.js +259 -0
  80. package/dist/src/page-designer/widget-preview/Placeholder.js +27 -0
  81. package/dist/src/page-designer/widget-preview/Preview.js +276 -0
  82. package/dist/src/page-designer/widget-preview/PreviewItem.js +82 -0
  83. package/dist/src/page-designer/widget-preview/SelectedOverlay.js +331 -0
  84. package/dist/src/page-designer/widget-preview/Template.js +65 -0
  85. package/dist/src/page-designer/widget-preview/WidgetWrapper.js +169 -0
  86. package/dist/src/page-designer/widget-preview/directive.js +158 -0
  87. package/dist/src/page-designer/widget-preview/dropPosition.js +49 -0
  88. package/dist/src/page-designer/widget-preview/index.js +22 -0
  89. package/dist/src/page-designer/widget-preview/overlayPositionMixin.js +86 -0
  90. package/dist/src/page-designer/widget-preview/resolvePreviewName.js +31 -0
  91. package/dist/src/page-designer/widget-tree/Item.js +579 -0
  92. package/dist/src/page-designer/widget-tree/Tree.js +854 -0
  93. package/dist/src/page-designer/widget-tree/index.js +6 -0
  94. package/dist/src/visual/AddForm.js +171 -0
  95. package/dist/src/visual/AddFormItem.js +479 -0
  96. package/dist/src/visual/AppIndex.js +242 -0
  97. package/dist/src/visual/ApplyForm.js +134 -0
  98. package/dist/src/visual/AttributeList.js +343 -0
  99. package/dist/src/visual/BasePage.js +76 -0
  100. package/dist/src/visual/Button.js +4 -0
  101. package/dist/src/visual/Button.vue.js +89 -0
  102. package/dist/src/visual/CardNum.js +73 -0
  103. package/dist/src/visual/CategoryList.js +568 -0
  104. package/dist/src/visual/Chart.js +26 -0
  105. package/dist/src/visual/ChartNew.js +4 -0
  106. package/dist/src/visual/ChartNew.vue.js +54 -0
  107. package/dist/src/visual/CheckForm.js +109 -0
  108. package/dist/src/visual/ClientList.js +40 -0
  109. package/dist/src/visual/CodeManage.js +112 -0
  110. package/dist/src/visual/Component.js +5 -0
  111. package/dist/src/visual/Component.vue.js +1332 -0
  112. package/dist/src/visual/ComponentList.js +279 -0
  113. package/dist/src/visual/Config.js +7 -0
  114. package/dist/src/visual/Config.vue.js +862 -0
  115. package/dist/src/visual/ConfigItem.js +7 -0
  116. package/dist/src/visual/ConfigItem.vue.js +192 -0
  117. package/dist/src/visual/ConfigSelectItems.js +7 -0
  118. package/dist/src/visual/ConfigSelectItems.vue.js +260 -0
  119. package/dist/src/visual/CreatePage.js +388 -0
  120. package/dist/src/visual/DashboardDiv.js +57 -0
  121. package/dist/src/visual/DashboardTabs.js +8 -0
  122. package/dist/src/visual/DashboardTabs.vue.js +127 -0
  123. package/dist/src/visual/DashboardWidget.js +4 -0
  124. package/dist/src/visual/DashboardWidget.vue.js +62 -0
  125. package/dist/src/visual/DblogList.js +81 -0
  126. package/dist/src/visual/EntityAddPage.js +48 -0
  127. package/dist/src/visual/EntityApplyPage.js +53 -0
  128. package/dist/src/visual/EntityCardList.js +454 -0
  129. package/dist/src/visual/EntityCheckPage.js +65 -0
  130. package/dist/src/visual/EntityFindPage.js +44 -0
  131. package/dist/src/visual/EntityList.js +5 -0
  132. package/dist/src/visual/EntityList.vue.js +1221 -0
  133. package/dist/src/visual/EntityListPage.js +42 -0
  134. package/dist/src/visual/EntityNoSubmitSubList.js +266 -0
  135. package/dist/src/visual/EntityRightSubList.js +28 -0
  136. package/dist/src/visual/EntitySubAdd.js +9 -0
  137. package/dist/src/visual/EntitySubGridItem.js +65 -0
  138. package/dist/src/visual/EntitySubList.js +433 -0
  139. package/dist/src/visual/EntityTreeFindPage.js +31 -0
  140. package/dist/src/visual/EntityTreeManage.js +48 -0
  141. package/dist/src/visual/EntityTreePage.js +41 -0
  142. package/dist/src/visual/ExcelPreview.js +9 -0
  143. package/dist/src/visual/FormField.js +4 -0
  144. package/dist/src/visual/FormField.vue.js +121 -0
  145. package/dist/src/visual/HeaderNew.js +160 -0
  146. package/dist/src/visual/Html.js +7 -0
  147. package/dist/src/visual/Html.vue.js +109 -0
  148. package/dist/src/visual/Import.js +52 -0
  149. package/dist/src/visual/InterfaceSubList.js +20 -0
  150. package/dist/src/visual/ListFirst.js +703 -0
  151. package/dist/src/visual/MEntityAddPage.js +65 -0
  152. package/dist/src/visual/MEntityList.js +484 -0
  153. package/dist/src/visual/MEntityListPage.js +39 -0
  154. package/dist/src/visual/MEntitySubList.js +236 -0
  155. package/dist/src/visual/MetaList.js +22 -0
  156. package/dist/src/visual/ModuleIndexPage.js +66 -0
  157. package/dist/src/visual/ModuleList.js +46 -0
  158. package/dist/src/visual/NavAddForm.js +172 -0
  159. package/dist/src/visual/NavFormCatalogItem.js +43 -0
  160. package/dist/src/visual/NumItem.js +69 -0
  161. package/dist/src/visual/NumStatistic.js +5 -0
  162. package/dist/src/visual/NumStatistic.vue.js +81 -0
  163. package/dist/src/visual/OrgChart.js +106 -0
  164. package/dist/src/visual/PageCatalog.js +26 -0
  165. package/dist/src/visual/PageConfig.js +222 -0
  166. package/dist/src/visual/PageTabs.js +48 -0
  167. package/dist/src/visual/Progress.js +39 -0
  168. package/dist/src/visual/ProgressItem.js +43 -0
  169. package/dist/src/visual/SystemManager.js +76 -0
  170. package/dist/src/visual/Title.js +44 -0
  171. package/dist/src/visual/TodoList.js +13 -0
  172. package/dist/src/visual/UserFormItem.js +40 -0
  173. package/dist/src/visual/UserManage.js +34 -0
  174. package/dist/src/visual/chart/CircularPie.js +8 -0
  175. package/dist/src/visual/chart/Column.js +69 -0
  176. package/dist/src/visual/chart/HoriColumn.js +8 -0
  177. package/dist/src/visual/chart/Line.js +8 -0
  178. package/dist/src/visual/chart/Pie.js +8 -0
  179. package/dist/src/visual/config/Background.js +525 -0
  180. package/dist/src/visual/config/Chart.js +153 -0
  181. package/dist/src/visual/config/Checkbox.js +62 -0
  182. package/dist/src/visual/config/Color.js +40 -0
  183. package/dist/src/visual/config/DesignReport.js +23 -0
  184. package/dist/src/visual/config/Event.js +303 -0
  185. package/dist/src/visual/config/Field.js +519 -0
  186. package/dist/src/visual/config/Font.js +201 -0
  187. package/dist/src/visual/config/FormItem.js +22 -0
  188. package/dist/src/visual/config/Function.js +113 -0
  189. package/dist/src/visual/config/Html.js +110 -0
  190. package/dist/src/visual/config/Image.js +101 -0
  191. package/dist/src/visual/config/Input.js +176 -0
  192. package/dist/src/visual/config/Input.vue.js +479 -0
  193. package/dist/src/visual/config/LazyDialog.js +40 -0
  194. package/dist/src/visual/config/List.js +64 -0
  195. package/dist/src/visual/config/ListField.js +2079 -0
  196. package/dist/src/visual/config/MField.js +732 -0
  197. package/dist/src/visual/config/Number.js +36 -0
  198. package/dist/src/visual/config/Object.js +167 -0
  199. package/dist/src/visual/config/Operate.js +1108 -0
  200. package/dist/src/visual/config/OperateItem.js +1185 -0
  201. package/dist/src/visual/config/Options.js +7 -0
  202. package/dist/src/visual/config/Options.vue.js +278 -0
  203. package/dist/src/visual/config/OrderField.js +504 -0
  204. package/dist/src/visual/config/Page.js +75 -0
  205. package/dist/src/visual/config/Params.js +352 -0
  206. package/dist/src/visual/config/Radio.js +126 -0
  207. package/dist/src/visual/config/Row.js +103 -0
  208. package/dist/src/visual/config/Scope.js +349 -0
  209. package/dist/src/visual/config/Select.js +94 -0
  210. package/dist/src/visual/config/Switch.js +36 -0
  211. package/dist/src/visual/config/Textarea.js +174 -0
  212. package/dist/src/visual/config/Textarea.vue.js +507 -0
  213. package/dist/src/visual/config/Tree.js +137 -0
  214. package/dist/src/visual/config/remote-cache.js +29 -0
  215. package/dist/src/visual/config/show-condition.js +19 -0
  216. package/dist/src/visual/config/variable-sources.js +26 -0
  217. package/dist/src/visual/config/wait-ref.js +18 -0
  218. package/dist/src/visual/config-page/ComponentLibrary.js +169 -0
  219. package/dist/src/visual/config-page/ComponentLibraryDialog.js +249 -0
  220. package/dist/src/visual/config-page/ComponentList.js +8 -0
  221. package/dist/src/visual/config-page/ComponentList.vue.js +292 -0
  222. package/dist/src/visual/config-page/ComponentPreview.js +7 -0
  223. package/dist/src/visual/config-page/ComponentPreview.vue.js +151 -0
  224. package/dist/src/visual/config-page/ConfigOption.js +12 -0
  225. package/dist/src/visual/config-page/ConfigPanel.js +301 -0
  226. package/dist/src/visual/config-page/Dashboard.js +2159 -0
  227. package/dist/src/visual/config-page/DashboardDesign.js +605 -0
  228. package/dist/src/visual/config-page/DashboardGlobalConfig.js +5 -0
  229. package/dist/src/visual/config-page/DashboardGlobalConfig.vue.js +292 -0
  230. package/dist/src/visual/config-page/DashboardMobile.js +1114 -0
  231. package/dist/src/visual/config-page/DashboardSetting.js +85 -0
  232. package/dist/src/visual/config-page/PagePreview.js +7 -0
  233. package/dist/src/visual/config-page/PagePreview.vue.js +72 -0
  234. package/dist/src/visual/config-page/StyleConfig.js +978 -0
  235. package/dist/src/visual/config-page/VisualConfigPage.js +644 -0
  236. package/dist/src/visual/config-page/dashboard-theme-setting/Background.js +179 -0
  237. package/dist/src/visual/config-page/dashboard-theme-setting/Border.js +313 -0
  238. package/dist/src/visual/config-page/dashboard-theme-setting/Font.js +191 -0
  239. package/dist/src/visual/config-page/dashboard-theme-setting/Index.js +544 -0
  240. package/dist/src/visual/config-page/dashboard-theme-setting/Shadow.js +173 -0
  241. package/dist/src/visual/config-page/index.js +89 -0
  242. package/dist/src/visual/index.js +150 -0
  243. package/dist/src/visual/mixins/innerGridMixin.js +121 -0
  244. package/dist/src/visual/search/Filter.js +48 -0
  245. package/dist/src/visual/step/Index.js +7 -0
  246. package/dist/src/visual/step/Index.vue.js +485 -0
  247. package/dist/src/visual/step/Item.js +138 -0
  248. package/dist/src/visual/widgets/CardFormItemVisual.js +44 -0
  249. package/dist/src/visual/widgets/CarouselVisual.js +7 -0
  250. package/dist/src/visual/widgets/CarouselVisual.vue.js +303 -0
  251. package/dist/src/visual/widgets/CollapseVisual.js +7 -0
  252. package/dist/src/visual/widgets/CollapseVisual.vue.js +202 -0
  253. package/dist/src/visual/widgets/DropdownVisual.js +7 -0
  254. package/dist/src/visual/widgets/DropdownVisual.vue.js +955 -0
  255. package/dist/src/visual/widgets/LayoutConfig.js +7 -0
  256. package/dist/src/visual/widgets/LayoutConfig.vue.js +168 -0
  257. package/dist/src/visual/widgets/ListVisual.js +348 -0
  258. package/dist/src/visual/widgets/MEntityListFindVisual.js +75 -0
  259. package/dist/src/visual/widgets/ProcessFormItemVisual.js +4 -0
  260. package/dist/src/visual/widgets/ProcessFormItemVisual.vue.js +45 -0
  261. package/dist/src/visual/widgets/TabsConfig.js +7 -0
  262. package/dist/src/visual/widgets/TabsConfig.vue.js +343 -0
  263. package/dist/style.css +9907 -0
  264. package/package.json +103 -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,1017 @@
1
+ <template>
2
+ <div :class="['epx-page-designer', { 'epx-page-designer--new-window': newWindow || inline }]">
3
+ <!-- 头部 -->
4
+ <div class="epx-page-designer__header">
5
+ <div class="epx-page-designer__header-left">
6
+ <i class="el-icon-arrow-left" @click="back"></i>
7
+ <p class="epx-page-designer__header-content">
8
+ <span class="epx-page-designer__header-subtitle">{{designer.mode==='component' ? '正在编辑自定义组件': designer.mode==='template' ? '正在编辑模板' : $t('Editing the page')}}:</span>
9
+ <span class="epx-page-designer__header-title">{{currentPage.title || templateInfo.NAME || componentInfo.TITLE}}</span>
10
+ </p>
11
+ </div>
12
+ <div class="epx-page-designer__header-center">
13
+ <i class="el-icon-monitor" :class="{'is-active': terminal==='pc'}" @click="terminal='pc'"></i>
14
+ <i class="el-icon-mobile" :class="{'is-active': terminal==='mobile'}" @click="terminal='mobile'"></i>
15
+ </div>
16
+ <div class="epx-page-designer__header-operate">
17
+ <p v-if="designer.mode==='page'" class="epx-page-designer__header-operate-item" @click="pageSetting">{{$t('page setup')}}</p>
18
+ <el-button type="primary" size="default" @click="saveConfigs">{{$t('save')}}</el-button>
19
+ </div>
20
+ </div>
21
+ <el-container class="epx-page-designer__container">
22
+ <div class="epx-page-designer__function-panel">
23
+ <!-- 导航tabs -->
24
+ <ul class="epx-page-designer__function-tabs">
25
+ <li :class="{'epx-page-designer__function-tabs-item': true, 'is-active': showPanel==='baseComponentLibrary'}" @click="showPanel='baseComponentLibrary'">
26
+ <i class="epx-icon-yingyong"></i>
27
+ <span>组件库</span>
28
+ </li>
29
+ <li :class="{'epx-page-designer__function-tabs-item': true, 'is-active': showPanel==='componentLibrary'}" @click="showPanel='componentLibrary'">
30
+ <i class="el-icon-files"></i>
31
+ <span>其它组件</span>
32
+ </li>
33
+ <li v-if="designer.mode!=='template'" :class="{'epx-page-designer__function-tabs-item': true, 'is-active': showPanel==='templateLibrary'}" @click="showPanel='templateLibrary'">
34
+ <i class="epx-icon-moban"></i>
35
+ <span>模板库</span>
36
+ </li>
37
+ <li :class="{'epx-page-designer__function-tabs-item': true, 'is-active': showPanel==='selectComponent'}" @click="showPanel='selectComponent'">
38
+ <i class="epx-icon-dagang"></i>
39
+ <span>大纲</span>
40
+ </li>
41
+ <li :class="{'epx-page-designer__function-tabs-item': true, 'is-active': showPanel==='jsPanel'}" @click="showPanel='jsPanel'">
42
+ <i class="epx-icon-js"></i>
43
+ <span>页面JS</span>
44
+ </li>
45
+ <li v-if="designer.mode==='page'" :class="{'epx-page-designer__function-tabs-item': true, 'is-active': showPanel==='pageVariable'}" @click="showPanel='pageVariable'">
46
+ <i class="el-icon-document"></i>
47
+ <span>变量</span>
48
+ </li>
49
+ <li v-if="designer.mode==='template' || designer.mode==='component'" :class="{'epx-page-designer__function-tabs-item': true, 'is-active': showPanel==='templateAttribute'}" @click="showPanel='templateAttribute'">
50
+ <i class="el-icon-setting"></i>
51
+ <span>参数</span>
52
+ </li>
53
+ </ul>
54
+ <!-- 功能面板 -->
55
+ <epx-page-designer-widget-tree
56
+ v-if="showPanel==='selectComponent'"
57
+ :designer="designer"
58
+ @close="showPanel=null"
59
+ >
60
+ </epx-page-designer-widget-tree>
61
+ <epx-page-designer-widget-library-base
62
+ v-show="showPanel==='baseComponentLibrary'"
63
+ :designer="designer"
64
+ @close="showPanel=null"
65
+ >
66
+ </epx-page-designer-widget-library-base>
67
+ <epx-page-designer-widget-library
68
+ v-show="showPanel==='componentLibrary'"
69
+ :designer="designer"
70
+ @close="showPanel=null"
71
+ >
72
+ </epx-page-designer-widget-library>
73
+ <epx-page-designer-template-library
74
+ v-show="showPanel==='templateLibrary'"
75
+ :designer="designer"
76
+ @close="showPanel=null"
77
+ >
78
+ </epx-page-designer-template-library>
79
+ <el-drawer :title="$t('Page JS')" class="epx-page-designer__js-drawer" :model-value="showPanel==='jsPanel'" @update:modelValue="showPanel=null" direction="ltr" size="600px" :modal="false">
80
+ <epx-js-panel :value="designer.pageConfig.JS" @change="v=>designer.updatePageConfig({ JS: v })"></epx-js-panel>
81
+ </el-drawer>
82
+ <epx-page-designer-page-variable-panel v-if="showPanel==='pageVariable'"
83
+ :designer="designer"
84
+ @close="showPanel=null"
85
+ >
86
+ </epx-page-designer-page-variable-panel>
87
+
88
+ <template-attribute-panel
89
+ v-if="designer.mode==='template' || designer.mode==='component'"
90
+ v-show="showPanel==='templateAttribute'"
91
+ :designer="designer"
92
+ :templateInfo="designer.mode==='component'? componentInfo : templateInfo"
93
+ @close="showPanel=null"
94
+ >
95
+ </template-attribute-panel>
96
+ </div>
97
+ <!-- 页面预览 -->
98
+ <el-container ref="previewContainer" class="epx-page-designer__content" >
99
+ <epx-page-designer-widget-preview
100
+ :style="previewStyle"
101
+ :designer="designer"
102
+ :pageRelationList="relationList"
103
+ :terminal="terminal"
104
+ >
105
+ </epx-page-designer-widget-preview>
106
+ <!-- 选中组件浮层(点击模式) -->
107
+ <epx-page-designer-selected-overlay
108
+ :designer="designer"
109
+ :widget="selectedWidgetData.widget"
110
+ :target-element="selectedWidgetData.element"
111
+ :visible="!!selectedWidgetData.widget"
112
+ :parent-widget="selectedWidgetData.parentWidget"
113
+ ></epx-page-designer-selected-overlay>
114
+ <!-- 悬停组件浮层(悬停模式) -->
115
+ <epx-page-designer-hover-overlay
116
+ :designer="designer"
117
+ :widget="hoverWidgetData.widget"
118
+ :target-element="hoverWidgetData.element"
119
+ :visible="!!hoverWidgetData.widget"
120
+ ></epx-page-designer-hover-overlay>
121
+ <!-- 拖拽放置区域浮层(独立元素模拟位置,不修改原 drop-zone 样式) -->
122
+ <epx-page-designer-drag-zone-overlay
123
+ :designer="designer"
124
+ :target-element="designer.dragOverTargetElement"
125
+ :visible="!!designer.dragOverTarget"
126
+ ></epx-page-designer-drag-zone-overlay>
127
+ <!-- 拖拽模拟元素 -->
128
+ <epx-page-designer-drag-ghost
129
+ :visible="dragGhost.visible"
130
+ :widget-title="dragGhost.title"
131
+ :widget-icon="dragGhost.icon"
132
+ :position="dragGhost.position"
133
+ ></epx-page-designer-drag-ghost>
134
+ <!-- 拖拽插入位置线 -->
135
+ <div
136
+ v-if="designer.dragInsertLine"
137
+ class="epx-page-designer-insert-line"
138
+ :style="insertLineStyle"
139
+ ></div>
140
+ </el-container>
141
+ <!-- 组件配置面板 -->
142
+ <div class="epx-page-designer__setting-panel">
143
+ <!-- 获取组件对应的配置面板 -->
144
+ <epx-page-designer-setting-panel
145
+ v-if="loadVisualComponent"
146
+ :designer="designer"
147
+ :selected-widget="designer.selectedWidget"
148
+ :form-config="designer.formConfig"
149
+ :relationList="relationList"
150
+ >
151
+ </epx-page-designer-setting-panel>
152
+ </div>
153
+ </el-container>
154
+ <!-- 浮动大纲树(拖拽组件时显示在最右侧,可直接接收拖拽添加组件) -->
155
+ <div
156
+ class="epx-page-designer__floating-tree"
157
+ v-if="dragGhost.visible"
158
+ >
159
+ <epx-page-designer-widget-tree :designer="designer" :is-floating="true" />
160
+ </div>
161
+ </div>
162
+ </template>
163
+
164
+ <script>
165
+ import { mapState, mapGetters } from 'vuex'
166
+ import { createDesigner, getWidgetChildren } from './designer'
167
+ import TemplateAttributePanel from './template-attribute-panel'
168
+ import { HoverOverlay, SelectedOverlay, DropZoneOverlay } from './widget-preview'
169
+ import DragGhost from './widget-preview/DragGhost.vue'
170
+ export default {
171
+ name: 'epx-page-designer',
172
+ components: {
173
+ TemplateAttributePanel,
174
+ 'epx-page-designer-selected-overlay': SelectedOverlay,
175
+ 'epx-page-designer-hover-overlay': HoverOverlay,
176
+ 'epx-page-designer-drag-zone-overlay': DropZoneOverlay,
177
+ 'epx-page-designer-drag-ghost': DragGhost
178
+ },
179
+ props: {
180
+ newWindow: Boolean,
181
+ inline: Boolean,
182
+ initConfig: {
183
+ type: Object,
184
+ default: null
185
+ }
186
+ },
187
+ data () {
188
+ return {
189
+ designer: createDesigner(this),
190
+ showPanel: '',
191
+ allWidgets: [],
192
+ loadVisualComponent: false,
193
+ templateInfo: {},
194
+ componentInfo: {},
195
+ relationList: [],
196
+ screenWidth: 1920,
197
+ scaleRatio: 1,
198
+ terminal: 'pc',
199
+ selectedWidgetData: {
200
+ widget: null,
201
+ element: null,
202
+ parentWidget: null
203
+ },
204
+ hoverWidgetData: {
205
+ widget: null,
206
+ element: null,
207
+ parentWidget: null
208
+ },
209
+ // 悬浮窗位置更新节流
210
+ dragGhostUpdateTimer: null
211
+ }
212
+ },
213
+ computed: {
214
+ ...mapState({
215
+ showMenu: state => state.config.showMenu,
216
+ showAppNav: state => state.config.showAppNav,
217
+ mobileWidth: state => state.config.mobileWidth
218
+ }),
219
+ ...mapGetters([
220
+ 'getPageById'
221
+ ]),
222
+ currentPage () {
223
+ if (this.initConfig) {
224
+ return this._initPageObj || {}
225
+ }
226
+ const page = this.getPageById(this.$query.id)
227
+ return page || {}
228
+ },
229
+ previewStyle () {
230
+ if (this.terminal === 'mobile') {
231
+ return {
232
+ width: '375px',
233
+ height: 'calc(100% - 32px)',
234
+ margin: '16px auto',
235
+ boxShadow: '0 2px 10px 0 rgba(31,56,88,.15)'
236
+ }
237
+ }
238
+ return {
239
+ flexShrink: 0,
240
+ width: this.screenWidth + 'px',
241
+ transform: `scale(${this.scaleRatio})`,
242
+ transformOrigin: 'top left',
243
+ height: (100 / this.scaleRatio).toFixed(4) + '%'
244
+ }
245
+ },
246
+ insertLineStyle () {
247
+ const line = this.designer.dragInsertLine
248
+ if (!line) return {}
249
+ return {
250
+ position: 'fixed',
251
+ top: (line.top - 2) + 'px',
252
+ left: line.left + 'px',
253
+ width: line.width + 'px',
254
+ height: '4px',
255
+ pointerEvents: 'none',
256
+ zIndex: 10001
257
+ }
258
+ },
259
+ // 从 designer 获取拖拽状态
260
+ dragGhost () {
261
+ const state = this.designer.dragState
262
+ return {
263
+ visible: state.ghostVisible,
264
+ title: state.ghostTitle,
265
+ icon: state.ghostIcon,
266
+ position: state.ghostPosition
267
+ }
268
+ }
269
+ },
270
+ watch: {
271
+ terminal: {
272
+ handler (val) {
273
+ this.designer.terminal = val
274
+ },
275
+ immediate: true
276
+ },
277
+ 'designer.selectedWidget' (newWidget) {
278
+ // 当选中组件变化时,更新浮层显示
279
+ if (!newWidget) {
280
+ this.selectedWidgetData = {
281
+ widget: null,
282
+ element: null,
283
+ parentWidget: null
284
+ }
285
+ return
286
+ }
287
+ // 使用 nextTick 确保 DOM 已更新
288
+ this.$nextTick(() => {
289
+ const element = document.querySelector(`[data-widget-id="${newWidget.id}"]`)
290
+ if (element) {
291
+ // 查找父组件
292
+ const parentWidget = this.designer.findParentWidget(newWidget.id)
293
+ this.selectedWidgetData = {
294
+ widget: newWidget,
295
+ element: element,
296
+ parentWidget: parentWidget || null
297
+ }
298
+ } else {
299
+ // 如果找不到元素,清空选中数据
300
+ this.selectedWidgetData = {
301
+ widget: null,
302
+ element: null,
303
+ parentWidget: null
304
+ }
305
+ }
306
+ })
307
+ }
308
+ },
309
+ methods: {
310
+ // 统一响应 designer 发出的 hover-change 事件
311
+ handleDesignerHoverChange (data) {
312
+ const { widget, parentWidget } = data || {}
313
+ if (!widget) {
314
+ this.hoverWidgetData = {
315
+ widget: null,
316
+ element: null,
317
+ parentWidget: null
318
+ }
319
+ return
320
+ }
321
+ // 使用 nextTick 确保 DOM 已更新
322
+ this.$nextTick(() => {
323
+ const element = document.querySelector(`[data-widget-id="${widget.id}"]`)
324
+ if (element) {
325
+ this.hoverWidgetData = {
326
+ widget,
327
+ element,
328
+ parentWidget: parentWidget || null
329
+ }
330
+ } else {
331
+ // 如果找不到元素,清空悬浮数据
332
+ this.hoverWidgetData = {
333
+ widget: null,
334
+ element: null,
335
+ parentWidget: null
336
+ }
337
+ }
338
+ })
339
+ },
340
+ handleWidgetClick (data) {
341
+ // 更新选中的组件数据(点击时仅更新选中浮层,不影响悬停浮层)
342
+ this.selectedWidgetData = {
343
+ widget: data.widget,
344
+ element: data.element,
345
+ parentWidget: data.parentWidget
346
+ }
347
+ },
348
+ handleDragStart (data) {
349
+ const { widget, title, icon, x, y, source } = data || {}
350
+ if (widget || title) {
351
+ this.designer.startDrag({
352
+ source: source || 'library',
353
+ data: widget,
354
+ title: title || widget?.title || '',
355
+ icon: icon || '',
356
+ x: x || 0,
357
+ y: y || 0,
358
+ isNative: true
359
+ })
360
+ }
361
+ },
362
+ handleDragMove (data) {
363
+ if (this.designer.dragState.isDragging && data) {
364
+ this.designer.updateDragGhostPosition(data.x || 0, data.y || 0)
365
+ }
366
+ },
367
+ handleDragEnd () {
368
+ this.designer.endDrag()
369
+ },
370
+ handleDocumentDragOver (e) {
371
+ // 阻止默认行为,确保 dragover 事件在整个文档中持续触发,
372
+ // 同时允许在页面中作为有效的拖拽目标使用
373
+ if (e && typeof e.preventDefault === 'function') {
374
+ e.preventDefault()
375
+ }
376
+ // 使用 requestAnimationFrame 优化悬浮窗位置更新
377
+ if (this.designer.dragState.isDragging && !this.dragGhostUpdateTimer) {
378
+ this.dragGhostUpdateTimer = requestAnimationFrame(() => {
379
+ this.designer.updateDragGhostPosition(e.clientX, e.clientY)
380
+ this.dragGhostUpdateTimer = null
381
+ })
382
+ }
383
+ },
384
+ handleDocumentDragEnd () {
385
+ this.handleDragEnd()
386
+ },
387
+ handleDocumentDrop (e) {
388
+ // 如果 drop 在大纲树外部,也需要关闭悬浮窗
389
+ // 大纲树内部的 drop 会调用 e.preventDefault(),所以这里只处理外部 drop
390
+ if (this.designer.dragState.isDragging) {
391
+ this.handleDragEnd()
392
+ }
393
+ },
394
+ // 使用鼠标事件模拟拖拽移动和结束,避免依赖原生 drag 事件
395
+ handleDocumentMouseMove (e) {
396
+ if (!this.designer.dragState.isDragging) return
397
+ this.designer.updateDragGhostPosition(e.clientX, e.clientY)
398
+ },
399
+ handleDocumentMouseUp () {
400
+ // 如果正在进行原生拖拽,不要通过 mouseup 结束拖拽
401
+ // 原生拖拽会通过 dragend 事件结束
402
+ if (this.designer.dragState.isNativeDragging) return
403
+
404
+ if (!this.designer.dragState.isDragging) return
405
+ this.handleDragEnd()
406
+ },
407
+ getPage () {
408
+ if (!this.$query.id || !this.$_.isEmpty(this.currentPage)) {
409
+ return Promise.resolve(this.currentPage)
410
+ }
411
+ return this.$store.dispatch({
412
+ type: 'ADD_PAGE',
413
+ pageId: this.$query.id
414
+ })
415
+ },
416
+ getTemplate () {
417
+ return this.$http.get({
418
+ entityId: 'FM_TEMPLATE',
419
+ id: this.$query.id
420
+ })
421
+ },
422
+ async initDesigner () {
423
+ // this.designer = createDesigner(this)
424
+ this.designer.openPanel = v => {
425
+ this.showPanel = v
426
+ }
427
+ // 外部传入配置时直接初始化,不走接口
428
+ if (this.initConfig) {
429
+ const { config, title, metaId } = this.initConfig
430
+ // 构建稳定的 page 对象,避免 currentPage computed 每次返回新 {} 触发死循环
431
+ this._initPageObj = { config, title, metaId, pageId: '_preview_' }
432
+ this.designer.loadFormJson({ config, title, metaId })
433
+ if (metaId) this.getEntityRelation()
434
+ return
435
+ }
436
+ if (this.$query.configType === 'component') {
437
+ await this.getComponentListPromise
438
+ const component = this.designer.allWidgets.find(item => item.ID === this.$query.id)
439
+ if (component) {
440
+ this.componentInfo = component
441
+ const config = component.CONTENT ? JSON.parse(component.CONTENT) : {}
442
+ this.designer.loadFormJson({ isComponent: true, config })
443
+ }
444
+ } else if (this.$query.template === '1') {
445
+ this.getTemplate()
446
+ .then(data => {
447
+ const template = data.data
448
+ this.templateInfo = template
449
+ const config = JSON.parse(template.CONTENT || '{}')
450
+ if (!config.version) config.version = this.designer.version
451
+ this.designer.loadFormJson({ isTemplate: true, config })
452
+ })
453
+ } else {
454
+ this.getPage()
455
+ .then(page => {
456
+ this.designer.loadFormJson(this.$_.cloneDeep(page))
457
+ this.getEntityRelation()
458
+ })
459
+ }
460
+ },
461
+ getComponentList () {
462
+ this.getComponentListPromise = this.$http.list({
463
+ action: 'listWithVariables',
464
+ entityId: 'FM_PAGE',
465
+ 'scope.TYPE': '01',
466
+ order_field: 'ORDER_NUM',
467
+ order_mode: 'asc',
468
+ scopeParams: JSON.stringify([{ lb: '(', field: 'LEVEL', values: '01', link: 'or' }, { field: 'SYSTEM', values: this.SYSTEM || this.appConfig['SYSTEM|ID'], rb: ')' }])
469
+ })
470
+ .then(data => {
471
+ const componentList = data.entitys
472
+ componentList.forEach(item => {
473
+ const visualComponentName = this.getVisualComponent(item)
474
+ item.visualComponentName = visualComponentName
475
+ })
476
+ this.designer.initWidgetList(componentList)
477
+ })
478
+ .catch(err => {
479
+ this.$message.error(err.message)
480
+ })
481
+ },
482
+ getTemplateLibrary () {
483
+ const scopeParams = [
484
+ {
485
+ field: 'TYPE',
486
+ values: '01'
487
+ },
488
+ {
489
+ lb: '(',
490
+ field: 'LEVEL',
491
+ values: '01',
492
+ link: 'or'
493
+ },
494
+ {
495
+ field: 'SYSTEM',
496
+ values: this.SYSTEM,
497
+ rb: ')'
498
+ }
499
+ ]
500
+ this.$http.$post({
501
+ action: 'list',
502
+ entityId: 'FM_TEMPLATE',
503
+ scopeParams: JSON.stringify(scopeParams)
504
+ })
505
+ .then(data => {
506
+ this.designer.initTemplateLibrary(data.entitys)
507
+ })
508
+ .catch(err => {
509
+ this.$message.error(err.message)
510
+ })
511
+ },
512
+ getVisualComponent (component) {
513
+ if (component && component.VISUAL_CONFIG_PATH) {
514
+ let pathName = ''
515
+ const pagePath = component.VISUAL_CONFIG_PATH
516
+ const rootMatch = pagePath.match(/^@\/(frame\/|product\/|project\/)?/)
517
+ if (rootMatch) {
518
+ pathName = pagePath.split(rootMatch[0])[1].replace('.vue', '')
519
+ }
520
+ // 根据路径定义组件名 SubList 转为 sub-list layout/SubList 转为 layout-sub-list
521
+ const componentPath = pathName.replace('views/', '').replace('components/', '').replace('packages/', '').replace(/\//g, '-').replace(/(\w)([A-Z])/g, '$1-$2').toLowerCase()
522
+ const componentName = componentPath
523
+ return componentName
524
+ }
525
+ return null
526
+ },
527
+ getEntityRelation () {
528
+ this.$http.$get({
529
+ entityId: 'FM_ENTITY_RELATION',
530
+ action: 'getEntityRelationTree',
531
+ mainEntity: this.currentPage.metaId
532
+ })
533
+ .then(data => {
534
+ data.forEach(relation => {
535
+ relation.label = relation.title
536
+ relation.value = relation.flag
537
+ relation.children = relation.childrens
538
+ if (relation.childrens) {
539
+ relation.childrens.forEach(childRelation => {
540
+ childRelation.value = relation.flag + '#' + childRelation.flag
541
+ childRelation.label = childRelation.title
542
+ })
543
+ }
544
+ })
545
+ this.relationList = data
546
+ })
547
+ },
548
+ openContnetWidthObserver () {
549
+ // ⚠️ `el-container` 属于 EP 的**按需加载**档(见 src/element-plus.lazy.js,不在
550
+ // src/element-plus.eager.js 的白名单里):mounted() 触发那一刻它还只是 defineAsyncComponent
551
+ // 的 Comment 占位、真身尚未 resolve ⇒ `this.$refs.previewContainer` 是 undefined,
552
+ // 老写法直接取 `.$el` 会抛 "Cannot read properties of undefined (reading '$el')",
553
+ // 并且因为这行在 mounted 里,会把它后面的逻辑(terminal 初始化)一起中断。
554
+ // 同一个坑 business/src/components/Popup.vue 的 applyDialogStyle 注释里也记过一次。
555
+ // 改成「拿到元素才 observe,拿不到就下一帧重试」,异步组件 resolve 后自然接上。
556
+ const getEl = () => {
557
+ const ref = this.$refs.previewContainer
558
+ if (!ref) return null
559
+ return ref.$el || (ref.nodeType === 1 ? ref : null)
560
+ }
561
+ const resizeObserver = new ResizeObserver(() => {
562
+ const el = getEl()
563
+ if (!el) return
564
+ this.screenWidth = document.documentElement.offsetWidth
565
+ this.scaleRatio = el.clientWidth / document.documentElement.offsetWidth
566
+ })
567
+ let tries = 0
568
+ const attach = () => {
569
+ if (this.observerDetached) return
570
+ const el = getEl()
571
+ if (el) {
572
+ resizeObserver.observe(el)
573
+ return
574
+ }
575
+ // 异步组件通常一两帧就 resolve;给约 5s 上限后放弃(最坏结果只是没有缩放比,不影响编辑)
576
+ if (tries++ < 300) requestAnimationFrame(attach)
577
+ }
578
+ attach()
579
+ return resizeObserver
580
+ },
581
+ back () {
582
+ if (this.initConfig) {
583
+ this.$emit('close')
584
+ return
585
+ }
586
+ if (this.newWindow) {
587
+ window.close()
588
+ } else if (this.$query.isObjectDetail) {
589
+ this.backPage()
590
+ } else {
591
+ this.backPage({ reload: true })
592
+ }
593
+ },
594
+ pageSetting () {
595
+ this.designer.clearSelected()
596
+ },
597
+ saveTemplate (config) {
598
+ this.isSavePage = true
599
+ this.$http.update({
600
+ entityId: 'FM_TEMPLATE',
601
+ 'bean.ID': this.$query.id,
602
+ 'bean.CONTENT': JSON.stringify(config, null, '\t')
603
+ })
604
+ .then(data => {
605
+ this.isSavePage = false
606
+ this.$message.success(this.$t('save successfully'))
607
+ })
608
+ .catch(err => {
609
+ this.isSavePage = false
610
+ this.$message.error(err.message || this.$t('fail to save'))
611
+ })
612
+ },
613
+ saveCustomComponent (config) {
614
+ this.isSavePage = true
615
+ this.$http.update({
616
+ entityId: 'FM_PAGE',
617
+ 'bean.ID': this.$query.id,
618
+ 'bean.CONTENT': JSON.stringify(config, null, '\t')
619
+ })
620
+ .then(data => {
621
+ this.isSavePage = false
622
+ this.$message.success(this.$t('save successfully'))
623
+ })
624
+ .catch(err => {
625
+ this.isSavePage = false
626
+ this.$message.error(err.message || this.$t('fail to save'))
627
+ })
628
+ },
629
+ async saveConfigs () {
630
+ // 获取所有配置 // 获取编译好的JS和未编译的JS
631
+ if (this.isSavePage) return
632
+ const { version, pageConfig: globalConfig, widgetList, widgetConfig } = this.designer
633
+ for (const key in globalConfig) {
634
+ if (globalConfig[key] === null) delete globalConfig[key]
635
+ }
636
+ for (const key in widgetConfig) {
637
+ const config = widgetConfig[key]
638
+ for (const configKey in config) {
639
+ if (configKey === 'span' || configKey === 'componentName' || configKey === 'flex') {
640
+ delete config[configKey]
641
+ }
642
+ }
643
+ }
644
+ const formatWidget = (arr) => {
645
+ arr.forEach(item => {
646
+ for (const key in item) {
647
+ if (item[key] === null) delete item[key]
648
+ }
649
+ const children = getWidgetChildren(item)
650
+ if (children.length > 0) {
651
+ formatWidget(children)
652
+ }
653
+ })
654
+ }
655
+ formatWidget(widgetList)
656
+ const pageConfig = {
657
+ version: version,
658
+ ...globalConfig,
659
+ items: widgetList,
660
+ itemConfigs: widgetConfig
661
+ }
662
+ if (pageConfig.JS) {
663
+ await import(/* webpackChunkName: "standalone" */'@babel/standalone')
664
+ .then(babel => {
665
+ // 获取页面全局配置
666
+ const es5 = babel.transform(pageConfig.JS, {
667
+ presets: ['es2015']
668
+ })
669
+ pageConfig.compileJS = es5.code
670
+ for (const key in pageConfig) {
671
+ if (pageConfig[key] === null) {
672
+ delete pageConfig[key]
673
+ }
674
+ }
675
+ })
676
+ }
677
+ if (this.designer.mode === 'template') {
678
+ return this.saveTemplate(pageConfig)
679
+ } else if (this.designer.mode === 'component') {
680
+ return this.saveCustomComponent(pageConfig)
681
+ }
682
+ this.savePageConfigs(pageConfig)
683
+ },
684
+ savePageConfigs (pageConfig) {
685
+ // 外部传入配置模式:emit 事件,不走接口
686
+ if (this.initConfig) {
687
+ this.$emit('save', pageConfig)
688
+ this.$message.success(this.$t('save successfully'))
689
+ return
690
+ }
691
+ this.isSavePage = true
692
+ this.$http.update({
693
+ entityId: 'FM_PAGE_CONFIG',
694
+ 'bean.ID': this.$query.id,
695
+ 'bean.CONTENT': JSON.stringify(pageConfig, null, '\t')
696
+ })
697
+ .then(data => {
698
+ this.isSavePage = false
699
+ this.$message.success(this.$t('save successfully'))
700
+ if (this.newWindow) {
701
+ if (window.opener) window.opener.postMessage({ pageId: this.$query.id, type: 'configPage' }, '/')
702
+ } else {
703
+ this.$store.commit('DELETE_PAGE', { pageId: this.$query.id })
704
+ // 重新获取页面
705
+ this.$store.dispatch('ADD_PAGE', { pageId: this.$query.id })
706
+ }
707
+ })
708
+ .catch(err => {
709
+ this.isSavePage = false
710
+ this.$message.error(err.message || this.$t('fail to save'))
711
+ })
712
+ }
713
+ },
714
+ created () {
715
+ this.initMobileWidth = this.mobileWidth
716
+ if (this.showMenu) {
717
+ this.changeMenuFlag = true
718
+ this.$store.commit('SWITCH_MENU_SHOW', false)
719
+ }
720
+ if (this.showAppNav) {
721
+ this.changeAppNavFlag = true
722
+ this.$store.commit('SWITCH_APP_NAV_SHOW', false)
723
+ }
724
+ import('@epxing/designer/src/visual/index.js')
725
+ .then(() => {
726
+ this.loadVisualComponent = true
727
+ })
728
+ this.getComponentList()
729
+ this.initDesigner()
730
+ // 通过 designer 统一监听悬浮组件变化
731
+ if (this.designer && typeof this.designer.handleEvent === 'function') {
732
+ this.designer.handleEvent('hover-change', this.handleDesignerHoverChange)
733
+ // 监听关闭左侧面板事件
734
+ this.designer.handleEvent('close-left-panel', () => {
735
+ this.showPanel = ''
736
+ })
737
+ }
738
+ this.getTemplateLibrary()
739
+ },
740
+ mounted () {
741
+ // 监听 designer 的全局事件
742
+ if (this.designer && this.designer.vueInstance) {
743
+ this.designer.handleEvent('widget-click', this.handleWidgetClick)
744
+ this.designer.handleEvent('drag-start', this.handleDragStart)
745
+ this.designer.handleEvent('drag-move', this.handleDragMove)
746
+ this.designer.handleEvent('drag-end', this.handleDragEnd)
747
+ }
748
+ // 使用鼠标事件模拟拖拽移动和结束,避免依赖原生 drag 事件,
749
+ // 当左侧组件库隐藏时仍然可以持续监听移动和结束
750
+ document.addEventListener('mousemove', this.handleDocumentMouseMove)
751
+ document.addEventListener('mouseup', this.handleDocumentMouseUp)
752
+ // 监听全局 dragover 事件,更新悬浮窗位置
753
+ document.addEventListener('dragover', this.handleDocumentDragOver)
754
+ // 监听全局 dragend 和 drop 事件,确保拖拽结束时关闭悬浮窗
755
+ document.addEventListener('dragend', this.handleDocumentDragEnd)
756
+ document.addEventListener('drop', this.handleDocumentDrop)
757
+ if (window.opener) {
758
+ // 监听器存到实例上,卸载时从 opener 上移除
759
+ this._openerMessageHandler = event => {
760
+ if (event.data === 'CLOSE_WINDOW') window.close()
761
+ }
762
+ window.opener.addEventListener('message', this._openerMessageHandler)
763
+ }
764
+ this.resizeObserver = this.openContnetWidthObserver()
765
+ // 根据终端设置是否是mobile
766
+ if (this.$route.query.terminal === 'mobile') {
767
+ this.terminal = 'mobile'
768
+ }
769
+ },
770
+ beforeUnmount () {
771
+ // 移除事件监听
772
+ if (this.designer && this.designer.vueInstance) {
773
+ this.designer.offEvent('widget-click', this.handleWidgetClick)
774
+ this.designer.offEvent('drag-start', this.handleDragStart)
775
+ this.designer.offEvent('drag-move', this.handleDragMove)
776
+ this.designer.offEvent('drag-end', this.handleDragEnd)
777
+ }
778
+ // 移除鼠标模拟拖拽事件监听
779
+ document.removeEventListener('mousemove', this.handleDocumentMouseMove)
780
+ document.removeEventListener('mouseup', this.handleDocumentMouseUp)
781
+ // 移除拖拽事件监听
782
+ document.removeEventListener('dragover', this.handleDocumentDragOver)
783
+ document.removeEventListener('dragend', this.handleDocumentDragEnd)
784
+ document.removeEventListener('drop', this.handleDocumentDrop)
785
+ if (this.changeMenuFlag) {
786
+ this.$store.commit('SWITCH_MENU_SHOW', true)
787
+ }
788
+ if (this.changeAppNavFlag) {
789
+ this.$store.commit('SWITCH_APP_NAV_SHOW', true)
790
+ }
791
+ // 让还在等异步组件 resolve 的重试循环停下来(否则组件已卸载还在 rAF 里持有实例引用)
792
+ this.observerDetached = true
793
+ if (this.resizeObserver) this.resizeObserver.disconnect()
794
+ if (window.opener && this._openerMessageHandler) window.opener.removeEventListener('message', this._openerMessageHandler)
795
+ if (this.designer && typeof this.designer.dispose === 'function') this.designer.dispose()
796
+ this.$store.commit('SET_MOBILE_WIDTH', this.initMobileWidth)
797
+ }
798
+
799
+ }
800
+ </script>
801
+
802
+ <style lang="scss">
803
+ @include b(page-designer) {
804
+ position: relative;
805
+ left: -10px;
806
+ top: -10px;
807
+ width: calc(100% + 20px);
808
+ height: calc(100% + 20px);
809
+ overflow: hidden;
810
+ display: flex;
811
+ flex-direction: column;
812
+ @include e(content) {
813
+ .ghost, .sortable-ghost {
814
+ position: relative;
815
+ z-index: 101;
816
+ content: '';
817
+ font-size: 0;
818
+ height: 4px!important;
819
+ box-sizing: border-box;
820
+ @include bg_color_primary;
821
+ border: 2px solid;
822
+ @include border_color_primary;
823
+ outline-width: 0;
824
+ padding: 0!important;
825
+ margin: 0!important;
826
+ overflow: hidden;
827
+ &.epx-page-designer-widget-library__item {
828
+ width: 100%;
829
+ }
830
+ }
831
+ // 仅根画布 drop-zone 需要撑满高度(空白/短内容时整块可拖放);
832
+ // 嵌套容器内部的 drop-zone 不能用 100%,否则会把同级内容挤掉,导致与运行时渲染不一致
833
+ .epx-page-designer-widget-preview > .epx-page-designer-widget-preview__drop-zone {
834
+ min-height: 100%;
835
+ }
836
+ }
837
+
838
+ .epx-page-designer-insert-line {
839
+ @include bg_color_primary;
840
+ border-radius: var(--epx-radius-s);
841
+ box-shadow: 0 0 0 1px rgba(255, 255, 255, 0.8);
842
+ }
843
+
844
+ // 拖拽时右侧悬浮大纲树
845
+ @include e(floating-tree) {
846
+ position: absolute;
847
+ top: 60px; // 头部高度
848
+ right: 0;
849
+ bottom: 0;
850
+ width: 360px;
851
+ z-index: 200;
852
+ pointer-events: none; // 先禁止穿透,内部再开启
853
+
854
+ .epx-page-designer-widget-tree {
855
+ height: 100%;
856
+ margin-left: 0;
857
+ pointer-events: auto; // 允许大纲树本身交互
858
+ box-shadow: 0 2px 8px rgba(0, 0, 0, 0.15);
859
+ }
860
+ }
861
+
862
+ @include m(new-window) {
863
+ left: 0px;
864
+ top: 0px;
865
+ width:100%;
866
+ height: 100%;
867
+ }
868
+ @include e(header) {
869
+ display: flex;
870
+ justify-content: space-between;
871
+ align-items: center;
872
+ height: 60px;
873
+ background: var(--epx-bg-card);
874
+ padding: 0 20px;
875
+ border-bottom: 1px solid #e8e8e8;
876
+ }
877
+ @include e(header-left) {
878
+ display: flex;
879
+ >i {
880
+ font-size: 24px;
881
+ color: #666;
882
+ margin-right: 16px;
883
+ cursor: pointer;
884
+ }
885
+ }
886
+ @include e(header-title) {
887
+ font-size: var(--epx-font-size-l);
888
+ font-weight: 600;
889
+ }
890
+ @include e(header-subtitle){
891
+ font-size: var(--epx-font-size-base);
892
+ color: #666;
893
+ }
894
+ @include e(header-center) {
895
+ padding: 2px;
896
+ border: 1px solid #e3e3e3;
897
+ border-radius: var(--epx-radius-base);
898
+ >i {
899
+ font-size: var(--epx-font-size-l);
900
+ padding: 4px 6px;
901
+ border-radius: var(--epx-radius-base);
902
+ cursor: pointer;
903
+ &.is-active {
904
+ @include font_color_primary;
905
+ @include bg_color_primary(.1);
906
+ }
907
+ }
908
+ }
909
+ @include e(header-operate) {
910
+ display: flex;
911
+ align-items: center;
912
+ }
913
+ @include e(header-operate-item) {
914
+ color: #666;
915
+ cursor: pointer;
916
+ margin: 20px;
917
+ &:hover {
918
+ @include font_color_primary
919
+ }
920
+ }
921
+ @include e(container) {
922
+ flex:1;
923
+ display: flex;
924
+ overflow: hidden;
925
+ position: relative;
926
+ }
927
+ @include e(function-panel) {
928
+ display: flex;
929
+ flex-shrink: 0;
930
+ position: relative;
931
+ transition: width 0.2s ease, margin-left 0.2s ease;
932
+
933
+ &.epx-page-designer__function-panel--collapsed {
934
+ width: 0;
935
+ margin-left: -50px; // 隐藏 tabs 区域
936
+ overflow: hidden;
937
+ }
938
+ }
939
+ @include e(widget-panel) {
940
+
941
+ }
942
+ @include e(function-tabs) {
943
+ width: 50px;
944
+ height: 100%;
945
+ background: var(--epx-bg-card);
946
+ box-shadow: 1px 0px 0px 0px rgba(0, 0, 0, 0.1);
947
+ padding: 20px 0;
948
+ flex-shrink: 0;
949
+ }
950
+ @include e(function-tabs-item) {
951
+ width: 100%;
952
+ padding: 8px 0;
953
+ margin-bottom: 10px;
954
+ text-align: center;
955
+ line-height: 1;
956
+ font-size: 24px;
957
+ color: #666;
958
+ >span {
959
+ display: block;
960
+ font-size: var(--epx-font-size-s);
961
+ line-height: 20px;
962
+ }
963
+ cursor: pointer;
964
+ &:hover, &.is-active {
965
+ @include bg_color_primary(.2);
966
+ @include font_color_primary
967
+ }
968
+ }
969
+ @include e(js-drawer) {
970
+ &.ltr {
971
+ left: 50px;
972
+ top: 60px;
973
+ height: calc(100% - 60px);
974
+ box-shadow: none
975
+ }
976
+ .el-drawer__header {
977
+ padding: 10px;
978
+ margin: 0;
979
+ }
980
+ }
981
+ }
982
+
983
+ .page-preview {
984
+ flex: 1;
985
+ overflow: hidden;
986
+ }
987
+ .config-panel {
988
+ width: 360px;
989
+ flex-shrink: 0;
990
+ }
991
+ .function-panel {
992
+ position: relative;
993
+ flex-shrink: 0;
994
+ }
995
+ .js-panel {
996
+ position: absolute;
997
+ top: 0;
998
+ left: 51px;
999
+ width: 600px;
1000
+ height: 100%;
1001
+ z-index: 10;
1002
+ }
1003
+ .js-panel-title {
1004
+ background: var(--epx-bg-card);
1005
+ padding: 0 12px;
1006
+ display: flex;
1007
+ align-items: center;
1008
+ justify-content: space-between;
1009
+ height: 36px;
1010
+ color: #666;
1011
+ i {
1012
+ cursor: pointer;
1013
+ color: #999;
1014
+ font-size: 18px;
1015
+ }
1016
+ }
1017
+ </style>