@ebiz/designer-components 0.0.19-beta.9 → 0.0.20

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