smart-admin-web 10.14.0 → 10.20.0

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 (538) hide show
  1. package/README.md +6 -6
  2. package/dist/api/index.d.ts +41 -2
  3. package/dist/api/index.js +36 -15
  4. package/dist/api/index.js.map +1 -1
  5. package/dist/api/schema.d.ts +418 -6
  6. package/dist/assets/icons/ph-subset.json.js +7 -7
  7. package/dist/assets/smart-logo.svg.js +5 -0
  8. package/dist/assets/smart-logo.svg.js.map +1 -0
  9. package/dist/components/AppIcon.vue.js +9 -9
  10. package/dist/components/AppIcon.vue.js.map +1 -1
  11. package/dist/components/AppWatermark.vue.d.ts +14 -0
  12. package/dist/components/AppWatermark.vue.js +38 -0
  13. package/dist/components/AppWatermark.vue.js.map +1 -0
  14. package/dist/components/AppWatermark2.vue.js +5 -0
  15. package/dist/components/AppWatermark2.vue.js.map +1 -0
  16. package/dist/components/Chart/PieChart.vue.d.ts +1 -1
  17. package/dist/components/Chart/echarts.js +15 -20
  18. package/dist/components/Chart/echarts.js.map +1 -1
  19. package/dist/components/CronEditor/index.vue.js +1 -1
  20. package/dist/components/CronEditor/index2.vue.js +2 -1
  21. package/dist/components/CronEditor/index2.vue.js.map +1 -1
  22. package/dist/components/DetailPage/index.vue.js +2 -2
  23. package/dist/components/DetailPage/index2.vue.js.map +1 -1
  24. package/dist/components/DictTag/index.vue.js.map +1 -1
  25. package/dist/components/ErrorBoundary/index.vue.js +2 -2
  26. package/dist/components/ErrorBoundary/index2.vue.js +1 -1
  27. package/dist/components/ErrorBoundary/index2.vue.js.map +1 -1
  28. package/dist/components/FormContainer/index.vue.js +91 -56
  29. package/dist/components/FormContainer/index.vue.js.map +1 -1
  30. package/dist/components/ImportWizard/index.vue.js +1 -1
  31. package/dist/components/ImportWizard/index2.vue.js +44 -41
  32. package/dist/components/ImportWizard/index2.vue.js.map +1 -1
  33. package/dist/components/MenuSearch.vue.js +2 -2
  34. package/dist/components/MenuSearch2.vue.js +19 -18
  35. package/dist/components/MenuSearch2.vue.js.map +1 -1
  36. package/dist/components/PasswordStrength/index.vue.js +2 -2
  37. package/dist/components/PasswordStrength/index2.vue.js +20 -18
  38. package/dist/components/PasswordStrength/index2.vue.js.map +1 -1
  39. package/dist/components/SmartLogo.vue.d.ts +3 -0
  40. package/dist/components/SmartLogo.vue.js +1 -1
  41. package/dist/components/SmartLogo2.vue.js +22 -64
  42. package/dist/components/SmartLogo2.vue.js.map +1 -1
  43. package/dist/{views/system/config/components/GroupExtraConfig.vue.d.ts → components/TableTotal/index.vue.d.ts} +1 -4
  44. package/dist/components/{SelectTable → TableTotal}/index.vue.js +1 -1
  45. package/dist/components/TableTotal/index2.vue.js +16 -0
  46. package/dist/components/TableTotal/index2.vue.js.map +1 -0
  47. package/dist/components/TableZoomButton/index.vue.js.map +1 -1
  48. package/dist/components/UserPicker/index.vue.js +2 -2
  49. package/dist/components/UserPicker/index2.vue.js +176 -117
  50. package/dist/components/UserPicker/index2.vue.js.map +1 -1
  51. package/dist/composables/useBatchDelete.js.map +1 -1
  52. package/dist/composables/useLayoutMenu.js +17 -16
  53. package/dist/composables/useLayoutMenu.js.map +1 -1
  54. package/dist/composables/useLoginHero.d.ts +2 -0
  55. package/dist/composables/useLoginHero.js +22 -0
  56. package/dist/composables/useLoginHero.js.map +1 -0
  57. package/dist/composables/useModule.js +39 -29
  58. package/dist/composables/useModule.js.map +1 -1
  59. package/dist/composables/usePageTitle.js +16 -14
  60. package/dist/composables/usePageTitle.js.map +1 -1
  61. package/dist/composables/useShellBreakpoint.d.ts +19 -0
  62. package/dist/composables/useShellBreakpoint.js +37 -0
  63. package/dist/composables/useShellBreakpoint.js.map +1 -0
  64. package/dist/composables/useSite.d.ts +20 -0
  65. package/dist/composables/useSite.js +18 -13
  66. package/dist/composables/useSite.js.map +1 -1
  67. package/dist/composables/useTabTitle.js.map +1 -1
  68. package/dist/composables/useTableTitle.d.ts +6 -0
  69. package/dist/composables/useTableTitle.js +11 -0
  70. package/dist/composables/useTableTitle.js.map +1 -0
  71. package/dist/composables/useTableZoom.d.ts +5 -0
  72. package/dist/composables/useTableZoom.js.map +1 -1
  73. package/dist/composables/useTheme.d.ts +2 -2
  74. package/dist/composables/useTheme.js +23 -20
  75. package/dist/composables/useTheme.js.map +1 -1
  76. package/dist/createSmartAdmin.d.ts +12 -2
  77. package/dist/createSmartAdmin.js +72 -60
  78. package/dist/createSmartAdmin.js.map +1 -1
  79. package/dist/index.d.ts +5 -2
  80. package/dist/index.js +223 -208
  81. package/dist/index.js.map +1 -1
  82. package/dist/layouts/AccentPicker.vue.js +8 -0
  83. package/dist/layouts/AccentPicker.vue.js.map +1 -0
  84. package/dist/layouts/AccentPicker2.vue.js +131 -0
  85. package/dist/layouts/AccentPicker2.vue.js.map +1 -0
  86. package/dist/layouts/AppHeader.vue.d.ts +8 -1
  87. package/dist/layouts/AppHeader.vue.js +2 -2
  88. package/dist/layouts/AppHeader2.vue.js +317 -235
  89. package/dist/layouts/AppHeader2.vue.js.map +1 -1
  90. package/dist/layouts/NoticeBell.vue.js +2 -2
  91. package/dist/layouts/NoticeBell2.vue.js +1 -1
  92. package/dist/layouts/NoticeBell2.vue.js.map +1 -1
  93. package/dist/layouts/PersonalLayout.vue.js +2 -2
  94. package/dist/layouts/PersonalLayout2.vue.js +69 -47
  95. package/dist/layouts/PersonalLayout2.vue.js.map +1 -1
  96. package/dist/layouts/SettingsDrawer.vue.js +3 -3
  97. package/dist/layouts/SettingsDrawer2.vue.js +261 -325
  98. package/dist/layouts/SettingsDrawer2.vue.js.map +1 -1
  99. package/dist/layouts/TabsBar.vue.js +2 -2
  100. package/dist/layouts/TabsBar2.vue.js +97 -69
  101. package/dist/layouts/TabsBar2.vue.js.map +1 -1
  102. package/dist/layouts/components/SideNav.vue.d.ts +3 -0
  103. package/dist/layouts/components/SideNav.vue.js +1 -1
  104. package/dist/layouts/components/SideNav2.vue.js +54 -26
  105. package/dist/layouts/components/SideNav2.vue.js.map +1 -1
  106. package/dist/layouts/default.vue.js +1 -1
  107. package/dist/layouts/default2.vue.js +170 -140
  108. package/dist/layouts/default2.vue.js.map +1 -1
  109. package/dist/lib/favicon.d.ts +1 -0
  110. package/dist/lib/favicon.js +12 -0
  111. package/dist/lib/favicon.js.map +1 -0
  112. package/dist/lib/loginHero.d.ts +16 -0
  113. package/dist/lib/loginHero.js +33 -0
  114. package/dist/lib/loginHero.js.map +1 -0
  115. package/dist/lib/logoCrop.d.ts +25 -0
  116. package/dist/lib/logoCrop.js +22 -0
  117. package/dist/lib/logoCrop.js.map +1 -0
  118. package/dist/lib/runtime.d.ts +2 -0
  119. package/dist/lib/runtime.js +1 -1
  120. package/dist/lib/runtime.js.map +1 -1
  121. package/dist/lib/securityRules.d.ts +26 -0
  122. package/dist/lib/securityRules.js +86 -0
  123. package/dist/lib/securityRules.js.map +1 -0
  124. package/dist/lib/watermark.d.ts +110 -0
  125. package/dist/lib/watermark.js +151 -0
  126. package/dist/lib/watermark.js.map +1 -0
  127. package/dist/locales/en-US.d.ts +462 -42
  128. package/dist/locales/en-US.js +491 -78
  129. package/dist/locales/en-US.js.map +1 -1
  130. package/dist/locales/kernelMenuTitles.d.ts +1 -0
  131. package/dist/locales/kernelMenuTitles.js +128 -0
  132. package/dist/locales/kernelMenuTitles.js.map +1 -0
  133. package/dist/locales/menuTitle.d.ts +3 -0
  134. package/dist/locales/menuTitle.js +14 -12
  135. package/dist/locales/menuTitle.js.map +1 -1
  136. package/dist/locales/zh-CN.d.ts +462 -42
  137. package/dist/locales/zh-CN.js +490 -81
  138. package/dist/locales/zh-CN.js.map +1 -1
  139. package/dist/router/index.js +41 -32
  140. package/dist/router/index.js.map +1 -1
  141. package/dist/router/namedPage.d.ts +4 -0
  142. package/dist/router/namedPage.js +7 -7
  143. package/dist/router/namedPage.js.map +1 -1
  144. package/dist/router/viewRegistry.js +12 -12
  145. package/dist/router/viewRegistry.js.map +1 -1
  146. package/dist/stores/app.d.ts +0 -12
  147. package/dist/stores/app.js +11 -12
  148. package/dist/stores/app.js.map +1 -1
  149. package/dist/stores/tabs.js.map +1 -1
  150. package/dist/stores/user.d.ts +10 -0
  151. package/dist/stores/user.js.map +1 -1
  152. package/dist/style.css +1 -1
  153. package/dist/theme/accentTokens.d.ts +27 -0
  154. package/dist/theme/accentTokens.js +54 -0
  155. package/dist/theme/accentTokens.js.map +1 -0
  156. package/dist/theme/accents.d.ts +21 -1
  157. package/dist/theme/accents.js +11 -2
  158. package/dist/theme/accents.js.map +1 -1
  159. package/dist/theme/mix.d.ts +58 -7
  160. package/dist/theme/mix.js +115 -30
  161. package/dist/theme/mix.js.map +1 -1
  162. package/dist/theme/naive-theme.d.ts +5 -2
  163. package/dist/theme/naive-theme.js +405 -75
  164. package/dist/theme/naive-theme.js.map +1 -1
  165. package/dist/utils/jwt.d.ts +8 -0
  166. package/dist/utils/jwt.js +14 -0
  167. package/dist/utils/jwt.js.map +1 -0
  168. package/dist/utils/menuIcon.d.ts +2 -0
  169. package/dist/utils/menuIcon.js +8 -0
  170. package/dist/utils/menuIcon.js.map +1 -0
  171. package/dist/utils/oauthBrand.d.ts +34 -9
  172. package/dist/utils/oauthBrand.js +70 -74
  173. package/dist/utils/oauthBrand.js.map +1 -1
  174. package/dist/utils/tableFilter.d.ts +88 -0
  175. package/dist/utils/tableFilter.js +116 -0
  176. package/dist/utils/tableFilter.js.map +1 -0
  177. package/dist/utils/tableToolbar.d.ts +18 -0
  178. package/dist/utils/tableToolbar.js +11 -0
  179. package/dist/utils/tableToolbar.js.map +1 -0
  180. package/dist/utils/treeFilter.d.ts +20 -0
  181. package/dist/utils/treeFilter.js +24 -0
  182. package/dist/utils/treeFilter.js.map +1 -0
  183. package/dist/views/dashboard/ShortcutPicker.vue.js +1 -1
  184. package/dist/views/dashboard/ShortcutPicker2.vue.js +73 -48
  185. package/dist/views/dashboard/ShortcutPicker2.vue.js.map +1 -1
  186. package/dist/views/dashboard/biz.vue.js +1 -1
  187. package/dist/views/dashboard/biz2.vue.js +310 -257
  188. package/dist/views/dashboard/biz2.vue.js.map +1 -1
  189. package/dist/views/dashboard/workbench.vue.js +2 -2
  190. package/dist/views/dashboard/workbench2.vue.js +141 -155
  191. package/dist/views/dashboard/workbench2.vue.js.map +1 -1
  192. package/dist/views/embed/iframe.vue.js +2 -2
  193. package/dist/views/embed/iframe2.vue.js +22 -15
  194. package/dist/views/embed/iframe2.vue.js.map +1 -1
  195. package/dist/views/error/404.vue.js +2 -2
  196. package/dist/views/error/4042.vue.js +33 -24
  197. package/dist/views/error/4042.vue.js.map +1 -1
  198. package/dist/views/error/BootError.vue.js +1 -1
  199. package/dist/views/error/BootError2.vue.js +59 -48
  200. package/dist/views/error/BootError2.vue.js.map +1 -1
  201. package/dist/views/error/MissingRoute.vue.js +2 -2
  202. package/dist/views/error/MissingRoute2.vue.js +34 -15
  203. package/dist/views/error/MissingRoute2.vue.js.map +1 -1
  204. package/dist/views/login/LoginForm.vue.d.ts +7 -1
  205. package/dist/views/login/LoginForm.vue.js +2 -2
  206. package/dist/views/login/LoginForm2.vue.js +580 -488
  207. package/dist/views/login/LoginForm2.vue.js.map +1 -1
  208. package/dist/views/login/components/LoginDesk.vue.d.ts +36 -0
  209. package/dist/views/login/components/LoginDesk.vue.js +9 -0
  210. package/dist/views/login/components/LoginDesk.vue.js.map +1 -0
  211. package/dist/views/login/components/LoginDesk2.vue.js +100 -0
  212. package/dist/views/login/components/LoginDesk2.vue.js.map +1 -0
  213. package/dist/views/login/components/LoginHeroPanel.vue.d.ts +18 -0
  214. package/dist/views/login/components/LoginHeroPanel.vue.js +8 -0
  215. package/dist/views/login/components/LoginHeroPanel.vue.js.map +1 -0
  216. package/dist/views/login/components/LoginHeroPanel2.vue.js +61 -0
  217. package/dist/views/login/components/LoginHeroPanel2.vue.js.map +1 -0
  218. package/dist/views/login/index.vue.js +1 -1
  219. package/dist/views/login/index2.vue.js +141 -71
  220. package/dist/views/login/index2.vue.js.map +1 -1
  221. package/dist/views/login/layout.d.ts +11 -0
  222. package/dist/views/login/layout.js +27 -0
  223. package/dist/views/login/layout.js.map +1 -0
  224. package/dist/views/mfa/index.vue.js +2 -2
  225. package/dist/views/mfa/index2.vue.js +367 -321
  226. package/dist/views/mfa/index2.vue.js.map +1 -1
  227. package/dist/views/module/index.vue.js +2 -2
  228. package/dist/views/module/index2.vue.js +132 -99
  229. package/dist/views/module/index2.vue.js.map +1 -1
  230. package/dist/views/oauth/callback.vue.js +2 -2
  231. package/dist/views/oauth/callback2.vue.js +65 -51
  232. package/dist/views/oauth/callback2.vue.js.map +1 -1
  233. package/dist/views/personal/bindings.vue.js +2 -2
  234. package/dist/views/personal/bindings2.vue.js +98 -94
  235. package/dist/views/personal/bindings2.vue.js.map +1 -1
  236. package/dist/views/personal/notice2.vue.js +103 -76
  237. package/dist/views/personal/notice2.vue.js.map +1 -1
  238. package/dist/views/personal/password2.vue.js +47 -40
  239. package/dist/views/personal/password2.vue.js.map +1 -1
  240. package/dist/views/personal/profile.vue.js +3 -3
  241. package/dist/views/personal/profile2.vue.js +24 -18
  242. package/dist/views/personal/profile2.vue.js.map +1 -1
  243. package/dist/views/personal/security.vue.js +2 -2
  244. package/dist/views/personal/security2.vue.js +65 -53
  245. package/dist/views/personal/security2.vue.js.map +1 -1
  246. package/dist/views/personal/sessions.vue.js +2 -2
  247. package/dist/views/personal/sessions2.vue.js +67 -62
  248. package/dist/views/personal/sessions2.vue.js.map +1 -1
  249. package/dist/views/system/ai-model/components/ProviderCard.vue.js +2 -2
  250. package/dist/views/system/ai-model/components/ProviderCard2.vue.js +142 -130
  251. package/dist/views/system/ai-model/components/ProviderCard2.vue.js.map +1 -1
  252. package/dist/views/system/ai-model/components/ProviderForm.vue.js +2 -2
  253. package/dist/views/system/ai-model/components/ProviderForm2.vue.js +71 -70
  254. package/dist/views/system/ai-model/components/ProviderForm2.vue.js.map +1 -1
  255. package/dist/views/system/ai-model/index.vue.js +2 -2
  256. package/dist/views/system/ai-model/index2.vue.js +99 -99
  257. package/dist/views/system/ai-model/index2.vue.js.map +1 -1
  258. package/dist/views/system/ai-model/presets.d.ts +1 -1
  259. package/dist/views/system/ai-model/presets.js +18 -18
  260. package/dist/views/system/ai-model/presets.js.map +1 -1
  261. package/dist/views/system/ai-usage/index.vue.js +2 -2
  262. package/dist/views/system/ai-usage/index2.vue.js +356 -258
  263. package/dist/views/system/ai-usage/index2.vue.js.map +1 -1
  264. package/dist/views/system/api-docs/index.vue.js +5 -2
  265. package/dist/views/system/api-docs/index.vue.js.map +1 -1
  266. package/dist/views/system/api-docs/index2.vue.js +92 -42
  267. package/dist/views/system/api-docs/index2.vue.js.map +1 -1
  268. package/dist/views/system/cache/index.vue.js +2 -2
  269. package/dist/views/system/cache/index2.vue.js +74 -80
  270. package/dist/views/system/cache/index2.vue.js.map +1 -1
  271. package/dist/views/system/config/components/AdminMock.vue.js +8 -0
  272. package/dist/views/system/config/components/AdminMock.vue.js.map +1 -0
  273. package/dist/views/system/config/components/AdminMock2.vue.js +93 -0
  274. package/dist/views/system/config/components/AdminMock2.vue.js.map +1 -0
  275. package/dist/views/system/config/components/AdvancedSection.vue.js +8 -0
  276. package/dist/views/system/config/components/AdvancedSection.vue.js.map +1 -0
  277. package/dist/views/system/config/components/AdvancedSection2.vue.js +163 -0
  278. package/dist/views/system/config/components/AdvancedSection2.vue.js.map +1 -0
  279. package/dist/views/system/config/components/BrandSection.vue.d.ts +7 -0
  280. package/dist/views/system/config/components/BrandSection.vue.js +8 -0
  281. package/dist/views/system/config/components/BrandSection.vue.js.map +1 -0
  282. package/dist/views/system/config/components/BrandSection2.vue.js +266 -0
  283. package/dist/views/system/config/components/BrandSection2.vue.js.map +1 -0
  284. package/dist/views/system/config/components/CfgGroup.vue.d.ts +18 -0
  285. package/dist/views/system/config/components/CfgGroup.vue.js +8 -0
  286. package/dist/views/system/config/components/CfgGroup.vue.js.map +1 -0
  287. package/dist/views/system/config/components/CfgGroup2.vue.js +22 -0
  288. package/dist/views/system/config/components/CfgGroup2.vue.js.map +1 -0
  289. package/dist/views/system/config/components/CfgRow.vue.d.ts +26 -0
  290. package/dist/views/system/config/components/CfgRow.vue.js +9 -0
  291. package/dist/views/system/config/components/CfgRow.vue.js.map +1 -0
  292. package/dist/views/system/config/components/CfgRow2.vue.js +54 -0
  293. package/dist/views/system/config/components/CfgRow2.vue.js.map +1 -0
  294. package/dist/views/system/config/components/CfgSegment.vue.d.ts +28 -0
  295. package/dist/views/system/config/components/CfgSegment.vue.js +8 -0
  296. package/dist/views/system/config/components/CfgSegment.vue.js.map +1 -0
  297. package/dist/views/system/config/components/CfgSegment2.vue.js +45 -0
  298. package/dist/views/system/config/components/CfgSegment2.vue.js.map +1 -0
  299. package/dist/views/system/config/components/ConfigFormModal.vue.js +4 -1
  300. package/dist/views/system/config/components/ConfigFormModal.vue.js.map +1 -1
  301. package/dist/views/system/config/components/ConfigFormModal2.vue.js +72 -60
  302. package/dist/views/system/config/components/ConfigFormModal2.vue.js.map +1 -1
  303. package/dist/views/system/config/components/JobSection.vue.js +8 -0
  304. package/dist/views/system/config/components/JobSection.vue.js.map +1 -0
  305. package/dist/views/system/config/components/JobSection2.vue.js +140 -0
  306. package/dist/views/system/config/components/JobSection2.vue.js.map +1 -0
  307. package/dist/views/system/config/components/LoginMock.vue.d.ts +8 -0
  308. package/dist/views/system/config/components/LoginMock.vue.js +8 -0
  309. package/dist/views/system/config/components/LoginMock.vue.js.map +1 -0
  310. package/dist/views/system/config/components/LoginMock2.vue.js +132 -0
  311. package/dist/views/system/config/components/LoginMock2.vue.js.map +1 -0
  312. package/dist/views/system/config/components/LogoCropper.vue.d.ts +10 -0
  313. package/dist/views/system/config/components/LogoCropper.vue.js +8 -0
  314. package/dist/views/system/config/components/LogoCropper.vue.js.map +1 -0
  315. package/dist/views/system/config/components/LogoCropper2.vue.js +122 -0
  316. package/dist/views/system/config/components/LogoCropper2.vue.js.map +1 -0
  317. package/dist/views/system/config/components/LogoEditor.vue.js +8 -0
  318. package/dist/views/system/config/components/LogoEditor.vue.js.map +1 -0
  319. package/dist/views/system/config/components/LogoEditor2.vue.js +161 -0
  320. package/dist/views/system/config/components/LogoEditor2.vue.js.map +1 -0
  321. package/dist/views/system/config/components/ProviderSheet.vue.d.ts +17 -0
  322. package/dist/views/system/config/components/ProviderSheet.vue.js +8 -0
  323. package/dist/views/system/config/components/ProviderSheet.vue.js.map +1 -0
  324. package/dist/views/system/config/components/ProviderSheet2.vue.js +343 -0
  325. package/dist/views/system/config/components/ProviderSheet2.vue.js.map +1 -0
  326. package/dist/{layouts/SettingRow.vue.d.ts → views/system/config/components/ScaleToFit.vue.d.ts} +2 -1
  327. package/dist/views/system/config/components/ScaleToFit.vue.js +8 -0
  328. package/dist/views/system/config/components/ScaleToFit.vue.js.map +1 -0
  329. package/dist/views/system/config/components/ScaleToFit2.vue.js +41 -0
  330. package/dist/views/system/config/components/ScaleToFit2.vue.js.map +1 -0
  331. package/dist/views/system/config/components/SectionLayout.vue.d.ts +30 -0
  332. package/dist/views/system/config/components/SectionLayout.vue.js +8 -0
  333. package/dist/views/system/config/components/SectionLayout.vue.js.map +1 -0
  334. package/dist/views/system/config/components/SectionLayout2.vue.js +69 -0
  335. package/dist/views/system/config/components/SectionLayout2.vue.js.map +1 -0
  336. package/dist/views/system/config/components/SecuritySection.vue.js +8 -0
  337. package/dist/views/system/config/components/SecuritySection.vue.js.map +1 -0
  338. package/dist/views/system/config/components/SecuritySection2.vue.js +417 -0
  339. package/dist/views/system/config/components/SecuritySection2.vue.js.map +1 -0
  340. package/dist/views/system/config/components/SensitiveSection.vue.js +8 -0
  341. package/dist/views/system/config/components/SensitiveSection.vue.js.map +1 -0
  342. package/dist/views/system/config/components/SensitiveSection2.vue.js +214 -0
  343. package/dist/views/system/config/components/SensitiveSection2.vue.js.map +1 -0
  344. package/dist/views/system/config/components/SigninSection.vue.js +8 -0
  345. package/dist/views/system/config/components/SigninSection.vue.js.map +1 -0
  346. package/dist/views/system/config/components/SigninSection2.vue.js +201 -0
  347. package/dist/views/system/config/components/SigninSection2.vue.js.map +1 -0
  348. package/dist/views/system/config/components/UploadSection.vue.js +8 -0
  349. package/dist/views/system/config/components/UploadSection.vue.js.map +1 -0
  350. package/dist/views/system/config/components/UploadSection2.vue.js +176 -0
  351. package/dist/views/system/config/components/UploadSection2.vue.js.map +1 -0
  352. package/dist/views/system/config/components/WatermarkSection.vue.js +8 -0
  353. package/dist/views/system/config/components/WatermarkSection.vue.js.map +1 -0
  354. package/dist/views/system/config/components/WatermarkSection2.vue.js +284 -0
  355. package/dist/views/system/config/components/WatermarkSection2.vue.js.map +1 -0
  356. package/dist/views/system/config/draft.d.ts +148 -0
  357. package/dist/views/system/config/draft.js +170 -0
  358. package/dist/views/system/config/draft.js.map +1 -0
  359. package/dist/views/system/config/flash.d.ts +2 -0
  360. package/dist/views/system/config/flash.js +9 -0
  361. package/dist/views/system/config/flash.js.map +1 -0
  362. package/dist/views/system/config/groups.d.ts +38 -7
  363. package/dist/views/system/config/groups.js +104 -14
  364. package/dist/views/system/config/groups.js.map +1 -1
  365. package/dist/views/system/config/index.vue.js +6 -2
  366. package/dist/views/system/config/index.vue.js.map +1 -1
  367. package/dist/views/system/config/index2.vue.js +201 -111
  368. package/dist/views/system/config/index2.vue.js.map +1 -1
  369. package/dist/views/system/config/layoutMode.d.ts +23 -0
  370. package/dist/views/system/config/layoutMode.js +28 -0
  371. package/dist/views/system/config/layoutMode.js.map +1 -0
  372. package/dist/views/system/config/providerForm.d.ts +33 -0
  373. package/dist/views/system/config/providerForm.js +63 -0
  374. package/dist/views/system/config/providerForm.js.map +1 -0
  375. package/dist/views/system/dict/index.vue.js +2 -2
  376. package/dist/views/system/dict/index2.vue.js +471 -366
  377. package/dist/views/system/dict/index2.vue.js.map +1 -1
  378. package/dist/views/system/file/index2.vue.js +91 -76
  379. package/dist/views/system/file/index2.vue.js.map +1 -1
  380. package/dist/views/system/job/index.vue.js +3 -3
  381. package/dist/views/system/job/index2.vue.js +897 -828
  382. package/dist/views/system/job/index2.vue.js.map +1 -1
  383. package/dist/views/system/job-log/components/AttemptTable.vue.d.ts +8 -0
  384. package/dist/views/system/job-log/components/AttemptTable.vue.js +5 -0
  385. package/dist/views/system/job-log/components/AttemptTable.vue.js.map +1 -0
  386. package/dist/views/system/job-log/components/AttemptTable2.vue.js +54 -0
  387. package/dist/views/system/job-log/components/AttemptTable2.vue.js.map +1 -0
  388. package/dist/views/system/job-log/index.vue.js +2 -2
  389. package/dist/views/system/job-log/index2.vue.js +193 -207
  390. package/dist/views/system/job-log/index2.vue.js.map +1 -1
  391. package/dist/views/system/job-log/runStatus.d.ts +13 -0
  392. package/dist/views/system/job-log/runStatus.js +26 -0
  393. package/dist/views/system/job-log/runStatus.js.map +1 -0
  394. package/dist/views/system/job-monitor/index.vue.js +2 -2
  395. package/dist/views/system/job-monitor/index2.vue.js +172 -180
  396. package/dist/views/system/job-monitor/index2.vue.js.map +1 -1
  397. package/dist/views/system/log/exception/index.vue.js +2 -2
  398. package/dist/views/system/log/exception/index2.vue.js +135 -96
  399. package/dist/views/system/log/exception/index2.vue.js.map +1 -1
  400. package/dist/views/system/log/login/index2.vue.js +62 -41
  401. package/dist/views/system/log/login/index2.vue.js.map +1 -1
  402. package/dist/views/system/log/op/index.vue.js +2 -2
  403. package/dist/views/system/log/op/index2.vue.js +200 -162
  404. package/dist/views/system/log/op/index2.vue.js.map +1 -1
  405. package/dist/views/system/menu/components/ButtonManager.vue.js +2 -2
  406. package/dist/views/system/menu/components/ButtonManager2.vue.js +206 -190
  407. package/dist/views/system/menu/components/ButtonManager2.vue.js.map +1 -1
  408. package/dist/views/system/menu/components/MenuFormModal.vue.js +2 -2
  409. package/dist/views/system/menu/components/MenuFormModal2.vue.js +127 -118
  410. package/dist/views/system/menu/components/MenuFormModal2.vue.js.map +1 -1
  411. package/dist/views/system/menu/index.vue.js +1 -1
  412. package/dist/views/system/menu/index2.vue.js +216 -183
  413. package/dist/views/system/menu/index2.vue.js.map +1 -1
  414. package/dist/views/system/module/index.vue.js +1 -1
  415. package/dist/views/system/module/index2.vue.js +177 -144
  416. package/dist/views/system/module/index2.vue.js.map +1 -1
  417. package/dist/views/system/monitor/index.vue.js +2 -2
  418. package/dist/views/system/monitor/index2.vue.js +134 -149
  419. package/dist/views/system/monitor/index2.vue.js.map +1 -1
  420. package/dist/views/system/notice/index.vue.js +1 -1
  421. package/dist/views/system/notice/index2.vue.js +209 -181
  422. package/dist/views/system/notice/index2.vue.js.map +1 -1
  423. package/dist/views/system/org/index.vue.js +1 -1
  424. package/dist/views/system/org/index2.vue.js +278 -248
  425. package/dist/views/system/org/index2.vue.js.map +1 -1
  426. package/dist/views/system/position/index.vue.js +5 -2
  427. package/dist/views/system/position/index.vue.js.map +1 -1
  428. package/dist/views/system/position/index2.vue.js +128 -92
  429. package/dist/views/system/position/index2.vue.js.map +1 -1
  430. package/dist/views/system/recycle/index.vue.js +2 -2
  431. package/dist/views/system/recycle/index2.vue.js +90 -67
  432. package/dist/views/system/recycle/index2.vue.js.map +1 -1
  433. package/dist/views/system/role/components/GrantMenuSheet.vue.d.ts +20 -0
  434. package/dist/views/system/role/components/GrantMenuSheet.vue.js +8 -0
  435. package/dist/views/system/role/components/GrantMenuSheet.vue.js.map +1 -0
  436. package/dist/views/system/role/components/GrantMenuSheet2.vue.js +117 -0
  437. package/dist/views/system/role/components/GrantMenuSheet2.vue.js.map +1 -0
  438. package/dist/views/system/role/components/GrantMenuTable.vue.d.ts +6 -4
  439. package/dist/views/system/role/components/GrantMenuTable.vue.js +2 -2
  440. package/dist/views/system/role/components/GrantMenuTable2.vue.js +279 -177
  441. package/dist/views/system/role/components/GrantMenuTable2.vue.js.map +1 -1
  442. package/dist/views/system/role/components/MatchText.vue.d.ts +7 -0
  443. package/dist/views/system/role/components/MatchText.vue.js +8 -0
  444. package/dist/views/system/role/components/MatchText.vue.js.map +1 -0
  445. package/dist/views/system/role/components/MatchText2.vue.js +29 -0
  446. package/dist/views/system/role/components/MatchText2.vue.js.map +1 -0
  447. package/dist/views/system/role/components/grantMenuGroups.d.ts +36 -0
  448. package/dist/views/system/role/components/grantMenuGroups.js +110 -48
  449. package/dist/views/system/role/components/grantMenuGroups.js.map +1 -1
  450. package/dist/views/system/role/index.vue.js +5 -2
  451. package/dist/views/system/role/index.vue.js.map +1 -1
  452. package/dist/views/system/role/index2.vue.js +181 -165
  453. package/dist/views/system/role/index2.vue.js.map +1 -1
  454. package/dist/views/system/session/index2.vue.js +75 -49
  455. package/dist/views/system/session/index2.vue.js.map +1 -1
  456. package/dist/views/system/user/components/ResetPasswordModal.vue.js +2 -2
  457. package/dist/views/system/user/components/ResetPasswordModal2.vue.js +2 -0
  458. package/dist/views/system/user/components/ResetPasswordModal2.vue.js.map +1 -1
  459. package/dist/views/system/user/components/UserFormModal.vue.js +2 -2
  460. package/dist/views/system/user/components/UserFormModal2.vue.js +77 -76
  461. package/dist/views/system/user/components/UserFormModal2.vue.js.map +1 -1
  462. package/dist/views/system/user/index.vue.js +2 -2
  463. package/dist/views/system/user/index2.vue.js +362 -275
  464. package/dist/views/system/user/index2.vue.js.map +1 -1
  465. package/package.json +6 -8
  466. package/dist/components/SelectTable/index.vue.d.ts +0 -76
  467. package/dist/components/SelectTable/index2.vue.js +0 -256
  468. package/dist/components/SelectTable/index2.vue.js.map +0 -1
  469. package/dist/composables/useTableRowSort.d.ts +0 -20
  470. package/dist/composables/useTableRowSort.js +0 -59
  471. package/dist/composables/useTableRowSort.js.map +0 -1
  472. package/dist/layouts/LayoutModeCards.vue.js +0 -8
  473. package/dist/layouts/LayoutModeCards.vue.js.map +0 -1
  474. package/dist/layouts/LayoutModeCards2.vue.js +0 -67
  475. package/dist/layouts/LayoutModeCards2.vue.js.map +0 -1
  476. package/dist/layouts/SettingRow.vue.js +0 -8
  477. package/dist/layouts/SettingRow.vue.js.map +0 -1
  478. package/dist/layouts/SettingRow2.vue.js +0 -23
  479. package/dist/layouts/SettingRow2.vue.js.map +0 -1
  480. package/dist/views/login/skins/AuroraGlass.vue.js +0 -8
  481. package/dist/views/login/skins/AuroraGlass.vue.js.map +0 -1
  482. package/dist/views/login/skins/AuroraGlass2.vue.js +0 -80
  483. package/dist/views/login/skins/AuroraGlass2.vue.js.map +0 -1
  484. package/dist/views/login/skins/SplitPanel.vue.js +0 -8
  485. package/dist/views/login/skins/SplitPanel.vue.js.map +0 -1
  486. package/dist/views/login/skins/SplitPanel2.vue.js +0 -85
  487. package/dist/views/login/skins/SplitPanel2.vue.js.map +0 -1
  488. package/dist/views/login/skins/Spotlight.vue.js +0 -8
  489. package/dist/views/login/skins/Spotlight.vue.js.map +0 -1
  490. package/dist/views/login/skins/Spotlight2.vue.js +0 -36
  491. package/dist/views/login/skins/Spotlight2.vue.js.map +0 -1
  492. package/dist/views/login/skins.d.ts +0 -8
  493. package/dist/views/login/skins.js +0 -13
  494. package/dist/views/login/skins.js.map +0 -1
  495. package/dist/views/system/config/components/ExternalAuthConfig.vue.js +0 -8
  496. package/dist/views/system/config/components/ExternalAuthConfig.vue.js.map +0 -1
  497. package/dist/views/system/config/components/ExternalAuthConfig2.vue.js +0 -218
  498. package/dist/views/system/config/components/ExternalAuthConfig2.vue.js.map +0 -1
  499. package/dist/views/system/config/components/GroupExtraConfig.vue.js +0 -8
  500. package/dist/views/system/config/components/GroupExtraConfig.vue.js.map +0 -1
  501. package/dist/views/system/config/components/GroupExtraConfig2.vue.js +0 -108
  502. package/dist/views/system/config/components/GroupExtraConfig2.vue.js.map +0 -1
  503. package/dist/views/system/config/components/HighSensConfig.vue.js +0 -5
  504. package/dist/views/system/config/components/HighSensConfig.vue.js.map +0 -1
  505. package/dist/views/system/config/components/HighSensConfig2.vue.js +0 -134
  506. package/dist/views/system/config/components/HighSensConfig2.vue.js.map +0 -1
  507. package/dist/views/system/config/components/JobConfig.vue.js +0 -5
  508. package/dist/views/system/config/components/JobConfig.vue.js.map +0 -1
  509. package/dist/views/system/config/components/JobConfig2.vue.js +0 -116
  510. package/dist/views/system/config/components/JobConfig2.vue.js.map +0 -1
  511. package/dist/views/system/config/components/OtherConfig.vue.js +0 -5
  512. package/dist/views/system/config/components/OtherConfig.vue.js.map +0 -1
  513. package/dist/views/system/config/components/OtherConfig2.vue.js +0 -121
  514. package/dist/views/system/config/components/OtherConfig2.vue.js.map +0 -1
  515. package/dist/views/system/config/components/SecurityConfig.vue.js +0 -8
  516. package/dist/views/system/config/components/SecurityConfig.vue.js.map +0 -1
  517. package/dist/views/system/config/components/SecurityConfig2.vue.js +0 -456
  518. package/dist/views/system/config/components/SecurityConfig2.vue.js.map +0 -1
  519. package/dist/views/system/config/components/SysBaseConfig.vue.js +0 -5
  520. package/dist/views/system/config/components/SysBaseConfig.vue.js.map +0 -1
  521. package/dist/views/system/config/components/SysBaseConfig2.vue.js +0 -107
  522. package/dist/views/system/config/components/SysBaseConfig2.vue.js.map +0 -1
  523. package/dist/views/system/config/components/UploadConfig.vue.d.ts +0 -3
  524. package/dist/views/system/config/components/UploadConfig.vue.js +0 -5
  525. package/dist/views/system/config/components/UploadConfig.vue.js.map +0 -1
  526. package/dist/views/system/config/components/UploadConfig2.vue.js +0 -135
  527. package/dist/views/system/config/components/UploadConfig2.vue.js.map +0 -1
  528. /package/dist/components/{SelectTable → TableTotal}/index.vue.js.map +0 -0
  529. /package/dist/layouts/{LayoutModeCards.vue.d.ts → AccentPicker.vue.d.ts} +0 -0
  530. /package/dist/views/{login/skins/AuroraGlass.vue.d.ts → system/config/components/AdminMock.vue.d.ts} +0 -0
  531. /package/dist/views/{login/skins/SplitPanel.vue.d.ts → system/config/components/AdvancedSection.vue.d.ts} +0 -0
  532. /package/dist/views/{login/skins/Spotlight.vue.d.ts → system/config/components/JobSection.vue.d.ts} +0 -0
  533. /package/dist/views/system/config/components/{ExternalAuthConfig.vue.d.ts → LogoEditor.vue.d.ts} +0 -0
  534. /package/dist/views/system/config/components/{HighSensConfig.vue.d.ts → SecuritySection.vue.d.ts} +0 -0
  535. /package/dist/views/system/config/components/{JobConfig.vue.d.ts → SensitiveSection.vue.d.ts} +0 -0
  536. /package/dist/views/system/config/components/{OtherConfig.vue.d.ts → SigninSection.vue.d.ts} +0 -0
  537. /package/dist/views/system/config/components/{SecurityConfig.vue.d.ts → UploadSection.vue.d.ts} +0 -0
  538. /package/dist/views/system/config/components/{SysBaseConfig.vue.d.ts → WatermarkSection.vue.d.ts} +0 -0
@@ -1 +1 @@
1
- {"version":3,"file":"index2.vue.js","sources":["../../../../src/views/system/user/index.vue"],"sourcesContent":["<script setup lang=\"ts\">\n// 用户管理(写侧)= SmartTable(列表/搜索/分页)+ UserFormModal(新增/编辑)+ ResetPasswordModal(重置/初始口令展示)+ 专用启停端点。\n// 超管行(isSuperAdmin)删除/停用置灰防自锁;启停走专用 setEnabled(非全量 update)。\n// 导入导出:ImportWizard 四步向导 + ExportColumnsModal 选列导出(带当前筛选)。\nimport { computed, h, onMounted, ref, watch } from 'vue'\nimport { useRoute } from 'vue-router'\nimport {\n NButton,\n NTree,\n NSpace,\n NTag,\n NAvatar,\n NPopconfirm,\n NDropdown,\n NInput,\n NSpin,\n NTooltip,\n useMessage,\n type TreeOption,\n} from 'naive-ui'\nimport { useI18n } from 'vue-i18n'\nimport { SmartTable, type SmartTableColumn, type SmartTableInst } from 'smart-naive-table'\nimport AppIcon from '#/components/AppIcon.vue'\nimport StatusSwitch from '#/components/StatusSwitch/index.vue'\nimport DictTag from '#/components/DictTag/index.vue'\nimport ImportWizard, { type ImportWizardApi } from '#/components/ImportWizard/index.vue'\nimport ExportColumnsModal from '#/components/ExportColumnsModal/index.vue'\nimport UserFormModal from './components/UserFormModal.vue'\nimport ResetPasswordModal from './components/ResetPasswordModal.vue'\nimport { useConfirm } from '#/composables/useConfirm'\nimport { useBatchDelete } from '#/composables/useBatchDelete'\nimport { mfaApi, userApi, positionApi, roleApi, orgApi } from '#/api'\nimport { useAuthStore } from '#/stores/auth'\nimport { translateError } from '#/utils/error'\nimport { triggerBlobDownload } from '#/utils/download'\nimport { buildTree, expandableIds } from '#/utils/tree'\nimport type { ExportColumnDef, SysOrg, UserItem } from '#/types/api'\n\nconst { t } = useI18n()\nconst message = useMessage()\nconst { run, confirm } = useConfirm()\nconst authStore = useAuthStore()\nconst tableRef = ref<SmartTableInst<UserItem>>()\nconst {\n checkedKeys,\n hasSelection,\n run: batchDelete,\n} = useBatchDelete({\n remove: userApi.batchRemove,\n refresh: () => tableRef.value?.refresh(),\n successMsg: t('user.deleted'),\n})\n\n// 新增/编辑弹窗 + 重置密码弹窗(表单/校验/保存均在各自组件内,父页只传下拉选项 + 收 saved/passwordGenerated)。\nconst userFormRef = ref<InstanceType<typeof UserFormModal> | null>(null)\nconst resetModalRef = ref<InstanceType<typeof ResetPasswordModal> | null>(null)\n\nconst clearMfaLoading = ref(false)\n\nasync function clearUserMfa(user: UserItem) {\n clearMfaLoading.value = true\n try {\n const ok = await confirm({\n content: t('user.clearMfaConfirm', { name: user.name }),\n action: () => mfaApi.clear({ userId: user.id }),\n successMsg: t('user.mfaCleared'),\n })\n if (ok) tableRef.value?.refresh()\n } finally {\n clearMfaLoading.value = false\n }\n}\n\n// 职位/角色/主管下拉:各拉一页足量。ponytail: 200 覆盖绝大多数系统;真超再上分页搜索。\n// roleOptions 一份两用:既喂编辑弹窗,也当列表页「角色」搜索项的选项源(SmartTable 支持 Ref 选项源)。\nconst positionOptions = ref<{ label: string; value: number }[]>([])\nconst roleOptions = ref<{ label: string; value: number }[]>([])\nconst directorOptions = ref<{ label: string; value: number }[]>([])\n// 左侧机构树筛选:选中节点即按其机构过滤用户;params 深监听联动 SmartTable(回第 1 页重查)。\n// 面板交互对齐内核 layout.css 的 .side-filter 约定(机构管理页搜索/展开收起用的同一套):\n// 搜索走 NTree 自带 pattern/filter;展开受控,进页面全折叠,选中节点自动展开其祖先链。\nconst orgFlat = ref<SysOrg[]>([])\n// 拉取期间给树位占位(见下方 n-spin),避免树从空白直接跳成展开好的一整棵——那一下比慢半拍更扎眼。\nconst orgLoading = ref(true)\nconst orgTree = computed(() => buildTree(orgFlat.value))\nconst selectedOrgId = ref<number | null>(null)\nconst tableParams = computed(() =>\n selectedOrgId.value == null ? {} : { orgId: selectedOrgId.value },\n)\nfunction onOrgSelect(keys: (string | number)[]) {\n // 再点选中项 → 取消选中 → 恢复全部\n selectedOrgId.value = keys.length ? Number(keys[0]) : null\n}\n\nconst orgPattern = ref('')\nfunction filterOrg(input: string, node: TreeOption) {\n const kw = input.trim().toLowerCase()\n if (!kw) return true\n const org = node as unknown as SysOrg\n return org.name.toLowerCase().includes(kw) || (org.code ?? '').toLowerCase().includes(kw)\n}\n\nconst orgExpandedKeys = ref<number[]>([])\nconst expandableOrgKeys = computed(() => expandableIds(orgTree.value))\nconst allOrgExpanded = computed(\n () =>\n expandableOrgKeys.value.length > 0 &&\n orgExpandedKeys.value.length >= expandableOrgKeys.value.length,\n)\nfunction toggleExpandAllOrg() {\n orgExpandedKeys.value = allOrgExpanded.value ? [] : [...expandableOrgKeys.value]\n}\n// 受控展开:一旦传了 expanded-keys,naive 就以它为准,不会自己默认展开——进页面全展开得自己播种。\nwatch(expandableOrgKeys, keys => (orgExpandedKeys.value = keys), { immediate: true })\n\n// 选中的机构可能藏在收起的父级里(典型:切换搜索结果后选中项被折叠的祖先挡住),把祖先链补进展开集。\nwatch(selectedOrgId, id => {\n if (id == null) return\n const byId = new Map(orgFlat.value.map(o => [o.id, o]))\n const next = new Set(orgExpandedKeys.value)\n let cursor = byId.get(id)?.parentId ?? 0\n while (cursor && byId.has(cursor)) {\n next.add(cursor)\n cursor = byId.get(cursor)!.parentId\n }\n orgExpandedKeys.value = [...next]\n})\nonMounted(async () => {\n try {\n const { items } = await positionApi.page({ page: 1, pageSize: 200 })\n positionOptions.value = items.map(p => ({ label: p.name, value: p.id }))\n } catch {\n // 静默:职位是配角,不打断列表\n }\n try {\n const { items } = await roleApi.page({ page: 1, pageSize: 200 })\n roleOptions.value = items.map(r => ({ label: r.name, value: r.id }))\n } catch {\n // 静默:角色下拉拉取失败不打断列表\n }\n try {\n // 主管候选就是用户自身;拉一页足量作下拉源(允许把某用户选为自己主管,后台系统无害,不加环检)\n const { items } = await userApi.page({ page: 1, pageSize: 200 })\n directorOptions.value = items.map(u => ({ label: `${u.name}(${u.account})`, value: u.id }))\n } catch {\n // 静默:主管下拉是配角,拉取失败不打断列表\n }\n try {\n orgFlat.value = await orgApi.list()\n } catch {\n // 静默:机构树是筛选辅助,拉取失败不打断列表\n } finally {\n orgLoading.value = false\n }\n})\n\n// 角色反查:角色页「查看用户」跳这里并带 ?roleId=。\n// 必须 watch 而非 onMounted:标签页按 path 做主键且页面被 keep-alive,本页标签已开着时再跳一次只换 query,\n// 组件实例被复用、onMounted 不会再触发。\n// 同时把 tableRef 一起纳入监听源:immediate 在 setup 期求值,那时表格实例还没挂上(ref 为空),\n// 只听 query 的话冷启动这一路会静默失效——实例就绪时这条 watch 会再触发一次,把筛选补上。\nconst route = useRoute()\nwatch(\n [tableRef, () => route.query.roleId],\n ([inst, roleId]) => {\n if (!inst) return\n const next = roleId == null ? undefined : Number(roleId)\n if (inst.params.roleId === next) return // 防抖:实例就绪与 query 变化可能各触发一次\n inst.params.roleId = next\n inst.search() // 回第 1 页重查\n },\n { immediate: true },\n)\n\n// 头像首字母兜底。NAvatar 的规矩:default 插槽一有内容就渲染它、彻底无视 src(见 naive Avatar.render)。\n// 所以有头像时 default 必须留空让 <img> 出来,首字母只放 #fallback(图挂了/链过期才兜底);无头像才用 default 当文字头像。\nconst initial = (name?: string | null) => (name || '?').slice(0, 1)\n\n// ── 导入 / 导出 ──\nconst importShow = ref(false)\nconst exportShow = ref(false)\nconst exporting = ref(false)\n\n/** 与后端 UserExportProfile.Columns 对齐(前端无列清单端点,照档案硬编码)。 */\nconst userExportColumns: ExportColumnDef[] = [\n { key: 'Account', title: t('userExport.account') },\n { key: 'Name', title: t('userExport.name') },\n { key: 'Nickname', title: t('userExport.nickname') },\n { key: 'Phone', title: t('userExport.phone') },\n { key: 'Email', title: t('userExport.email') },\n { key: 'Gender', title: t('userExport.gender') },\n { key: 'OrgName', title: t('userExport.orgName') },\n { key: 'PositionName', title: t('userExport.positionName') },\n { key: 'DirectorName', title: t('userExport.directorName') },\n { key: 'Enabled', title: t('userExport.enabled') },\n { key: 'IsSuperAdmin', title: t('userExport.superAdmin'), defaultSelected: false },\n { key: 'CreateTime', title: t('userExport.createTime') },\n]\n\nconst userImportApi: ImportWizardApi = {\n downloadTemplate: () => userApi.importTemplate(),\n preview: (file, mapping) => userApi.importPreview(file, mapping),\n validate: rows => userApi.importValidate(rows),\n commit: (rows, strategy) => userApi.importCommit(rows, strategy),\n errorReport: rows => userApi.importErrorReport(rows),\n}\n\n/** 导出:带当前 SmartTable 筛选(含左侧机构树 orgId)+ 选中列。 */\nasync function onExport(keys: string[]) {\n const p = tableRef.value?.params ?? {}\n exporting.value = true\n try {\n const blob = await userApi.export({\n account: p.account || undefined,\n name: p.name || undefined,\n orgId: p.orgId != null ? Number(p.orgId) : undefined,\n roleId: p.roleId != null ? Number(p.roleId) : undefined,\n sortField: p.sortField || undefined,\n sortOrder: p.sortOrder || undefined,\n columns: keys.join(','),\n })\n triggerBlobDownload(blob, t('userExport.fileName'))\n exportShow.value = false\n message.success(t('export.done'))\n } catch (e) {\n message.error(translateError(e))\n } finally {\n exporting.value = false\n }\n}\n\nconst columns: SmartTableColumn<UserItem>[] = [\n { type: 'index', title: () => t('common.rowNo'), width: 64, align: 'center' },\n // 超管行禁勾:批量删除同样不可含超管(后端也会整体拒绝)\n { type: 'selection', disabled: (r: UserItem) => r.isSuperAdmin },\n {\n key: 'avatar',\n title: () => t('user.avatar'),\n width: 64,\n align: 'center',\n hideInSetting: false,\n render: r =>\n h(\n NAvatar,\n { round: true, size: 'small', src: r.avatar || undefined },\n r.avatar ? { fallback: () => initial(r.name) } : { default: () => initial(r.name) },\n ),\n },\n { key: 'account', title: () => t('user.account'), search: true, sorter: true },\n { key: 'name', title: () => t('user.name'), search: true },\n { key: 'phone', title: () => t('user.phone'), render: r => r.phone || '—' },\n {\n key: 'gender',\n title: () => t('user.gender'),\n width: 80,\n hideInTable: true, // 次要列:默认隐藏收窄整表,列设置抽屉可打开\n render: r => (r.gender ? h(DictTag, { typeCode: 'gender', value: r.gender }) : '—'),\n },\n // 只作搜索项,不进表格也不进列设置。options 直接吃编辑表单已拉好的 roleOptions(SmartTable 支持 Ref 选项源),不额外发请求;\n // 列上有 options,搜索控件自动是 select。\n {\n key: 'roleId',\n title: () => t('user.roles'),\n hideInTable: true,\n options: roleOptions,\n search: { props: { clearable: true } },\n },\n { key: 'orgName', title: () => t('user.org'), render: r => r.orgName || '—' },\n {\n key: 'positionName',\n title: () => t('user.position'),\n hideInTable: true,\n render: r => r.positionName || '—',\n },\n {\n key: 'enabled',\n title: () => t('user.status'),\n width: 90,\n render: r =>\n h(StatusSwitch, {\n value: r.enabled,\n // 超管不可停用(防自锁 —— 停了就没法从 UI 恢复;后端也保护);无启停权限亦置灰。\n disabled: r.isSuperAdmin || !authStore.hasPerm('PUT:/api/v1/sys/user/{id}/enabled'),\n confirm: (next: boolean) => (next ? null : t('user.disableConfirm', { name: r.name })),\n request: (next: boolean) => userApi.setEnabled(r.id, next),\n 'onUpdate:value': (v: boolean) => {\n r.enabled = v\n },\n }),\n },\n {\n key: 'isSuperAdmin',\n title: () => t('user.superAdmin'),\n width: 90,\n render: r =>\n r.isSuperAdmin\n ? h(NTag, { type: 'warning', size: 'small', bordered: false }, () => t('user.superAdmin'))\n : '—',\n },\n { key: 'createTime', title: () => t('user.createTime'), format: 'datetime', sorter: true },\n // 操作:编辑/删除外露;重置密码、解绑验证器进「更多」(放操作列末尾)。\n // width 须够「编辑+删除+更多」单行;wrap:false 禁止 NSpace 默认换行(否则「更多」掉到删除下一行)。\n {\n key: 'op',\n title: () => t('common.operation'),\n width: 200,\n fixed: 'right', // 钉右:横向滚动时操作列始终可见\n hideInSetting: true,\n render: r => {\n const moreOptions = [\n authStore.hasPerm('PUT:/api/v1/sys/user/{id}/password')\n ? { key: 'resetPassword', label: t('user.resetPassword') }\n : null,\n r.totpEnabled && authStore.hasPerm('POST:/api/v1/sys/mfa/clear')\n ? { key: 'clearMfa', label: t('user.clearMfa'), disabled: clearMfaLoading.value }\n : null,\n ].filter(Boolean) as { key: string; label: string; disabled?: boolean }[]\n return h(NSpace, { size: 4, wrap: false, wrapItem: false }, () => [\n authStore.hasPerm('PUT:/api/v1/sys/user/{id}')\n ? h(\n NButton,\n {\n size: 'small',\n quaternary: true,\n type: 'primary',\n onClick: () => userFormRef.value?.openEdit(r),\n },\n () => t('common.edit'),\n )\n : null,\n r.isSuperAdmin || !authStore.hasPerm('DELETE:/api/v1/sys/user/{id}')\n ? null\n : h(\n NPopconfirm,\n {\n onPositiveClick: () =>\n run(() => userApi.remove(r.id), t('user.deleted')).then(ok => {\n if (ok) tableRef.value?.refresh()\n }),\n },\n {\n trigger: () =>\n h(NButton, { size: 'small', quaternary: true, type: 'error' }, () =>\n t('common.delete'),\n ),\n default: () => t('user.deleteConfirm', { name: r.name }),\n },\n ),\n moreOptions.length\n ? h(\n NDropdown,\n {\n trigger: 'click',\n options: moreOptions,\n onSelect: (key: string) => {\n if (key === 'resetPassword') resetModalRef.value?.openReset(r)\n else if (key === 'clearMfa') void clearUserMfa(r)\n },\n },\n () =>\n h(\n NButton,\n { size: 'small', quaternary: true, loading: clearMfaLoading.value },\n () => t('common.more'),\n ),\n )\n : null,\n ])\n },\n },\n]\n</script>\n\n<template>\n <!-- 「左分组栏 + 右列表」= styles/layout.css 里的形状 3:.side-page 负责 display/gap/拉伸/整屏高度。 -->\n <div class=\"user-layout side-page\">\n <!-- 左侧机构树筛选:面板外观/交互对齐内核 .side-filter 约定(机构管理页搜索、展开收起同款) -->\n <aside class=\"side-filter\">\n <div class=\"side-filter__head\">\n <div class=\"side-filter__actions\">\n <n-tooltip v-if=\"expandableOrgKeys.length\">\n <template #trigger>\n <n-button quaternary circle size=\"small\" @click=\"toggleExpandAllOrg\">\n <template #icon>\n <AppIcon\n :icon=\"\n allOrgExpanded ? 'ph:arrows-in-line-vertical' : 'ph:arrows-out-line-vertical'\n \"\n :size=\"18\"\n />\n </template>\n </n-button>\n </template>\n {{ allOrgExpanded ? t('common.collapseAll') : t('common.expandAll') }}\n </n-tooltip>\n </div>\n </div>\n\n <n-input\n v-model:value=\"orgPattern\"\n size=\"small\"\n clearable\n :placeholder=\"t('org.searchPlaceholder')\"\n >\n <template #prefix><AppIcon icon=\"ph:magnifying-glass\" :size=\"14\" /></template>\n </n-input>\n\n <button\n type=\"button\"\n class=\"side-row\"\n :class=\"{ 'is-active': selectedOrgId === null }\"\n @click=\"selectedOrgId = null\"\n >\n <AppIcon class=\"side-row__icon\" icon=\"ph:squares-four\" :size=\"15\" />\n <span class=\"side-row__label\">{{ t('user.allOrgs') }}</span>\n </button>\n\n <div class=\"side-filter__divider\" />\n\n <n-spin :show=\"orgLoading\" class=\"fill-pass\">\n <n-tree\n class=\"side-tree\"\n block-line\n selectable\n show-line\n key-field=\"id\"\n label-field=\"name\"\n children-field=\"children\"\n :data=\"orgTree\"\n :pattern=\"orgPattern\"\n :filter=\"filterOrg\"\n :show-irrelevant-nodes=\"false\"\n :selected-keys=\"selectedOrgId == null ? [] : [selectedOrgId]\"\n :expanded-keys=\"orgExpandedKeys\"\n @update:selected-keys=\"onOrgSelect\"\n @update:expanded-keys=\"keys => (orgExpandedKeys = keys as unknown as number[])\"\n />\n </n-spin>\n </aside>\n\n <SmartTable\n :default-page-size=\"100\"\n ref=\"tableRef\"\n :columns=\"columns\"\n :fetcher=\"userApi.page\"\n :params=\"tableParams\"\n flex-height\n virtual-scroll\n storage-key=\"sys-user\"\n :checked-row-keys=\"checkedKeys\"\n @update:checked-row-keys=\"(keys: (string | number)[]) => (checkedKeys = keys)\"\n @error=\"e => message.error(translateError(e))\"\n >\n <template #toolbar>\n <n-button v-auth=\"'POST:/api/v1/sys/user'\" type=\"primary\" @click=\"userFormRef?.openAdd()\">\n <template #icon><AppIcon icon=\"ph:plus\" :size=\"16\" /></template>\n {{ t('common.add') }}\n </n-button>\n <n-button\n v-auth=\"'POST:/api/v1/sys/user/batch-delete'\"\n type=\"error\"\n :disabled=\"!hasSelection\"\n @click=\"batchDelete\"\n >\n <template #icon><AppIcon icon=\"ph:trash\" :size=\"16\" /></template>\n {{ t('common.batchDelete') }}\n </n-button>\n <!-- 权限码一字不差:导入入口 = preview;导出 = export -->\n <n-button v-auth=\"'POST:/api/v1/sys/user/import/preview'\" @click=\"importShow = true\">\n <template #icon><AppIcon icon=\"ph:upload-simple\" :size=\"16\" /></template>\n {{ t('import.button') }}\n </n-button>\n <n-button v-auth=\"'GET:/api/v1/sys/user/export'\" @click=\"exportShow = true\">\n <template #icon><AppIcon icon=\"ph:download-simple\" :size=\"16\" /></template>\n {{ t('export.button') }}\n </n-button>\n </template>\n </SmartTable>\n </div>\n\n <UserFormModal\n ref=\"userFormRef\"\n :position-options=\"positionOptions\"\n :role-options=\"roleOptions\"\n :director-options=\"directorOptions\"\n @saved=\"() => tableRef?.refresh()\"\n @password-generated=\"p => resetModalRef?.showResult(p, true)\"\n />\n\n <ResetPasswordModal ref=\"resetModalRef\" />\n\n <ImportWizard\n v-model:show=\"importShow\"\n :api=\"userImportApi\"\n :template-file-name=\"t('userExport.importTemplateName')\"\n :error-report-file-name=\"t('userExport.errorReportName')\"\n @done=\"() => tableRef?.refresh()\"\n />\n\n <ExportColumnsModal\n v-model:show=\"exportShow\"\n :columns=\"userExportColumns\"\n :loading=\"exporting\"\n @confirm=\"onExport\"\n />\n</template>\n\n<style scoped>\n/* 树形比平铺分类宽一点:缩进和展开箭头要留出空间,默认 --side-filter-width(224px)偏窄。 */\n.user-layout {\n --side-filter-width: 248px;\n}\n</style>\n"],"names":["useI18n","message","useMessage","run","confirm","useConfirm","authStore","useAuthStore","tableRef","ref","checkedKeys","hasSelection","batchDelete","useBatchDelete","userApi","_a","userFormRef","resetModalRef","clearMfaLoading","clearUserMfa","user","mfaApi","positionOptions","roleOptions","directorOptions","orgFlat","orgLoading","orgTree","computed","buildTree","selectedOrgId","tableParams","onOrgSelect","keys","orgPattern","filterOrg","input","node","kw","org","orgExpandedKeys","expandableOrgKeys","expandableIds","allOrgExpanded","toggleExpandAllOrg","watch","id","byId","o","next","cursor","onMounted","items","positionApi","p","roleApi","r","u","orgApi","route","useRoute","inst","roleId","initial","name","importShow","exportShow","exporting","userExportColumns","userImportApi","file","mapping","rows","strategy","onExport","blob","triggerBlobDownload","e","translateError","columns","h","NAvatar","DictTag","StatusSwitch","v","NTag","moreOptions","NSpace","NButton","NPopconfirm","ok","NDropdown","key","_createElementVNode","_hoisted_1","_hoisted_2","_hoisted_3","_hoisted_4","_createBlock","_unref","NTooltip","_createVNode","AppIcon","_createTextVNode","_toDisplayString","NInput","$event","_normalizeClass","_hoisted_5","NSpin","NTree","_cache","SmartTable","UserFormModal","ResetPasswordModal","ImportWizard","ExportColumnsModal"],"mappings":"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"}
1
+ {"version":3,"file":"index2.vue.js","sources":["../../../../src/views/system/user/index.vue"],"sourcesContent":["<script setup lang=\"ts\">\n// 用户管理(写侧)= SmartTable(列表/搜索/分页)+ UserFormModal(新增/编辑)+ ResetPasswordModal(重置/初始口令展示)+ 专用启停端点。\n// 超管行(isSuperAdmin)删除/停用置灰防自锁;启停走专用 setEnabled(非全量 update)。\n// 导入导出:ImportWizard 四步向导 + ExportColumnsModal 选列导出(带当前筛选)。\nimport { computed, h, onMounted, ref, watch } from 'vue'\nimport { createReusableTemplate, useElementSize } from '@vueuse/core'\nimport { useRoute } from 'vue-router'\nimport {\n NButton,\n NTree,\n NSpace,\n NTag,\n NAvatar,\n type DataTableSortState,\n NPopconfirm,\n NDropdown,\n NInput,\n NSpin,\n NTooltip,\n NDrawer,\n NDrawerContent,\n useMessage,\n type DropdownOption,\n type TreeOption,\n} from 'naive-ui'\nimport { useI18n } from 'vue-i18n'\nimport { SmartTable, type SmartTableColumn, type SmartTableInst } from 'smart-naive-table'\nimport AppIcon from '#/components/AppIcon.vue'\nimport StatusSwitch from '#/components/StatusSwitch/index.vue'\nimport DictTag from '#/components/DictTag/index.vue'\nimport ImportWizard, { type ImportWizardApi } from '#/components/ImportWizard/index.vue'\nimport ExportColumnsModal from '#/components/ExportColumnsModal/index.vue'\nimport UserFormModal from './components/UserFormModal.vue'\nimport ResetPasswordModal from './components/ResetPasswordModal.vue'\nimport { useConfirm } from '#/composables/useConfirm'\nimport { useBatchDelete } from '#/composables/useBatchDelete'\nimport { mfaApi, userApi, positionApi, roleApi, orgApi } from '#/api'\nimport { useAuthStore } from '#/stores/auth'\nimport { translateError } from '#/utils/error'\nimport {\n SEARCH_ACTIONS,\n flatSearchOf,\n presetEqualFilter,\n deriveHeaderFilters,\n} from '#/utils/tableFilter'\nimport { TABLE_MIN_ROW_HEIGHT, TABLE_TOOLBAR } from '#/utils/tableToolbar'\nimport TableTotal from '#/components/TableTotal/index.vue'\nimport { triggerBlobDownload } from '#/utils/download'\nimport { buildTree, expandableIds } from '#/utils/tree'\nimport type { ExportColumnDef, SysOrg, UserItem } from '#/types/api'\n\nconst { t } = useI18n()\nconst message = useMessage()\nconst { run, confirm } = useConfirm()\nconst authStore = useAuthStore()\nconst tableRef = ref<SmartTableInst<UserItem>>()\nconst { checkedKeys, run: batchDelete } = useBatchDelete({\n remove: userApi.batchRemove,\n refresh: () => tableRef.value?.refresh(),\n successMsg: t('user.deleted'),\n})\n\n// 新增/编辑弹窗 + 重置密码弹窗(表单/校验/保存均在各自组件内,父页只传下拉选项 + 收 saved/passwordGenerated)。\nconst userFormRef = ref<InstanceType<typeof UserFormModal> | null>(null)\nconst resetModalRef = ref<InstanceType<typeof ResetPasswordModal> | null>(null)\n\nconst clearMfaLoading = ref(false)\n\nasync function clearUserMfa(user: UserItem) {\n clearMfaLoading.value = true\n try {\n const ok = await confirm({\n content: t('user.clearMfaConfirm', { name: user.name }),\n action: () => mfaApi.clear({ userId: user.id }),\n successMsg: t('user.mfaCleared'),\n })\n if (ok) tableRef.value?.refresh()\n } finally {\n clearMfaLoading.value = false\n }\n}\n\n// 职位/角色/主管下拉:各拉一页足量。ponytail: 200 覆盖绝大多数系统;真超再上分页搜索。\n// roleOptions 一份两用:既喂编辑弹窗,也当列表页「角色」搜索项的选项源(SmartTable 支持 Ref 选项源)。\nconst positionOptions = ref<{ label: string; value: number }[]>([])\nconst roleOptions = ref<{ label: string; value: number }[]>([])\nconst directorOptions = ref<{ label: string; value: number }[]>([])\n// 左侧机构树筛选:选中节点即按其机构过滤用户;params 深监听联动 SmartTable(回第 1 页重查)。\n// 面板交互对齐内核 layout.css 的 .side-filter 约定(机构管理页搜索/展开收起用的同一套):\n// 搜索走 NTree 自带 pattern/filter;展开受控,进页面全折叠,选中节点自动展开其祖先链。\nconst orgFlat = ref<SysOrg[]>([])\n// 拉取期间给树位占位(见下方 n-spin),避免树从空白直接跳成展开好的一整棵——那一下比慢半拍更扎眼。\nconst orgLoading = ref(true)\nconst orgTree = computed(() => buildTree(orgFlat.value))\nconst selectedOrgId = ref<number | null>(null)\nconst tableParams = computed<{ orgId?: number }>(() =>\n selectedOrgId.value == null ? {} : { orgId: selectedOrgId.value },\n)\nfunction onOrgSelect(keys: (string | number)[]) {\n // 再点选中项 → 取消选中 → 恢复全部\n pickOrg(keys.length ? Number(keys[0]) : null)\n}\n\n// ── 内容区较窄时,机构树收进左侧抽屉 ──\n// 判据是页面内容区宽度(不是视口):侧栏展开 / 收起都会改变它。面板占掉的宽度本来就会让右侧表格变窄,\n// 收进抽屉后表格得到整行宽度;表格自己的窄档(卡片列表)由库按表格卡片宽度另行判定,页面不管。\nconst COMPACT_WIDTH = 1000\nconst layoutRef = ref<HTMLElement>()\nconst { width: layoutWidth } = useElementSize(layoutRef)\n// 量到宽度前(0)按宽屏渲染,避免首帧闪一下抽屉模式\nconst compact = computed(() => layoutWidth.value > 0 && layoutWidth.value < COMPACT_WIDTH)\nconst orgDrawer = ref(false)\nfunction pickOrg(id: number | null) {\n selectedOrgId.value = id\n orgDrawer.value = false\n}\n// 机构面板的内容(展开收起 / 搜索 / 「全部」/ 树)只写一份:宽屏放在 aside 里,窄屏放进抽屉。\nconst [DefineOrgPanel, ReuseOrgPanel] = createReusableTemplate()\nconst selectedOrgName = computed(\n () => orgFlat.value.find(o => o.id === selectedOrgId.value)?.name ?? t('user.orgFilter'),\n)\n\nconst orgPattern = ref('')\nfunction filterOrg(input: string, node: TreeOption) {\n const kw = input.trim().toLowerCase()\n if (!kw) return true\n const org = node as unknown as SysOrg\n return org.name.toLowerCase().includes(kw) || (org.code ?? '').toLowerCase().includes(kw)\n}\n\nconst orgExpandedKeys = ref<number[]>([])\nconst expandableOrgKeys = computed(() => expandableIds(orgTree.value))\nconst allOrgExpanded = computed(\n () =>\n expandableOrgKeys.value.length > 0 &&\n orgExpandedKeys.value.length >= expandableOrgKeys.value.length,\n)\nfunction toggleExpandAllOrg() {\n orgExpandedKeys.value = allOrgExpanded.value ? [] : [...expandableOrgKeys.value]\n}\n// 受控展开:一旦传了 expanded-keys,naive 就以它为准,不会自己默认展开——进页面全展开得自己播种。\nwatch(expandableOrgKeys, keys => (orgExpandedKeys.value = keys), { immediate: true })\n\n// 选中的机构可能藏在收起的父级里(典型:切换搜索结果后选中项被折叠的祖先挡住),把祖先链补进展开集。\nwatch(selectedOrgId, id => {\n if (id == null) return\n const byId = new Map(orgFlat.value.map(o => [o.id, o]))\n const next = new Set(orgExpandedKeys.value)\n let cursor = byId.get(id)?.parentId ?? 0\n while (cursor && byId.has(cursor)) {\n next.add(cursor)\n cursor = byId.get(cursor)!.parentId\n }\n orgExpandedKeys.value = [...next]\n})\nonMounted(async () => {\n try {\n const { items } = await positionApi.page({ page: 1, pageSize: 200 })\n positionOptions.value = items.map(p => ({ label: p.name, value: p.id }))\n } catch {\n // 静默:职位是配角,不打断列表\n }\n try {\n const { items } = await roleApi.page({ page: 1, pageSize: 200 })\n roleOptions.value = items.map(r => ({ label: r.name, value: r.id }))\n } catch {\n // 静默:角色下拉拉取失败不打断列表\n }\n try {\n // 主管候选就是用户自身;拉一页足量作下拉源(允许把某用户选为自己主管,后台系统无害,不加环检)\n const { items } = await userApi.page({ page: 1, pageSize: 200 })\n directorOptions.value = items.map(u => ({ label: `${u.name}(${u.account})`, value: u.id }))\n } catch {\n // 静默:主管下拉是配角,拉取失败不打断列表\n }\n try {\n orgFlat.value = await orgApi.list()\n } catch {\n // 静默:机构树是筛选辅助,拉取失败不打断列表\n } finally {\n orgLoading.value = false\n }\n})\n\n// 角色反查:角色页「查看用户」跳这里并带 ?roleId=。\n// 必须 watch 而非 onMounted:标签页按 path 做主键且页面被 keep-alive,本页标签已开着时再跳一次只换 query,\n// 组件实例被复用、onMounted 不会再触发。\n// 同时把 tableRef 一起纳入监听源:immediate 在 setup 期求值,那时表格实例还没挂上(ref 为空),\n// 只听 query 的话冷启动这一路会静默失效——实例就绪时这条 watch 会再触发一次,把筛选补上。\nconst route = useRoute()\nwatch(\n [tableRef, () => route.query.roleId],\n ([inst, roleId]) => {\n if (!inst) return\n // route 是全局的:页面被 keep-alive 着,切到别的页面时 query.roleId 变 undefined,本页的 watcher 照样会响。\n // 不守卫就等于「离开本页 = 清掉角色条件并在后台发一次没人看的请求」,切回来条件还没了(任务日志页同理)。\n if (route.path !== '/system/user') return\n // 条件构造器下搜索值在过滤态里而不是 params;presetEqualFilter 内部比较当前条件,\n // 值没变就不写 —— 实例就绪与 query 变化可能各触发一次,第二次不该再发请求。\n // 远程模式下 setFilter 自己会回第 1 页重查,不用再 search()。\n presetEqualFilter(inst, 'roleId', roleId == null ? undefined : Number(roleId))\n },\n { immediate: true },\n)\n\n// 头像首字母兜底。NAvatar 的规矩:default 插槽一有内容就渲染它、彻底无视 src(见 naive Avatar.render)。\n// 所以有头像时 default 必须留空让 <img> 出来,首字母只放 #fallback(图挂了/链过期才兜底);无头像才用 default 当文字头像。\nconst initial = (name?: string | null) => (name || '?').slice(0, 1)\n\n// ── 导入 / 导出 ──\nconst importShow = ref(false)\nconst exportShow = ref(false)\nconst exporting = ref(false)\n\n// 导入 / 导出收进表格内置的「更多」菜单(统一标准:业务按钮只留高频动作)。\n// 没有任何权限时 more 为空数组,按钮不出现,不会露出一个空菜单;权限码与原按钮的 v-auth 一字不差。\nconst toolbarMore = computed(() =>\n [\n authStore.hasPerm('POST:/api/v1/sys/user/import/preview')\n ? { label: t('import.button'), key: 'import' }\n : null,\n authStore.hasPerm('GET:/api/v1/sys/user/export')\n ? { label: t('export.button'), key: 'export' }\n : null,\n ].filter((o): o is { label: string; key: string } => o !== null),\n)\n// 引用稳定的 toolbar 配置:不要把 `{ ...TABLE_TOOLBAR, more }` 直接写进模板,那样每次重渲染都会新建一个对象\nconst toolbar = computed(() => ({ ...TABLE_TOOLBAR, more: toolbarMore.value }))\nfunction onMoreSelect(key: string | number) {\n if (key === 'import') importShow.value = true\n else if (key === 'export') exportShow.value = true\n}\n\n/** 与后端 UserExportProfile.Columns 对齐(前端无列清单端点,照档案硬编码)。 */\nconst userExportColumns: ExportColumnDef[] = [\n { key: 'Account', title: t('userExport.account') },\n { key: 'Name', title: t('userExport.name') },\n { key: 'Nickname', title: t('userExport.nickname') },\n { key: 'Phone', title: t('userExport.phone') },\n { key: 'Email', title: t('userExport.email') },\n { key: 'Gender', title: t('userExport.gender') },\n { key: 'OrgName', title: t('userExport.orgName') },\n { key: 'PositionName', title: t('userExport.positionName') },\n { key: 'DirectorName', title: t('userExport.directorName') },\n { key: 'Enabled', title: t('userExport.enabled') },\n { key: 'IsSuperAdmin', title: t('userExport.superAdmin'), defaultSelected: false },\n { key: 'CreateTime', title: t('userExport.createTime') },\n]\n\nconst userImportApi: ImportWizardApi = {\n downloadTemplate: () => userApi.importTemplate(),\n preview: (file, mapping) => userApi.importPreview(file, mapping),\n validate: rows => userApi.importValidate(rows),\n commit: (rows, strategy) => userApi.importCommit(rows, strategy),\n errorReport: rows => userApi.importErrorReport(rows),\n}\n\n// 当前排序:库把排序当作额外请求参数直接拼进列表请求,不会放进 inst.params,导出要「与列表排序一致」就得自己接住。\nconst sorter = ref<{ field: string; order: 'asc' | 'desc' } | null>(null)\nfunction onSorter(state: DataTableSortState | DataTableSortState[] | null) {\n const s = Array.isArray(state) ? state[0] : state\n sorter.value =\n s && s.order\n ? { field: String(s.columnKey), order: s.order === 'ascend' ? 'asc' : 'desc' }\n : null\n}\n\n/** 导出:带当前 SmartTable 筛选(含左侧机构树 orgId)+ 当前排序 + 选中列。 */\nasync function onExport(keys: string[]) {\n // 搜索值在过滤态里,flatSearchOf 序列化回扁平键;orgId 来自左侧机构树的联动参数(:params),不在过滤态里,\n // 排序也不在 inst.params 里,所以这两项都取页面自己持有的状态。\n const p = flatSearchOf(tableRef.value)\n exporting.value = true\n try {\n const blob = await userApi.export({\n account: p.account || undefined,\n name: p.name || undefined,\n orgId: tableParams.value.orgId,\n roleId: p.roleId != null ? Number(p.roleId) : undefined,\n sortField: sorter.value?.field,\n sortOrder: sorter.value?.order,\n columns: keys.join(','),\n })\n triggerBlobDownload(blob, t('userExport.fileName'))\n exportShow.value = false\n message.success(t('export.done'))\n } catch (e) {\n message.error(translateError(e))\n } finally {\n exporting.value = false\n }\n}\n\n/** 空值占位:「—」用 faint 弱化 */\nconst dash = () => h('span', { class: 'faint' }, '—')\n/** 下拉菜单项的线条图标 */\nconst menuIcon = (name: string) => () => h(AppIcon, { icon: name, size: 16 })\n\nconst columns: SmartTableColumn<UserItem>[] = [\n { type: 'index', title: () => t('common.rowNo'), width: 64, align: 'center' },\n // 超管行禁勾:批量删除同样不可含超管(后端也会整体拒绝)\n { type: 'selection', disabled: (r: UserItem) => r.isSuperAdmin },\n {\n key: 'avatar',\n title: () => t('user.avatar'),\n width: 64,\n align: 'center',\n hideInSetting: false,\n card: false, // 窄档卡片的标题是姓名,头像不进卡片\n render: r =>\n h(\n NAvatar,\n { round: true, size: 'small', src: r.avatar || undefined },\n r.avatar ? { fallback: () => initial(r.name) } : { default: () => initial(r.name) },\n ),\n },\n {\n key: 'account',\n title: () => t('user.account'),\n search: { actions: SEARCH_ACTIONS.fuzzy },\n sorter: true,\n },\n {\n key: 'name',\n title: () => t('user.name'),\n card: 'title',\n search: { actions: SEARCH_ACTIONS.fuzzy },\n sorter: true,\n },\n {\n key: 'phone',\n title: () => t('user.phone'),\n sorter: true,\n render: r => (r.phone ? h('span', { class: 'num' }, r.phone) : dash()),\n },\n {\n key: 'gender',\n title: () => t('user.gender'),\n width: 80,\n hideInTable: true, // 次要列:默认隐藏收窄整表,列设置抽屉可打开\n render: r => (r.gender ? h(DictTag, { typeCode: 'gender', value: r.gender }) : dash()),\n },\n // 只作搜索项,不进表格也不进列设置。options 直接吃编辑表单已拉好的 roleOptions(SmartTable 支持 Ref 选项源),不额外发请求;\n // 列上有 options,搜索控件自动是 select。\n {\n key: 'roleId',\n title: () => t('user.roles'),\n hideInTable: true,\n options: roleOptions,\n search: { actions: SEARCH_ACTIONS.exact, props: { clearable: true } },\n },\n { key: 'orgName', title: () => t('user.org'), render: r => r.orgName || dash() },\n {\n key: 'positionName',\n title: () => t('user.position'),\n hideInTable: true,\n render: r => r.positionName || dash(),\n },\n {\n key: 'enabled',\n title: () => t('user.status'),\n width: 90,\n sorter: true,\n render: r =>\n h(StatusSwitch, {\n value: r.enabled,\n // 超管不可停用(防自锁 —— 停了就没法从 UI 恢复;后端也保护);无启停权限亦置灰。\n disabled: r.isSuperAdmin || !authStore.hasPerm('PUT:/api/v1/sys/user/{id}/enabled'),\n confirm: (next: boolean) => (next ? null : t('user.disableConfirm', { name: r.name })),\n request: (next: boolean) => userApi.setEnabled(r.id, next),\n 'onUpdate:value': (v: boolean) => {\n r.enabled = v\n },\n }),\n },\n {\n key: 'isSuperAdmin',\n title: () => t('user.superAdmin'),\n width: 90,\n render: r =>\n r.isSuperAdmin\n ? h(NTag, { type: 'warning', size: 'small', bordered: false }, () => t('user.superAdmin'))\n : dash(),\n },\n { key: 'createTime', title: () => t('user.createTime'), format: 'datetime', sorter: true },\n // 操作:编辑/删除外露;重置密码、解绑验证器进「更多」(放操作列末尾)。\n // width 须够「编辑+删除+更多」单行;wrap:false 禁止 NSpace 默认换行(否则「更多」掉到删除下一行)。\n {\n key: 'op',\n title: () => t('common.operation'),\n width: 200,\n fixed: 'right', // 钉右:横向滚动时操作列始终可见\n hideInSetting: true,\n render: r => {\n const rawMoreOptions: (DropdownOption | null)[] = [\n authStore.hasPerm('PUT:/api/v1/sys/user/{id}/password')\n ? { key: 'resetPassword', label: t('user.resetPassword'), icon: menuIcon('ph:key') }\n : null,\n r.totpEnabled && authStore.hasPerm('POST:/api/v1/sys/mfa/clear')\n ? {\n key: 'clearMfa',\n label: t('user.clearMfa'),\n icon: menuIcon('ph:link-break'),\n disabled: clearMfaLoading.value,\n }\n : null,\n ]\n const moreOptions = rawMoreOptions.filter((o): o is DropdownOption => o !== null)\n return h(NSpace, { size: 4, wrap: false, wrapItem: false }, () => [\n authStore.hasPerm('PUT:/api/v1/sys/user/{id}')\n ? h(\n NButton,\n {\n size: 'small',\n quaternary: true,\n type: 'primary',\n onClick: () => userFormRef.value?.openEdit(r),\n },\n () => t('common.edit'),\n )\n : null,\n r.isSuperAdmin || !authStore.hasPerm('DELETE:/api/v1/sys/user/{id}')\n ? null\n : h(\n NPopconfirm,\n {\n onPositiveClick: () =>\n run(() => userApi.remove(r.id), t('user.deleted')).then(ok => {\n if (ok) tableRef.value?.refresh()\n }),\n },\n {\n trigger: () =>\n h(NButton, { size: 'small', quaternary: true, type: 'error' }, () =>\n t('common.delete'),\n ),\n default: () => t('user.deleteConfirm', { name: r.name }),\n },\n ),\n moreOptions.length\n ? h(\n NDropdown,\n {\n trigger: 'click',\n options: moreOptions,\n onSelect: (key: string) => {\n if (key === 'resetPassword') resetModalRef.value?.openReset(r)\n else if (key === 'clearMfa') void clearUserMfa(r)\n },\n },\n () =>\n h(\n NButton,\n {\n size: 'small',\n quaternary: true,\n type: 'primary',\n iconPlacement: 'right',\n loading: clearMfaLoading.value,\n },\n {\n default: () => t('common.more'),\n icon: () => h(AppIcon, { icon: 'ph:caret-down', size: 12 }),\n },\n ),\n )\n : null,\n ])\n },\n },\n]\nderiveHeaderFilters(columns)\n</script>\n\n<template>\n <!-- 机构面板内容(展开收起 / 搜索 / 「全部」/ 树),只写一份:宽屏放进 aside,内容区 < 1000 时放进抽屉。 -->\n <DefineOrgPanel>\n <div class=\"side-filter__head\">\n <div class=\"side-filter__actions\">\n <n-tooltip v-if=\"expandableOrgKeys.length\">\n <template #trigger>\n <n-button\n quaternary\n circle\n size=\"small\"\n :aria-label=\"allOrgExpanded ? t('common.collapseAll') : t('common.expandAll')\"\n @click=\"toggleExpandAllOrg\"\n >\n <template #icon>\n <AppIcon\n :icon=\"\n allOrgExpanded ? 'ph:arrows-in-line-vertical' : 'ph:arrows-out-line-vertical'\n \"\n :size=\"18\"\n />\n </template>\n </n-button>\n </template>\n {{ allOrgExpanded ? t('common.collapseAll') : t('common.expandAll') }}\n </n-tooltip>\n </div>\n </div>\n\n <n-input\n v-model:value=\"orgPattern\"\n size=\"small\"\n clearable\n :placeholder=\"t('org.searchPlaceholder')\"\n >\n <template #prefix><AppIcon icon=\"ph:magnifying-glass\" :size=\"14\" /></template>\n </n-input>\n\n <button\n type=\"button\"\n class=\"side-row\"\n :class=\"{ 'is-active': selectedOrgId === null }\"\n @click=\"pickOrg(null)\"\n >\n <AppIcon class=\"side-row__icon\" icon=\"ph:squares-four\" :size=\"15\" />\n <span class=\"side-row__label\">{{ t('user.allOrgs') }}</span>\n </button>\n\n <div class=\"side-filter__divider\" />\n\n <n-spin :show=\"orgLoading\" class=\"fill-pass\">\n <n-tree\n class=\"side-tree\"\n block-line\n selectable\n show-line\n key-field=\"id\"\n label-field=\"name\"\n children-field=\"children\"\n :data=\"orgTree\"\n :pattern=\"orgPattern\"\n :filter=\"filterOrg\"\n :show-irrelevant-nodes=\"false\"\n :selected-keys=\"selectedOrgId == null ? [] : [selectedOrgId]\"\n :expanded-keys=\"orgExpandedKeys\"\n @update:selected-keys=\"onOrgSelect\"\n @update:expanded-keys=\"keys => (orgExpandedKeys = keys as unknown as number[])\"\n />\n </n-spin>\n </DefineOrgPanel>\n\n <!-- 「左分组栏 + 右列表」= styles/layout.css 里的形状 3:.side-page 负责 display/gap/拉伸/整屏高度。\n 窄内容区不画 aside,表格独占整行,SmartTable 照样是 .side-page 的直接子元素,高度链不变。 -->\n <div ref=\"layoutRef\" class=\"user-layout side-page\">\n <!-- 左侧机构树筛选:面板外观/交互对齐内核 .side-filter 约定(机构管理页搜索、展开收起同款) -->\n <aside v-if=\"!compact\" class=\"side-filter\">\n <ReuseOrgPanel />\n </aside>\n\n <SmartTable\n ref=\"tableRef\"\n :columns=\"columns\"\n :fetcher=\"userApi.page\"\n :params=\"tableParams\"\n :search=\"{ container: 'table' }\"\n :toolbar=\"toolbar\"\n fill-height\n :min-row-height=\"TABLE_MIN_ROW_HEIGHT\"\n card-on-narrow\n storage-key=\"sys-user\"\n :checked-row-keys=\"checkedKeys\"\n @update:sorter=\"onSorter\"\n @update:checked-row-keys=\"(keys: (string | number)[]) => (checkedKeys = keys)\"\n @more-select=\"onMoreSelect\"\n @error=\"e => message.error(translateError(e))\"\n >\n <template #pagination-prefix=\"{ itemCount }\">\n <TableTotal :count=\"itemCount\" />\n </template>\n <!-- 内容区 < 1000:机构树收进抽屉,工具栏最左出「机构」按钮(限定数据范围的控件,不是业务按钮,所以放在 #toolbar 左半) -->\n <template v-if=\"compact\" #toolbar>\n <n-button secondary @click=\"orgDrawer = true\">\n <template #icon><AppIcon icon=\"ph:tree-structure\" :size=\"16\" /></template>\n {{ selectedOrgName }}\n </n-button>\n </template>\n <!-- #toolbar-right = 工具栏右半(内置图标之前) -->\n <template #toolbar-right>\n <n-button v-auth=\"'POST:/api/v1/sys/user'\" type=\"primary\" @click=\"userFormRef?.openAdd()\">\n <template #icon><AppIcon icon=\"ph:plus\" :size=\"16\" /></template>\n {{ t('common.add') }}\n </n-button>\n </template>\n <!-- 勾选后工具栏换成批量栏(本页全选 + 已选 N 项 + 这里的按钮 + 取消选择),按钮出现即代表有勾选 -->\n <template #batch>\n <n-button\n v-auth=\"'POST:/api/v1/sys/user/batch-delete'\"\n secondary\n type=\"error\"\n @click=\"batchDelete\"\n >\n <template #icon><AppIcon icon=\"ph:trash\" :size=\"16\" /></template>\n {{ t('common.batchDelete') }}\n </n-button>\n </template>\n </SmartTable>\n </div>\n\n <!-- 内容区 < 1000:机构树的左侧抽屉,选中后自动收起 -->\n <n-drawer v-model:show=\"orgDrawer\" placement=\"left\" width=\"min(300px, 88vw)\">\n <n-drawer-content :title=\"t('user.orgFilter')\" closable>\n <div class=\"org-drawer-body\">\n <ReuseOrgPanel />\n </div>\n </n-drawer-content>\n </n-drawer>\n\n <UserFormModal\n ref=\"userFormRef\"\n :position-options=\"positionOptions\"\n :role-options=\"roleOptions\"\n :director-options=\"directorOptions\"\n @saved=\"() => tableRef?.refresh()\"\n @password-generated=\"p => resetModalRef?.showResult(p, true)\"\n />\n\n <ResetPasswordModal ref=\"resetModalRef\" />\n\n <ImportWizard\n v-model:show=\"importShow\"\n :api=\"userImportApi\"\n :template-file-name=\"t('userExport.importTemplateName')\"\n :error-report-file-name=\"t('userExport.errorReportName')\"\n @done=\"() => tableRef?.refresh()\"\n />\n\n <ExportColumnsModal\n v-model:show=\"exportShow\"\n :columns=\"userExportColumns\"\n :loading=\"exporting\"\n @confirm=\"onExport\"\n />\n</template>\n\n<style scoped>\n/* 树形比平铺分类宽一点:缩进和展开箭头要留出空间,默认 --side-filter-width(224px)偏窄。 */\n.user-layout {\n --side-filter-width: 248px;\n}\n\n/* 抽屉里的机构面板:与 aside 里同样的纵向堆叠与间距 */\n.org-drawer-body {\n display: flex;\n flex-direction: column;\n gap: 8px;\n}\n</style>\n"],"names":["COMPACT_WIDTH","useI18n","message","useMessage","run","confirm","useConfirm","authStore","useAuthStore","tableRef","ref","checkedKeys","batchDelete","useBatchDelete","userApi","_a","userFormRef","resetModalRef","clearMfaLoading","clearUserMfa","user","mfaApi","positionOptions","roleOptions","directorOptions","orgFlat","orgLoading","orgTree","computed","buildTree","selectedOrgId","tableParams","onOrgSelect","keys","pickOrg","layoutRef","layoutWidth","useElementSize","compact","orgDrawer","id","DefineOrgPanel","ReuseOrgPanel","createReusableTemplate","selectedOrgName","o","orgPattern","filterOrg","input","node","kw","org","orgExpandedKeys","expandableOrgKeys","expandableIds","allOrgExpanded","toggleExpandAllOrg","watch","byId","next","cursor","onMounted","items","positionApi","p","roleApi","u","orgApi","route","useRoute","inst","roleId","presetEqualFilter","initial","name","importShow","exportShow","exporting","toolbarMore","toolbar","TABLE_TOOLBAR","onMoreSelect","key","userExportColumns","userImportApi","file","mapping","rows","strategy","sorter","onSorter","state","s","onExport","flatSearchOf","blob","_b","triggerBlobDownload","e","translateError","dash","h","menuIcon","AppIcon","columns","r","NAvatar","SEARCH_ACTIONS","DictTag","StatusSwitch","v","NTag","moreOptions","NSpace","NButton","NPopconfirm","ok","NDropdown","deriveHeaderFilters","_createVNode","_unref","_createElementVNode","_hoisted_1","_hoisted_2","_createBlock","NTooltip","_createTextVNode","_toDisplayString","NInput","$event","_normalizeClass","_hoisted_3","NSpin","NTree","_cache","_openBlock","_createElementBlock","_hoisted_4","SmartTable","TABLE_MIN_ROW_HEIGHT","_withCtx","itemCount","TableTotal","NDrawer","NDrawerContent","_hoisted_5","UserFormModal","ResetPasswordModal","ImportWizard","ExportColumnsModal"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "smart-admin-web",
3
- "version": "10.14.0",
3
+ "version": "10.20.0",
4
4
  "description": "SmartAdmin 前端内核:布局、路由、鉴权、内置系统页与共享组件,配合 SmartAdmin NuGet 包使用",
5
5
  "keywords": [
6
6
  "smartadmin",
@@ -9,13 +9,13 @@
9
9
  "vue3",
10
10
  "naive-ui"
11
11
  ],
12
- "homepage": "https://smartcode-x.github.io/SmartAdmin/",
12
+ "homepage": "https://simpleone-x.github.io/SmartAdmin/",
13
13
  "bugs": {
14
- "url": "https://github.com/SmartCode-X/SmartAdmin/issues"
14
+ "url": "https://github.com/SimpleOne-X/SmartAdmin/issues"
15
15
  },
16
16
  "repository": {
17
17
  "type": "git",
18
- "url": "git+https://github.com/SmartCode-X/SmartAdmin.git",
18
+ "url": "git+https://github.com/SimpleOne-X/SmartAdmin.git",
19
19
  "directory": "web/packages/admin"
20
20
  },
21
21
  "license": "Apache-2.0",
@@ -59,7 +59,7 @@
59
59
  "naive-ui": "^2.45.3",
60
60
  "pinia": "^4.0.3",
61
61
  "smart-naive-icon": "^2.0.0",
62
- "smart-naive-table": "^2.1.1",
62
+ "smart-naive-table": "^3.1.0",
63
63
  "vue": "^3.5.42",
64
64
  "vue-i18n": "^11.4.10",
65
65
  "vue-router": "^4.5.0"
@@ -75,14 +75,12 @@
75
75
  "md-editor-v3": "^6.5.6",
76
76
  "openapi-fetch": "^0.17.0",
77
77
  "pinia-plugin-persistedstate": "^4.2.0",
78
- "sortablejs": "^1.15.7",
79
78
  "vue-echarts": "^8.2.0"
80
79
  },
81
80
  "devDependencies": {
82
81
  "@iconify/utils": "^3.1.7",
83
82
  "@iconify/vue": "^5.0.1",
84
83
  "@types/node": "^22.13.0",
85
- "@types/sortablejs": "^1.15.9",
86
84
  "@vitejs/plugin-vue": "^6.0.8",
87
85
  "@vueuse/core": "^14.4.0",
88
86
  "happy-dom": "^20.13.2",
@@ -90,7 +88,7 @@
90
88
  "openapi-typescript": "^7.6.1",
91
89
  "pinia": "^4.0.3",
92
90
  "smart-naive-icon": "^2.0.0",
93
- "smart-naive-table": "^2.1.1",
91
+ "smart-naive-table": "^3.1.0",
94
92
  "typescript": "^5.7.3",
95
93
  "vite": "^6.0.11",
96
94
  "vite-plugin-dts": "^5.1.0",
@@ -1,76 +0,0 @@
1
- import { DataTableColumns } from 'naive-ui';
2
- type RowKey = string | number;
3
- type SelectTableRow = any;
4
- type PageResult = {
5
- items: SelectTableRow[];
6
- total: number;
7
- };
8
- interface SelectTableSearchField {
9
- key: string;
10
- label: string;
11
- placeholder?: string;
12
- }
13
- type __VLS_Props = {
14
- title: string;
15
- placeholder?: string;
16
- disabled?: boolean;
17
- columns: DataTableColumns<SelectTableRow>;
18
- searchFields?: SelectTableSearchField[];
19
- keywordSearch?: boolean;
20
- keywordSearchPlaceholder?: string;
21
- keywordParam?: string;
22
- fetcher: (params: {
23
- page: number;
24
- pageSize: number;
25
- } & Record<string, unknown>) => Promise<PageResult>;
26
- rowKey: (row: SelectTableRow) => RowKey;
27
- label: (row: SelectTableRow) => string;
28
- multiple?: boolean;
29
- displaySelected?: boolean;
30
- triggerVisible?: boolean;
31
- width?: number;
32
- pageSize?: number;
33
- /** false = 不分页:一次取 unpagedSize 条,表体内滚动。数据量小的档案(岗位、字典项…)这样翻找更快 */
34
- paginated?: boolean;
35
- /** 不分页时单次拉取的上限,超过它的数据仍需靠查询框收窄 */
36
- unpagedSize?: number;
37
- };
38
- declare function open(): void;
39
- type __VLS_ModelProps = {
40
- 'value'?: any | null;
41
- 'selected'?: SelectTableRow | null;
42
- 'values'?: RowKey[];
43
- 'selecteds'?: SelectTableRow[];
44
- };
45
- type __VLS_PublicProps = __VLS_Props & __VLS_ModelProps;
46
- declare const __VLS_export: import('vue').DefineComponent<__VLS_PublicProps, {
47
- open: typeof open;
48
- }, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {
49
- confirm: () => any;
50
- "update:value": (value: any) => any;
51
- "update:selected": (value: any) => any;
52
- "update:values": (value: RowKey[]) => any;
53
- "update:selecteds": (value: any[]) => any;
54
- }, string, import('vue').PublicProps, Readonly<__VLS_PublicProps> & Readonly<{
55
- onConfirm?: (() => any) | undefined;
56
- "onUpdate:value"?: ((value: any) => any) | undefined;
57
- "onUpdate:selected"?: ((value: any) => any) | undefined;
58
- "onUpdate:values"?: ((value: RowKey[]) => any) | undefined;
59
- "onUpdate:selecteds"?: ((value: any[]) => any) | undefined;
60
- }>, {
61
- width: number;
62
- disabled: boolean;
63
- placeholder: string;
64
- multiple: boolean;
65
- pageSize: number;
66
- searchFields: SelectTableSearchField[];
67
- keywordSearch: boolean;
68
- keywordSearchPlaceholder: string;
69
- keywordParam: string;
70
- displaySelected: boolean;
71
- triggerVisible: boolean;
72
- paginated: boolean;
73
- unpagedSize: number;
74
- }, {}, {}, {}, string, import('vue').ComponentProvideOptions, false, {}, any>;
75
- declare const _default: typeof __VLS_export;
76
- export default _default;
@@ -1,256 +0,0 @@
1
- import { defineComponent as _, useModel as C, ref as b, reactive as T, computed as F, watch as I, openBlock as y, createElementBlock as E, Fragment as q, createBlock as P, unref as u, withCtx as n, createVNode as i, createCommentVNode as L, normalizeStyle as ee, createElementVNode as le, withKeys as O, renderList as ae, createTextVNode as B, toDisplayString as M, mergeModels as A } from "vue";
2
- import { useMessage as te, NInput as U, NModal as oe, NButton as x, NDataTable as ue, NSpace as ne } from "naive-ui";
3
- import { useI18n as ie } from "vue-i18n";
4
- import V from "../AppIcon.vue.js";
5
- import { translateError as re } from "../../utils/error.js";
6
- const se = { class: "select-table" }, ce = {
7
- key: 0,
8
- class: "select-table-search"
9
- }, pe = /* @__PURE__ */ _({
10
- __name: "index",
11
- props: /* @__PURE__ */ A({
12
- title: {},
13
- placeholder: { default: "" },
14
- disabled: { type: Boolean, default: !1 },
15
- columns: {},
16
- searchFields: { default: () => [] },
17
- keywordSearch: { type: Boolean, default: !1 },
18
- keywordSearchPlaceholder: { default: "" },
19
- keywordParam: { default: "keyword" },
20
- fetcher: {},
21
- rowKey: {},
22
- label: {},
23
- multiple: { type: Boolean, default: !1 },
24
- displaySelected: { type: Boolean, default: !0 },
25
- triggerVisible: { type: Boolean, default: !0 },
26
- width: { default: 860 },
27
- pageSize: { default: 10 },
28
- paginated: { type: Boolean, default: !0 },
29
- unpagedSize: { default: 200 }
30
- }, {
31
- value: { default: null },
32
- valueModifiers: {},
33
- selected: { default: null },
34
- selectedModifiers: {},
35
- values: { default: () => [] },
36
- valuesModifiers: {},
37
- selecteds: { default: () => [] },
38
- selectedsModifiers: {}
39
- }),
40
- emits: /* @__PURE__ */ A(["confirm"], ["update:value", "update:selected", "update:values", "update:selecteds"]),
41
- setup(t, { expose: G, emit: H }) {
42
- const p = C(t, "value"), h = C(t, "selected"), r = C(t, "values"), K = C(t, "selecteds"), R = H, e = t, { t: w } = ie(), J = te(), d = b(!1), N = b(!1), g = b([]), f = b(null), v = T({}), k = b(""), Q = F(
43
- () => e.multiple ? e.displaySelected ? K.value.map((a) => e.label(a)).join(", ") : "" : h.value ? e.label(h.value) : ""
44
- ), $ = F(
45
- () => g.value.find((a) => e.rowKey(a) === f.value) ?? null
46
- ), W = F(() => r.value.length > 0), s = T({
47
- page: 1,
48
- pageSize: e.pageSize,
49
- itemCount: 0,
50
- showSizePicker: !0,
51
- pageSizes: [10, 20, 50],
52
- onChange: (a) => {
53
- s.page = a, z();
54
- },
55
- onUpdatePageSize: (a) => {
56
- s.pageSize = a, s.page = 1, z();
57
- }
58
- });
59
- I(
60
- () => e.searchFields,
61
- (a) => {
62
- a.forEach((o) => {
63
- v[o.key] == null && (v[o.key] = "");
64
- });
65
- },
66
- { immediate: !0 }
67
- ), I(h, (a) => {
68
- a && (p.value = e.rowKey(a));
69
- });
70
- async function z() {
71
- N.value = !0;
72
- try {
73
- const a = e.keywordSearch ? k.value.trim() ? { [e.keywordParam]: k.value.trim() } : {} : Object.fromEntries(
74
- e.searchFields.map((l) => {
75
- var m;
76
- return [l.key, (m = v[l.key]) == null ? void 0 : m.trim()];
77
- }).filter((l) => !!l[1])
78
- ), o = await e.fetcher({
79
- page: e.paginated ? s.page ?? 1 : 1,
80
- pageSize: e.paginated ? s.pageSize ?? e.pageSize : e.unpagedSize,
81
- ...a
82
- });
83
- g.value = o.items, s.itemCount = o.total, g.value.some((l) => e.rowKey(l) === f.value) || (f.value = p.value);
84
- } catch (a) {
85
- J.error(re(a));
86
- } finally {
87
- N.value = !1;
88
- }
89
- }
90
- function j() {
91
- e.disabled || (f.value = p.value, d.value = !0, z());
92
- }
93
- G({ open: j });
94
- function S() {
95
- s.page = 1, z();
96
- }
97
- function X() {
98
- if (e.keywordSearch) {
99
- k.value = "", S();
100
- return;
101
- }
102
- e.searchFields.forEach((a) => {
103
- v[a.key] = "";
104
- }), S();
105
- }
106
- function Y(a) {
107
- r.value = a;
108
- }
109
- function D(a = $.value) {
110
- if (e.multiple) {
111
- const o = new Map(g.value.map((c) => [e.rowKey(c), c])), l = K.value.filter(
112
- (c) => r.value.includes(e.rowKey(c)) && !o.has(e.rowKey(c))
113
- ), m = r.value.map((c) => o.get(c)).filter(Boolean);
114
- K.value = [...l, ...m], R("confirm"), d.value = !1;
115
- return;
116
- }
117
- a && (p.value = e.rowKey(a), h.value = a, R("confirm"), d.value = !1);
118
- }
119
- function Z() {
120
- e.multiple ? (r.value = [], K.value = []) : (p.value = null, h.value = null);
121
- }
122
- return (a, o) => (y(), E(q, null, [
123
- t.triggerVisible ? (y(), P(u(U), {
124
- key: 0,
125
- value: Q.value,
126
- placeholder: t.placeholder || t.title,
127
- disabled: t.disabled,
128
- readonly: "",
129
- clearable: "",
130
- onClick: j,
131
- onClear: Z
132
- }, {
133
- suffix: n(() => [
134
- i(V, {
135
- icon: "ph:magnifying-glass",
136
- size: 16
137
- })
138
- ]),
139
- _: 1
140
- }, 8, ["value", "placeholder", "disabled"])) : L("", !0),
141
- i(u(oe), {
142
- show: d.value,
143
- "onUpdate:show": o[4] || (o[4] = (l) => d.value = l),
144
- preset: "card",
145
- title: t.title,
146
- style: ee({ width: `${t.width}px` }),
147
- "mask-closable": !1
148
- }, {
149
- footer: n(() => [
150
- i(u(ne), { justify: "end" }, {
151
- default: n(() => [
152
- i(u(x), {
153
- onClick: o[2] || (o[2] = (l) => d.value = !1)
154
- }, {
155
- default: n(() => [
156
- B(M(u(w)("common.cancel")), 1)
157
- ]),
158
- _: 1
159
- }),
160
- i(u(x), {
161
- type: "primary",
162
- disabled: e.multiple ? !W.value : !$.value,
163
- onClick: o[3] || (o[3] = (l) => D())
164
- }, {
165
- default: n(() => [
166
- B(M(u(w)("common.confirm")), 1)
167
- ]),
168
- _: 1
169
- }, 8, ["disabled"])
170
- ]),
171
- _: 1
172
- })
173
- ]),
174
- default: n(() => [
175
- le("div", se, [
176
- t.keywordSearch || t.searchFields.length ? (y(), E("div", ce, [
177
- t.keywordSearch ? (y(), P(u(U), {
178
- key: 0,
179
- value: k.value,
180
- "onUpdate:value": o[0] || (o[0] = (l) => k.value = l),
181
- class: "keyword-input",
182
- clearable: "",
183
- placeholder: t.keywordSearchPlaceholder || u(w)("common.search"),
184
- onKeyup: O(S, ["enter"])
185
- }, null, 8, ["value", "placeholder"])) : (y(!0), E(q, { key: 1 }, ae(t.searchFields, (l) => (y(), P(u(U), {
186
- key: l.key,
187
- value: v[l.key],
188
- "onUpdate:value": (m) => v[l.key] = m,
189
- clearable: "",
190
- placeholder: l.placeholder || l.label,
191
- onKeyup: O(S, ["enter"])
192
- }, null, 8, ["value", "onUpdate:value", "placeholder"]))), 128)),
193
- i(u(x), {
194
- type: "primary",
195
- onClick: S
196
- }, {
197
- icon: n(() => [
198
- i(V, {
199
- icon: "ph:magnifying-glass",
200
- size: 16
201
- })
202
- ]),
203
- default: n(() => [
204
- B(" " + M(u(w)("common.search")), 1)
205
- ]),
206
- _: 1
207
- }),
208
- i(u(x), { onClick: X }, {
209
- icon: n(() => [
210
- i(V, {
211
- icon: "ph:arrow-counter-clockwise",
212
- size: 16
213
- })
214
- ]),
215
- default: n(() => [
216
- B(" " + M(u(w)("common.reset")), 1)
217
- ]),
218
- _: 1
219
- })
220
- ])) : L("", !0),
221
- i(u(ue), {
222
- class: "select-table-grid",
223
- columns: t.columns,
224
- data: g.value,
225
- loading: N.value,
226
- "row-key": t.rowKey,
227
- "checked-row-keys": e.multiple ? r.value : void 0,
228
- "onUpdate:checkedRowKeys": o[1] || (o[1] = (l) => {
229
- e.multiple && Y(l);
230
- }),
231
- "row-props": (l) => ({
232
- style: "cursor: pointer",
233
- onClick: () => {
234
- e.multiple || (f.value = t.rowKey(l));
235
- },
236
- onDblclick: () => {
237
- e.multiple && !r.value.includes(t.rowKey(l)) && (r.value = [...r.value, t.rowKey(l)]), D(l);
238
- }
239
- }),
240
- "row-class-name": (l) => t.rowKey(l) === f.value ? "select-table-row-selected" : "",
241
- pagination: t.paginated ? s : !1,
242
- "max-height": 430,
243
- size: "small",
244
- remote: ""
245
- }, null, 8, ["columns", "data", "loading", "row-key", "checked-row-keys", "row-props", "row-class-name", "pagination"])
246
- ])
247
- ]),
248
- _: 1
249
- }, 8, ["show", "title", "style"])
250
- ], 64));
251
- }
252
- });
253
- export {
254
- pe as default
255
- };
256
- //# sourceMappingURL=index2.vue.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index2.vue.js","sources":["../../../src/components/SelectTable/index.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { computed, reactive, ref, watch } from 'vue'\nimport {\n NButton,\n NDataTable,\n NInput,\n NModal,\n NSpace,\n useMessage,\n type DataTableColumns,\n type PaginationProps,\n} from 'naive-ui'\nimport { useI18n } from 'vue-i18n'\nimport AppIcon from '#/components/AppIcon.vue'\nimport { translateError } from '#/utils/error'\n\ntype RowKey = string | number\ntype SelectTableRow = any\ntype PageResult = { items: SelectTableRow[]; total: number }\n\ninterface SelectTableSearchField {\n key: string\n label: string\n placeholder?: string\n}\n\nconst value = defineModel<any | null>('value', { default: null })\nconst selected = defineModel<SelectTableRow | null>('selected', { default: null })\nconst values = defineModel<RowKey[]>('values', { default: () => [] })\nconst selecteds = defineModel<SelectTableRow[]>('selecteds', { default: () => [] })\nconst emit = defineEmits<{ confirm: [] }>()\n\nconst props = withDefaults(\n defineProps<{\n title: string\n placeholder?: string\n disabled?: boolean\n columns: DataTableColumns<SelectTableRow>\n searchFields?: SelectTableSearchField[]\n keywordSearch?: boolean\n keywordSearchPlaceholder?: string\n keywordParam?: string\n fetcher: (\n params: { page: number; pageSize: number } & Record<string, unknown>,\n ) => Promise<PageResult>\n rowKey: (row: SelectTableRow) => RowKey\n label: (row: SelectTableRow) => string\n multiple?: boolean\n displaySelected?: boolean\n triggerVisible?: boolean\n width?: number\n pageSize?: number\n /** false = 不分页:一次取 unpagedSize 条,表体内滚动。数据量小的档案(岗位、字典项…)这样翻找更快 */\n paginated?: boolean\n /** 不分页时单次拉取的上限,超过它的数据仍需靠查询框收窄 */\n unpagedSize?: number\n }>(),\n {\n placeholder: '',\n disabled: false,\n searchFields: () => [],\n keywordSearch: false,\n keywordSearchPlaceholder: '',\n keywordParam: 'keyword',\n width: 860,\n pageSize: 10,\n multiple: false,\n displaySelected: true,\n triggerVisible: true,\n paginated: true,\n unpagedSize: 200,\n },\n)\n\nconst { t } = useI18n()\nconst message = useMessage()\nconst show = ref(false)\nconst loading = ref(false)\nconst rows = ref<SelectTableRow[]>([])\nconst selectedKey = ref<RowKey | null>(null)\nconst query = reactive<Record<string, string>>({})\nconst keyword = ref('')\n\nconst displayText = computed(() =>\n props.multiple\n ? props.displaySelected\n ? selecteds.value.map(row => props.label(row)).join(', ')\n : ''\n : selected.value\n ? props.label(selected.value)\n : '',\n)\nconst currentRow = computed(\n () => rows.value.find(row => props.rowKey(row) === selectedKey.value) ?? null,\n)\nconst hasMultipleSelection = computed(() => values.value.length > 0)\n\nconst pagination = reactive<PaginationProps>({\n page: 1,\n pageSize: props.pageSize,\n itemCount: 0,\n showSizePicker: true,\n pageSizes: [10, 20, 50],\n onChange: page => {\n pagination.page = page\n void load()\n },\n onUpdatePageSize: pageSize => {\n pagination.pageSize = pageSize\n pagination.page = 1\n void load()\n },\n})\n\nwatch(\n () => props.searchFields,\n fields => {\n fields.forEach(field => {\n if (query[field.key] == null) query[field.key] = ''\n })\n },\n { immediate: true },\n)\n\nwatch(selected, next => {\n if (next) value.value = props.rowKey(next)\n})\n\nasync function load() {\n loading.value = true\n try {\n const filters = props.keywordSearch\n ? keyword.value.trim()\n ? { [props.keywordParam]: keyword.value.trim() }\n : {}\n : Object.fromEntries(\n props.searchFields\n .map(field => [field.key, query[field.key]?.trim()])\n .filter((entry): entry is [string, string] => Boolean(entry[1])),\n )\n const page = await props.fetcher({\n page: props.paginated ? (pagination.page ?? 1) : 1,\n pageSize: props.paginated ? (pagination.pageSize ?? props.pageSize) : props.unpagedSize,\n ...filters,\n })\n rows.value = page.items\n pagination.itemCount = page.total\n if (!rows.value.some(row => props.rowKey(row) === selectedKey.value))\n selectedKey.value = value.value\n } catch (e) {\n message.error(translateError(e))\n } finally {\n loading.value = false\n }\n}\n\nfunction open() {\n if (props.disabled) return\n selectedKey.value = value.value\n show.value = true\n void load()\n}\n\ndefineExpose({ open })\n\nfunction search() {\n pagination.page = 1\n void load()\n}\n\nfunction reset() {\n if (props.keywordSearch) {\n keyword.value = ''\n search()\n return\n }\n props.searchFields.forEach(field => {\n query[field.key] = ''\n })\n search()\n}\n\nfunction updateCheckedKeys(keys: RowKey[]) {\n values.value = keys\n}\n\nfunction confirm(row = currentRow.value) {\n if (props.multiple) {\n const currentRows = new Map(rows.value.map(item => [props.rowKey(item), item]))\n const preservedRows = selecteds.value.filter(\n item => values.value.includes(props.rowKey(item)) && !currentRows.has(props.rowKey(item)),\n )\n const pickedRows = values.value.map(key => currentRows.get(key)).filter(Boolean)\n selecteds.value = [...preservedRows, ...pickedRows]\n emit('confirm')\n show.value = false\n return\n }\n if (!row) return\n value.value = props.rowKey(row)\n selected.value = row\n emit('confirm')\n show.value = false\n}\n\nfunction clear() {\n if (props.multiple) {\n values.value = []\n selecteds.value = []\n } else {\n value.value = null\n selected.value = null\n }\n}\n</script>\n\n<template>\n <n-input\n v-if=\"triggerVisible\"\n :value=\"displayText\"\n :placeholder=\"placeholder || title\"\n :disabled=\"disabled\"\n readonly\n clearable\n @click=\"open\"\n @clear=\"clear\"\n >\n <template #suffix>\n <AppIcon icon=\"ph:magnifying-glass\" :size=\"16\" />\n </template>\n </n-input>\n\n <n-modal\n v-model:show=\"show\"\n preset=\"card\"\n :title=\"title\"\n :style=\"{ width: `${width}px` }\"\n :mask-closable=\"false\"\n >\n <div class=\"select-table\">\n <!-- 用普通 flex 容器而不是 n-space:查询框要吃掉整行剩余宽度(占位文案可能很长),\n n-space 会把每个子项包一层内容宽度的 div,撑不开。 -->\n <div v-if=\"keywordSearch || searchFields.length\" class=\"select-table-search\">\n <n-input\n v-if=\"keywordSearch\"\n v-model:value=\"keyword\"\n class=\"keyword-input\"\n clearable\n :placeholder=\"keywordSearchPlaceholder || t('common.search')\"\n @keyup.enter=\"search\"\n />\n <template v-else>\n <n-input\n v-for=\"field in searchFields\"\n :key=\"field.key\"\n v-model:value=\"query[field.key]\"\n clearable\n :placeholder=\"field.placeholder || field.label\"\n @keyup.enter=\"search\"\n />\n </template>\n <n-button type=\"primary\" @click=\"search\">\n <template #icon><AppIcon icon=\"ph:magnifying-glass\" :size=\"16\" /></template>\n {{ t('common.search') }}\n </n-button>\n <n-button @click=\"reset\">\n <template #icon><AppIcon icon=\"ph:arrow-counter-clockwise\" :size=\"16\" /></template>\n {{ t('common.reset') }}\n </n-button>\n </div>\n\n <n-data-table\n class=\"select-table-grid\"\n :columns=\"columns\"\n :data=\"rows\"\n :loading=\"loading\"\n :row-key=\"rowKey\"\n :checked-row-keys=\"props.multiple ? values : undefined\"\n @update:checked-row-keys=\"\n keys => {\n if (props.multiple) updateCheckedKeys(keys as RowKey[])\n }\n \"\n :row-props=\"\n (row: SelectTableRow) => ({\n style: 'cursor: pointer',\n onClick: () => {\n if (!props.multiple) selectedKey = rowKey(row)\n },\n onDblclick: () => {\n if (props.multiple && !values.includes(rowKey(row))) values = [...values, rowKey(row)]\n confirm(row)\n },\n })\n \"\n :row-class-name=\"\n (row: SelectTableRow) => (rowKey(row) === selectedKey ? 'select-table-row-selected' : '')\n \"\n :pagination=\"paginated ? pagination : false\"\n :max-height=\"430\"\n size=\"small\"\n remote\n />\n </div>\n\n <template #footer>\n <n-space justify=\"end\">\n <n-button @click=\"show = false\">{{ t('common.cancel') }}</n-button>\n <n-button\n type=\"primary\"\n :disabled=\"props.multiple ? !hasMultipleSelection : !currentRow\"\n @click=\"confirm()\"\n >\n {{ t('common.confirm') }}\n </n-button>\n </n-space>\n </template>\n </n-modal>\n</template>\n\n<style scoped>\n.select-table {\n height: 520px;\n min-height: 0;\n display: flex;\n flex-direction: column;\n gap: 12px;\n}\n.select-table-search {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n gap: 8px;\n}\n/* 多字段模式:每个框放得下「编号」这类字段名占位 */\n.select-table-search :deep(.n-input) {\n flex: 0 1 200px;\n}\n/* 单框模糊查询:占位文案是「请输入编号或名称」这种整句,英文更长,\n 所以让它吃掉整行剩余宽度,而不是写死一个迟早不够用的像素值。 */\n.select-table-search .keyword-input {\n flex: 1 1 320px;\n min-width: 260px;\n}\n.select-table-search :deep(.n-button) {\n flex: none;\n}\n.select-table-grid {\n flex: 1;\n min-height: 0;\n}\n:deep(.select-table-row-selected td) {\n background-color: var(--table-selected-bg);\n}\n</style>\n"],"names":["value","_useModel","__props","selected","values","selecteds","emit","__emit","props","t","useI18n","message","useMessage","show","ref","loading","rows","selectedKey","query","reactive","keyword","displayText","computed","row","currentRow","hasMultipleSelection","pagination","page","load","pageSize","watch","fields","field","next","filters","_a","entry","e","translateError","open","__expose","search","reset","updateCheckedKeys","keys","confirm","currentRows","item","preservedRows","pickedRows","key","clear","_createBlock","_unref","NInput","_createVNode","AppIcon","NModal","$event","NSpace","NButton","_createElementVNode","_hoisted_1","_openBlock","_createElementBlock","_hoisted_2","_Fragment","_renderList","_createTextVNode","NDataTable","_cache"],"mappings":"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"}