@ebiz/designer-components 0.0.48 → 0.0.49

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 (770) hide show
  1. package/README.md +29 -29
  2. package/dist/designer-components.css +1 -1
  3. package/dist/index.mjs +33100 -97408
  4. package/package.json +1 -4
  5. package/src/App.vue +26 -26
  6. package/src/apiService/SIMPLE_DATA_SERVICE.md +284 -284
  7. package/src/apiService/mockDataService.js +115 -115
  8. package/src/apiService/simpleDataService.js +297 -297
  9. package/src/assets/base.css +86 -86
  10. package/src/assets/logo.svg +1 -1
  11. package/src/assets/styles/charts/main.less +0 -30
  12. package/src/components/Button.vue +149 -152
  13. package/src/components/DataContainer.vue +40 -40
  14. package/src/components/EbizApproval.vue +327 -0
  15. package/src/components/EbizAutoForm.vue +596 -596
  16. package/src/components/EbizAvatar.vue +115 -115
  17. package/src/components/EbizCheckbox.vue +93 -93
  18. package/src/components/EbizCheckboxGroup.vue +69 -69
  19. package/src/components/EbizDepartmentSelector.vue +144 -144
  20. package/src/components/EbizDescriptions.vue +340 -340
  21. package/src/components/EbizDescriptionsItem.vue +47 -47
  22. package/src/components/EbizDetailBlock.vue +81 -81
  23. package/src/components/EbizDialog.vue +260 -260
  24. package/src/components/EbizDivider.vue +96 -96
  25. package/src/components/EbizEmployeeInfo.vue +138 -138
  26. package/src/components/EbizEmployeeSelector.vue +1080 -1044
  27. package/src/components/EbizFileUpload.vue +238 -201
  28. package/src/components/EbizMap.vue +541 -541
  29. package/src/components/EbizOkrTree.vue +99 -99
  30. package/src/components/EbizPageHeader.vue +95 -95
  31. package/src/components/EbizPagination.vue +162 -162
  32. package/src/components/EbizPopconfirm.vue +47 -47
  33. package/src/components/EbizRadio.vue +86 -86
  34. package/src/components/EbizRadioGroup.vue +83 -83
  35. package/src/components/EbizRemoteSelect.vue +232 -232
  36. package/src/components/EbizRouteBreadcrumb.vue +46 -46
  37. package/src/components/EbizSelect.vue +85 -95
  38. package/src/components/EbizSpace.vue +100 -100
  39. package/src/components/EbizStatistic.vue +149 -149
  40. package/src/components/EbizStatsCard.vue +113 -113
  41. package/src/components/EbizSwiper.vue +113 -113
  42. package/src/components/EbizSwiperItem.vue +13 -13
  43. package/src/components/EbizSwitch.vue +85 -85
  44. package/src/components/EbizTabHeader.vue +132 -144
  45. package/src/components/EbizTabPanel.vue +22 -22
  46. package/src/components/EbizTable.vue +469 -469
  47. package/src/components/EbizTableColumn.vue +116 -116
  48. package/src/components/EbizTableSort.vue +179 -179
  49. package/src/components/EbizTabs.vue +142 -142
  50. package/src/components/EbizTdesignButtonDialog.vue +332 -332
  51. package/src/components/EbizTdesignLoading.vue +107 -107
  52. package/src/components/EbizTimePicker.vue +143 -143
  53. package/src/components/EbizTitle.vue +91 -91
  54. package/src/components/EbizTree.vue +152 -152
  55. package/src/components/EbizTreeMergeTable.vue +1414 -1414
  56. package/src/components/EbizTreeSelector.vue +418 -418
  57. package/src/components/Form.vue +28 -28
  58. package/src/components/Home.vue +7 -7
  59. package/src/components/MyComponent.vue +39 -39
  60. package/src/components/Table.vue +45 -45
  61. package/src/components/TdesignAlert.vue +115 -115
  62. package/src/components/TdesignButton.vue +135 -135
  63. package/src/components/TdesignCalendar/index.vue +145 -145
  64. package/src/components/TdesignCard.vue +195 -195
  65. package/src/components/TdesignCol.vue +101 -101
  66. package/src/components/TdesignCollapse.vue +142 -142
  67. package/src/components/TdesignCollapsePanel.vue +79 -79
  68. package/src/components/TdesignDatePicker.vue +124 -124
  69. package/src/components/TdesignDescriptions.vue +74 -74
  70. package/src/components/TdesignDescriptionsItem.vue +50 -50
  71. package/src/components/TdesignDialog.vue +225 -225
  72. package/src/components/TdesignForm.vue +138 -138
  73. package/src/components/TdesignFormItem.vue +105 -105
  74. package/src/components/TdesignGrid.vue +55 -55
  75. package/src/components/TdesignIcon.vue +67 -67
  76. package/src/components/TdesignImage.vue +162 -162
  77. package/src/components/TdesignImageViewer.vue +200 -200
  78. package/src/components/TdesignInput.vue +242 -242
  79. package/src/components/TdesignSelect.vue +444 -444
  80. package/src/components/TdesignTag.vue +117 -117
  81. package/src/components/TdesignTextarea.vue +142 -142
  82. package/src/components/TdesignTimeline.vue +58 -58
  83. package/src/components/TdesignTimelineItem.vue +71 -71
  84. package/src/components/TdesignUpload.vue +756 -756
  85. package/src/components/TdesignWatermark.vue +107 -107
  86. package/src/components/ebiz-form/components/cascader.vue +61 -61
  87. package/src/components/ebiz-form/components/checkbox.vue +37 -37
  88. package/src/components/ebiz-form/components/city.vue +137 -137
  89. package/src/components/ebiz-form/components/date-panel.vue +52 -52
  90. package/src/components/ebiz-form/components/date-range-panel.vue +52 -52
  91. package/src/components/ebiz-form/components/date-range.vue +56 -56
  92. package/src/components/ebiz-form/components/date.vue +52 -52
  93. package/src/components/ebiz-form/components/editor-multi-language.vue +47 -47
  94. package/src/components/ebiz-form/components/editor.vue +78 -78
  95. package/src/components/ebiz-form/components/file-multi-language.vue +52 -52
  96. package/src/components/ebiz-form/components/file.vue +149 -149
  97. package/src/components/ebiz-form/components/images-multi-language.vue +52 -52
  98. package/src/components/ebiz-form/components/images.vue +129 -129
  99. package/src/components/ebiz-form/components/img-multi-language.vue +51 -51
  100. package/src/components/ebiz-form/components/img.vue +129 -129
  101. package/src/components/ebiz-form/components/number.vue +50 -50
  102. package/src/components/ebiz-form/components/radio.vue +28 -28
  103. package/src/components/ebiz-form/components/select.vue +119 -119
  104. package/src/components/ebiz-form/components/switch.vue +23 -23
  105. package/src/components/ebiz-form/components/text-multi-language.vue +47 -47
  106. package/src/components/ebiz-form/components/text.vue +52 -52
  107. package/src/components/ebiz-form/components/textarea-multi-language.vue +48 -48
  108. package/src/components/ebiz-form/components/textarea.vue +29 -29
  109. package/src/components/ebiz-form/components/video-multi-language.vue +51 -51
  110. package/src/components/ebiz-form/components/video.vue +97 -97
  111. package/src/components/ebiz-form/index.vue +157 -157
  112. package/src/components/examples/PopconfirmExample.vue +149 -149
  113. package/src/components/icons/IconCommunity.vue +7 -7
  114. package/src/components/icons/IconDocumentation.vue +7 -7
  115. package/src/components/icons/IconEcosystem.vue +7 -7
  116. package/src/components/icons/IconSupport.vue +7 -7
  117. package/src/components/icons/IconTooling.vue +19 -19
  118. package/src/components/senior/EbizSData/index.vue +264 -264
  119. package/src/components/senior/EbizSDialog/index.vue +712 -712
  120. package/src/components/senior/EbizSForm/README.md +157 -157
  121. package/src/components/senior/EbizSForm/index.vue +668 -668
  122. package/src/components/senior/EbizSForm/item.vue +522 -522
  123. package/src/components/senior/EbizSForm/mItems/DateTimePicker.vue +51 -51
  124. package/src/components/senior/EbizSForm/mItems/Picker.vue +63 -63
  125. package/src/index.js +215 -215
  126. package/src/main.js +57 -57
  127. package/src/router/index.js +363 -356
  128. package/src/utils/formatCode.js +24 -24
  129. package/src/utils/generateImportStatement.js +52 -52
  130. package/src/utils/hasJsx.js +25 -25
  131. package/src/utils/index.js +166 -166
  132. package/src/utils/mergeOptions.js +29 -29
  133. package/src/utils/parseRequiredBlocks.js +18 -18
  134. package/src/utils/upload.ts +126 -126
  135. package/src/utils/vue-sfc-validator.js +155 -155
  136. package/src/views/Button.vue +23 -23
  137. package/src/views/CheckboxDemo.vue +104 -104
  138. package/src/views/DataContainer.vue +19 -19
  139. package/src/views/DialogDemo.vue +125 -125
  140. package/src/views/EbizApprovalDemo.vue +77 -0
  141. package/src/views/EbizAutoFormDemo.vue +129 -129
  142. package/src/views/EbizAvatar.vue +223 -223
  143. package/src/views/EbizDepartmentSelectorDemo.vue +169 -169
  144. package/src/views/EbizDetailBlockDemo.vue +30 -30
  145. package/src/views/EbizEmployeeInfo.vue +249 -249
  146. package/src/views/EbizEmployeeSelector.vue +83 -83
  147. package/src/views/EbizMap.vue +201 -201
  148. package/src/views/EbizRadioDemo.vue +151 -151
  149. package/src/views/EbizSDataDemo.vue +136 -137
  150. package/src/views/EbizSDialogDemo.vue +301 -301
  151. package/src/views/EbizSForm/index.vue +359 -359
  152. package/src/views/EbizSFormDemo.vue +420 -420
  153. package/src/views/EbizSpace.vue +185 -185
  154. package/src/views/EbizSwiper.vue +157 -157
  155. package/src/views/EbizTdesignButtonDialogExample.vue +437 -437
  156. package/src/views/Form.vue +19 -19
  157. package/src/views/GridDemo.vue +238 -238
  158. package/src/views/Home.vue +140 -139
  159. package/src/views/Mindmap.vue +19 -19
  160. package/src/views/MyComponent.vue +19 -19
  161. package/src/views/OkrTree.vue +19 -19
  162. package/src/views/PageHeaderDemo.vue +104 -104
  163. package/src/views/PaginationDemo.vue +96 -96
  164. package/src/views/PopconfirmDemo.vue +80 -80
  165. package/src/views/RemoteSelect.vue +350 -350
  166. package/src/views/StatisticDemo.vue +190 -190
  167. package/src/views/SwitchDemo.vue +79 -79
  168. package/src/views/Table.vue +19 -19
  169. package/src/views/TableDemo.vue +334 -334
  170. package/src/views/TableSortDemo.vue +143 -143
  171. package/src/views/TableView.vue +68 -68
  172. package/src/views/TabsDemo.vue +282 -282
  173. package/src/views/TagDemo.vue +101 -101
  174. package/src/views/TdesignAlert.vue +98 -98
  175. package/src/views/TdesignButton.vue +190 -190
  176. package/src/views/TdesignCalendar.vue +94 -94
  177. package/src/views/TdesignCard.vue +296 -296
  178. package/src/views/TdesignCollapse.vue +293 -293
  179. package/src/views/TdesignDatePicker.vue +187 -187
  180. package/src/views/TdesignDescriptions.vue +101 -101
  181. package/src/views/TdesignForm.vue +248 -248
  182. package/src/views/TdesignIcon.vue +203 -203
  183. package/src/views/TdesignImage.vue +215 -215
  184. package/src/views/TdesignImageViewer.vue +198 -198
  185. package/src/views/TdesignInput.vue +252 -252
  186. package/src/views/TdesignSelect.vue +473 -473
  187. package/src/views/TdesignSwiper.vue +157 -157
  188. package/src/views/TextareaDemo.vue +93 -93
  189. package/src/views/TimePickerDemo.vue +146 -146
  190. package/src/views/TimelineDemo.vue +160 -160
  191. package/src/views/Title.vue +19 -19
  192. package/src/views/TreeDemo.vue +254 -254
  193. package/src/views/TreeMergeTableDemo.vue +239 -239
  194. package/src/views/TreeSelectorDemo.vue +245 -245
  195. package/src/views/UploadDemo.vue +121 -121
  196. package/src/views/WatermarkDemo.vue +85 -85
  197. package/src/components/EbizMindmap/README.md +0 -8
  198. package/src/components/EbizMindmap/components/GridNode.vue +0 -102
  199. package/src/components/EbizMindmap/components/node.vue +0 -92
  200. package/src/components/EbizMindmap/components/vueNode.vue +0 -64
  201. package/src/components/EbizMindmap/index.vue +0 -383
  202. package/src/components/charts/chart.js +0 -47
  203. package/src/components/charts/components/AssembleBubbleChart/BaseOption.js +0 -50
  204. package/src/components/charts/components/AssembleBubbleChart/chartToken.js +0 -17
  205. package/src/components/charts/components/AssembleBubbleChart/handleOption.js +0 -66
  206. package/src/components/charts/components/AssembleBubbleChart/handleRootData.js +0 -165
  207. package/src/components/charts/components/AssembleBubbleChart/handleSeriesData.js +0 -70
  208. package/src/components/charts/components/AssembleBubbleChart/index.js +0 -65
  209. package/src/components/charts/components/AutonaviMapChart/index.js +0 -162
  210. package/src/components/charts/components/BaiduMapChart/index.js +0 -148
  211. package/src/components/charts/components/BarChart/barChartOption.js +0 -76
  212. package/src/components/charts/components/BarChart/chartToken.js +0 -17
  213. package/src/components/charts/components/BarChart/handleOptipn.js +0 -102
  214. package/src/components/charts/components/BarChart/handleSeries.js +0 -716
  215. package/src/components/charts/components/BarChart/handleVisualMap.js +0 -48
  216. package/src/components/charts/components/BarChart/index.js +0 -151
  217. package/src/components/charts/components/BaseChart/index.js +0 -122
  218. package/src/components/charts/components/BoxplotChart/chartToken.js +0 -17
  219. package/src/components/charts/components/BoxplotChart/handleOption.js +0 -64
  220. package/src/components/charts/components/BoxplotChart/handleSeries.js +0 -150
  221. package/src/components/charts/components/BoxplotChart/index.js +0 -47
  222. package/src/components/charts/components/BubbleChart/chartToken.js +0 -17
  223. package/src/components/charts/components/BubbleChart/handleData.js +0 -33
  224. package/src/components/charts/components/BubbleChart/handleOptipn.js +0 -63
  225. package/src/components/charts/components/BubbleChart/handleSeries.js +0 -86
  226. package/src/components/charts/components/BubbleChart/handleTrendLine.js +0 -119
  227. package/src/components/charts/components/BubbleChart/handleVisualMap.js +0 -50
  228. package/src/components/charts/components/BubbleChart/index.js +0 -96
  229. package/src/components/charts/components/BulletChart/bulletChartOption.js +0 -82
  230. package/src/components/charts/components/BulletChart/chartToken.js +0 -17
  231. package/src/components/charts/components/BulletChart/handleOptipn.js +0 -74
  232. package/src/components/charts/components/BulletChart/handleSeries.js +0 -143
  233. package/src/components/charts/components/BulletChart/index.js +0 -93
  234. package/src/components/charts/components/CandlestickChart/BaseOption.js +0 -44
  235. package/src/components/charts/components/CandlestickChart/chartToken.js +0 -17
  236. package/src/components/charts/components/CandlestickChart/hanleOption.js +0 -130
  237. package/src/components/charts/components/CandlestickChart/hanleSeries.js +0 -123
  238. package/src/components/charts/components/CandlestickChart/index.js +0 -68
  239. package/src/components/charts/components/CircleProcessChart/chartToken.js +0 -17
  240. package/src/components/charts/components/CircleProcessChart/handleOption.js +0 -68
  241. package/src/components/charts/components/CircleProcessChart/handleSeries.js +0 -127
  242. package/src/components/charts/components/CircleProcessChart/index.js +0 -63
  243. package/src/components/charts/components/FlowChart/Layout.js +0 -211
  244. package/src/components/charts/components/FlowChart/LineBezier.js +0 -120
  245. package/src/components/charts/components/FlowChart/LineDirect.js +0 -42
  246. package/src/components/charts/components/FlowChart/LineManager.js +0 -278
  247. package/src/components/charts/components/FlowChart/LineMode.js +0 -44
  248. package/src/components/charts/components/FlowChart/LineRound.js +0 -335
  249. package/src/components/charts/components/FlowChart/NodeManager.js +0 -185
  250. package/src/components/charts/components/FlowChart/dagre.js +0 -8829
  251. package/src/components/charts/components/FlowChart/frameworkFn.js +0 -38
  252. package/src/components/charts/components/FlowChart/index.js +0 -268
  253. package/src/components/charts/components/FlowChart/index.less +0 -90
  254. package/src/components/charts/components/FlowChart/insert.js +0 -40
  255. package/src/components/charts/components/FlowChart/util.js +0 -43
  256. package/src/components/charts/components/FunnelChart/chartToken.js +0 -17
  257. package/src/components/charts/components/FunnelChart/handleLegend.js +0 -44
  258. package/src/components/charts/components/FunnelChart/handleSeries.js +0 -77
  259. package/src/components/charts/components/FunnelChart/index.js +0 -44
  260. package/src/components/charts/components/GanttChart/CoordinateSystem.js +0 -358
  261. package/src/components/charts/components/GanttChart/TimeLine.js +0 -379
  262. package/src/components/charts/components/GanttChart/constant.js +0 -71
  263. package/src/components/charts/components/GanttChart/index.js +0 -51
  264. package/src/components/charts/components/GanttChart/index.less +0 -267
  265. package/src/components/charts/components/GanttChart/util.js +0 -335
  266. package/src/components/charts/components/GaugeChart/BaseOption.js +0 -22
  267. package/src/components/charts/components/GaugeChart/chartToken.js +0 -17
  268. package/src/components/charts/components/GaugeChart/handleOptipn.js +0 -22
  269. package/src/components/charts/components/GaugeChart/handleSeries.js +0 -504
  270. package/src/components/charts/components/GaugeChart/index.js +0 -53
  271. package/src/components/charts/components/GraphChart/index.js +0 -34
  272. package/src/components/charts/components/GraphTreeChart/BaseOption.js +0 -42
  273. package/src/components/charts/components/GraphTreeChart/handleData.js +0 -118
  274. package/src/components/charts/components/GraphTreeChart/handleOption.js +0 -142
  275. package/src/components/charts/components/GraphTreeChart/index.js +0 -65
  276. package/src/components/charts/components/GraphTreeChart/mixTree.js +0 -36
  277. package/src/components/charts/components/GraphTreeChart/utils.js +0 -75
  278. package/src/components/charts/components/HeatMapChart/BaseOption.js +0 -66
  279. package/src/components/charts/components/HeatMapChart/chartToken.js +0 -17
  280. package/src/components/charts/components/HeatMapChart/handleData.js +0 -138
  281. package/src/components/charts/components/HeatMapChart/handleOptipn.js +0 -227
  282. package/src/components/charts/components/HeatMapChart/handleSeries.js +0 -82
  283. package/src/components/charts/components/HeatMapChart/handleVisualMap.js +0 -91
  284. package/src/components/charts/components/HeatMapChart/index.js +0 -70
  285. package/src/components/charts/components/HillChart/baseOption.js +0 -50
  286. package/src/components/charts/components/HillChart/chartToken.js +0 -17
  287. package/src/components/charts/components/HillChart/handleOption.js +0 -193
  288. package/src/components/charts/components/HillChart/handleSeries.js +0 -39
  289. package/src/components/charts/components/HillChart/index.js +0 -96
  290. package/src/components/charts/components/HoneycombChart/NodeManager.js +0 -172
  291. package/src/components/charts/components/HoneycombChart/TipManager.js +0 -75
  292. package/src/components/charts/components/HoneycombChart/index.js +0 -117
  293. package/src/components/charts/components/HoneycombChart/index.less +0 -49
  294. package/src/components/charts/components/JadeJueChart/BaseOption.js +0 -40
  295. package/src/components/charts/components/JadeJueChart/chartToken.js +0 -17
  296. package/src/components/charts/components/JadeJueChart/handleOption.js +0 -262
  297. package/src/components/charts/components/JadeJueChart/handleSeries.js +0 -246
  298. package/src/components/charts/components/JadeJueChart/index.js +0 -71
  299. package/src/components/charts/components/JadeJueChart/labelFormatter.js +0 -131
  300. package/src/components/charts/components/LineChart/AreaChart/bottomArea.js +0 -177
  301. package/src/components/charts/components/LineChart/AreaChart/chartToken.js +0 -17
  302. package/src/components/charts/components/LineChart/AreaChart/index.js +0 -18
  303. package/src/components/charts/components/LineChart/AreaChart/topArea.js +0 -139
  304. package/src/components/charts/components/LineChart/chartToken.js +0 -17
  305. package/src/components/charts/components/LineChart/handleOptipn.js +0 -145
  306. package/src/components/charts/components/LineChart/handlePredict.js +0 -73
  307. package/src/components/charts/components/LineChart/handleSeries.js +0 -266
  308. package/src/components/charts/components/LineChart/handleVisualMap.js +0 -138
  309. package/src/components/charts/components/LineChart/index.js +0 -133
  310. package/src/components/charts/components/LiquidfillChart/chartToken.js +0 -17
  311. package/src/components/charts/components/LiquidfillChart/handleSeries.js +0 -170
  312. package/src/components/charts/components/LiquidfillChart/index.js +0 -43
  313. package/src/components/charts/components/LiquidfillChart/plugSeries.js +0 -78
  314. package/src/components/charts/components/LiquidfillChart/plugShape.js +0 -163
  315. package/src/components/charts/components/LiquidfillChart/plugView.js +0 -537
  316. package/src/components/charts/components/MilestoneChart/Layout.js +0 -183
  317. package/src/components/charts/components/MilestoneChart/Node.js +0 -319
  318. package/src/components/charts/components/MilestoneChart/assets/next.svg +0 -7
  319. package/src/components/charts/components/MilestoneChart/assets/prev.svg +0 -7
  320. package/src/components/charts/components/MilestoneChart/assets/prompt.svg +0 -9
  321. package/src/components/charts/components/MilestoneChart/index.js +0 -108
  322. package/src/components/charts/components/MilestoneChart/index.less +0 -244
  323. package/src/components/charts/components/MilestoneChart/insertDom.js +0 -32
  324. package/src/components/charts/components/MilestoneChart/insertIcon.js +0 -24
  325. package/src/components/charts/components/MilestoneChart/insertSvg.js +0 -109
  326. package/src/components/charts/components/OrganizationChart/NodeManager.js +0 -188
  327. package/src/components/charts/components/OrganizationChart/RotateManager.js +0 -349
  328. package/src/components/charts/components/OrganizationChart/index.js +0 -124
  329. package/src/components/charts/components/OrganizationChart/index.less +0 -112
  330. package/src/components/charts/components/PieChart/chartToken.js +0 -17
  331. package/src/components/charts/components/PieChart/handleLabel.js +0 -94
  332. package/src/components/charts/components/PieChart/handleMulti.js +0 -131
  333. package/src/components/charts/components/PieChart/handleSeries.js +0 -236
  334. package/src/components/charts/components/PieChart/index.js +0 -58
  335. package/src/components/charts/components/PolarBarChart/chartToken.js +0 -17
  336. package/src/components/charts/components/PolarBarChart/handleOption.js +0 -102
  337. package/src/components/charts/components/PolarBarChart/handleSeries.js +0 -127
  338. package/src/components/charts/components/PolarBarChart/index.js +0 -62
  339. package/src/components/charts/components/ProcessChart/BaseOption.js +0 -296
  340. package/src/components/charts/components/ProcessChart/chartToken.js +0 -17
  341. package/src/components/charts/components/ProcessChart/handleData.js +0 -156
  342. package/src/components/charts/components/ProcessChart/handleOption.js +0 -212
  343. package/src/components/charts/components/ProcessChart/handleSeries.js +0 -369
  344. package/src/components/charts/components/ProcessChart/index.js +0 -76
  345. package/src/components/charts/components/RadarChart/BaseOption.js +0 -248
  346. package/src/components/charts/components/RadarChart/GradientRadar/index.js +0 -421
  347. package/src/components/charts/components/RadarChart/chartToken.js +0 -17
  348. package/src/components/charts/components/RadarChart/handleOptipn.js +0 -316
  349. package/src/components/charts/components/RadarChart/handleSeries.js +0 -120
  350. package/src/components/charts/components/RadarChart/index.js +0 -77
  351. package/src/components/charts/components/RegionChart/chartToken.js +0 -17
  352. package/src/components/charts/components/RegionChart/handleOption.js +0 -29
  353. package/src/components/charts/components/RegionChart/index.js +0 -49
  354. package/src/components/charts/components/RiverChart/Belt.js +0 -181
  355. package/src/components/charts/components/RiverChart/Manager.js +0 -173
  356. package/src/components/charts/components/RiverChart/Node.js +0 -425
  357. package/src/components/charts/components/RiverChart/baseOption.js +0 -51
  358. package/src/components/charts/components/RiverChart/index.js +0 -79
  359. package/src/components/charts/components/RiverChart/index.less +0 -42
  360. package/src/components/charts/components/RiverChart/util.js +0 -160
  361. package/src/components/charts/components/SankeyChart/BaseOption.js +0 -74
  362. package/src/components/charts/components/SankeyChart/chartToken.js +0 -17
  363. package/src/components/charts/components/SankeyChart/handleOption.js +0 -258
  364. package/src/components/charts/components/SankeyChart/index.js +0 -111
  365. package/src/components/charts/components/SankeyChart/tooltip.js +0 -53
  366. package/src/components/charts/components/ScatterChart/chartToken.js +0 -17
  367. package/src/components/charts/components/ScatterChart/handleMarkPoint.js +0 -74
  368. package/src/components/charts/components/ScatterChart/handleOptipn.js +0 -66
  369. package/src/components/charts/components/ScatterChart/handleSeries.js +0 -48
  370. package/src/components/charts/components/ScatterChart/index.js +0 -60
  371. package/src/components/charts/components/SnowFlakeChart/BranchManager.js +0 -324
  372. package/src/components/charts/components/SnowFlakeChart/CommonConstant.js +0 -111
  373. package/src/components/charts/components/SnowFlakeChart/LeafManager.js +0 -76
  374. package/src/components/charts/components/SnowFlakeChart/NodeManager.js +0 -240
  375. package/src/components/charts/components/SnowFlakeChart/TagManager.js +0 -80
  376. package/src/components/charts/components/SnowFlakeChart/assets/down.svg +0 -8
  377. package/src/components/charts/components/SnowFlakeChart/assets/errorBg-leaf.png +0 -0
  378. package/src/components/charts/components/SnowFlakeChart/assets/errorBg.png +0 -0
  379. package/src/components/charts/components/SnowFlakeChart/assets/image2L.svg +0 -7
  380. package/src/components/charts/components/SnowFlakeChart/assets/image2R.svg +0 -7
  381. package/src/components/charts/components/SnowFlakeChart/assets/image5L.svg +0 -7
  382. package/src/components/charts/components/SnowFlakeChart/assets/image5R.svg +0 -7
  383. package/src/components/charts/components/SnowFlakeChart/assets/normalBg-leaf.png +0 -0
  384. package/src/components/charts/components/SnowFlakeChart/assets/normalBg.png +0 -0
  385. package/src/components/charts/components/SnowFlakeChart/assets/outerBorder.svg +0 -24
  386. package/src/components/charts/components/SnowFlakeChart/assets/outerBorderOverAll.svg +0 -18
  387. package/src/components/charts/components/SnowFlakeChart/assets/up.svg +0 -8
  388. package/src/components/charts/components/SnowFlakeChart/assets/warningBg-leaf.png +0 -0
  389. package/src/components/charts/components/SnowFlakeChart/assets/warningBg.png +0 -0
  390. package/src/components/charts/components/SnowFlakeChart/assets/wirelessL.svg +0 -7
  391. package/src/components/charts/components/SnowFlakeChart/assets/wirelessR.svg +0 -7
  392. package/src/components/charts/components/SnowFlakeChart/defaultOption.js +0 -285
  393. package/src/components/charts/components/SnowFlakeChart/index.js +0 -408
  394. package/src/components/charts/components/SnowFlakeChart/index.less +0 -503
  395. package/src/components/charts/components/SnowFlakeChart/line/LineArrow.js +0 -62
  396. package/src/components/charts/components/SnowFlakeChart/line/LineDashed.js +0 -29
  397. package/src/components/charts/components/SnowFlakeChart/line/LineDotted.js +0 -29
  398. package/src/components/charts/components/SnowFlakeChart/line/LineStraight.js +0 -28
  399. package/src/components/charts/components/SnowFlakeChart/line/index.js +0 -202
  400. package/src/components/charts/components/SnowFlakeChart/util.js +0 -430
  401. package/src/components/charts/components/SunburstChart/chartToken.js +0 -17
  402. package/src/components/charts/components/SunburstChart/handleSeries.js +0 -48
  403. package/src/components/charts/components/SunburstChart/index.js +0 -41
  404. package/src/components/charts/components/TerraceChart/defaultGradient.js +0 -116
  405. package/src/components/charts/components/TerraceChart/defaultPath.js +0 -30
  406. package/src/components/charts/components/TerraceChart/index.js +0 -276
  407. package/src/components/charts/components/TerraceChart/index.less +0 -171
  408. package/src/components/charts/components/TerraceChart/insert.js +0 -35
  409. package/src/components/charts/components/TerraceChart/loading.js +0 -34
  410. package/src/components/charts/components/TimelineChart/chartToken.js +0 -17
  411. package/src/components/charts/components/TimelineChart/index.js +0 -109
  412. package/src/components/charts/components/TimelineChart/index.less +0 -152
  413. package/src/components/charts/components/TimelineChart/insertDom.js +0 -45
  414. package/src/components/charts/components/TimelineChart/timeline.js +0 -461
  415. package/src/components/charts/components/TreeChart/chartToken.js +0 -17
  416. package/src/components/charts/components/TreeChart/handleOptipn.js +0 -101
  417. package/src/components/charts/components/TreeChart/handleSeries.js +0 -148
  418. package/src/components/charts/components/TreeChart/index.js +0 -50
  419. package/src/components/charts/components/TreeMapChart/handleOptipn.js +0 -57
  420. package/src/components/charts/components/TreeMapChart/handleSeries.js +0 -57
  421. package/src/components/charts/components/TreeMapChart/handleVisualMap.js +0 -31
  422. package/src/components/charts/components/TreeMapChart/index.js +0 -56
  423. package/src/components/charts/components/WaveChart/chartToken.js +0 -17
  424. package/src/components/charts/components/WaveChart/index.js +0 -418
  425. package/src/components/charts/components/WaveChart/index.less +0 -77
  426. package/src/components/charts/components/WaveChart/insert.js +0 -38
  427. package/src/components/charts/components/WaveChart/loading.js +0 -34
  428. package/src/components/charts/components/WordCloudChart/BaseOption.js +0 -19
  429. package/src/components/charts/components/WordCloudChart/chartToken.js +0 -17
  430. package/src/components/charts/components/WordCloudChart/handleOptipn.js +0 -20
  431. package/src/components/charts/components/WordCloudChart/handleSeries.js +0 -106
  432. package/src/components/charts/components/WordCloudChart/index.js +0 -67
  433. package/src/components/charts/core.js +0 -386
  434. package/src/components/charts/feature/adaptive/index.js +0 -46
  435. package/src/components/charts/feature/adaptive/series/AssembleBubbleChart.js +0 -22
  436. package/src/components/charts/feature/adaptive/series/BarChart.js +0 -27
  437. package/src/components/charts/feature/adaptive/series/BoxplotChart.js +0 -26
  438. package/src/components/charts/feature/adaptive/series/BubbleChart.js +0 -26
  439. package/src/components/charts/feature/adaptive/series/BulletChart.js +0 -27
  440. package/src/components/charts/feature/adaptive/series/CircleProcessChart.js +0 -25
  441. package/src/components/charts/feature/adaptive/series/FunnelChart.js +0 -22
  442. package/src/components/charts/feature/adaptive/series/HeatMapChart.js +0 -26
  443. package/src/components/charts/feature/adaptive/series/JadeJueChart.js +0 -24
  444. package/src/components/charts/feature/adaptive/series/LineChart.js +0 -26
  445. package/src/components/charts/feature/adaptive/series/LiquidfillChart.js +0 -26
  446. package/src/components/charts/feature/adaptive/series/PieChart.js +0 -25
  447. package/src/components/charts/feature/adaptive/series/PolarBarChart.js +0 -22
  448. package/src/components/charts/feature/adaptive/series/ScatterChart.js +0 -26
  449. package/src/components/charts/feature/adaptive/series/SunburstChart.js +0 -25
  450. package/src/components/charts/feature/adaptive/utils/axis.js +0 -26
  451. package/src/components/charts/feature/adaptive/utils/label.js +0 -30
  452. package/src/components/charts/feature/adaptive/utils/legend.js +0 -30
  453. package/src/components/charts/feature/adaptive/utils/title.js +0 -30
  454. package/src/components/charts/feature/adaptive/utils/tooltip.js +0 -30
  455. package/src/components/charts/feature/axistip/index.js +0 -116
  456. package/src/components/charts/feature/card/chartToken.js +0 -17
  457. package/src/components/charts/feature/card/index.js +0 -225
  458. package/src/components/charts/feature/card/index.less +0 -166
  459. package/src/components/charts/feature/drag/index.js +0 -353
  460. package/src/components/charts/feature/drag/index.less +0 -53
  461. package/src/components/charts/feature/equalLabel/index.js +0 -63
  462. package/src/components/charts/feature/expandLegend/constants.js +0 -22
  463. package/src/components/charts/feature/expandLegend/index.js +0 -190
  464. package/src/components/charts/feature/expandLegend/index.less +0 -1044
  465. package/src/components/charts/feature/expandLegend/mutiSelect/constants.js +0 -40
  466. package/src/components/charts/feature/expandLegend/mutiSelect/index.js +0 -157
  467. package/src/components/charts/feature/expandLegend/mutiSelect/item.js +0 -133
  468. package/src/components/charts/feature/expandLegend/mutiSelect/position.js +0 -44
  469. package/src/components/charts/feature/expandLegend/mutiSelect/search.js +0 -79
  470. package/src/components/charts/feature/expandLegend/mutiSelectLegend/constants.js +0 -41
  471. package/src/components/charts/feature/expandLegend/mutiSelectLegend/group.js +0 -112
  472. package/src/components/charts/feature/expandLegend/mutiSelectLegend/index.js +0 -97
  473. package/src/components/charts/feature/expandLegend/mutiSelectLegend/item.js +0 -115
  474. package/src/components/charts/feature/expandLegend/mutiSelectLegend/more.js +0 -101
  475. package/src/components/charts/feature/expandLegend/mutiSelectLegend/paging.js +0 -103
  476. package/src/components/charts/feature/expandLegend/mutiSelectLegend/scroll.js +0 -33
  477. package/src/components/charts/feature/expandLegend/mutiSelectList/constants.js +0 -34
  478. package/src/components/charts/feature/expandLegend/mutiSelectList/index.js +0 -181
  479. package/src/components/charts/feature/expandLegend/mutiSelectList/statisticList.js +0 -146
  480. package/src/components/charts/feature/expandLegend/singleSelect/constants.js +0 -40
  481. package/src/components/charts/feature/expandLegend/singleSelect/index.js +0 -170
  482. package/src/components/charts/feature/expandLegend/singleSelect/item.js +0 -74
  483. package/src/components/charts/feature/expandLegend/singleSelect/position.js +0 -34
  484. package/src/components/charts/feature/expandLegend/singleSelect/search.js +0 -76
  485. package/src/components/charts/feature/expandLegend/singleSelectLegend/constants.js +0 -41
  486. package/src/components/charts/feature/expandLegend/singleSelectLegend/group.js +0 -116
  487. package/src/components/charts/feature/expandLegend/singleSelectLegend/index.js +0 -97
  488. package/src/components/charts/feature/expandLegend/singleSelectLegend/item.js +0 -113
  489. package/src/components/charts/feature/expandLegend/singleSelectLegend/more.js +0 -40
  490. package/src/components/charts/feature/expandLegend/singleSelectLegend/scroll.js +0 -33
  491. package/src/components/charts/feature/expandLegend/tips/constants.js +0 -21
  492. package/src/components/charts/feature/expandLegend/tips/index.js +0 -168
  493. package/src/components/charts/feature/fluctuation/index.js +0 -65
  494. package/src/components/charts/feature/linter/dialog/index.js +0 -111
  495. package/src/components/charts/feature/linter/index.js +0 -131
  496. package/src/components/charts/feature/linter/lints/charts/Bar.js +0 -46
  497. package/src/components/charts/feature/linter/lints/charts/Line.js +0 -31
  498. package/src/components/charts/feature/linter/lints/charts/Pie.js +0 -39
  499. package/src/components/charts/feature/linter/lints/charts/Radar.js +0 -38
  500. package/src/components/charts/feature/linter/lints/charts/index.js +0 -37
  501. package/src/components/charts/feature/linter/lints/modules/angleAxis.js +0 -47
  502. package/src/components/charts/feature/linter/lints/modules/color.js +0 -19
  503. package/src/components/charts/feature/linter/lints/modules/dataZoom.js +0 -52
  504. package/src/components/charts/feature/linter/lints/modules/index.js +0 -64
  505. package/src/components/charts/feature/linter/lints/modules/legend.js +0 -64
  506. package/src/components/charts/feature/linter/lints/modules/radar.js +0 -59
  507. package/src/components/charts/feature/linter/lints/modules/radiusAxis.js +0 -49
  508. package/src/components/charts/feature/linter/lints/modules/title.js +0 -44
  509. package/src/components/charts/feature/linter/lints/modules/tooltip.js +0 -29
  510. package/src/components/charts/feature/linter/lints/modules/util.js +0 -97
  511. package/src/components/charts/feature/linter/lints/modules/xAxis.js +0 -52
  512. package/src/components/charts/feature/linter/lints/modules/yAxis.js +0 -52
  513. package/src/components/charts/feature/mediaScreen/index.js +0 -95
  514. package/src/components/charts/feature/mini/miniBarChart.js +0 -58
  515. package/src/components/charts/feature/mini/miniCircleProcessChart.js +0 -32
  516. package/src/components/charts/feature/mini/miniLineChart.js +0 -58
  517. package/src/components/charts/feature/mini/miniProcessChart.js +0 -64
  518. package/src/components/charts/feature/nodeRender/angular-node.js +0 -100
  519. package/src/components/charts/feature/nodeRender/index.js +0 -31
  520. package/src/components/charts/feature/nodeRender/react-node.js +0 -83
  521. package/src/components/charts/feature/nodeRender/vue-node.js +0 -109
  522. package/src/components/charts/feature/performance/lttb.js +0 -85
  523. package/src/components/charts/feature/readScreen/index.js +0 -19
  524. package/src/components/charts/feature/token/color/bpit/dark.js +0 -67
  525. package/src/components/charts/feature/token/color/bpit/index.js +0 -20
  526. package/src/components/charts/feature/token/color/bpit/light.js +0 -66
  527. package/src/components/charts/feature/token/color/cloud/board-dark.js +0 -260
  528. package/src/components/charts/feature/token/color/cloud/board.js +0 -276
  529. package/src/components/charts/feature/token/color/cloud/dark.js +0 -78
  530. package/src/components/charts/feature/token/color/cloud/index.js +0 -20
  531. package/src/components/charts/feature/token/color/cloud/light.js +0 -77
  532. package/src/components/charts/feature/token/color/hdesign/board.js +0 -204
  533. package/src/components/charts/feature/token/color/hdesign/dark.js +0 -78
  534. package/src/components/charts/feature/token/color/hdesign/index.js +0 -20
  535. package/src/components/charts/feature/token/color/hdesign/light.js +0 -79
  536. package/src/components/charts/feature/token/color/ict/board.js +0 -190
  537. package/src/components/charts/feature/token/color/ict/dark.js +0 -61
  538. package/src/components/charts/feature/token/color/ict/index.js +0 -20
  539. package/src/components/charts/feature/token/color/ict/light.js +0 -62
  540. package/src/components/charts/feature/token/color/index.js +0 -29
  541. package/src/components/charts/feature/token/color/util.js +0 -42
  542. package/src/components/charts/feature/token/factory/chartsToken/AreaChart.js +0 -20
  543. package/src/components/charts/feature/token/factory/chartsToken/AssembleBubbleChart.js +0 -26
  544. package/src/components/charts/feature/token/factory/chartsToken/BarChart.js +0 -27
  545. package/src/components/charts/feature/token/factory/chartsToken/BoxplotChart.js +0 -27
  546. package/src/components/charts/feature/token/factory/chartsToken/BubbleChart.js +0 -22
  547. package/src/components/charts/feature/token/factory/chartsToken/BulletChart.js +0 -23
  548. package/src/components/charts/feature/token/factory/chartsToken/CandlestickChart.js +0 -20
  549. package/src/components/charts/feature/token/factory/chartsToken/ChartCard.js +0 -33
  550. package/src/components/charts/feature/token/factory/chartsToken/CircleProcessChart.js +0 -23
  551. package/src/components/charts/feature/token/factory/chartsToken/FunnelChart.js +0 -26
  552. package/src/components/charts/feature/token/factory/chartsToken/GaugeChart.js +0 -27
  553. package/src/components/charts/feature/token/factory/chartsToken/HeatMapChart.js +0 -21
  554. package/src/components/charts/feature/token/factory/chartsToken/HillChart.js +0 -21
  555. package/src/components/charts/feature/token/factory/chartsToken/JadeJueChart.js +0 -28
  556. package/src/components/charts/feature/token/factory/chartsToken/LineChart.js +0 -36
  557. package/src/components/charts/feature/token/factory/chartsToken/LiquidfillChart.js +0 -22
  558. package/src/components/charts/feature/token/factory/chartsToken/PieChart.js +0 -49
  559. package/src/components/charts/feature/token/factory/chartsToken/PolarBarChart.js +0 -22
  560. package/src/components/charts/feature/token/factory/chartsToken/ProcessChart.js +0 -40
  561. package/src/components/charts/feature/token/factory/chartsToken/RadarChart.js +0 -36
  562. package/src/components/charts/feature/token/factory/chartsToken/RegionChart.js +0 -20
  563. package/src/components/charts/feature/token/factory/chartsToken/SankeyChart.js +0 -22
  564. package/src/components/charts/feature/token/factory/chartsToken/ScatterChart.js +0 -21
  565. package/src/components/charts/feature/token/factory/chartsToken/SunburstChart.js +0 -22
  566. package/src/components/charts/feature/token/factory/chartsToken/TimelineChart.js +0 -21
  567. package/src/components/charts/feature/token/factory/chartsToken/TreeChart.js +0 -21
  568. package/src/components/charts/feature/token/factory/chartsToken/WaveChart.js +0 -23
  569. package/src/components/charts/feature/token/factory/chartsToken/WordCloudChart.js +0 -21
  570. package/src/components/charts/feature/token/factory/chartsToken/index.js +0 -79
  571. package/src/components/charts/feature/token/factory/getAliasToken.js +0 -41
  572. package/src/components/charts/feature/token/factory/getExportColors.js +0 -46
  573. package/src/components/charts/feature/token/factory/getGlobalToken.js +0 -25
  574. package/src/components/charts/feature/token/factory/getModelToken.js +0 -389
  575. package/src/components/charts/feature/token/factory/getSceneToken.js +0 -41
  576. package/src/components/charts/feature/token/factory/globalToken/border.js +0 -21
  577. package/src/components/charts/feature/token/factory/globalToken/borderRadius.js +0 -22
  578. package/src/components/charts/feature/token/factory/globalToken/font.js +0 -26
  579. package/src/components/charts/feature/token/factory/globalToken/index.js +0 -28
  580. package/src/components/charts/feature/token/factory/globalToken/lineType.js +0 -19
  581. package/src/components/charts/feature/token/factory/globalToken/size.js +0 -22
  582. package/src/components/charts/feature/token/factory/globalToken/space.js +0 -25
  583. package/src/components/charts/feature/token/factory/index.js +0 -39
  584. package/src/components/charts/feature/token/factory/mergeToken.js +0 -72
  585. package/src/components/charts/feature/token/index.js +0 -176
  586. package/src/components/charts/feature/token/readme.md +0 -11
  587. package/src/components/charts/feature/token/theme/bpit/index.js +0 -19
  588. package/src/components/charts/feature/token/theme/cloud/getAliasToken.js +0 -247
  589. package/src/components/charts/feature/token/theme/cloud/getSceneToken.js +0 -74
  590. package/src/components/charts/feature/token/theme/cloud/index.js +0 -19
  591. package/src/components/charts/feature/token/theme/hdesign/getAliasToken.js +0 -249
  592. package/src/components/charts/feature/token/theme/hdesign/getSceneToken.js +0 -75
  593. package/src/components/charts/feature/token/theme/hdesign/index.js +0 -19
  594. package/src/components/charts/feature/token/theme/ict/getAliasToken.js +0 -249
  595. package/src/components/charts/feature/token/theme/ict/getSceneToken.js +0 -72
  596. package/src/components/charts/feature/token/theme/ict/index.js +0 -19
  597. package/src/components/charts/feature/wcag/index.js +0 -335
  598. package/src/components/charts/feature/xss/index.js +0 -52
  599. package/src/components/charts/framework/charts/CircleArcChart/index.js +0 -142
  600. package/src/components/charts/framework/charts/CircleChart/index.js +0 -140
  601. package/src/components/charts/framework/charts/CustomizeChart/index.js +0 -166
  602. package/src/components/charts/framework/charts/ForceDirectedChart/index.js +0 -141
  603. package/src/components/charts/framework/charts/ForceDirectedChart/initDom.js +0 -20
  604. package/src/components/charts/framework/charts/ForceDirectedChart/libs/Node.js +0 -148
  605. package/src/components/charts/framework/charts/ForceDirectedChart/libs/center.js +0 -71
  606. package/src/components/charts/framework/charts/ForceDirectedChart/libs/collide.js +0 -151
  607. package/src/components/charts/framework/charts/ForceDirectedChart/libs/constant.js +0 -17
  608. package/src/components/charts/framework/charts/ForceDirectedChart/libs/dispatch.js +0 -95
  609. package/src/components/charts/framework/charts/ForceDirectedChart/libs/index.js +0 -19
  610. package/src/components/charts/framework/charts/ForceDirectedChart/libs/jiggle.js +0 -16
  611. package/src/components/charts/framework/charts/ForceDirectedChart/libs/lcg.js +0 -23
  612. package/src/components/charts/framework/charts/ForceDirectedChart/libs/link.js +0 -128
  613. package/src/components/charts/framework/charts/ForceDirectedChart/libs/manyBody.js +0 -127
  614. package/src/components/charts/framework/charts/ForceDirectedChart/libs/quadtree.js +0 -393
  615. package/src/components/charts/framework/charts/ForceDirectedChart/libs/radial.js +0 -68
  616. package/src/components/charts/framework/charts/ForceDirectedChart/libs/simulation.js +0 -171
  617. package/src/components/charts/framework/charts/ForceDirectedChart/libs/timer.js +0 -121
  618. package/src/components/charts/framework/charts/ForceDirectedChart/libs/x.js +0 -52
  619. package/src/components/charts/framework/charts/ForceDirectedChart/libs/y.js +0 -52
  620. package/src/components/charts/framework/charts/GridChart/index.js +0 -174
  621. package/src/components/charts/framework/charts/LinearArcChart/index.js +0 -143
  622. package/src/components/charts/framework/charts/MindmapChart/index.js +0 -166
  623. package/src/components/charts/framework/charts/MindmapChart/index.less +0 -85
  624. package/src/components/charts/framework/core/Base.js +0 -53
  625. package/src/components/charts/framework/core/Relation.js +0 -78
  626. package/src/components/charts/framework/module/animation/Animate.js +0 -434
  627. package/src/components/charts/framework/module/animation/Animation.js +0 -76
  628. package/src/components/charts/framework/module/animation/AnimationGroup.js +0 -137
  629. package/src/components/charts/framework/module/animation/Easing.js +0 -225
  630. package/src/components/charts/framework/module/animation/Interpolation.js +0 -88
  631. package/src/components/charts/framework/module/animation/index.js +0 -20
  632. package/src/components/charts/framework/module/arrow/Manager.js +0 -133
  633. package/src/components/charts/framework/module/arrow/index.js +0 -96
  634. package/src/components/charts/framework/module/canvas/grid.js +0 -288
  635. package/src/components/charts/framework/module/canvas/index.js +0 -434
  636. package/src/components/charts/framework/module/canvas/index.less +0 -102
  637. package/src/components/charts/framework/module/canvas/initDom.js +0 -66
  638. package/src/components/charts/framework/module/canvas/tool.js +0 -62
  639. package/src/components/charts/framework/module/connector/Manager.js +0 -103
  640. package/src/components/charts/framework/module/connector/index.js +0 -99
  641. package/src/components/charts/framework/module/connector/index.less +0 -36
  642. package/src/components/charts/framework/module/connector/type/dot.js +0 -21
  643. package/src/components/charts/framework/module/connector/type/expand.js +0 -211
  644. package/src/components/charts/framework/module/contextmenu/index.js +0 -149
  645. package/src/components/charts/framework/module/contextmenu/index.less +0 -40
  646. package/src/components/charts/framework/module/data/Manager.js +0 -56
  647. package/src/components/charts/framework/module/data/index.js +0 -0
  648. package/src/components/charts/framework/module/legend/Item.js +0 -218
  649. package/src/components/charts/framework/module/legend/constants.js +0 -14
  650. package/src/components/charts/framework/module/legend/getSymbol.js +0 -86
  651. package/src/components/charts/framework/module/legend/index.js +0 -119
  652. package/src/components/charts/framework/module/legend/util.js +0 -81
  653. package/src/components/charts/framework/module/line/Animation.js +0 -125
  654. package/src/components/charts/framework/module/line/Manager.js +0 -299
  655. package/src/components/charts/framework/module/line/Tag.js +0 -61
  656. package/src/components/charts/framework/module/line/bufferRender.js +0 -74
  657. package/src/components/charts/framework/module/line/cross/pathPoints.js +0 -233
  658. package/src/components/charts/framework/module/line/cross/vectorUtil.js +0 -67
  659. package/src/components/charts/framework/module/line/customize.js +0 -29
  660. package/src/components/charts/framework/module/line/index.js +0 -260
  661. package/src/components/charts/framework/module/line/index.less +0 -24
  662. package/src/components/charts/framework/module/line/type/Bezier.js +0 -90
  663. package/src/components/charts/framework/module/line/type/Circle.js +0 -38
  664. package/src/components/charts/framework/module/line/type/Direct.js +0 -23
  665. package/src/components/charts/framework/module/line/type/Ellipse.js +0 -88
  666. package/src/components/charts/framework/module/line/type/Round.js +0 -245
  667. package/src/components/charts/framework/module/lineLayout/CircleShape/calculate.js +0 -71
  668. package/src/components/charts/framework/module/lineLayout/CircleShape/index.js +0 -32
  669. package/src/components/charts/framework/module/lineLayout/CircleShape/init.js +0 -34
  670. package/src/components/charts/framework/module/lineLayout/RectShape/calculate.js +0 -174
  671. package/src/components/charts/framework/module/lineLayout/RectShape/index.js +0 -43
  672. package/src/components/charts/framework/module/lineLayout/RectShape/init.js +0 -79
  673. package/src/components/charts/framework/module/lineLayout/RectShape/sharing.js +0 -57
  674. package/src/components/charts/framework/module/lineLayout/index.js +0 -30
  675. package/src/components/charts/framework/module/node/Manager.js +0 -190
  676. package/src/components/charts/framework/module/node/bufferRender.js +0 -73
  677. package/src/components/charts/framework/module/node/convertData/index.js +0 -24
  678. package/src/components/charts/framework/module/node/convertData/returnSelf.js +0 -16
  679. package/src/components/charts/framework/module/node/convertData/transform.js +0 -24
  680. package/src/components/charts/framework/module/node/convertData/treeToLink.js +0 -36
  681. package/src/components/charts/framework/module/node/index.js +0 -187
  682. package/src/components/charts/framework/module/nodeLayout/circle/excute.js +0 -270
  683. package/src/components/charts/framework/module/nodeLayout/circle/index.js +0 -24
  684. package/src/components/charts/framework/module/nodeLayout/customize/index.js +0 -16
  685. package/src/components/charts/framework/module/nodeLayout/defaults/excute.js +0 -27
  686. package/src/components/charts/framework/module/nodeLayout/defaults/index.js +0 -20
  687. package/src/components/charts/framework/module/nodeLayout/grid/excute.js +0 -392
  688. package/src/components/charts/framework/module/nodeLayout/grid/index.js +0 -20
  689. package/src/components/charts/framework/module/nodeLayout/index.js +0 -27
  690. package/src/components/charts/framework/module/nodeLayout/linearArc/index.js +0 -34
  691. package/src/components/charts/framework/module/nodeLayout/nonLayeredTidyTree/NodeBox.js +0 -165
  692. package/src/components/charts/framework/module/nodeLayout/nonLayeredTidyTree/algorithm.js +0 -261
  693. package/src/components/charts/framework/module/nodeLayout/nonLayeredTidyTree/index.js +0 -278
  694. package/src/components/charts/framework/module/readme.js +0 -127
  695. package/src/components/charts/index.js +0 -65
  696. package/src/components/charts/index.less +0 -29
  697. package/src/components/charts/option/PolarSys/index.js +0 -43
  698. package/src/components/charts/option/RectSys/index.js +0 -58
  699. package/src/components/charts/option/base/index.js +0 -25
  700. package/src/components/charts/option/config/angleAxis/base.js +0 -56
  701. package/src/components/charts/option/config/angleAxis/index.js +0 -43
  702. package/src/components/charts/option/config/animation/index.js +0 -64
  703. package/src/components/charts/option/config/datazoom/base.js +0 -123
  704. package/src/components/charts/option/config/datazoom/index.js +0 -61
  705. package/src/components/charts/option/config/grid/base.js +0 -22
  706. package/src/components/charts/option/config/grid/index.js +0 -32
  707. package/src/components/charts/option/config/legend/base.js +0 -80
  708. package/src/components/charts/option/config/legend/icon.js +0 -21
  709. package/src/components/charts/option/config/legend/index.js +0 -63
  710. package/src/components/charts/option/config/legend/itemStyle.js +0 -17
  711. package/src/components/charts/option/config/legend/ldata.js +0 -29
  712. package/src/components/charts/option/config/legend/pageIcon.js +0 -54
  713. package/src/components/charts/option/config/legend/position.js +0 -19
  714. package/src/components/charts/option/config/legend/size.js +0 -17
  715. package/src/components/charts/option/config/legend/textStyle.js +0 -16
  716. package/src/components/charts/option/config/mark/index.js +0 -74
  717. package/src/components/charts/option/config/polar/base.js +0 -30
  718. package/src/components/charts/option/config/polar/index.js +0 -36
  719. package/src/components/charts/option/config/polarTitle/base.js +0 -40
  720. package/src/components/charts/option/config/polarTitle/index.js +0 -52
  721. package/src/components/charts/option/config/polarTitle/subtextStyle.js +0 -21
  722. package/src/components/charts/option/config/polarTitle/textStyle.js +0 -22
  723. package/src/components/charts/option/config/radiusAxis/base.js +0 -55
  724. package/src/components/charts/option/config/radiusAxis/index.js +0 -41
  725. package/src/components/charts/option/config/rectTitle/base.js +0 -31
  726. package/src/components/charts/option/config/rectTitle/index.js +0 -53
  727. package/src/components/charts/option/config/toolbox/base.js +0 -42
  728. package/src/components/charts/option/config/toolbox/index.js +0 -12
  729. package/src/components/charts/option/config/tooltip/axisPointer.js +0 -31
  730. package/src/components/charts/option/config/tooltip/base.js +0 -62
  731. package/src/components/charts/option/config/tooltip/formatter.js +0 -64
  732. package/src/components/charts/option/config/tooltip/index.js +0 -41
  733. package/src/components/charts/option/config/visualMap/index.js +0 -91
  734. package/src/components/charts/option/config/xAxis/axisLabel.js +0 -35
  735. package/src/components/charts/option/config/xAxis/axisLine.js +0 -29
  736. package/src/components/charts/option/config/xAxis/axisMargin.js +0 -31
  737. package/src/components/charts/option/config/xAxis/base.js +0 -66
  738. package/src/components/charts/option/config/xAxis/boundaryGap.js +0 -17
  739. package/src/components/charts/option/config/xAxis/index.js +0 -52
  740. package/src/components/charts/option/config/xAxis/name.js +0 -18
  741. package/src/components/charts/option/config/xAxis/xdata.js +0 -23
  742. package/src/components/charts/option/config/xAxis/xkey.js +0 -21
  743. package/src/components/charts/option/config/yAxis/axisOptimization.js +0 -32
  744. package/src/components/charts/option/config/yAxis/base.js +0 -59
  745. package/src/components/charts/option/config/yAxis/index.js +0 -68
  746. package/src/components/charts/option/config/yAxis/ydata.js +0 -28
  747. package/src/components/charts/option/init/index.js +0 -204
  748. package/src/components/charts/register.js +0 -178
  749. package/src/components/charts/theme.js +0 -62
  750. package/src/components/charts/util/Sequence.js +0 -21
  751. package/src/components/charts/util/centerDom.js +0 -92
  752. package/src/components/charts/util/cloneDeep.js +0 -29
  753. package/src/components/charts/util/color.js +0 -193
  754. package/src/components/charts/util/constants.js +0 -125
  755. package/src/components/charts/util/convert.js +0 -49
  756. package/src/components/charts/util/debounce.js +0 -24
  757. package/src/components/charts/util/defendXSS.js +0 -81
  758. package/src/components/charts/util/dom.js +0 -90
  759. package/src/components/charts/util/equal.js +0 -62
  760. package/src/components/charts/util/event.js +0 -25
  761. package/src/components/charts/util/hashMap.js +0 -111
  762. package/src/components/charts/util/init/insert.js +0 -165
  763. package/src/components/charts/util/math.js +0 -183
  764. package/src/components/charts/util/merge.js +0 -78
  765. package/src/components/charts/util/paint.js +0 -98
  766. package/src/components/charts/util/sort/max.js +0 -64
  767. package/src/components/charts/util/sort/min.js +0 -64
  768. package/src/components/charts/util/throttle.js +0 -34
  769. package/src/components/charts/util/tips.js +0 -25
  770. package/src/components/charts/util/type.js +0 -46
@@ -1,1414 +1,1414 @@
1
- <template>
2
- <div>
3
- <!-- 选中数据结构展示 -->
4
- <!-- <div style="margin-bottom: 16px">
5
- <t-card title="选中数据结构(JSON)">
6
- <pre style="background: #f6f8fa; padding: 12px 16px; border-radius: 6px; overflow: auto; max-height: 300px"
7
- >{{ JSON.stringify(computedSelectedData, null, 2) }}
8
- </pre>
9
- </t-card>
10
- </div> -->
11
- <!-- 树表上方的数据权限配置模块 -->
12
- <div class="permission-config-panel">
13
- <div class="panel-header">
14
- <h3 class="panel-title">数据权限配置</h3>
15
- </div>
16
- <div class="panel-content">
17
- <div class="permission-type-selector">
18
- <t-radio-group v-model="globalPermission" class="permission-radio-group">
19
- <t-radio-button :value="1">全部数据</t-radio-button>
20
- <t-radio-button :value="2">事业部数据</t-radio-button>
21
- <t-radio-button :value="3">本部门数据</t-radio-button>
22
- <t-radio-button :value="4">子部门数据</t-radio-button>
23
- <t-radio-button :value="5">个人数据</t-radio-button>
24
- <t-radio-button :value="6">自定义数据</t-radio-button>
25
- </t-radio-group>
26
- </div>
27
-
28
- <div v-if="globalPermission === 6" class="org-select-row">
29
- <div class="selected-count">
30
- {{ globalSelectedOrgs.length > 0 ? '已选择' + globalSelectedOrgs.length + '个组织' : '未选择组织' }}
31
- </div>
32
- <t-button theme="primary" @click="openGlobalOrgSelector" class="org-select-btn">
33
- {{ globalSelectedOrgs.length > 0 ? '编辑' : '选择' }}
34
- <template #suffix>
35
- <t-icon name="chevron-right" />
36
- </template>
37
- </t-button>
38
- </div>
39
-
40
- <div v-if="globalPermission === 6" class="selected-orgs-panel">
41
- <div class="selected-orgs-header">
42
- 已选组织:
43
- <t-button theme="primary" variant="text" size="small" @click="clearGlobalOrgs">清空</t-button>
44
- </div>
45
- <div class="selected-orgs-content">
46
- <div v-if="globalSelectedOrgs.length === 0" class="no-org-selected">请从左侧选择组织</div>
47
- <div v-else class="selected-orgs-tags">
48
- <t-tag v-for="org in globalSelectedOrgs" :key="org.id" theme="primary" variant="light" class="org-tag"
49
- closable @close="removeGlobalOrg(org.id)">
50
- {{ org.name }}
51
- </t-tag>
52
- </div>
53
- </div>
54
- </div>
55
- </div>
56
- </div>
57
-
58
- <t-table :bordered="true" :data="data" :columns="columns" row-key="id" :rowspan-and-colspan="rowspanAndColspan"
59
- resizable table-layout="fixed" lazy-load @cell-click="handleCellClick">
60
- <!-- 模块列的自定义单元格 -->
61
- <template #module="{ row }">
62
- <div class="cell-with-checkbox">
63
- <t-checkbox v-model="row.moduleChecked" @change="(checked) => handleModuleCheck(row, checked)"></t-checkbox>
64
- <span class="cell-text">{{ row.module }}</span>
65
- </div>
66
- </template>
67
-
68
- <!-- 子模块1列的自定义单元格 -->
69
- <template #subModule1="{ row }">
70
- <div class="cell-with-checkbox">
71
- <t-checkbox v-model="row.subModule1Checked"
72
- @change="(checked) => handleSubModule1Check(row, checked)"></t-checkbox>
73
- <span class="cell-text">{{ row.subModule1 || row.module }}</span>
74
- </div>
75
- </template>
76
-
77
- <!-- 子模块2列的自定义单元格 -->
78
- <template #subModule2="{ row }">
79
- <div class="cell-with-checkbox" v-if="row.subModule2">
80
- <t-checkbox v-model="row.subModule2Checked"
81
- @change="(checked) => handleSubModule2Check(row, checked)"></t-checkbox>
82
- <span class="cell-text">{{ row.subModule2 }}</span>
83
- </div>
84
- <div v-else class="cell-with-checkbox">
85
- <span class="cell-text empty-cell">-</span>
86
- </div>
87
- </template>
88
-
89
- <!-- 功能列的自定义单元格 -->
90
- <template #functions="{ row }">
91
- <div class="functions-container">
92
- <div v-for="(func, idx) in row.functions" :key="func.id || idx" class="function-item">
93
- <t-checkbox v-model="func.checked"
94
- @change="(checked) => handleFunctionCheck(row, func, checked)"></t-checkbox>
95
- <span class="cell-text">{{ func.name }}</span>
96
- </div>
97
- </div>
98
- </template>
99
-
100
- <!-- 操作列的自定义单元格 -->
101
- <template #operation="{ row }">
102
- <div class="operation-buttons">
103
- <t-button theme="primary" size="medium" @click="openPermissionDialog(row)"
104
- :disabled="!row.functions.some((f) => f.checked)">数据权限配置</t-button>
105
- </div>
106
- </template>
107
-
108
- <slot></slot>
109
- </t-table>
110
-
111
- <!-- 新增保存按钮 -->
112
- <div style="margin-top: 24px; display: flex; justify-content: flex-end">
113
- <t-button theme="primary" @click="handleSaveRolePermission">保存角色权限</t-button>
114
- </div>
115
-
116
- <!-- 全局组织选择弹窗 -->
117
- <t-dialog v-model:visible="globalOrgDialogVisible" header="选择组织" width="800px" attach="body"
118
- :confirm-btn="{ content: '确定', theme: 'primary' }" :cancel-btn="{ content: '取消', theme: 'default' }"
119
- @confirm="handleGlobalOrgConfirm" @cancel="handleGlobalOrgCancel">
120
- <div class="org-selector-dialog">
121
- <div class="org-dialog-container">
122
- <div class="org-left-panel">
123
- <div class="org-panel-header">组织架构</div>
124
- <div class="org-search-container">
125
- <t-input v-model="keyWord" placeholder="请输入关键词搜索" clearable style="width: 100%">
126
- <template #suffix>
127
- <t-button theme="default" shape="square" @click="onOrgSearch" size="small">
128
- <t-icon name="search" />
129
- </t-button>
130
- </template>
131
- </t-input>
132
- <div v-if="keyWord" class="search-result-info">
133
- 找到 {{ getMatchedCount(filteredOrgTreeData) }} 个结果
134
- </div>
135
- </div>
136
- <div class="org-tree-container">
137
- <t-tree :data="filteredOrgTreeData" :keys="orgTreeKeys" activable hover expandAll line
138
- expand-on-click-node :expanded="expandedKeys" :active="activeKey" @active="handleOrgNodeActive"
139
- @expand="handleOrgNodeExpand">
140
- <template #operations="{ node }">
141
- <t-checkbox :checked="isGlobalOrgNodeSelected(node.data.id)"
142
- @change="(checked) => handleGlobalOrgNodeSelect(node.data, checked)"></t-checkbox>
143
- </template>
144
- <template #label="{ node }">
145
- <div class="tree-node-label" :class="{ selected: isGlobalOrgNodeSelected(node.data.id) }"
146
- @click.stop="toggleGlobalOrgNodeSelect(node.data)">
147
- {{ node.data.name }}
148
- </div>
149
- </template>
150
- </t-tree>
151
- <div v-if="keyWord && filteredOrgTreeData.length === 0" class="no-search-results">
152
- 未找到符合"{{ keyWord }}"的组织
153
- </div>
154
- </div>
155
- </div>
156
- <div class="org-right-panel">
157
- <div class="org-panel-header">
158
- <span>已选择组织</span>
159
- <t-button theme="primary" variant="text" @click="clearGlobalSelectedOrgs">清空</t-button>
160
- </div>
161
- <div class="org-selected-container">
162
- <div v-if="tempGlobalSelectedOrgs.length === 0" class="no-selected-tip">请从左侧选择组织</div>
163
- <div v-else class="selected-orgs-tags">
164
- <t-tag v-for="org in tempGlobalSelectedOrgs" :key="org.id" closable @close="removeGlobalSelectedOrg(org.id)"
165
- theme="primary" variant="light" class="org-tag">
166
- {{ org.name }}
167
- </t-tag>
168
- </div>
169
- </div>
170
- </div>
171
- </div>
172
- </div>
173
- </t-dialog>
174
-
175
- <!-- 数据权限配置弹窗(针对表格行) -->
176
- <t-dialog v-model:visible="permissionDialogVisible" :header="permissionDialogTitle" width="800px" attach="body"
177
- :confirm-btn="{ content: '确定', theme: 'primary' }" :cancel-btn="{ content: '取消', theme: 'default' }"
178
- @confirm="handlePermissionConfirm" @cancel="handlePermissionCancel">
179
- <div class="permission-content">
180
- <template v-if="currentRow">
181
- <div class="permission-item">
182
- <div class="permission-options">
183
- <t-radio-group v-model="selectedPermission">
184
- <t-radio-button :value="1">全部数据</t-radio-button>
185
- <t-radio-button :value="2">事业部数据</t-radio-button>
186
- <t-radio-button :value="3">本部门数据</t-radio-button>
187
- <t-radio-button :value="4">子部门数据</t-radio-button>
188
- <t-radio-button :value="5">个人数据</t-radio-button>
189
- <t-radio-button :value="6">自定义数据</t-radio-button>
190
- </t-radio-group>
191
- </div>
192
-
193
- <div v-if="selectedPermission === 6" class="custom-permission">
194
- <div class="org-dialog-container">
195
- <div class="org-left-panel">
196
- <div class="org-panel-header">组织架构</div>
197
- <div class="org-search-container">
198
- <t-input v-model="keyWord" placeholder="请输入关键词搜索" clearable style="width: 100%">
199
- <template #suffix>
200
- <t-button theme="default" shape="square" @click="onOrgSearch" size="small">
201
- <t-icon name="search" />
202
- </t-button>
203
- </template>
204
- </t-input>
205
- <div v-if="keyWord" class="search-result-info">
206
- 找到 {{ getMatchedCount(filteredOrgTreeData) }} 个结果
207
- </div>
208
- </div>
209
- <div class="org-tree-container">
210
- <t-tree :data="filteredOrgTreeData" :keys="orgTreeKeys" activable hover expandAll line
211
- expand-on-click-node :expanded="expandedKeys" :active="activeKey" @active="handleOrgNodeActive"
212
- @expand="handleOrgNodeExpand">
213
- <template #operations="{ node }">
214
- <t-checkbox :checked="isOrgNodeSelected(node.data.id)"
215
- @change="(checked) => handleOrgNodeSelect(node.data, checked)"></t-checkbox>
216
- </template>
217
- <template #label="{ node }">
218
- <div class="tree-node-label" :class="{ selected: isOrgNodeSelected(node.data.id) }"
219
- @click.stop="toggleOrgNodeSelect(node.data)">
220
- {{ node.data.name }}
221
- </div>
222
- </template>
223
- </t-tree>
224
- <div v-if="keyWord && filteredOrgTreeData.length === 0" class="no-search-results">
225
- 未找到符合"{{ keyWord }}"的组织
226
- </div>
227
- </div>
228
- </div>
229
- <div class="org-right-panel">
230
- <div class="org-panel-header">
231
- <span>已选择组织</span>
232
- <t-button theme="primary" variant="text" @click="clearSelectedOrgs">清空</t-button>
233
- </div>
234
- <div class="org-selected-container">
235
- <div v-if="selectedOrgs.length === 0" class="no-selected-tip">请从左侧选择组织</div>
236
- <div v-else class="selected-orgs-tags">
237
- <t-tag v-for="org in selectedOrgs" :key="org.id" closable @close="removeSelectedOrg(org.id)"
238
- theme="primary" variant="light" class="org-tag">
239
- {{ org.name }}
240
- </t-tag>
241
- </div>
242
- </div>
243
- </div>
244
- </div>
245
- </div>
246
- </div>
247
- </template>
248
- </div>
249
- </t-dialog>
250
-
251
- <!-- 保留原有的详情弹窗 -->
252
- <t-dialog v-model:visible="detailDialogVisible" :header="detailDialogTitle" width="600px" :footer="false">
253
- <div class="detail-content">
254
- <template v-if="currentRow">
255
- <div class="detail-item">
256
- <span class="item-label">模块:</span>
257
- <span class="item-value">{{ currentRow.module }}</span>
258
- </div>
259
-
260
- <div class="detail-item" v-if="currentRow.subModule1">
261
- <span class="item-label">子模块1:</span>
262
- <span class="item-value">{{ currentRow.subModule1 }}</span>
263
- </div>
264
-
265
- <div class="detail-item" v-if="currentRow.subModule2">
266
- <span class="item-label">子模块2:</span>
267
- <span class="item-value">{{ currentRow.subModule2 }}</span>
268
- </div>
269
-
270
- <div class="detail-item">
271
- <span class="item-label">功能:</span>
272
- <span class="item-value">{{ currentRow.function }}</span>
273
- </div>
274
-
275
- <div class="detail-item" v-if="currentRow.path">
276
- <span class="item-label">路径:</span>
277
- <span class="item-value">{{ currentRow.path }}</span>
278
- </div>
279
-
280
- <div class="detail-item" v-if="currentRow.childFunctions && currentRow.childFunctions.length > 0">
281
- <span class="item-label">子功能:</span>
282
- <div class="sub-functions">
283
- <div v-for="(func, index) in currentRow.childFunctions" :key="index" class="sub-function-item">
284
- <span>{{ func.name }}</span>
285
- </div>
286
- </div>
287
- </div>
288
- </template>
289
- </div>
290
- </t-dialog>
291
- </div>
292
- </template>
293
-
294
- <script>
295
- export default {
296
- name: 'EbizTreeMergeTable'
297
- }
298
- </script>
299
-
300
- <script setup>
301
- import dataService from '../apiService/simpleDataService'
302
- import { ref, computed, onMounted, watch } from 'vue'
303
- import {
304
- Table as TTable,
305
- Checkbox as TCheckbox,
306
- Button as TButton,
307
- Dialog as TDialog,
308
- RadioGroup as TRadioGroup,
309
- RadioButton as TRadioButton,
310
- Input as TInput,
311
- Tree as TTree,
312
- Tag as TTag,
313
- Icon as TIcon,
314
- Message
315
- } from 'tdesign-vue-next'
316
-
317
- const apis = {
318
- // tree: '/menu/tree',
319
- tree: '/function/tree',
320
- orgTree: '/appdata/execute/plugin?key=organizational_structure',
321
- getConfig: '/role/functions/search/{roleId}',
322
- getRole: '/role/position/{positionId}',
323
- gerRoleInfo: '/role/detail/{id}',
324
- saveRole: '/role/save'
325
- }
326
-
327
- const props = defineProps({
328
- type: {
329
- type: String,
330
- default: 'role' // role,post 角色,岗位
331
- },
332
- id: {
333
- type: String,
334
- default: ''
335
- }
336
- })
337
- const emits = defineEmits(['success'])
338
- const roleId = ref()
339
-
340
- const data = ref([])
341
- // 表格列配置,添加自定义单元格插槽
342
- const columns = [
343
- { colKey: 'module', title: '模块', width: 150, cell: 'module' },
344
- { colKey: 'subModule1', title: '子模块1', width: 150, cell: 'subModule1' },
345
- { colKey: 'subModule2', title: '子模块2', width: 150, cell: 'subModule2' },
346
- { colKey: 'functions', title: '功能', width: 300, cell: 'functions' },
347
- { colKey: 'operation', title: '操作', width: 100, cell: 'operation', fixed: 'right' }
348
- ]
349
-
350
-
351
- // 获取数据并处理
352
- dataService.fetch({}, {}, apis.tree).then((res) => {
353
- const processedData = processTreeData(res || [])
354
- // 为每行数据添加选中状态属性
355
- processedData.forEach((row) => {
356
- // 添加选中状态属性
357
- row.moduleChecked = false
358
- row.subModule1Checked = false
359
- row.subModule2Checked = false
360
- row.functionChecked = false
361
- })
362
- data.value = processedData;
363
- })
364
- function getRoleConfig() {
365
- dataService.fetch({}, {}, apis.getConfig.replace('{roleId}', roleId.value || props.id)).then((res) => {
366
- res.forEach(item => {
367
- // 获取functionId
368
- const functionId = item.functionId;
369
- // 在data.value中查找对应功能所在的行
370
- data.value.forEach(row => {
371
- // 检查functions数组中是否有匹配的功能
372
- const matchedFunction = row.functions.find(func => func.id === functionId);
373
- if (matchedFunction) {
374
- // 设置功能勾选状态为true
375
- matchedFunction.checked = true;
376
-
377
- // 保存数据权限配置(如果有)
378
- if (item.dataScope) {
379
- row.dataPermission = item.dataScope;
380
- // 标记为自定义配置
381
- row.hasCustomConfig = true;
382
- // 如果是自定义数据权限,则设置已选组织
383
- if (item.dataScope === 6 && item.deptIds && item.deptIds.length > 0) {
384
- row.selectedOrgs = item.deptIds.map(id => {
385
- const org = findOrgInTree(orgTreeData.value, id);
386
- return {
387
- id: id,
388
- name: org ? org.name : `组织${id}`
389
- };
390
- });
391
- }
392
- }
393
-
394
- // 更新父级勾选状态(模块、子模块)
395
- updateParentCheckStatus(row);
396
- }
397
- });
398
- });
399
- })
400
- }
401
- /**
402
- * 处理树形数据,生成四级结构(模块、子模块1、子模块2、功能列表)
403
- * @param {Array} treeData 原始树形数据
404
- * @returns {Array} 扁平化处理后的数据
405
- */
406
- const processTreeData = (treeData) => {
407
- const result = []
408
- // 处理第一级:模块
409
- treeData.forEach((moduleItem) => {
410
- if (!moduleItem.children || moduleItem.children.length === 0) {
411
- // 没有子模块,功能为全部
412
- result.push({
413
- id: `${moduleItem.id}_all`,
414
- module: moduleItem.name,
415
- moduleId: moduleItem.id,
416
- subModule1: null,
417
- subModule1Id: null,
418
- subModule2: null,
419
- subModule2Id: null,
420
- functions: [{ id: null, name: '全部', checked: false }]
421
- })
422
- return
423
- }
424
- moduleItem.children.forEach((subModule1Item) => {
425
- if (!subModule1Item.children || subModule1Item.children.length === 0) {
426
- // 没有子模块2,功能为全部
427
- result.push({
428
- id: `${moduleItem.id}_${subModule1Item.id}_all`,
429
- module: moduleItem.name,
430
- moduleId: moduleItem.id,
431
- subModule1: subModule1Item.name,
432
- subModule1Id: subModule1Item.id,
433
- subModule2: null,
434
- subModule2Id: null,
435
- functions: [{ id: null, name: '全部', checked: false }]
436
- })
437
- } else {
438
- subModule1Item.children.forEach((subModule2Item) => {
439
- // 功能聚合
440
- let functions = []
441
- if (subModule2Item.children && subModule2Item.children.length > 0) {
442
- subModule2Item.children.forEach((functionItem) => {
443
- // 主功能
444
- const func = {
445
- id: functionItem.id,
446
- name: functionItem.name,
447
- checked: false
448
- }
449
- functions.push(func)
450
- // 子功能
451
- if (functionItem.children && functionItem.children.length > 0) {
452
- functionItem.children.forEach((childFunc) => {
453
- functions.push({
454
- id: childFunc.id,
455
- name: childFunc.name,
456
- checked: false
457
- })
458
- })
459
- }
460
- })
461
- } else {
462
- functions.push({ id: null, name: '全部', checked: false })
463
- }
464
- result.push({
465
- id: `${moduleItem.id}_${subModule1Item.id}_${subModule2Item.id}`,
466
- module: moduleItem.name,
467
- moduleId: moduleItem.id,
468
- subModule1: subModule1Item.name,
469
- subModule1Id: subModule1Item.id,
470
- subModule2: subModule2Item.name,
471
- subModule2Id: subModule2Item.id,
472
- functions
473
- })
474
- })
475
- }
476
- })
477
- })
478
- return result
479
- }
480
-
481
- /**
482
- * 单元格合并计算函数
483
- */
484
- const rowspanAndColspan = ({ row, col, rowIndex, colIndex }) => {
485
- // 功能列合并逻辑
486
- if (col.colKey === 'functions') {
487
- const isFirstRow =
488
- rowIndex === 0 ||
489
- data.value[rowIndex - 1].moduleId !== row.moduleId ||
490
- data.value[rowIndex - 1].subModule1Id !== row.subModule1Id ||
491
- data.value[rowIndex - 1].subModule2Id !== row.subModule2Id
492
- if (isFirstRow) {
493
- let rowspan = 1
494
- for (let i = rowIndex + 1; i < data.value.length; i++) {
495
- if (
496
- data.value[i].moduleId === row.moduleId &&
497
- data.value[i].subModule1Id === row.subModule1Id &&
498
- data.value[i].subModule2Id === row.subModule2Id
499
- ) {
500
- rowspan++
501
- } else {
502
- break
503
- }
504
- }
505
- return { rowspan, colspan: 1 }
506
- }
507
- return { rowspan: 0, colspan: 0 }
508
- }
509
- // 模块列合并逻辑
510
- if (col.colKey === 'module') {
511
- const currentModuleId = row.moduleId
512
- const isFirstRow = rowIndex === 0 || data.value[rowIndex - 1].moduleId !== currentModuleId
513
- if (isFirstRow) {
514
- let rowspan = 1
515
- for (let i = rowIndex + 1; i < data.value.length; i++) {
516
- if (data.value[i].moduleId === currentModuleId) {
517
- rowspan++
518
- } else {
519
- break
520
- }
521
- }
522
- return { rowspan, colspan: 1 }
523
- }
524
- return { rowspan: 0, colspan: 0 }
525
- }
526
- // 子模块1列合并逻辑
527
- if (col.colKey === 'subModule1') {
528
- if (!row.subModule1) return {}
529
- const currentModule = row.moduleId
530
- const currentSubModule1 = row.subModule1Id
531
- const isFirstRow =
532
- rowIndex === 0 ||
533
- data.value[rowIndex - 1].subModule1Id !== currentSubModule1 ||
534
- data.value[rowIndex - 1].moduleId !== currentModule
535
- if (isFirstRow) {
536
- let rowspan = 1
537
- for (let i = rowIndex + 1; i < data.value.length; i++) {
538
- if (data.value[i].moduleId === currentModule && data.value[i].subModule1Id === currentSubModule1) {
539
- rowspan++
540
- } else {
541
- break
542
- }
543
- }
544
- return { rowspan, colspan: 1 }
545
- }
546
- return { rowspan: 0, colspan: 0 }
547
- }
548
- // 子模块2列合并逻辑
549
- if (col.colKey === 'subModule2') {
550
- if (!row.subModule2) return {}
551
- const currentModule = row.moduleId
552
- const currentSubModule1 = row.subModule1Id
553
- const currentSubModule2 = row.subModule2Id
554
- const isFirstRow =
555
- rowIndex === 0 ||
556
- data.value[rowIndex - 1].subModule2Id !== currentSubModule2 ||
557
- data.value[rowIndex - 1].subModule1Id !== currentSubModule1 ||
558
- data.value[rowIndex - 1].moduleId !== currentModule
559
- if (isFirstRow) {
560
- let rowspan = 1
561
- for (let i = rowIndex + 1; i < data.value.length; i++) {
562
- if (
563
- data.value[i].moduleId === currentModule &&
564
- data.value[i].subModule1Id === currentSubModule1 &&
565
- data.value[i].subModule2Id === currentSubModule2
566
- ) {
567
- rowspan++
568
- } else {
569
- break
570
- }
571
- }
572
- return { rowspan, colspan: 1 }
573
- }
574
- return { rowspan: 0, colspan: 0 }
575
- }
576
- return {} // 其他列不合并
577
- }
578
-
579
- // 勾选模块时联动所有下级
580
- const handleModuleCheck = (row, checked) => {
581
- row.moduleChecked = checked
582
- data.value.forEach((item) => {
583
- if (item.moduleId === row.moduleId) {
584
- item.subModule1Checked = checked
585
- item.subModule2Checked = checked
586
- item.functions.forEach((func) => (func.checked = checked))
587
- }
588
- })
589
- }
590
-
591
- // 勾选子模块1时联动所有下级
592
- const handleSubModule1Check = (row, checked) => {
593
- row.subModule1Checked = checked
594
- data.value.forEach((item) => {
595
- if (item.moduleId === row.moduleId && item.subModule1Id === row.subModule1Id) {
596
- item.subModule2Checked = checked
597
- item.functions.forEach((func) => (func.checked = checked))
598
- }
599
- })
600
- // 向上联动模块
601
- updateModuleChecked(row.moduleId)
602
- }
603
-
604
- // 勾选子模块2时联动所有下级
605
- const handleSubModule2Check = (row, checked) => {
606
- row.subModule2Checked = checked
607
- data.value.forEach((item) => {
608
- if (
609
- item.moduleId === row.moduleId &&
610
- item.subModule1Id === row.subModule1Id &&
611
- item.subModule2Id === row.subModule2Id
612
- ) {
613
- item.functions.forEach((func) => (func.checked = checked))
614
- }
615
- })
616
- // 向上联动子模块1
617
- updateSubModule1Checked(row.moduleId, row.subModule1Id)
618
- }
619
-
620
- // 勾选功能时,自动判断父级
621
- const handleFunctionCheck = (row, func, checked) => {
622
- func.checked = checked
623
- // 判断本组所有功能是否全选
624
- const allChecked = row.functions.every((f) => f.checked)
625
- row.subModule2Checked = allChecked
626
- // 向上联动
627
- updateSubModule1Checked(row.moduleId, row.subModule1Id)
628
- }
629
-
630
- // 更新子模块1的勾选状态
631
- const updateSubModule1Checked = (moduleId, subModule1Id) => {
632
- // 找到所有同模块+同子模块1的行
633
- const group = data.value.filter((item) => item.moduleId === moduleId && item.subModule1Id === subModule1Id)
634
- const allChecked = group.every((item) => item.subModule2Checked)
635
- group.forEach((item) => {
636
- item.subModule1Checked = allChecked
637
- })
638
- // 向上联动模块
639
- updateModuleChecked(moduleId)
640
- }
641
-
642
- // 更新模块的勾选状态
643
- const updateModuleChecked = (moduleId) => {
644
- const group = data.value.filter((item) => item.moduleId === moduleId)
645
- const allChecked = group.every((item) => item.subModule1Checked)
646
- group.forEach((item) => {
647
- item.moduleChecked = allChecked
648
- })
649
- }
650
-
651
- // 单元格点击事件
652
- const handleCellClick = (context) => {
653
- console.log('单元格点击:', context)
654
- }
655
-
656
- // 详情弹窗相关
657
- const detailDialogVisible = ref(false)
658
- const detailDialogTitle = ref('详情')
659
- const currentRow = ref(null)
660
-
661
-
662
- // 数据权限弹窗相关
663
- const permissionDialogVisible = ref(false)
664
- const permissionDialogTitle = ref('数据权限配置')
665
- const selectedPermission = ref(1) // 默认选择全部数据
666
-
667
- // 组织架构树相关
668
- const orgTreeData = ref([])
669
- const keyWord = ref('')
670
- const filteredOrgTreeData = computed(() => {
671
- if (!keyWord.value) return orgTreeData.value
672
- return filterTreeNodes(orgTreeData.value, keyWord.value)
673
- })
674
- const orgTreeKeys = {
675
- label: 'name',
676
- value: 'id',
677
- children: 'childs'
678
- }
679
- const expandedKeys = ref([])
680
- const activeKey = ref(null)
681
- const selectedOrgs = ref([])
682
-
683
- // 过滤树节点函数
684
- const filterTreeNodes = (nodes, keyword) => {
685
- if (!nodes || !Array.isArray(nodes)) return []
686
-
687
- const filtered = []
688
-
689
- for (const node of nodes) {
690
- // 创建节点副本,避免修改原始数据
691
- const newNode = { ...node }
692
-
693
- // 检查当前节点名称是否包含关键词
694
- const matchesKeyword = node.name && node.name.toLowerCase().includes(keyword.toLowerCase())
695
-
696
- // 递归过滤子节点
697
- let filteredChildren = []
698
- if (node.childs && node.childs.length > 0) {
699
- filteredChildren = filterTreeNodes(node.childs, keyword)
700
- }
701
-
702
- // 如果当前节点匹配或者有匹配的子节点,则保留
703
- if (matchesKeyword || filteredChildren.length > 0) {
704
- if (filteredChildren.length > 0) {
705
- newNode.childs = filteredChildren
706
- }
707
- filtered.push(newNode)
708
- }
709
- }
710
-
711
- return filtered
712
- }
713
-
714
- // 处理组织节点选中
715
- const handleOrgNodeSelect = (node, checked) => {
716
- if (checked) {
717
- // 检查是否已经存在
718
- if (!selectedOrgs.value.find((org) => org.id === node.id)) {
719
- selectedOrgs.value.push({
720
- id: node.id,
721
- name: node.name
722
- })
723
- }
724
- } else {
725
- // 从已选中中移除
726
- removeSelectedOrg(node.id)
727
- }
728
- }
729
-
730
- // 移除选中的组织
731
- const removeSelectedOrg = (id) => {
732
- const index = selectedOrgs.value.findIndex((org) => org.id === id)
733
- if (index !== -1) {
734
- selectedOrgs.value.splice(index, 1)
735
- }
736
- }
737
-
738
- // 清空已选择的组织
739
- const clearSelectedOrgs = () => {
740
- selectedOrgs.value = []
741
- }
742
-
743
- // 检查节点是否已被选中
744
- const isOrgNodeSelected = (id) => {
745
- return selectedOrgs.value.some((org) => org.id === id)
746
- }
747
-
748
- // 切换组织节点选中状态
749
- const toggleOrgNodeSelect = (node) => {
750
- const isSelected = isOrgNodeSelected(node.id)
751
- handleOrgNodeSelect(node, !isSelected)
752
- }
753
-
754
- // 处理组织节点激活
755
- const handleOrgNodeActive = (value) => {
756
- activeKey.value = value
757
- }
758
-
759
- // 处理组织节点展开
760
- const handleOrgNodeExpand = (value) => {
761
- expandedKeys.value = value
762
- }
763
-
764
- // 打开数据权限配置弹窗
765
- const openPermissionDialog = (row) => {
766
- currentRow.value = row
767
- // 检查是否已有自定义配置
768
- if (row.hasCustomConfig) {
769
- // 已有自定义配置,使用自身配置
770
- selectedPermission.value = row.dataPermission || 1
771
- if (row.dataPermission === 6 && row.selectedOrgs) {
772
- selectedOrgs.value = [...row.selectedOrgs]
773
- } else {
774
- selectedOrgs.value = []
775
- }
776
- } else {
777
- // 没有自定义配置,继承全局配置
778
- selectedPermission.value = globalPermission.value
779
- if (globalPermission.value === 6) {
780
- selectedOrgs.value = [...globalSelectedOrgs.value]
781
- } else {
782
- selectedOrgs.value = []
783
- }
784
- }
785
- expandedKeys.value = ['1']
786
- let title = '数据权限配置: '
787
- if (row.module) title += row.module
788
- if (row.subModule1 && row.subModule1 !== row.module) title += ' - ' + row.subModule1
789
- if (row.subModule2 && row.subModule2 !== row.subModule1) title += ' - ' + row.subModule2
790
- if (row.functions && row.functions.length === 1 && row.functions[0].name !== '全部')
791
- title += ' - ' + row.functions[0].name
792
- permissionDialogTitle.value = title
793
- permissionDialogVisible.value = true
794
- }
795
-
796
- // 全局数据权限相关
797
- const globalPermission = ref(1) // 默认全部数据
798
- const globalSelectedOrgs = ref([])
799
- const tempGlobalSelectedOrgs = ref([])
800
- const globalOrgDialogVisible = ref(false)
801
-
802
- // 打开全局组织选择器
803
- const openGlobalOrgSelector = () => {
804
- // 初始化临时选择的组织列表
805
- tempGlobalSelectedOrgs.value = [...globalSelectedOrgs.value]
806
-
807
- // 加载组织架构树数据
808
- expandedKeys.value = ['1'] // 默认展开第一级
809
-
810
- globalOrgDialogVisible.value = true
811
- }
812
-
813
- // 全局组织节点选择相关函数
814
- const handleGlobalOrgNodeSelect = (node, checked) => {
815
- if (checked) {
816
- // 检查是否已经存在
817
- if (!tempGlobalSelectedOrgs.value.find((org) => org.id === node.id)) {
818
- tempGlobalSelectedOrgs.value.push({
819
- id: node.id,
820
- name: node.name
821
- })
822
- }
823
- } else {
824
- // 从已选中中移除
825
- removeGlobalSelectedOrg(node.id)
826
- }
827
- }
828
-
829
- // 移除选中的全局组织(对话框中使用)
830
- const removeGlobalSelectedOrg = (id) => {
831
- console.log('移除临时全局组织', id);
832
- const index = tempGlobalSelectedOrgs.value.findIndex((org) => org.id === id);
833
- if (index !== -1) {
834
- tempGlobalSelectedOrgs.value.splice(index, 1);
835
- console.log('移除成功,剩余组织数量:', tempGlobalSelectedOrgs.value.length);
836
- } else {
837
- console.log('未找到对应组织');
838
- }
839
- }
840
-
841
- // 直接从全局组织中移除(主界面使用)
842
- const removeGlobalOrg = (id) => {
843
- const index = globalSelectedOrgs.value.findIndex((org) => org.id === id)
844
- if (index !== -1) {
845
- globalSelectedOrgs.value.splice(index, 1)
846
- }
847
- }
848
-
849
- // 清空已选择的全局组织(用于弹窗中)
850
- const clearGlobalSelectedOrgs = () => {
851
- tempGlobalSelectedOrgs.value = []
852
- }
853
-
854
- // 清空主界面已选择的全局组织
855
- const clearGlobalOrgs = () => {
856
- globalSelectedOrgs.value = []
857
- }
858
-
859
- // 检查全局节点是否已被选中
860
- const isGlobalOrgNodeSelected = (id) => {
861
- return tempGlobalSelectedOrgs.value.some((org) => org.id === id)
862
- }
863
-
864
- // 切换全局组织节点选中状态
865
- const toggleGlobalOrgNodeSelect = (node) => {
866
- const isSelected = isGlobalOrgNodeSelected(node.id)
867
- handleGlobalOrgNodeSelect(node, !isSelected)
868
- }
869
-
870
- // 确认全局组织选择
871
- const handleGlobalOrgConfirm = () => {
872
- // 保存选择结果
873
- globalSelectedOrgs.value = [...tempGlobalSelectedOrgs.value]
874
-
875
- // 应用到未配置自定义数据权限的行
876
- applyGlobalOrgsToCustomRows()
877
-
878
- globalOrgDialogVisible.value = false
879
- }
880
-
881
- // 取消全局组织选择
882
- const handleGlobalOrgCancel = () => {
883
- globalOrgDialogVisible.value = false
884
- }
885
-
886
- // 将全局组织应用到未配置自定义数据权限的行
887
- const applyGlobalOrgsToCustomRows = () => {
888
- // 遍历每一行数据
889
- data.value.forEach((row) => {
890
- // 只对没有自定义配置的行应用全局设置
891
- if (!row.hasCustomConfig) {
892
- // 应用全局权限设置
893
- row.dataPermission = globalPermission.value
894
-
895
- // 如果全局设置是自定义数据权限,则应用全局选择的组织
896
- if (globalPermission.value === 6) {
897
- row.selectedOrgs = [...globalSelectedOrgs.value]
898
- } else {
899
- row.selectedOrgs = []
900
- }
901
- }
902
- })
903
- }
904
-
905
- // 确认权限配置(修改处理全局配置的情况)
906
- const handlePermissionConfirm = () => {
907
- if (currentRow.value) {
908
- // 标记该行已有自定义配置
909
- currentRow.value.hasCustomConfig = true;
910
- currentRow.value.dataPermission = selectedPermission.value
911
- if (selectedPermission.value === 6) {
912
- currentRow.value.selectedOrgs = [...selectedOrgs.value]
913
- } else {
914
- currentRow.value.selectedOrgs = []
915
- }
916
- }
917
- permissionDialogVisible.value = false
918
- }
919
-
920
- // 取消权限配置(修改处理全局配置的情况)
921
- const handlePermissionCancel = () => {
922
- // 只关闭弹窗,不做其他操作
923
- permissionDialogVisible.value = false
924
- }
925
-
926
- // 获取匹配的节点总数
927
- const getMatchedCount = (nodes) => {
928
- if (!nodes || !Array.isArray(nodes)) return 0
929
-
930
- let count = nodes.length
931
-
932
- for (const node of nodes) {
933
- if (node.childs && node.childs.length > 0) {
934
- count += getMatchedCount(node.childs)
935
- }
936
- }
937
-
938
- return count
939
- }
940
-
941
- // 新增的搜索函数
942
- const onOrgSearch = () => {
943
- dataService
944
- .fetch(
945
- {
946
- postEnable: false,
947
- keyWord: keyWord.value
948
- },
949
- {},
950
- apis.orgTree
951
- )
952
- .then(async (res) => {
953
- orgTreeData.value = res;
954
- if (props.type === 'post') {
955
- roleId.value = (await dataService.fetch({}, {}, apis.getRole.replace('{positionId}', props.id))).id
956
- } else {
957
- roleId.value = props.id;
958
- }
959
- if (!roleId.value) return;
960
- let timer = setInterval(() => {
961
- if (data.value.length > 0) {
962
- clearInterval(timer)
963
- getRoleConfig()
964
- }
965
- }, 500);
966
- dataService.fetch({}, {}, apis.gerRoleInfo.replace('{id}', roleId.value)).then(res => {
967
- globalPermission.value = res.dataScope;
968
- // 使用递归查找函数获取完整组织信息
969
- globalSelectedOrgs.value = [...res.deptIds].map(id => {
970
- const org = findOrgInTree(orgTreeData.value, id);
971
- return {
972
- id: id,
973
- name: org ? org.name : `组织${id}` // 如果找不到组织,提供一个默认名称
974
- };
975
- });
976
- // 查询角色信息
977
- })
978
- })
979
- }
980
- onOrgSearch()
981
-
982
- // 计算选中的数据权限结构
983
- const computedSelectedData = computed(() => {
984
- // 全局数据权限
985
- const dataScope = globalPermission.value
986
- const deptIds = globalSelectedOrgs.value.map((org) => org.id)
987
- // 功能明细
988
- const functionList = []
989
- data.value.forEach((row) => {
990
- // 只处理有选中功能的行
991
- const checkedFunctionIds = row.functions
992
- .filter((f) => f.checked)
993
- .map((f) => f.id)
994
- .filter(Boolean)
995
- if (checkedFunctionIds.length > 0) {
996
- functionList.push({
997
- functionIds: checkedFunctionIds,
998
- dataScope: row.dataPermission || undefined,
999
- deptIds:
1000
- row.dataPermission === 6 && row.selectedOrgs && row.selectedOrgs.length > 0
1001
- ? row.selectedOrgs.map((org) => org.id)
1002
- : []
1003
- })
1004
- }
1005
- })
1006
- let role = {
1007
- dataScope,
1008
- deptIds,
1009
- }
1010
- if (roleId.value) {
1011
- role.id = roleId.value
1012
- } else {
1013
- role.positionId = props.id
1014
- }
1015
- return {
1016
- role,
1017
- functionList
1018
- }
1019
- })
1020
-
1021
- watch(globalPermission, (val) => {
1022
- if (val !== 6) {
1023
- globalSelectedOrgs.value = []
1024
- }
1025
- })
1026
-
1027
- function handleSaveRolePermission() {
1028
- // 这里可以调用API或打印computedSelectedData
1029
- console.log('保存角色权限:', computedSelectedData.value)
1030
- dataService.fetch(
1031
- computedSelectedData.value,
1032
- {},
1033
- apis.saveRole
1034
- ).then(res => {
1035
- if (!res) {
1036
- Message.error('保存失败')
1037
- return
1038
- }
1039
- emits('success')
1040
- })
1041
- }
1042
-
1043
- // 暴露表格引用和方法
1044
- defineExpose({
1045
- selData: computedSelectedData
1046
- })
1047
-
1048
- // 先添加一个从树形结构中递归查找组织的辅助函数
1049
- const findOrgInTree = (tree, id) => {
1050
- if (!tree || !Array.isArray(tree)) return null;
1051
-
1052
- // 先在当前层级查找
1053
- const found = tree.find(item => item.id === id);
1054
- if (found) return found;
1055
-
1056
- // 如果当前层级没找到,递归查找子节点
1057
- for (const node of tree) {
1058
- if (node.childs && node.childs.length > 0) {
1059
- const foundInChild = findOrgInTree(node.childs, id);
1060
- if (foundInChild) return foundInChild;
1061
- }
1062
- }
1063
-
1064
- return null; // 未找到
1065
- };
1066
-
1067
- // 添加用于更新父级勾选状态的辅助函数
1068
- const updateParentCheckStatus = (row) => {
1069
- // 判断当前行的功能是否全部勾选
1070
- const allFunctionsChecked = row.functions.every(func => func.checked);
1071
-
1072
- // 更新子模块2的勾选状态
1073
- if (row.subModule2) {
1074
- // 寻找同组的所有行
1075
- const sameGroup = data.value.filter(item =>
1076
- item.moduleId === row.moduleId &&
1077
- item.subModule1Id === row.subModule1Id &&
1078
- item.subModule2Id === row.subModule2Id
1079
- );
1080
-
1081
- // 判断同组的所有行是否全部勾选了功能
1082
- const allRowsChecked = sameGroup.every(item =>
1083
- item.functions.every(func => func.checked)
1084
- );
1085
-
1086
- // 更新子模块2的勾选状态
1087
- sameGroup.forEach(item => {
1088
- item.subModule2Checked = allRowsChecked;
1089
- });
1090
- }
1091
-
1092
- // 更新子模块1的勾选状态
1093
- updateSubModule1Checked(row.moduleId, row.subModule1Id);
1094
- }
1095
- </script>
1096
-
1097
- <style lang="less" scoped>
1098
- .cell-with-checkbox {
1099
- display: flex;
1100
- align-items: center;
1101
-
1102
- .cell-text {
1103
- margin-left: 8px;
1104
- }
1105
-
1106
- .empty-cell {
1107
- color: #ccc;
1108
- font-style: italic;
1109
- }
1110
- }
1111
-
1112
- .functions-container {
1113
- display: flex;
1114
- flex-wrap: wrap;
1115
- gap: 12px;
1116
-
1117
- .function-item {
1118
- display: flex;
1119
- align-items: center;
1120
- margin-right: 12px;
1121
-
1122
- .cell-text {
1123
- margin-left: 8px;
1124
- }
1125
- }
1126
- }
1127
-
1128
- .operation-buttons {
1129
- display: flex;
1130
- justify-content: center;
1131
- }
1132
-
1133
- .permission-content {
1134
- padding: 20px 0;
1135
-
1136
- .permission-item {
1137
- .permission-options {
1138
- margin-bottom: 20px;
1139
-
1140
- :deep(.t-radio-group) {
1141
- display: flex;
1142
- flex-wrap: wrap;
1143
-
1144
- .t-radio-button {
1145
- margin-bottom: 10px;
1146
- margin-right: 0;
1147
- }
1148
- }
1149
- }
1150
- }
1151
- }
1152
-
1153
- .custom-permission {
1154
- margin-top: 16px;
1155
- }
1156
-
1157
- .org-selector-dialog {
1158
- padding: 0;
1159
- }
1160
-
1161
- // 组织选择器弹窗样式
1162
- .org-dialog-container {
1163
- display: flex;
1164
- height: 400px;
1165
- border: 1px solid #eaeaea;
1166
- border-radius: 4px;
1167
- overflow: hidden;
1168
- }
1169
-
1170
- .org-left-panel {
1171
- flex: 1;
1172
- display: flex;
1173
- flex-direction: column;
1174
- border-right: 1px solid #eaeaea;
1175
- }
1176
-
1177
- .org-panel-header {
1178
- padding: 16px;
1179
- font-weight: 500;
1180
- color: #181818;
1181
- font-size: 14px;
1182
- border-bottom: 1px solid #eaeaea;
1183
- background-color: #f5f5f5;
1184
- display: flex;
1185
- justify-content: space-between;
1186
- align-items: center;
1187
- }
1188
-
1189
- .org-search-container {
1190
- padding: 12px 16px;
1191
- border-bottom: 1px solid #eaeaea;
1192
-
1193
- :deep(.t-input) {
1194
- border-radius: 4px;
1195
-
1196
- .t-input__inner {
1197
- height: 32px;
1198
- }
1199
-
1200
- .t-input__suffix-icon {
1201
- cursor: pointer;
1202
- color: #999;
1203
-
1204
- &:hover {
1205
- color: var(--td-brand-color);
1206
- }
1207
- }
1208
- }
1209
-
1210
- .search-result-info {
1211
- font-size: 12px;
1212
- color: #999;
1213
- margin-top: 8px;
1214
- }
1215
- }
1216
-
1217
- .org-tree-container {
1218
- flex: 1;
1219
- overflow: auto;
1220
- padding: 16px;
1221
- }
1222
-
1223
- .org-right-panel {
1224
- width: 300px;
1225
- display: flex;
1226
- flex-direction: column;
1227
- }
1228
-
1229
- .org-selected-container {
1230
- flex: 1;
1231
- overflow: auto;
1232
- padding: 16px;
1233
- background-color: #fcfcfc;
1234
- }
1235
-
1236
- .selected-orgs-tags {
1237
- display: flex;
1238
- flex-wrap: wrap;
1239
- gap: 8px;
1240
-
1241
- .org-tag {
1242
- margin: 0;
1243
- white-space: nowrap;
1244
- transition: all 0.2s ease;
1245
- border-radius: 4px;
1246
- cursor: pointer;
1247
-
1248
- &:hover {
1249
- box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
1250
- transform: translateY(-1px);
1251
- }
1252
- }
1253
- }
1254
-
1255
- .no-selected-tip {
1256
- color: #999;
1257
- text-align: center;
1258
- padding: 60px 0;
1259
- font-size: 14px;
1260
- }
1261
-
1262
- .detail-content {
1263
- padding: 16px;
1264
-
1265
- .detail-item {
1266
- margin-bottom: 16px;
1267
-
1268
- .item-label {
1269
- font-weight: bold;
1270
- margin-right: 8px;
1271
- color: #666;
1272
- }
1273
-
1274
- .item-value {
1275
- color: #333;
1276
- }
1277
-
1278
- .sub-functions {
1279
- margin-top: 8px;
1280
-
1281
- .sub-function-item {
1282
- padding: 4px 0;
1283
- border-bottom: 1px dashed #eee;
1284
-
1285
- &:last-child {
1286
- border-bottom: none;
1287
- }
1288
- }
1289
- }
1290
- }
1291
- }
1292
-
1293
- .tree-node-label {
1294
- cursor: pointer;
1295
- padding: 4px 0;
1296
- user-select: none;
1297
-
1298
- &:hover {
1299
- color: var(--td-brand-color);
1300
- }
1301
-
1302
- &.selected {
1303
- color: var(--td-brand-color);
1304
- font-weight: 500;
1305
- }
1306
- }
1307
-
1308
- // 数据权限配置面板样式
1309
- .permission-config-panel {
1310
- margin-bottom: 16px;
1311
- border: 1px solid #e7e7e7;
1312
- border-radius: 6px;
1313
- overflow: hidden;
1314
- background-color: #fff;
1315
-
1316
- .panel-header {
1317
- background-color: #f5f5f5;
1318
- padding: 12px 16px;
1319
- border-bottom: 1px solid #e7e7e7;
1320
-
1321
- .panel-title {
1322
- margin: 0;
1323
- font-size: 16px;
1324
- font-weight: bold;
1325
- color: #333;
1326
- }
1327
- }
1328
-
1329
- .panel-content {
1330
- padding: 16px;
1331
-
1332
- .permission-type-selector {
1333
- display: flex;
1334
- align-items: center;
1335
- margin-bottom: 16px;
1336
-
1337
- .permission-radio-group {
1338
- display: flex;
1339
- flex-wrap: wrap;
1340
-
1341
- :deep(.t-radio-button) {
1342
- margin-bottom: 10px;
1343
- margin-right: 0;
1344
- }
1345
- }
1346
- }
1347
-
1348
- .org-select-row {
1349
- display: flex;
1350
- align-items: center;
1351
- margin-bottom: 16px;
1352
-
1353
- .selected-count {
1354
- color: #666;
1355
- margin-right: 12px;
1356
- }
1357
-
1358
- .org-select-btn {
1359
- height: 32px;
1360
- }
1361
- }
1362
-
1363
- .selected-orgs-panel {
1364
- display: flex;
1365
- flex-direction: column;
1366
- border: 1px solid #eaeaea;
1367
- border-radius: 4px;
1368
- margin-top: 16px;
1369
-
1370
- .selected-orgs-header {
1371
- display: flex;
1372
- justify-content: space-between;
1373
- align-items: center;
1374
- padding: 10px 16px;
1375
- font-size: 14px;
1376
- color: #181818;
1377
- border-bottom: 1px solid #eaeaea;
1378
- background-color: #f5f5f5;
1379
- }
1380
-
1381
- .selected-orgs-content {
1382
- padding: 16px;
1383
- min-height: 80px;
1384
-
1385
- .no-org-selected {
1386
- color: #999;
1387
- text-align: center;
1388
- padding: 20px 0;
1389
- }
1390
-
1391
- .selected-orgs-tags {
1392
- display: flex;
1393
- flex-wrap: wrap;
1394
- gap: 8px;
1395
-
1396
- .org-tag {
1397
- margin: 0;
1398
- overflow: hidden;
1399
- text-overflow: ellipsis;
1400
- white-space: nowrap;
1401
- }
1402
- }
1403
- }
1404
- }
1405
- }
1406
- }
1407
-
1408
- .no-search-results {
1409
- text-align: center;
1410
- padding: 30px 0;
1411
- color: #999;
1412
- font-size: 14px;
1413
- }
1414
- </style>
1
+ <template>
2
+ <div>
3
+ <!-- 选中数据结构展示 -->
4
+ <!-- <div style="margin-bottom: 16px">
5
+ <t-card title="选中数据结构(JSON)">
6
+ <pre style="background: #f6f8fa; padding: 12px 16px; border-radius: 6px; overflow: auto; max-height: 300px"
7
+ >{{ JSON.stringify(computedSelectedData, null, 2) }}
8
+ </pre>
9
+ </t-card>
10
+ </div> -->
11
+ <!-- 树表上方的数据权限配置模块 -->
12
+ <div class="permission-config-panel">
13
+ <div class="panel-header">
14
+ <h3 class="panel-title">数据权限配置</h3>
15
+ </div>
16
+ <div class="panel-content">
17
+ <div class="permission-type-selector">
18
+ <t-radio-group v-model="globalPermission" class="permission-radio-group">
19
+ <t-radio-button :value="1">全部数据</t-radio-button>
20
+ <t-radio-button :value="2">事业部数据</t-radio-button>
21
+ <t-radio-button :value="3">本部门数据</t-radio-button>
22
+ <t-radio-button :value="4">子部门数据</t-radio-button>
23
+ <t-radio-button :value="5">个人数据</t-radio-button>
24
+ <t-radio-button :value="6">自定义数据</t-radio-button>
25
+ </t-radio-group>
26
+ </div>
27
+
28
+ <div v-if="globalPermission === 6" class="org-select-row">
29
+ <div class="selected-count">
30
+ {{ globalSelectedOrgs.length > 0 ? '已选择' + globalSelectedOrgs.length + '个组织' : '未选择组织' }}
31
+ </div>
32
+ <t-button theme="primary" @click="openGlobalOrgSelector" class="org-select-btn">
33
+ {{ globalSelectedOrgs.length > 0 ? '编辑' : '选择' }}
34
+ <template #suffix>
35
+ <t-icon name="chevron-right" />
36
+ </template>
37
+ </t-button>
38
+ </div>
39
+
40
+ <div v-if="globalPermission === 6" class="selected-orgs-panel">
41
+ <div class="selected-orgs-header">
42
+ 已选组织:
43
+ <t-button theme="primary" variant="text" size="small" @click="clearGlobalOrgs">清空</t-button>
44
+ </div>
45
+ <div class="selected-orgs-content">
46
+ <div v-if="globalSelectedOrgs.length === 0" class="no-org-selected">请从左侧选择组织</div>
47
+ <div v-else class="selected-orgs-tags">
48
+ <t-tag v-for="org in globalSelectedOrgs" :key="org.id" theme="primary" variant="light" class="org-tag"
49
+ closable @close="removeGlobalOrg(org.id)">
50
+ {{ org.name }}
51
+ </t-tag>
52
+ </div>
53
+ </div>
54
+ </div>
55
+ </div>
56
+ </div>
57
+
58
+ <t-table :bordered="true" :data="data" :columns="columns" row-key="id" :rowspan-and-colspan="rowspanAndColspan"
59
+ resizable table-layout="fixed" lazy-load @cell-click="handleCellClick">
60
+ <!-- 模块列的自定义单元格 -->
61
+ <template #module="{ row }">
62
+ <div class="cell-with-checkbox">
63
+ <t-checkbox v-model="row.moduleChecked" @change="(checked) => handleModuleCheck(row, checked)"></t-checkbox>
64
+ <span class="cell-text">{{ row.module }}</span>
65
+ </div>
66
+ </template>
67
+
68
+ <!-- 子模块1列的自定义单元格 -->
69
+ <template #subModule1="{ row }">
70
+ <div class="cell-with-checkbox">
71
+ <t-checkbox v-model="row.subModule1Checked"
72
+ @change="(checked) => handleSubModule1Check(row, checked)"></t-checkbox>
73
+ <span class="cell-text">{{ row.subModule1 || row.module }}</span>
74
+ </div>
75
+ </template>
76
+
77
+ <!-- 子模块2列的自定义单元格 -->
78
+ <template #subModule2="{ row }">
79
+ <div class="cell-with-checkbox" v-if="row.subModule2">
80
+ <t-checkbox v-model="row.subModule2Checked"
81
+ @change="(checked) => handleSubModule2Check(row, checked)"></t-checkbox>
82
+ <span class="cell-text">{{ row.subModule2 }}</span>
83
+ </div>
84
+ <div v-else class="cell-with-checkbox">
85
+ <span class="cell-text empty-cell">-</span>
86
+ </div>
87
+ </template>
88
+
89
+ <!-- 功能列的自定义单元格 -->
90
+ <template #functions="{ row }">
91
+ <div class="functions-container">
92
+ <div v-for="(func, idx) in row.functions" :key="func.id || idx" class="function-item">
93
+ <t-checkbox v-model="func.checked"
94
+ @change="(checked) => handleFunctionCheck(row, func, checked)"></t-checkbox>
95
+ <span class="cell-text">{{ func.name }}</span>
96
+ </div>
97
+ </div>
98
+ </template>
99
+
100
+ <!-- 操作列的自定义单元格 -->
101
+ <template #operation="{ row }">
102
+ <div class="operation-buttons">
103
+ <t-button theme="primary" size="medium" @click="openPermissionDialog(row)"
104
+ :disabled="!row.functions.some((f) => f.checked)">数据权限配置</t-button>
105
+ </div>
106
+ </template>
107
+
108
+ <slot></slot>
109
+ </t-table>
110
+
111
+ <!-- 新增保存按钮 -->
112
+ <div style="margin-top: 24px; display: flex; justify-content: flex-end">
113
+ <t-button theme="primary" @click="handleSaveRolePermission">保存角色权限</t-button>
114
+ </div>
115
+
116
+ <!-- 全局组织选择弹窗 -->
117
+ <t-dialog v-model:visible="globalOrgDialogVisible" header="选择组织" width="800px" attach="body"
118
+ :confirm-btn="{ content: '确定', theme: 'primary' }" :cancel-btn="{ content: '取消', theme: 'default' }"
119
+ @confirm="handleGlobalOrgConfirm" @cancel="handleGlobalOrgCancel">
120
+ <div class="org-selector-dialog">
121
+ <div class="org-dialog-container">
122
+ <div class="org-left-panel">
123
+ <div class="org-panel-header">组织架构</div>
124
+ <div class="org-search-container">
125
+ <t-input v-model="keyWord" placeholder="请输入关键词搜索" clearable style="width: 100%">
126
+ <template #suffix>
127
+ <t-button theme="default" shape="square" @click="onOrgSearch" size="small">
128
+ <t-icon name="search" />
129
+ </t-button>
130
+ </template>
131
+ </t-input>
132
+ <div v-if="keyWord" class="search-result-info">
133
+ 找到 {{ getMatchedCount(filteredOrgTreeData) }} 个结果
134
+ </div>
135
+ </div>
136
+ <div class="org-tree-container">
137
+ <t-tree :data="filteredOrgTreeData" :keys="orgTreeKeys" activable hover expandAll line
138
+ expand-on-click-node :expanded="expandedKeys" :active="activeKey" @active="handleOrgNodeActive"
139
+ @expand="handleOrgNodeExpand">
140
+ <template #operations="{ node }">
141
+ <t-checkbox :checked="isGlobalOrgNodeSelected(node.data.id)"
142
+ @change="(checked) => handleGlobalOrgNodeSelect(node.data, checked)"></t-checkbox>
143
+ </template>
144
+ <template #label="{ node }">
145
+ <div class="tree-node-label" :class="{ selected: isGlobalOrgNodeSelected(node.data.id) }"
146
+ @click.stop="toggleGlobalOrgNodeSelect(node.data)">
147
+ {{ node.data.name }}
148
+ </div>
149
+ </template>
150
+ </t-tree>
151
+ <div v-if="keyWord && filteredOrgTreeData.length === 0" class="no-search-results">
152
+ 未找到符合"{{ keyWord }}"的组织
153
+ </div>
154
+ </div>
155
+ </div>
156
+ <div class="org-right-panel">
157
+ <div class="org-panel-header">
158
+ <span>已选择组织</span>
159
+ <t-button theme="primary" variant="text" @click="clearGlobalSelectedOrgs">清空</t-button>
160
+ </div>
161
+ <div class="org-selected-container">
162
+ <div v-if="tempGlobalSelectedOrgs.length === 0" class="no-selected-tip">请从左侧选择组织</div>
163
+ <div v-else class="selected-orgs-tags">
164
+ <t-tag v-for="org in tempGlobalSelectedOrgs" :key="org.id" closable @close="removeGlobalSelectedOrg(org.id)"
165
+ theme="primary" variant="light" class="org-tag">
166
+ {{ org.name }}
167
+ </t-tag>
168
+ </div>
169
+ </div>
170
+ </div>
171
+ </div>
172
+ </div>
173
+ </t-dialog>
174
+
175
+ <!-- 数据权限配置弹窗(针对表格行) -->
176
+ <t-dialog v-model:visible="permissionDialogVisible" :header="permissionDialogTitle" width="800px" attach="body"
177
+ :confirm-btn="{ content: '确定', theme: 'primary' }" :cancel-btn="{ content: '取消', theme: 'default' }"
178
+ @confirm="handlePermissionConfirm" @cancel="handlePermissionCancel">
179
+ <div class="permission-content">
180
+ <template v-if="currentRow">
181
+ <div class="permission-item">
182
+ <div class="permission-options">
183
+ <t-radio-group v-model="selectedPermission">
184
+ <t-radio-button :value="1">全部数据</t-radio-button>
185
+ <t-radio-button :value="2">事业部数据</t-radio-button>
186
+ <t-radio-button :value="3">本部门数据</t-radio-button>
187
+ <t-radio-button :value="4">子部门数据</t-radio-button>
188
+ <t-radio-button :value="5">个人数据</t-radio-button>
189
+ <t-radio-button :value="6">自定义数据</t-radio-button>
190
+ </t-radio-group>
191
+ </div>
192
+
193
+ <div v-if="selectedPermission === 6" class="custom-permission">
194
+ <div class="org-dialog-container">
195
+ <div class="org-left-panel">
196
+ <div class="org-panel-header">组织架构</div>
197
+ <div class="org-search-container">
198
+ <t-input v-model="keyWord" placeholder="请输入关键词搜索" clearable style="width: 100%">
199
+ <template #suffix>
200
+ <t-button theme="default" shape="square" @click="onOrgSearch" size="small">
201
+ <t-icon name="search" />
202
+ </t-button>
203
+ </template>
204
+ </t-input>
205
+ <div v-if="keyWord" class="search-result-info">
206
+ 找到 {{ getMatchedCount(filteredOrgTreeData) }} 个结果
207
+ </div>
208
+ </div>
209
+ <div class="org-tree-container">
210
+ <t-tree :data="filteredOrgTreeData" :keys="orgTreeKeys" activable hover expandAll line
211
+ expand-on-click-node :expanded="expandedKeys" :active="activeKey" @active="handleOrgNodeActive"
212
+ @expand="handleOrgNodeExpand">
213
+ <template #operations="{ node }">
214
+ <t-checkbox :checked="isOrgNodeSelected(node.data.id)"
215
+ @change="(checked) => handleOrgNodeSelect(node.data, checked)"></t-checkbox>
216
+ </template>
217
+ <template #label="{ node }">
218
+ <div class="tree-node-label" :class="{ selected: isOrgNodeSelected(node.data.id) }"
219
+ @click.stop="toggleOrgNodeSelect(node.data)">
220
+ {{ node.data.name }}
221
+ </div>
222
+ </template>
223
+ </t-tree>
224
+ <div v-if="keyWord && filteredOrgTreeData.length === 0" class="no-search-results">
225
+ 未找到符合"{{ keyWord }}"的组织
226
+ </div>
227
+ </div>
228
+ </div>
229
+ <div class="org-right-panel">
230
+ <div class="org-panel-header">
231
+ <span>已选择组织</span>
232
+ <t-button theme="primary" variant="text" @click="clearSelectedOrgs">清空</t-button>
233
+ </div>
234
+ <div class="org-selected-container">
235
+ <div v-if="selectedOrgs.length === 0" class="no-selected-tip">请从左侧选择组织</div>
236
+ <div v-else class="selected-orgs-tags">
237
+ <t-tag v-for="org in selectedOrgs" :key="org.id" closable @close="removeSelectedOrg(org.id)"
238
+ theme="primary" variant="light" class="org-tag">
239
+ {{ org.name }}
240
+ </t-tag>
241
+ </div>
242
+ </div>
243
+ </div>
244
+ </div>
245
+ </div>
246
+ </div>
247
+ </template>
248
+ </div>
249
+ </t-dialog>
250
+
251
+ <!-- 保留原有的详情弹窗 -->
252
+ <t-dialog v-model:visible="detailDialogVisible" :header="detailDialogTitle" width="600px" :footer="false">
253
+ <div class="detail-content">
254
+ <template v-if="currentRow">
255
+ <div class="detail-item">
256
+ <span class="item-label">模块:</span>
257
+ <span class="item-value">{{ currentRow.module }}</span>
258
+ </div>
259
+
260
+ <div class="detail-item" v-if="currentRow.subModule1">
261
+ <span class="item-label">子模块1:</span>
262
+ <span class="item-value">{{ currentRow.subModule1 }}</span>
263
+ </div>
264
+
265
+ <div class="detail-item" v-if="currentRow.subModule2">
266
+ <span class="item-label">子模块2:</span>
267
+ <span class="item-value">{{ currentRow.subModule2 }}</span>
268
+ </div>
269
+
270
+ <div class="detail-item">
271
+ <span class="item-label">功能:</span>
272
+ <span class="item-value">{{ currentRow.function }}</span>
273
+ </div>
274
+
275
+ <div class="detail-item" v-if="currentRow.path">
276
+ <span class="item-label">路径:</span>
277
+ <span class="item-value">{{ currentRow.path }}</span>
278
+ </div>
279
+
280
+ <div class="detail-item" v-if="currentRow.childFunctions && currentRow.childFunctions.length > 0">
281
+ <span class="item-label">子功能:</span>
282
+ <div class="sub-functions">
283
+ <div v-for="(func, index) in currentRow.childFunctions" :key="index" class="sub-function-item">
284
+ <span>{{ func.name }}</span>
285
+ </div>
286
+ </div>
287
+ </div>
288
+ </template>
289
+ </div>
290
+ </t-dialog>
291
+ </div>
292
+ </template>
293
+
294
+ <script>
295
+ export default {
296
+ name: 'EbizTreeMergeTable'
297
+ }
298
+ </script>
299
+
300
+ <script setup>
301
+ import dataService from '../apiService/simpleDataService'
302
+ import { ref, computed, onMounted, watch } from 'vue'
303
+ import {
304
+ Table as TTable,
305
+ Checkbox as TCheckbox,
306
+ Button as TButton,
307
+ Dialog as TDialog,
308
+ RadioGroup as TRadioGroup,
309
+ RadioButton as TRadioButton,
310
+ Input as TInput,
311
+ Tree as TTree,
312
+ Tag as TTag,
313
+ Icon as TIcon,
314
+ Message
315
+ } from 'tdesign-vue-next'
316
+
317
+ const apis = {
318
+ // tree: '/menu/tree',
319
+ tree: '/function/tree',
320
+ orgTree: '/appdata/execute/plugin?key=organizational_structure',
321
+ getConfig: '/role/functions/search/{roleId}',
322
+ getRole: '/role/position/{positionId}',
323
+ gerRoleInfo: '/role/detail/{id}',
324
+ saveRole: '/role/save'
325
+ }
326
+
327
+ const props = defineProps({
328
+ type: {
329
+ type: String,
330
+ default: 'role' // role,post 角色,岗位
331
+ },
332
+ id: {
333
+ type: String,
334
+ default: ''
335
+ }
336
+ })
337
+ const emits = defineEmits(['success'])
338
+ const roleId = ref()
339
+
340
+ const data = ref([])
341
+ // 表格列配置,添加自定义单元格插槽
342
+ const columns = [
343
+ { colKey: 'module', title: '模块', width: 150, cell: 'module' },
344
+ { colKey: 'subModule1', title: '子模块1', width: 150, cell: 'subModule1' },
345
+ { colKey: 'subModule2', title: '子模块2', width: 150, cell: 'subModule2' },
346
+ { colKey: 'functions', title: '功能', width: 300, cell: 'functions' },
347
+ { colKey: 'operation', title: '操作', width: 100, cell: 'operation', fixed: 'right' }
348
+ ]
349
+
350
+
351
+ // 获取数据并处理
352
+ dataService.fetch({}, {}, apis.tree).then((res) => {
353
+ const processedData = processTreeData(res || [])
354
+ // 为每行数据添加选中状态属性
355
+ processedData.forEach((row) => {
356
+ // 添加选中状态属性
357
+ row.moduleChecked = false
358
+ row.subModule1Checked = false
359
+ row.subModule2Checked = false
360
+ row.functionChecked = false
361
+ })
362
+ data.value = processedData;
363
+ })
364
+ function getRoleConfig() {
365
+ dataService.fetch({}, {}, apis.getConfig.replace('{roleId}', roleId.value || props.id)).then((res) => {
366
+ res.forEach(item => {
367
+ // 获取functionId
368
+ const functionId = item.functionId;
369
+ // 在data.value中查找对应功能所在的行
370
+ data.value.forEach(row => {
371
+ // 检查functions数组中是否有匹配的功能
372
+ const matchedFunction = row.functions.find(func => func.id === functionId);
373
+ if (matchedFunction) {
374
+ // 设置功能勾选状态为true
375
+ matchedFunction.checked = true;
376
+
377
+ // 保存数据权限配置(如果有)
378
+ if (item.dataScope) {
379
+ row.dataPermission = item.dataScope;
380
+ // 标记为自定义配置
381
+ row.hasCustomConfig = true;
382
+ // 如果是自定义数据权限,则设置已选组织
383
+ if (item.dataScope === 6 && item.deptIds && item.deptIds.length > 0) {
384
+ row.selectedOrgs = item.deptIds.map(id => {
385
+ const org = findOrgInTree(orgTreeData.value, id);
386
+ return {
387
+ id: id,
388
+ name: org ? org.name : `组织${id}`
389
+ };
390
+ });
391
+ }
392
+ }
393
+
394
+ // 更新父级勾选状态(模块、子模块)
395
+ updateParentCheckStatus(row);
396
+ }
397
+ });
398
+ });
399
+ })
400
+ }
401
+ /**
402
+ * 处理树形数据,生成四级结构(模块、子模块1、子模块2、功能列表)
403
+ * @param {Array} treeData 原始树形数据
404
+ * @returns {Array} 扁平化处理后的数据
405
+ */
406
+ const processTreeData = (treeData) => {
407
+ const result = []
408
+ // 处理第一级:模块
409
+ treeData.forEach((moduleItem) => {
410
+ if (!moduleItem.children || moduleItem.children.length === 0) {
411
+ // 没有子模块,功能为全部
412
+ result.push({
413
+ id: `${moduleItem.id}_all`,
414
+ module: moduleItem.name,
415
+ moduleId: moduleItem.id,
416
+ subModule1: null,
417
+ subModule1Id: null,
418
+ subModule2: null,
419
+ subModule2Id: null,
420
+ functions: [{ id: null, name: '全部', checked: false }]
421
+ })
422
+ return
423
+ }
424
+ moduleItem.children.forEach((subModule1Item) => {
425
+ if (!subModule1Item.children || subModule1Item.children.length === 0) {
426
+ // 没有子模块2,功能为全部
427
+ result.push({
428
+ id: `${moduleItem.id}_${subModule1Item.id}_all`,
429
+ module: moduleItem.name,
430
+ moduleId: moduleItem.id,
431
+ subModule1: subModule1Item.name,
432
+ subModule1Id: subModule1Item.id,
433
+ subModule2: null,
434
+ subModule2Id: null,
435
+ functions: [{ id: null, name: '全部', checked: false }]
436
+ })
437
+ } else {
438
+ subModule1Item.children.forEach((subModule2Item) => {
439
+ // 功能聚合
440
+ let functions = []
441
+ if (subModule2Item.children && subModule2Item.children.length > 0) {
442
+ subModule2Item.children.forEach((functionItem) => {
443
+ // 主功能
444
+ const func = {
445
+ id: functionItem.id,
446
+ name: functionItem.name,
447
+ checked: false
448
+ }
449
+ functions.push(func)
450
+ // 子功能
451
+ if (functionItem.children && functionItem.children.length > 0) {
452
+ functionItem.children.forEach((childFunc) => {
453
+ functions.push({
454
+ id: childFunc.id,
455
+ name: childFunc.name,
456
+ checked: false
457
+ })
458
+ })
459
+ }
460
+ })
461
+ } else {
462
+ functions.push({ id: null, name: '全部', checked: false })
463
+ }
464
+ result.push({
465
+ id: `${moduleItem.id}_${subModule1Item.id}_${subModule2Item.id}`,
466
+ module: moduleItem.name,
467
+ moduleId: moduleItem.id,
468
+ subModule1: subModule1Item.name,
469
+ subModule1Id: subModule1Item.id,
470
+ subModule2: subModule2Item.name,
471
+ subModule2Id: subModule2Item.id,
472
+ functions
473
+ })
474
+ })
475
+ }
476
+ })
477
+ })
478
+ return result
479
+ }
480
+
481
+ /**
482
+ * 单元格合并计算函数
483
+ */
484
+ const rowspanAndColspan = ({ row, col, rowIndex, colIndex }) => {
485
+ // 功能列合并逻辑
486
+ if (col.colKey === 'functions') {
487
+ const isFirstRow =
488
+ rowIndex === 0 ||
489
+ data.value[rowIndex - 1].moduleId !== row.moduleId ||
490
+ data.value[rowIndex - 1].subModule1Id !== row.subModule1Id ||
491
+ data.value[rowIndex - 1].subModule2Id !== row.subModule2Id
492
+ if (isFirstRow) {
493
+ let rowspan = 1
494
+ for (let i = rowIndex + 1; i < data.value.length; i++) {
495
+ if (
496
+ data.value[i].moduleId === row.moduleId &&
497
+ data.value[i].subModule1Id === row.subModule1Id &&
498
+ data.value[i].subModule2Id === row.subModule2Id
499
+ ) {
500
+ rowspan++
501
+ } else {
502
+ break
503
+ }
504
+ }
505
+ return { rowspan, colspan: 1 }
506
+ }
507
+ return { rowspan: 0, colspan: 0 }
508
+ }
509
+ // 模块列合并逻辑
510
+ if (col.colKey === 'module') {
511
+ const currentModuleId = row.moduleId
512
+ const isFirstRow = rowIndex === 0 || data.value[rowIndex - 1].moduleId !== currentModuleId
513
+ if (isFirstRow) {
514
+ let rowspan = 1
515
+ for (let i = rowIndex + 1; i < data.value.length; i++) {
516
+ if (data.value[i].moduleId === currentModuleId) {
517
+ rowspan++
518
+ } else {
519
+ break
520
+ }
521
+ }
522
+ return { rowspan, colspan: 1 }
523
+ }
524
+ return { rowspan: 0, colspan: 0 }
525
+ }
526
+ // 子模块1列合并逻辑
527
+ if (col.colKey === 'subModule1') {
528
+ if (!row.subModule1) return {}
529
+ const currentModule = row.moduleId
530
+ const currentSubModule1 = row.subModule1Id
531
+ const isFirstRow =
532
+ rowIndex === 0 ||
533
+ data.value[rowIndex - 1].subModule1Id !== currentSubModule1 ||
534
+ data.value[rowIndex - 1].moduleId !== currentModule
535
+ if (isFirstRow) {
536
+ let rowspan = 1
537
+ for (let i = rowIndex + 1; i < data.value.length; i++) {
538
+ if (data.value[i].moduleId === currentModule && data.value[i].subModule1Id === currentSubModule1) {
539
+ rowspan++
540
+ } else {
541
+ break
542
+ }
543
+ }
544
+ return { rowspan, colspan: 1 }
545
+ }
546
+ return { rowspan: 0, colspan: 0 }
547
+ }
548
+ // 子模块2列合并逻辑
549
+ if (col.colKey === 'subModule2') {
550
+ if (!row.subModule2) return {}
551
+ const currentModule = row.moduleId
552
+ const currentSubModule1 = row.subModule1Id
553
+ const currentSubModule2 = row.subModule2Id
554
+ const isFirstRow =
555
+ rowIndex === 0 ||
556
+ data.value[rowIndex - 1].subModule2Id !== currentSubModule2 ||
557
+ data.value[rowIndex - 1].subModule1Id !== currentSubModule1 ||
558
+ data.value[rowIndex - 1].moduleId !== currentModule
559
+ if (isFirstRow) {
560
+ let rowspan = 1
561
+ for (let i = rowIndex + 1; i < data.value.length; i++) {
562
+ if (
563
+ data.value[i].moduleId === currentModule &&
564
+ data.value[i].subModule1Id === currentSubModule1 &&
565
+ data.value[i].subModule2Id === currentSubModule2
566
+ ) {
567
+ rowspan++
568
+ } else {
569
+ break
570
+ }
571
+ }
572
+ return { rowspan, colspan: 1 }
573
+ }
574
+ return { rowspan: 0, colspan: 0 }
575
+ }
576
+ return {} // 其他列不合并
577
+ }
578
+
579
+ // 勾选模块时联动所有下级
580
+ const handleModuleCheck = (row, checked) => {
581
+ row.moduleChecked = checked
582
+ data.value.forEach((item) => {
583
+ if (item.moduleId === row.moduleId) {
584
+ item.subModule1Checked = checked
585
+ item.subModule2Checked = checked
586
+ item.functions.forEach((func) => (func.checked = checked))
587
+ }
588
+ })
589
+ }
590
+
591
+ // 勾选子模块1时联动所有下级
592
+ const handleSubModule1Check = (row, checked) => {
593
+ row.subModule1Checked = checked
594
+ data.value.forEach((item) => {
595
+ if (item.moduleId === row.moduleId && item.subModule1Id === row.subModule1Id) {
596
+ item.subModule2Checked = checked
597
+ item.functions.forEach((func) => (func.checked = checked))
598
+ }
599
+ })
600
+ // 向上联动模块
601
+ updateModuleChecked(row.moduleId)
602
+ }
603
+
604
+ // 勾选子模块2时联动所有下级
605
+ const handleSubModule2Check = (row, checked) => {
606
+ row.subModule2Checked = checked
607
+ data.value.forEach((item) => {
608
+ if (
609
+ item.moduleId === row.moduleId &&
610
+ item.subModule1Id === row.subModule1Id &&
611
+ item.subModule2Id === row.subModule2Id
612
+ ) {
613
+ item.functions.forEach((func) => (func.checked = checked))
614
+ }
615
+ })
616
+ // 向上联动子模块1
617
+ updateSubModule1Checked(row.moduleId, row.subModule1Id)
618
+ }
619
+
620
+ // 勾选功能时,自动判断父级
621
+ const handleFunctionCheck = (row, func, checked) => {
622
+ func.checked = checked
623
+ // 判断本组所有功能是否全选
624
+ const allChecked = row.functions.every((f) => f.checked)
625
+ row.subModule2Checked = allChecked
626
+ // 向上联动
627
+ updateSubModule1Checked(row.moduleId, row.subModule1Id)
628
+ }
629
+
630
+ // 更新子模块1的勾选状态
631
+ const updateSubModule1Checked = (moduleId, subModule1Id) => {
632
+ // 找到所有同模块+同子模块1的行
633
+ const group = data.value.filter((item) => item.moduleId === moduleId && item.subModule1Id === subModule1Id)
634
+ const allChecked = group.every((item) => item.subModule2Checked)
635
+ group.forEach((item) => {
636
+ item.subModule1Checked = allChecked
637
+ })
638
+ // 向上联动模块
639
+ updateModuleChecked(moduleId)
640
+ }
641
+
642
+ // 更新模块的勾选状态
643
+ const updateModuleChecked = (moduleId) => {
644
+ const group = data.value.filter((item) => item.moduleId === moduleId)
645
+ const allChecked = group.every((item) => item.subModule1Checked)
646
+ group.forEach((item) => {
647
+ item.moduleChecked = allChecked
648
+ })
649
+ }
650
+
651
+ // 单元格点击事件
652
+ const handleCellClick = (context) => {
653
+ console.log('单元格点击:', context)
654
+ }
655
+
656
+ // 详情弹窗相关
657
+ const detailDialogVisible = ref(false)
658
+ const detailDialogTitle = ref('详情')
659
+ const currentRow = ref(null)
660
+
661
+
662
+ // 数据权限弹窗相关
663
+ const permissionDialogVisible = ref(false)
664
+ const permissionDialogTitle = ref('数据权限配置')
665
+ const selectedPermission = ref(1) // 默认选择全部数据
666
+
667
+ // 组织架构树相关
668
+ const orgTreeData = ref([])
669
+ const keyWord = ref('')
670
+ const filteredOrgTreeData = computed(() => {
671
+ if (!keyWord.value) return orgTreeData.value
672
+ return filterTreeNodes(orgTreeData.value, keyWord.value)
673
+ })
674
+ const orgTreeKeys = {
675
+ label: 'name',
676
+ value: 'id',
677
+ children: 'childs'
678
+ }
679
+ const expandedKeys = ref([])
680
+ const activeKey = ref(null)
681
+ const selectedOrgs = ref([])
682
+
683
+ // 过滤树节点函数
684
+ const filterTreeNodes = (nodes, keyword) => {
685
+ if (!nodes || !Array.isArray(nodes)) return []
686
+
687
+ const filtered = []
688
+
689
+ for (const node of nodes) {
690
+ // 创建节点副本,避免修改原始数据
691
+ const newNode = { ...node }
692
+
693
+ // 检查当前节点名称是否包含关键词
694
+ const matchesKeyword = node.name && node.name.toLowerCase().includes(keyword.toLowerCase())
695
+
696
+ // 递归过滤子节点
697
+ let filteredChildren = []
698
+ if (node.childs && node.childs.length > 0) {
699
+ filteredChildren = filterTreeNodes(node.childs, keyword)
700
+ }
701
+
702
+ // 如果当前节点匹配或者有匹配的子节点,则保留
703
+ if (matchesKeyword || filteredChildren.length > 0) {
704
+ if (filteredChildren.length > 0) {
705
+ newNode.childs = filteredChildren
706
+ }
707
+ filtered.push(newNode)
708
+ }
709
+ }
710
+
711
+ return filtered
712
+ }
713
+
714
+ // 处理组织节点选中
715
+ const handleOrgNodeSelect = (node, checked) => {
716
+ if (checked) {
717
+ // 检查是否已经存在
718
+ if (!selectedOrgs.value.find((org) => org.id === node.id)) {
719
+ selectedOrgs.value.push({
720
+ id: node.id,
721
+ name: node.name
722
+ })
723
+ }
724
+ } else {
725
+ // 从已选中中移除
726
+ removeSelectedOrg(node.id)
727
+ }
728
+ }
729
+
730
+ // 移除选中的组织
731
+ const removeSelectedOrg = (id) => {
732
+ const index = selectedOrgs.value.findIndex((org) => org.id === id)
733
+ if (index !== -1) {
734
+ selectedOrgs.value.splice(index, 1)
735
+ }
736
+ }
737
+
738
+ // 清空已选择的组织
739
+ const clearSelectedOrgs = () => {
740
+ selectedOrgs.value = []
741
+ }
742
+
743
+ // 检查节点是否已被选中
744
+ const isOrgNodeSelected = (id) => {
745
+ return selectedOrgs.value.some((org) => org.id === id)
746
+ }
747
+
748
+ // 切换组织节点选中状态
749
+ const toggleOrgNodeSelect = (node) => {
750
+ const isSelected = isOrgNodeSelected(node.id)
751
+ handleOrgNodeSelect(node, !isSelected)
752
+ }
753
+
754
+ // 处理组织节点激活
755
+ const handleOrgNodeActive = (value) => {
756
+ activeKey.value = value
757
+ }
758
+
759
+ // 处理组织节点展开
760
+ const handleOrgNodeExpand = (value) => {
761
+ expandedKeys.value = value
762
+ }
763
+
764
+ // 打开数据权限配置弹窗
765
+ const openPermissionDialog = (row) => {
766
+ currentRow.value = row
767
+ // 检查是否已有自定义配置
768
+ if (row.hasCustomConfig) {
769
+ // 已有自定义配置,使用自身配置
770
+ selectedPermission.value = row.dataPermission || 1
771
+ if (row.dataPermission === 6 && row.selectedOrgs) {
772
+ selectedOrgs.value = [...row.selectedOrgs]
773
+ } else {
774
+ selectedOrgs.value = []
775
+ }
776
+ } else {
777
+ // 没有自定义配置,继承全局配置
778
+ selectedPermission.value = globalPermission.value
779
+ if (globalPermission.value === 6) {
780
+ selectedOrgs.value = [...globalSelectedOrgs.value]
781
+ } else {
782
+ selectedOrgs.value = []
783
+ }
784
+ }
785
+ expandedKeys.value = ['1']
786
+ let title = '数据权限配置: '
787
+ if (row.module) title += row.module
788
+ if (row.subModule1 && row.subModule1 !== row.module) title += ' - ' + row.subModule1
789
+ if (row.subModule2 && row.subModule2 !== row.subModule1) title += ' - ' + row.subModule2
790
+ if (row.functions && row.functions.length === 1 && row.functions[0].name !== '全部')
791
+ title += ' - ' + row.functions[0].name
792
+ permissionDialogTitle.value = title
793
+ permissionDialogVisible.value = true
794
+ }
795
+
796
+ // 全局数据权限相关
797
+ const globalPermission = ref(1) // 默认全部数据
798
+ const globalSelectedOrgs = ref([])
799
+ const tempGlobalSelectedOrgs = ref([])
800
+ const globalOrgDialogVisible = ref(false)
801
+
802
+ // 打开全局组织选择器
803
+ const openGlobalOrgSelector = () => {
804
+ // 初始化临时选择的组织列表
805
+ tempGlobalSelectedOrgs.value = [...globalSelectedOrgs.value]
806
+
807
+ // 加载组织架构树数据
808
+ expandedKeys.value = ['1'] // 默认展开第一级
809
+
810
+ globalOrgDialogVisible.value = true
811
+ }
812
+
813
+ // 全局组织节点选择相关函数
814
+ const handleGlobalOrgNodeSelect = (node, checked) => {
815
+ if (checked) {
816
+ // 检查是否已经存在
817
+ if (!tempGlobalSelectedOrgs.value.find((org) => org.id === node.id)) {
818
+ tempGlobalSelectedOrgs.value.push({
819
+ id: node.id,
820
+ name: node.name
821
+ })
822
+ }
823
+ } else {
824
+ // 从已选中中移除
825
+ removeGlobalSelectedOrg(node.id)
826
+ }
827
+ }
828
+
829
+ // 移除选中的全局组织(对话框中使用)
830
+ const removeGlobalSelectedOrg = (id) => {
831
+ console.log('移除临时全局组织', id);
832
+ const index = tempGlobalSelectedOrgs.value.findIndex((org) => org.id === id);
833
+ if (index !== -1) {
834
+ tempGlobalSelectedOrgs.value.splice(index, 1);
835
+ console.log('移除成功,剩余组织数量:', tempGlobalSelectedOrgs.value.length);
836
+ } else {
837
+ console.log('未找到对应组织');
838
+ }
839
+ }
840
+
841
+ // 直接从全局组织中移除(主界面使用)
842
+ const removeGlobalOrg = (id) => {
843
+ const index = globalSelectedOrgs.value.findIndex((org) => org.id === id)
844
+ if (index !== -1) {
845
+ globalSelectedOrgs.value.splice(index, 1)
846
+ }
847
+ }
848
+
849
+ // 清空已选择的全局组织(用于弹窗中)
850
+ const clearGlobalSelectedOrgs = () => {
851
+ tempGlobalSelectedOrgs.value = []
852
+ }
853
+
854
+ // 清空主界面已选择的全局组织
855
+ const clearGlobalOrgs = () => {
856
+ globalSelectedOrgs.value = []
857
+ }
858
+
859
+ // 检查全局节点是否已被选中
860
+ const isGlobalOrgNodeSelected = (id) => {
861
+ return tempGlobalSelectedOrgs.value.some((org) => org.id === id)
862
+ }
863
+
864
+ // 切换全局组织节点选中状态
865
+ const toggleGlobalOrgNodeSelect = (node) => {
866
+ const isSelected = isGlobalOrgNodeSelected(node.id)
867
+ handleGlobalOrgNodeSelect(node, !isSelected)
868
+ }
869
+
870
+ // 确认全局组织选择
871
+ const handleGlobalOrgConfirm = () => {
872
+ // 保存选择结果
873
+ globalSelectedOrgs.value = [...tempGlobalSelectedOrgs.value]
874
+
875
+ // 应用到未配置自定义数据权限的行
876
+ applyGlobalOrgsToCustomRows()
877
+
878
+ globalOrgDialogVisible.value = false
879
+ }
880
+
881
+ // 取消全局组织选择
882
+ const handleGlobalOrgCancel = () => {
883
+ globalOrgDialogVisible.value = false
884
+ }
885
+
886
+ // 将全局组织应用到未配置自定义数据权限的行
887
+ const applyGlobalOrgsToCustomRows = () => {
888
+ // 遍历每一行数据
889
+ data.value.forEach((row) => {
890
+ // 只对没有自定义配置的行应用全局设置
891
+ if (!row.hasCustomConfig) {
892
+ // 应用全局权限设置
893
+ row.dataPermission = globalPermission.value
894
+
895
+ // 如果全局设置是自定义数据权限,则应用全局选择的组织
896
+ if (globalPermission.value === 6) {
897
+ row.selectedOrgs = [...globalSelectedOrgs.value]
898
+ } else {
899
+ row.selectedOrgs = []
900
+ }
901
+ }
902
+ })
903
+ }
904
+
905
+ // 确认权限配置(修改处理全局配置的情况)
906
+ const handlePermissionConfirm = () => {
907
+ if (currentRow.value) {
908
+ // 标记该行已有自定义配置
909
+ currentRow.value.hasCustomConfig = true;
910
+ currentRow.value.dataPermission = selectedPermission.value
911
+ if (selectedPermission.value === 6) {
912
+ currentRow.value.selectedOrgs = [...selectedOrgs.value]
913
+ } else {
914
+ currentRow.value.selectedOrgs = []
915
+ }
916
+ }
917
+ permissionDialogVisible.value = false
918
+ }
919
+
920
+ // 取消权限配置(修改处理全局配置的情况)
921
+ const handlePermissionCancel = () => {
922
+ // 只关闭弹窗,不做其他操作
923
+ permissionDialogVisible.value = false
924
+ }
925
+
926
+ // 获取匹配的节点总数
927
+ const getMatchedCount = (nodes) => {
928
+ if (!nodes || !Array.isArray(nodes)) return 0
929
+
930
+ let count = nodes.length
931
+
932
+ for (const node of nodes) {
933
+ if (node.childs && node.childs.length > 0) {
934
+ count += getMatchedCount(node.childs)
935
+ }
936
+ }
937
+
938
+ return count
939
+ }
940
+
941
+ // 新增的搜索函数
942
+ const onOrgSearch = () => {
943
+ dataService
944
+ .fetch(
945
+ {
946
+ postEnable: false,
947
+ keyWord: keyWord.value
948
+ },
949
+ {},
950
+ apis.orgTree
951
+ )
952
+ .then(async (res) => {
953
+ orgTreeData.value = res;
954
+ if (props.type === 'post') {
955
+ roleId.value = (await dataService.fetch({}, {}, apis.getRole.replace('{positionId}', props.id))).id
956
+ } else {
957
+ roleId.value = props.id;
958
+ }
959
+ if (!roleId.value) return;
960
+ let timer = setInterval(() => {
961
+ if (data.value.length > 0) {
962
+ clearInterval(timer)
963
+ getRoleConfig()
964
+ }
965
+ }, 500);
966
+ dataService.fetch({}, {}, apis.gerRoleInfo.replace('{id}', roleId.value)).then(res => {
967
+ globalPermission.value = res.dataScope;
968
+ // 使用递归查找函数获取完整组织信息
969
+ globalSelectedOrgs.value = [...res.deptIds].map(id => {
970
+ const org = findOrgInTree(orgTreeData.value, id);
971
+ return {
972
+ id: id,
973
+ name: org ? org.name : `组织${id}` // 如果找不到组织,提供一个默认名称
974
+ };
975
+ });
976
+ // 查询角色信息
977
+ })
978
+ })
979
+ }
980
+ onOrgSearch()
981
+
982
+ // 计算选中的数据权限结构
983
+ const computedSelectedData = computed(() => {
984
+ // 全局数据权限
985
+ const dataScope = globalPermission.value
986
+ const deptIds = globalSelectedOrgs.value.map((org) => org.id)
987
+ // 功能明细
988
+ const functionList = []
989
+ data.value.forEach((row) => {
990
+ // 只处理有选中功能的行
991
+ const checkedFunctionIds = row.functions
992
+ .filter((f) => f.checked)
993
+ .map((f) => f.id)
994
+ .filter(Boolean)
995
+ if (checkedFunctionIds.length > 0) {
996
+ functionList.push({
997
+ functionIds: checkedFunctionIds,
998
+ dataScope: row.dataPermission || undefined,
999
+ deptIds:
1000
+ row.dataPermission === 6 && row.selectedOrgs && row.selectedOrgs.length > 0
1001
+ ? row.selectedOrgs.map((org) => org.id)
1002
+ : []
1003
+ })
1004
+ }
1005
+ })
1006
+ let role = {
1007
+ dataScope,
1008
+ deptIds,
1009
+ }
1010
+ if (roleId.value) {
1011
+ role.id = roleId.value
1012
+ } else {
1013
+ role.positionId = props.id
1014
+ }
1015
+ return {
1016
+ role,
1017
+ functionList
1018
+ }
1019
+ })
1020
+
1021
+ watch(globalPermission, (val) => {
1022
+ if (val !== 6) {
1023
+ globalSelectedOrgs.value = []
1024
+ }
1025
+ })
1026
+
1027
+ function handleSaveRolePermission() {
1028
+ // 这里可以调用API或打印computedSelectedData
1029
+ console.log('保存角色权限:', computedSelectedData.value)
1030
+ dataService.fetch(
1031
+ computedSelectedData.value,
1032
+ {},
1033
+ apis.saveRole
1034
+ ).then(res => {
1035
+ if (!res) {
1036
+ Message.error('保存失败')
1037
+ return
1038
+ }
1039
+ emits('success')
1040
+ })
1041
+ }
1042
+
1043
+ // 暴露表格引用和方法
1044
+ defineExpose({
1045
+ selData: computedSelectedData
1046
+ })
1047
+
1048
+ // 先添加一个从树形结构中递归查找组织的辅助函数
1049
+ const findOrgInTree = (tree, id) => {
1050
+ if (!tree || !Array.isArray(tree)) return null;
1051
+
1052
+ // 先在当前层级查找
1053
+ const found = tree.find(item => item.id === id);
1054
+ if (found) return found;
1055
+
1056
+ // 如果当前层级没找到,递归查找子节点
1057
+ for (const node of tree) {
1058
+ if (node.childs && node.childs.length > 0) {
1059
+ const foundInChild = findOrgInTree(node.childs, id);
1060
+ if (foundInChild) return foundInChild;
1061
+ }
1062
+ }
1063
+
1064
+ return null; // 未找到
1065
+ };
1066
+
1067
+ // 添加用于更新父级勾选状态的辅助函数
1068
+ const updateParentCheckStatus = (row) => {
1069
+ // 判断当前行的功能是否全部勾选
1070
+ const allFunctionsChecked = row.functions.every(func => func.checked);
1071
+
1072
+ // 更新子模块2的勾选状态
1073
+ if (row.subModule2) {
1074
+ // 寻找同组的所有行
1075
+ const sameGroup = data.value.filter(item =>
1076
+ item.moduleId === row.moduleId &&
1077
+ item.subModule1Id === row.subModule1Id &&
1078
+ item.subModule2Id === row.subModule2Id
1079
+ );
1080
+
1081
+ // 判断同组的所有行是否全部勾选了功能
1082
+ const allRowsChecked = sameGroup.every(item =>
1083
+ item.functions.every(func => func.checked)
1084
+ );
1085
+
1086
+ // 更新子模块2的勾选状态
1087
+ sameGroup.forEach(item => {
1088
+ item.subModule2Checked = allRowsChecked;
1089
+ });
1090
+ }
1091
+
1092
+ // 更新子模块1的勾选状态
1093
+ updateSubModule1Checked(row.moduleId, row.subModule1Id);
1094
+ }
1095
+ </script>
1096
+
1097
+ <style lang="less" scoped>
1098
+ .cell-with-checkbox {
1099
+ display: flex;
1100
+ align-items: center;
1101
+
1102
+ .cell-text {
1103
+ margin-left: 8px;
1104
+ }
1105
+
1106
+ .empty-cell {
1107
+ color: #ccc;
1108
+ font-style: italic;
1109
+ }
1110
+ }
1111
+
1112
+ .functions-container {
1113
+ display: flex;
1114
+ flex-wrap: wrap;
1115
+ gap: 12px;
1116
+
1117
+ .function-item {
1118
+ display: flex;
1119
+ align-items: center;
1120
+ margin-right: 12px;
1121
+
1122
+ .cell-text {
1123
+ margin-left: 8px;
1124
+ }
1125
+ }
1126
+ }
1127
+
1128
+ .operation-buttons {
1129
+ display: flex;
1130
+ justify-content: center;
1131
+ }
1132
+
1133
+ .permission-content {
1134
+ padding: 20px 0;
1135
+
1136
+ .permission-item {
1137
+ .permission-options {
1138
+ margin-bottom: 20px;
1139
+
1140
+ :deep(.t-radio-group) {
1141
+ display: flex;
1142
+ flex-wrap: wrap;
1143
+
1144
+ .t-radio-button {
1145
+ margin-bottom: 10px;
1146
+ margin-right: 0;
1147
+ }
1148
+ }
1149
+ }
1150
+ }
1151
+ }
1152
+
1153
+ .custom-permission {
1154
+ margin-top: 16px;
1155
+ }
1156
+
1157
+ .org-selector-dialog {
1158
+ padding: 0;
1159
+ }
1160
+
1161
+ // 组织选择器弹窗样式
1162
+ .org-dialog-container {
1163
+ display: flex;
1164
+ height: 400px;
1165
+ border: 1px solid #eaeaea;
1166
+ border-radius: 4px;
1167
+ overflow: hidden;
1168
+ }
1169
+
1170
+ .org-left-panel {
1171
+ flex: 1;
1172
+ display: flex;
1173
+ flex-direction: column;
1174
+ border-right: 1px solid #eaeaea;
1175
+ }
1176
+
1177
+ .org-panel-header {
1178
+ padding: 16px;
1179
+ font-weight: 500;
1180
+ color: #181818;
1181
+ font-size: 14px;
1182
+ border-bottom: 1px solid #eaeaea;
1183
+ background-color: #f5f5f5;
1184
+ display: flex;
1185
+ justify-content: space-between;
1186
+ align-items: center;
1187
+ }
1188
+
1189
+ .org-search-container {
1190
+ padding: 12px 16px;
1191
+ border-bottom: 1px solid #eaeaea;
1192
+
1193
+ :deep(.t-input) {
1194
+ border-radius: 4px;
1195
+
1196
+ .t-input__inner {
1197
+ height: 32px;
1198
+ }
1199
+
1200
+ .t-input__suffix-icon {
1201
+ cursor: pointer;
1202
+ color: #999;
1203
+
1204
+ &:hover {
1205
+ color: var(--td-brand-color);
1206
+ }
1207
+ }
1208
+ }
1209
+
1210
+ .search-result-info {
1211
+ font-size: 12px;
1212
+ color: #999;
1213
+ margin-top: 8px;
1214
+ }
1215
+ }
1216
+
1217
+ .org-tree-container {
1218
+ flex: 1;
1219
+ overflow: auto;
1220
+ padding: 16px;
1221
+ }
1222
+
1223
+ .org-right-panel {
1224
+ width: 300px;
1225
+ display: flex;
1226
+ flex-direction: column;
1227
+ }
1228
+
1229
+ .org-selected-container {
1230
+ flex: 1;
1231
+ overflow: auto;
1232
+ padding: 16px;
1233
+ background-color: #fcfcfc;
1234
+ }
1235
+
1236
+ .selected-orgs-tags {
1237
+ display: flex;
1238
+ flex-wrap: wrap;
1239
+ gap: 8px;
1240
+
1241
+ .org-tag {
1242
+ margin: 0;
1243
+ white-space: nowrap;
1244
+ transition: all 0.2s ease;
1245
+ border-radius: 4px;
1246
+ cursor: pointer;
1247
+
1248
+ &:hover {
1249
+ box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
1250
+ transform: translateY(-1px);
1251
+ }
1252
+ }
1253
+ }
1254
+
1255
+ .no-selected-tip {
1256
+ color: #999;
1257
+ text-align: center;
1258
+ padding: 60px 0;
1259
+ font-size: 14px;
1260
+ }
1261
+
1262
+ .detail-content {
1263
+ padding: 16px;
1264
+
1265
+ .detail-item {
1266
+ margin-bottom: 16px;
1267
+
1268
+ .item-label {
1269
+ font-weight: bold;
1270
+ margin-right: 8px;
1271
+ color: #666;
1272
+ }
1273
+
1274
+ .item-value {
1275
+ color: #333;
1276
+ }
1277
+
1278
+ .sub-functions {
1279
+ margin-top: 8px;
1280
+
1281
+ .sub-function-item {
1282
+ padding: 4px 0;
1283
+ border-bottom: 1px dashed #eee;
1284
+
1285
+ &:last-child {
1286
+ border-bottom: none;
1287
+ }
1288
+ }
1289
+ }
1290
+ }
1291
+ }
1292
+
1293
+ .tree-node-label {
1294
+ cursor: pointer;
1295
+ padding: 4px 0;
1296
+ user-select: none;
1297
+
1298
+ &:hover {
1299
+ color: var(--td-brand-color);
1300
+ }
1301
+
1302
+ &.selected {
1303
+ color: var(--td-brand-color);
1304
+ font-weight: 500;
1305
+ }
1306
+ }
1307
+
1308
+ // 数据权限配置面板样式
1309
+ .permission-config-panel {
1310
+ margin-bottom: 16px;
1311
+ border: 1px solid #e7e7e7;
1312
+ border-radius: 6px;
1313
+ overflow: hidden;
1314
+ background-color: #fff;
1315
+
1316
+ .panel-header {
1317
+ background-color: #f5f5f5;
1318
+ padding: 12px 16px;
1319
+ border-bottom: 1px solid #e7e7e7;
1320
+
1321
+ .panel-title {
1322
+ margin: 0;
1323
+ font-size: 16px;
1324
+ font-weight: bold;
1325
+ color: #333;
1326
+ }
1327
+ }
1328
+
1329
+ .panel-content {
1330
+ padding: 16px;
1331
+
1332
+ .permission-type-selector {
1333
+ display: flex;
1334
+ align-items: center;
1335
+ margin-bottom: 16px;
1336
+
1337
+ .permission-radio-group {
1338
+ display: flex;
1339
+ flex-wrap: wrap;
1340
+
1341
+ :deep(.t-radio-button) {
1342
+ margin-bottom: 10px;
1343
+ margin-right: 0;
1344
+ }
1345
+ }
1346
+ }
1347
+
1348
+ .org-select-row {
1349
+ display: flex;
1350
+ align-items: center;
1351
+ margin-bottom: 16px;
1352
+
1353
+ .selected-count {
1354
+ color: #666;
1355
+ margin-right: 12px;
1356
+ }
1357
+
1358
+ .org-select-btn {
1359
+ height: 32px;
1360
+ }
1361
+ }
1362
+
1363
+ .selected-orgs-panel {
1364
+ display: flex;
1365
+ flex-direction: column;
1366
+ border: 1px solid #eaeaea;
1367
+ border-radius: 4px;
1368
+ margin-top: 16px;
1369
+
1370
+ .selected-orgs-header {
1371
+ display: flex;
1372
+ justify-content: space-between;
1373
+ align-items: center;
1374
+ padding: 10px 16px;
1375
+ font-size: 14px;
1376
+ color: #181818;
1377
+ border-bottom: 1px solid #eaeaea;
1378
+ background-color: #f5f5f5;
1379
+ }
1380
+
1381
+ .selected-orgs-content {
1382
+ padding: 16px;
1383
+ min-height: 80px;
1384
+
1385
+ .no-org-selected {
1386
+ color: #999;
1387
+ text-align: center;
1388
+ padding: 20px 0;
1389
+ }
1390
+
1391
+ .selected-orgs-tags {
1392
+ display: flex;
1393
+ flex-wrap: wrap;
1394
+ gap: 8px;
1395
+
1396
+ .org-tag {
1397
+ margin: 0;
1398
+ overflow: hidden;
1399
+ text-overflow: ellipsis;
1400
+ white-space: nowrap;
1401
+ }
1402
+ }
1403
+ }
1404
+ }
1405
+ }
1406
+ }
1407
+
1408
+ .no-search-results {
1409
+ text-align: center;
1410
+ padding: 30px 0;
1411
+ color: #999;
1412
+ font-size: 14px;
1413
+ }
1414
+ </style>