vue2-client 1.15.127 → 1.15.128

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 (327) hide show
  1. package/.claude/settings.local.json +14 -0
  2. package/.cursorrules +19 -19
  3. package/.env.apply +19 -19
  4. package/.env.gaslink +19 -19
  5. package/.env.his +19 -19
  6. package/.env.liuli +20 -20
  7. package/.env.revenue +2 -2
  8. package/.env.scada +19 -19
  9. package/.eslintrc.js +90 -90
  10. package/CHANGELOG.md +824 -824
  11. package/Components.md +60 -60
  12. package/docs/LowCode/lowcode.md +155 -155
  13. package/docs/LowCode/lowcodeForDeveloper.md +230 -230
  14. package/docs/index.md +30 -30
  15. package/index.js +31 -31
  16. package/jest-transform-stub.js +8 -8
  17. package/jest.setup.js +7 -7
  18. package/jsconfig.json +19 -19
  19. package/package.json +1 -1
  20. package/public/his/editor/editor.html +51 -51
  21. package/public/his/editor/mock/bind_data.html +779 -779
  22. package/public/his/editor/mock/data_table.html +40 -40
  23. package/public/his/editor/mock/sign.html +75 -75
  24. package/public/his/editor/vender/JsBarcode.all.js +3669 -3669
  25. package/public/his/editor/vender/date97/My97DatePicker.htm +65 -65
  26. package/public/his/editor/vender/date97/WdatePicker.js +677 -677
  27. package/public/his/editor/vender/date97/calendar.js +4 -4
  28. package/public/his/editor/vender/date97/lang/en.js +13 -13
  29. package/public/his/editor/vender/date97/lang/zh-cn.js +13 -13
  30. package/public/his/editor/vender/date97/lang/zh-tw.js +13 -13
  31. package/public/his/editor/vender/date97/skin/WdatePicker.css +10 -10
  32. package/public/his/editor/vender/date97/skin/default/datepicker.css +328 -328
  33. package/public/his/editor/vender/date97/skin/ext/datepicker.css +308 -308
  34. package/public/his/editor/vender/date97/skin/whyGreen/datepicker.css +255 -255
  35. package/public/his/editor/vender/diff.js +1627 -1627
  36. package/public/his/editor/vender/editor.js +1 -1
  37. package/public/his/editor/vender/fabric.js +31187 -31187
  38. package/public/his/editor/vender/jquery/jquery.base64.js +190 -190
  39. package/public/his/editor/vender/jquery/jquery.js +10872 -10872
  40. package/public/his/editor/vender/jquery/jquery.print.js +255 -255
  41. package/public/his/editor/vender/jquery/zTreeStyle/zTreeStyle.css +96 -96
  42. package/public/his/editor/vender/mui/mui.min.css +4 -4
  43. package/public/his/editor/vender/mui/mui.min.js +5 -5
  44. package/public/his/editor/vender/mui/mui.picker.min.css +6 -6
  45. package/public/his/editor/vender/mui/mui.picker.min.js +6 -6
  46. package/public/his/editor/vender/qrcode.js +7 -7
  47. package/public/his/editor/vender/requirejs/require.js +2145 -2145
  48. package/public/his/editor/vender/signature/jSignature.CompressorSVG.js +518 -518
  49. package/public/his/editor/vender/signature/jSignature.UndoButton.js +164 -164
  50. package/public/his/editor/vender/signature/jSignature.js +1486 -1486
  51. package/public/his/editor/vender/validator.js +5094 -5094
  52. package/public/his/editor/vender/weui/weui.css +5659 -5659
  53. package/public/his/editor/vender/weui/weui.min.css +4 -4
  54. package/public/his/editor/vender/weui/weui.min.js +11 -11
  55. package/public/index.html +1 -1
  56. package/src/assets/img/querySlotDemo.svg +15 -15
  57. package/src/assets/svg/badtwo.svg +1 -1
  58. package/src/assets/svg/goodtwo.svg +1 -1
  59. package/src/base-client/components/AI/AskAiBtn.vue +136 -136
  60. package/src/base-client/components/AI/demo.vue +31 -31
  61. package/src/base-client/components/common/AddressSearchCombobox/IcMapIcon.vue +16 -16
  62. package/src/base-client/components/common/AddressSearchCombobox/demo.vue +36 -36
  63. package/src/base-client/components/common/AddressSearchCombobox/ic_map.svg +6 -6
  64. package/src/base-client/components/common/AmapMarker/AmapPointRendering.vue +120 -120
  65. package/src/base-client/components/common/CitySelect/index.js +3 -3
  66. package/src/base-client/components/common/CitySelect/index.md +109 -109
  67. package/src/base-client/components/common/CreateQuery/CreateQuery.vue +669 -669
  68. package/src/base-client/components/common/CreateQuery/CreateQueryItem.vue +1014 -1014
  69. package/src/base-client/components/common/CreateQuery/index.js +3 -3
  70. package/src/base-client/components/common/CreateQuery/index.md +42 -42
  71. package/src/base-client/components/common/CreateSimpleFormQuery/CreateSimpleFormQuery.vue +452 -452
  72. package/src/base-client/components/common/CreateSimpleFormQuery/CreateSimpleFormQueryItem.vue +511 -511
  73. package/src/base-client/components/common/CreateSimpleFormQuery/index.js +3 -3
  74. package/src/base-client/components/common/CreateSimpleFormQuery/index.md +42 -42
  75. package/src/base-client/components/common/FormGroupEdit/index.js +3 -3
  76. package/src/base-client/components/common/FormGroupEdit/index.md +43 -43
  77. package/src/base-client/components/common/FormGroupQuery/FormGroupQuery.vue +166 -166
  78. package/src/base-client/components/common/FormGroupQuery/index.js +3 -3
  79. package/src/base-client/components/common/FormGroupQuery/index.md +43 -43
  80. package/src/base-client/components/common/JSONToTree/jsontotree.vue +271 -271
  81. package/src/base-client/components/common/LowCodeComponent/LowCodeEditorModal.vue +108 -108
  82. package/src/base-client/components/common/LowCodeComponent/LowCodeEditorPanel.vue +413 -413
  83. package/src/base-client/components/common/LowCodeComponent/LowCodePageOrganization.vue +502 -502
  84. package/src/base-client/components/common/LowCodeComponent/LowCodeRender.vue +728 -728
  85. package/src/base-client/components/common/LowCodeComponent/LowCodeRenderEnter.vue +29 -29
  86. package/src/base-client/components/common/LowCodeComponent/LowCodeUIStore.vue +219 -219
  87. package/src/base-client/components/common/LowCodeComponent/modal/lowCodeAddPageModal.vue +117 -117
  88. package/src/base-client/components/common/LowCodeComponent/modal/lowCodeCustomJSModal.vue +80 -80
  89. package/src/base-client/components/common/LowCodeComponent/modal/lowCodeEventEditorModal.vue +398 -398
  90. package/src/base-client/components/common/LowCodeComponent/modal/lowCodeLifeCycleModal.vue +65 -65
  91. package/src/base-client/components/common/LowCodeComponent/modal/lowCodeLogicCallbackModal.vue +64 -64
  92. package/src/base-client/components/common/LowCodeComponent/modal/lowCodeLogicParamModal.vue +73 -73
  93. package/src/base-client/components/common/LowCodeComponent/modal/lowCodeRunFunctionParamModal.vue +76 -76
  94. package/src/base-client/components/common/PersonSetting/PersonSetting.vue +208 -208
  95. package/src/base-client/components/common/PersonSetting/index.js +3 -3
  96. package/src/base-client/components/common/Recording/Recording.vue +243 -243
  97. package/src/base-client/components/common/Recording/index.js +3 -3
  98. package/src/base-client/components/common/Tree/Tree.vue +149 -149
  99. package/src/base-client/components/common/Tree/index.js +2 -2
  100. package/src/base-client/components/common/Upload/index.js +3 -3
  101. package/src/base-client/components/common/XAddForm/XAddForm.vue +113 -113
  102. package/src/base-client/components/common/XAddNativeForm/index.md +146 -146
  103. package/src/base-client/components/common/XAddNativeFormOA/XAddNativeFormOA.vue +303 -303
  104. package/src/base-client/components/common/XAddNativeFormOA/index.js +3 -3
  105. package/src/base-client/components/common/XAddNativeFormOA/index.md +146 -146
  106. package/src/base-client/components/common/XAddReport/index.js +3 -3
  107. package/src/base-client/components/common/XAddReport/index.md +56 -56
  108. package/src/base-client/components/common/XBadge/XBadge.vue +94 -94
  109. package/src/base-client/components/common/XButtons/XButtonDemo.vue +28 -28
  110. package/src/base-client/components/common/XButtons/index.js +3 -3
  111. package/src/base-client/components/common/XButtons/index.md +61 -61
  112. package/src/base-client/components/common/XCard/XCard.vue +64 -64
  113. package/src/base-client/components/common/XCheckList/XCheckList.vue +106 -106
  114. package/src/base-client/components/common/XCheckList/XCheckListDemo.vue +41 -41
  115. package/src/base-client/components/common/XDataCard/index.js +3 -3
  116. package/src/base-client/components/common/XDataCard/index.md +1 -1
  117. package/src/base-client/components/common/XDataDrawer/XDataDrawer.vue +180 -180
  118. package/src/base-client/components/common/XDataDrawer/index.js +3 -3
  119. package/src/base-client/components/common/XDataDrawer/index.md +41 -41
  120. package/src/base-client/components/common/XDatePicker/demo.vue +153 -153
  121. package/src/base-client/components/common/XDescriptions/index.js +3 -3
  122. package/src/base-client/components/common/XDescriptions/index.md +83 -83
  123. package/src/base-client/components/common/XDetailsView/XDetailsView.vue +238 -238
  124. package/src/base-client/components/common/XDetailsView/index.js +3 -3
  125. package/src/base-client/components/common/XForm/XStatusButton.vue +54 -54
  126. package/src/base-client/components/common/XForm/index.md +178 -178
  127. package/src/base-client/components/common/XForm/itemComponent/XClickChangeBtn/index.vue +49 -49
  128. package/src/base-client/components/common/XFormGroup/index.js +3 -3
  129. package/src/base-client/components/common/XFormGroup/index.md +38 -38
  130. package/src/base-client/components/common/XFormGroupDetails/XFormGroupDetails.vue +72 -72
  131. package/src/base-client/components/common/XFormGroupDetails/index.js +3 -3
  132. package/src/base-client/components/common/XFormTable/index.md +92 -92
  133. package/src/base-client/components/common/XLabelSelect/XLabelSelect.vue +110 -110
  134. package/src/base-client/components/common/XLabelSelect/XLabelSelectDemo.vue +35 -35
  135. package/src/base-client/components/common/XLicensePlate/XLicensePlate.vue +193 -193
  136. package/src/base-client/components/common/XLicensePlate/XLicensePlateDemo.vue +48 -48
  137. package/src/base-client/components/common/XPrint/OpenInvoice.vue +21 -21
  138. package/src/base-client/components/common/XPrint/PrintHtml.js +98 -98
  139. package/src/base-client/components/common/XPrint/css/hiPrintCss.js +359 -359
  140. package/src/base-client/components/common/XPrint/css/lodopCss.js +26 -26
  141. package/src/base-client/components/common/XPrint/css/print-lock.css +351 -351
  142. package/src/base-client/components/common/XPrint/index.vue +97 -97
  143. package/src/base-client/components/common/XReport/XReportDesign.vue +463 -463
  144. package/src/base-client/components/common/XReport/XReportJsonRender.vue +381 -381
  145. package/src/base-client/components/common/XReport/index.js +3 -3
  146. package/src/base-client/components/common/XReport/print.js +186 -186
  147. package/src/base-client/components/common/XReportDrawer/index.js +3 -3
  148. package/src/base-client/components/common/XReportGrid/index.js +3 -3
  149. package/src/base-client/components/common/XReportGrid/index.md +44 -44
  150. package/src/base-client/components/common/XReportSlot/XReportSlot.vue +110 -110
  151. package/src/base-client/components/common/XReportSlot/index.js +3 -3
  152. package/src/base-client/components/common/XReportSlot/index.md +48 -48
  153. package/src/base-client/components/common/XSimpleDescriptions/XSimpleDescriptions.vue +166 -166
  154. package/src/base-client/components/common/XSimpleDescriptions/index.js +3 -3
  155. package/src/base-client/components/common/XSimpleDescriptions/index.md +7 -7
  156. package/src/base-client/components/common/XStepView/XStepView.vue +252 -252
  157. package/src/base-client/components/common/XStepView/index.js +3 -3
  158. package/src/base-client/components/common/XStepView/index.md +31 -31
  159. package/src/base-client/components/common/XTab/XTabDemo.vue +22 -22
  160. package/src/base-client/components/common/XTab/index.js +3 -3
  161. package/src/base-client/components/common/XTable/CustomFuncCel.vue +51 -51
  162. package/src/base-client/components/common/XTable/TableCellRenderer.vue +161 -161
  163. package/src/base-client/components/common/XTable/index.md +255 -255
  164. package/src/base-client/components/common/XTagGroup/index.vue +52 -52
  165. package/src/base-client/components/common/XTree/XTree.vue +424 -424
  166. package/src/base-client/components/common/XTree/index.js +3 -3
  167. package/src/base-client/components/common/XTree/index.md +36 -36
  168. package/src/base-client/components/common/XTreeOne/XTreeOne.vue +113 -113
  169. package/src/base-client/components/common/XTreeOne/XTreeOnePro.vue +128 -128
  170. package/src/base-client/components/common/richTextModal/index.vue +56 -56
  171. package/src/base-client/components/common/richTextModal/richDemo.vue +48 -48
  172. package/src/base-client/components/his/XHisEditor/index.js +3 -3
  173. package/src/base-client/components/index.js +51 -51
  174. package/src/base-client/components/layout/XTreeView/XTreeView.vue +130 -130
  175. package/src/base-client/components/layout/XTreeView/index.js +3 -3
  176. package/src/base-client/components/layout/XTreeView/index.md +46 -46
  177. package/src/base-client/components/system/DictionaryDetailsView/DictionaryDetailsView.vue +232 -232
  178. package/src/base-client/components/system/QueryParamsDetailsView/QueryParamsDetailsView.vue +281 -281
  179. package/src/base-client/plugins/Config.js +19 -19
  180. package/src/base-client/plugins/GetLoginInfoService.js +183 -183
  181. package/src/base-client/plugins/Recording.js +258 -258
  182. package/src/base-client/plugins/index.js +23 -23
  183. package/src/base-client/plugins/tabs-page-plugin.js +39 -39
  184. package/src/components/Charts/Bar.vue +62 -62
  185. package/src/components/Charts/ChartCard.vue +134 -134
  186. package/src/components/Charts/Liquid.vue +67 -67
  187. package/src/components/Charts/MiniArea.vue +39 -39
  188. package/src/components/Charts/MiniBar.vue +39 -39
  189. package/src/components/Charts/MiniProgress.vue +75 -75
  190. package/src/components/Charts/MiniSmoothArea.vue +40 -40
  191. package/src/components/Charts/Radar.vue +68 -68
  192. package/src/components/Charts/RankList.vue +77 -77
  193. package/src/components/Charts/TagCloud.vue +113 -113
  194. package/src/components/Charts/TransferBar.vue +64 -64
  195. package/src/components/Charts/Trend.vue +82 -82
  196. package/src/components/Charts/chart.less +12 -12
  197. package/src/components/Charts/smooth.area.less +13 -13
  198. package/src/components/CodeMirror/inedx.vue +118 -118
  199. package/src/components/CodeMirror/setting.js +40 -40
  200. package/src/components/NumberInfo/NumberInfo.vue +54 -54
  201. package/src/components/NumberInfo/index.js +3 -3
  202. package/src/components/NumberInfo/index.less +54 -54
  203. package/src/components/NumberInfo/index.md +43 -43
  204. package/src/components/card/ChartCard.vue +79 -79
  205. package/src/components/chart/Bar.vue +60 -60
  206. package/src/components/chart/MiniArea.vue +67 -67
  207. package/src/components/chart/MiniBar.vue +59 -59
  208. package/src/components/chart/MiniProgress.vue +57 -57
  209. package/src/components/chart/Radar.vue +80 -80
  210. package/src/components/chart/RankingList.vue +60 -60
  211. package/src/components/chart/Trend.vue +79 -79
  212. package/src/components/chart/index.less +9 -9
  213. package/src/components/checkbox/ColorCheckbox.vue +157 -157
  214. package/src/components/checkbox/ImgCheckbox.vue +117 -117
  215. package/src/components/checkbox/ImgCheckboxGroup.vue +76 -76
  216. package/src/components/checkbox/index.js +9 -9
  217. package/src/components/exception/ExceptionPage.vue +70 -70
  218. package/src/components/g2Charts/constants.js +202 -202
  219. package/src/components/g2Charts/demo.vue +808 -808
  220. package/src/components/g2Charts/designer.vue +228 -228
  221. package/src/components/g2Charts/designerBaseConfig.vue +61 -61
  222. package/src/components/g2Charts/designerDataConfig.vue +259 -259
  223. package/src/components/g2Charts/designerStyleConfig.vue +16 -16
  224. package/src/components/g2Charts/index.vue +397 -397
  225. package/src/components/index.js +36 -36
  226. package/src/components/input/IInput.vue +66 -66
  227. package/src/components/menu/SideMenu.vue +75 -75
  228. package/src/components/menu/menu.js +273 -273
  229. package/src/components/setting/Setting.vue +234 -234
  230. package/src/components/tool/AStepItem.vue +60 -60
  231. package/src/config/CreateQueryConfig.js +325 -325
  232. package/src/config/default/antd.config.js +89 -89
  233. package/src/config/default/setting.config.js +55 -55
  234. package/src/font-style/font.css +4 -4
  235. package/src/layouts/BlankView.vue +19 -0
  236. package/src/layouts/CommonLayout.vue +56 -56
  237. package/src/layouts/GridView.vue +16 -14
  238. package/src/layouts/PageLayout.vue +151 -151
  239. package/src/layouts/SinglePageView.vue +136 -136
  240. package/src/layouts/header/AdminHeader.vue +132 -132
  241. package/src/layouts/header/HeaderNotice.vue +177 -177
  242. package/src/layouts/header/InstitutionDetail.vue +181 -181
  243. package/src/layouts/tabs/TabsHead.vue +189 -189
  244. package/src/lib.js +1 -1
  245. package/src/mock/extend/index.js +84 -84
  246. package/src/mock/goods/index.js +108 -108
  247. package/src/pages/DefaultExample/index.vue +77 -77
  248. package/src/pages/DynamicStatistics/ChartSelector.vue +331 -331
  249. package/src/pages/DynamicStatistics/DataTabs.vue +83 -83
  250. package/src/pages/DynamicStatistics/DynamicTable.vue +128 -128
  251. package/src/pages/DynamicStatistics/EvaluationArea.vue +69 -69
  252. package/src/pages/DynamicStatistics/FavoriteList.vue +50 -50
  253. package/src/pages/DynamicStatistics/QuestionHistoryAndFavorites.vue +591 -591
  254. package/src/pages/DynamicStatistics/SearchBar.vue +192 -192
  255. package/src/pages/DynamicStatistics/index.vue +282 -282
  256. package/src/pages/Example/childIndex.vue +15 -15
  257. package/src/pages/Example/index.vue +30 -30
  258. package/src/pages/NewDynamicStatistics/ChartSelector.vue +331 -331
  259. package/src/pages/NewDynamicStatistics/DataTabs.vue +122 -122
  260. package/src/pages/NewDynamicStatistics/DynamicTable.vue +128 -128
  261. package/src/pages/NewDynamicStatistics/EvaluationArea.vue +69 -69
  262. package/src/pages/NewDynamicStatistics/FavoriteList.vue +50 -50
  263. package/src/pages/NewDynamicStatistics/QuestionHistoryAndFavorites.vue +289 -289
  264. package/src/pages/NewDynamicStatistics/SearchBar.vue +193 -193
  265. package/src/pages/NewDynamicStatistics/index.vue +258 -258
  266. package/src/pages/Recording/index.vue +77 -77
  267. package/src/pages/ServiceReview/index.vue +284 -284
  268. package/src/pages/SubExample/index.vue +26 -26
  269. package/src/pages/WorkflowDetail/WorkflowPageDetail/TrimTextTail.vue +23 -23
  270. package/src/pages/XReportView/index.vue +64 -64
  271. package/src/pages/XTreeOneProExample/index.vue +67 -67
  272. package/src/pages/dashboard/workplace/WorkPlace.vue +141 -141
  273. package/src/pages/login/Login.vue +379 -379
  274. package/src/pages/login/LoginV3.vue +389 -389
  275. package/src/pages/lowCode/lowCodeEditor.vue +1219 -1219
  276. package/src/pages/lowCode/lowCodeRenderPage.vue +43 -43
  277. package/src/pages/report/ReportTable.js +124 -124
  278. package/src/pages/resourceManage/orgListManage.vue +98 -98
  279. package/src/pages/system/dictionary/index.vue +44 -44
  280. package/src/pages/system/monitor/loginInfor/index.vue +37 -37
  281. package/src/pages/system/monitor/operLog/index.vue +37 -37
  282. package/src/pages/system/settings/modifyPassword.vue +117 -117
  283. package/src/pages/system/ticket/index.vue +480 -480
  284. package/src/pages/system/ticket/submitTicketSuccess.vue +484 -484
  285. package/src/pages/userInfoDetailManage/ChangeMeterRecordQuery/index.vue +64 -64
  286. package/src/pages/userInfoDetailManage/InfoChangeRecordQuery/index.vue +64 -64
  287. package/src/pages/userInfoDetailManage/InstructRecordQuery/index.vue +64 -64
  288. package/src/pages/userInfoDetailManage/MeterParamRecordQuery/index.vue +64 -64
  289. package/src/pages/userInfoDetailManage/TransferRecordQuery/index.vue +66 -66
  290. package/src/pages/userInfoDetailManage/WatchCollectionRecordQuery/index.vue +64 -64
  291. package/src/plugins/EventLogPlugin.js +33 -33
  292. package/src/plugins/FindParentsData.js +17 -17
  293. package/src/router/async/config.async.js +35 -35
  294. package/src/router/async/router.map.js +1 -1
  295. package/src/router/index.js +27 -27
  296. package/src/services/DataModel.js +30 -30
  297. package/src/services/LodopFuncs.js +137 -137
  298. package/src/services/api/TicketDetailsViewApi.js +46 -46
  299. package/src/services/api/cas.js +79 -79
  300. package/src/services/api/common.js +346 -346
  301. package/src/services/api/entity.js +18 -18
  302. package/src/services/api/index.js +17 -17
  303. package/src/store/modules/account.js +115 -115
  304. package/src/store/modules/index.js +5 -5
  305. package/src/store/modules/lowCode.js +33 -33
  306. package/src/store/modules/setting.js +119 -119
  307. package/src/theme/default/style.less +58 -58
  308. package/src/utils/authority-utils.js +85 -85
  309. package/src/utils/errorCode.js +6 -6
  310. package/src/utils/formatter.js +74 -74
  311. package/src/utils/htmlToPDF.js +108 -108
  312. package/src/utils/htmlToPDFApi.js +5 -5
  313. package/src/utils/login.js +188 -188
  314. package/src/utils/lowcode/lowcodeComponentMixin.js +120 -120
  315. package/src/utils/lowcode/lowcodeLog.js +29 -29
  316. package/src/utils/lowcode/lowcodeUtils.js +373 -373
  317. package/src/utils/lowcode/registerComponentForEditor.js +1 -1
  318. package/src/utils/lowcode/registerComponentForRender.js +11 -11
  319. package/src/utils/map-utils.js +47 -47
  320. package/src/utils/reg.js +95 -95
  321. package/src/utils/routerUtil.js +2 -5
  322. package/src/utils/runEvalFunction.js +14 -14
  323. package/src/utils/theme-color-replacer-extend.js +92 -92
  324. package/src/utils/util.js +329 -329
  325. package/src/utils/waterMark.js +31 -31
  326. package/vue.config.js +8 -3
  327. package//350/277/201/347/247/273/346/227/245/345/277/227.md +15 -15
@@ -1,1219 +1,1219 @@
1
- <template>
2
- <div>
3
- <!-- 标题 -->
4
- <a-card>
5
- <a-page-header
6
- title="奥枫低代码前端编辑器"
7
- sub-title="af-lowcode"
8
- :backIcon="false"
9
- @back="() => null"
10
- >
11
- <template slot="extra">
12
- <a-button @click="test">测试</a-button>
13
- <a-button @click="editModeActive">编辑</a-button>
14
- <a-button @click="previewModeActive">预览</a-button>
15
- <a-button type="primary" @click="exportConfig">导出</a-button>
16
- </template>
17
- </a-page-header>
18
- </a-card>
19
- <!-- 预览模式 -->
20
- <a-card v-if="preview">
21
- <LowCodeRender :page-config="config" :edit-mode="false"/>
22
- </a-card>
23
- <!-- 编辑模式 -->
24
- <div v-show="!preview">
25
- <a-row :gutter="2">
26
- <!-- 左侧 -->
27
- <a-col :span="4">
28
- <a-card>
29
- <a-tabs>
30
- <!-- UI库 -->
31
- <a-tab-pane key="1" tab="UI库">
32
- <LowCodeUIStore @refresh="refresh"/>
33
- </a-tab-pane>
34
- <!-- 页面架构 -->
35
- <a-tab-pane key="2" tab="架构" style="overflow: scroll">
36
- <div style="margin-bottom: 3%; width: 200px">
37
- <LowCodePageOrganization
38
- :config="filterOrganizationConfig()"
39
- v-if="showPageOrganization"
40
- :select-tree-node="selectTreeNode"
41
- @rename="rename"
42
- @add="handleTreeAdd"
43
- @split="handleSplit"
44
- @pasteItem="handlePasteItem"
45
- @componentMove="handleTreeDrag"
46
- @deleteComponent="deleteComponentInTree"
47
- @treeOrganizationClick="treeOrganizationClick"/>
48
- </div>
49
- </a-tab-pane>
50
- </a-tabs>
51
- </a-card>
52
- </a-col>
53
- <!-- 中间主体编辑器 -->
54
- <a-col :span="15">
55
- <a-card>
56
- <!-- 切换显示的组件 -->
57
- <div style="margin-bottom: 3%">
58
- <!-- 添加页面组件按钮 -->
59
- <div style="float: right">
60
- <a-popover>
61
- <template slot="content">
62
- <p>添加页面组件</p>
63
- </template>
64
- <a-button @click="addPageContainer" >
65
- <a-icon type="plus"/>
66
- </a-button>
67
- </a-popover>
68
- </div>
69
- <!-- 每个页面按钮切换栏 -->
70
- <a-menu v-model="mainPageMenu" mode="horizontal" @click="handleMainPageMenuChange">
71
- <template v-for="(page) in config.page">
72
- <a-menu-item :key="page.id">{{ page.title + '(' + determinePageType(page.type) + ')' }}</a-menu-item>
73
- </template>
74
- </a-menu>
75
- </div>
76
- <!-- 渲染器 -->
77
- <div v-if="activeMainPageType === 'page'">
78
- <LowCodeRender
79
- v-if="renderPage"
80
- ref="page_render"
81
- @spanDrag="handleDrag"
82
- @containerDelete="handleContainerDelete"
83
- @clickComponentInEditor="clickComponentInEditor"
84
- :page-config="{ data: config.data, page: config.page.filter(page => page.id === activeMainPage)}"/>
85
- <a-skeleton v-else/>
86
- </div>
87
- <div v-if="activeMainPageType === 'modal'">
88
- <LowCodeRender
89
- v-if="renderPage"
90
- ref="modal_render"
91
- @spanDrag="handleDrag"
92
- @containerDelete="handleContainerDelete"
93
- @clickComponentInEditor="clickComponentInEditor"
94
- :page-config="{ data: config.data, page: config.page.filter(page => page.id === activeMainPage)}"/>
95
- <a-skeleton v-else/>
96
- </div>
97
- <div v-if="activeMainPageType === 'draw'">
98
- <LowCodeRender
99
- v-if="renderPage"
100
- ref="draw_render"
101
- @spanDrag="handleDrag"
102
- @containerDelete="handleContainerDelete"
103
- @clickComponentInEditor="clickComponentInEditor"
104
- :page-config="{ data: config.data, page: config.page.filter(page => page.id === activeMainPage)}"/>
105
- <a-skeleton v-else/>
106
- </div>
107
- </a-card>
108
- </a-col>
109
- <!-- 右侧 -->
110
- <a-col :span="5">
111
- <LowCodeEditorPanel
112
- ref="rightPanel"
113
- @openModal="openModal"
114
- @controlRender="controlRender"
115
- :disable-event-editor="disableEventEditor"
116
- :editorPropertiesConfig="editorPropertiesConfig"/>
117
- </a-col>
118
- </a-row>
119
- </div>
120
- <!-- 所有的弹窗,包括:
121
- 新增页面容器弹框
122
- 自定义JS函数弹框
123
- 事件编辑弹框
124
- 自定义生命周期函数弹框
125
- 自定义Logic参数JS弹框
126
- 自定义Logic回调弹框
127
- 运行目标组件参数编辑弹框
128
- -->
129
- <LowCodeEditorModal
130
- ref="allModal"
131
- @changeOuterValue="changeOuterValue"
132
- @refresh="refresh"
133
- :event-editor-current="eventEditorCurrent"
134
- :editor-properties-config="editorPropertiesConfig"/>
135
- </div>
136
- </template>
137
-
138
- <script>
139
- import LowCodeRender from '@vue2-client/base-client/components/common/LowCodeComponent/LowCodeRender.vue'
140
- import * as lowcodeUtils from '@vue2-client/utils/lowcode/lowcodeUtils'
141
- import codeMirror from '@vue2-client/components/CodeMirror/inedx.vue'
142
- import lowcodeComponentMixin from '@vue2-client/utils/lowcode/lowcodeComponentMixin'
143
- import LowCodePageOrganization from '@vue2-client/base-client/components/common/LowCodeComponent/LowCodePageOrganization.vue'
144
- import LowCodeEditorModal from '@vue2-client/base-client/components/common/LowCodeComponent/LowCodeEditorModal.vue'
145
- import LowCodeUIStore from '@vue2-client/base-client/components/common/LowCodeComponent/LowCodeUIStore.vue'
146
- import LowCodeEditorPanel from '@vue2-client/base-client/components/common/LowCodeComponent/LowCodeEditorPanel.vue'
147
-
148
- export default {
149
- name: 'LowCodeEditor',
150
- components: {
151
- LowCodeEditorModal,
152
- LowCodePageOrganization,
153
- LowCodeRender,
154
- codeMirror,
155
- LowCodeUIStore,
156
- LowCodeEditorPanel
157
- },
158
- props: {
159
- // 页面原始的配置,用于从琉璃中读取
160
- originalConfig: {
161
- type: Object,
162
- default: () => {
163
- return {
164
- page: []
165
- }
166
- }
167
- }
168
- },
169
- data () {
170
- return {
171
- // 主体窗口选择的标签
172
- mainPageMenu: ['none'],
173
- // 控制是否渲染页面
174
- preview: false,
175
- // 控制架构树显隐,用于刷新组件
176
- showPageOrganization: true,
177
- // 用于保存右侧编辑组件的属性
178
- editorPropertiesConfig: {},
179
- // 用于事件编辑的回显,在点击事件编辑按钮后,会将此变量赋值
180
- eventEditorCurrent: undefined,
181
- // 保存目标组件可以触发哪些事件
182
- supportedEventType: undefined,
183
- // 保存主体中,当前激活的标签栏ID
184
- activeMainPage: undefined,
185
- // 保存主体中,当前激活的标签栏类型
186
- activeMainPageType: undefined,
187
- // 指定架构树选中哪个节点
188
- selectTreeNode: undefined,
189
- // 禁用事件编辑
190
- disableEventEditor: false,
191
- // 控制右侧事件编辑刷新
192
- showEventEditor: true,
193
- // 控制渲染器更新
194
- renderPage: true
195
- }
196
- },
197
- provide () {
198
- return {
199
- // 将注册的组件传递给子组件
200
- componentsMap: {}
201
- }
202
- },
203
- methods: {
204
- controlRender (flag) {
205
- this.renderPage = flag
206
- },
207
- // 打开弹窗
208
- openModal (modalName) {
209
- this.$refs.allModal.changeModalVisible(modalName)
210
- },
211
- // 子组件修改父组件的值
212
- changeOuterValue (key, value) {
213
- this[key] = value
214
- },
215
- // 根据类型刷新组件
216
- refresh (type) {
217
- switch (type) {
218
- case 'Organization':
219
- this.refreshOrganization()
220
- return
221
- case 'eventEditor':
222
- this.$refs.rightPanel.refresh()
223
- }
224
- },
225
- // 添加页面容器
226
- addPageContainer () {
227
- this.$refs.allModal.changeModalVisible('addPage')
228
- },
229
- // 架构重命名
230
- rename (id, newName) {
231
- const target = lowcodeUtils.getConfig(id, this.config)
232
- if (target.type === 'page') {
233
- target.title = newName
234
- } else {
235
- target.name = newName
236
- }
237
- this.refreshOrganization()
238
- },
239
- // 架构树新增
240
- handleTreeAdd (id, type) {
241
- // 如果目标是行,则添加容器
242
- if (type === 'container') {
243
- // 获取行对象
244
- const rowConfig = lowcodeUtils.getPageIdAndRowIndexByRowId(id)
245
- const row = lowcodeUtils.getRowByRowId(rowConfig.pageId, rowConfig.rowIndex, this.config)
246
- // 如果是空行,直接添加容器
247
- if (row.body.length === 0) {
248
- row.body.push(lowcodeUtils.newContainer())
249
- } else {
250
- // 如果不是空行,将最后一个元素的span平分给新的容器
251
- const lastSpan = row.body[row.body.length - 1].span
252
- const firstSpan = Math.round(lastSpan / 2)
253
- const newSpan = lastSpan - firstSpan
254
- row.body[row.body.length - 1].span = firstSpan
255
- row.body.push(lowcodeUtils.newContainer(newSpan))
256
- }
257
- } else {
258
- // 如果不是行,则添加行
259
- const page = lowcodeUtils.getPageConfigById(id, this.config)
260
- page.body.push(
261
- {
262
- id: page.id + '_' + page.body.length,
263
- config: {
264
- align: 'top',
265
- gutter: 0,
266
- justify: 'start'
267
- },
268
- type: 'row',
269
- body: [
270
- lowcodeUtils.newContainer()
271
- ]
272
- }
273
- )
274
- }
275
- this.refreshOrganization()
276
- },
277
- // 为架构树过滤配置,只显示当前激活的页面配置
278
- filterOrganizationConfig () {
279
- const result = { page: [] }
280
- this.config.page.forEach(page => {
281
- if (page.id === this.activeMainPage) {
282
- result.page.push(page)
283
- }
284
- })
285
- return result
286
- },
287
- // 处理拆分
288
- handleSplit (id, isVertical) {
289
- // 获取目标对象,目标行和对象在行中的Index
290
- const target = lowcodeUtils.getComponentConfig(id, this.config)
291
- const row = lowcodeUtils.getRowConfigByComponentId(id, this.config)
292
- let index
293
- for (let i = 0; i < row.body.length; i++) {
294
- if (row.body[i].id === id) {
295
- index = i
296
- break
297
- }
298
- }
299
- // 将目标对象缓存
300
- const cache = JSON.parse(JSON.stringify(target))
301
- // 是否为垂直拆分
302
- if (isVertical) {
303
- const newPageId = 'container_page_' + lowcodeUtils.nanoidWithoutSymbol(2)
304
- // 垂直拆分,嵌套page容器
305
- const temp = {
306
- type: 'container_page',
307
- span: cache.span,
308
- id: 'container_' + lowcodeUtils.nanoidWithoutSymbol(6),
309
- page: [
310
- {
311
- id: newPageId,
312
- type: 'page',
313
- body: [
314
- {
315
- id: newPageId + '_0',
316
- type: 'row',
317
- config: {
318
- align: 'top',
319
- gutter: 0,
320
- justify: 'start'
321
- },
322
- body: []
323
- }
324
- ]
325
- }
326
- ]
327
- }
328
- cache.span = 24
329
- // 第一行放缓存的原始对象
330
- temp.page[0].body[0].body.push(cache)
331
- // 第二行新增容器
332
- temp.page[0].body[1] = {
333
- id: newPageId + '_1',
334
- type: 'row',
335
- config: {
336
- align: 'top',
337
- gutter: 0,
338
- justify: 'start'
339
- },
340
- body: []
341
- }
342
- temp.page[0].body[1].body.push(lowcodeUtils.newContainer())
343
- row.body.splice(index, 1, temp)
344
- } else {
345
- // 如果是水平拆分
346
- // 将原先对象span一分为二,添加容器
347
- const outerSpan = cache.span
348
- const firstSpan = Math.round(outerSpan / 2)
349
- const secondSpan = outerSpan - firstSpan
350
- cache.span = firstSpan
351
- row.body.splice(index, 1, cache, lowcodeUtils.newContainer(secondSpan))
352
- }
353
- this.refreshOrganization()
354
- },
355
- // 复制粘贴组件
356
- handlePasteItem (id, copyCache, type) {
357
- const target = lowcodeUtils.getConfig(id, this.config)
358
- // 页面中插入行
359
- if (type === 'page-row') {
360
- const content = copyCache.content
361
- const pageId = target.id
362
- content.id = pageId + '_' + target.body.length
363
- target.body.push(content)
364
- } else if (type === 'row-item') {
365
- // 行中插入组件
366
- target.body.push(copyCache.content)
367
- } else if (type === 'page') {
368
- // 复制页面
369
- this.config.page.push(copyCache)
370
- this.$message.success('复制成功!')
371
- }
372
- this.refreshOrganization()
373
- },
374
- // 点击架构树
375
- treeOrganizationClick (id) {
376
- // 如果是反选
377
- if (id === null) {
378
- // 清除编辑框
379
- this.editorPropertiesConfig = {}
380
- this.$store.commit('setTargetContainer', undefined)
381
- // 清除容器select
382
- lowcodeUtils.unCheckAll(this.config)
383
- return
384
- }
385
- let target
386
- if (id.includes('container_page')) {
387
- // 长度大于17证明是容器页面的行
388
- if (id.length > 17) {
389
- const rowConfig = lowcodeUtils.getPageIdAndRowIndexByRowId(id)
390
- target = lowcodeUtils.getRowByRowId(rowConfig.pageId, rowConfig.rowIndex, this.config)
391
- } else {
392
- target = lowcodeUtils.getContainerPageOuterByContainerPageId(id, this.config)
393
- }
394
- } else {
395
- // 包含page表示选中的是某一行
396
- if (id.includes('page')) {
397
- const rowConfig = lowcodeUtils.getPageIdAndRowIndexByRowId(id)
398
- target = lowcodeUtils.getRowByRowId(rowConfig.pageId, rowConfig.rowIndex, this.config)
399
- } else {
400
- target = lowcodeUtils.getComponentConfig(id, this.config)
401
- }
402
- }
403
- // 将组件选中
404
- this.clickComponentInEditor(target)
405
- if (!id.includes('container') && !(id.includes('page') && id.length > 11)) {
406
- this.twink(id)
407
- }
408
- },
409
- // 架构树拖拽事件
410
- handleTreeDrag (dragKey, dropKey, dragLevel, dropLevel, dropPosition, dragType) {
411
- // 只有三种情况可以拖拽
412
- // 1.平级挪
413
- // 2.高一级插
414
- // 3.行插子页面
415
- let dragEle, rowConfig, father, cache, deleteIndex
416
-
417
- // 复制移动组件,并将其从原位删除
418
- switch (dragLevel.type) {
419
- case 'row':
420
- rowConfig = lowcodeUtils.getPageIdAndRowIndexByRowId(dragKey)
421
- father = lowcodeUtils.getPageConfigById(rowConfig.pageId, this.config)
422
- dragEle = father.body[rowConfig.rowIndex]
423
- // 复制原始
424
- cache = JSON.parse(JSON.stringify(dragEle))
425
- // 删除原始
426
- deleteIndex = rowConfig.rowIndex
427
- father.body.splice(deleteIndex, 1, { placeHold: true })
428
- break
429
- case 'item':
430
- father = lowcodeUtils.getRowConfigByComponentId(dragKey, this.config).body
431
- dragEle = lowcodeUtils.getComponentConfig(dragKey, this.config)
432
- // 复制原始
433
- cache = JSON.parse(JSON.stringify(dragEle))
434
- // 删除原始
435
- for (let i = 0; i < father.length; i++) {
436
- const item = father[i]
437
- if (item.id === dragKey) {
438
- deleteIndex = i
439
- break
440
- }
441
- }
442
- father.splice(deleteIndex, 1, { placeHold: true })
443
- break
444
- case 'container_page':
445
- father = lowcodeUtils.getContainerPageRow(dragKey, this.config).body
446
- dragEle = lowcodeUtils.getContainerPageOuterByContainerPageId(dragKey, this.config)
447
- // 复制原始
448
- cache = JSON.parse(JSON.stringify(dragEle))
449
- // 删除原始
450
- for (let i = 0; i < father.length; i++) {
451
- const item = father[i]
452
- if (item.type === 'container_page' && item.page[0].id === dragKey) {
453
- deleteIndex = i
454
- break
455
- }
456
- }
457
- father.splice(deleteIndex, 1, { placeHold: true })
458
- break
459
- }
460
-
461
- let target, dropConfig, targetCache, targetIndex
462
- switch (dragType) {
463
- case 'move':
464
- // 1. 平级挪
465
- switch (dragLevel.type) {
466
- case 'row':
467
- // 移动行
468
- // 拿到父容器和目标Index
469
- dropConfig = lowcodeUtils.getPageIdAndRowIndexByRowId(dropKey)
470
- target = lowcodeUtils.getPageConfigById(dropConfig.pageId, this.config)
471
- // 保存目标
472
- targetCache = target.body[dropConfig.rowIndex]
473
- // 插入
474
- if (dropPosition < 0) {
475
- target.body.splice(dropConfig.rowIndex, 1, cache, targetCache)
476
- } else {
477
- target.body.splice(dropConfig.rowIndex, 1, targetCache, cache)
478
- }
479
- // 清理占位
480
- for (let i = 0; i < father.body.length; i++) {
481
- const item = father.body[i]
482
- if (item.placeHold) {
483
- father.body.splice(i, 1)
484
- break
485
- }
486
- }
487
- break
488
- case 'item':
489
- // 移动组件
490
- // 拿到父容器和目标Index
491
- if (dropLevel.type === 'container_page') {
492
- target = lowcodeUtils.getContainerPageRow(dropKey, this.config)
493
- for (let i = 0; i < target.body.length; i++) {
494
- const item = target.body[i]
495
- if (item.type === 'container_page' && item.page[0].id === dropKey) {
496
- targetIndex = i
497
- break
498
- }
499
- }
500
- } else {
501
- target = lowcodeUtils.getRowByComponentId(dropKey, this.config)
502
- for (let i = 0; i < target.body.length; i++) {
503
- const item = target.body[i]
504
- if (item.id === dropKey) {
505
- targetIndex = i
506
- break
507
- }
508
- }
509
- }
510
- // 保存目标
511
- targetCache = target.body[targetIndex]
512
- // 插入
513
- if (dropPosition < 0) {
514
- target.body.splice(targetIndex, 1, cache, targetCache)
515
- } else {
516
- target.body.splice(targetIndex, 1, targetCache, cache)
517
- }
518
- // 清理占位
519
- for (let i = 0; i < father.length; i++) {
520
- const item = father[i]
521
- if (item.placeHold) {
522
- father.splice(i, 1)
523
- break
524
- }
525
- }
526
- if (father.length === 0) {
527
- father.push(lowcodeUtils.newContainer())
528
- }
529
- break
530
- case 'container_page':
531
- // 移动容器页面
532
- // 拿到父容器和目标Index
533
- if (dropLevel.type === 'container_page') {
534
- target = lowcodeUtils.getContainerPageRow(dropKey, this.config)
535
- for (let i = 0; i < target.body.length; i++) {
536
- const item = target.body[i]
537
- if (item.type === 'container_page' && item.page[0].id === dropKey) {
538
- targetIndex = i
539
- break
540
- }
541
- }
542
- } else {
543
- target = lowcodeUtils.getRowByComponentId(dropKey, this.config)
544
- for (let i = 0; i < target.body.length; i++) {
545
- const item = target.body[i]
546
- if (item.id === dropKey) {
547
- targetIndex = i
548
- break
549
- }
550
- }
551
- }
552
- // 保存目标
553
- targetCache = target.body[targetIndex]
554
- // 插入
555
- if (dropPosition < 0) {
556
- target.body.splice(targetIndex, 1, cache, targetCache)
557
- } else {
558
- target.body.splice(targetIndex, 1, targetCache, cache)
559
- }
560
- // 清理占位
561
- for (let i = 0; i < father.length; i++) {
562
- const item = father[i]
563
- if (item.placeHold) {
564
- father.splice(i, 1)
565
- break
566
- }
567
- }
568
- if (father.length === 0) {
569
- father.push(lowcodeUtils.newContainer())
570
- }
571
- }
572
- break
573
- case 'higher':
574
- // 2.高一级插
575
- switch (dragLevel.type) {
576
- case 'row':
577
- // 行插页
578
- target = lowcodeUtils.getPageConfigById(dropKey, this.config)
579
- target.body.push(cache)
580
- for (let i = 0; i < father.body.length; i++) {
581
- const item = father.body[i]
582
- if (item.placeHold) {
583
- father.body.splice(i, 1)
584
- break
585
- }
586
- }
587
- break
588
- case 'item':
589
- // 组件插行
590
- rowConfig = lowcodeUtils.getPageIdAndRowIndexByRowId(dropKey)
591
- target = lowcodeUtils.getRowByRowId(rowConfig.pageId, rowConfig.rowIndex, this.config)
592
- target.body.push(cache)
593
- for (let i = 0; i < father.length; i++) {
594
- if (father[i].placeHold) {
595
- father.splice(i, 1)
596
- break
597
- }
598
- }
599
- if (father.length === 0) {
600
- father.push(lowcodeUtils.newContainer())
601
- }
602
- break
603
- case 'container_page':
604
- // 子页面插行
605
- rowConfig = lowcodeUtils.getPageIdAndRowIndexByRowId(dropKey)
606
- target = lowcodeUtils.getRowByRowId(rowConfig.pageId, rowConfig.rowIndex, this.config)
607
- target.body.push(cache)
608
- for (let i = 0; i < father.length; i++) {
609
- if (father[i].placeHold) {
610
- father.splice(i, 1)
611
- break
612
- }
613
- }
614
- if (father.length === 0) {
615
- father.push(lowcodeUtils.newContainer())
616
- }
617
- break
618
- }
619
- break
620
- case 'rowToContainer':
621
- // 3.行插子页面
622
- target = lowcodeUtils.getContainerPageOuterByContainerPageId(dropKey, this.config)
623
- target.page[0].body.push(cache)
624
- for (let i = 0; i < father.body.length; i++) {
625
- const item = father.body[i]
626
- if (item.placeHold) {
627
- father.body.splice(i, 1)
628
- break
629
- }
630
- }
631
- break
632
- case 'switch':
633
- switch (dragLevel.type) {
634
- case 'row':
635
- // 拿到父容器和目标Index
636
- dropConfig = lowcodeUtils.getPageIdAndRowIndexByRowId(dropKey)
637
- target = lowcodeUtils.getPageConfigById(dropConfig.pageId, this.config)
638
- // 保存目标
639
- targetCache = target.body[dropConfig.rowIndex]
640
- // 替换目标
641
- target.body.splice(dropConfig.rowIndex, 1, cache)
642
- // 将目标替换到原始
643
- for (let i = 0; i < father.body.length; i++) {
644
- const item = father.body[i]
645
- if (item.placeHold) {
646
- father.body.splice(i, 1, targetCache)
647
- break
648
- }
649
- }
650
- break
651
- case 'item':
652
- // 拿到父容器和目标Index
653
- if (dropLevel.type === 'container_page') {
654
- target = lowcodeUtils.getContainerPageRow(dropKey, this.config)
655
- for (let i = 0; i < target.body.length; i++) {
656
- const item = target.body[i]
657
- if (item.type === 'container_page' && item.page[0].id === dropKey) {
658
- targetIndex = i
659
- break
660
- }
661
- }
662
- } else {
663
- target = lowcodeUtils.getRowByComponentId(dropKey, this.config)
664
- for (let i = 0; i < target.body.length; i++) {
665
- const item = target.body[i]
666
- if (item.id === dropKey) {
667
- targetIndex = i
668
- break
669
- }
670
- }
671
- }
672
- // 保存目标
673
- targetCache = target.body[targetIndex]
674
- // 替换目标
675
- target.body.splice(targetIndex, 1, cache)
676
- // 将目标替换到原始
677
- for (let i = 0; i < father.length; i++) {
678
- const item = father[i]
679
- if (item.placeHold) {
680
- father.splice(i, 1, targetCache)
681
- break
682
- }
683
- }
684
- break
685
- case 'container_page':
686
- // 移动容器页面
687
- // 拿到父容器和目标Index
688
- if (dropLevel.type === 'container_page') {
689
- target = lowcodeUtils.getContainerPageRow(dropKey, this.config)
690
- for (let i = 0; i < target.body.length; i++) {
691
- const item = target.body[i]
692
- if (item.type === 'container_page' && item.page[0].id === dropKey) {
693
- targetIndex = i
694
- break
695
- }
696
- }
697
- } else {
698
- target = lowcodeUtils.getRowByComponentId(dropKey, this.config)
699
- for (let i = 0; i < target.body.length; i++) {
700
- const item = target.body[i]
701
- if (item.id === dropKey) {
702
- targetIndex = i
703
- break
704
- }
705
- }
706
- }
707
- // 保存目标
708
- targetCache = target.body[targetIndex]
709
- // 替换目标
710
- target.body.splice(targetIndex, 1, cache)
711
- // 将目标替换到原始
712
- for (let i = 0; i < father.length; i++) {
713
- const item = father[i]
714
- if (item.placeHold) {
715
- father.splice(i, 1, targetCache)
716
- break
717
- }
718
- }
719
- break
720
- }
721
- }
722
-
723
- this.refreshOrganization()
724
- },
725
- // 主页面标签切换
726
- handleMainPageMenuChange (value) {
727
- // 如果和之前选择的不一样
728
- if (value.key !== this.activeMainPage) {
729
- // 清空属性编辑
730
- this.editorPropertiesConfig = {}
731
- this.$store.commit('setTargetContainer', undefined)
732
- // 切换菜单
733
- this.activeMainPage = value.key
734
- for (let i = 0; i < this.config.page.length; i++) {
735
- if (this.config.page[i].id === this.activeMainPage) {
736
- this.activeMainPageType = this.config.page[i].type
737
- this.refreshOrganization()
738
- return
739
- }
740
- }
741
- }
742
- },
743
- // 将页面标签类型渲染为对应的文字
744
- determinePageType (type) {
745
- return lowcodeUtils.resolvePageType(type)
746
- },
747
- // 刷新架构
748
- refreshOrganization () {
749
- this.showPageOrganization = false
750
- this.$nextTick(() => {
751
- this.showPageOrganization = true
752
- })
753
- },
754
- // 拖拽完成后,将新的span赋值
755
- handleDrag (targetEle, nextEle) {
756
- const target = lowcodeUtils.getComponentConfig(targetEle.id, this.config.page)
757
- const targetNext = lowcodeUtils.getComponentConfig(nextEle.id, this.config.page)
758
- target.span = targetEle.span
759
- targetNext.span = nextEle.span
760
- },
761
- // 删除组件
762
- deleteComponentInTree (id, type) {
763
- if (type === 'page') {
764
- const page = lowcodeUtils.getPageConfigById(id, this.config)
765
- this.deletePage(page)
766
- } else if (type === 'component') {
767
- this.deleteComponent(id)
768
- } else if (type === 'row') {
769
- this.deleteRow(id)
770
- } else if (type === 'container_page') {
771
- this.deleteContainerPage(id)
772
- }
773
- },
774
- // 删除容器页面
775
- deleteContainerPage (id) {
776
- const target = lowcodeUtils.getContainerPageOuterByContainerPageId(id, this.config)
777
- target.type = 'container'
778
- delete target.page
779
- this.$store.commit('setTargetContainer', undefined)
780
- this.editorPropertiesConfig = {}
781
- this.refreshOrganization()
782
- },
783
- // 删除行
784
- deleteRow (id) {
785
- const pageId = id.substring(0, id.length - 2)
786
- const rowId = id.substring(id.length - 1)
787
- const page = lowcodeUtils.getPageConfigById(pageId, this.config)
788
- page.body.splice(rowId, 1)
789
- // 如果该列下没有任何内容,则将该列还原为容器
790
- if (page.body.length === 0) {
791
- const outerContainer = lowcodeUtils.getContainerPageOuterByContainerPageId(page.id, this.config)
792
- outerContainer.type = 'container'
793
- outerContainer.selected = false
794
- delete outerContainer.page
795
- }
796
- this.$store.commit('setTargetContainer', undefined)
797
- this.editorPropertiesConfig = {}
798
- this.refreshOrganization()
799
- },
800
- // 删除页面容器
801
- deletePage (page) {
802
- // 清空页面下所有组件的注册信息
803
- page.body.forEach(row => {
804
- row.body.forEach(item => {
805
- if (item.type === 'container_page') {
806
- // 如果是容器页面,递归
807
- this.deletePage(item.page)
808
- } else {
809
- delete this.$children[0]._provided.componentsMap[item.id]
810
- }
811
- })
812
- })
813
- for (let i = 0; i < this.config.page.length; i++) {
814
- if (this.config.page[i].id === page.id) {
815
- this.config.page.splice(i, 1)
816
- this.$store.commit('setTargetContainer', undefined)
817
- this.editorPropertiesConfig = {}
818
- this.refreshOrganization()
819
- return
820
- }
821
- }
822
- },
823
- // 删除组件
824
- deleteComponent (id, addOnSpan = true) {
825
- const row = lowcodeUtils.getRowConfigByComponentId(id, this.config)
826
- const target = lowcodeUtils.getComponentConfig(id, this.config)
827
- const deletedSpan = target.span
828
- let index
829
- for (let i = 0; i < row.body.length; i++) {
830
- if (target.id === row.body[i].id) {
831
- index = i
832
- break
833
- }
834
- }
835
- row.body.splice(index, 1)
836
- if (addOnSpan) {
837
- // 如果该组件之前还有组件,将该组件的span加给之前的组件
838
- if (index !== 0) {
839
- row.body[index - 1].span += deletedSpan
840
- } else if (row.body.length > 0) {
841
- row.body[0].span += deletedSpan
842
- }
843
- if (row.body[index - 1].span > 24) {
844
- row.body[index - 1].span = 24
845
- }
846
- }
847
- if (row.body.length === 0) {
848
- row.body.push(lowcodeUtils.newContainer())
849
- }
850
- // 从注册的全局Map中删除
851
- delete this.$children[0]._provided.componentsMap[id]
852
- this.$store.commit('setTargetContainer', undefined)
853
- this.editorPropertiesConfig = {}
854
- this.refreshOrganization()
855
- },
856
- // 容器删除
857
- handleContainerDelete (id) {
858
- let index
859
- const row = lowcodeUtils.getRowConfigByComponentId(id, this.config)
860
- for (let i = 0; i < row.body.length; i++) {
861
- const item = row.body[i]
862
- if (item.id === id) {
863
- index = i
864
- break
865
- }
866
- }
867
- row.body.splice(index, 1)
868
- this.$store.commit('setTargetContainer', undefined)
869
- // 如果删除后只剩一个容器,将该容器span设置为24
870
- if (row.body.length === 1) {
871
- row.body[0].span = 24
872
- } else if (row.body.length === 0) {
873
- row.body.push(lowcodeUtils.newContainer())
874
- }
875
- this.refreshOrganization()
876
- },
877
- // 切换预览模式
878
- previewModeActive () {
879
- this.preview = true
880
- },
881
- // 切换编辑模式
882
- editModeActive () {
883
- this.preview = false
884
- },
885
- // 选中某个组件
886
- clickComponentInEditor (configItem) {
887
- this.disableEventEditor = false
888
- if (!configItem) {
889
- return
890
- }
891
- // 同步选中架构
892
- // 将选中的节点清空,在$nextTick再赋值,保证组件能watch到改变
893
- this.selectTreeNode = undefined
894
- if (configItem.type === 'container_page') {
895
- this.$nextTick(() => {
896
- this.selectTreeNode = 'container_page_' + configItem.page[0].id
897
- })
898
- } else if (configItem.type === 'row' || !configItem.type) {
899
- const rowConfig = lowcodeUtils.getPageIdAndRowIndexByRowId(configItem.id)
900
- rowConfig.rowIndex++
901
- this.$nextTick(() => {
902
- this.selectTreeNode = 'row_' + rowConfig.pageId + '_' + rowConfig.rowIndex
903
- })
904
- } else {
905
- this.$nextTick(() => {
906
- this.selectTreeNode = configItem.id
907
- })
908
- lowcodeUtils.unCheckAll(this.config)
909
- }
910
- this.editorPropertiesConfig = {}
911
- // 如果选中的是容器
912
- if (configItem.type === 'container') {
913
- // 将所有已选中组件取消选择
914
- lowcodeUtils.unCheckAll(this.config)
915
- // 将目标设置为选定
916
- configItem.selected = true
917
- this.$store.commit('setTargetContainer', configItem)
918
- this.editorPropertiesConfig = configItem
919
- this.disableEventEditor = true
920
- this.editorPropertiesConfig.props = {}
921
- return
922
- }
923
- // 如果选中的是容器页面
924
- if (configItem.type === 'container_page') {
925
- // 选中容器页面中所有组件
926
- lowcodeUtils.unCheckAll(this.config)
927
- configItem.page.forEach(page => {
928
- page.body.forEach(row => {
929
- lowcodeUtils.checkRowAll(row)
930
- })
931
- })
932
- this.editorPropertiesConfig = configItem
933
- this.disableEventEditor = true
934
- this.editorPropertiesConfig.props = {}
935
- return
936
- }
937
-
938
- // 如果选中的是行
939
- if (configItem.type === 'row' || !configItem.type) {
940
- lowcodeUtils.checkRowAll(configItem, this.config)
941
- this.editorPropertiesConfig = configItem
942
- this.disableEventEditor = true
943
- this.editorPropertiesConfig.props = {}
944
- return
945
- }
946
-
947
- if (configItem.type === 'tabs') {
948
- console.warn('tabs', configItem)
949
- this.editorPropertiesConfig = configItem
950
- this.disableEventEditor = true
951
- this.editorPropertiesConfig.props = {}
952
- return
953
- }
954
- // 如果是组件对象
955
- // 拿注册的配置
956
- const configInJson = lowcodeUtils.getEditorConfigByType(configItem.type)
957
- if (configInJson) {
958
- this.editorPropertiesConfig = configItem
959
- // 为编辑器变量初始化
960
- if (configInJson.properties) {
961
- if (!this.editorPropertiesConfig.props) {
962
- this.editorPropertiesConfig.props = {}
963
- }
964
- const editableKeys = Object.keys(configInJson.properties)
965
- editableKeys.forEach(editableKey => {
966
- // 如果该值并不存在,则初始化
967
- if (!this.editorPropertiesConfig.props[editableKey]) {
968
- this.editorPropertiesConfig.props[editableKey] = ''
969
- } else {
970
- if (typeof this.editorPropertiesConfig.props[editableKey] === 'object') {
971
- this.editorPropertiesConfig.props[editableKey] = JSON.stringify(this.editorPropertiesConfig.props[editableKey])
972
- }
973
- }
974
- })
975
- }
976
- // 为编辑器事件初始化
977
- if (configInJson.selfEvent) {
978
- if (!this.editorPropertiesConfig.selfEvent) {
979
- this.editorPropertiesConfig.selfEvent = []
980
- configInJson.selfEvent.forEach(everyEvent => {
981
- this.editorPropertiesConfig.selfEvent.push(everyEvent)
982
- })
983
- }
984
- }
985
- } else {
986
- this.editorPropertiesConfig = 'unregistered'
987
- }
988
- },
989
- // 架构树点击某个节点后,在渲染器中,让组件闪烁
990
- twink (id) {
991
- const allRefs = Object.keys(this.$refs)
992
- allRefs.forEach(ref => {
993
- if (this.$refs[ref].twink) {
994
- this.$refs[ref].twink(id)
995
- }
996
- })
997
- },
998
- // 点击测试按钮
999
- test () {
1000
- // 输出当前配置,和组件注册Map
1001
- console.warn('config', this.config)
1002
- console.warn('map', this.$children[0]._provided.componentsMap)
1003
- },
1004
- // 点击导出按钮
1005
- exportConfig () {
1006
- console.warn('导出', this.config)
1007
- this.$emit('exportConfig', this.config)
1008
- }
1009
- },
1010
- mounted () {
1011
- // 将mixin中已经实现的通用响应方法添加
1012
- this.supportedEventType = [...lowcodeComponentMixin.supportedEventType]
1013
- let cache = {}
1014
- if (!this.originalConfig.config) {
1015
- cache = { page: [] }
1016
- } else {
1017
- cache = JSON.parse(JSON.stringify(this.originalConfig.config))
1018
- }
1019
- // 深拷贝外侧传来的配置
1020
- this.$store.commit('setConfig', cache)
1021
- const tempConfig = {
1022
- page: [
1023
- {
1024
- id: 'page_deowoe',
1025
- type: 'page',
1026
- title: '1',
1027
- body: [
1028
- {
1029
- id: 'page_deowoe_0',
1030
- config: {
1031
- align: 'top',
1032
- gutter: 0,
1033
- justify: 'start'
1034
- },
1035
- type: 'row',
1036
- body: [
1037
- {
1038
- type: 'XFormTable',
1039
- selected: false,
1040
- span: 24,
1041
- id: 'XFormTable_cWmejz',
1042
- props: {
1043
- queryParamsName: 'crud_dictionary_manage',
1044
- serviceName: 'af-system'
1045
- },
1046
- selfEvent: [
1047
- 'action'
1048
- ],
1049
- onEvent: {
1050
- action: [
1051
- {
1052
- emitType: 'action',
1053
- eventType: 'changeProps',
1054
- target: 'XDescriptions_nE5IcB',
1055
- targetKey: 'content'
1056
- },
1057
- {
1058
- emitType: 'action',
1059
- eventType: 'showDraw',
1060
- visible: 'open',
1061
- containerId: 'page_e12Xon'
1062
- }
1063
- ]
1064
- }
1065
- }
1066
- ]
1067
- }
1068
- ]
1069
- },
1070
- {
1071
- id: 'page_e12Xon',
1072
- type: 'draw',
1073
- title: '2',
1074
- width: '70%',
1075
- body: [
1076
- {
1077
- id: 'page_e12Xon_0',
1078
- config: {
1079
- align: 'top',
1080
- gutter: 0,
1081
- justify: 'start'
1082
- },
1083
- type: 'row',
1084
- body: [
1085
- {
1086
- type: 'XDescriptions',
1087
- selected: false,
1088
- span: 24,
1089
- id: 'XDescriptions_nE5IcB',
1090
- props: {
1091
- title: '详情',
1092
- content: {
1093
- d_id: 111,
1094
- d_f_remark: '-',
1095
- d_f_name: '设备区域',
1096
- d_f_key: '设备区域',
1097
- d_f_input_date: '2023-03-20 13:40:54'
1098
- },
1099
- configName: 'test_lowCode_descriptionConfig',
1100
- serviceName: 'af-system',
1101
- getRealData: false
1102
- },
1103
- selfEvent: []
1104
- }
1105
- ]
1106
- },
1107
- {
1108
- id: 'page_e12Xon_1',
1109
- config: {
1110
- align: 'top',
1111
- gutter: 0,
1112
- justify: 'start'
1113
- },
1114
- type: 'row',
1115
- body: [
1116
- {
1117
- type: 'tabs',
1118
- span: 24,
1119
- id: 'Tabs_TFg731',
1120
- props: {},
1121
- body: [
1122
- {
1123
- key: 'Tabs_TFg731_1',
1124
- label: '1',
1125
- type: 'tab',
1126
- body: {
1127
- type: 'container_page',
1128
- span: 24,
1129
- id: 'container_ZX1Ixz',
1130
- page: [
1131
- {
1132
- id: 'container_page_ks',
1133
- type: 'page',
1134
- body: [
1135
- {
1136
- id: 'container_page_ks_0',
1137
- type: 'row',
1138
- config: {
1139
- align: 'top',
1140
- gutter: 0,
1141
- justify: 'start'
1142
- },
1143
- body: [
1144
- {
1145
- type: 'container',
1146
- selected: true,
1147
- span: 24,
1148
- id: 'container_UNOr8I',
1149
- props: {}
1150
- }
1151
- ]
1152
- }
1153
- ]
1154
- }
1155
- ]
1156
- }
1157
- },
1158
- {
1159
- key: '1',
1160
- label: '22',
1161
- type: 'tab',
1162
- body: {
1163
- type: 'container_page',
1164
- span: 24,
1165
- id: 'container_ToXInv',
1166
- page: [
1167
- {
1168
- id: 'container_page_U0',
1169
- type: 'page',
1170
- body: [
1171
- {
1172
- id: 'container_page_U0_0',
1173
- type: 'row',
1174
- config: {
1175
- align: 'top',
1176
- gutter: 0,
1177
- justify: 'start'
1178
- },
1179
- body: [
1180
- {
1181
- type: 'container',
1182
- selected: true,
1183
- span: 24,
1184
- id: 'container_sSWXao',
1185
- props: {}
1186
- }
1187
- ]
1188
- }
1189
- ]
1190
- }
1191
- ]
1192
- }
1193
- }
1194
- ],
1195
- selected: false
1196
- }
1197
- ]
1198
- }
1199
- ]
1200
- }
1201
- ]
1202
- }
1203
- this.$store.commit('setConfig', tempConfig)
1204
- this.refreshOrganization()
1205
- },
1206
- computed: {
1207
- config () {
1208
- return this.$store.state.lowCode.config
1209
- },
1210
- targetContainer () {
1211
- return this.$store.state.lowCode.targetContainer
1212
- }
1213
- }
1214
- }
1215
- </script>
1216
-
1217
- <style scoped lang="less">
1218
-
1219
- </style>
1
+ <template>
2
+ <div>
3
+ <!-- 标题 -->
4
+ <a-card>
5
+ <a-page-header
6
+ title="奥枫低代码前端编辑器"
7
+ sub-title="af-lowcode"
8
+ :backIcon="false"
9
+ @back="() => null"
10
+ >
11
+ <template slot="extra">
12
+ <a-button @click="test">测试</a-button>
13
+ <a-button @click="editModeActive">编辑</a-button>
14
+ <a-button @click="previewModeActive">预览</a-button>
15
+ <a-button type="primary" @click="exportConfig">导出</a-button>
16
+ </template>
17
+ </a-page-header>
18
+ </a-card>
19
+ <!-- 预览模式 -->
20
+ <a-card v-if="preview">
21
+ <LowCodeRender :page-config="config" :edit-mode="false"/>
22
+ </a-card>
23
+ <!-- 编辑模式 -->
24
+ <div v-show="!preview">
25
+ <a-row :gutter="2">
26
+ <!-- 左侧 -->
27
+ <a-col :span="4">
28
+ <a-card>
29
+ <a-tabs>
30
+ <!-- UI库 -->
31
+ <a-tab-pane key="1" tab="UI库">
32
+ <LowCodeUIStore @refresh="refresh"/>
33
+ </a-tab-pane>
34
+ <!-- 页面架构 -->
35
+ <a-tab-pane key="2" tab="架构" style="overflow: scroll">
36
+ <div style="margin-bottom: 3%; width: 200px">
37
+ <LowCodePageOrganization
38
+ :config="filterOrganizationConfig()"
39
+ v-if="showPageOrganization"
40
+ :select-tree-node="selectTreeNode"
41
+ @rename="rename"
42
+ @add="handleTreeAdd"
43
+ @split="handleSplit"
44
+ @pasteItem="handlePasteItem"
45
+ @componentMove="handleTreeDrag"
46
+ @deleteComponent="deleteComponentInTree"
47
+ @treeOrganizationClick="treeOrganizationClick"/>
48
+ </div>
49
+ </a-tab-pane>
50
+ </a-tabs>
51
+ </a-card>
52
+ </a-col>
53
+ <!-- 中间主体编辑器 -->
54
+ <a-col :span="15">
55
+ <a-card>
56
+ <!-- 切换显示的组件 -->
57
+ <div style="margin-bottom: 3%">
58
+ <!-- 添加页面组件按钮 -->
59
+ <div style="float: right">
60
+ <a-popover>
61
+ <template slot="content">
62
+ <p>添加页面组件</p>
63
+ </template>
64
+ <a-button @click="addPageContainer" >
65
+ <a-icon type="plus"/>
66
+ </a-button>
67
+ </a-popover>
68
+ </div>
69
+ <!-- 每个页面按钮切换栏 -->
70
+ <a-menu v-model="mainPageMenu" mode="horizontal" @click="handleMainPageMenuChange">
71
+ <template v-for="(page) in config.page">
72
+ <a-menu-item :key="page.id">{{ page.title + '(' + determinePageType(page.type) + ')' }}</a-menu-item>
73
+ </template>
74
+ </a-menu>
75
+ </div>
76
+ <!-- 渲染器 -->
77
+ <div v-if="activeMainPageType === 'page'">
78
+ <LowCodeRender
79
+ v-if="renderPage"
80
+ ref="page_render"
81
+ @spanDrag="handleDrag"
82
+ @containerDelete="handleContainerDelete"
83
+ @clickComponentInEditor="clickComponentInEditor"
84
+ :page-config="{ data: config.data, page: config.page.filter(page => page.id === activeMainPage)}"/>
85
+ <a-skeleton v-else/>
86
+ </div>
87
+ <div v-if="activeMainPageType === 'modal'">
88
+ <LowCodeRender
89
+ v-if="renderPage"
90
+ ref="modal_render"
91
+ @spanDrag="handleDrag"
92
+ @containerDelete="handleContainerDelete"
93
+ @clickComponentInEditor="clickComponentInEditor"
94
+ :page-config="{ data: config.data, page: config.page.filter(page => page.id === activeMainPage)}"/>
95
+ <a-skeleton v-else/>
96
+ </div>
97
+ <div v-if="activeMainPageType === 'draw'">
98
+ <LowCodeRender
99
+ v-if="renderPage"
100
+ ref="draw_render"
101
+ @spanDrag="handleDrag"
102
+ @containerDelete="handleContainerDelete"
103
+ @clickComponentInEditor="clickComponentInEditor"
104
+ :page-config="{ data: config.data, page: config.page.filter(page => page.id === activeMainPage)}"/>
105
+ <a-skeleton v-else/>
106
+ </div>
107
+ </a-card>
108
+ </a-col>
109
+ <!-- 右侧 -->
110
+ <a-col :span="5">
111
+ <LowCodeEditorPanel
112
+ ref="rightPanel"
113
+ @openModal="openModal"
114
+ @controlRender="controlRender"
115
+ :disable-event-editor="disableEventEditor"
116
+ :editorPropertiesConfig="editorPropertiesConfig"/>
117
+ </a-col>
118
+ </a-row>
119
+ </div>
120
+ <!-- 所有的弹窗,包括:
121
+ 新增页面容器弹框
122
+ 自定义JS函数弹框
123
+ 事件编辑弹框
124
+ 自定义生命周期函数弹框
125
+ 自定义Logic参数JS弹框
126
+ 自定义Logic回调弹框
127
+ 运行目标组件参数编辑弹框
128
+ -->
129
+ <LowCodeEditorModal
130
+ ref="allModal"
131
+ @changeOuterValue="changeOuterValue"
132
+ @refresh="refresh"
133
+ :event-editor-current="eventEditorCurrent"
134
+ :editor-properties-config="editorPropertiesConfig"/>
135
+ </div>
136
+ </template>
137
+
138
+ <script>
139
+ import LowCodeRender from '@vue2-client/base-client/components/common/LowCodeComponent/LowCodeRender.vue'
140
+ import * as lowcodeUtils from '@vue2-client/utils/lowcode/lowcodeUtils'
141
+ import codeMirror from '@vue2-client/components/CodeMirror/inedx.vue'
142
+ import lowcodeComponentMixin from '@vue2-client/utils/lowcode/lowcodeComponentMixin'
143
+ import LowCodePageOrganization from '@vue2-client/base-client/components/common/LowCodeComponent/LowCodePageOrganization.vue'
144
+ import LowCodeEditorModal from '@vue2-client/base-client/components/common/LowCodeComponent/LowCodeEditorModal.vue'
145
+ import LowCodeUIStore from '@vue2-client/base-client/components/common/LowCodeComponent/LowCodeUIStore.vue'
146
+ import LowCodeEditorPanel from '@vue2-client/base-client/components/common/LowCodeComponent/LowCodeEditorPanel.vue'
147
+
148
+ export default {
149
+ name: 'LowCodeEditor',
150
+ components: {
151
+ LowCodeEditorModal,
152
+ LowCodePageOrganization,
153
+ LowCodeRender,
154
+ codeMirror,
155
+ LowCodeUIStore,
156
+ LowCodeEditorPanel
157
+ },
158
+ props: {
159
+ // 页面原始的配置,用于从琉璃中读取
160
+ originalConfig: {
161
+ type: Object,
162
+ default: () => {
163
+ return {
164
+ page: []
165
+ }
166
+ }
167
+ }
168
+ },
169
+ data () {
170
+ return {
171
+ // 主体窗口选择的标签
172
+ mainPageMenu: ['none'],
173
+ // 控制是否渲染页面
174
+ preview: false,
175
+ // 控制架构树显隐,用于刷新组件
176
+ showPageOrganization: true,
177
+ // 用于保存右侧编辑组件的属性
178
+ editorPropertiesConfig: {},
179
+ // 用于事件编辑的回显,在点击事件编辑按钮后,会将此变量赋值
180
+ eventEditorCurrent: undefined,
181
+ // 保存目标组件可以触发哪些事件
182
+ supportedEventType: undefined,
183
+ // 保存主体中,当前激活的标签栏ID
184
+ activeMainPage: undefined,
185
+ // 保存主体中,当前激活的标签栏类型
186
+ activeMainPageType: undefined,
187
+ // 指定架构树选中哪个节点
188
+ selectTreeNode: undefined,
189
+ // 禁用事件编辑
190
+ disableEventEditor: false,
191
+ // 控制右侧事件编辑刷新
192
+ showEventEditor: true,
193
+ // 控制渲染器更新
194
+ renderPage: true
195
+ }
196
+ },
197
+ provide () {
198
+ return {
199
+ // 将注册的组件传递给子组件
200
+ componentsMap: {}
201
+ }
202
+ },
203
+ methods: {
204
+ controlRender (flag) {
205
+ this.renderPage = flag
206
+ },
207
+ // 打开弹窗
208
+ openModal (modalName) {
209
+ this.$refs.allModal.changeModalVisible(modalName)
210
+ },
211
+ // 子组件修改父组件的值
212
+ changeOuterValue (key, value) {
213
+ this[key] = value
214
+ },
215
+ // 根据类型刷新组件
216
+ refresh (type) {
217
+ switch (type) {
218
+ case 'Organization':
219
+ this.refreshOrganization()
220
+ return
221
+ case 'eventEditor':
222
+ this.$refs.rightPanel.refresh()
223
+ }
224
+ },
225
+ // 添加页面容器
226
+ addPageContainer () {
227
+ this.$refs.allModal.changeModalVisible('addPage')
228
+ },
229
+ // 架构重命名
230
+ rename (id, newName) {
231
+ const target = lowcodeUtils.getConfig(id, this.config)
232
+ if (target.type === 'page') {
233
+ target.title = newName
234
+ } else {
235
+ target.name = newName
236
+ }
237
+ this.refreshOrganization()
238
+ },
239
+ // 架构树新增
240
+ handleTreeAdd (id, type) {
241
+ // 如果目标是行,则添加容器
242
+ if (type === 'container') {
243
+ // 获取行对象
244
+ const rowConfig = lowcodeUtils.getPageIdAndRowIndexByRowId(id)
245
+ const row = lowcodeUtils.getRowByRowId(rowConfig.pageId, rowConfig.rowIndex, this.config)
246
+ // 如果是空行,直接添加容器
247
+ if (row.body.length === 0) {
248
+ row.body.push(lowcodeUtils.newContainer())
249
+ } else {
250
+ // 如果不是空行,将最后一个元素的span平分给新的容器
251
+ const lastSpan = row.body[row.body.length - 1].span
252
+ const firstSpan = Math.round(lastSpan / 2)
253
+ const newSpan = lastSpan - firstSpan
254
+ row.body[row.body.length - 1].span = firstSpan
255
+ row.body.push(lowcodeUtils.newContainer(newSpan))
256
+ }
257
+ } else {
258
+ // 如果不是行,则添加行
259
+ const page = lowcodeUtils.getPageConfigById(id, this.config)
260
+ page.body.push(
261
+ {
262
+ id: page.id + '_' + page.body.length,
263
+ config: {
264
+ align: 'top',
265
+ gutter: 0,
266
+ justify: 'start'
267
+ },
268
+ type: 'row',
269
+ body: [
270
+ lowcodeUtils.newContainer()
271
+ ]
272
+ }
273
+ )
274
+ }
275
+ this.refreshOrganization()
276
+ },
277
+ // 为架构树过滤配置,只显示当前激活的页面配置
278
+ filterOrganizationConfig () {
279
+ const result = { page: [] }
280
+ this.config.page.forEach(page => {
281
+ if (page.id === this.activeMainPage) {
282
+ result.page.push(page)
283
+ }
284
+ })
285
+ return result
286
+ },
287
+ // 处理拆分
288
+ handleSplit (id, isVertical) {
289
+ // 获取目标对象,目标行和对象在行中的Index
290
+ const target = lowcodeUtils.getComponentConfig(id, this.config)
291
+ const row = lowcodeUtils.getRowConfigByComponentId(id, this.config)
292
+ let index
293
+ for (let i = 0; i < row.body.length; i++) {
294
+ if (row.body[i].id === id) {
295
+ index = i
296
+ break
297
+ }
298
+ }
299
+ // 将目标对象缓存
300
+ const cache = JSON.parse(JSON.stringify(target))
301
+ // 是否为垂直拆分
302
+ if (isVertical) {
303
+ const newPageId = 'container_page_' + lowcodeUtils.nanoidWithoutSymbol(2)
304
+ // 垂直拆分,嵌套page容器
305
+ const temp = {
306
+ type: 'container_page',
307
+ span: cache.span,
308
+ id: 'container_' + lowcodeUtils.nanoidWithoutSymbol(6),
309
+ page: [
310
+ {
311
+ id: newPageId,
312
+ type: 'page',
313
+ body: [
314
+ {
315
+ id: newPageId + '_0',
316
+ type: 'row',
317
+ config: {
318
+ align: 'top',
319
+ gutter: 0,
320
+ justify: 'start'
321
+ },
322
+ body: []
323
+ }
324
+ ]
325
+ }
326
+ ]
327
+ }
328
+ cache.span = 24
329
+ // 第一行放缓存的原始对象
330
+ temp.page[0].body[0].body.push(cache)
331
+ // 第二行新增容器
332
+ temp.page[0].body[1] = {
333
+ id: newPageId + '_1',
334
+ type: 'row',
335
+ config: {
336
+ align: 'top',
337
+ gutter: 0,
338
+ justify: 'start'
339
+ },
340
+ body: []
341
+ }
342
+ temp.page[0].body[1].body.push(lowcodeUtils.newContainer())
343
+ row.body.splice(index, 1, temp)
344
+ } else {
345
+ // 如果是水平拆分
346
+ // 将原先对象span一分为二,添加容器
347
+ const outerSpan = cache.span
348
+ const firstSpan = Math.round(outerSpan / 2)
349
+ const secondSpan = outerSpan - firstSpan
350
+ cache.span = firstSpan
351
+ row.body.splice(index, 1, cache, lowcodeUtils.newContainer(secondSpan))
352
+ }
353
+ this.refreshOrganization()
354
+ },
355
+ // 复制粘贴组件
356
+ handlePasteItem (id, copyCache, type) {
357
+ const target = lowcodeUtils.getConfig(id, this.config)
358
+ // 页面中插入行
359
+ if (type === 'page-row') {
360
+ const content = copyCache.content
361
+ const pageId = target.id
362
+ content.id = pageId + '_' + target.body.length
363
+ target.body.push(content)
364
+ } else if (type === 'row-item') {
365
+ // 行中插入组件
366
+ target.body.push(copyCache.content)
367
+ } else if (type === 'page') {
368
+ // 复制页面
369
+ this.config.page.push(copyCache)
370
+ this.$message.success('复制成功!')
371
+ }
372
+ this.refreshOrganization()
373
+ },
374
+ // 点击架构树
375
+ treeOrganizationClick (id) {
376
+ // 如果是反选
377
+ if (id === null) {
378
+ // 清除编辑框
379
+ this.editorPropertiesConfig = {}
380
+ this.$store.commit('setTargetContainer', undefined)
381
+ // 清除容器select
382
+ lowcodeUtils.unCheckAll(this.config)
383
+ return
384
+ }
385
+ let target
386
+ if (id.includes('container_page')) {
387
+ // 长度大于17证明是容器页面的行
388
+ if (id.length > 17) {
389
+ const rowConfig = lowcodeUtils.getPageIdAndRowIndexByRowId(id)
390
+ target = lowcodeUtils.getRowByRowId(rowConfig.pageId, rowConfig.rowIndex, this.config)
391
+ } else {
392
+ target = lowcodeUtils.getContainerPageOuterByContainerPageId(id, this.config)
393
+ }
394
+ } else {
395
+ // 包含page表示选中的是某一行
396
+ if (id.includes('page')) {
397
+ const rowConfig = lowcodeUtils.getPageIdAndRowIndexByRowId(id)
398
+ target = lowcodeUtils.getRowByRowId(rowConfig.pageId, rowConfig.rowIndex, this.config)
399
+ } else {
400
+ target = lowcodeUtils.getComponentConfig(id, this.config)
401
+ }
402
+ }
403
+ // 将组件选中
404
+ this.clickComponentInEditor(target)
405
+ if (!id.includes('container') && !(id.includes('page') && id.length > 11)) {
406
+ this.twink(id)
407
+ }
408
+ },
409
+ // 架构树拖拽事件
410
+ handleTreeDrag (dragKey, dropKey, dragLevel, dropLevel, dropPosition, dragType) {
411
+ // 只有三种情况可以拖拽
412
+ // 1.平级挪
413
+ // 2.高一级插
414
+ // 3.行插子页面
415
+ let dragEle, rowConfig, father, cache, deleteIndex
416
+
417
+ // 复制移动组件,并将其从原位删除
418
+ switch (dragLevel.type) {
419
+ case 'row':
420
+ rowConfig = lowcodeUtils.getPageIdAndRowIndexByRowId(dragKey)
421
+ father = lowcodeUtils.getPageConfigById(rowConfig.pageId, this.config)
422
+ dragEle = father.body[rowConfig.rowIndex]
423
+ // 复制原始
424
+ cache = JSON.parse(JSON.stringify(dragEle))
425
+ // 删除原始
426
+ deleteIndex = rowConfig.rowIndex
427
+ father.body.splice(deleteIndex, 1, { placeHold: true })
428
+ break
429
+ case 'item':
430
+ father = lowcodeUtils.getRowConfigByComponentId(dragKey, this.config).body
431
+ dragEle = lowcodeUtils.getComponentConfig(dragKey, this.config)
432
+ // 复制原始
433
+ cache = JSON.parse(JSON.stringify(dragEle))
434
+ // 删除原始
435
+ for (let i = 0; i < father.length; i++) {
436
+ const item = father[i]
437
+ if (item.id === dragKey) {
438
+ deleteIndex = i
439
+ break
440
+ }
441
+ }
442
+ father.splice(deleteIndex, 1, { placeHold: true })
443
+ break
444
+ case 'container_page':
445
+ father = lowcodeUtils.getContainerPageRow(dragKey, this.config).body
446
+ dragEle = lowcodeUtils.getContainerPageOuterByContainerPageId(dragKey, this.config)
447
+ // 复制原始
448
+ cache = JSON.parse(JSON.stringify(dragEle))
449
+ // 删除原始
450
+ for (let i = 0; i < father.length; i++) {
451
+ const item = father[i]
452
+ if (item.type === 'container_page' && item.page[0].id === dragKey) {
453
+ deleteIndex = i
454
+ break
455
+ }
456
+ }
457
+ father.splice(deleteIndex, 1, { placeHold: true })
458
+ break
459
+ }
460
+
461
+ let target, dropConfig, targetCache, targetIndex
462
+ switch (dragType) {
463
+ case 'move':
464
+ // 1. 平级挪
465
+ switch (dragLevel.type) {
466
+ case 'row':
467
+ // 移动行
468
+ // 拿到父容器和目标Index
469
+ dropConfig = lowcodeUtils.getPageIdAndRowIndexByRowId(dropKey)
470
+ target = lowcodeUtils.getPageConfigById(dropConfig.pageId, this.config)
471
+ // 保存目标
472
+ targetCache = target.body[dropConfig.rowIndex]
473
+ // 插入
474
+ if (dropPosition < 0) {
475
+ target.body.splice(dropConfig.rowIndex, 1, cache, targetCache)
476
+ } else {
477
+ target.body.splice(dropConfig.rowIndex, 1, targetCache, cache)
478
+ }
479
+ // 清理占位
480
+ for (let i = 0; i < father.body.length; i++) {
481
+ const item = father.body[i]
482
+ if (item.placeHold) {
483
+ father.body.splice(i, 1)
484
+ break
485
+ }
486
+ }
487
+ break
488
+ case 'item':
489
+ // 移动组件
490
+ // 拿到父容器和目标Index
491
+ if (dropLevel.type === 'container_page') {
492
+ target = lowcodeUtils.getContainerPageRow(dropKey, this.config)
493
+ for (let i = 0; i < target.body.length; i++) {
494
+ const item = target.body[i]
495
+ if (item.type === 'container_page' && item.page[0].id === dropKey) {
496
+ targetIndex = i
497
+ break
498
+ }
499
+ }
500
+ } else {
501
+ target = lowcodeUtils.getRowByComponentId(dropKey, this.config)
502
+ for (let i = 0; i < target.body.length; i++) {
503
+ const item = target.body[i]
504
+ if (item.id === dropKey) {
505
+ targetIndex = i
506
+ break
507
+ }
508
+ }
509
+ }
510
+ // 保存目标
511
+ targetCache = target.body[targetIndex]
512
+ // 插入
513
+ if (dropPosition < 0) {
514
+ target.body.splice(targetIndex, 1, cache, targetCache)
515
+ } else {
516
+ target.body.splice(targetIndex, 1, targetCache, cache)
517
+ }
518
+ // 清理占位
519
+ for (let i = 0; i < father.length; i++) {
520
+ const item = father[i]
521
+ if (item.placeHold) {
522
+ father.splice(i, 1)
523
+ break
524
+ }
525
+ }
526
+ if (father.length === 0) {
527
+ father.push(lowcodeUtils.newContainer())
528
+ }
529
+ break
530
+ case 'container_page':
531
+ // 移动容器页面
532
+ // 拿到父容器和目标Index
533
+ if (dropLevel.type === 'container_page') {
534
+ target = lowcodeUtils.getContainerPageRow(dropKey, this.config)
535
+ for (let i = 0; i < target.body.length; i++) {
536
+ const item = target.body[i]
537
+ if (item.type === 'container_page' && item.page[0].id === dropKey) {
538
+ targetIndex = i
539
+ break
540
+ }
541
+ }
542
+ } else {
543
+ target = lowcodeUtils.getRowByComponentId(dropKey, this.config)
544
+ for (let i = 0; i < target.body.length; i++) {
545
+ const item = target.body[i]
546
+ if (item.id === dropKey) {
547
+ targetIndex = i
548
+ break
549
+ }
550
+ }
551
+ }
552
+ // 保存目标
553
+ targetCache = target.body[targetIndex]
554
+ // 插入
555
+ if (dropPosition < 0) {
556
+ target.body.splice(targetIndex, 1, cache, targetCache)
557
+ } else {
558
+ target.body.splice(targetIndex, 1, targetCache, cache)
559
+ }
560
+ // 清理占位
561
+ for (let i = 0; i < father.length; i++) {
562
+ const item = father[i]
563
+ if (item.placeHold) {
564
+ father.splice(i, 1)
565
+ break
566
+ }
567
+ }
568
+ if (father.length === 0) {
569
+ father.push(lowcodeUtils.newContainer())
570
+ }
571
+ }
572
+ break
573
+ case 'higher':
574
+ // 2.高一级插
575
+ switch (dragLevel.type) {
576
+ case 'row':
577
+ // 行插页
578
+ target = lowcodeUtils.getPageConfigById(dropKey, this.config)
579
+ target.body.push(cache)
580
+ for (let i = 0; i < father.body.length; i++) {
581
+ const item = father.body[i]
582
+ if (item.placeHold) {
583
+ father.body.splice(i, 1)
584
+ break
585
+ }
586
+ }
587
+ break
588
+ case 'item':
589
+ // 组件插行
590
+ rowConfig = lowcodeUtils.getPageIdAndRowIndexByRowId(dropKey)
591
+ target = lowcodeUtils.getRowByRowId(rowConfig.pageId, rowConfig.rowIndex, this.config)
592
+ target.body.push(cache)
593
+ for (let i = 0; i < father.length; i++) {
594
+ if (father[i].placeHold) {
595
+ father.splice(i, 1)
596
+ break
597
+ }
598
+ }
599
+ if (father.length === 0) {
600
+ father.push(lowcodeUtils.newContainer())
601
+ }
602
+ break
603
+ case 'container_page':
604
+ // 子页面插行
605
+ rowConfig = lowcodeUtils.getPageIdAndRowIndexByRowId(dropKey)
606
+ target = lowcodeUtils.getRowByRowId(rowConfig.pageId, rowConfig.rowIndex, this.config)
607
+ target.body.push(cache)
608
+ for (let i = 0; i < father.length; i++) {
609
+ if (father[i].placeHold) {
610
+ father.splice(i, 1)
611
+ break
612
+ }
613
+ }
614
+ if (father.length === 0) {
615
+ father.push(lowcodeUtils.newContainer())
616
+ }
617
+ break
618
+ }
619
+ break
620
+ case 'rowToContainer':
621
+ // 3.行插子页面
622
+ target = lowcodeUtils.getContainerPageOuterByContainerPageId(dropKey, this.config)
623
+ target.page[0].body.push(cache)
624
+ for (let i = 0; i < father.body.length; i++) {
625
+ const item = father.body[i]
626
+ if (item.placeHold) {
627
+ father.body.splice(i, 1)
628
+ break
629
+ }
630
+ }
631
+ break
632
+ case 'switch':
633
+ switch (dragLevel.type) {
634
+ case 'row':
635
+ // 拿到父容器和目标Index
636
+ dropConfig = lowcodeUtils.getPageIdAndRowIndexByRowId(dropKey)
637
+ target = lowcodeUtils.getPageConfigById(dropConfig.pageId, this.config)
638
+ // 保存目标
639
+ targetCache = target.body[dropConfig.rowIndex]
640
+ // 替换目标
641
+ target.body.splice(dropConfig.rowIndex, 1, cache)
642
+ // 将目标替换到原始
643
+ for (let i = 0; i < father.body.length; i++) {
644
+ const item = father.body[i]
645
+ if (item.placeHold) {
646
+ father.body.splice(i, 1, targetCache)
647
+ break
648
+ }
649
+ }
650
+ break
651
+ case 'item':
652
+ // 拿到父容器和目标Index
653
+ if (dropLevel.type === 'container_page') {
654
+ target = lowcodeUtils.getContainerPageRow(dropKey, this.config)
655
+ for (let i = 0; i < target.body.length; i++) {
656
+ const item = target.body[i]
657
+ if (item.type === 'container_page' && item.page[0].id === dropKey) {
658
+ targetIndex = i
659
+ break
660
+ }
661
+ }
662
+ } else {
663
+ target = lowcodeUtils.getRowByComponentId(dropKey, this.config)
664
+ for (let i = 0; i < target.body.length; i++) {
665
+ const item = target.body[i]
666
+ if (item.id === dropKey) {
667
+ targetIndex = i
668
+ break
669
+ }
670
+ }
671
+ }
672
+ // 保存目标
673
+ targetCache = target.body[targetIndex]
674
+ // 替换目标
675
+ target.body.splice(targetIndex, 1, cache)
676
+ // 将目标替换到原始
677
+ for (let i = 0; i < father.length; i++) {
678
+ const item = father[i]
679
+ if (item.placeHold) {
680
+ father.splice(i, 1, targetCache)
681
+ break
682
+ }
683
+ }
684
+ break
685
+ case 'container_page':
686
+ // 移动容器页面
687
+ // 拿到父容器和目标Index
688
+ if (dropLevel.type === 'container_page') {
689
+ target = lowcodeUtils.getContainerPageRow(dropKey, this.config)
690
+ for (let i = 0; i < target.body.length; i++) {
691
+ const item = target.body[i]
692
+ if (item.type === 'container_page' && item.page[0].id === dropKey) {
693
+ targetIndex = i
694
+ break
695
+ }
696
+ }
697
+ } else {
698
+ target = lowcodeUtils.getRowByComponentId(dropKey, this.config)
699
+ for (let i = 0; i < target.body.length; i++) {
700
+ const item = target.body[i]
701
+ if (item.id === dropKey) {
702
+ targetIndex = i
703
+ break
704
+ }
705
+ }
706
+ }
707
+ // 保存目标
708
+ targetCache = target.body[targetIndex]
709
+ // 替换目标
710
+ target.body.splice(targetIndex, 1, cache)
711
+ // 将目标替换到原始
712
+ for (let i = 0; i < father.length; i++) {
713
+ const item = father[i]
714
+ if (item.placeHold) {
715
+ father.splice(i, 1, targetCache)
716
+ break
717
+ }
718
+ }
719
+ break
720
+ }
721
+ }
722
+
723
+ this.refreshOrganization()
724
+ },
725
+ // 主页面标签切换
726
+ handleMainPageMenuChange (value) {
727
+ // 如果和之前选择的不一样
728
+ if (value.key !== this.activeMainPage) {
729
+ // 清空属性编辑
730
+ this.editorPropertiesConfig = {}
731
+ this.$store.commit('setTargetContainer', undefined)
732
+ // 切换菜单
733
+ this.activeMainPage = value.key
734
+ for (let i = 0; i < this.config.page.length; i++) {
735
+ if (this.config.page[i].id === this.activeMainPage) {
736
+ this.activeMainPageType = this.config.page[i].type
737
+ this.refreshOrganization()
738
+ return
739
+ }
740
+ }
741
+ }
742
+ },
743
+ // 将页面标签类型渲染为对应的文字
744
+ determinePageType (type) {
745
+ return lowcodeUtils.resolvePageType(type)
746
+ },
747
+ // 刷新架构
748
+ refreshOrganization () {
749
+ this.showPageOrganization = false
750
+ this.$nextTick(() => {
751
+ this.showPageOrganization = true
752
+ })
753
+ },
754
+ // 拖拽完成后,将新的span赋值
755
+ handleDrag (targetEle, nextEle) {
756
+ const target = lowcodeUtils.getComponentConfig(targetEle.id, this.config.page)
757
+ const targetNext = lowcodeUtils.getComponentConfig(nextEle.id, this.config.page)
758
+ target.span = targetEle.span
759
+ targetNext.span = nextEle.span
760
+ },
761
+ // 删除组件
762
+ deleteComponentInTree (id, type) {
763
+ if (type === 'page') {
764
+ const page = lowcodeUtils.getPageConfigById(id, this.config)
765
+ this.deletePage(page)
766
+ } else if (type === 'component') {
767
+ this.deleteComponent(id)
768
+ } else if (type === 'row') {
769
+ this.deleteRow(id)
770
+ } else if (type === 'container_page') {
771
+ this.deleteContainerPage(id)
772
+ }
773
+ },
774
+ // 删除容器页面
775
+ deleteContainerPage (id) {
776
+ const target = lowcodeUtils.getContainerPageOuterByContainerPageId(id, this.config)
777
+ target.type = 'container'
778
+ delete target.page
779
+ this.$store.commit('setTargetContainer', undefined)
780
+ this.editorPropertiesConfig = {}
781
+ this.refreshOrganization()
782
+ },
783
+ // 删除行
784
+ deleteRow (id) {
785
+ const pageId = id.substring(0, id.length - 2)
786
+ const rowId = id.substring(id.length - 1)
787
+ const page = lowcodeUtils.getPageConfigById(pageId, this.config)
788
+ page.body.splice(rowId, 1)
789
+ // 如果该列下没有任何内容,则将该列还原为容器
790
+ if (page.body.length === 0) {
791
+ const outerContainer = lowcodeUtils.getContainerPageOuterByContainerPageId(page.id, this.config)
792
+ outerContainer.type = 'container'
793
+ outerContainer.selected = false
794
+ delete outerContainer.page
795
+ }
796
+ this.$store.commit('setTargetContainer', undefined)
797
+ this.editorPropertiesConfig = {}
798
+ this.refreshOrganization()
799
+ },
800
+ // 删除页面容器
801
+ deletePage (page) {
802
+ // 清空页面下所有组件的注册信息
803
+ page.body.forEach(row => {
804
+ row.body.forEach(item => {
805
+ if (item.type === 'container_page') {
806
+ // 如果是容器页面,递归
807
+ this.deletePage(item.page)
808
+ } else {
809
+ delete this.$children[0]._provided.componentsMap[item.id]
810
+ }
811
+ })
812
+ })
813
+ for (let i = 0; i < this.config.page.length; i++) {
814
+ if (this.config.page[i].id === page.id) {
815
+ this.config.page.splice(i, 1)
816
+ this.$store.commit('setTargetContainer', undefined)
817
+ this.editorPropertiesConfig = {}
818
+ this.refreshOrganization()
819
+ return
820
+ }
821
+ }
822
+ },
823
+ // 删除组件
824
+ deleteComponent (id, addOnSpan = true) {
825
+ const row = lowcodeUtils.getRowConfigByComponentId(id, this.config)
826
+ const target = lowcodeUtils.getComponentConfig(id, this.config)
827
+ const deletedSpan = target.span
828
+ let index
829
+ for (let i = 0; i < row.body.length; i++) {
830
+ if (target.id === row.body[i].id) {
831
+ index = i
832
+ break
833
+ }
834
+ }
835
+ row.body.splice(index, 1)
836
+ if (addOnSpan) {
837
+ // 如果该组件之前还有组件,将该组件的span加给之前的组件
838
+ if (index !== 0) {
839
+ row.body[index - 1].span += deletedSpan
840
+ } else if (row.body.length > 0) {
841
+ row.body[0].span += deletedSpan
842
+ }
843
+ if (row.body[index - 1].span > 24) {
844
+ row.body[index - 1].span = 24
845
+ }
846
+ }
847
+ if (row.body.length === 0) {
848
+ row.body.push(lowcodeUtils.newContainer())
849
+ }
850
+ // 从注册的全局Map中删除
851
+ delete this.$children[0]._provided.componentsMap[id]
852
+ this.$store.commit('setTargetContainer', undefined)
853
+ this.editorPropertiesConfig = {}
854
+ this.refreshOrganization()
855
+ },
856
+ // 容器删除
857
+ handleContainerDelete (id) {
858
+ let index
859
+ const row = lowcodeUtils.getRowConfigByComponentId(id, this.config)
860
+ for (let i = 0; i < row.body.length; i++) {
861
+ const item = row.body[i]
862
+ if (item.id === id) {
863
+ index = i
864
+ break
865
+ }
866
+ }
867
+ row.body.splice(index, 1)
868
+ this.$store.commit('setTargetContainer', undefined)
869
+ // 如果删除后只剩一个容器,将该容器span设置为24
870
+ if (row.body.length === 1) {
871
+ row.body[0].span = 24
872
+ } else if (row.body.length === 0) {
873
+ row.body.push(lowcodeUtils.newContainer())
874
+ }
875
+ this.refreshOrganization()
876
+ },
877
+ // 切换预览模式
878
+ previewModeActive () {
879
+ this.preview = true
880
+ },
881
+ // 切换编辑模式
882
+ editModeActive () {
883
+ this.preview = false
884
+ },
885
+ // 选中某个组件
886
+ clickComponentInEditor (configItem) {
887
+ this.disableEventEditor = false
888
+ if (!configItem) {
889
+ return
890
+ }
891
+ // 同步选中架构
892
+ // 将选中的节点清空,在$nextTick再赋值,保证组件能watch到改变
893
+ this.selectTreeNode = undefined
894
+ if (configItem.type === 'container_page') {
895
+ this.$nextTick(() => {
896
+ this.selectTreeNode = 'container_page_' + configItem.page[0].id
897
+ })
898
+ } else if (configItem.type === 'row' || !configItem.type) {
899
+ const rowConfig = lowcodeUtils.getPageIdAndRowIndexByRowId(configItem.id)
900
+ rowConfig.rowIndex++
901
+ this.$nextTick(() => {
902
+ this.selectTreeNode = 'row_' + rowConfig.pageId + '_' + rowConfig.rowIndex
903
+ })
904
+ } else {
905
+ this.$nextTick(() => {
906
+ this.selectTreeNode = configItem.id
907
+ })
908
+ lowcodeUtils.unCheckAll(this.config)
909
+ }
910
+ this.editorPropertiesConfig = {}
911
+ // 如果选中的是容器
912
+ if (configItem.type === 'container') {
913
+ // 将所有已选中组件取消选择
914
+ lowcodeUtils.unCheckAll(this.config)
915
+ // 将目标设置为选定
916
+ configItem.selected = true
917
+ this.$store.commit('setTargetContainer', configItem)
918
+ this.editorPropertiesConfig = configItem
919
+ this.disableEventEditor = true
920
+ this.editorPropertiesConfig.props = {}
921
+ return
922
+ }
923
+ // 如果选中的是容器页面
924
+ if (configItem.type === 'container_page') {
925
+ // 选中容器页面中所有组件
926
+ lowcodeUtils.unCheckAll(this.config)
927
+ configItem.page.forEach(page => {
928
+ page.body.forEach(row => {
929
+ lowcodeUtils.checkRowAll(row)
930
+ })
931
+ })
932
+ this.editorPropertiesConfig = configItem
933
+ this.disableEventEditor = true
934
+ this.editorPropertiesConfig.props = {}
935
+ return
936
+ }
937
+
938
+ // 如果选中的是行
939
+ if (configItem.type === 'row' || !configItem.type) {
940
+ lowcodeUtils.checkRowAll(configItem, this.config)
941
+ this.editorPropertiesConfig = configItem
942
+ this.disableEventEditor = true
943
+ this.editorPropertiesConfig.props = {}
944
+ return
945
+ }
946
+
947
+ if (configItem.type === 'tabs') {
948
+ console.warn('tabs', configItem)
949
+ this.editorPropertiesConfig = configItem
950
+ this.disableEventEditor = true
951
+ this.editorPropertiesConfig.props = {}
952
+ return
953
+ }
954
+ // 如果是组件对象
955
+ // 拿注册的配置
956
+ const configInJson = lowcodeUtils.getEditorConfigByType(configItem.type)
957
+ if (configInJson) {
958
+ this.editorPropertiesConfig = configItem
959
+ // 为编辑器变量初始化
960
+ if (configInJson.properties) {
961
+ if (!this.editorPropertiesConfig.props) {
962
+ this.editorPropertiesConfig.props = {}
963
+ }
964
+ const editableKeys = Object.keys(configInJson.properties)
965
+ editableKeys.forEach(editableKey => {
966
+ // 如果该值并不存在,则初始化
967
+ if (!this.editorPropertiesConfig.props[editableKey]) {
968
+ this.editorPropertiesConfig.props[editableKey] = ''
969
+ } else {
970
+ if (typeof this.editorPropertiesConfig.props[editableKey] === 'object') {
971
+ this.editorPropertiesConfig.props[editableKey] = JSON.stringify(this.editorPropertiesConfig.props[editableKey])
972
+ }
973
+ }
974
+ })
975
+ }
976
+ // 为编辑器事件初始化
977
+ if (configInJson.selfEvent) {
978
+ if (!this.editorPropertiesConfig.selfEvent) {
979
+ this.editorPropertiesConfig.selfEvent = []
980
+ configInJson.selfEvent.forEach(everyEvent => {
981
+ this.editorPropertiesConfig.selfEvent.push(everyEvent)
982
+ })
983
+ }
984
+ }
985
+ } else {
986
+ this.editorPropertiesConfig = 'unregistered'
987
+ }
988
+ },
989
+ // 架构树点击某个节点后,在渲染器中,让组件闪烁
990
+ twink (id) {
991
+ const allRefs = Object.keys(this.$refs)
992
+ allRefs.forEach(ref => {
993
+ if (this.$refs[ref].twink) {
994
+ this.$refs[ref].twink(id)
995
+ }
996
+ })
997
+ },
998
+ // 点击测试按钮
999
+ test () {
1000
+ // 输出当前配置,和组件注册Map
1001
+ console.warn('config', this.config)
1002
+ console.warn('map', this.$children[0]._provided.componentsMap)
1003
+ },
1004
+ // 点击导出按钮
1005
+ exportConfig () {
1006
+ console.warn('导出', this.config)
1007
+ this.$emit('exportConfig', this.config)
1008
+ }
1009
+ },
1010
+ mounted () {
1011
+ // 将mixin中已经实现的通用响应方法添加
1012
+ this.supportedEventType = [...lowcodeComponentMixin.supportedEventType]
1013
+ let cache = {}
1014
+ if (!this.originalConfig.config) {
1015
+ cache = { page: [] }
1016
+ } else {
1017
+ cache = JSON.parse(JSON.stringify(this.originalConfig.config))
1018
+ }
1019
+ // 深拷贝外侧传来的配置
1020
+ this.$store.commit('setConfig', cache)
1021
+ const tempConfig = {
1022
+ page: [
1023
+ {
1024
+ id: 'page_deowoe',
1025
+ type: 'page',
1026
+ title: '1',
1027
+ body: [
1028
+ {
1029
+ id: 'page_deowoe_0',
1030
+ config: {
1031
+ align: 'top',
1032
+ gutter: 0,
1033
+ justify: 'start'
1034
+ },
1035
+ type: 'row',
1036
+ body: [
1037
+ {
1038
+ type: 'XFormTable',
1039
+ selected: false,
1040
+ span: 24,
1041
+ id: 'XFormTable_cWmejz',
1042
+ props: {
1043
+ queryParamsName: 'crud_dictionary_manage',
1044
+ serviceName: 'af-system'
1045
+ },
1046
+ selfEvent: [
1047
+ 'action'
1048
+ ],
1049
+ onEvent: {
1050
+ action: [
1051
+ {
1052
+ emitType: 'action',
1053
+ eventType: 'changeProps',
1054
+ target: 'XDescriptions_nE5IcB',
1055
+ targetKey: 'content'
1056
+ },
1057
+ {
1058
+ emitType: 'action',
1059
+ eventType: 'showDraw',
1060
+ visible: 'open',
1061
+ containerId: 'page_e12Xon'
1062
+ }
1063
+ ]
1064
+ }
1065
+ }
1066
+ ]
1067
+ }
1068
+ ]
1069
+ },
1070
+ {
1071
+ id: 'page_e12Xon',
1072
+ type: 'draw',
1073
+ title: '2',
1074
+ width: '70%',
1075
+ body: [
1076
+ {
1077
+ id: 'page_e12Xon_0',
1078
+ config: {
1079
+ align: 'top',
1080
+ gutter: 0,
1081
+ justify: 'start'
1082
+ },
1083
+ type: 'row',
1084
+ body: [
1085
+ {
1086
+ type: 'XDescriptions',
1087
+ selected: false,
1088
+ span: 24,
1089
+ id: 'XDescriptions_nE5IcB',
1090
+ props: {
1091
+ title: '详情',
1092
+ content: {
1093
+ d_id: 111,
1094
+ d_f_remark: '-',
1095
+ d_f_name: '设备区域',
1096
+ d_f_key: '设备区域',
1097
+ d_f_input_date: '2023-03-20 13:40:54'
1098
+ },
1099
+ configName: 'test_lowCode_descriptionConfig',
1100
+ serviceName: 'af-system',
1101
+ getRealData: false
1102
+ },
1103
+ selfEvent: []
1104
+ }
1105
+ ]
1106
+ },
1107
+ {
1108
+ id: 'page_e12Xon_1',
1109
+ config: {
1110
+ align: 'top',
1111
+ gutter: 0,
1112
+ justify: 'start'
1113
+ },
1114
+ type: 'row',
1115
+ body: [
1116
+ {
1117
+ type: 'tabs',
1118
+ span: 24,
1119
+ id: 'Tabs_TFg731',
1120
+ props: {},
1121
+ body: [
1122
+ {
1123
+ key: 'Tabs_TFg731_1',
1124
+ label: '1',
1125
+ type: 'tab',
1126
+ body: {
1127
+ type: 'container_page',
1128
+ span: 24,
1129
+ id: 'container_ZX1Ixz',
1130
+ page: [
1131
+ {
1132
+ id: 'container_page_ks',
1133
+ type: 'page',
1134
+ body: [
1135
+ {
1136
+ id: 'container_page_ks_0',
1137
+ type: 'row',
1138
+ config: {
1139
+ align: 'top',
1140
+ gutter: 0,
1141
+ justify: 'start'
1142
+ },
1143
+ body: [
1144
+ {
1145
+ type: 'container',
1146
+ selected: true,
1147
+ span: 24,
1148
+ id: 'container_UNOr8I',
1149
+ props: {}
1150
+ }
1151
+ ]
1152
+ }
1153
+ ]
1154
+ }
1155
+ ]
1156
+ }
1157
+ },
1158
+ {
1159
+ key: '1',
1160
+ label: '22',
1161
+ type: 'tab',
1162
+ body: {
1163
+ type: 'container_page',
1164
+ span: 24,
1165
+ id: 'container_ToXInv',
1166
+ page: [
1167
+ {
1168
+ id: 'container_page_U0',
1169
+ type: 'page',
1170
+ body: [
1171
+ {
1172
+ id: 'container_page_U0_0',
1173
+ type: 'row',
1174
+ config: {
1175
+ align: 'top',
1176
+ gutter: 0,
1177
+ justify: 'start'
1178
+ },
1179
+ body: [
1180
+ {
1181
+ type: 'container',
1182
+ selected: true,
1183
+ span: 24,
1184
+ id: 'container_sSWXao',
1185
+ props: {}
1186
+ }
1187
+ ]
1188
+ }
1189
+ ]
1190
+ }
1191
+ ]
1192
+ }
1193
+ }
1194
+ ],
1195
+ selected: false
1196
+ }
1197
+ ]
1198
+ }
1199
+ ]
1200
+ }
1201
+ ]
1202
+ }
1203
+ this.$store.commit('setConfig', tempConfig)
1204
+ this.refreshOrganization()
1205
+ },
1206
+ computed: {
1207
+ config () {
1208
+ return this.$store.state.lowCode.config
1209
+ },
1210
+ targetContainer () {
1211
+ return this.$store.state.lowCode.targetContainer
1212
+ }
1213
+ }
1214
+ }
1215
+ </script>
1216
+
1217
+ <style scoped lang="less">
1218
+
1219
+ </style>