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/dict/index.vue"],"sourcesContent":["<script setup lang=\"ts\">\n// 字典管理 = 主从:左=类型 SmartTable(CRUD),点击行选中 → 右=该类型的字典项(裸 n-data-table + CRUD)。\n// 关键约束:右侧走管理端 dict/item/page(含停用项、带 id);下拉用的 dict/items/{code} 只回启用项且丢 id,不能复用。\n// 任何类型/项的增删改后调 useDictStore().invalidate(code) 失效下拉缓存,变更即时生效。\nimport { h, reactive, ref } from 'vue'\nimport {\n NButton,\n NCard,\n NSpace,\n NInput,\n NInputNumber,\n NPopconfirm,\n NForm,\n NFormItem,\n NDataTable,\n NEmpty,\n NSwitch,\n useMessage,\n type DataTableColumns,\n type FormInst,\n type FormRules,\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 FormContainer from '#/components/FormContainer/index.vue'\nimport StatusSwitch from '#/components/StatusSwitch/index.vue'\nimport { useConfirm } from '#/composables/useConfirm'\nimport { useBatchDelete } from '#/composables/useBatchDelete'\nimport { dictAdminApi } from '#/api'\nimport { useAuthStore } from '#/stores/auth'\nimport { useDictStore } from '#/stores/dict'\nimport { translateError } from '#/utils/error'\nimport type { DictItemInput, DictTypeInput, SysDictItem, SysDictType } from '#/types/api'\n\nconst { t } = useI18n()\nconst message = useMessage()\nconst { run } = useConfirm()\nconst authStore = useAuthStore()\nconst dictStore = useDictStore()\nconst typeTableRef = ref<SmartTableInst<SysDictType>>()\n\n// ── 主从选中态 + 右侧字典项 ──\nconst selectedType = ref<SysDictType | null>(null)\nconst items = ref<SysDictItem[]>([])\nconst itemsLoading = ref(false)\n\nasync function loadItems() {\n const code = selectedType.value?.code\n if (!code) {\n items.value = []\n return\n }\n itemsLoading.value = true\n try {\n const list = await dictAdminApi.items(code)\n // 竞态守卫:await 期间用户可能已切换类型,过期响应不得覆盖当前选中项\n if (selectedType.value?.code === code) items.value = list\n } catch (e) {\n if (selectedType.value?.code === code) {\n message.error(translateError(e))\n items.value = []\n }\n } finally {\n if (selectedType.value?.code === code) itemsLoading.value = false\n }\n}\nasync function selectType(r: SysDictType) {\n selectedType.value = r\n await loadItems()\n}\n\n// 批量删除:类型批删后清空选中类型 + 全量失效下拉缓存;项批删后仅重载右栏 + 失效缓存。\nconst {\n checkedKeys: typeCheckedKeys,\n hasSelection: typeHasSelection,\n run: typeBatchDelete,\n} = useBatchDelete({\n remove: dictAdminApi.typeBatchRemove,\n refresh: () => {\n selectedType.value = null\n items.value = []\n dictStore.invalidate()\n typeTableRef.value?.refresh()\n },\n successMsg: t('dict.typeDeleted'),\n})\nconst {\n checkedKeys: itemCheckedKeys,\n hasSelection: itemHasSelection,\n run: itemBatchDelete,\n} = useBatchDelete({\n remove: dictAdminApi.itemBatchRemove,\n refresh: () => {\n dictStore.invalidate()\n loadItems()\n },\n successMsg: t('dict.itemDeleted'),\n})\n\n// ── 左:字典类型 SmartTable ──\n// 窄栏用 search.layout:'inline'(无卡片单行),按名称过滤走列声明式 search。\nconst typeToInput = (r: SysDictType): DictTypeInput => ({\n code: r.code,\n name: r.name,\n sort: r.sort,\n enabled: r.enabled,\n remark: r.remark ?? '',\n})\nconst typeColumns: SmartTableColumn<SysDictType>[] = [\n { type: 'selection' },\n\n { type: 'index', title: () => t('common.rowNo'), width: 64, align: 'center' },\n { key: 'code', title: () => t('dict.code') },\n { key: 'name', title: () => t('dict.name'), search: true },\n { key: 'sort', title: () => t('dict.sort'), width: 70 },\n {\n key: 'enabled',\n title: () => t('common.status'),\n width: 90,\n // 包一层 stopPropagation:开关点击不得冒泡到行 onClick(否则误切选中类型)\n render: r =>\n h('div', { onClick: (e: Event) => e.stopPropagation() }, [\n h(StatusSwitch, {\n value: r.enabled,\n request: (next: boolean) =>\n dictAdminApi.typeUpdate(r.id, { ...typeToInput(r), enabled: next }),\n 'onUpdate:value': (v: boolean) => {\n r.enabled = v\n dictStore.invalidate(r.code)\n },\n }),\n ]),\n },\n {\n key: 'op',\n title: () => t('common.operation'),\n width: 130,\n fixed: 'right',\n hideInSetting: true,\n // stopPropagation:操作按钮点击不得冒泡到行 onClick(否则误切选中类型)\n render: r =>\n h(NSpace, { size: 4, wrapItem: false, onClick: (e: Event) => e.stopPropagation() }, () => [\n authStore.hasPerm('PUT:/api/v1/sys/dict/type/{id}')\n ? h(\n NButton,\n { size: 'small', quaternary: true, type: 'primary', onClick: () => openTypeEdit(r) },\n () => t('common.edit'),\n )\n : null,\n authStore.hasPerm('DELETE:/api/v1/sys/dict/type/{id}')\n ? h(\n NPopconfirm,\n {\n onPositiveClick: () =>\n run(() => dictAdminApi.typeRemove(r.id), t('dict.typeDeleted')).then(ok => {\n if (!ok) return\n dictStore.invalidate(r.code)\n if (selectedType.value?.id === r.id) {\n selectedType.value = null\n items.value = []\n }\n typeTableRef.value?.refresh()\n }),\n },\n {\n trigger: () =>\n h(NButton, { size: 'small', quaternary: true, type: 'error' }, () =>\n t('common.delete'),\n ),\n default: () => t('dict.typeDeleteConfirm', { name: r.name }),\n },\n )\n : null,\n ]),\n },\n]\n\n// ── 类型 新增/编辑弹窗 ──\nconst typeShow = ref(false)\nconst typeFormRef = ref<FormInst | null>(null)\nconst typeEditingId = ref<number | null>(null)\nconst typeRules: FormRules = {\n code: {\n required: true,\n whitespace: true,\n message: () => t('dict.codeRequired'),\n trigger: ['input', 'blur'],\n },\n name: {\n required: true,\n whitespace: true,\n message: () => t('dict.nameRequired'),\n trigger: ['input', 'blur'],\n },\n}\nconst blankType = (): DictTypeInput => ({ code: '', name: '', sort: 0, enabled: true, remark: '' })\nconst typeForm = reactive<DictTypeInput>(blankType())\n\nfunction openTypeAdd() {\n typeEditingId.value = null\n Object.assign(typeForm, blankType())\n typeShow.value = true\n}\nfunction openTypeEdit(r: SysDictType) {\n typeEditingId.value = r.id\n Object.assign(typeForm, typeToInput(r))\n typeShow.value = true\n}\nasync function saveType() {\n await typeFormRef.value?.validate()\n try {\n if (typeEditingId.value === null) await dictAdminApi.typeAdd({ ...typeForm })\n else await dictAdminApi.typeUpdate(typeEditingId.value, { ...typeForm })\n dictStore.invalidate(typeForm.code)\n message.success(t('dict.typeSaved'))\n await typeTableRef.value?.refresh()\n // 若编辑的是当前选中类型,同步其名称/编码到右栏标题与后续项提交\n if (selectedType.value?.id === typeEditingId.value)\n Object.assign(selectedType.value, { name: typeForm.name })\n } catch (e) {\n message.error(translateError(e))\n return false\n }\n}\n\n// ── 右:字典项 表格 ──\nconst itemToInput = (r: SysDictItem): DictItemInput => ({\n dictTypeCode: r.dictTypeCode,\n label: r.label,\n value: r.value,\n sort: r.sort,\n enabled: r.enabled,\n})\nconst itemColumns: DataTableColumns<SysDictItem> = [\n { type: 'selection' },\n\n {\n key: 'rowNo',\n title: () => t('common.rowNo'),\n width: 64,\n align: 'center',\n render: (_row, index) => index + 1,\n },\n { title: () => t('dict.itemLabel'), key: 'label' },\n { title: () => t('dict.itemValue'), key: 'value' },\n { title: () => t('dict.sort'), key: 'sort', width: 70 },\n {\n title: () => t('common.status'),\n key: 'enabled',\n width: 90,\n render: r =>\n h(StatusSwitch, {\n value: r.enabled,\n request: (next: boolean) =>\n dictAdminApi.itemUpdate(r.id, { ...itemToInput(r), enabled: next }),\n 'onUpdate:value': (v: boolean) => {\n r.enabled = v\n dictStore.invalidate(r.dictTypeCode)\n },\n }),\n },\n {\n title: () => t('common.operation'),\n key: 'op',\n width: 130,\n render: r =>\n h(NSpace, { size: 4, wrapItem: false }, () => [\n authStore.hasPerm('PUT:/api/v1/sys/dict/item/{id}')\n ? h(\n NButton,\n { size: 'small', quaternary: true, type: 'primary', onClick: () => openItemEdit(r) },\n () => t('common.edit'),\n )\n : null,\n authStore.hasPerm('DELETE:/api/v1/sys/dict/item/{id}')\n ? h(\n NPopconfirm,\n {\n onPositiveClick: () =>\n run(() => dictAdminApi.itemRemove(r.id), t('dict.itemDeleted')).then(ok => {\n if (!ok) return\n dictStore.invalidate(r.dictTypeCode)\n loadItems()\n }),\n },\n {\n trigger: () =>\n h(NButton, { size: 'small', quaternary: true, type: 'error' }, () =>\n t('common.delete'),\n ),\n default: () => t('dict.itemDeleteConfirm', { label: r.label }),\n },\n )\n : null,\n ]),\n },\n]\n\n// ── 字典项 新增/编辑弹窗 ──\nconst itemShow = ref(false)\nconst itemFormRef = ref<FormInst | null>(null)\nconst itemEditingId = ref<number | null>(null)\nconst itemRules: FormRules = {\n label: {\n required: true,\n whitespace: true,\n message: () => t('dict.itemLabelRequired'),\n trigger: ['input', 'blur'],\n },\n value: {\n required: true,\n whitespace: true,\n message: () => t('dict.itemValueRequired'),\n trigger: ['input', 'blur'],\n },\n}\nconst blankItem = (): DictItemInput => ({\n dictTypeCode: '',\n label: '',\n value: '',\n sort: 0,\n enabled: true,\n})\nconst itemForm = reactive<DictItemInput>(blankItem())\n\nfunction openItemAdd() {\n if (!selectedType.value) return\n itemEditingId.value = null\n Object.assign(itemForm, blankItem(), { dictTypeCode: selectedType.value.code })\n itemShow.value = true\n}\nfunction openItemEdit(r: SysDictItem) {\n itemEditingId.value = r.id\n Object.assign(itemForm, itemToInput(r))\n itemShow.value = true\n}\nasync function saveItem() {\n await itemFormRef.value?.validate()\n try {\n if (itemEditingId.value === null) await dictAdminApi.itemAdd({ ...itemForm })\n else await dictAdminApi.itemUpdate(itemEditingId.value, { ...itemForm })\n dictStore.invalidate(itemForm.dictTypeCode)\n message.success(t('dict.itemSaved'))\n await loadItems()\n } catch (e) {\n message.error(translateError(e))\n return false\n }\n}\n</script>\n\n<template>\n <!-- 两栏并排 = styles/layout.css 的形状 3(.side-page):display/拉伸/整屏高度都在那儿。\n 两个面板外面各套了一层自己的卡片,故卡片挂 .fill-card 接高度链;\n 左栏里还嵌着 SmartTable(卡中卡),「包住主表的那一层」就是卡片内容区,故 content-class 标 .fill-main\n —— 契约里写明了别把它写在 <SmartTable> 上(inheritAttrs:false,class 到不了 .smart-table 根节点)。 -->\n <div class=\"dict-layout side-page\">\n <n-card class=\"dict-pane fill-card\" content-class=\"fill-main\" :bordered=\"true\">\n <SmartTable\n :default-page-size=\"100\"\n ref=\"typeTableRef\"\n :columns=\"typeColumns\"\n :fetcher=\"dictAdminApi.typePage\"\n flex-height\n virtual-scroll\n :search=\"{ layout: 'inline' }\"\n storage-key=\"sys-dict-type\"\n :active-row-key=\"selectedType?.id ?? null\"\n :row-props=\"() => ({ style: 'cursor: pointer' })\"\n :checked-row-keys=\"typeCheckedKeys\"\n @row-click=\"(row: SysDictType) => selectType(row)\"\n @update:checked-row-keys=\"(keys: (string | number)[]) => (typeCheckedKeys = keys)\"\n @error=\"e => message.error(translateError(e))\"\n >\n <template #toolbar>\n <n-button v-auth=\"'POST:/api/v1/sys/dict/type'\" type=\"primary\" @click=\"openTypeAdd\">\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/dict/type/batch-delete'\"\n type=\"error\"\n :disabled=\"!typeHasSelection\"\n @click=\"typeBatchDelete\"\n >\n <template #icon><AppIcon icon=\"ph:trash\" :size=\"16\" /></template>\n {{ t('common.batchDelete') }}\n </n-button>\n </template>\n </SmartTable>\n </n-card>\n\n <n-card\n v-if=\"selectedType\"\n class=\"dict-pane fill-card\"\n :bordered=\"true\"\n :title=\"t('dict.itemsOf', { name: selectedType.name })\"\n >\n <template #header-extra>\n <n-space :size=\"8\">\n <n-button\n v-auth=\"'POST:/api/v1/sys/dict/item/batch-delete'\"\n size=\"small\"\n type=\"error\"\n :disabled=\"!itemHasSelection\"\n @click=\"itemBatchDelete\"\n >\n <template #icon><AppIcon icon=\"ph:trash\" :size=\"15\" /></template>\n {{ t('common.batchDelete') }}\n </n-button>\n <n-button\n v-auth=\"'POST:/api/v1/sys/dict/item'\"\n size=\"small\"\n type=\"primary\"\n @click=\"openItemAdd\"\n >\n <template #icon><AppIcon icon=\"ph:plus\" :size=\"15\" /></template>\n {{ t('dict.addItem') }}\n </n-button>\n </n-space>\n </template>\n <n-data-table\n :columns=\"itemColumns\"\n :data=\"items\"\n :loading=\"itemsLoading\"\n :row-key=\"(r: SysDictItem) => r.id\"\n :checked-row-keys=\"itemCheckedKeys\"\n size=\"small\"\n flex-height\n virtual-scroll\n @update:checked-row-keys=\"(keys: (string | number)[]) => (itemCheckedKeys = keys)\"\n />\n </n-card>\n <n-card v-else class=\"dict-pane\" :bordered=\"true\">\n <n-empty :description=\"t('dict.selectTypeHint')\" style=\"padding: 48px 0\" />\n </n-card>\n </div>\n\n <FormContainer\n v-model:show=\"typeShow\"\n :title=\"typeEditingId === null ? t('dict.addTypeTitle') : t('dict.editTypeTitle')\"\n :width=\"480\"\n :on-confirm=\"saveType\"\n :confirm-text=\"t('common.save')\"\n >\n <n-form\n ref=\"typeFormRef\"\n :model=\"typeForm\"\n :rules=\"typeRules\"\n label-placement=\"left\"\n :label-width=\"80\"\n >\n <n-form-item :label=\"t('dict.code')\" path=\"code\">\n <n-input\n v-model:value=\"typeForm.code\"\n :placeholder=\"t('dict.code')\"\n :disabled=\"typeEditingId !== null\"\n />\n </n-form-item>\n <n-form-item :label=\"t('dict.name')\" path=\"name\">\n <n-input v-model:value=\"typeForm.name\" :placeholder=\"t('dict.name')\" />\n </n-form-item>\n <n-form-item :label=\"t('dict.sort')\">\n <n-input-number v-model:value=\"typeForm.sort\" :min=\"0\" style=\"width: 160px\" />\n </n-form-item>\n <n-form-item :label=\"t('dict.remark')\">\n <n-input\n v-model:value=\"typeForm.remark as string\"\n type=\"textarea\"\n :autosize=\"{ minRows: 2 }\"\n />\n </n-form-item>\n <n-form-item :label=\"t('common.status')\">\n <n-switch v-model:value=\"typeForm.enabled\" />\n </n-form-item>\n </n-form>\n </FormContainer>\n\n <FormContainer\n v-model:show=\"itemShow\"\n :title=\"itemEditingId === null ? t('dict.addItemTitle') : t('dict.editItemTitle')\"\n :width=\"480\"\n :on-confirm=\"saveItem\"\n :confirm-text=\"t('common.save')\"\n >\n <n-form\n ref=\"itemFormRef\"\n :model=\"itemForm\"\n :rules=\"itemRules\"\n label-placement=\"left\"\n :label-width=\"80\"\n >\n <n-form-item :label=\"t('dict.itemLabel')\" path=\"label\">\n <n-input v-model:value=\"itemForm.label\" :placeholder=\"t('dict.itemLabel')\" />\n </n-form-item>\n <n-form-item :label=\"t('dict.itemValue')\" path=\"value\">\n <n-input v-model:value=\"itemForm.value\" :placeholder=\"t('dict.itemValue')\" />\n </n-form-item>\n <n-form-item :label=\"t('dict.sort')\">\n <n-input-number v-model:value=\"itemForm.sort\" :min=\"0\" style=\"width: 160px\" />\n </n-form-item>\n <n-form-item :label=\"t('common.status')\">\n <n-switch v-model:value=\"itemForm.enabled\" />\n </n-form-item>\n </n-form>\n </FormContainer>\n</template>\n\n<style scoped>\n/* display / 拉伸 / 整屏高度都在 styles/layout.css 的 .side-page,这里只留换行与间距。 */\n.dict-layout {\n flex-wrap: wrap;\n gap: var(--gap-card);\n}\n.dict-pane {\n flex: 1 1 380px;\n min-width: 0;\n}\n</style>\n"],"names":["t","useI18n","message","useMessage","run","useConfirm","authStore","useAuthStore","dictStore","useDictStore","typeTableRef","ref","selectedType","items","itemsLoading","loadItems","code","_a","list","dictAdminApi","_b","e","_c","translateError","_d","selectType","r","typeCheckedKeys","typeHasSelection","typeBatchDelete","useBatchDelete","itemCheckedKeys","itemHasSelection","itemBatchDelete","typeToInput","typeColumns","h","StatusSwitch","next","v","NSpace","NButton","openTypeEdit","NPopconfirm","ok","typeShow","typeFormRef","typeEditingId","typeRules","blankType","typeForm","reactive","openTypeAdd","saveType","itemToInput","itemColumns","_row","index","openItemEdit","itemShow","itemFormRef","itemEditingId","itemRules","blankItem","itemForm","openItemAdd","saveItem","_createElementVNode","_hoisted_1","_createVNode","_unref","NCard","SmartTable","_cache","row","keys","_createBlock","AppIcon","_createTextVNode","NDataTable","NEmpty","FormContainer","$event","NForm","NFormItem","NInput","NInputNumber","NSwitch"],"mappings":"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"}
1
+ {"version":3,"file":"index2.vue.js","sources":["../../../../src/views/system/dict/index.vue"],"sourcesContent":["<script setup lang=\"ts\">\n// 字典管理 = 主从:上=类型 SmartTable(CRUD),点击行选中 → 下=该类型的字典项(同样是 SmartTable,静态数据模式 + CRUD)。\n// 关键约束:下方走管理端 dict/item/page(含停用项、带 id);下拉用的 dict/items/{code} 只回启用项且丢 id,不能复用。\n// 任何类型/项的增删改后调 useDictStore().invalidate(code) 失效下拉缓存,变更即时生效。\nimport { computed, h, reactive, ref } from 'vue'\nimport {\n NButton,\n NCard,\n NDrawer,\n NDrawerContent,\n NSpace,\n NInput,\n NInputNumber,\n NPopconfirm,\n NForm,\n NFormItem,\n NEmpty,\n NSwitch,\n useMessage,\n type FormInst,\n type FormRules,\n} from 'naive-ui'\nimport { useElementSize, useMediaQuery } from '@vueuse/core'\nimport { useI18n } from 'vue-i18n'\nimport { SmartTable, type SmartTableColumn, type SmartTableInst } from 'smart-naive-table'\nimport AppIcon from '#/components/AppIcon.vue'\nimport FormContainer from '#/components/FormContainer/index.vue'\nimport StatusSwitch from '#/components/StatusSwitch/index.vue'\nimport { useConfirm } from '#/composables/useConfirm'\nimport { useBatchDelete } from '#/composables/useBatchDelete'\nimport { dictAdminApi } from '#/api'\nimport { useAuthStore } from '#/stores/auth'\nimport { useDictStore } from '#/stores/dict'\nimport { translateError } from '#/utils/error'\nimport { SEARCH_ACTIONS, deriveHeaderFilters } from '#/utils/tableFilter'\nimport { TABLE_MIN_ROW_HEIGHT, TABLE_TOOLBAR } from '#/utils/tableToolbar'\nimport TableTotal from '#/components/TableTotal/index.vue'\nimport type { DictItemInput, DictTypeInput, SysDictItem, SysDictType } from '#/types/api'\n\nconst { t } = useI18n()\nconst message = useMessage()\nconst { run } = useConfirm()\nconst authStore = useAuthStore()\nconst dictStore = useDictStore()\nconst typeTableRef = ref<SmartTableInst<SysDictType>>()\n\n// 本页不开「放大」:上下两栏各自定高、表体内部滚动,放大层会把主从关系拆散。\nconst TYPE_TOOLBAR = { ...TABLE_TOOLBAR, maximize: false }\n\n// ── 窄档:类型表换成卡片列表,字典项不内联,点卡片从底部抽屉看 ──\n// 阈值与 smart-naive-table 的 card-on-narrow 一致(根节点宽 < 600);页面外壳宽 = 类型表根节点宽。\n// 首帧量到 0 不算窄档,免得宽屏刷新时闪一下卡片。\nconst layoutRef = ref<HTMLElement>()\nconst { width: layoutWidth } = useElementSize(layoutRef)\nconst narrow = computed(() => layoutWidth.value > 0 && layoutWidth.value < 600)\nconst itemSheet = ref(false)\n\n// 表单:窄屏标签放上方(底部抽屉里横排标签太挤),宽 / 中档沿用左标签\nconst narrowForm = useMediaQuery('(max-width: 640px)')\nconst formLayout = computed(() =>\n narrowForm.value\n ? { labelPlacement: 'top' as const, labelWidth: undefined }\n : { labelPlacement: 'left' as const, labelWidth: 80 },\n)\n\n// ── 主从选中态 + 下方字典项 ──\nconst selectedType = ref<SysDictType | null>(null)\nconst items = ref<SysDictItem[]>([])\nconst itemsLoading = ref(false)\n\nasync function loadItems() {\n const code = selectedType.value?.code\n if (!code) {\n items.value = []\n return\n }\n itemsLoading.value = true\n try {\n const list = await dictAdminApi.items(code)\n // 竞态守卫:await 期间用户可能已切换类型,过期响应不得覆盖当前选中项\n if (selectedType.value?.code === code) items.value = list\n } catch (e) {\n if (selectedType.value?.code === code) {\n message.error(translateError(e))\n items.value = []\n }\n } finally {\n if (selectedType.value?.code === code) itemsLoading.value = false\n }\n}\nasync function selectType(r: SysDictType) {\n selectedType.value = r\n await loadItems()\n}\n/** 点类型行 / 卡片:窄档同时拉起底部抽屉(此时下栏卡片不渲染)。 */\nfunction onTypeClick(r: SysDictType) {\n if (narrow.value) itemSheet.value = true\n return selectType(r)\n}\n\n// 批量删除:类型批删后清空选中类型 + 全量失效下拉缓存;项批删后仅重载下栏 + 失效缓存。\nconst { checkedKeys: typeCheckedKeys, run: typeBatchDelete } = useBatchDelete({\n remove: dictAdminApi.typeBatchRemove,\n refresh: () => {\n selectedType.value = null\n items.value = []\n dictStore.invalidate()\n typeTableRef.value?.refresh()\n },\n successMsg: t('dict.typeDeleted'),\n})\nconst {\n checkedKeys: itemCheckedKeys,\n hasSelection: itemHasSelection,\n run: itemBatchDelete,\n} = useBatchDelete({\n remove: dictAdminApi.itemBatchRemove,\n refresh: () => {\n dictStore.invalidate()\n loadItems()\n },\n successMsg: t('dict.itemDeleted'),\n})\n\n// ── 上:字典类型 SmartTable ──\n// 窄栏同样用条件构造器(container: 'table'):容器宽小于 600 时 3.0 自动收成「输入框 + 筛选」,按名称过滤走列声明式 search。\nconst typeToInput = (r: SysDictType): DictTypeInput => ({\n code: r.code,\n name: r.name,\n sort: r.sort,\n enabled: r.enabled,\n remark: r.remark ?? '',\n})\nconst typeColumns: SmartTableColumn<SysDictType>[] = [\n { type: 'selection' },\n { type: 'index', title: () => t('common.rowNo'), width: 64, align: 'center' },\n {\n key: 'code',\n title: () => t('dict.code'),\n render: r => h('span', { class: 'mono muted' }, r.code),\n },\n // 窄档卡片以类型名称作标题(默认取第一个数据列 = 编码,不如名称好认)\n {\n key: 'name',\n title: () => t('dict.name'),\n card: 'title',\n search: { actions: SEARCH_ACTIONS.fuzzy },\n },\n {\n key: 'sort',\n title: () => t('dict.sort'),\n width: 70,\n render: r => h('span', { class: 'num muted' }, r.sort),\n },\n {\n key: 'enabled',\n title: () => t('common.status'),\n width: 90,\n // 包一层 stopPropagation:开关点击不得冒泡到行 onClick(否则误切选中类型)\n render: r =>\n h('div', { onClick: (e: Event) => e.stopPropagation() }, [\n h(StatusSwitch, {\n value: r.enabled,\n request: (next: boolean) =>\n dictAdminApi.typeUpdate(r.id, { ...typeToInput(r), enabled: next }),\n 'onUpdate:value': (v: boolean) => {\n r.enabled = v\n dictStore.invalidate(r.code)\n },\n }),\n ]),\n },\n {\n key: 'op',\n title: () => t('common.operation'),\n width: 130,\n align: 'right',\n fixed: 'right',\n hideInSetting: true,\n // stopPropagation:操作按钮点击不得冒泡到行 onClick(否则误切选中类型)\n render: r =>\n h(\n NSpace,\n { size: 2, justify: 'end', wrapItem: false, onClick: (e: Event) => e.stopPropagation() },\n () => [\n authStore.hasPerm('PUT:/api/v1/sys/dict/type/{id}')\n ? h(\n NButton,\n {\n size: 'small',\n quaternary: true,\n type: 'primary',\n onClick: () => openTypeEdit(r),\n },\n () => t('common.edit'),\n )\n : null,\n authStore.hasPerm('DELETE:/api/v1/sys/dict/type/{id}')\n ? h(\n NPopconfirm,\n {\n onPositiveClick: () =>\n run(() => dictAdminApi.typeRemove(r.id), t('dict.typeDeleted')).then(ok => {\n if (!ok) return\n dictStore.invalidate(r.code)\n if (selectedType.value?.id === r.id) {\n selectedType.value = null\n items.value = []\n }\n typeTableRef.value?.refresh()\n }),\n },\n {\n trigger: () =>\n h(NButton, { size: 'small', quaternary: true, type: 'error' }, () =>\n t('common.delete'),\n ),\n default: () => t('dict.typeDeleteConfirm', { name: r.name }),\n },\n )\n : null,\n ],\n ),\n },\n]\nderiveHeaderFilters(typeColumns)\n\n// ── 类型 新增/编辑弹窗 ──\nconst typeShow = ref(false)\nconst typeFormRef = ref<FormInst | null>(null)\nconst typeEditingId = ref<number | null>(null)\nconst typeRules: FormRules = {\n code: {\n required: true,\n whitespace: true,\n message: () => t('dict.codeRequired'),\n trigger: ['input', 'blur'],\n },\n name: {\n required: true,\n whitespace: true,\n message: () => t('dict.nameRequired'),\n trigger: ['input', 'blur'],\n },\n}\nconst blankType = (): DictTypeInput => ({ code: '', name: '', sort: 0, enabled: true, remark: '' })\nconst typeForm = reactive<DictTypeInput>(blankType())\n\nfunction openTypeAdd() {\n typeEditingId.value = null\n Object.assign(typeForm, blankType())\n typeShow.value = true\n}\nfunction openTypeEdit(r: SysDictType) {\n typeEditingId.value = r.id\n Object.assign(typeForm, typeToInput(r))\n typeShow.value = true\n}\nasync function saveType() {\n await typeFormRef.value?.validate()\n try {\n if (typeEditingId.value === null) await dictAdminApi.typeAdd({ ...typeForm })\n else await dictAdminApi.typeUpdate(typeEditingId.value, { ...typeForm })\n dictStore.invalidate(typeForm.code)\n message.success(t('dict.typeSaved'))\n await typeTableRef.value?.refresh()\n // 若编辑的是当前选中类型,同步其名称/编码到下栏标题与后续项提交\n if (selectedType.value?.id === typeEditingId.value)\n Object.assign(selectedType.value, { name: typeForm.name })\n } catch (e) {\n message.error(translateError(e))\n return false\n }\n}\n\n// ── 下:字典项 表格 ──\nconst itemToInput = (r: SysDictItem): DictItemInput => ({\n dictTypeCode: r.dictTypeCode,\n label: r.label,\n value: r.value,\n sort: r.sort,\n enabled: r.enabled,\n})\n/** 字典项启停:悲观更新(StatusSwitch 请求成功才 emit);表格行与窄档抽屉卡片共用。 */\nconst itemEnabledRequest = (r: SysDictItem) => (next: boolean) =>\n dictAdminApi.itemUpdate(r.id, { ...itemToInput(r), enabled: next })\nfunction onItemEnabled(r: SysDictItem, v: boolean) {\n r.enabled = v\n dictStore.invalidate(r.dictTypeCode)\n}\n/** 字典项删除成功后失效缓存并重载下栏;表格行与窄档抽屉卡片共用。 */\nconst removeItem = (r: SysDictItem) =>\n run(() => dictAdminApi.itemRemove(r.id), t('dict.itemDeleted')).then(ok => {\n if (!ok) return\n dictStore.invalidate(r.dictTypeCode)\n loadItems()\n })\n// 字典项是静态数据(整类一次取回),条件搜索由 SmartTable 前端求值\nconst itemColumns: SmartTableColumn<SysDictItem>[] = [\n { type: 'selection' },\n { type: 'index', title: () => t('common.rowNo'), width: 64, align: 'center' },\n { title: () => t('dict.itemLabel'), key: 'label', card: 'title', search: {} },\n {\n title: () => t('dict.itemValue'),\n key: 'value',\n search: {},\n render: r => h('span', { class: 'mono muted' }, r.value),\n },\n {\n title: () => t('dict.sort'),\n key: 'sort',\n width: 70,\n render: r => h('span', { class: 'num muted' }, r.sort),\n },\n {\n title: () => t('common.status'),\n key: 'enabled',\n width: 90,\n render: r =>\n h(StatusSwitch, {\n value: r.enabled,\n request: itemEnabledRequest(r),\n 'onUpdate:value': (v: boolean) => onItemEnabled(r, v),\n }),\n },\n {\n title: () => t('common.operation'),\n key: 'op',\n width: 130,\n align: 'right',\n fixed: 'right',\n hideInSetting: true,\n render: r =>\n h(NSpace, { size: 2, justify: 'end', wrapItem: false }, () => [\n authStore.hasPerm('PUT:/api/v1/sys/dict/item/{id}')\n ? h(\n NButton,\n { size: 'small', quaternary: true, type: 'primary', onClick: () => openItemEdit(r) },\n () => t('common.edit'),\n )\n : null,\n authStore.hasPerm('DELETE:/api/v1/sys/dict/item/{id}')\n ? h(\n NPopconfirm,\n { onPositiveClick: () => removeItem(r) },\n {\n trigger: () =>\n h(NButton, { size: 'small', quaternary: true, type: 'error' }, () =>\n t('common.delete'),\n ),\n default: () => t('dict.itemDeleteConfirm', { label: r.label }),\n },\n )\n : null,\n ]),\n },\n]\nderiveHeaderFilters(itemColumns)\n\n// ── 字典项 新增/编辑弹窗 ──\nconst itemShow = ref(false)\nconst itemFormRef = ref<FormInst | null>(null)\nconst itemEditingId = ref<number | null>(null)\nconst itemRules: FormRules = {\n label: {\n required: true,\n whitespace: true,\n message: () => t('dict.itemLabelRequired'),\n trigger: ['input', 'blur'],\n },\n value: {\n required: true,\n whitespace: true,\n message: () => t('dict.itemValueRequired'),\n trigger: ['input', 'blur'],\n },\n}\nconst blankItem = (): DictItemInput => ({\n dictTypeCode: '',\n label: '',\n value: '',\n sort: 0,\n enabled: true,\n})\nconst itemForm = reactive<DictItemInput>(blankItem())\n\nfunction openItemAdd() {\n if (!selectedType.value) return\n itemEditingId.value = null\n Object.assign(itemForm, blankItem(), { dictTypeCode: selectedType.value.code })\n itemShow.value = true\n}\nfunction openItemEdit(r: SysDictItem) {\n itemEditingId.value = r.id\n Object.assign(itemForm, itemToInput(r))\n itemShow.value = true\n}\nasync function saveItem() {\n await itemFormRef.value?.validate()\n try {\n if (itemEditingId.value === null) await dictAdminApi.itemAdd({ ...itemForm })\n else await dictAdminApi.itemUpdate(itemEditingId.value, { ...itemForm })\n dictStore.invalidate(itemForm.dictTypeCode)\n message.success(t('dict.itemSaved'))\n await loadItems()\n } catch (e) {\n message.error(translateError(e))\n return false\n }\n}\n</script>\n<template>\n <!-- 上下两栏、各吃一半 = styles/layout.css 的形状 5(.fill-split)套在整页外壳 .fill-page 里:\n 字典类型在上、字典项在下,宽度都是整行,类型表的条件搜索因此能排成单行三段式。\n 上栏的 SmartTable 自己就是一张卡片,直接作为 .fill-split 的子元素均分高度,外面不再套卡片(否则卡中卡);\n 下栏的字典项表同样是 SmartTable(静态数据模式),也直接作为 .fill-split 的子元素均分;\n 没选中类型时下栏是一张带提示的空卡片(挂 .fill-main 参与均分)。\n .fill-page--soft:矮屏让页面滚动,不把两张表压成一条缝。\n 窄档(外壳宽 < 600):类型表由库换成卡片列表(card-on-narrow),下栏卡片不渲染,\n 点卡片 = @row-click,从底部抽屉看字典项(抽屉里也是同一套列的 SmartTable 卡片列表,底部固定「批量删除 / 新增字典项」)。\n 工具栏里不放表名:选中的是哪个类型由类型表的行高亮表达,字典项表上方也不再写类型名。\n (注释里别写带尖括号的标签名:listSearch.spec.ts 的正则会把它当成一张表而误判。) -->\n <div ref=\"layoutRef\" class=\"dict-layout fill-page fill-page--soft fill-split\">\n <SmartTable\n :toolbar=\"TYPE_TOOLBAR\"\n ref=\"typeTableRef\"\n :columns=\"typeColumns\"\n :fetcher=\"dictAdminApi.typePage\"\n fill-height\n :min-row-height=\"TABLE_MIN_ROW_HEIGHT\"\n card-on-narrow\n :search=\"{ container: 'table' }\"\n storage-key=\"sys-dict-type\"\n :active-row-key=\"selectedType?.id ?? null\"\n :row-props=\"() => ({ style: 'cursor: pointer' })\"\n :checked-row-keys=\"typeCheckedKeys\"\n @row-click=\"(row: SysDictType) => onTypeClick(row)\"\n @update:checked-row-keys=\"(keys: (string | number)[]) => (typeCheckedKeys = keys)\"\n @error=\"e => message.error(translateError(e))\"\n >\n <template #pagination-prefix=\"{ itemCount }\">\n <TableTotal :count=\"itemCount\" />\n </template>\n <template #toolbar-right>\n <n-button v-auth=\"'POST:/api/v1/sys/dict/type'\" type=\"primary\" @click=\"openTypeAdd\">\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/dict/type/batch-delete'\"\n secondary\n type=\"error\"\n @click=\"typeBatchDelete\"\n >\n <template #icon><AppIcon icon=\"ph:trash\" :size=\"16\" /></template>\n {{ t('common.batchDelete') }}\n </n-button>\n </template>\n </SmartTable>\n\n <SmartTable\n v-if=\"!narrow && selectedType\"\n :columns=\"itemColumns\"\n :data=\"items\"\n row-key=\"id\"\n :loading=\"itemsLoading\"\n :toolbar=\"TYPE_TOOLBAR\"\n :search=\"{ container: 'table' }\"\n :checked-row-keys=\"itemCheckedKeys\"\n fill-height\n :min-row-height=\"TABLE_MIN_ROW_HEIGHT\"\n storage-key=\"sys-dict-item\"\n @update:checked-row-keys=\"(keys: (string | number)[]) => (itemCheckedKeys = keys)\"\n >\n <template #pagination-prefix=\"{ itemCount }\">\n <TableTotal :count=\"itemCount\" />\n </template>\n <template #toolbar-right>\n <n-button v-auth=\"'POST:/api/v1/sys/dict/item'\" type=\"primary\" @click=\"openItemAdd\">\n <template #icon><AppIcon icon=\"ph:plus\" :size=\"16\" /></template>\n {{ t('dict.addItem') }}\n </n-button>\n </template>\n <template #batch>\n <n-button\n v-auth=\"'POST:/api/v1/sys/dict/item/batch-delete'\"\n secondary\n type=\"error\"\n @click=\"itemBatchDelete\"\n >\n <template #icon><AppIcon icon=\"ph:trash\" :size=\"16\" /></template>\n {{ t('common.batchDelete') }}\n </n-button>\n </template>\n </SmartTable>\n <n-card v-else-if=\"!narrow\" class=\"dict-pane fill-main\" :bordered=\"true\">\n <n-empty :description=\"t('dict.selectTypeHint')\" style=\"padding: 48px 0; margin: auto\" />\n </n-card>\n </div>\n\n <!-- 窄档:字典项底部抽屉。卡片里的开关 / 勾选 / 编辑 / 删除与宽档表格行是同一套请求与权限 -->\n <n-drawer\n :show=\"itemSheet && narrow && !!selectedType\"\n placement=\"bottom\"\n height=\"85vh\"\n style=\"border-radius: 16px 16px 0 0\"\n @update:show=\"(v: boolean) => (itemSheet = v)\"\n >\n <n-drawer-content\n :title=\"\n selectedType ? t('dict.itemsOf', { name: selectedType.name }) : t('dict.itemsSheetTitle')\n \"\n closable\n >\n <SmartTable\n :columns=\"itemColumns\"\n :data=\"items\"\n row-key=\"id\"\n :loading=\"itemsLoading\"\n :toolbar=\"TYPE_TOOLBAR\"\n :search=\"{ container: 'table' }\"\n :checked-row-keys=\"itemCheckedKeys\"\n card-on-narrow\n storage-key=\"sys-dict-item-sheet\"\n @update:checked-row-keys=\"(keys: (string | number)[]) => (itemCheckedKeys = keys)\"\n >\n <template #pagination-prefix=\"{ itemCount }\">\n <TableTotal :count=\"itemCount\" />\n </template>\n </SmartTable>\n <template #footer>\n <div class=\"sheet-foot\">\n <n-button\n v-auth=\"'POST:/api/v1/sys/dict/item/batch-delete'\"\n secondary\n type=\"error\"\n size=\"large\"\n :disabled=\"!itemHasSelection\"\n @click=\"itemBatchDelete\"\n >\n {{ t('common.batchDelete') }}\n </n-button>\n <n-button\n v-auth=\"'POST:/api/v1/sys/dict/item'\"\n type=\"primary\"\n size=\"large\"\n @click=\"openItemAdd\"\n >\n {{ t('dict.addItem') }}\n </n-button>\n </div>\n </template>\n </n-drawer-content>\n </n-drawer>\n\n <FormContainer\n v-model:show=\"typeShow\"\n :title=\"typeEditingId === null ? t('dict.addTypeTitle') : t('dict.editTypeTitle')\"\n :width=\"480\"\n :on-confirm=\"saveType\"\n :confirm-text=\"t('common.save')\"\n >\n <n-form\n ref=\"typeFormRef\"\n :model=\"typeForm\"\n :rules=\"typeRules\"\n require-mark-placement=\"left\"\n v-bind=\"formLayout\"\n >\n <n-form-item :label=\"t('dict.code')\" path=\"code\">\n <n-input\n v-model:value=\"typeForm.code\"\n class=\"mono\"\n :placeholder=\"t('dict.code')\"\n :disabled=\"typeEditingId !== null\"\n />\n <!-- 反馈槽只在编辑时有内容;新增时槽为空,校验提示照常显示 -->\n <template #feedback>\n <span v-if=\"typeEditingId !== null\" class=\"field-hint\">\n {{ t('dict.codeImmutable') }}\n </span>\n </template>\n </n-form-item>\n <n-form-item :label=\"t('dict.name')\" path=\"name\">\n <n-input v-model:value=\"typeForm.name\" :placeholder=\"t('dict.name')\" />\n </n-form-item>\n <n-form-item :label=\"t('dict.sort')\">\n <n-input-number v-model:value=\"typeForm.sort\" :min=\"0\" style=\"width: 160px\" />\n </n-form-item>\n <n-form-item :label=\"t('dict.remark')\">\n <n-input\n v-model:value=\"typeForm.remark as string\"\n type=\"textarea\"\n :autosize=\"{ minRows: 2 }\"\n />\n </n-form-item>\n <n-form-item :label=\"t('common.status')\">\n <n-switch v-model:value=\"typeForm.enabled\" />\n </n-form-item>\n </n-form>\n </FormContainer>\n\n <FormContainer\n v-model:show=\"itemShow\"\n :title=\"itemEditingId === null ? t('dict.addItemTitle') : t('dict.editItemTitle')\"\n :width=\"480\"\n :on-confirm=\"saveItem\"\n :confirm-text=\"t('common.save')\"\n >\n <n-form\n ref=\"itemFormRef\"\n :model=\"itemForm\"\n :rules=\"itemRules\"\n require-mark-placement=\"left\"\n v-bind=\"formLayout\"\n >\n <n-form-item :label=\"t('dict.itemLabel')\" path=\"label\">\n <n-input v-model:value=\"itemForm.label\" :placeholder=\"t('dict.itemLabel')\" />\n </n-form-item>\n <n-form-item :label=\"t('dict.itemValue')\" path=\"value\">\n <n-input v-model:value=\"itemForm.value\" class=\"mono\" :placeholder=\"t('dict.itemValue')\" />\n </n-form-item>\n <n-form-item :label=\"t('dict.sort')\">\n <n-input-number v-model:value=\"itemForm.sort\" :min=\"0\" style=\"width: 160px\" />\n </n-form-item>\n <n-form-item :label=\"t('common.status')\">\n <n-switch v-model:value=\"itemForm.enabled\" />\n </n-form-item>\n </n-form>\n </FormContainer>\n</template>\n\n<style scoped>\n/* 上下均分、整屏高度都在 styles/layout.css(.fill-page / .fill-split),这里只给每栏一个最小高度:\n 矮屏时整页滚动,而不是把表压扁。 */\n.dict-layout > :deep(.smart-table),\n.dict-pane {\n min-width: 0;\n min-height: 280px;\n}\n\n/* 单元格里的辅助字样:编码 / 值用等宽,序号 / 排序用等宽数字。\n 表格单元格由库与 naive 渲染,要 :deep 才够得着;抽屉卡片是自己的元素,直接命中。 */\n.mono,\n:deep(.mono) {\n font-family: var(--font-mono);\n font-size: 13.5px;\n letter-spacing: 0;\n}\n.muted,\n:deep(.muted) {\n color: var(--text-2);\n}\n.faint,\n:deep(.faint) {\n color: var(--text-3);\n}\n.num,\n:deep(.num) {\n font-variant-numeric: tabular-nums;\n}\n\n.sheet-foot {\n display: flex;\n gap: 10px;\n width: 100%;\n}\n.sheet-foot .n-button {\n flex: 1;\n}\n\n/* 表单里的字段提示(编码创建后不可改) */\n.field-hint {\n font-size: 13px;\n color: var(--text-3);\n}\n</style>\n"],"names":["t","useI18n","message","useMessage","run","useConfirm","authStore","useAuthStore","dictStore","useDictStore","typeTableRef","ref","TYPE_TOOLBAR","TABLE_TOOLBAR","layoutRef","layoutWidth","useElementSize","narrow","computed","itemSheet","narrowForm","useMediaQuery","formLayout","selectedType","items","itemsLoading","loadItems","code","_a","list","dictAdminApi","_b","e","_c","translateError","_d","selectType","r","onTypeClick","typeCheckedKeys","typeBatchDelete","useBatchDelete","itemCheckedKeys","itemHasSelection","itemBatchDelete","typeToInput","typeColumns","h","SEARCH_ACTIONS","StatusSwitch","next","v","NSpace","NButton","openTypeEdit","NPopconfirm","ok","deriveHeaderFilters","typeShow","typeFormRef","typeEditingId","typeRules","blankType","typeForm","reactive","openTypeAdd","saveType","itemToInput","itemEnabledRequest","onItemEnabled","removeItem","itemColumns","openItemEdit","itemShow","itemFormRef","itemEditingId","itemRules","blankItem","itemForm","openItemAdd","saveItem","_createElementVNode","_createVNode","_unref","SmartTable","TABLE_MIN_ROW_HEIGHT","_cache","row","keys","_withCtx","itemCount","TableTotal","_createBlock","AppIcon","_createTextVNode","NCard","NEmpty","NDrawer","NDrawerContent","_hoisted_1","FormContainer","$event","_mergeProps","NFormItem","_createElementBlock","_hoisted_2","_toDisplayString","NInput","NInputNumber","NSwitch"],"mappings":"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"}
@@ -1,90 +1,98 @@
1
- import { defineComponent as R, ref as B, resolveDirective as D, openBlock as f, createBlock as m, unref as o, withCtx as n, withDirectives as y, createVNode as s, createTextVNode as k, toDisplayString as v, h as a } from "vue";
2
- import { useMessage as E, NButton as c, NSpace as P, NPopconfirm as U } from "naive-ui";
1
+ import { defineComponent as N, ref as R, h as l, resolveDirective as S, openBlock as d, createBlock as f, unref as o, withCtx as r, withDirectives as y, createTextVNode as k, toDisplayString as w, createVNode as s } from "vue";
2
+ import { useMessage as B, NSpace as O, NButton as c, NPopconfirm as D } from "naive-ui";
3
3
  import { useI18n as L } from "vue-i18n";
4
- import { SmartTable as O } from "smart-naive-table";
4
+ import { SmartTable as A } from "smart-naive-table";
5
5
  import p from "../../../components/AppIcon.vue.js";
6
6
  import b from "../../../components/FileUpload/index.vue.js";
7
- import { useConfirm as I } from "../../../composables/useConfirm.js";
8
- import { useBatchDelete as j } from "../../../composables/useBatchDelete.js";
9
- import { useAuthStore as q } from "../../../stores/auth.js";
7
+ import { useConfirm as P } from "../../../composables/useConfirm.js";
8
+ import { useBatchDelete as I } from "../../../composables/useBatchDelete.js";
9
+ import { useAuthStore as U } from "../../../stores/auth.js";
10
10
  import { fileApi as u } from "../../../api/index.js";
11
- import { translateError as T } from "../../../utils/error.js";
12
- import { fmtBytes as A } from "../../../utils/format.js";
13
- const ee = /* @__PURE__ */ R({
11
+ import { translateError as x } from "../../../utils/error.js";
12
+ import { SEARCH_ACTIONS as H, deriveHeaderFilters as M } from "../../../utils/tableFilter.js";
13
+ import { TABLE_MIN_ROW_HEIGHT as j, TABLE_TOOLBAR as q } from "../../../utils/tableToolbar.js";
14
+ import G from "../../../components/TableTotal/index.vue.js";
15
+ import { fmtBytes as K, fmtDateTime as V } from "../../../utils/format.js";
16
+ const se = /* @__PURE__ */ N({
14
17
  __name: "index",
15
- setup(K) {
16
- const { t } = L(), h = E(), { run: x } = I(), w = q(), d = B(), {
17
- checkedKeys: _,
18
- hasSelection: z,
19
- run: C
20
- } = j({
18
+ setup($) {
19
+ const { t } = L(), h = B(), { run: z } = P(), _ = U(), m = R(), { checkedKeys: T, run: C } = I({
21
20
  remove: u.batchRemove,
22
21
  refresh: () => {
23
22
  var e;
24
- return (e = d.value) == null ? void 0 : e.refresh();
23
+ return (e = m.value) == null ? void 0 : e.refresh();
25
24
  },
26
25
  successMsg: t("file.deleted")
27
26
  });
28
- function g() {
27
+ function v() {
29
28
  var e;
30
- h.success(t("file.uploaded")), (e = d.value) == null || e.refresh();
29
+ h.success(t("file.uploaded")), (e = m.value) == null || e.refresh();
31
30
  }
32
- async function S(e) {
31
+ async function E(e) {
33
32
  try {
34
- const i = await u.download(e.id), r = URL.createObjectURL(i), l = document.createElement("a");
35
- l.href = r, l.download = e.originalName, document.body.appendChild(l), l.click(), l.remove(), URL.revokeObjectURL(r);
36
- } catch (i) {
37
- h.error(T(i));
33
+ const n = await u.download(e.id), a = URL.createObjectURL(n), i = document.createElement("a");
34
+ i.href = a, i.download = e.originalName, document.body.appendChild(i), i.click(), i.remove(), URL.revokeObjectURL(a);
35
+ } catch (n) {
36
+ h.error(x(n));
38
37
  }
39
38
  }
40
- const N = [
39
+ const g = [
41
40
  { type: "selection" },
42
41
  { type: "index", title: () => t("common.rowNo"), width: 64, align: "center" },
43
- { key: "originalName", title: () => t("file.name"), search: !0, ellipsis: { tooltip: !0 } },
42
+ {
43
+ key: "originalName",
44
+ title: () => t("file.name"),
45
+ search: { actions: H.fuzzy },
46
+ ellipsis: { tooltip: !0 }
47
+ },
44
48
  {
45
49
  key: "extension",
46
50
  title: () => t("file.extension"),
47
51
  width: 90,
48
- render: (e) => e.extension || "—"
52
+ render: (e) => e.extension ? l("span", { class: "mono muted" }, e.extension) : "—"
49
53
  },
50
54
  {
51
55
  key: "sizeBytes",
52
56
  title: () => t("file.size"),
53
57
  width: 110,
54
- render: (e) => A(e.sizeBytes)
58
+ render: (e) => l("span", { class: "num" }, K(e.sizeBytes))
55
59
  },
56
60
  {
57
61
  key: "contentType",
58
62
  title: () => t("file.contentType"),
59
63
  ellipsis: { tooltip: !0 },
60
- render: (e) => e.contentType || "—"
64
+ render: (e) => l("span", { class: "muted" }, e.contentType || "—")
65
+ },
66
+ {
67
+ key: "createTime",
68
+ title: () => t("file.uploadTime"),
69
+ render: (e) => l("span", { class: "num muted", style: "white-space: nowrap" }, V(e.createTime))
61
70
  },
62
- { key: "createTime", title: () => t("file.uploadTime"), format: "datetime" },
63
71
  {
64
72
  key: "op",
65
73
  title: () => t("common.operation"),
66
74
  width: 140,
67
75
  fixed: "right",
68
76
  hideInSetting: !0,
69
- render: (e) => a(P, { size: 4, wrapItem: !1 }, () => [
70
- w.hasPerm("GET:/api/v1/sys/file/{id}/download") ? a(
77
+ render: (e) => l(O, { size: 4, wrapItem: !1 }, () => [
78
+ _.hasPerm("GET:/api/v1/sys/file/{id}/download") ? l(
71
79
  c,
72
- { size: "small", quaternary: !0, type: "primary", onClick: () => S(e) },
80
+ { size: "small", quaternary: !0, type: "primary", onClick: () => E(e) },
73
81
  {
74
82
  default: () => t("file.download"),
75
- icon: () => a(p, { icon: "ph:download-simple", size: 15 })
83
+ icon: () => l(p, { icon: "ph:download-simple", size: 15 })
76
84
  }
77
85
  ) : null,
78
- w.hasPerm("DELETE:/api/v1/sys/file/{id}") ? a(
79
- U,
86
+ _.hasPerm("DELETE:/api/v1/sys/file/{id}") ? l(
87
+ D,
80
88
  {
81
- onPositiveClick: () => x(() => u.remove(e.id), t("file.deleted")).then((i) => {
82
- var r;
83
- i && ((r = d.value) == null || r.refresh());
89
+ onPositiveClick: () => z(() => u.remove(e.id), t("file.deleted")).then((n) => {
90
+ var a;
91
+ n && ((a = m.value) == null || a.refresh());
84
92
  })
85
93
  },
86
94
  {
87
- trigger: () => a(
95
+ trigger: () => l(
88
96
  c,
89
97
  { size: "small", quaternary: !0, type: "error" },
90
98
  () => t("common.delete")
@@ -95,92 +103,99 @@ const ee = /* @__PURE__ */ R({
95
103
  ])
96
104
  }
97
105
  ];
98
- return (e, i) => {
99
- const r = D("auth");
100
- return f(), m(o(O), {
101
- "default-page-size": 100,
106
+ return M(g), (e, n) => {
107
+ const a = S("auth");
108
+ return d(), f(o(A), {
109
+ toolbar: o(q),
102
110
  ref_key: "tableRef",
103
- ref: d,
104
- columns: N,
111
+ ref: m,
112
+ columns: g,
105
113
  fetcher: o(u).page,
106
- "flex-height": "",
107
- "virtual-scroll": "",
114
+ search: { container: "table" },
115
+ "fill-height": "",
116
+ "min-row-height": o(j),
117
+ "card-on-narrow": "",
108
118
  "storage-key": "sys-file",
109
- "checked-row-keys": o(_),
110
- "onUpdate:checkedRowKeys": i[0] || (i[0] = (l) => _.value = l),
111
- onError: i[1] || (i[1] = (l) => o(h).error(o(T)(l)))
119
+ "checked-row-keys": o(T),
120
+ "onUpdate:checkedRowKeys": n[0] || (n[0] = (i) => T.value = i),
121
+ onError: n[1] || (n[1] = (i) => o(h).error(o(x)(i)))
112
122
  }, {
113
- toolbar: n(() => [
114
- y((f(), m(b, {
123
+ "pagination-prefix": r(({ itemCount: i }) => [
124
+ s(G, { count: i }, null, 8, ["count"])
125
+ ]),
126
+ "toolbar-right": r(() => [
127
+ y((d(), f(b, {
115
128
  "show-file-list": !1,
116
- onUploaded: g
129
+ onUploaded: v
117
130
  }, {
118
- default: n(() => [
131
+ default: r(() => [
119
132
  s(o(c), { type: "primary" }, {
120
- icon: n(() => [
133
+ icon: r(() => [
121
134
  s(p, {
122
135
  icon: "ph:upload-simple",
123
136
  size: 16
124
137
  })
125
138
  ]),
126
- default: n(() => [
127
- k(" " + v(o(t)("file.upload")), 1)
139
+ default: r(() => [
140
+ k(" " + w(o(t)("file.upload")), 1)
128
141
  ]),
129
142
  _: 1
130
143
  })
131
144
  ]),
132
145
  _: 1
133
146
  })), [
134
- [r, "POST:/api/v1/sys/file/upload"]
147
+ [a, "POST:/api/v1/sys/file/upload"]
135
148
  ]),
136
- y((f(), m(b, {
149
+ y((d(), f(b, {
137
150
  chunked: "",
138
151
  "show-file-list": !1,
139
- onUploaded: g
152
+ onUploaded: v
140
153
  }, {
141
- default: n(() => [
142
- s(o(c), null, {
143
- icon: n(() => [
154
+ default: r(() => [
155
+ s(o(c), { secondary: "" }, {
156
+ icon: r(() => [
144
157
  s(p, {
145
158
  icon: "ph:stack",
146
159
  size: 16
147
160
  })
148
161
  ]),
149
- default: n(() => [
150
- k(" " + v(o(t)("file.uploadChunked")), 1)
162
+ default: r(() => [
163
+ k(" " + w(o(t)("file.uploadChunked")), 1)
151
164
  ]),
152
165
  _: 1
153
166
  })
154
167
  ]),
155
168
  _: 1
156
169
  })), [
157
- [r, "POST:/api/v1/sys/file/chunk/init"]
158
- ]),
159
- y((f(), m(o(c), {
170
+ [a, "POST:/api/v1/sys/file/chunk/init"]
171
+ ])
172
+ ]),
173
+ batch: r(() => [
174
+ y((d(), f(o(c), {
175
+ secondary: "",
160
176
  type: "error",
161
- disabled: !o(z),
162
177
  onClick: o(C)
163
178
  }, {
164
- icon: n(() => [
179
+ icon: r(() => [
165
180
  s(p, {
166
181
  icon: "ph:trash",
167
182
  size: 16
168
183
  })
169
184
  ]),
170
- default: n(() => [
171
- k(" " + v(o(t)("common.batchDelete")), 1)
185
+ default: r(() => [
186
+ k(" " + w(o(t)("common.batchDelete")), 1)
172
187
  ]),
173
188
  _: 1
174
- }, 8, ["disabled", "onClick"])), [
175
- [r, "POST:/api/v1/sys/file/batch-delete"]
189
+ }, 8, ["onClick"])), [
190
+ [a, "POST:/api/v1/sys/file/batch-delete"]
176
191
  ])
177
192
  ]),
178
193
  _: 1
179
- }, 8, ["fetcher", "checked-row-keys"]);
194
+ }, 8, ["toolbar", "fetcher", "min-row-height", "checked-row-keys"]);
180
195
  };
181
196
  }
182
197
  });
183
198
  export {
184
- ee as default
199
+ se as default
185
200
  };
186
201
  //# sourceMappingURL=index2.vue.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index2.vue.js","sources":["../../../../src/views/system/file/index.vue"],"sourcesContent":["<script setup lang=\"ts\">\n// 文件管理 = 只读 SmartTable(搜索 originalName→FileName)+ 工具栏 FileUpload 触发器 + 行内下载/删除。\n// 下载走 blob(Bearer 自动带)→ createObjectURL + <a download> + revoke;删除走 useConfirm。\nimport { h, ref } from 'vue'\nimport { NButton, NSpace, NPopconfirm, useMessage } 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 FileUpload from '#/components/FileUpload/index.vue'\nimport { useConfirm } from '#/composables/useConfirm'\nimport { useBatchDelete } from '#/composables/useBatchDelete'\nimport { useAuthStore } from '#/stores/auth'\nimport { fileApi } from '#/api'\nimport { translateError } from '#/utils/error'\nimport { fmtBytes } from '#/utils/format'\nimport type { SysFile } from '#/types/api'\n\nconst { t } = useI18n()\nconst message = useMessage()\nconst { run } = useConfirm()\nconst authStore = useAuthStore()\nconst tableRef = ref<SmartTableInst<SysFile>>()\nconst {\n checkedKeys,\n hasSelection,\n run: batchDelete,\n} = useBatchDelete({\n remove: fileApi.batchRemove,\n refresh: () => tableRef.value?.refresh(),\n successMsg: t('file.deleted'),\n})\n\nfunction onUploaded() {\n message.success(t('file.uploaded'))\n tableRef.value?.refresh()\n}\n\nasync function download(r: SysFile) {\n try {\n const blob = await fileApi.download(r.id)\n const url = URL.createObjectURL(blob)\n const a = document.createElement('a')\n a.href = url\n a.download = r.originalName\n document.body.appendChild(a)\n a.click()\n a.remove()\n URL.revokeObjectURL(url)\n } catch (e) {\n message.error(translateError(e))\n }\n}\n\nconst columns: SmartTableColumn<SysFile>[] = [\n { type: 'selection' },\n\n { type: 'index', title: () => t('common.rowNo'), width: 64, align: 'center' },\n { key: 'originalName', title: () => t('file.name'), search: true, ellipsis: { tooltip: true } },\n {\n key: 'extension',\n title: () => t('file.extension'),\n width: 90,\n render: r => r.extension || '—',\n },\n {\n key: 'sizeBytes',\n title: () => t('file.size'),\n width: 110,\n render: r => fmtBytes(r.sizeBytes),\n },\n {\n key: 'contentType',\n title: () => t('file.contentType'),\n ellipsis: { tooltip: true },\n render: r => r.contentType || '—',\n },\n { key: 'createTime', title: () => t('file.uploadTime'), format: 'datetime' },\n {\n key: 'op',\n title: () => t('common.operation'),\n width: 140,\n fixed: 'right',\n hideInSetting: true,\n render: r =>\n h(NSpace, { size: 4, wrapItem: false }, () => [\n authStore.hasPerm('GET:/api/v1/sys/file/{id}/download')\n ? h(\n NButton,\n { size: 'small', quaternary: true, type: 'primary', onClick: () => download(r) },\n {\n default: () => t('file.download'),\n icon: () => h(AppIcon, { icon: 'ph:download-simple', size: 15 }),\n },\n )\n : null,\n authStore.hasPerm('DELETE:/api/v1/sys/file/{id}')\n ? h(\n NPopconfirm,\n {\n onPositiveClick: () =>\n run(() => fileApi.remove(r.id), t('file.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('file.deleteConfirm', { name: r.originalName }),\n },\n )\n : null,\n ]),\n },\n]\n</script>\n\n<template>\n <SmartTable\n :default-page-size=\"100\"\n ref=\"tableRef\"\n :columns=\"columns\"\n :fetcher=\"fileApi.page\"\n flex-height\n virtual-scroll\n storage-key=\"sys-file\"\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 <FileUpload\n v-auth=\"'POST:/api/v1/sys/file/upload'\"\n :show-file-list=\"false\"\n @uploaded=\"onUploaded\"\n >\n <n-button type=\"primary\">\n <template #icon><AppIcon icon=\"ph:upload-simple\" :size=\"16\" /></template>\n {{ t('file.upload') }}\n </n-button>\n </FileUpload>\n <FileUpload\n v-auth=\"'POST:/api/v1/sys/file/chunk/init'\"\n chunked\n :show-file-list=\"false\"\n @uploaded=\"onUploaded\"\n >\n <n-button>\n <template #icon><AppIcon icon=\"ph:stack\" :size=\"16\" /></template>\n {{ t('file.uploadChunked') }}\n </n-button>\n </FileUpload>\n <n-button\n v-auth=\"'POST:/api/v1/sys/file/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 </template>\n </SmartTable>\n</template>\n"],"names":["useI18n","message","useMessage","run","useConfirm","authStore","useAuthStore","tableRef","ref","checkedKeys","hasSelection","batchDelete","useBatchDelete","fileApi","_a","onUploaded","download","r","blob","url","a","e","translateError","columns","fmtBytes","h","NSpace","NButton","AppIcon","NPopconfirm","ok","_createBlock","_unref","SmartTable","_cache","keys","FileUpload","_createVNode","_createTextVNode"],"mappings":"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"}
1
+ {"version":3,"file":"index2.vue.js","sources":["../../../../src/views/system/file/index.vue"],"sourcesContent":["<script setup lang=\"ts\">\n// 文件管理 = 只读 SmartTable(搜索 originalName→FileName)+ 工具栏 FileUpload 触发器 + 行内下载/删除。\n// 下载走 blob(Bearer 自动带)→ createObjectURL + <a download> + revoke;删除走 useConfirm。\nimport { h, ref } from 'vue'\nimport { NButton, NSpace, NPopconfirm, useMessage } 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 FileUpload from '#/components/FileUpload/index.vue'\nimport { useConfirm } from '#/composables/useConfirm'\nimport { useBatchDelete } from '#/composables/useBatchDelete'\nimport { useAuthStore } from '#/stores/auth'\nimport { fileApi } from '#/api'\nimport { translateError } from '#/utils/error'\nimport { SEARCH_ACTIONS, deriveHeaderFilters } from '#/utils/tableFilter'\nimport { TABLE_MIN_ROW_HEIGHT, TABLE_TOOLBAR } from '#/utils/tableToolbar'\nimport TableTotal from '#/components/TableTotal/index.vue'\nimport { fmtBytes, fmtDateTime } from '#/utils/format'\nimport type { SysFile } from '#/types/api'\n\nconst { t } = useI18n()\nconst message = useMessage()\nconst { run } = useConfirm()\nconst authStore = useAuthStore()\nconst tableRef = ref<SmartTableInst<SysFile>>()\nconst { checkedKeys, run: batchDelete } = useBatchDelete({\n remove: fileApi.batchRemove,\n refresh: () => tableRef.value?.refresh(),\n successMsg: t('file.deleted'),\n})\n\nfunction onUploaded() {\n message.success(t('file.uploaded'))\n tableRef.value?.refresh()\n}\n\nasync function download(r: SysFile) {\n try {\n const blob = await fileApi.download(r.id)\n const url = URL.createObjectURL(blob)\n const a = document.createElement('a')\n a.href = url\n a.download = r.originalName\n document.body.appendChild(a)\n a.click()\n a.remove()\n URL.revokeObjectURL(url)\n } catch (e) {\n message.error(translateError(e))\n }\n}\n\nconst columns: SmartTableColumn<SysFile>[] = [\n { type: 'selection' },\n\n { type: 'index', title: () => t('common.rowNo'), width: 64, align: 'center' },\n {\n key: 'originalName',\n title: () => t('file.name'),\n search: { actions: SEARCH_ACTIONS.fuzzy },\n ellipsis: { tooltip: true },\n },\n {\n key: 'extension',\n title: () => t('file.extension'),\n width: 90,\n render: r => (r.extension ? h('span', { class: 'mono muted' }, r.extension) : '—'),\n },\n {\n key: 'sizeBytes',\n title: () => t('file.size'),\n width: 110,\n render: r => h('span', { class: 'num' }, fmtBytes(r.sizeBytes)),\n },\n {\n key: 'contentType',\n title: () => t('file.contentType'),\n ellipsis: { tooltip: true },\n render: r => h('span', { class: 'muted' }, r.contentType || '—'),\n },\n {\n key: 'createTime',\n title: () => t('file.uploadTime'),\n render: r =>\n h('span', { class: 'num muted', style: 'white-space: nowrap' }, fmtDateTime(r.createTime)),\n },\n {\n key: 'op',\n title: () => t('common.operation'),\n width: 140,\n fixed: 'right',\n hideInSetting: true,\n render: r =>\n h(NSpace, { size: 4, wrapItem: false }, () => [\n authStore.hasPerm('GET:/api/v1/sys/file/{id}/download')\n ? h(\n NButton,\n { size: 'small', quaternary: true, type: 'primary', onClick: () => download(r) },\n {\n default: () => t('file.download'),\n icon: () => h(AppIcon, { icon: 'ph:download-simple', size: 15 }),\n },\n )\n : null,\n authStore.hasPerm('DELETE:/api/v1/sys/file/{id}')\n ? h(\n NPopconfirm,\n {\n onPositiveClick: () =>\n run(() => fileApi.remove(r.id), t('file.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('file.deleteConfirm', { name: r.originalName }),\n },\n )\n : null,\n ]),\n },\n]\nderiveHeaderFilters(columns)\n</script>\n\n<template>\n <SmartTable\n :toolbar=\"TABLE_TOOLBAR\"\n ref=\"tableRef\"\n :columns=\"columns\"\n :fetcher=\"fileApi.page\"\n :search=\"{ container: 'table' }\"\n fill-height\n :min-row-height=\"TABLE_MIN_ROW_HEIGHT\"\n card-on-narrow\n storage-key=\"sys-file\"\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 #pagination-prefix=\"{ itemCount }\">\n <TableTotal :count=\"itemCount\" />\n </template>\n <template #toolbar-right>\n <FileUpload\n v-auth=\"'POST:/api/v1/sys/file/upload'\"\n :show-file-list=\"false\"\n @uploaded=\"onUploaded\"\n >\n <n-button type=\"primary\">\n <template #icon><AppIcon icon=\"ph:upload-simple\" :size=\"16\" /></template>\n {{ t('file.upload') }}\n </n-button>\n </FileUpload>\n <FileUpload\n v-auth=\"'POST:/api/v1/sys/file/chunk/init'\"\n chunked\n :show-file-list=\"false\"\n @uploaded=\"onUploaded\"\n >\n <n-button secondary>\n <template #icon><AppIcon icon=\"ph:stack\" :size=\"16\" /></template>\n {{ t('file.uploadChunked') }}\n </n-button>\n </FileUpload>\n </template>\n <!-- 勾选后工具栏换成批量栏(本页全选 + 已选 N 项 + 这里的按钮 + 取消选择),按钮出现即代表有勾选 -->\n <template #batch>\n <n-button\n v-auth=\"'POST:/api/v1/sys/file/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</template>\n"],"names":["useI18n","message","useMessage","run","useConfirm","authStore","useAuthStore","tableRef","ref","checkedKeys","batchDelete","useBatchDelete","fileApi","_a","onUploaded","download","r","blob","url","a","e","translateError","columns","SEARCH_ACTIONS","h","fmtBytes","fmtDateTime","NSpace","NButton","AppIcon","NPopconfirm","ok","deriveHeaderFilters","_createBlock","_unref","SmartTable","TABLE_TOOLBAR","TABLE_MIN_ROW_HEIGHT","_cache","keys","_withCtx","itemCount","_createVNode","TableTotal","FileUpload","_createTextVNode"],"mappings":"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"}
@@ -1,8 +1,8 @@
1
1
  import o from "./index2.vue.js";
2
2
  /* empty css */
3
- import a from "../../../_virtual/_plugin-vue_export-helper.js";
4
- const p = /* @__PURE__ */ a(o, [["__scopeId", "data-v-aabac178"]]);
3
+ import t from "../../../_virtual/_plugin-vue_export-helper.js";
4
+ const e = /* @__PURE__ */ t(o, [["__scopeId", "data-v-86d6feda"]]);
5
5
  export {
6
- p as default
6
+ e as default
7
7
  };
8
8
  //# sourceMappingURL=index.vue.js.map