vue2-client 1.10.13 → 1.10.15

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 (417) hide show
  1. package/.env +19 -19
  2. package/.env.gaslink +19 -19
  3. package/.env.his +19 -19
  4. package/.env.liuli +19 -19
  5. package/.env.revenue +19 -19
  6. package/.env.scada +19 -19
  7. package/.eslintrc.js +90 -90
  8. package/CHANGELOG.md +824 -824
  9. package/Components.md +60 -60
  10. package/babel.config.js +21 -21
  11. package/docs/Logic/345/207/275/346/225/260/344/275/277/347/224/250/347/233/270/345/205/263.md +45 -45
  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/docs//345/207/275/346/225/260/344/275/277/347/224/250/347/233/270/345/205/263.md +174 -174
  16. package/index.js +31 -31
  17. package/jest-transform-stub.js +8 -8
  18. package/jest.config.js +21 -21
  19. package/jest.setup.js +7 -7
  20. package/jsconfig.json +19 -19
  21. package/package.json +107 -107
  22. package/public/his/editor/editor.html +51 -51
  23. package/public/his/editor/mock/bind_data.html +779 -779
  24. package/public/his/editor/mock/data_table.html +40 -40
  25. package/public/his/editor/mock/sign.html +75 -75
  26. package/public/his/editor/vender/JsBarcode.all.js +3669 -3669
  27. package/public/his/editor/vender/date97/My97DatePicker.htm +65 -65
  28. package/public/his/editor/vender/date97/WdatePicker.js +677 -677
  29. package/public/his/editor/vender/date97/calendar.js +4 -4
  30. package/public/his/editor/vender/date97/lang/en.js +13 -13
  31. package/public/his/editor/vender/date97/lang/zh-cn.js +13 -13
  32. package/public/his/editor/vender/date97/lang/zh-tw.js +13 -13
  33. package/public/his/editor/vender/date97/skin/WdatePicker.css +10 -10
  34. package/public/his/editor/vender/date97/skin/default/datepicker.css +328 -328
  35. package/public/his/editor/vender/date97/skin/ext/datepicker.css +308 -308
  36. package/public/his/editor/vender/date97/skin/whyGreen/datepicker.css +255 -255
  37. package/public/his/editor/vender/diff.js +1627 -1627
  38. package/public/his/editor/vender/editor.js +1 -1
  39. package/public/his/editor/vender/fabric.js +31187 -31187
  40. package/public/his/editor/vender/jquery/jquery.base64.js +190 -190
  41. package/public/his/editor/vender/jquery/jquery.js +10872 -10872
  42. package/public/his/editor/vender/jquery/jquery.print.js +255 -255
  43. package/public/his/editor/vender/jquery/zTreeStyle/zTreeStyle.css +96 -96
  44. package/public/his/editor/vender/mui/mui.min.css +4 -4
  45. package/public/his/editor/vender/mui/mui.min.js +5 -5
  46. package/public/his/editor/vender/mui/mui.picker.min.css +6 -6
  47. package/public/his/editor/vender/mui/mui.picker.min.js +6 -6
  48. package/public/his/editor/vender/qrcode.js +7 -7
  49. package/public/his/editor/vender/requirejs/require.js +2145 -2145
  50. package/public/his/editor/vender/signature/jSignature.CompressorSVG.js +518 -518
  51. package/public/his/editor/vender/signature/jSignature.UndoButton.js +164 -164
  52. package/public/his/editor/vender/signature/jSignature.js +1486 -1486
  53. package/public/his/editor/vender/validator.js +5094 -5094
  54. package/public/his/editor/vender/weui/weui.css +5659 -5659
  55. package/public/his/editor/vender/weui/weui.min.css +4 -4
  56. package/public/his/editor/vender/weui/weui.min.js +11 -11
  57. package/src/App.vue +196 -196
  58. package/src/ReportView.js +19 -19
  59. package/src/assets/img/querySlotDemo.svg +15 -15
  60. package/src/assets/svg/badtwo.svg +1 -1
  61. package/src/assets/svg/goodtwo.svg +1 -1
  62. package/src/base-client/components/AI/AskAiBtn.vue +136 -136
  63. package/src/base-client/components/AI/demo.vue +31 -31
  64. package/src/base-client/components/common/AMisRender/index.js +3 -3
  65. package/src/base-client/components/common/AMisRender/index.vue +263 -263
  66. package/src/base-client/components/common/AddressSearchCombobox/AddressSearchCombobox.vue +470 -470
  67. package/src/base-client/components/common/AddressSearchCombobox/IcMapIcon.vue +16 -16
  68. package/src/base-client/components/common/AddressSearchCombobox/demo.vue +36 -36
  69. package/src/base-client/components/common/AddressSearchCombobox/ic_map.svg +6 -6
  70. package/src/base-client/components/common/AmapMarker/AmapPointRendering.vue +120 -120
  71. package/src/base-client/components/common/CitySelect/CitySelect.vue +342 -342
  72. package/src/base-client/components/common/CitySelect/index.js +3 -3
  73. package/src/base-client/components/common/CitySelect/index.md +109 -109
  74. package/src/base-client/components/common/CreateQuery/CreateQuery.vue +669 -669
  75. package/src/base-client/components/common/CreateQuery/CreateQueryItem.vue +1014 -1014
  76. package/src/base-client/components/common/CreateQuery/index.js +3 -3
  77. package/src/base-client/components/common/CreateQuery/index.md +42 -42
  78. package/src/base-client/components/common/CreateSimpleFormQuery/CreateSimpleFormQuery.vue +452 -452
  79. package/src/base-client/components/common/CreateSimpleFormQuery/CreateSimpleFormQueryItem.vue +511 -511
  80. package/src/base-client/components/common/CreateSimpleFormQuery/index.js +3 -3
  81. package/src/base-client/components/common/CreateSimpleFormQuery/index.md +42 -42
  82. package/src/base-client/components/common/FormGroupEdit/FormGroupEdit.vue +149 -149
  83. package/src/base-client/components/common/FormGroupEdit/index.js +3 -3
  84. package/src/base-client/components/common/FormGroupEdit/index.md +43 -43
  85. package/src/base-client/components/common/FormGroupQuery/FormGroupQuery.vue +166 -166
  86. package/src/base-client/components/common/FormGroupQuery/index.js +3 -3
  87. package/src/base-client/components/common/FormGroupQuery/index.md +43 -43
  88. package/src/base-client/components/common/JSONToTree/jsontotree.vue +271 -271
  89. package/src/base-client/components/common/LowCodeComponent/LowCodeEditorModal.vue +108 -108
  90. package/src/base-client/components/common/LowCodeComponent/LowCodeEditorPanel.vue +413 -413
  91. package/src/base-client/components/common/LowCodeComponent/LowCodePageOrganization.vue +502 -502
  92. package/src/base-client/components/common/LowCodeComponent/LowCodeRender.vue +728 -728
  93. package/src/base-client/components/common/LowCodeComponent/LowCodeRenderEnter.vue +29 -29
  94. package/src/base-client/components/common/LowCodeComponent/LowCodeUIStore.vue +219 -219
  95. package/src/base-client/components/common/LowCodeComponent/modal/lowCodeAddPageModal.vue +117 -117
  96. package/src/base-client/components/common/LowCodeComponent/modal/lowCodeCustomJSModal.vue +80 -80
  97. package/src/base-client/components/common/LowCodeComponent/modal/lowCodeEventEditorModal.vue +398 -398
  98. package/src/base-client/components/common/LowCodeComponent/modal/lowCodeLifeCycleModal.vue +65 -65
  99. package/src/base-client/components/common/LowCodeComponent/modal/lowCodeLogicCallbackModal.vue +64 -64
  100. package/src/base-client/components/common/LowCodeComponent/modal/lowCodeLogicParamModal.vue +73 -73
  101. package/src/base-client/components/common/LowCodeComponent/modal/lowCodeRunFunctionParamModal.vue +76 -76
  102. package/src/base-client/components/common/PersonSetting/PersonSetting.vue +208 -208
  103. package/src/base-client/components/common/PersonSetting/index.js +3 -3
  104. package/src/base-client/components/common/Recording/Recording.vue +243 -243
  105. package/src/base-client/components/common/Recording/index.js +3 -3
  106. package/src/base-client/components/common/Tree/Tree.vue +149 -149
  107. package/src/base-client/components/common/Tree/index.js +2 -2
  108. package/src/base-client/components/common/Upload/index.js +3 -3
  109. package/src/base-client/components/common/XAddForm/XAddForm.vue +113 -113
  110. package/src/base-client/components/common/XAddNativeForm/XAddNativeForm.vue +1113 -1113
  111. package/src/base-client/components/common/XAddNativeForm/index.md +146 -146
  112. package/src/base-client/components/common/XAddNativeFormOA/XAddNativeFormOA.vue +303 -303
  113. package/src/base-client/components/common/XAddNativeFormOA/index.js +3 -3
  114. package/src/base-client/components/common/XAddNativeFormOA/index.md +146 -146
  115. package/src/base-client/components/common/XAddReport/XAddReport.vue +207 -207
  116. package/src/base-client/components/common/XAddReport/index.js +3 -3
  117. package/src/base-client/components/common/XAddReport/index.md +56 -56
  118. package/src/base-client/components/common/XBadge/XBadge.vue +94 -94
  119. package/src/base-client/components/common/XButtons/XButtonDemo.vue +28 -28
  120. package/src/base-client/components/common/XButtons/XButtons.vue +71 -71
  121. package/src/base-client/components/common/XButtons/index.js +3 -3
  122. package/src/base-client/components/common/XButtons/index.md +61 -61
  123. package/src/base-client/components/common/XCard/XCard.vue +64 -64
  124. package/src/base-client/components/common/XCheckList/XCheckList.vue +106 -106
  125. package/src/base-client/components/common/XCheckList/XCheckListDemo.vue +41 -41
  126. package/src/base-client/components/common/XConversation/XConversation.vue +263 -263
  127. package/src/base-client/components/common/XConversation/XConversationDemo.vue +28 -28
  128. package/src/base-client/components/common/XDataCard/XDataCard.vue +411 -411
  129. package/src/base-client/components/common/XDataCard/index.js +3 -3
  130. package/src/base-client/components/common/XDataCard/index.md +1 -1
  131. package/src/base-client/components/common/XDataDrawer/XDataDrawer.vue +180 -180
  132. package/src/base-client/components/common/XDataDrawer/index.js +3 -3
  133. package/src/base-client/components/common/XDataDrawer/index.md +41 -41
  134. package/src/base-client/components/common/XDatePicker/demo.vue +153 -153
  135. package/src/base-client/components/common/XDatePicker/index.vue +259 -259
  136. package/src/base-client/components/common/XDescriptions/XDescriptions.vue +169 -169
  137. package/src/base-client/components/common/XDescriptions/XDescriptionsGroup.vue +304 -304
  138. package/src/base-client/components/common/XDescriptions/demo.vue +50 -50
  139. package/src/base-client/components/common/XDescriptions/index.js +3 -3
  140. package/src/base-client/components/common/XDescriptions/index.md +83 -83
  141. package/src/base-client/components/common/XDetailsView/XDetailsView.vue +238 -238
  142. package/src/base-client/components/common/XDetailsView/index.js +3 -3
  143. package/src/base-client/components/common/XForm/XForm.vue +393 -393
  144. package/src/base-client/components/common/XForm/XStatusButton.vue +54 -54
  145. package/src/base-client/components/common/XForm/XTreeSelect.vue +250 -250
  146. package/src/base-client/components/common/XForm/index.md +178 -178
  147. package/src/base-client/components/common/XForm/itemComponent/XClickChangeBtn/index.vue +49 -49
  148. package/src/base-client/components/common/XFormCol/XFormCol.vue +157 -157
  149. package/src/base-client/components/common/XFormGroup/XFormGroup.vue +304 -304
  150. package/src/base-client/components/common/XFormGroup/demo.vue +46 -46
  151. package/src/base-client/components/common/XFormGroup/index.js +3 -3
  152. package/src/base-client/components/common/XFormGroup/index.md +38 -38
  153. package/src/base-client/components/common/XFormGroupDetails/XFormGroupDetails.vue +72 -72
  154. package/src/base-client/components/common/XFormGroupDetails/index.js +3 -3
  155. package/src/base-client/components/common/XFormTable/XFormTable.vue +854 -854
  156. package/src/base-client/components/common/XFormTable/demo.vue +60 -60
  157. package/src/base-client/components/common/XFormTable/index.md +92 -92
  158. package/src/base-client/components/common/XImportExcel/XImportExcel.vue +167 -167
  159. package/src/base-client/components/common/XLabelSelect/XLabelSelect.vue +110 -110
  160. package/src/base-client/components/common/XLabelSelect/XLabelSelectDemo.vue +35 -35
  161. package/src/base-client/components/common/XLicensePlate/XLicensePlate.vue +193 -193
  162. package/src/base-client/components/common/XLicensePlate/XLicensePlateDemo.vue +48 -48
  163. package/src/base-client/components/common/XPrint/OpenInvoice.vue +21 -21
  164. package/src/base-client/components/common/XPrint/PrintBill.vue +302 -302
  165. package/src/base-client/components/common/XPrint/PrintHtml.js +98 -98
  166. package/src/base-client/components/common/XPrint/css/hiPrintCss.js +359 -359
  167. package/src/base-client/components/common/XPrint/css/lodopCss.js +26 -26
  168. package/src/base-client/components/common/XPrint/css/print-lock.css +351 -351
  169. package/src/base-client/components/common/XPrint/index.vue +97 -97
  170. package/src/base-client/components/common/XReport/XReport.vue +892 -892
  171. package/src/base-client/components/common/XReport/XReportDemo.vue +304 -304
  172. package/src/base-client/components/common/XReport/XReportDesign.vue +463 -463
  173. package/src/base-client/components/common/XReport/XReportJsonRender.vue +381 -381
  174. package/src/base-client/components/common/XReport/XReportTrGroup.vue +808 -808
  175. package/src/base-client/components/common/XReport/index.js +3 -3
  176. package/src/base-client/components/common/XReport/index.md +44 -44
  177. package/src/base-client/components/common/XReport/print.js +186 -186
  178. package/src/base-client/components/common/XReportDrawer/XReportDrawer.vue +201 -201
  179. package/src/base-client/components/common/XReportDrawer/index.js +3 -3
  180. package/src/base-client/components/common/XReportGrid/XReport.vue +1070 -1070
  181. package/src/base-client/components/common/XReportGrid/XReportDemo.vue +47 -47
  182. package/src/base-client/components/common/XReportGrid/XReportDesign.vue +628 -628
  183. package/src/base-client/components/common/XReportGrid/XReportJsonRender.vue +380 -380
  184. package/src/base-client/components/common/XReportGrid/XReportTrGroup.vue +1104 -1104
  185. package/src/base-client/components/common/XReportGrid/index.js +3 -3
  186. package/src/base-client/components/common/XReportGrid/index.md +44 -44
  187. package/src/base-client/components/common/XReportGrid/print.js +184 -184
  188. package/src/base-client/components/common/XReportSlot/XReportSlot.vue +110 -110
  189. package/src/base-client/components/common/XReportSlot/index.js +3 -3
  190. package/src/base-client/components/common/XReportSlot/index.md +48 -48
  191. package/src/base-client/components/common/XSimpleDescriptions/XSimpleDescriptions.vue +166 -166
  192. package/src/base-client/components/common/XSimpleDescriptions/index.js +3 -3
  193. package/src/base-client/components/common/XSimpleDescriptions/index.md +7 -7
  194. package/src/base-client/components/common/XStepView/XStepView.vue +252 -252
  195. package/src/base-client/components/common/XStepView/index.js +3 -3
  196. package/src/base-client/components/common/XStepView/index.md +31 -31
  197. package/src/base-client/components/common/XTab/XTab.vue +201 -201
  198. package/src/base-client/components/common/XTab/XTabDemo.vue +22 -22
  199. package/src/base-client/components/common/XTab/index.js +3 -3
  200. package/src/base-client/components/common/XTable/CustomFuncCel.vue +51 -51
  201. package/src/base-client/components/common/XTable/ExportExcel.vue +284 -284
  202. package/src/base-client/components/common/XTable/TableCellRenderer.vue +161 -161
  203. package/src/base-client/components/common/XTable/XTable.vue +1415 -1415
  204. package/src/base-client/components/common/XTable/index.md +255 -255
  205. package/src/base-client/components/common/XTagGroup/index.vue +52 -52
  206. package/src/base-client/components/common/XTree/XTree.vue +423 -423
  207. package/src/base-client/components/common/XTree/XTreePro.vue +451 -451
  208. package/src/base-client/components/common/XTree/index.js +3 -3
  209. package/src/base-client/components/common/XTree/index.md +36 -36
  210. package/src/base-client/components/common/XTreeOne/XTreeOne.vue +113 -113
  211. package/src/base-client/components/common/XTreeOne/XTreeOnePro.vue +128 -128
  212. package/src/base-client/components/common/richTextModal/index.vue +56 -56
  213. package/src/base-client/components/common/richTextModal/richDemo.vue +48 -48
  214. package/src/base-client/components/his/XHisEditor/XHisEditor.vue +359 -359
  215. package/src/base-client/components/his/XHisEditor/index.js +3 -3
  216. package/src/base-client/components/index.js +51 -51
  217. package/src/base-client/components/layout/XPageView/RenderRow.vue +63 -63
  218. package/src/base-client/components/layout/XPageView/XErrorView.vue +11 -11
  219. package/src/base-client/components/layout/XPageView/XPageView.vue +155 -155
  220. package/src/base-client/components/layout/XPageView/index.js +3 -3
  221. package/src/base-client/components/layout/XPageView/index.md +38 -38
  222. package/src/base-client/components/layout/XTreeView/XTreeView.vue +130 -130
  223. package/src/base-client/components/layout/XTreeView/index.js +3 -3
  224. package/src/base-client/components/layout/XTreeView/index.md +46 -46
  225. package/src/base-client/components/system/DictionaryDetailsView/DictionaryDetailsView.vue +232 -232
  226. package/src/base-client/components/system/QueryParamsDetailsView/QueryParamsDetailsView.vue +281 -281
  227. package/src/base-client/plugins/AppData.js +121 -121
  228. package/src/base-client/plugins/Config.js +19 -19
  229. package/src/base-client/plugins/GetLoginInfoService.js +183 -183
  230. package/src/base-client/plugins/Recording.js +258 -258
  231. package/src/base-client/plugins/index.js +23 -23
  232. package/src/base-client/plugins/tabs-page-plugin.js +39 -39
  233. package/src/bootstrap.js +42 -42
  234. package/src/components/Charts/Bar.vue +62 -62
  235. package/src/components/Charts/ChartCard.vue +134 -134
  236. package/src/components/Charts/Liquid.vue +67 -67
  237. package/src/components/Charts/MiniArea.vue +39 -39
  238. package/src/components/Charts/MiniBar.vue +39 -39
  239. package/src/components/Charts/MiniProgress.vue +75 -75
  240. package/src/components/Charts/MiniSmoothArea.vue +40 -40
  241. package/src/components/Charts/Radar.vue +68 -68
  242. package/src/components/Charts/RankList.vue +77 -77
  243. package/src/components/Charts/TagCloud.vue +113 -113
  244. package/src/components/Charts/TransferBar.vue +64 -64
  245. package/src/components/Charts/Trend.vue +82 -82
  246. package/src/components/Charts/chart.less +12 -12
  247. package/src/components/Charts/smooth.area.less +13 -13
  248. package/src/components/CodeMirror/inedx.vue +118 -118
  249. package/src/components/CodeMirror/setting.js +40 -40
  250. package/src/components/FilePreview/FilePreview.vue +166 -166
  251. package/src/components/HeightScanner/index.vue +24 -26
  252. package/src/components/NumberInfo/NumberInfo.vue +54 -54
  253. package/src/components/NumberInfo/index.js +3 -3
  254. package/src/components/NumberInfo/index.less +54 -54
  255. package/src/components/NumberInfo/index.md +43 -43
  256. package/src/components/STable/index.js +390 -390
  257. package/src/components/card/ChartCard.vue +79 -79
  258. package/src/components/chart/Bar.vue +60 -60
  259. package/src/components/chart/MiniArea.vue +67 -67
  260. package/src/components/chart/MiniBar.vue +59 -59
  261. package/src/components/chart/MiniProgress.vue +57 -57
  262. package/src/components/chart/Radar.vue +80 -80
  263. package/src/components/chart/RankingList.vue +60 -60
  264. package/src/components/chart/Trend.vue +79 -79
  265. package/src/components/chart/index.less +9 -9
  266. package/src/components/checkbox/ColorCheckbox.vue +157 -157
  267. package/src/components/checkbox/ImgCheckbox.vue +117 -117
  268. package/src/components/checkbox/ImgCheckboxGroup.vue +76 -76
  269. package/src/components/checkbox/index.js +9 -9
  270. package/src/components/exception/ExceptionPage.vue +70 -70
  271. package/src/components/g2Charts/constants.js +202 -202
  272. package/src/components/g2Charts/demo.vue +808 -808
  273. package/src/components/g2Charts/designer.vue +228 -228
  274. package/src/components/g2Charts/designerBaseConfig.vue +61 -61
  275. package/src/components/g2Charts/designerDataConfig.vue +259 -259
  276. package/src/components/g2Charts/designerStyleConfig.vue +16 -16
  277. package/src/components/g2Charts/index.vue +397 -397
  278. package/src/components/index.js +36 -36
  279. package/src/components/input/IInput.vue +66 -66
  280. package/src/components/menu/SideMenu.vue +75 -75
  281. package/src/components/menu/menu.js +273 -273
  282. package/src/components/setting/Setting.vue +234 -234
  283. package/src/components/tool/AStepItem.vue +60 -60
  284. package/src/config/CreateQueryConfig.js +325 -325
  285. package/src/config/default/antd.config.js +89 -89
  286. package/src/config/default/setting.config.js +55 -55
  287. package/src/font-style/font.css +4 -4
  288. package/src/layouts/CommonLayout.vue +56 -56
  289. package/src/layouts/GridView.vue +45 -45
  290. package/src/layouts/PageLayout.vue +151 -151
  291. package/src/layouts/SinglePageView.vue +136 -136
  292. package/src/layouts/header/AdminHeader.vue +132 -132
  293. package/src/layouts/header/HeaderNotice.vue +177 -177
  294. package/src/layouts/header/InstitutionDetail.vue +181 -181
  295. package/src/layouts/tabs/TabsHead.vue +189 -189
  296. package/src/layouts/tabs/TabsView.vue +389 -389
  297. package/src/lib.js +1 -1
  298. package/src/mock/extend/index.js +84 -84
  299. package/src/mock/goods/index.js +108 -108
  300. package/src/pages/AMisDemo/AMisDemo.vue +325 -325
  301. package/src/pages/AMisDemo/AMisDemo2.vue +74 -74
  302. package/src/pages/DefaultExample/index.vue +77 -77
  303. package/src/pages/DynamicStatistics/ChartSelector.vue +331 -331
  304. package/src/pages/DynamicStatistics/DataTabs.vue +83 -83
  305. package/src/pages/DynamicStatistics/DynamicTable.vue +128 -128
  306. package/src/pages/DynamicStatistics/EvaluationArea.vue +69 -69
  307. package/src/pages/DynamicStatistics/FavoriteList.vue +50 -50
  308. package/src/pages/DynamicStatistics/QuestionHistoryAndFavorites.vue +591 -591
  309. package/src/pages/DynamicStatistics/SearchBar.vue +192 -192
  310. package/src/pages/DynamicStatistics/index.vue +282 -282
  311. package/src/pages/Example/childIndex.vue +15 -15
  312. package/src/pages/Example/index.vue +30 -30
  313. package/src/pages/NewDynamicStatistics/ChartSelector.vue +331 -331
  314. package/src/pages/NewDynamicStatistics/DataTabs.vue +122 -122
  315. package/src/pages/NewDynamicStatistics/DynamicTable.vue +128 -128
  316. package/src/pages/NewDynamicStatistics/EvaluationArea.vue +69 -69
  317. package/src/pages/NewDynamicStatistics/FavoriteList.vue +50 -50
  318. package/src/pages/NewDynamicStatistics/QuestionHistoryAndFavorites.vue +289 -289
  319. package/src/pages/NewDynamicStatistics/SearchBar.vue +193 -193
  320. package/src/pages/NewDynamicStatistics/index.vue +258 -258
  321. package/src/pages/Recording/index.vue +77 -77
  322. package/src/pages/ReportGrid/index.vue +76 -76
  323. package/src/pages/ServiceReview/index.vue +284 -284
  324. package/src/pages/SubExample/index.vue +26 -26
  325. package/src/pages/WorkflowDetail/WorkFlowDemo.vue +32 -32
  326. package/src/pages/WorkflowDetail/WorkflowDetail.vue +230 -230
  327. package/src/pages/WorkflowDetail/WorkflowPageDetail/LeaveMessage.vue +131 -131
  328. package/src/pages/WorkflowDetail/WorkflowPageDetail/TrimTextTail.vue +23 -23
  329. package/src/pages/WorkflowDetail/WorkflowPageDetail/WorkFlowBaseInformation.vue +302 -302
  330. package/src/pages/WorkflowDetail/WorkflowPageDetail/WorkFlowBaseInformationDetails.vue +276 -276
  331. package/src/pages/WorkflowDetail/WorkflowPageDetail/WorkFlowHandle.vue +864 -864
  332. package/src/pages/WorkflowDetail/WorkflowPageDetail/WorkFlowHandleReso.vue +997 -997
  333. package/src/pages/WorkflowDetail/WorkflowPageDetail/WorkFlowTimeline.vue +222 -222
  334. package/src/pages/WorkflowDetail/WorkflowPageDetail/WorkOrderParentDetails.vue +233 -233
  335. package/src/pages/WorkflowDetail/WorkflowPageDetail/WorkflowDetailResso.vue +261 -261
  336. package/src/pages/WorkflowDetail/WorkflowPageDetail/WorkflowListResolution.vue +248 -248
  337. package/src/pages/WorkflowDetail/WorkflowPageDetail/WorkflowLog.vue +73 -73
  338. package/src/pages/XPageViewExample/index.vue +38 -38
  339. package/src/pages/XReportView/index.vue +64 -64
  340. package/src/pages/XTreeOneProExample/index.vue +67 -67
  341. package/src/pages/dashboard/workplace/WorkPlace.vue +141 -141
  342. package/src/pages/login/Login.vue +378 -378
  343. package/src/pages/login/LoginV3.vue +389 -389
  344. package/src/pages/lowCode/lowCodeEditor.vue +1219 -1219
  345. package/src/pages/lowCode/lowCodeRenderPage.vue +43 -43
  346. package/src/pages/report/ReportTable.js +124 -124
  347. package/src/pages/resourceManage/orgListManage.vue +98 -98
  348. package/src/pages/system/dictionary/index.vue +44 -44
  349. package/src/pages/system/monitor/loginInfor/index.vue +37 -37
  350. package/src/pages/system/monitor/operLog/index.vue +37 -37
  351. package/src/pages/system/settings/modifyPassword.vue +117 -117
  352. package/src/pages/system/ticket/index.vue +480 -480
  353. package/src/pages/system/ticket/submitTicketSuccess.vue +484 -484
  354. package/src/pages/userInfoDetailManage/ChangeMeterRecordQuery/index.vue +64 -64
  355. package/src/pages/userInfoDetailManage/FillCardRecordQuery/index.vue +76 -76
  356. package/src/pages/userInfoDetailManage/FillGasRecordQuery/index.vue +74 -74
  357. package/src/pages/userInfoDetailManage/InfoChangeRecordQuery/index.vue +64 -64
  358. package/src/pages/userInfoDetailManage/InstructRecordQuery/index.vue +64 -64
  359. package/src/pages/userInfoDetailManage/MachineRecordQuery/index.vue +74 -74
  360. package/src/pages/userInfoDetailManage/MeterParamRecordQuery/index.vue +64 -64
  361. package/src/pages/userInfoDetailManage/OtherChargeRecordQuery/index.vue +74 -74
  362. package/src/pages/userInfoDetailManage/TransferRecordQuery/index.vue +66 -66
  363. package/src/pages/userInfoDetailManage/UserChargeRecordQuery/index.vue +92 -92
  364. package/src/pages/userInfoDetailManage/UserHandRecordQuery/index.vue +86 -86
  365. package/src/pages/userInfoDetailManage/UserRecordQuery/index.vue +73 -73
  366. package/src/pages/userInfoDetailManage/WatchCollectionRecordQuery/index.vue +64 -64
  367. package/src/pages/userInfoDetailManage/index.vue +82 -82
  368. package/src/pages/userInfoDetailManage/userInfoDetailQueryTabs.vue +132 -132
  369. package/src/plugins/EventLogPlugin.js +33 -33
  370. package/src/plugins/FindParentsData.js +17 -17
  371. package/src/plugins/HiPrintPlugin.js +124 -124
  372. package/src/router/async/config.async.js +35 -35
  373. package/src/router/guards.js +263 -263
  374. package/src/router/index.js +27 -27
  375. package/src/router.js +19 -19
  376. package/src/services/DataModel.js +30 -30
  377. package/src/services/LodopFuncs.js +137 -137
  378. package/src/services/api/TicketDetailsViewApi.js +46 -46
  379. package/src/services/api/cas.js +79 -79
  380. package/src/services/api/common.js +346 -346
  381. package/src/services/api/entity.js +18 -18
  382. package/src/services/api/index.js +17 -17
  383. package/src/services/api/restTools.js +145 -145
  384. package/src/services/apiService.js +15 -15
  385. package/src/services/user.js +90 -90
  386. package/src/services/v3Api.js +116 -116
  387. package/src/store/modules/account.js +115 -115
  388. package/src/store/modules/index.js +5 -5
  389. package/src/store/modules/lowCode.js +33 -33
  390. package/src/store/modules/setting.js +119 -119
  391. package/src/theme/default/style.less +58 -58
  392. package/src/theme/global.less +159 -159
  393. package/src/utils/authority-utils.js +85 -85
  394. package/src/utils/errorCode.js +6 -6
  395. package/src/utils/formatter.js +74 -74
  396. package/src/utils/htmlToPDF.js +108 -108
  397. package/src/utils/htmlToPDFApi.js +5 -5
  398. package/src/utils/indexedDB.js +263 -263
  399. package/src/utils/login.js +188 -188
  400. package/src/utils/lowcode/lowcodeComponentMixin.js +120 -120
  401. package/src/utils/lowcode/lowcodeLog.js +29 -29
  402. package/src/utils/lowcode/lowcodeUtils.js +373 -373
  403. package/src/utils/lowcode/registerComponentForEditor.js +1 -1
  404. package/src/utils/lowcode/registerComponentForRender.js +11 -11
  405. package/src/utils/map-utils.js +47 -47
  406. package/src/utils/microAppUtils.js +40 -40
  407. package/src/utils/reg.js +95 -95
  408. package/src/utils/request.js +362 -362
  409. package/src/utils/routerUtil.js +450 -450
  410. package/src/utils/runEvalFunction.js +14 -14
  411. package/src/utils/waterMark.js +31 -31
  412. package/test/Amis.spec.js +163 -163
  413. package/test/Tree.spec.js +167 -167
  414. package/test/myDialog.spec.js +46 -46
  415. package/test/util.test.js +52 -52
  416. package/test/v3Api.test.js +1983 -1983
  417. 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>