vue2-client 1.11.4 → 1.11.5

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