smart-admin-web 10.15.0 → 10.20.1

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 (432) hide show
  1. package/README.md +1 -1
  2. package/dist/api/index.d.ts +4 -2
  3. package/dist/api/index.js +1 -1
  4. package/dist/api/index.js.map +1 -1
  5. package/dist/api/schema.d.ts +39 -5
  6. package/dist/assets/icons/ph-subset.json.js +5 -5
  7. package/dist/components/AppIcon.vue.js +9 -9
  8. package/dist/components/AppIcon.vue.js.map +1 -1
  9. package/dist/components/AppWatermark.vue.d.ts +14 -0
  10. package/dist/components/AppWatermark.vue.js +38 -0
  11. package/dist/components/AppWatermark.vue.js.map +1 -0
  12. package/dist/components/AppWatermark2.vue.js +5 -0
  13. package/dist/components/AppWatermark2.vue.js.map +1 -0
  14. package/dist/components/Chart/PieChart.vue.d.ts +1 -1
  15. package/dist/components/Chart/echarts.js +15 -20
  16. package/dist/components/Chart/echarts.js.map +1 -1
  17. package/dist/components/CronEditor/index.vue.js +1 -1
  18. package/dist/components/CronEditor/index2.vue.js +2 -1
  19. package/dist/components/CronEditor/index2.vue.js.map +1 -1
  20. package/dist/components/DetailPage/index.vue.js +2 -2
  21. package/dist/components/DetailPage/index2.vue.js.map +1 -1
  22. package/dist/components/DictTag/index.vue.js.map +1 -1
  23. package/dist/components/ErrorBoundary/index.vue.js +2 -2
  24. package/dist/components/ErrorBoundary/index2.vue.js +1 -1
  25. package/dist/components/ErrorBoundary/index2.vue.js.map +1 -1
  26. package/dist/components/FormContainer/index.vue.js +91 -56
  27. package/dist/components/FormContainer/index.vue.js.map +1 -1
  28. package/dist/components/ImportWizard/index.vue.js +1 -1
  29. package/dist/components/ImportWizard/index2.vue.js +44 -41
  30. package/dist/components/ImportWizard/index2.vue.js.map +1 -1
  31. package/dist/components/MenuSearch.vue.js +2 -2
  32. package/dist/components/MenuSearch2.vue.js +19 -18
  33. package/dist/components/MenuSearch2.vue.js.map +1 -1
  34. package/dist/components/PasswordStrength/index.vue.js +2 -2
  35. package/dist/components/PasswordStrength/index2.vue.js +20 -18
  36. package/dist/components/PasswordStrength/index2.vue.js.map +1 -1
  37. package/dist/components/TableTotal/index.vue.d.ts +6 -0
  38. package/dist/components/{SelectTable → TableTotal}/index.vue.js +1 -1
  39. package/dist/components/TableTotal/index2.vue.js +16 -0
  40. package/dist/components/TableTotal/index2.vue.js.map +1 -0
  41. package/dist/components/TableZoomButton/index.vue.js.map +1 -1
  42. package/dist/components/UserPicker/index.vue.js +2 -2
  43. package/dist/components/UserPicker/index2.vue.js +176 -117
  44. package/dist/components/UserPicker/index2.vue.js.map +1 -1
  45. package/dist/composables/useBatchDelete.js.map +1 -1
  46. package/dist/composables/useLayoutMenu.js +17 -16
  47. package/dist/composables/useLayoutMenu.js.map +1 -1
  48. package/dist/composables/useModule.js +39 -29
  49. package/dist/composables/useModule.js.map +1 -1
  50. package/dist/composables/useShellBreakpoint.d.ts +19 -0
  51. package/dist/composables/useShellBreakpoint.js +37 -0
  52. package/dist/composables/useShellBreakpoint.js.map +1 -0
  53. package/dist/composables/useSite.d.ts +15 -0
  54. package/dist/composables/useSite.js +16 -14
  55. package/dist/composables/useSite.js.map +1 -1
  56. package/dist/composables/useTabTitle.js.map +1 -1
  57. package/dist/composables/useTableTitle.d.ts +6 -0
  58. package/dist/composables/useTableTitle.js +11 -0
  59. package/dist/composables/useTableTitle.js.map +1 -0
  60. package/dist/composables/useTableZoom.d.ts +5 -0
  61. package/dist/composables/useTableZoom.js.map +1 -1
  62. package/dist/composables/useTheme.d.ts +2 -2
  63. package/dist/composables/useTheme.js +23 -20
  64. package/dist/composables/useTheme.js.map +1 -1
  65. package/dist/createSmartAdmin.d.ts +12 -2
  66. package/dist/createSmartAdmin.js +72 -60
  67. package/dist/createSmartAdmin.js.map +1 -1
  68. package/dist/index.d.ts +5 -2
  69. package/dist/index.js +219 -205
  70. package/dist/index.js.map +1 -1
  71. package/dist/layouts/AccentPicker.vue.js +8 -0
  72. package/dist/layouts/AccentPicker.vue.js.map +1 -0
  73. package/dist/layouts/AccentPicker2.vue.js +131 -0
  74. package/dist/layouts/AccentPicker2.vue.js.map +1 -0
  75. package/dist/layouts/AppHeader.vue.d.ts +8 -1
  76. package/dist/layouts/AppHeader.vue.js +2 -2
  77. package/dist/layouts/AppHeader2.vue.js +317 -235
  78. package/dist/layouts/AppHeader2.vue.js.map +1 -1
  79. package/dist/layouts/NoticeBell.vue.js +2 -2
  80. package/dist/layouts/NoticeBell2.vue.js +19 -18
  81. package/dist/layouts/NoticeBell2.vue.js.map +1 -1
  82. package/dist/layouts/PersonalLayout.vue.js +2 -2
  83. package/dist/layouts/PersonalLayout2.vue.js +69 -47
  84. package/dist/layouts/PersonalLayout2.vue.js.map +1 -1
  85. package/dist/layouts/SettingsDrawer.vue.js +3 -3
  86. package/dist/layouts/SettingsDrawer2.vue.js +261 -325
  87. package/dist/layouts/SettingsDrawer2.vue.js.map +1 -1
  88. package/dist/layouts/TabsBar.vue.js +2 -2
  89. package/dist/layouts/TabsBar2.vue.js +97 -69
  90. package/dist/layouts/TabsBar2.vue.js.map +1 -1
  91. package/dist/layouts/components/SideNav.vue.d.ts +3 -0
  92. package/dist/layouts/components/SideNav.vue.js +1 -1
  93. package/dist/layouts/components/SideNav2.vue.js +54 -26
  94. package/dist/layouts/components/SideNav2.vue.js.map +1 -1
  95. package/dist/layouts/default.vue.js +1 -1
  96. package/dist/layouts/default2.vue.js +170 -140
  97. package/dist/layouts/default2.vue.js.map +1 -1
  98. package/dist/lib/loginHero.d.ts +2 -2
  99. package/dist/lib/loginHero.js.map +1 -1
  100. package/dist/lib/runtime.js +1 -1
  101. package/dist/lib/watermark.d.ts +110 -0
  102. package/dist/lib/watermark.js +151 -0
  103. package/dist/lib/watermark.js.map +1 -0
  104. package/dist/locales/en-US.d.ts +221 -15
  105. package/dist/locales/en-US.js +230 -21
  106. package/dist/locales/en-US.js.map +1 -1
  107. package/dist/locales/kernelMenuTitles.d.ts +1 -0
  108. package/dist/locales/kernelMenuTitles.js +128 -0
  109. package/dist/locales/kernelMenuTitles.js.map +1 -0
  110. package/dist/locales/menuTitle.d.ts +3 -0
  111. package/dist/locales/menuTitle.js +14 -12
  112. package/dist/locales/menuTitle.js.map +1 -1
  113. package/dist/locales/zh-CN.d.ts +221 -15
  114. package/dist/locales/zh-CN.js +238 -28
  115. package/dist/locales/zh-CN.js.map +1 -1
  116. package/dist/router/index.js +41 -32
  117. package/dist/router/index.js.map +1 -1
  118. package/dist/router/namedPage.d.ts +4 -0
  119. package/dist/router/namedPage.js +7 -7
  120. package/dist/router/namedPage.js.map +1 -1
  121. package/dist/router/viewRegistry.js +8 -8
  122. package/dist/router/viewRegistry.js.map +1 -1
  123. package/dist/stores/app.d.ts +0 -12
  124. package/dist/stores/app.js +11 -12
  125. package/dist/stores/app.js.map +1 -1
  126. package/dist/stores/tabs.js.map +1 -1
  127. package/dist/stores/user.d.ts +10 -0
  128. package/dist/stores/user.js.map +1 -1
  129. package/dist/style.css +1 -1
  130. package/dist/theme/accentTokens.d.ts +27 -0
  131. package/dist/theme/accentTokens.js +54 -0
  132. package/dist/theme/accentTokens.js.map +1 -0
  133. package/dist/theme/accents.d.ts +21 -1
  134. package/dist/theme/accents.js +11 -2
  135. package/dist/theme/accents.js.map +1 -1
  136. package/dist/theme/mix.d.ts +58 -7
  137. package/dist/theme/mix.js +115 -30
  138. package/dist/theme/mix.js.map +1 -1
  139. package/dist/theme/naive-theme.d.ts +5 -2
  140. package/dist/theme/naive-theme.js +407 -75
  141. package/dist/theme/naive-theme.js.map +1 -1
  142. package/dist/utils/jwt.d.ts +8 -0
  143. package/dist/utils/jwt.js +14 -0
  144. package/dist/utils/jwt.js.map +1 -0
  145. package/dist/utils/menuIcon.d.ts +2 -0
  146. package/dist/utils/menuIcon.js +8 -0
  147. package/dist/utils/menuIcon.js.map +1 -0
  148. package/dist/utils/oauthBrand.js.map +1 -1
  149. package/dist/utils/tableFilter.d.ts +88 -0
  150. package/dist/utils/tableFilter.js +116 -0
  151. package/dist/utils/tableFilter.js.map +1 -0
  152. package/dist/utils/tableToolbar.d.ts +18 -0
  153. package/dist/utils/tableToolbar.js +11 -0
  154. package/dist/utils/tableToolbar.js.map +1 -0
  155. package/dist/utils/treeFilter.d.ts +20 -0
  156. package/dist/utils/treeFilter.js +24 -0
  157. package/dist/utils/treeFilter.js.map +1 -0
  158. package/dist/views/dashboard/ShortcutPicker.vue.js +1 -1
  159. package/dist/views/dashboard/ShortcutPicker2.vue.js +73 -48
  160. package/dist/views/dashboard/ShortcutPicker2.vue.js.map +1 -1
  161. package/dist/views/dashboard/biz.vue.js +1 -1
  162. package/dist/views/dashboard/biz2.vue.js +310 -257
  163. package/dist/views/dashboard/biz2.vue.js.map +1 -1
  164. package/dist/views/dashboard/workbench.vue.js +2 -2
  165. package/dist/views/dashboard/workbench2.vue.js +141 -155
  166. package/dist/views/dashboard/workbench2.vue.js.map +1 -1
  167. package/dist/views/embed/iframe.vue.js +2 -2
  168. package/dist/views/embed/iframe2.vue.js +22 -15
  169. package/dist/views/embed/iframe2.vue.js.map +1 -1
  170. package/dist/views/error/404.vue.js +2 -2
  171. package/dist/views/error/4042.vue.js +33 -24
  172. package/dist/views/error/4042.vue.js.map +1 -1
  173. package/dist/views/error/BootError.vue.js +1 -1
  174. package/dist/views/error/BootError2.vue.js +59 -48
  175. package/dist/views/error/BootError2.vue.js.map +1 -1
  176. package/dist/views/error/MissingRoute.vue.js +2 -2
  177. package/dist/views/error/MissingRoute2.vue.js +34 -15
  178. package/dist/views/error/MissingRoute2.vue.js.map +1 -1
  179. package/dist/views/login/LoginForm.vue.d.ts +7 -1
  180. package/dist/views/login/LoginForm.vue.js +2 -2
  181. package/dist/views/login/LoginForm2.vue.js +580 -488
  182. package/dist/views/login/LoginForm2.vue.js.map +1 -1
  183. package/dist/views/login/components/LoginDesk.vue.d.ts +36 -0
  184. package/dist/views/login/components/LoginDesk.vue.js +9 -0
  185. package/dist/views/login/components/LoginDesk.vue.js.map +1 -0
  186. package/dist/views/login/components/LoginDesk2.vue.js +100 -0
  187. package/dist/views/login/components/LoginDesk2.vue.js.map +1 -0
  188. package/dist/views/login/components/LoginHeroPanel.vue.js +3 -3
  189. package/dist/views/login/components/LoginHeroPanel2.vue.js +34 -39
  190. package/dist/views/login/components/LoginHeroPanel2.vue.js.map +1 -1
  191. package/dist/views/login/index.vue.js +1 -1
  192. package/dist/views/login/index2.vue.js +141 -71
  193. package/dist/views/login/index2.vue.js.map +1 -1
  194. package/dist/views/login/layout.d.ts +11 -0
  195. package/dist/views/login/layout.js +27 -0
  196. package/dist/views/login/layout.js.map +1 -0
  197. package/dist/views/mfa/index.vue.js +2 -2
  198. package/dist/views/mfa/index2.vue.js +367 -321
  199. package/dist/views/mfa/index2.vue.js.map +1 -1
  200. package/dist/views/module/index.vue.js +2 -2
  201. package/dist/views/module/index2.vue.js +132 -99
  202. package/dist/views/module/index2.vue.js.map +1 -1
  203. package/dist/views/oauth/callback.vue.js +2 -2
  204. package/dist/views/oauth/callback2.vue.js +65 -51
  205. package/dist/views/oauth/callback2.vue.js.map +1 -1
  206. package/dist/views/personal/bindings.vue.js +2 -2
  207. package/dist/views/personal/bindings2.vue.js +98 -94
  208. package/dist/views/personal/bindings2.vue.js.map +1 -1
  209. package/dist/views/personal/notice2.vue.js +103 -76
  210. package/dist/views/personal/notice2.vue.js.map +1 -1
  211. package/dist/views/personal/password2.vue.js +47 -40
  212. package/dist/views/personal/password2.vue.js.map +1 -1
  213. package/dist/views/personal/profile.vue.js +3 -3
  214. package/dist/views/personal/profile2.vue.js +24 -18
  215. package/dist/views/personal/profile2.vue.js.map +1 -1
  216. package/dist/views/personal/security.vue.js +2 -2
  217. package/dist/views/personal/security2.vue.js +65 -53
  218. package/dist/views/personal/security2.vue.js.map +1 -1
  219. package/dist/views/personal/sessions.vue.js +2 -2
  220. package/dist/views/personal/sessions2.vue.js +67 -62
  221. package/dist/views/personal/sessions2.vue.js.map +1 -1
  222. package/dist/views/system/ai-model/components/ProviderCard.vue.js +2 -2
  223. package/dist/views/system/ai-model/components/ProviderCard2.vue.js +142 -130
  224. package/dist/views/system/ai-model/components/ProviderCard2.vue.js.map +1 -1
  225. package/dist/views/system/ai-model/components/ProviderForm.vue.js +2 -2
  226. package/dist/views/system/ai-model/components/ProviderForm2.vue.js +71 -70
  227. package/dist/views/system/ai-model/components/ProviderForm2.vue.js.map +1 -1
  228. package/dist/views/system/ai-model/index.vue.js +2 -2
  229. package/dist/views/system/ai-model/index2.vue.js +99 -99
  230. package/dist/views/system/ai-model/index2.vue.js.map +1 -1
  231. package/dist/views/system/ai-model/presets.d.ts +1 -1
  232. package/dist/views/system/ai-model/presets.js +18 -18
  233. package/dist/views/system/ai-model/presets.js.map +1 -1
  234. package/dist/views/system/ai-usage/index.vue.js +2 -2
  235. package/dist/views/system/ai-usage/index2.vue.js +356 -258
  236. package/dist/views/system/ai-usage/index2.vue.js.map +1 -1
  237. package/dist/views/system/api-docs/index.vue.js +5 -2
  238. package/dist/views/system/api-docs/index.vue.js.map +1 -1
  239. package/dist/views/system/api-docs/index2.vue.js +92 -42
  240. package/dist/views/system/api-docs/index2.vue.js.map +1 -1
  241. package/dist/views/system/cache/index.vue.js +2 -2
  242. package/dist/views/system/cache/index2.vue.js +74 -80
  243. package/dist/views/system/cache/index2.vue.js.map +1 -1
  244. package/dist/views/system/config/components/AdminMock.vue.js +2 -2
  245. package/dist/views/system/config/components/AdminMock2.vue.js +60 -43
  246. package/dist/views/system/config/components/AdminMock2.vue.js.map +1 -1
  247. package/dist/views/system/config/components/AdvancedSection.vue.js +5 -2
  248. package/dist/views/system/config/components/AdvancedSection.vue.js.map +1 -1
  249. package/dist/views/system/config/components/AdvancedSection2.vue.js +98 -70
  250. package/dist/views/system/config/components/AdvancedSection2.vue.js.map +1 -1
  251. package/dist/views/system/config/components/BrandSection.vue.js +2 -2
  252. package/dist/views/system/config/components/BrandSection2.vue.js +121 -119
  253. package/dist/views/system/config/components/BrandSection2.vue.js.map +1 -1
  254. package/dist/views/system/config/components/CfgGroup.vue.js +3 -3
  255. package/dist/views/system/config/components/CfgGroup2.vue.js.map +1 -1
  256. package/dist/views/system/config/components/CfgRow.vue.js +1 -1
  257. package/dist/views/system/config/components/CfgRow2.vue.js +24 -23
  258. package/dist/views/system/config/components/CfgRow2.vue.js.map +1 -1
  259. package/dist/views/system/config/components/CfgSegment.vue.js +1 -1
  260. package/dist/views/system/config/components/CfgSegment2.vue.js +16 -15
  261. package/dist/views/system/config/components/CfgSegment2.vue.js.map +1 -1
  262. package/dist/views/system/config/components/ConfigFormModal.vue.js +2 -2
  263. package/dist/views/system/config/components/ConfigFormModal2.vue.js +35 -33
  264. package/dist/views/system/config/components/ConfigFormModal2.vue.js.map +1 -1
  265. package/dist/views/system/config/components/JobSection.vue.js +2 -2
  266. package/dist/views/system/config/components/JobSection2.vue.js +46 -44
  267. package/dist/views/system/config/components/JobSection2.vue.js.map +1 -1
  268. package/dist/views/system/config/components/LoginMock.vue.js +3 -3
  269. package/dist/views/system/config/components/LoginMock2.vue.js +83 -72
  270. package/dist/views/system/config/components/LoginMock2.vue.js.map +1 -1
  271. package/dist/views/system/config/components/LogoCropper.vue.js +1 -1
  272. package/dist/views/system/config/components/LogoCropper2.vue.js.map +1 -1
  273. package/dist/views/system/config/components/LogoEditor.vue.js +2 -2
  274. package/dist/views/system/config/components/LogoEditor2.vue.js +11 -13
  275. package/dist/views/system/config/components/LogoEditor2.vue.js.map +1 -1
  276. package/dist/views/system/config/components/ProviderSheet.vue.js +3 -3
  277. package/dist/views/system/config/components/ProviderSheet2.vue.js.map +1 -1
  278. package/dist/views/system/config/components/SectionLayout.vue.d.ts +4 -2
  279. package/dist/views/system/config/components/SectionLayout.vue.js +2 -2
  280. package/dist/views/system/config/components/SectionLayout2.vue.js +51 -27
  281. package/dist/views/system/config/components/SectionLayout2.vue.js.map +1 -1
  282. package/dist/views/system/config/components/SecuritySection.vue.js +2 -2
  283. package/dist/views/system/config/components/SecuritySection2.vue.js +207 -206
  284. package/dist/views/system/config/components/SecuritySection2.vue.js.map +1 -1
  285. package/dist/views/system/config/components/SensitiveSection.vue.js +2 -2
  286. package/dist/views/system/config/components/SensitiveSection2.vue.js +107 -102
  287. package/dist/views/system/config/components/SensitiveSection2.vue.js.map +1 -1
  288. package/dist/views/system/config/components/UploadSection.vue.js +2 -2
  289. package/dist/views/system/config/components/UploadSection2.vue.js +86 -77
  290. package/dist/views/system/config/components/UploadSection2.vue.js.map +1 -1
  291. package/dist/views/system/config/components/WatermarkSection.vue.js +8 -0
  292. package/dist/views/system/config/components/WatermarkSection.vue.js.map +1 -0
  293. package/dist/views/system/config/components/WatermarkSection2.vue.js +284 -0
  294. package/dist/views/system/config/components/WatermarkSection2.vue.js.map +1 -0
  295. package/dist/views/system/config/draft.d.ts +2 -2
  296. package/dist/views/system/config/draft.js.map +1 -1
  297. package/dist/views/system/config/groups.d.ts +4 -1
  298. package/dist/views/system/config/groups.js +54 -49
  299. package/dist/views/system/config/groups.js.map +1 -1
  300. package/dist/views/system/config/index.vue.js +3 -2
  301. package/dist/views/system/config/index.vue.js.map +1 -1
  302. package/dist/views/system/config/index2.vue.js +173 -148
  303. package/dist/views/system/config/index2.vue.js.map +1 -1
  304. package/dist/views/system/config/layoutMode.d.ts +23 -0
  305. package/dist/views/system/config/layoutMode.js +28 -0
  306. package/dist/views/system/config/layoutMode.js.map +1 -0
  307. package/dist/views/system/dict/index.vue.js +2 -2
  308. package/dist/views/system/dict/index2.vue.js +471 -366
  309. package/dist/views/system/dict/index2.vue.js.map +1 -1
  310. package/dist/views/system/file/index2.vue.js +91 -76
  311. package/dist/views/system/file/index2.vue.js.map +1 -1
  312. package/dist/views/system/job/index.vue.js +3 -3
  313. package/dist/views/system/job/index2.vue.js +897 -828
  314. package/dist/views/system/job/index2.vue.js.map +1 -1
  315. package/dist/views/system/job-log/components/AttemptTable.vue.d.ts +8 -0
  316. package/dist/views/system/job-log/components/AttemptTable.vue.js +5 -0
  317. package/dist/views/system/job-log/components/AttemptTable.vue.js.map +1 -0
  318. package/dist/views/system/job-log/components/AttemptTable2.vue.js +54 -0
  319. package/dist/views/system/job-log/components/AttemptTable2.vue.js.map +1 -0
  320. package/dist/views/system/job-log/index.vue.js +2 -2
  321. package/dist/views/system/job-log/index2.vue.js +193 -207
  322. package/dist/views/system/job-log/index2.vue.js.map +1 -1
  323. package/dist/views/system/job-log/runStatus.d.ts +13 -0
  324. package/dist/views/system/job-log/runStatus.js +26 -0
  325. package/dist/views/system/job-log/runStatus.js.map +1 -0
  326. package/dist/views/system/job-monitor/index.vue.js +2 -2
  327. package/dist/views/system/job-monitor/index2.vue.js +172 -180
  328. package/dist/views/system/job-monitor/index2.vue.js.map +1 -1
  329. package/dist/views/system/log/exception/index.vue.js +2 -2
  330. package/dist/views/system/log/exception/index2.vue.js +135 -96
  331. package/dist/views/system/log/exception/index2.vue.js.map +1 -1
  332. package/dist/views/system/log/login/index2.vue.js +62 -41
  333. package/dist/views/system/log/login/index2.vue.js.map +1 -1
  334. package/dist/views/system/log/op/index.vue.js +2 -2
  335. package/dist/views/system/log/op/index2.vue.js +200 -162
  336. package/dist/views/system/log/op/index2.vue.js.map +1 -1
  337. package/dist/views/system/menu/components/ButtonManager.vue.js +2 -2
  338. package/dist/views/system/menu/components/ButtonManager2.vue.js +206 -190
  339. package/dist/views/system/menu/components/ButtonManager2.vue.js.map +1 -1
  340. package/dist/views/system/menu/components/MenuFormModal.vue.js +2 -2
  341. package/dist/views/system/menu/components/MenuFormModal2.vue.js +127 -118
  342. package/dist/views/system/menu/components/MenuFormModal2.vue.js.map +1 -1
  343. package/dist/views/system/menu/index.vue.js +1 -1
  344. package/dist/views/system/menu/index2.vue.js +216 -183
  345. package/dist/views/system/menu/index2.vue.js.map +1 -1
  346. package/dist/views/system/module/index.vue.js +1 -1
  347. package/dist/views/system/module/index2.vue.js +177 -144
  348. package/dist/views/system/module/index2.vue.js.map +1 -1
  349. package/dist/views/system/monitor/index.vue.js +2 -2
  350. package/dist/views/system/monitor/index2.vue.js +134 -149
  351. package/dist/views/system/monitor/index2.vue.js.map +1 -1
  352. package/dist/views/system/notice/index.vue.js +1 -1
  353. package/dist/views/system/notice/index2.vue.js +209 -181
  354. package/dist/views/system/notice/index2.vue.js.map +1 -1
  355. package/dist/views/system/org/index.vue.js +1 -1
  356. package/dist/views/system/org/index2.vue.js +278 -248
  357. package/dist/views/system/org/index2.vue.js.map +1 -1
  358. package/dist/views/system/position/index.vue.js +5 -2
  359. package/dist/views/system/position/index.vue.js.map +1 -1
  360. package/dist/views/system/position/index2.vue.js +128 -92
  361. package/dist/views/system/position/index2.vue.js.map +1 -1
  362. package/dist/views/system/recycle/index.vue.js +2 -2
  363. package/dist/views/system/recycle/index2.vue.js +90 -67
  364. package/dist/views/system/recycle/index2.vue.js.map +1 -1
  365. package/dist/views/system/role/components/GrantMenuSheet.vue.d.ts +20 -0
  366. package/dist/views/system/role/components/GrantMenuSheet.vue.js +8 -0
  367. package/dist/views/system/role/components/GrantMenuSheet.vue.js.map +1 -0
  368. package/dist/views/system/role/components/GrantMenuSheet2.vue.js +117 -0
  369. package/dist/views/system/role/components/GrantMenuSheet2.vue.js.map +1 -0
  370. package/dist/views/system/role/components/GrantMenuTable.vue.d.ts +6 -4
  371. package/dist/views/system/role/components/GrantMenuTable.vue.js +2 -2
  372. package/dist/views/system/role/components/GrantMenuTable2.vue.js +279 -177
  373. package/dist/views/system/role/components/GrantMenuTable2.vue.js.map +1 -1
  374. package/dist/views/system/role/components/MatchText.vue.d.ts +7 -0
  375. package/dist/views/system/role/components/MatchText.vue.js +8 -0
  376. package/dist/views/system/role/components/MatchText.vue.js.map +1 -0
  377. package/dist/views/system/role/components/MatchText2.vue.js +29 -0
  378. package/dist/views/system/role/components/MatchText2.vue.js.map +1 -0
  379. package/dist/views/system/role/components/grantMenuGroups.d.ts +36 -0
  380. package/dist/views/system/role/components/grantMenuGroups.js +110 -48
  381. package/dist/views/system/role/components/grantMenuGroups.js.map +1 -1
  382. package/dist/views/system/role/index.vue.js +5 -2
  383. package/dist/views/system/role/index.vue.js.map +1 -1
  384. package/dist/views/system/role/index2.vue.js +181 -165
  385. package/dist/views/system/role/index2.vue.js.map +1 -1
  386. package/dist/views/system/session/index2.vue.js +75 -49
  387. package/dist/views/system/session/index2.vue.js.map +1 -1
  388. package/dist/views/system/user/components/ResetPasswordModal.vue.js +2 -2
  389. package/dist/views/system/user/components/ResetPasswordModal2.vue.js +2 -0
  390. package/dist/views/system/user/components/ResetPasswordModal2.vue.js.map +1 -1
  391. package/dist/views/system/user/components/UserFormModal.vue.js +2 -2
  392. package/dist/views/system/user/components/UserFormModal2.vue.js +77 -76
  393. package/dist/views/system/user/components/UserFormModal2.vue.js.map +1 -1
  394. package/dist/views/system/user/index.vue.js +2 -2
  395. package/dist/views/system/user/index2.vue.js +362 -275
  396. package/dist/views/system/user/index2.vue.js.map +1 -1
  397. package/package.json +3 -5
  398. package/dist/components/SelectTable/index.vue.d.ts +0 -76
  399. package/dist/components/SelectTable/index2.vue.js +0 -256
  400. package/dist/components/SelectTable/index2.vue.js.map +0 -1
  401. package/dist/composables/useTableRowSort.d.ts +0 -20
  402. package/dist/composables/useTableRowSort.js +0 -59
  403. package/dist/composables/useTableRowSort.js.map +0 -1
  404. package/dist/layouts/LayoutModeCards.vue.js +0 -8
  405. package/dist/layouts/LayoutModeCards.vue.js.map +0 -1
  406. package/dist/layouts/LayoutModeCards2.vue.js +0 -67
  407. package/dist/layouts/LayoutModeCards2.vue.js.map +0 -1
  408. package/dist/layouts/SettingRow.vue.d.ts +0 -16
  409. package/dist/layouts/SettingRow.vue.js +0 -8
  410. package/dist/layouts/SettingRow.vue.js.map +0 -1
  411. package/dist/layouts/SettingRow2.vue.js +0 -23
  412. package/dist/layouts/SettingRow2.vue.js.map +0 -1
  413. package/dist/views/login/skins/AuroraGlass.vue.js +0 -8
  414. package/dist/views/login/skins/AuroraGlass.vue.js.map +0 -1
  415. package/dist/views/login/skins/AuroraGlass2.vue.js +0 -80
  416. package/dist/views/login/skins/AuroraGlass2.vue.js.map +0 -1
  417. package/dist/views/login/skins/SplitPanel.vue.d.ts +0 -3
  418. package/dist/views/login/skins/SplitPanel.vue.js +0 -8
  419. package/dist/views/login/skins/SplitPanel.vue.js.map +0 -1
  420. package/dist/views/login/skins/SplitPanel2.vue.js +0 -65
  421. package/dist/views/login/skins/SplitPanel2.vue.js.map +0 -1
  422. package/dist/views/login/skins/Spotlight.vue.d.ts +0 -3
  423. package/dist/views/login/skins/Spotlight.vue.js +0 -8
  424. package/dist/views/login/skins/Spotlight.vue.js.map +0 -1
  425. package/dist/views/login/skins/Spotlight2.vue.js +0 -36
  426. package/dist/views/login/skins/Spotlight2.vue.js.map +0 -1
  427. package/dist/views/login/skins.d.ts +0 -8
  428. package/dist/views/login/skins.js +0 -13
  429. package/dist/views/login/skins.js.map +0 -1
  430. /package/dist/components/{SelectTable → TableTotal}/index.vue.js.map +0 -0
  431. /package/dist/layouts/{LayoutModeCards.vue.d.ts → AccentPicker.vue.d.ts} +0 -0
  432. /package/dist/views/{login/skins/AuroraGlass.vue.d.ts → system/config/components/WatermarkSection.vue.d.ts} +0 -0
@@ -1,15 +1,19 @@
1
- import { defineComponent as x, ref as d, openBlock as p, createElementBlock as y, createVNode as i, unref as a, withCtx as g, Fragment as C, renderList as N, h as n } from "vue";
2
- import { useMessage as P, NTabs as E, NTabPane as S, NSpace as z, NPopconfirm as v, NButton as h } from "naive-ui";
3
- import { SmartTable as A } from "smart-naive-table";
4
- import { useI18n as B } from "vue-i18n";
5
- import { useConfirm as I } from "../../../composables/useConfirm.js";
6
- import { useAuthStore as q } from "../../../stores/auth.js";
7
- import { recycleApi as s } from "../../../api/index.js";
8
- import { translateError as L } from "../../../utils/error.js";
9
- const R = { class: "view fill-page" }, H = /* @__PURE__ */ x({
1
+ import { defineComponent as z, ref as h, openBlock as v, createElementBlock as b, createVNode as l, unref as o, withCtx as c, Fragment as C, renderList as N, h as a } from "vue";
2
+ import { useMessage as A, NTabs as P, NTabPane as S, NSpace as B, NPopconfirm as T, NButton as _ } from "naive-ui";
3
+ import { useMediaQuery as F } from "@vueuse/core";
4
+ import { SmartTable as I } from "smart-naive-table";
5
+ import { useI18n as L } from "vue-i18n";
6
+ import { useConfirm as O } from "../../../composables/useConfirm.js";
7
+ import { useAuthStore as R } from "../../../stores/auth.js";
8
+ import { recycleApi as m } from "../../../api/index.js";
9
+ import { translateError as j } from "../../../utils/error.js";
10
+ import { TABLE_MIN_ROW_HEIGHT as H, TABLE_TOOLBAR as M } from "../../../utils/tableToolbar.js";
11
+ import q from "../../../components/TableTotal/index.vue.js";
12
+ import { createClientFilterFetcher as $, deriveHeaderFilters as D, passthroughFilterSerializer as G } from "../../../utils/tableFilter.js";
13
+ const Q = { class: "view fill-page" }, ae = /* @__PURE__ */ z({
10
14
  __name: "index",
11
- setup($) {
12
- const { t: r } = B(), b = P(), { run: c } = I(), u = q(), k = [
15
+ setup(U) {
16
+ const { t } = L(), w = A(), { run: u } = O(), f = R(), d = [
13
17
  "user",
14
18
  "role",
15
19
  "org",
@@ -19,103 +23,122 @@ const R = { class: "view fill-page" }, H = /* @__PURE__ */ x({
19
23
  "dict",
20
24
  "menu",
21
25
  "job"
22
- ], l = d("user"), m = d({});
23
- function _(t) {
24
- return (e) => {
25
- e && (m.value[t] = e);
26
+ ], n = h("user"), k = F("(max-width: 604px)"), E = Object.fromEntries(
27
+ d.map((e) => [e, $(m.page(e), ["name", "code"])])
28
+ ), p = h({});
29
+ function x(e) {
30
+ return (r) => {
31
+ r && (p.value[e] = r);
26
32
  };
27
33
  }
28
- function f(t) {
29
- var e;
30
- (e = m.value[t]) == null || e.refresh();
34
+ function y(e) {
35
+ var r;
36
+ (r = p.value[e]) == null || r.refresh();
31
37
  }
32
- const T = [
33
- { type: "index", title: () => r("common.rowNo"), width: 64, align: "center" },
34
- { key: "name", title: () => r("recycle.name") },
35
- { key: "code", title: () => r("recycle.code") },
36
- { key: "deletedAt", title: () => r("recycle.deletedAt"), format: "datetime", width: 180 },
38
+ const g = [
39
+ { type: "index", title: () => t("common.rowNo"), width: 64, align: "center" },
40
+ { key: "name", title: () => t("recycle.name"), search: {} },
41
+ {
42
+ key: "code",
43
+ title: () => t("recycle.code"),
44
+ search: {},
45
+ // 编码可能为空(如岗位):空值画灰色的「—」
46
+ render: (e) => e.code ? a("span", { class: "mono muted" }, e.code) : a("span", { class: "faint" }, "—")
47
+ },
48
+ { key: "deletedAt", title: () => t("recycle.deletedAt"), format: "datetime", width: 180 },
37
49
  {
38
50
  key: "op",
39
- title: () => r("common.operation"),
51
+ title: () => t("common.operation"),
40
52
  width: 180,
53
+ align: "right",
41
54
  fixed: "right",
42
55
  hideInSetting: !0,
43
- render: (t) => n(z, { size: 4, wrapItem: !1 }, () => [
44
- u.hasPerm("POST:/api/v1/sys/recycle/{type}/{id}/restore") ? n(
45
- v,
56
+ render: (e) => a(B, { size: 2, justify: "end", wrapItem: !1 }, () => [
57
+ f.hasPerm("POST:/api/v1/sys/recycle/{type}/{id}/restore") ? a(
58
+ T,
46
59
  {
47
- onPositiveClick: () => c(() => s.restore(l.value, t.id), r("recycle.restored")).then(
48
- (e) => {
49
- e && f(l.value);
60
+ onPositiveClick: () => u(() => m.restore(n.value, e.id), t("recycle.restored")).then(
61
+ (r) => {
62
+ r && y(n.value);
50
63
  }
51
64
  )
52
65
  },
53
66
  {
54
- trigger: () => n(
55
- h,
67
+ trigger: () => a(
68
+ _,
56
69
  { size: "small", quaternary: !0, type: "primary" },
57
- () => r("recycle.restore")
70
+ () => t("recycle.restore")
58
71
  ),
59
- default: () => r("recycle.restoreConfirm", { name: t.name })
72
+ default: () => t("recycle.restoreConfirm", { name: e.name })
60
73
  }
61
74
  ) : null,
62
- u.hasPerm("DELETE:/api/v1/sys/recycle/{type}/{id}") ? n(
63
- v,
75
+ f.hasPerm("DELETE:/api/v1/sys/recycle/{type}/{id}") ? a(
76
+ T,
64
77
  {
65
- onPositiveClick: () => c(() => s.purge(l.value, t.id), r("recycle.purged")).then(
66
- (e) => {
67
- e && f(l.value);
78
+ onPositiveClick: () => u(() => m.purge(n.value, e.id), t("recycle.purged")).then(
79
+ (r) => {
80
+ r && y(n.value);
68
81
  }
69
82
  )
70
83
  },
71
84
  {
72
- trigger: () => n(
73
- h,
85
+ trigger: () => a(
86
+ _,
74
87
  { size: "small", quaternary: !0, type: "error" },
75
- () => r("recycle.purge")
88
+ () => t("recycle.purge")
76
89
  ),
77
- default: () => r("recycle.purgeConfirm", { name: t.name })
90
+ default: () => t("recycle.purgeConfirm", { name: e.name })
78
91
  }
79
92
  ) : null
80
93
  ])
81
94
  }
82
95
  ];
83
- return (t, e) => (p(), y("div", R, [
84
- i(a(E), {
85
- value: l.value,
86
- "onUpdate:value": e[1] || (e[1] = (o) => l.value = o),
87
- type: "line",
96
+ return D(g), (e, r) => (v(), b("div", Q, [
97
+ l(o(P), {
98
+ value: n.value,
99
+ "onUpdate:value": r[1] || (r[1] = (i) => n.value = i),
100
+ type: "segment",
88
101
  animated: "",
89
- class: "fill-tabs"
102
+ class: "fill-tabs recycle-seg",
103
+ size: o(k) ? "large" : "medium",
104
+ "pane-style": { padding: 0 }
90
105
  }, {
91
- default: g(() => [
92
- (p(), y(C, null, N(k, (o) => i(a(S), {
93
- key: o,
94
- name: o,
95
- tab: a(r)(`recycle.tabs.${o}`)
106
+ default: c(() => [
107
+ (v(), b(C, null, N(d, (i) => l(o(S), {
108
+ key: i,
109
+ name: i,
110
+ tab: o(t)(`recycle.tabs.${i}`)
96
111
  }, {
97
- default: g(() => [
98
- i(a(A), {
99
- "default-page-size": 100,
112
+ default: c(() => [
113
+ l(o(I), {
100
114
  ref_for: !0,
101
- ref: _(o),
102
- columns: T,
103
- fetcher: a(s).page(o),
104
- "flex-height": "",
105
- "virtual-scroll": "",
106
- "storage-key": `sys-recycle-${o}`,
107
- onError: e[0] || (e[0] = (w) => a(b).error(a(L)(w)))
108
- }, null, 8, ["fetcher", "storage-key"])
115
+ ref: x(i),
116
+ columns: g,
117
+ fetcher: o(E)[i],
118
+ toolbar: o(M),
119
+ search: { container: "table" },
120
+ "filter-serializer": o(G),
121
+ "fill-height": "",
122
+ "min-row-height": o(H),
123
+ "card-on-narrow": "",
124
+ "storage-key": `sys-recycle-${i}`,
125
+ onError: r[0] || (r[0] = (s) => o(w).error(o(j)(s)))
126
+ }, {
127
+ "pagination-prefix": c(({ itemCount: s }) => [
128
+ l(q, { count: s }, null, 8, ["count"])
129
+ ]),
130
+ _: 1
131
+ }, 8, ["fetcher", "toolbar", "filter-serializer", "min-row-height", "storage-key"])
109
132
  ]),
110
133
  _: 2
111
134
  }, 1032, ["name", "tab"])), 64))
112
135
  ]),
113
136
  _: 1
114
- }, 8, ["value"])
137
+ }, 8, ["value", "size"])
115
138
  ]));
116
139
  }
117
140
  });
118
141
  export {
119
- H as default
142
+ ae as default
120
143
  };
121
144
  //# sourceMappingURL=index2.vue.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index2.vue.js","sources":["../../../../src/views/system/recycle/index.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { h, ref } from 'vue'\nimport { NButton, NSpace, NTabs, NTabPane, NPopconfirm, useMessage } from 'naive-ui'\nimport { SmartTable, type SmartTableColumn, type SmartTableInst } from 'smart-naive-table'\nimport { useI18n } from 'vue-i18n'\nimport { useConfirm } from '#/composables/useConfirm'\nimport { useAuthStore } from '#/stores/auth'\nimport { recycleApi, type RecycleBinItem } from '#/api'\nimport { translateError } from '#/utils/error'\n\nconst { t } = useI18n()\nconst message = useMessage()\nconst { run } = useConfirm()\nconst authStore = useAuthStore()\n\nconst types = [\n 'user',\n 'role',\n 'org',\n 'position',\n 'module',\n 'config',\n 'dict',\n 'menu',\n 'job',\n] as const\ntype RecycleType = (typeof types)[number]\nconst activeTab = ref<RecycleType>('user')\nconst tableRefs = ref<Record<string, SmartTableInst<RecycleBinItem>>>({})\n\nfunction setTableRef(type: string) {\n // 函数 ref 的参数类型是宽泛的组件实例,收窄为 SmartTableInst 后存入映射\n return (el: unknown) => {\n if (el) tableRefs.value[type] = el as SmartTableInst<RecycleBinItem>\n }\n}\n\nfunction refreshTab(type: string) {\n tableRefs.value[type]?.refresh()\n}\n\nconst columns: SmartTableColumn<RecycleBinItem>[] = [\n { type: 'index', title: () => t('common.rowNo'), width: 64, align: 'center' },\n { key: 'name', title: () => t('recycle.name') },\n { key: 'code', title: () => t('recycle.code') },\n { key: 'deletedAt', title: () => t('recycle.deletedAt'), format: 'datetime', width: 180 },\n {\n key: 'op',\n title: () => t('common.operation'),\n width: 180,\n fixed: 'right',\n hideInSetting: true,\n render: r =>\n h(NSpace, { size: 4, wrapItem: false }, () => [\n authStore.hasPerm('POST:/api/v1/sys/recycle/{type}/{id}/restore')\n ? h(\n NPopconfirm,\n {\n onPositiveClick: () =>\n run(() => recycleApi.restore(activeTab.value, r.id), t('recycle.restored')).then(\n ok => {\n if (ok) refreshTab(activeTab.value)\n },\n ),\n },\n {\n trigger: () =>\n h(NButton, { size: 'small', quaternary: true, type: 'primary' }, () =>\n t('recycle.restore'),\n ),\n default: () => t('recycle.restoreConfirm', { name: r.name }),\n },\n )\n : null,\n authStore.hasPerm('DELETE:/api/v1/sys/recycle/{type}/{id}')\n ? h(\n NPopconfirm,\n {\n onPositiveClick: () =>\n run(() => recycleApi.purge(activeTab.value, r.id), t('recycle.purged')).then(\n ok => {\n if (ok) refreshTab(activeTab.value)\n },\n ),\n },\n {\n trigger: () =>\n h(NButton, { size: 'small', quaternary: true, type: 'error' }, () =>\n t('recycle.purge'),\n ),\n default: () => t('recycle.purgeConfirm', { name: r.name }),\n },\n )\n : null,\n ]),\n },\n]\n</script>\n\n<template>\n <div class=\"view fill-page\">\n <!-- 形状 4:.fill-tabs 把 n-tabs → 面板容器 → .n-tab-pane 一路拉成 flex 列,\n 面板里的 SmartTable 就接上高度链了(见 styles/layout.css ⑧)。 -->\n <n-tabs v-model:value=\"activeTab\" type=\"line\" animated class=\"fill-tabs\">\n <n-tab-pane v-for=\"type in types\" :key=\"type\" :name=\"type\" :tab=\"t(`recycle.tabs.${type}`)\">\n <SmartTable\n :default-page-size=\"100\"\n :ref=\"setTableRef(type)\"\n :columns=\"columns\"\n :fetcher=\"recycleApi.page(type)\"\n flex-height\n virtual-scroll\n :storage-key=\"`sys-recycle-${type}`\"\n @error=\"(e: unknown) => message.error(translateError(e))\"\n />\n </n-tab-pane>\n </n-tabs>\n </div>\n</template>\n\n<style scoped>\n/* display / flex-direction / 整屏高度链都在 styles/layout.css 的 .fill-page,这里只留卡片间距。 */\n.view {\n gap: var(--gap-card);\n}\n</style>\n"],"names":["t","useI18n","message","useMessage","run","useConfirm","authStore","useAuthStore","types","activeTab","ref","tableRefs","setTableRef","type","el","refreshTab","_a","columns","r","h","NSpace","NPopconfirm","recycleApi","ok","NButton","_openBlock","_createElementBlock","_hoisted_1","_createVNode","_unref","NTabs","$event","_Fragment","_renderList","NTabPane","SmartTable","_cache","e","translateError"],"mappings":"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"}
1
+ {"version":3,"file":"index2.vue.js","sources":["../../../../src/views/system/recycle/index.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { h, ref } from 'vue'\nimport { NButton, NSpace, NTabs, NTabPane, NPopconfirm, useMessage } from 'naive-ui'\nimport { useMediaQuery } from '@vueuse/core'\nimport { SmartTable, type SmartTableColumn, type SmartTableInst } from 'smart-naive-table'\nimport { useI18n } from 'vue-i18n'\nimport { useConfirm } from '#/composables/useConfirm'\nimport { useAuthStore } from '#/stores/auth'\nimport { recycleApi, type RecycleBinItem } from '#/api'\nimport { translateError } from '#/utils/error'\nimport { TABLE_MIN_ROW_HEIGHT, TABLE_TOOLBAR } from '#/utils/tableToolbar'\nimport TableTotal from '#/components/TableTotal/index.vue'\nimport {\n createClientFilterFetcher,\n passthroughFilterSerializer,\n deriveHeaderFilters,\n} from '#/utils/tableFilter'\n\nconst { t } = useI18n()\nconst message = useMessage()\nconst { run } = useConfirm()\nconst authStore = useAuthStore()\n\nconst types = [\n 'user',\n 'role',\n 'org',\n 'position',\n 'module',\n 'config',\n 'dict',\n 'menu',\n 'job',\n] as const\ntype RecycleType = (typeof types)[number]\nconst activeTab = ref<RecycleType>('user')\n// 窄屏页签放大到触控尺寸\nconst narrow = useMediaQuery('(max-width: 604px)')\n// 回收站端点没有过滤能力,搜索由前端求值;每个标签的接口不同,各配一个取数器。\n// fields 要与下面声明了 search 的列 key 一致\nconst clientFetchers = Object.fromEntries(\n types.map(type => [type, createClientFilterFetcher(recycleApi.page(type), ['name', 'code'])]),\n) as Record<RecycleType, ReturnType<typeof createClientFilterFetcher<RecycleBinItem>>>\nconst tableRefs = ref<Record<string, SmartTableInst<RecycleBinItem>>>({})\n\nfunction setTableRef(type: string) {\n // 函数 ref 的参数类型是宽泛的组件实例,收窄为 SmartTableInst 后存入映射\n return (el: unknown) => {\n if (el) tableRefs.value[type] = el as SmartTableInst<RecycleBinItem>\n }\n}\n\nfunction refreshTab(type: string) {\n tableRefs.value[type]?.refresh()\n}\n\nconst columns: SmartTableColumn<RecycleBinItem>[] = [\n { type: 'index', title: () => t('common.rowNo'), width: 64, align: 'center' },\n { key: 'name', title: () => t('recycle.name'), search: {} },\n {\n key: 'code',\n title: () => t('recycle.code'),\n search: {},\n // 编码可能为空(如岗位):空值画灰色的「—」\n render: r =>\n r.code ? h('span', { class: 'mono muted' }, r.code) : h('span', { class: 'faint' }, '—'),\n },\n { key: 'deletedAt', title: () => t('recycle.deletedAt'), format: 'datetime', width: 180 },\n {\n key: 'op',\n title: () => t('common.operation'),\n width: 180,\n align: 'right',\n fixed: 'right',\n hideInSetting: true,\n render: r =>\n h(NSpace, { size: 2, justify: 'end', wrapItem: false }, () => [\n authStore.hasPerm('POST:/api/v1/sys/recycle/{type}/{id}/restore')\n ? h(\n NPopconfirm,\n {\n onPositiveClick: () =>\n run(() => recycleApi.restore(activeTab.value, r.id), t('recycle.restored')).then(\n ok => {\n if (ok) refreshTab(activeTab.value)\n },\n ),\n },\n {\n trigger: () =>\n h(NButton, { size: 'small', quaternary: true, type: 'primary' }, () =>\n t('recycle.restore'),\n ),\n default: () => t('recycle.restoreConfirm', { name: r.name }),\n },\n )\n : null,\n authStore.hasPerm('DELETE:/api/v1/sys/recycle/{type}/{id}')\n ? h(\n NPopconfirm,\n {\n onPositiveClick: () =>\n run(() => recycleApi.purge(activeTab.value, r.id), t('recycle.purged')).then(\n ok => {\n if (ok) refreshTab(activeTab.value)\n },\n ),\n },\n {\n trigger: () =>\n h(NButton, { size: 'small', quaternary: true, type: 'error' }, () =>\n t('recycle.purge'),\n ),\n default: () => t('recycle.purgeConfirm', { name: r.name }),\n },\n )\n : null,\n ]),\n },\n]\nderiveHeaderFilters(columns)\n</script>\n\n<template>\n <div class=\"view fill-page\">\n <!-- 形状 4:.fill-tabs 把 n-tabs → 面板容器 → .n-tab-pane 一路拉成 flex 列,\n 面板里的 SmartTable 就接上高度链了(见 styles/layout.css ⑧)。 -->\n <!-- 9 个资源类型用 macOS 分段控件(轨道 + 滑块)切换:控件按内容收窄、靠左,不撑满整行;\n 窄屏放不下时轨道自己横向滑动。轨道 / 滑块色走主题的 --seg-track / --seg-thumb。 -->\n <n-tabs\n v-model:value=\"activeTab\"\n type=\"segment\"\n animated\n class=\"fill-tabs recycle-seg\"\n :size=\"narrow ? 'large' : 'medium'\"\n :pane-style=\"{ padding: 0 }\"\n >\n <n-tab-pane v-for=\"type in types\" :key=\"type\" :name=\"type\" :tab=\"t(`recycle.tabs.${type}`)\">\n <SmartTable\n :ref=\"setTableRef(type)\"\n :columns=\"columns\"\n :fetcher=\"clientFetchers[type]\"\n :toolbar=\"TABLE_TOOLBAR\"\n :search=\"{ container: 'table' }\"\n :filter-serializer=\"passthroughFilterSerializer\"\n fill-height\n :min-row-height=\"TABLE_MIN_ROW_HEIGHT\"\n card-on-narrow\n :storage-key=\"`sys-recycle-${type}`\"\n @error=\"(e: unknown) => message.error(translateError(e))\"\n >\n <template #pagination-prefix=\"{ itemCount }\">\n <TableTotal :count=\"itemCount\" />\n </template>\n </SmartTable>\n </n-tab-pane>\n </n-tabs>\n </div>\n</template>\n\n<style scoped>\n/* display / flex-direction / 整屏高度链都在 styles/layout.css 的 .fill-page,这里只留卡片间距。 */\n.view {\n gap: var(--gap-card);\n}\n\n/* 分段控件:naive 的 segment 轨道默认 width:100% 且各格等分,9 格会被撑成一条长带。\n 这里让轨道按内容收窄、靠左;格子按文字自适应宽度(滑块位置由 naive 按实际格宽量,不受影响)。 */\n.recycle-seg :deep(.n-tabs-nav) {\n align-self: flex-start;\n max-width: 100%;\n margin-bottom: var(--gap-card);\n}\n.recycle-seg :deep(.n-tabs-rail) {\n width: auto;\n overflow-x: auto;\n scrollbar-width: none;\n}\n.recycle-seg :deep(.n-tabs-rail::-webkit-scrollbar) {\n display: none;\n}\n.recycle-seg :deep(.n-tabs-tab-wrapper) {\n flex: 0 0 auto;\n}\n.recycle-seg :deep(.n-tabs-tab) {\n padding: 4px 14px;\n white-space: nowrap;\n}\n\n/* 辅助字样(表格单元格由库渲染,要 :deep) */\n:deep(.mono) {\n font-family: var(--font-mono);\n font-size: 13.5px;\n letter-spacing: 0;\n}\n:deep(.muted) {\n color: var(--text-2);\n}\n:deep(.faint) {\n color: var(--text-3);\n}\n</style>\n"],"names":["useI18n","message","useMessage","run","useConfirm","authStore","useAuthStore","types","activeTab","ref","narrow","useMediaQuery","clientFetchers","type","createClientFilterFetcher","recycleApi","tableRefs","setTableRef","el","refreshTab","_a","columns","r","h","NSpace","NPopconfirm","ok","NButton","deriveHeaderFilters","_openBlock","_createElementBlock","_hoisted_1","_createVNode","_unref","NTabs","$event","_Fragment","_renderList","NTabPane","SmartTable","TABLE_TOOLBAR","passthroughFilterSerializer","TABLE_MIN_ROW_HEIGHT","_cache","e","translateError","_withCtx","itemCount","TableTotal"],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ import { MenuTreeNode } from '../../../../types/menu';
2
+ import { ModuleRow } from '../../../../types/api';
3
+ type __VLS_Props = {
4
+ tree: MenuTreeNode[];
5
+ granted: number[];
6
+ modules: ModuleRow[];
7
+ defaultModuleId: number;
8
+ onSave: (ids: number[]) => unknown | Promise<unknown>;
9
+ };
10
+ type __VLS_ModelProps = {
11
+ 'show'?: boolean;
12
+ };
13
+ type __VLS_PublicProps = __VLS_Props & __VLS_ModelProps;
14
+ declare const __VLS_export: import('vue').DefineComponent<__VLS_PublicProps, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {
15
+ "update:show": (value: boolean) => any;
16
+ }, string, import('vue').PublicProps, Readonly<__VLS_PublicProps> & Readonly<{
17
+ "onUpdate:show"?: ((value: boolean) => any) | undefined;
18
+ }>, {}, {}, {}, {}, string, import('vue').ComponentProvideOptions, false, {}, any>;
19
+ declare const _default: typeof __VLS_export;
20
+ export default _default;
@@ -0,0 +1,8 @@
1
+ import t from "./GrantMenuSheet2.vue.js";
2
+ /* empty css */
3
+ import o from "../../../../_virtual/_plugin-vue_export-helper.js";
4
+ const m = /* @__PURE__ */ o(t, [["__scopeId", "data-v-cd5d3924"]]);
5
+ export {
6
+ m as default
7
+ };
8
+ //# sourceMappingURL=GrantMenuSheet.vue.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GrantMenuSheet.vue.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;"}
@@ -0,0 +1,117 @@
1
+ import { defineComponent as V, useModel as I, computed as c, shallowRef as T, ref as w, watch as U, openBlock as S, createBlock as D, unref as e, normalizeStyle as E, withCtx as m, createElementVNode as r, normalizeClass as x, createVNode as v, toDisplayString as i, createElementBlock as G, createCommentVNode as W, createTextVNode as M, mergeModels as A } from "vue";
2
+ import { NModal as F, NButton as b } from "naive-ui";
3
+ import { useI18n as H } from "vue-i18n";
4
+ import { useWindowSize as O } from "@vueuse/core";
5
+ import P from "./GrantMenuTable.vue.js";
6
+ const R = { class: "gs-summary" }, $ = {
7
+ key: 0,
8
+ class: "gs-dirty"
9
+ }, j = 640, X = /* @__PURE__ */ V({
10
+ __name: "GrantMenuSheet",
11
+ props: /* @__PURE__ */ A({
12
+ tree: {},
13
+ granted: {},
14
+ modules: {},
15
+ defaultModuleId: {},
16
+ onSave: { type: Function }
17
+ }, {
18
+ show: { type: Boolean, default: !1 },
19
+ showModifiers: {}
20
+ }),
21
+ emits: ["update:show"],
22
+ setup(l) {
23
+ const s = I(l, "show"), p = l, { t: a } = H(), { width: k } = O(), u = c(() => k.value <= j), C = c(
24
+ () => u.value ? { width: "calc(100vw - 16px)", height: "calc(100dvh - 16px)" } : { width: "min(960px, calc(100vw - 48px))", height: "min(760px, calc(100dvh - 48px))" }
25
+ ), g = c(() => u.value ? "large" : "medium"), z = {
26
+ display: "flex",
27
+ flexDirection: "column",
28
+ flex: "1 1 0",
29
+ minHeight: "0",
30
+ padding: "0",
31
+ overflow: "hidden"
32
+ }, N = { padding: "0" }, f = T([]), o = w({ on: 0, total: 0, pages: 0, buttons: 0, dirty: !1 });
33
+ U(
34
+ s,
35
+ (h) => {
36
+ h && (f.value = p.granted);
37
+ },
38
+ { immediate: !0 }
39
+ );
40
+ const d = w(!1), y = c(() => !d.value);
41
+ async function B() {
42
+ d.value = !0;
43
+ try {
44
+ await p.onSave(f.value) !== !1 && (s.value = !1);
45
+ } catch {
46
+ } finally {
47
+ d.value = !1;
48
+ }
49
+ }
50
+ return (h, t) => (S(), D(e(F), {
51
+ show: s.value,
52
+ "onUpdate:show": t[3] || (t[3] = (n) => s.value = n),
53
+ preset: "card",
54
+ title: e(a)("role.grantMenus"),
55
+ closable: y.value,
56
+ "close-on-esc": y.value,
57
+ "mask-closable": !1,
58
+ "auto-focus": !1,
59
+ style: E(C.value),
60
+ "content-style": z,
61
+ "footer-style": N
62
+ }, {
63
+ footer: m(() => [
64
+ r("footer", {
65
+ class: x(["gs-foot", { "is-narrow": u.value }])
66
+ }, [
67
+ r("div", R, [
68
+ r("span", null, i(e(a)("role.grantSummary", { on: o.value.on, total: o.value.total })), 1),
69
+ r("span", null, i(e(a)("role.grantSummarySplit", { pages: o.value.pages, buttons: o.value.buttons })), 1),
70
+ o.value.dirty ? (S(), G("span", $, i(e(a)("role.grantUnsaved")), 1)) : W("", !0)
71
+ ]),
72
+ v(e(b), {
73
+ size: g.value,
74
+ disabled: d.value,
75
+ onClick: t[2] || (t[2] = (n) => s.value = !1)
76
+ }, {
77
+ default: m(() => [
78
+ M(i(e(a)("common.cancel")), 1)
79
+ ]),
80
+ _: 1
81
+ }, 8, ["size", "disabled"]),
82
+ v(e(b), {
83
+ type: "primary",
84
+ size: g.value,
85
+ loading: d.value,
86
+ onClick: B
87
+ }, {
88
+ default: m(() => [
89
+ M(i(e(a)("common.save")), 1)
90
+ ]),
91
+ _: 1
92
+ }, 8, ["size", "loading"])
93
+ ], 2)
94
+ ]),
95
+ default: m(() => [
96
+ r("div", {
97
+ class: x(["gs", { "is-narrow": u.value }])
98
+ }, [
99
+ v(P, {
100
+ tree: l.tree,
101
+ granted: l.granted,
102
+ modules: l.modules,
103
+ "default-module-id": l.defaultModuleId,
104
+ compact: u.value,
105
+ "onUpdate:checked": t[0] || (t[0] = (n) => f.value = n),
106
+ onSummary: t[1] || (t[1] = (n) => o.value = n)
107
+ }, null, 8, ["tree", "granted", "modules", "default-module-id", "compact"])
108
+ ], 2)
109
+ ]),
110
+ _: 1
111
+ }, 8, ["show", "title", "closable", "close-on-esc", "style"]));
112
+ }
113
+ });
114
+ export {
115
+ X as default
116
+ };
117
+ //# sourceMappingURL=GrantMenuSheet2.vue.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GrantMenuSheet2.vue.js","sources":["../../../../../src/views/system/role/components/GrantMenuSheet.vue"],"sourcesContent":["<script setup lang=\"ts\">\n// 授权菜单弹窗:居中卡片(窄屏近乎铺满),标题 / 工具区 / 列表 / 底栏四段。只有列表纵向滚动,\n// 底栏(已授权统计 + 取消/保存)永远在视野里 —— 不复用 FormContainer,因为它在 modal 形态下会随内容撑高,\n// 长列表会把保存钮顶出视口。弹窗定高、内容区 flex 吃满,滚动只发生在列表里。\n// onSave 协议同 FormContainer.onConfirm:返回 false 或抛错 → 不关闭;其余情况自动关。\nimport { computed, ref, shallowRef, watch, type CSSProperties } from 'vue'\nimport { NButton, NModal } from 'naive-ui'\nimport { useI18n } from 'vue-i18n'\nimport { useWindowSize } from '@vueuse/core'\nimport type { MenuTreeNode } from '#/types/menu'\nimport type { ModuleRow } from '#/types/api'\nimport GrantMenuTable from './GrantMenuTable.vue'\nimport type { GrantSummary } from './grantMenuGroups'\n\nconst show = defineModel<boolean>('show', { default: false })\n\nconst props = defineProps<{\n tree: MenuTreeNode[]\n granted: number[]\n modules: ModuleRow[]\n defaultModuleId: number\n onSave: (ids: number[]) => unknown | Promise<unknown>\n}>()\n\nconst { t } = useI18n()\n\n/** 窄于此宽度弹窗几乎铺满视口、控件放大一档。 */\nconst COMPACT = 640\nconst { width: winW } = useWindowSize()\nconst compact = computed(() => winW.value <= COMPACT)\n// 定高:列表再长弹窗也不超过视口;卡片是 flex 列,内容区吃剩余高度,滚动只在列表里\nconst modalStyle = computed(() =>\n compact.value\n ? { width: 'calc(100vw - 16px)', height: 'calc(100dvh - 16px)' }\n : { width: 'min(960px, calc(100vw - 48px))', height: 'min(760px, calc(100dvh - 48px))' },\n)\n// 窄屏是触屏:控件放大一档\nconst ctlSize = computed(() => (compact.value ? 'large' : 'medium'))\nconst contentStyle: CSSProperties = {\n display: 'flex',\n flexDirection: 'column',\n flex: '1 1 0',\n minHeight: '0',\n padding: '0',\n overflow: 'hidden',\n}\nconst footerStyle = { padding: '0' }\n\n// 勾选态在列表自己的 reactive 里,这里只收结果:打开时先是服务端现状,用户一改就跟着列表走\nconst checked = shallowRef<number[]>([])\nconst summary = ref<GrantSummary>({ on: 0, total: 0, pages: 0, buttons: 0, dirty: false })\nwatch(\n show,\n v => {\n if (v) checked.value = props.granted\n },\n { immediate: true },\n)\n\nconst saving = ref(false)\n// 提交中禁止任何途径关闭,防提交中途关闭导致状态错乱\nconst canClose = computed(() => !saving.value)\n\nasync function handleSave() {\n saving.value = true\n try {\n if ((await props.onSave(checked.value)) !== false) show.value = false\n } catch {\n // 静默:错误 toast 由业务 onSave 内负责\n } finally {\n saving.value = false\n }\n}\n</script>\n\n<template>\n <n-modal\n v-model:show=\"show\"\n preset=\"card\"\n :title=\"t('role.grantMenus')\"\n :closable=\"canClose\"\n :close-on-esc=\"canClose\"\n :mask-closable=\"false\"\n :auto-focus=\"false\"\n :style=\"modalStyle\"\n :content-style=\"contentStyle\"\n :footer-style=\"footerStyle\"\n >\n <div class=\"gs\" :class=\"{ 'is-narrow': compact }\">\n <GrantMenuTable\n :tree=\"tree\"\n :granted=\"granted\"\n :modules=\"modules\"\n :default-module-id=\"defaultModuleId\"\n :compact=\"compact\"\n @update:checked=\"checked = $event\"\n @summary=\"summary = $event\"\n />\n </div>\n\n <template #footer>\n <footer class=\"gs-foot\" :class=\"{ 'is-narrow': compact }\">\n <div class=\"gs-summary\">\n <span>{{ t('role.grantSummary', { on: summary.on, total: summary.total }) }}</span>\n <span>\n {{ t('role.grantSummarySplit', { pages: summary.pages, buttons: summary.buttons }) }}\n </span>\n <span v-if=\"summary.dirty\" class=\"gs-dirty\">{{ t('role.grantUnsaved') }}</span>\n </div>\n <n-button :size=\"ctlSize\" :disabled=\"saving\" @click=\"show = false\">\n {{ t('common.cancel') }}\n </n-button>\n <n-button type=\"primary\" :size=\"ctlSize\" :loading=\"saving\" @click=\"handleSave\">\n {{ t('common.save') }}\n </n-button>\n </footer>\n </template>\n </n-modal>\n</template>\n\n<style scoped>\n.gs {\n display: flex;\n flex: 1 1 0;\n flex-direction: column;\n min-height: 0;\n color: var(--text-1);\n}\n\n/* 底栏:永远可见,与列表之间一条发丝线 */\n.gs-foot {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 12px 20px 14px;\n border-top: 1px solid var(--hairline);\n}\n.gs-summary {\n flex: 1;\n min-width: 0;\n display: flex;\n align-items: center;\n flex-wrap: wrap;\n gap: 4px 12px;\n font-size: 13px;\n color: var(--text-2);\n font-variant-numeric: tabular-nums;\n}\n.gs-dirty {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n color: var(--warn);\n}\n.gs-dirty::before {\n content: '';\n width: 7px;\n height: 7px;\n border-radius: 50%;\n background: var(--warn);\n}\n\n/* 窄屏:统计行独占一行,按钮等分 */\n.gs-foot.is-narrow {\n flex-wrap: wrap;\n padding: 10px 16px 14px;\n}\n.gs-foot.is-narrow .gs-summary {\n flex: 1 1 100%;\n}\n.gs-foot.is-narrow .n-button {\n flex: 1;\n}\n</style>\n"],"names":["COMPACT","show","_useModel","__props","props","t","useI18n","winW","useWindowSize","compact","computed","modalStyle","ctlSize","contentStyle","footerStyle","checked","shallowRef","summary","ref","watch","v","saving","canClose","handleSave","_createBlock","_unref","NModal","$event","_createElementVNode","_normalizeClass","_hoisted_1","_toDisplayString","_createElementBlock","_hoisted_2","_createVNode","NButton","GrantMenuTable","_cache"],"mappings":"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"}
@@ -1,17 +1,19 @@
1
1
  import { MenuTreeNode } from '../../../../types/menu';
2
2
  import { ModuleRow } from '../../../../types/api';
3
+ import { GrantSummary } from './grantMenuGroups';
3
4
  type __VLS_Props = {
4
5
  tree: MenuTreeNode[];
5
6
  granted: number[];
6
7
  modules: ModuleRow[];
7
8
  defaultModuleId: number;
9
+ /** 窄屏(触屏):控件放大一档,行改成「名称 + 已选数」一行、胶囊另起一行 */
10
+ compact?: boolean;
8
11
  };
9
- declare function collectChecked(): number[];
10
- declare const __VLS_export: import('vue').DefineComponent<__VLS_Props, {
11
- collectChecked: typeof collectChecked;
12
- }, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {} & {
12
+ declare const __VLS_export: import('vue').DefineComponent<__VLS_Props, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {} & {
13
+ summary: (summary: GrantSummary) => any;
13
14
  "update:checked": (ids: number[]) => any;
14
15
  }, string, import('vue').PublicProps, Readonly<__VLS_Props> & Readonly<{
16
+ onSummary?: ((summary: GrantSummary) => any) | undefined;
15
17
  "onUpdate:checked"?: ((ids: number[]) => any) | undefined;
16
18
  }>, {}, {}, {}, {}, string, import('vue').ComponentProvideOptions, false, {}, any>;
17
19
  declare const _default: typeof __VLS_export;
@@ -1,8 +1,8 @@
1
1
  import o from "./GrantMenuTable2.vue.js";
2
2
  /* empty css */
3
3
  import t from "../../../../_virtual/_plugin-vue_export-helper.js";
4
- const m = /* @__PURE__ */ t(o, [["__scopeId", "data-v-6c2563ee"]]);
4
+ const f = /* @__PURE__ */ t(o, [["__scopeId", "data-v-4bf1bdcb"]]);
5
5
  export {
6
- m as default
6
+ f as default
7
7
  };
8
8
  //# sourceMappingURL=GrantMenuTable.vue.js.map