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.
- package/README.md +6 -6
- package/dist/api/index.d.ts +41 -2
- package/dist/api/index.js +36 -15
- package/dist/api/index.js.map +1 -1
- package/dist/api/schema.d.ts +418 -6
- package/dist/assets/icons/ph-subset.json.js +7 -7
- package/dist/assets/smart-logo.svg.js +5 -0
- package/dist/assets/smart-logo.svg.js.map +1 -0
- package/dist/components/AppIcon.vue.js +9 -9
- package/dist/components/AppIcon.vue.js.map +1 -1
- package/dist/components/AppWatermark.vue.d.ts +14 -0
- package/dist/components/AppWatermark.vue.js +38 -0
- package/dist/components/AppWatermark.vue.js.map +1 -0
- package/dist/components/AppWatermark2.vue.js +5 -0
- package/dist/components/AppWatermark2.vue.js.map +1 -0
- package/dist/components/Chart/PieChart.vue.d.ts +1 -1
- package/dist/components/Chart/echarts.js +15 -20
- package/dist/components/Chart/echarts.js.map +1 -1
- package/dist/components/CronEditor/index.vue.js +1 -1
- package/dist/components/CronEditor/index2.vue.js +2 -1
- package/dist/components/CronEditor/index2.vue.js.map +1 -1
- package/dist/components/DetailPage/index.vue.js +2 -2
- package/dist/components/DetailPage/index2.vue.js.map +1 -1
- package/dist/components/DictTag/index.vue.js.map +1 -1
- package/dist/components/ErrorBoundary/index.vue.js +2 -2
- package/dist/components/ErrorBoundary/index2.vue.js +1 -1
- package/dist/components/ErrorBoundary/index2.vue.js.map +1 -1
- package/dist/components/FormContainer/index.vue.js +91 -56
- package/dist/components/FormContainer/index.vue.js.map +1 -1
- package/dist/components/ImportWizard/index.vue.js +1 -1
- package/dist/components/ImportWizard/index2.vue.js +44 -41
- package/dist/components/ImportWizard/index2.vue.js.map +1 -1
- package/dist/components/MenuSearch.vue.js +2 -2
- package/dist/components/MenuSearch2.vue.js +19 -18
- package/dist/components/MenuSearch2.vue.js.map +1 -1
- package/dist/components/PasswordStrength/index.vue.js +2 -2
- package/dist/components/PasswordStrength/index2.vue.js +20 -18
- package/dist/components/PasswordStrength/index2.vue.js.map +1 -1
- package/dist/components/SmartLogo.vue.d.ts +3 -0
- package/dist/components/SmartLogo.vue.js +1 -1
- package/dist/components/SmartLogo2.vue.js +22 -64
- package/dist/components/SmartLogo2.vue.js.map +1 -1
- package/dist/{views/system/config/components/GroupExtraConfig.vue.d.ts → components/TableTotal/index.vue.d.ts} +1 -4
- package/dist/components/{SelectTable → TableTotal}/index.vue.js +1 -1
- package/dist/components/TableTotal/index2.vue.js +16 -0
- package/dist/components/TableTotal/index2.vue.js.map +1 -0
- package/dist/components/TableZoomButton/index.vue.js.map +1 -1
- package/dist/components/UserPicker/index.vue.js +2 -2
- package/dist/components/UserPicker/index2.vue.js +176 -117
- package/dist/components/UserPicker/index2.vue.js.map +1 -1
- package/dist/composables/useBatchDelete.js.map +1 -1
- package/dist/composables/useLayoutMenu.js +17 -16
- package/dist/composables/useLayoutMenu.js.map +1 -1
- package/dist/composables/useLoginHero.d.ts +2 -0
- package/dist/composables/useLoginHero.js +22 -0
- package/dist/composables/useLoginHero.js.map +1 -0
- package/dist/composables/useModule.js +39 -29
- package/dist/composables/useModule.js.map +1 -1
- package/dist/composables/usePageTitle.js +16 -14
- package/dist/composables/usePageTitle.js.map +1 -1
- package/dist/composables/useShellBreakpoint.d.ts +19 -0
- package/dist/composables/useShellBreakpoint.js +37 -0
- package/dist/composables/useShellBreakpoint.js.map +1 -0
- package/dist/composables/useSite.d.ts +20 -0
- package/dist/composables/useSite.js +18 -13
- package/dist/composables/useSite.js.map +1 -1
- package/dist/composables/useTabTitle.js.map +1 -1
- package/dist/composables/useTableTitle.d.ts +6 -0
- package/dist/composables/useTableTitle.js +11 -0
- package/dist/composables/useTableTitle.js.map +1 -0
- package/dist/composables/useTableZoom.d.ts +5 -0
- package/dist/composables/useTableZoom.js.map +1 -1
- package/dist/composables/useTheme.d.ts +2 -2
- package/dist/composables/useTheme.js +23 -20
- package/dist/composables/useTheme.js.map +1 -1
- package/dist/createSmartAdmin.d.ts +12 -2
- package/dist/createSmartAdmin.js +72 -60
- package/dist/createSmartAdmin.js.map +1 -1
- package/dist/index.d.ts +5 -2
- package/dist/index.js +223 -208
- package/dist/index.js.map +1 -1
- package/dist/layouts/AccentPicker.vue.js +8 -0
- package/dist/layouts/AccentPicker.vue.js.map +1 -0
- package/dist/layouts/AccentPicker2.vue.js +131 -0
- package/dist/layouts/AccentPicker2.vue.js.map +1 -0
- package/dist/layouts/AppHeader.vue.d.ts +8 -1
- package/dist/layouts/AppHeader.vue.js +2 -2
- package/dist/layouts/AppHeader2.vue.js +317 -235
- package/dist/layouts/AppHeader2.vue.js.map +1 -1
- package/dist/layouts/NoticeBell.vue.js +2 -2
- package/dist/layouts/NoticeBell2.vue.js +1 -1
- package/dist/layouts/NoticeBell2.vue.js.map +1 -1
- package/dist/layouts/PersonalLayout.vue.js +2 -2
- package/dist/layouts/PersonalLayout2.vue.js +69 -47
- package/dist/layouts/PersonalLayout2.vue.js.map +1 -1
- package/dist/layouts/SettingsDrawer.vue.js +3 -3
- package/dist/layouts/SettingsDrawer2.vue.js +261 -325
- package/dist/layouts/SettingsDrawer2.vue.js.map +1 -1
- package/dist/layouts/TabsBar.vue.js +2 -2
- package/dist/layouts/TabsBar2.vue.js +97 -69
- package/dist/layouts/TabsBar2.vue.js.map +1 -1
- package/dist/layouts/components/SideNav.vue.d.ts +3 -0
- package/dist/layouts/components/SideNav.vue.js +1 -1
- package/dist/layouts/components/SideNav2.vue.js +54 -26
- package/dist/layouts/components/SideNav2.vue.js.map +1 -1
- package/dist/layouts/default.vue.js +1 -1
- package/dist/layouts/default2.vue.js +170 -140
- package/dist/layouts/default2.vue.js.map +1 -1
- package/dist/lib/favicon.d.ts +1 -0
- package/dist/lib/favicon.js +12 -0
- package/dist/lib/favicon.js.map +1 -0
- package/dist/lib/loginHero.d.ts +16 -0
- package/dist/lib/loginHero.js +33 -0
- package/dist/lib/loginHero.js.map +1 -0
- package/dist/lib/logoCrop.d.ts +25 -0
- package/dist/lib/logoCrop.js +22 -0
- package/dist/lib/logoCrop.js.map +1 -0
- package/dist/lib/runtime.d.ts +2 -0
- package/dist/lib/runtime.js +1 -1
- package/dist/lib/runtime.js.map +1 -1
- package/dist/lib/securityRules.d.ts +26 -0
- package/dist/lib/securityRules.js +86 -0
- package/dist/lib/securityRules.js.map +1 -0
- package/dist/lib/watermark.d.ts +110 -0
- package/dist/lib/watermark.js +151 -0
- package/dist/lib/watermark.js.map +1 -0
- package/dist/locales/en-US.d.ts +462 -42
- package/dist/locales/en-US.js +491 -78
- package/dist/locales/en-US.js.map +1 -1
- package/dist/locales/kernelMenuTitles.d.ts +1 -0
- package/dist/locales/kernelMenuTitles.js +128 -0
- package/dist/locales/kernelMenuTitles.js.map +1 -0
- package/dist/locales/menuTitle.d.ts +3 -0
- package/dist/locales/menuTitle.js +14 -12
- package/dist/locales/menuTitle.js.map +1 -1
- package/dist/locales/zh-CN.d.ts +462 -42
- package/dist/locales/zh-CN.js +490 -81
- package/dist/locales/zh-CN.js.map +1 -1
- package/dist/router/index.js +41 -32
- package/dist/router/index.js.map +1 -1
- package/dist/router/namedPage.d.ts +4 -0
- package/dist/router/namedPage.js +7 -7
- package/dist/router/namedPage.js.map +1 -1
- package/dist/router/viewRegistry.js +12 -12
- package/dist/router/viewRegistry.js.map +1 -1
- package/dist/stores/app.d.ts +0 -12
- package/dist/stores/app.js +11 -12
- package/dist/stores/app.js.map +1 -1
- package/dist/stores/tabs.js.map +1 -1
- package/dist/stores/user.d.ts +10 -0
- package/dist/stores/user.js.map +1 -1
- package/dist/style.css +1 -1
- package/dist/theme/accentTokens.d.ts +27 -0
- package/dist/theme/accentTokens.js +54 -0
- package/dist/theme/accentTokens.js.map +1 -0
- package/dist/theme/accents.d.ts +21 -1
- package/dist/theme/accents.js +11 -2
- package/dist/theme/accents.js.map +1 -1
- package/dist/theme/mix.d.ts +58 -7
- package/dist/theme/mix.js +115 -30
- package/dist/theme/mix.js.map +1 -1
- package/dist/theme/naive-theme.d.ts +5 -2
- package/dist/theme/naive-theme.js +405 -75
- package/dist/theme/naive-theme.js.map +1 -1
- package/dist/utils/jwt.d.ts +8 -0
- package/dist/utils/jwt.js +14 -0
- package/dist/utils/jwt.js.map +1 -0
- package/dist/utils/menuIcon.d.ts +2 -0
- package/dist/utils/menuIcon.js +8 -0
- package/dist/utils/menuIcon.js.map +1 -0
- package/dist/utils/oauthBrand.d.ts +34 -9
- package/dist/utils/oauthBrand.js +70 -74
- package/dist/utils/oauthBrand.js.map +1 -1
- package/dist/utils/tableFilter.d.ts +88 -0
- package/dist/utils/tableFilter.js +116 -0
- package/dist/utils/tableFilter.js.map +1 -0
- package/dist/utils/tableToolbar.d.ts +18 -0
- package/dist/utils/tableToolbar.js +11 -0
- package/dist/utils/tableToolbar.js.map +1 -0
- package/dist/utils/treeFilter.d.ts +20 -0
- package/dist/utils/treeFilter.js +24 -0
- package/dist/utils/treeFilter.js.map +1 -0
- package/dist/views/dashboard/ShortcutPicker.vue.js +1 -1
- package/dist/views/dashboard/ShortcutPicker2.vue.js +73 -48
- package/dist/views/dashboard/ShortcutPicker2.vue.js.map +1 -1
- package/dist/views/dashboard/biz.vue.js +1 -1
- package/dist/views/dashboard/biz2.vue.js +310 -257
- package/dist/views/dashboard/biz2.vue.js.map +1 -1
- package/dist/views/dashboard/workbench.vue.js +2 -2
- package/dist/views/dashboard/workbench2.vue.js +141 -155
- package/dist/views/dashboard/workbench2.vue.js.map +1 -1
- package/dist/views/embed/iframe.vue.js +2 -2
- package/dist/views/embed/iframe2.vue.js +22 -15
- package/dist/views/embed/iframe2.vue.js.map +1 -1
- package/dist/views/error/404.vue.js +2 -2
- package/dist/views/error/4042.vue.js +33 -24
- package/dist/views/error/4042.vue.js.map +1 -1
- package/dist/views/error/BootError.vue.js +1 -1
- package/dist/views/error/BootError2.vue.js +59 -48
- package/dist/views/error/BootError2.vue.js.map +1 -1
- package/dist/views/error/MissingRoute.vue.js +2 -2
- package/dist/views/error/MissingRoute2.vue.js +34 -15
- package/dist/views/error/MissingRoute2.vue.js.map +1 -1
- package/dist/views/login/LoginForm.vue.d.ts +7 -1
- package/dist/views/login/LoginForm.vue.js +2 -2
- package/dist/views/login/LoginForm2.vue.js +580 -488
- package/dist/views/login/LoginForm2.vue.js.map +1 -1
- package/dist/views/login/components/LoginDesk.vue.d.ts +36 -0
- package/dist/views/login/components/LoginDesk.vue.js +9 -0
- package/dist/views/login/components/LoginDesk.vue.js.map +1 -0
- package/dist/views/login/components/LoginDesk2.vue.js +100 -0
- package/dist/views/login/components/LoginDesk2.vue.js.map +1 -0
- package/dist/views/login/components/LoginHeroPanel.vue.d.ts +18 -0
- package/dist/views/login/components/LoginHeroPanel.vue.js +8 -0
- package/dist/views/login/components/LoginHeroPanel.vue.js.map +1 -0
- package/dist/views/login/components/LoginHeroPanel2.vue.js +61 -0
- package/dist/views/login/components/LoginHeroPanel2.vue.js.map +1 -0
- package/dist/views/login/index.vue.js +1 -1
- package/dist/views/login/index2.vue.js +141 -71
- package/dist/views/login/index2.vue.js.map +1 -1
- package/dist/views/login/layout.d.ts +11 -0
- package/dist/views/login/layout.js +27 -0
- package/dist/views/login/layout.js.map +1 -0
- package/dist/views/mfa/index.vue.js +2 -2
- package/dist/views/mfa/index2.vue.js +367 -321
- package/dist/views/mfa/index2.vue.js.map +1 -1
- package/dist/views/module/index.vue.js +2 -2
- package/dist/views/module/index2.vue.js +132 -99
- package/dist/views/module/index2.vue.js.map +1 -1
- package/dist/views/oauth/callback.vue.js +2 -2
- package/dist/views/oauth/callback2.vue.js +65 -51
- package/dist/views/oauth/callback2.vue.js.map +1 -1
- package/dist/views/personal/bindings.vue.js +2 -2
- package/dist/views/personal/bindings2.vue.js +98 -94
- package/dist/views/personal/bindings2.vue.js.map +1 -1
- package/dist/views/personal/notice2.vue.js +103 -76
- package/dist/views/personal/notice2.vue.js.map +1 -1
- package/dist/views/personal/password2.vue.js +47 -40
- package/dist/views/personal/password2.vue.js.map +1 -1
- package/dist/views/personal/profile.vue.js +3 -3
- package/dist/views/personal/profile2.vue.js +24 -18
- package/dist/views/personal/profile2.vue.js.map +1 -1
- package/dist/views/personal/security.vue.js +2 -2
- package/dist/views/personal/security2.vue.js +65 -53
- package/dist/views/personal/security2.vue.js.map +1 -1
- package/dist/views/personal/sessions.vue.js +2 -2
- package/dist/views/personal/sessions2.vue.js +67 -62
- package/dist/views/personal/sessions2.vue.js.map +1 -1
- package/dist/views/system/ai-model/components/ProviderCard.vue.js +2 -2
- package/dist/views/system/ai-model/components/ProviderCard2.vue.js +142 -130
- package/dist/views/system/ai-model/components/ProviderCard2.vue.js.map +1 -1
- package/dist/views/system/ai-model/components/ProviderForm.vue.js +2 -2
- package/dist/views/system/ai-model/components/ProviderForm2.vue.js +71 -70
- package/dist/views/system/ai-model/components/ProviderForm2.vue.js.map +1 -1
- package/dist/views/system/ai-model/index.vue.js +2 -2
- package/dist/views/system/ai-model/index2.vue.js +99 -99
- package/dist/views/system/ai-model/index2.vue.js.map +1 -1
- package/dist/views/system/ai-model/presets.d.ts +1 -1
- package/dist/views/system/ai-model/presets.js +18 -18
- package/dist/views/system/ai-model/presets.js.map +1 -1
- package/dist/views/system/ai-usage/index.vue.js +2 -2
- package/dist/views/system/ai-usage/index2.vue.js +356 -258
- package/dist/views/system/ai-usage/index2.vue.js.map +1 -1
- package/dist/views/system/api-docs/index.vue.js +5 -2
- package/dist/views/system/api-docs/index.vue.js.map +1 -1
- package/dist/views/system/api-docs/index2.vue.js +92 -42
- package/dist/views/system/api-docs/index2.vue.js.map +1 -1
- package/dist/views/system/cache/index.vue.js +2 -2
- package/dist/views/system/cache/index2.vue.js +74 -80
- package/dist/views/system/cache/index2.vue.js.map +1 -1
- package/dist/views/system/config/components/AdminMock.vue.js +8 -0
- package/dist/views/system/config/components/AdminMock.vue.js.map +1 -0
- package/dist/views/system/config/components/AdminMock2.vue.js +93 -0
- package/dist/views/system/config/components/AdminMock2.vue.js.map +1 -0
- package/dist/views/system/config/components/AdvancedSection.vue.js +8 -0
- package/dist/views/system/config/components/AdvancedSection.vue.js.map +1 -0
- package/dist/views/system/config/components/AdvancedSection2.vue.js +163 -0
- package/dist/views/system/config/components/AdvancedSection2.vue.js.map +1 -0
- package/dist/views/system/config/components/BrandSection.vue.d.ts +7 -0
- package/dist/views/system/config/components/BrandSection.vue.js +8 -0
- package/dist/views/system/config/components/BrandSection.vue.js.map +1 -0
- package/dist/views/system/config/components/BrandSection2.vue.js +266 -0
- package/dist/views/system/config/components/BrandSection2.vue.js.map +1 -0
- package/dist/views/system/config/components/CfgGroup.vue.d.ts +18 -0
- package/dist/views/system/config/components/CfgGroup.vue.js +8 -0
- package/dist/views/system/config/components/CfgGroup.vue.js.map +1 -0
- package/dist/views/system/config/components/CfgGroup2.vue.js +22 -0
- package/dist/views/system/config/components/CfgGroup2.vue.js.map +1 -0
- package/dist/views/system/config/components/CfgRow.vue.d.ts +26 -0
- package/dist/views/system/config/components/CfgRow.vue.js +9 -0
- package/dist/views/system/config/components/CfgRow.vue.js.map +1 -0
- package/dist/views/system/config/components/CfgRow2.vue.js +54 -0
- package/dist/views/system/config/components/CfgRow2.vue.js.map +1 -0
- package/dist/views/system/config/components/CfgSegment.vue.d.ts +28 -0
- package/dist/views/system/config/components/CfgSegment.vue.js +8 -0
- package/dist/views/system/config/components/CfgSegment.vue.js.map +1 -0
- package/dist/views/system/config/components/CfgSegment2.vue.js +45 -0
- package/dist/views/system/config/components/CfgSegment2.vue.js.map +1 -0
- package/dist/views/system/config/components/ConfigFormModal.vue.js +4 -1
- package/dist/views/system/config/components/ConfigFormModal.vue.js.map +1 -1
- package/dist/views/system/config/components/ConfigFormModal2.vue.js +72 -60
- package/dist/views/system/config/components/ConfigFormModal2.vue.js.map +1 -1
- package/dist/views/system/config/components/JobSection.vue.js +8 -0
- package/dist/views/system/config/components/JobSection.vue.js.map +1 -0
- package/dist/views/system/config/components/JobSection2.vue.js +140 -0
- package/dist/views/system/config/components/JobSection2.vue.js.map +1 -0
- package/dist/views/system/config/components/LoginMock.vue.d.ts +8 -0
- package/dist/views/system/config/components/LoginMock.vue.js +8 -0
- package/dist/views/system/config/components/LoginMock.vue.js.map +1 -0
- package/dist/views/system/config/components/LoginMock2.vue.js +132 -0
- package/dist/views/system/config/components/LoginMock2.vue.js.map +1 -0
- package/dist/views/system/config/components/LogoCropper.vue.d.ts +10 -0
- package/dist/views/system/config/components/LogoCropper.vue.js +8 -0
- package/dist/views/system/config/components/LogoCropper.vue.js.map +1 -0
- package/dist/views/system/config/components/LogoCropper2.vue.js +122 -0
- package/dist/views/system/config/components/LogoCropper2.vue.js.map +1 -0
- package/dist/views/system/config/components/LogoEditor.vue.js +8 -0
- package/dist/views/system/config/components/LogoEditor.vue.js.map +1 -0
- package/dist/views/system/config/components/LogoEditor2.vue.js +161 -0
- package/dist/views/system/config/components/LogoEditor2.vue.js.map +1 -0
- package/dist/views/system/config/components/ProviderSheet.vue.d.ts +17 -0
- package/dist/views/system/config/components/ProviderSheet.vue.js +8 -0
- package/dist/views/system/config/components/ProviderSheet.vue.js.map +1 -0
- package/dist/views/system/config/components/ProviderSheet2.vue.js +343 -0
- package/dist/views/system/config/components/ProviderSheet2.vue.js.map +1 -0
- package/dist/{layouts/SettingRow.vue.d.ts → views/system/config/components/ScaleToFit.vue.d.ts} +2 -1
- package/dist/views/system/config/components/ScaleToFit.vue.js +8 -0
- package/dist/views/system/config/components/ScaleToFit.vue.js.map +1 -0
- package/dist/views/system/config/components/ScaleToFit2.vue.js +41 -0
- package/dist/views/system/config/components/ScaleToFit2.vue.js.map +1 -0
- package/dist/views/system/config/components/SectionLayout.vue.d.ts +30 -0
- package/dist/views/system/config/components/SectionLayout.vue.js +8 -0
- package/dist/views/system/config/components/SectionLayout.vue.js.map +1 -0
- package/dist/views/system/config/components/SectionLayout2.vue.js +69 -0
- package/dist/views/system/config/components/SectionLayout2.vue.js.map +1 -0
- package/dist/views/system/config/components/SecuritySection.vue.js +8 -0
- package/dist/views/system/config/components/SecuritySection.vue.js.map +1 -0
- package/dist/views/system/config/components/SecuritySection2.vue.js +417 -0
- package/dist/views/system/config/components/SecuritySection2.vue.js.map +1 -0
- package/dist/views/system/config/components/SensitiveSection.vue.js +8 -0
- package/dist/views/system/config/components/SensitiveSection.vue.js.map +1 -0
- package/dist/views/system/config/components/SensitiveSection2.vue.js +214 -0
- package/dist/views/system/config/components/SensitiveSection2.vue.js.map +1 -0
- package/dist/views/system/config/components/SigninSection.vue.js +8 -0
- package/dist/views/system/config/components/SigninSection.vue.js.map +1 -0
- package/dist/views/system/config/components/SigninSection2.vue.js +201 -0
- package/dist/views/system/config/components/SigninSection2.vue.js.map +1 -0
- package/dist/views/system/config/components/UploadSection.vue.js +8 -0
- package/dist/views/system/config/components/UploadSection.vue.js.map +1 -0
- package/dist/views/system/config/components/UploadSection2.vue.js +176 -0
- package/dist/views/system/config/components/UploadSection2.vue.js.map +1 -0
- package/dist/views/system/config/components/WatermarkSection.vue.js +8 -0
- package/dist/views/system/config/components/WatermarkSection.vue.js.map +1 -0
- package/dist/views/system/config/components/WatermarkSection2.vue.js +284 -0
- package/dist/views/system/config/components/WatermarkSection2.vue.js.map +1 -0
- package/dist/views/system/config/draft.d.ts +148 -0
- package/dist/views/system/config/draft.js +170 -0
- package/dist/views/system/config/draft.js.map +1 -0
- package/dist/views/system/config/flash.d.ts +2 -0
- package/dist/views/system/config/flash.js +9 -0
- package/dist/views/system/config/flash.js.map +1 -0
- package/dist/views/system/config/groups.d.ts +38 -7
- package/dist/views/system/config/groups.js +104 -14
- package/dist/views/system/config/groups.js.map +1 -1
- package/dist/views/system/config/index.vue.js +6 -2
- package/dist/views/system/config/index.vue.js.map +1 -1
- package/dist/views/system/config/index2.vue.js +201 -111
- package/dist/views/system/config/index2.vue.js.map +1 -1
- package/dist/views/system/config/layoutMode.d.ts +23 -0
- package/dist/views/system/config/layoutMode.js +28 -0
- package/dist/views/system/config/layoutMode.js.map +1 -0
- package/dist/views/system/config/providerForm.d.ts +33 -0
- package/dist/views/system/config/providerForm.js +63 -0
- package/dist/views/system/config/providerForm.js.map +1 -0
- package/dist/views/system/dict/index.vue.js +2 -2
- package/dist/views/system/dict/index2.vue.js +471 -366
- package/dist/views/system/dict/index2.vue.js.map +1 -1
- package/dist/views/system/file/index2.vue.js +91 -76
- package/dist/views/system/file/index2.vue.js.map +1 -1
- package/dist/views/system/job/index.vue.js +3 -3
- package/dist/views/system/job/index2.vue.js +897 -828
- package/dist/views/system/job/index2.vue.js.map +1 -1
- package/dist/views/system/job-log/components/AttemptTable.vue.d.ts +8 -0
- package/dist/views/system/job-log/components/AttemptTable.vue.js +5 -0
- package/dist/views/system/job-log/components/AttemptTable.vue.js.map +1 -0
- package/dist/views/system/job-log/components/AttemptTable2.vue.js +54 -0
- package/dist/views/system/job-log/components/AttemptTable2.vue.js.map +1 -0
- package/dist/views/system/job-log/index.vue.js +2 -2
- package/dist/views/system/job-log/index2.vue.js +193 -207
- package/dist/views/system/job-log/index2.vue.js.map +1 -1
- package/dist/views/system/job-log/runStatus.d.ts +13 -0
- package/dist/views/system/job-log/runStatus.js +26 -0
- package/dist/views/system/job-log/runStatus.js.map +1 -0
- package/dist/views/system/job-monitor/index.vue.js +2 -2
- package/dist/views/system/job-monitor/index2.vue.js +172 -180
- package/dist/views/system/job-monitor/index2.vue.js.map +1 -1
- package/dist/views/system/log/exception/index.vue.js +2 -2
- package/dist/views/system/log/exception/index2.vue.js +135 -96
- package/dist/views/system/log/exception/index2.vue.js.map +1 -1
- package/dist/views/system/log/login/index2.vue.js +62 -41
- package/dist/views/system/log/login/index2.vue.js.map +1 -1
- package/dist/views/system/log/op/index.vue.js +2 -2
- package/dist/views/system/log/op/index2.vue.js +200 -162
- package/dist/views/system/log/op/index2.vue.js.map +1 -1
- package/dist/views/system/menu/components/ButtonManager.vue.js +2 -2
- package/dist/views/system/menu/components/ButtonManager2.vue.js +206 -190
- package/dist/views/system/menu/components/ButtonManager2.vue.js.map +1 -1
- package/dist/views/system/menu/components/MenuFormModal.vue.js +2 -2
- package/dist/views/system/menu/components/MenuFormModal2.vue.js +127 -118
- package/dist/views/system/menu/components/MenuFormModal2.vue.js.map +1 -1
- package/dist/views/system/menu/index.vue.js +1 -1
- package/dist/views/system/menu/index2.vue.js +216 -183
- package/dist/views/system/menu/index2.vue.js.map +1 -1
- package/dist/views/system/module/index.vue.js +1 -1
- package/dist/views/system/module/index2.vue.js +177 -144
- package/dist/views/system/module/index2.vue.js.map +1 -1
- package/dist/views/system/monitor/index.vue.js +2 -2
- package/dist/views/system/monitor/index2.vue.js +134 -149
- package/dist/views/system/monitor/index2.vue.js.map +1 -1
- package/dist/views/system/notice/index.vue.js +1 -1
- package/dist/views/system/notice/index2.vue.js +209 -181
- package/dist/views/system/notice/index2.vue.js.map +1 -1
- package/dist/views/system/org/index.vue.js +1 -1
- package/dist/views/system/org/index2.vue.js +278 -248
- package/dist/views/system/org/index2.vue.js.map +1 -1
- package/dist/views/system/position/index.vue.js +5 -2
- package/dist/views/system/position/index.vue.js.map +1 -1
- package/dist/views/system/position/index2.vue.js +128 -92
- package/dist/views/system/position/index2.vue.js.map +1 -1
- package/dist/views/system/recycle/index.vue.js +2 -2
- package/dist/views/system/recycle/index2.vue.js +90 -67
- package/dist/views/system/recycle/index2.vue.js.map +1 -1
- package/dist/views/system/role/components/GrantMenuSheet.vue.d.ts +20 -0
- package/dist/views/system/role/components/GrantMenuSheet.vue.js +8 -0
- package/dist/views/system/role/components/GrantMenuSheet.vue.js.map +1 -0
- package/dist/views/system/role/components/GrantMenuSheet2.vue.js +117 -0
- package/dist/views/system/role/components/GrantMenuSheet2.vue.js.map +1 -0
- package/dist/views/system/role/components/GrantMenuTable.vue.d.ts +6 -4
- package/dist/views/system/role/components/GrantMenuTable.vue.js +2 -2
- package/dist/views/system/role/components/GrantMenuTable2.vue.js +279 -177
- package/dist/views/system/role/components/GrantMenuTable2.vue.js.map +1 -1
- package/dist/views/system/role/components/MatchText.vue.d.ts +7 -0
- package/dist/views/system/role/components/MatchText.vue.js +8 -0
- package/dist/views/system/role/components/MatchText.vue.js.map +1 -0
- package/dist/views/system/role/components/MatchText2.vue.js +29 -0
- package/dist/views/system/role/components/MatchText2.vue.js.map +1 -0
- package/dist/views/system/role/components/grantMenuGroups.d.ts +36 -0
- package/dist/views/system/role/components/grantMenuGroups.js +110 -48
- package/dist/views/system/role/components/grantMenuGroups.js.map +1 -1
- package/dist/views/system/role/index.vue.js +5 -2
- package/dist/views/system/role/index.vue.js.map +1 -1
- package/dist/views/system/role/index2.vue.js +181 -165
- package/dist/views/system/role/index2.vue.js.map +1 -1
- package/dist/views/system/session/index2.vue.js +75 -49
- package/dist/views/system/session/index2.vue.js.map +1 -1
- package/dist/views/system/user/components/ResetPasswordModal.vue.js +2 -2
- package/dist/views/system/user/components/ResetPasswordModal2.vue.js +2 -0
- package/dist/views/system/user/components/ResetPasswordModal2.vue.js.map +1 -1
- package/dist/views/system/user/components/UserFormModal.vue.js +2 -2
- package/dist/views/system/user/components/UserFormModal2.vue.js +77 -76
- package/dist/views/system/user/components/UserFormModal2.vue.js.map +1 -1
- package/dist/views/system/user/index.vue.js +2 -2
- package/dist/views/system/user/index2.vue.js +362 -275
- package/dist/views/system/user/index2.vue.js.map +1 -1
- package/package.json +6 -8
- package/dist/components/SelectTable/index.vue.d.ts +0 -76
- package/dist/components/SelectTable/index2.vue.js +0 -256
- package/dist/components/SelectTable/index2.vue.js.map +0 -1
- package/dist/composables/useTableRowSort.d.ts +0 -20
- package/dist/composables/useTableRowSort.js +0 -59
- package/dist/composables/useTableRowSort.js.map +0 -1
- package/dist/layouts/LayoutModeCards.vue.js +0 -8
- package/dist/layouts/LayoutModeCards.vue.js.map +0 -1
- package/dist/layouts/LayoutModeCards2.vue.js +0 -67
- package/dist/layouts/LayoutModeCards2.vue.js.map +0 -1
- package/dist/layouts/SettingRow.vue.js +0 -8
- package/dist/layouts/SettingRow.vue.js.map +0 -1
- package/dist/layouts/SettingRow2.vue.js +0 -23
- package/dist/layouts/SettingRow2.vue.js.map +0 -1
- package/dist/views/login/skins/AuroraGlass.vue.js +0 -8
- package/dist/views/login/skins/AuroraGlass.vue.js.map +0 -1
- package/dist/views/login/skins/AuroraGlass2.vue.js +0 -80
- package/dist/views/login/skins/AuroraGlass2.vue.js.map +0 -1
- package/dist/views/login/skins/SplitPanel.vue.js +0 -8
- package/dist/views/login/skins/SplitPanel.vue.js.map +0 -1
- package/dist/views/login/skins/SplitPanel2.vue.js +0 -85
- package/dist/views/login/skins/SplitPanel2.vue.js.map +0 -1
- package/dist/views/login/skins/Spotlight.vue.js +0 -8
- package/dist/views/login/skins/Spotlight.vue.js.map +0 -1
- package/dist/views/login/skins/Spotlight2.vue.js +0 -36
- package/dist/views/login/skins/Spotlight2.vue.js.map +0 -1
- package/dist/views/login/skins.d.ts +0 -8
- package/dist/views/login/skins.js +0 -13
- package/dist/views/login/skins.js.map +0 -1
- package/dist/views/system/config/components/ExternalAuthConfig.vue.js +0 -8
- package/dist/views/system/config/components/ExternalAuthConfig.vue.js.map +0 -1
- package/dist/views/system/config/components/ExternalAuthConfig2.vue.js +0 -218
- package/dist/views/system/config/components/ExternalAuthConfig2.vue.js.map +0 -1
- package/dist/views/system/config/components/GroupExtraConfig.vue.js +0 -8
- package/dist/views/system/config/components/GroupExtraConfig.vue.js.map +0 -1
- package/dist/views/system/config/components/GroupExtraConfig2.vue.js +0 -108
- package/dist/views/system/config/components/GroupExtraConfig2.vue.js.map +0 -1
- package/dist/views/system/config/components/HighSensConfig.vue.js +0 -5
- package/dist/views/system/config/components/HighSensConfig.vue.js.map +0 -1
- package/dist/views/system/config/components/HighSensConfig2.vue.js +0 -134
- package/dist/views/system/config/components/HighSensConfig2.vue.js.map +0 -1
- package/dist/views/system/config/components/JobConfig.vue.js +0 -5
- package/dist/views/system/config/components/JobConfig.vue.js.map +0 -1
- package/dist/views/system/config/components/JobConfig2.vue.js +0 -116
- package/dist/views/system/config/components/JobConfig2.vue.js.map +0 -1
- package/dist/views/system/config/components/OtherConfig.vue.js +0 -5
- package/dist/views/system/config/components/OtherConfig.vue.js.map +0 -1
- package/dist/views/system/config/components/OtherConfig2.vue.js +0 -121
- package/dist/views/system/config/components/OtherConfig2.vue.js.map +0 -1
- package/dist/views/system/config/components/SecurityConfig.vue.js +0 -8
- package/dist/views/system/config/components/SecurityConfig.vue.js.map +0 -1
- package/dist/views/system/config/components/SecurityConfig2.vue.js +0 -456
- package/dist/views/system/config/components/SecurityConfig2.vue.js.map +0 -1
- package/dist/views/system/config/components/SysBaseConfig.vue.js +0 -5
- package/dist/views/system/config/components/SysBaseConfig.vue.js.map +0 -1
- package/dist/views/system/config/components/SysBaseConfig2.vue.js +0 -107
- package/dist/views/system/config/components/SysBaseConfig2.vue.js.map +0 -1
- package/dist/views/system/config/components/UploadConfig.vue.d.ts +0 -3
- package/dist/views/system/config/components/UploadConfig.vue.js +0 -5
- package/dist/views/system/config/components/UploadConfig.vue.js.map +0 -1
- package/dist/views/system/config/components/UploadConfig2.vue.js +0 -135
- package/dist/views/system/config/components/UploadConfig2.vue.js.map +0 -1
- /package/dist/components/{SelectTable → TableTotal}/index.vue.js.map +0 -0
- /package/dist/layouts/{LayoutModeCards.vue.d.ts → AccentPicker.vue.d.ts} +0 -0
- /package/dist/views/{login/skins/AuroraGlass.vue.d.ts → system/config/components/AdminMock.vue.d.ts} +0 -0
- /package/dist/views/{login/skins/SplitPanel.vue.d.ts → system/config/components/AdvancedSection.vue.d.ts} +0 -0
- /package/dist/views/{login/skins/Spotlight.vue.d.ts → system/config/components/JobSection.vue.d.ts} +0 -0
- /package/dist/views/system/config/components/{ExternalAuthConfig.vue.d.ts → LogoEditor.vue.d.ts} +0 -0
- /package/dist/views/system/config/components/{HighSensConfig.vue.d.ts → SecuritySection.vue.d.ts} +0 -0
- /package/dist/views/system/config/components/{JobConfig.vue.d.ts → SensitiveSection.vue.d.ts} +0 -0
- /package/dist/views/system/config/components/{OtherConfig.vue.d.ts → SigninSection.vue.d.ts} +0 -0
- /package/dist/views/system/config/components/{SecurityConfig.vue.d.ts → UploadSection.vue.d.ts} +0 -0
- /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/menu/index.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { computed, h, onMounted, ref, shallowRef, watch } from 'vue'\nimport { NButton, NSpace, NTag, NInput, NSelect, NDropdown, useMessage } from 'naive-ui'\nimport { SmartTable, type SmartTableColumn } from 'smart-naive-table'\nimport { useI18n } from 'vue-i18n'\nimport AppIcon from '#/components/AppIcon.vue'\nimport StatusSwitch from '#/components/StatusSwitch/index.vue'\nimport ButtonManager from './components/ButtonManager.vue'\nimport MenuFormModal from './components/MenuFormModal.vue'\nimport { useConfirm } from '#/composables/useConfirm'\nimport { buildRoutesForModule } from '#/composables/useAuthMenu'\nimport { useAuthStore } from '#/stores/auth'\nimport { menuApi, moduleApi } from '#/api'\nimport { translateError } from '#/utils/error'\nimport { expandableIds, filterTree } from '#/utils/tree'\nimport { MenuType, type MenuTreeNode, splitPermission, toMenuInput } from '#/types/menu'\nimport type { ModuleRow, PermissionRouteItem } from '#/types/api'\n\nconst { t } = useI18n()\nconst message = useMessage()\nconst { confirm } = useConfirm()\nconst auth = useAuthStore()\n\nconst loading = ref(false)\n// 整份替换 + 只读(行内改动一律重拉 load(),不往节点上写值),不需要深响应\nconst tree = shallowRef<MenuTreeNode[]>([])\nconst modules = shallowRef<ModuleRow[]>([])\n/** 「未分配」哨兵:雪花 id 无 0,用它表示 moduleId==null 的顶级目录分组。 */\nconst UNASSIGNED = 0\n/** 「全部」哨兵:雪花 id 无负数,用它表示不按应用过滤。默认筛选停在当前应用时,\n * 别的应用底下新建的菜单会被筛掉、看着像\"存了但不见了\"——需要一个能看全量的退路。 */\nconst ALL_MODULES = -1\n/** 所属应用筛选:默认跟随当前进入的应用,modules 加载后再校正。 */\nconst moduleFilter = ref<number>(auth.currentModuleId ?? UNASSIGNED)\n/** 后端实时路由表(含消费方自建控制器)——权限码下拉的数据源,免手敲 `GET:/api/v1/...`。 */\nconst routes = ref<PermissionRouteItem[]>([])\n\nasync function load() {\n loading.value = true\n try {\n tree.value = await menuApi.tree()\n } catch (e) {\n message.error(translateError(e))\n } finally {\n loading.value = false\n }\n}\n\n/**\n * 菜单改完顺手重建当前应用的壳层(侧边栏 + 动态路由)——否则新建的菜单要 F5 才出现,\n * 而这与「组件路径写错→进入 MissingRoute」都指向配置错误,这里仍需把失败显式反馈给管理员。\n * 失败静默:菜单本身已存成功,壳层没刷新不该把成功报成失败,下次 F5 自愈。\n */\nasync function syncShell() {\n if (!auth.currentModuleId) return\n try {\n await buildRoutesForModule(auth.currentModuleId)\n } catch {\n /* 见上 */\n }\n}\nonMounted(async () => {\n await load()\n try {\n modules.value = await moduleApi.list()\n // 若默认筛选值不在选项内(如当前未进入任何应用),回退到第一个模块。\n if (!filterOptions.value.some(o => o.value === moduleFilter.value)) {\n moduleFilter.value = modules.value[0]?.id ?? UNASSIGNED\n }\n } catch {\n // 模块列表仅供「所属应用」下拉;拉取失败不阻塞菜单管理主流程。\n }\n try {\n routes.value = await menuApi.routes()\n } catch {\n // 路由清单仅供「权限码」下拉;拉取失败(如未授该码)退化为手输,不阻塞菜单管理主流程。\n }\n})\n\n// 类型文案。树里只有目录/页面(按钮不进树),Button 分支只为类型穷举。\nconst typeText = (ty: MenuType) =>\n ty === MenuType.Catalog\n ? t('menu.typeCatalog')\n : ty === MenuType.Menu\n ? t('menu.typeMenu')\n : t('menu.typeButton')\n\n// 目录/页面用不同色系(蓝/绿)区分 —— 树里只有这两类,按钮不进树。\nconst typeTagType = (ty: MenuType): 'info' | 'success' =>\n ty === MenuType.Catalog ? 'info' : 'success'\n\nconst moduleOptions = computed(() => modules.value.map(m => ({ label: m.title, value: m.id })))\n\n/** 顶部筛选下拉:「全部」+ 各应用 +「未分配」。 */\nconst filterOptions = computed(() => [\n { label: t('menu.moduleAll'), value: ALL_MODULES },\n ...moduleOptions.value,\n { label: t('menu.moduleUnassigned'), value: UNASSIGNED },\n])\n\n/** 递归剔除按钮节点 —— 按钮统一在「权限按钮」弹窗里单独管理,不进主树,树里只留目录/菜单。 */\nfunction stripButtons(nodes: MenuTreeNode[]): MenuTreeNode[] {\n return nodes\n .filter(n => n.type !== MenuType.Button)\n .map(n => ({ ...n, children: stripButtons(n.children) }))\n}\n\n/**\n * 按所属应用过滤:moduleId 只存在顶级目录(parentId==0)上,子节点为 null 靠继承,\n * 所以只过滤顶级数组、子树自动跟随;UNASSIGNED 归拢 moduleId==null 的顶级目录。\n * 再剥掉按钮节点后交给表格渲染。\n */\nconst filteredTree = computed(() =>\n stripButtons(\n tree.value.filter(r =>\n moduleFilter.value === ALL_MODULES\n ? true\n : moduleFilter.value === UNASSIGNED\n ? r.moduleId == null\n : r.moduleId === moduleFilter.value,\n ),\n ),\n)\n\n/**\n * 各节点直属按钮的数量 + 权限码拼串(取自未剥离的原树,无需额外请求)。\n * count 给「权限按钮」列的徽标;perms 给关键字搜索 —— 按钮不在树里,\n * 「这个权限码归哪个页面」只能靠父页面命中来回答,否则藏起按钮就等于把它搜没了。\n */\nconst buttonInfoById = computed(() => {\n const m = new Map<number, { count: number; perms: string }>()\n const walk = (nodes: MenuTreeNode[]) => {\n for (const n of nodes) {\n const btns = n.children.filter(c => c.type === MenuType.Button)\n m.set(n.id, {\n count: btns.length,\n perms: btns\n .flatMap(b => splitPermission(b.permission))\n .join(' ')\n .toLowerCase(),\n })\n walk(n.children)\n }\n }\n walk(tree.value)\n return m\n})\n\n// ── 关键字搜索 + 展开控制 ─────────────────────────────────────────\n// 内核开箱就播了整棵系统菜单树,全展开、没搜索、没折叠 = 第一天打开就糊脸。\n// SmartTable 静态 data 模式不做任何前端过滤(它只在 fetcher 模式下发请求),所以过滤得自己算;\n// 关键字放 #toolbar 而不是用列的 search 配置:树表没有分页,搜索卡片会白占一整块高度。\n// 只喂给表格,不喂给 parentOptions —— 父级下拉必须始终是完整的当前应用子树,不能随搜索缩水。\nconst keyword = ref('')\nconst visibleTree = computed(() => {\n const kw = keyword.value.trim().toLowerCase()\n if (!kw) return filteredTree.value\n // 注意别写成 n.permission:过滤跑在已剥掉按钮的 filteredTree 上,而目录/页面的 permission 恒为空,\n // 那样写等于永不命中。要按权限码搜,只能查该节点「按钮子节点」的码(见 buttonInfoById)。\n return filterTree(\n filteredTree.value,\n n =>\n n.title.toLowerCase().includes(kw) ||\n (n.path ?? '').toLowerCase().includes(kw) ||\n (buttonInfoById.value.get(n.id)?.perms ?? '').includes(kw),\n )\n})\n\n// 展开受控:一旦传了 expanded-row-keys,naive 就以它为准(default-expand-all 会被初始值直接覆盖)。\n// 初值留空 = 进来全折叠:先给一屏顶级目录的骨架,要看哪一支自己点开;\n// 整棵树一进门就全摊开,反而得先滚半天才找得到自己要改的那条。\nconst expandedKeys = ref<number[]>([])\n\n// 搜索是唯一必须自动展开的场景:filterTree 命中的节点可能埋在任意深度,祖先还折着就等于搜了个寂寞。\n// 结果每变一次重播一次(收窄关键字也算);无关键字时一律不碰 —— 见下面那条 watch 的注释。\nwatch(visibleTree, next => {\n if (keyword.value.trim()) expandedKeys.value = expandableIds(next)\n})\n\n// 关键字清空 → 回到默认的全折叠;切应用 = 换了一棵树,展开态同样归位。\n// 这两件事必须挂在「关键字/应用」上,不能写进上面 watch(visibleTree) 里无条件重置:\n// 保存菜单后会重拉树,那样用户手点开的行会被一起按回去,改完一条就迷路一次。\nwatch([() => keyword.value.trim(), moduleFilter], ([kw]) => {\n if (!kw) expandedKeys.value = []\n})\n\nconst allExpanded = computed(() => expandedKeys.value.length > 0)\nconst toggleExpandAll = () =>\n (expandedKeys.value = allExpanded.value ? [] : expandableIds(visibleTree.value))\n\n// 当前所属应用的路由匹配前缀(sys/biz…):传给 ButtonManager,权限路由下拉据此按应用软过滤。\n// 「未分配」筛选或该应用未填 apiPrefix → undefined,ButtonManager 退化为不过滤。\nconst currentAppPrefix = computed(() =>\n moduleFilter.value === UNASSIGNED\n ? undefined\n : (modules.value.find(m => m.id === moduleFilter.value)?.apiPrefix ?? undefined),\n)\n\n// ── 新增/编辑弹窗(MenuFormModal:表单态/父级下拉/保存均在其内,父页只传数据 + 收 saved)──\nconst menuFormRef = ref<InstanceType<typeof MenuFormModal> | null>(null)\n\n// ── 权限按钮弹窗 ────────────────────────────────────────────────\nconst buttonMgrRef = ref<InstanceType<typeof ButtonManager> | null>(null)\nconst openButtons = (r: MenuTreeNode) => buttonMgrRef.value?.open({ id: r.id, title: r.title })\n/** 菜单/按钮增删改后:重拉树(刷新徽标)+ 重建壳层(即时反映授权/菜单变更)。表单弹窗与按钮弹窗共用。 */\nconst reloadTree = () => Promise.all([load(), syncShell()])\n\n/** 删除:下拉菜单项不适合内联 popconfirm,走 useConfirm().confirm 的 dialog(它的设计用途)。 */\nconst onDelete = (r: MenuTreeNode) =>\n confirm({\n content: t('menu.deleteConfirm', { title: r.title }),\n type: 'error',\n action: () => menuApi.remove(r.id),\n successMsg: t('menu.deleted'),\n }).then(ok => {\n if (ok) Promise.all([load(), syncShell()])\n })\n\n// 展开图标:naive 默认三角太淡、展开态朝下,辨识度低。统一成固定尺寸的「>」caret,展开时旋转 90°\n// —— 观感清晰,尺寸恒定,行高不会因默认图标忽大忽小而参差。\nconst renderExpandIcon = ({ expanded }: { expanded: boolean }) =>\n h(\n 'span',\n {\n style: `display:inline-flex;transition:transform .2s;transform:rotate(${expanded ? 90 : 0}deg)`,\n },\n h(AppIcon, { icon: 'ph:caret-right-bold', size: 13 }),\n )\n\n/**\n * 层级序号:`5` / `5.2` / `5.2.3`,按当前可见树逐层递推。\n * 不能用表格自带的 index 列 —— naive 树表 flatten 时让每个后代继承「根行下标」\n * (Body.tsx: traverse(r.children, rootIndex)),一整棵子树全叫「5」,序号等于没有。\n * 自己数则行行唯一,点号路径本身就是一条「到根」的定位。\n */\nconst rowNoById = computed(() => {\n const m = new Map<number, string>()\n const walk = (nodes: MenuTreeNode[], prefix: string) => {\n nodes.forEach((n, i) => {\n const no = prefix ? `${prefix}.${i + 1}` : String(i + 1)\n m.set(n.id, no)\n walk(n.children, no)\n })\n }\n walk(visibleTree.value, '')\n return m\n})\n\nconst columns: SmartTableColumn<MenuTreeNode>[] = [\n // 序号列是渲染 rowNoById 层级号的普通数据列,fixed:'left' 与标题列同锚 ——\n // 不锚定的话,横向滚动时会滑到 fixed 的标题列底下,「这是哪一行」照样丢。\n {\n title: () => t('common.rowNo'),\n key: '__no',\n width: 72,\n align: 'center',\n fixed: 'left',\n hideInSetting: true, // 结构性列,不进列设置\n render: r => {\n const no = rowNoById.value.get(r.id)\n if (!no) return null\n const cut = no.lastIndexOf('.') + 1\n // 祖先前缀压暗、末段留亮:一眼读出「哪一层的第几个」,不用逐字符数点号。\n return h('span', { class: 'row-no' }, [\n cut ? h('span', { class: 'row-no__path' }, no.slice(0, cut)) : null,\n h('span', { class: 'row-no__self' }, no.slice(cut)),\n ])\n },\n },\n {\n title: () => t('menu.title'),\n key: 'title',\n align: 'left', // 树列左对齐,展开缩进才好读\n // 展开箭头与每层 26px 缩进钉死在这一列。默认会落到「首个无 type 的列」= 序号列,\n // 于是缩进把序号列里的数字一层层挤出可视区(展开后序号就看不见了);缩进也只有紧贴标题才读得通。\n tree: true,\n minWidth: 240, // 让出让给缩进的宽度\n fixed: 'left', // 横向滚动时不能丢失「这是哪一行」\n render: r =>\n // inline:必须行内 —— naive 的展开箭头是 inline-flex,默认块级 NSpace 会被挤到第二行。\n h(NSpace, { inline: true, align: 'center', size: 6, wrapItem: false }, () => [\n r.title,\n // 「隐藏」是罕见状态(种子里的目录/页面全是显示),只在为真时才占视觉 —— 省掉一整列同一个词。\n r.visible\n ? null\n : h(NTag, { size: 'tiny', bordered: false, type: 'warning' }, () => t('common.hidden')),\n ]),\n },\n // 图标独占一列:留在标题列会和树形展开箭头 + 缩进挤在一起撑破首列换行。\n {\n title: () => t('menu.icon'),\n key: 'icon',\n width: 64,\n align: 'center',\n render: r => (r.icon ? h(AppIcon, { icon: r.icon, size: 18 }) : null),\n },\n // 类型独占一列,不塞在标题里。按类型着色,目录/页面一眼可辨。\n {\n title: () => t('menu.type'),\n key: 'type',\n width: 90,\n render: r =>\n h(NTag, { size: 'small', bordered: false, type: typeTagType(r.type) }, () =>\n typeText(r.type),\n ),\n },\n // 路由/组件路径:管理员核对菜单时真正要看的东西,直接列出,不必点开编辑弹窗。\n // 不设权限码列 —— 树里只有目录/页面,而它俩结构上永远没有权限码(种子里全为空),\n // 那一列必然是「—」。权限码的正主在「权限按钮」弹窗里。\n {\n title: () => t('menu.path'),\n key: 'path',\n align: 'left',\n width: 160,\n ellipsis: { tooltip: true },\n render: r => r.path || '—',\n },\n {\n title: () => t('menu.component'),\n key: 'component',\n align: 'left',\n width: 180,\n ellipsis: { tooltip: true },\n render: r => r.component || '—',\n },\n {\n title: () => t('menu.buttons'),\n key: 'buttons',\n width: 140,\n render: r => {\n const n = buttonInfoById.value.get(r.id)?.count ?? 0\n // 页面和目录都能「配置权限」:按钮正常挂页面下;直接挂目录下的是无页面权限项\n //(只给移动端 / 第三方调的接口),目录就是它们的权限组,角色授权界面会把它们渲染成一行。\n // 无菜单新增权限则不显示「配置权限」入口(只读用户不该看到写入口;弹窗内写按钮亦各自设门,服务端兜底)\n if (!auth.hasPerm('POST:/api/v1/sys/menu/add')) return null\n return h(\n NButton,\n {\n size: 'small',\n quaternary: true,\n type: n > 0 ? 'primary' : undefined,\n onClick: () => openButtons(r),\n },\n {\n icon: () => h(AppIcon, { icon: 'ph:shield-check', size: 15 }),\n default: () => t('menu.configPerms', { n }),\n },\n )\n },\n },\n { title: () => t('menu.sort'), key: 'sort', width: 70 },\n {\n title: () => t('common.status'),\n key: 'enabled',\n width: 84,\n render: r =>\n h(StatusSwitch, {\n value: r.enabled,\n disabled: !auth.hasPerm('PUT:/api/v1/sys/menu/{id}'), // 启停走全量 update,无更新权限则置灰\n // 停用是一键隐藏整棵子树的重操作,先确认;启用无副作用,跳过确认(返回 null)。\n confirm: (next: boolean) => (next ? null : t('menu.disableConfirm', { title: r.title })),\n request: (next: boolean) => menuApi.update(r.id, { ...toMenuInput(r), enabled: next }),\n // 重拉而非往行对象上写:搜索态下的祖先行是 filterTree 的浅拷贝,写它不会回到源树(开关会弹回去)。\n // StatusSwitch 是悲观更新(请求成功才 emit),重拉一次就是最终态。\n 'onUpdate:value': () => {\n load()\n syncShell() // 停用/启用即刻反映到侧边栏\n },\n }),\n },\n // 操作收敛成「编辑 + 更多▾」且 fixed:'right':4 个操作平铺会把「删除」挤到第二行、行高参差,\n // 不 fixed 的话横向滚动时整列会被裁掉够不着。\n {\n title: () => t('common.operation'),\n key: 'op',\n width: 150,\n fixed: 'right',\n render: r =>\n h(NSpace, { size: 2, wrapItem: false, justify: 'center' }, () => {\n // 「更多」里两项各自按权限码保留;都无权时整个下拉不渲染,避免空触发器。\n const moreOptions = [\n auth.hasPerm('POST:/api/v1/sys/menu/add') && {\n key: 'addChild',\n label: t('menu.addChild'),\n },\n auth.hasPerm('DELETE:/api/v1/sys/menu/{id}') && {\n key: 'delete',\n label: t('common.delete'),\n },\n ].filter(Boolean) as { key: string; label: string }[]\n return [\n auth.hasPerm('PUT:/api/v1/sys/menu/{id}')\n ? h(\n NButton,\n {\n size: 'small',\n quaternary: true,\n type: 'primary',\n onClick: () => menuFormRef.value?.openEdit(r),\n },\n () => t('common.edit'),\n )\n : null,\n moreOptions.length\n ? h(\n NDropdown,\n {\n trigger: 'click',\n options: moreOptions,\n onSelect: (key: string) =>\n key === 'addChild' ? menuFormRef.value?.openAdd(r.id) : onDelete(r),\n },\n () => h(NButton, { size: 'small', quaternary: true }, () => t('common.more')),\n )\n : null,\n ]\n }),\n },\n]\n</script>\n\n<template>\n <!-- .fill-page 是站内约定(styles/layout.css):它的 :has() 规则把路由外层 .page-view 撑到 100%,\n 页面自身 flex 列 + overflow:hidden —— 卡片吃满内容区,滚动只发生在表体里。 -->\n <div class=\"view fill-page\">\n <!-- expanded-row-keys / update:expanded-row-keys 不是 SmartTable 的 prop —— 它 inheritAttrs:false + v-bind=\"attrs\",\n 未声明的 attr 原样透传给内层 n-data-table(:loading 走的也是这条路)。 -->\n <SmartTable\n :default-page-size=\"100\"\n :columns=\"columns\"\n :data=\"visibleTree\"\n :loading=\"loading\"\n row-key=\"id\"\n :pagination=\"false\"\n storage-key=\"sys-menu\"\n :indent=\"26\"\n flex-height\n virtual-scroll\n :min-row-height=\"48\"\n :render-expand-icon=\"renderExpandIcon\"\n :expanded-row-keys=\"expandedKeys\"\n @update:expanded-row-keys=\"(keys: number[]) => (expandedKeys = keys)\"\n >\n <template #toolbar>\n <n-select\n v-model:value=\"moduleFilter\"\n :options=\"filterOptions\"\n style=\"width: 200px\"\n :placeholder=\"t('menu.module')\"\n />\n <n-input\n v-model:value=\"keyword\"\n clearable\n :placeholder=\"t('menu.searchPlaceholder')\"\n style=\"width: 220px\"\n >\n <template #prefix><AppIcon icon=\"ph:magnifying-glass\" :size=\"16\" /></template>\n </n-input>\n <n-button quaternary @click=\"toggleExpandAll\">\n <template #icon>\n <AppIcon\n :icon=\"allExpanded ? 'ph:arrows-in-line-vertical' : 'ph:arrows-out-line-vertical'\"\n :size=\"16\"\n />\n </template>\n {{ allExpanded ? t('common.collapseAll') : t('common.expandAll') }}\n </n-button>\n <n-button\n v-auth=\"'POST:/api/v1/sys/menu/add'\"\n type=\"primary\"\n @click=\"menuFormRef?.openAdd(0)\"\n >\n <template #icon><AppIcon icon=\"ph:plus\" :size=\"16\" /></template>\n {{ t('common.add') }}\n </n-button>\n </template>\n </SmartTable>\n\n <MenuFormModal\n ref=\"menuFormRef\"\n :modules=\"modules\"\n :tree=\"tree\"\n :filtered-tree=\"filteredTree\"\n :module-filter=\"moduleFilter\"\n @saved=\"reloadTree\"\n />\n\n <ButtonManager\n ref=\"buttonMgrRef\"\n :tree=\"tree\"\n :routes=\"routes\"\n :app-prefix=\"currentAppPrefix\"\n @changed=\"reloadTree\"\n />\n </div>\n</template>\n\n<style scoped>\n.view {\n display: flex;\n flex-direction: column;\n gap: var(--gap-card);\n}\n\n/* 层级序号:字号/字族都跟标题列走(不用 12px 等宽),只借 tabular-nums 让各行点号竖着对齐;\n 前缀是祖先路径(压暗),末段才是这一行自己的号。 */\n:deep(.row-no) {\n font-variant-numeric: tabular-nums;\n white-space: nowrap;\n}\n\n:deep(.row-no__path) {\n color: var(--color-text-disabled);\n}\n\n:deep(.row-no__self) {\n color: var(--color-text-secondary);\n font-weight: var(--font-weight-medium);\n}\n</style>\n"],"names":["UNASSIGNED","ALL_MODULES","t","useI18n","message","useMessage","confirm","useConfirm","auth","useAuthStore","loading","ref","tree","shallowRef","modules","moduleFilter","routes","load","menuApi","translateError","syncShell","buildRoutesForModule","onMounted","moduleApi","filterOptions","o","_a","typeText","ty","MenuType","typeTagType","moduleOptions","computed","m","stripButtons","nodes","n","filteredTree","r","buttonInfoById","walk","btns","c","b","splitPermission","keyword","visibleTree","kw","filterTree","expandedKeys","watch","next","expandableIds","allExpanded","toggleExpandAll","currentAppPrefix","menuFormRef","buttonMgrRef","openButtons","reloadTree","onDelete","ok","renderExpandIcon","expanded","h","AppIcon","rowNoById","prefix","i","no","columns","cut","NSpace","NTag","NButton","StatusSwitch","toMenuInput","moreOptions","NDropdown","key","_openBlock","_createElementBlock","_hoisted_1","_createVNode","_unref","SmartTable","_cache","keys","NSelect","$event","NInput","_createTextVNode","_toDisplayString","_createBlock","MenuFormModal","ButtonManager"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index2.vue.js","sources":["../../../../src/views/system/menu/index.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { computed, h, onMounted, ref, shallowRef, toRaw, watch } from 'vue'\nimport {\n NButton,\n NSpace,\n NTag,\n NSelect,\n NDropdown,\n useMessage,\n type DropdownOption,\n} from 'naive-ui'\nimport {\n SmartTable,\n type SmartTableColumn,\n type SmartTableFetcher,\n type SmartTableInst,\n} from 'smart-naive-table'\nimport { useI18n } from 'vue-i18n'\nimport AppIcon from '#/components/AppIcon.vue'\nimport StatusSwitch from '#/components/StatusSwitch/index.vue'\nimport ButtonManager from './components/ButtonManager.vue'\nimport MenuFormModal from './components/MenuFormModal.vue'\nimport { useConfirm } from '#/composables/useConfirm'\nimport { buildRoutesForModule } from '#/composables/useAuthMenu'\nimport { useAuthStore } from '#/stores/auth'\nimport { menuApi, moduleApi } 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 { expandableIds } from '#/utils/tree'\nimport { filterTreeByParams, hasTreeCondition, type TreeSearchFields } from '#/utils/treeFilter'\nimport { MenuType, type MenuTreeNode, splitPermission, toMenuInput } from '#/types/menu'\nimport type { ModuleRow, PermissionRouteItem } from '#/types/api'\n\nimport { lineIcon } from '#/utils/menuIcon'\nimport { translateMenuTitle } from '#/locales/menuTitle'\nconst { t } = useI18n()\nconst message = useMessage()\nconst { confirm } = useConfirm()\nconst auth = useAuthStore()\n\nconst loading = ref(false)\n// 整份替换 + 只读(行内改动一律重拉,不往节点上写值),不需要深响应\nconst tree = shallowRef<MenuTreeNode[]>([])\nconst modules = shallowRef<ModuleRow[]>([])\n/** 「未分配」哨兵:雪花 id 无 0,用它表示 moduleId==null 的顶级目录分组。 */\nconst UNASSIGNED = 0\n/** 「全部」哨兵:雪花 id 无负数,用它表示不按应用过滤。默认筛选停在当前应用时,\n * 别的应用底下新建的菜单会被筛掉、看着像\"存了但不见了\"——需要一个能看全量的退路。 */\nconst ALL_MODULES = -1\n/** 所属应用筛选:默认跟随当前进入的应用,modules 加载后再校正。 */\nconst moduleFilter = ref<number>(auth.currentModuleId ?? UNASSIGNED)\n/** 后端实时路由表(含消费方自建控制器)——权限码下拉的数据源,免手敲 `GET:/api/v1/...`。 */\nconst routes = ref<PermissionRouteItem[]>([])\n\n/** 从服务端拉整棵菜单树。只由 treeFetcher 调用:增删改后一律走 `reload()`(让表格重新取数),不要直接调它。 */\nasync function load() {\n loading.value = true\n try {\n tree.value = await menuApi.tree()\n } catch (e) {\n message.error(translateError(e))\n } finally {\n loading.value = false\n }\n}\n\n/**\n * 菜单改完顺手重建当前应用的壳层(侧边栏 + 动态路由)——否则新建的菜单要 F5 才出现,\n * 而这与「组件路径写错→进入 MissingRoute」都指向配置错误,这里仍需把失败显式反馈给管理员。\n * 失败静默:菜单本身已存成功,壳层没刷新不该把成功报成失败,下次 F5 自愈。\n */\nasync function syncShell() {\n if (!auth.currentModuleId) return\n try {\n await buildRoutesForModule(auth.currentModuleId)\n } catch {\n /* 见上 */\n }\n}\n// 菜单树本身由表格的 fetcher 首次取数时拉(immediate),这里只拉两份下拉辅助数据。\nonMounted(async () => {\n try {\n modules.value = await moduleApi.list()\n // 若默认筛选值不在选项内(如当前未进入任何应用),回退到第一个模块。\n if (!filterOptions.value.some(o => o.value === moduleFilter.value)) {\n moduleFilter.value = modules.value[0]?.id ?? UNASSIGNED\n }\n } catch {\n // 模块列表仅供「所属应用」下拉;拉取失败不阻塞菜单管理主流程。\n }\n try {\n routes.value = await menuApi.routes()\n } catch {\n // 路由清单仅供「权限码」下拉;拉取失败(如未授该码)退化为手输,不阻塞菜单管理主流程。\n }\n})\n\n// 类型文案。树里只有目录/页面(按钮不进树),Button 分支只为类型穷举。\nconst typeText = (ty: MenuType) =>\n ty === MenuType.Catalog\n ? t('menu.typeCatalog')\n : ty === MenuType.Menu\n ? t('menu.typeMenu')\n : t('menu.typeButton')\n\n// 目录/页面用不同色系(蓝/绿)区分 —— 树里只有这两类,按钮不进树。\nconst typeTagType = (ty: MenuType): 'info' | 'success' =>\n ty === MenuType.Catalog ? 'info' : 'success'\n\nconst moduleOptions = computed(() =>\n modules.value.map(m => ({ label: translateMenuTitle(m.title), value: m.id })),\n)\n\n/** 顶部筛选下拉:「全部」+ 各应用 +「未分配」。 */\nconst filterOptions = computed(() => [\n { label: t('menu.moduleAll'), value: ALL_MODULES },\n ...moduleOptions.value,\n { label: t('menu.moduleUnassigned'), value: UNASSIGNED },\n])\n\n/** 递归剔除按钮节点 —— 按钮统一在「权限按钮」弹窗里单独管理,不进主树,树里只留目录/菜单。 */\nfunction stripButtons(nodes: MenuTreeNode[]): MenuTreeNode[] {\n return nodes\n .filter(n => n.type !== MenuType.Button)\n .map(n => ({ ...n, children: stripButtons(n.children) }))\n}\n\n/**\n * 按所属应用过滤:moduleId 只存在顶级目录(parentId==0)上,子节点为 null 靠继承,\n * 所以只过滤顶级数组、子树自动跟随;UNASSIGNED 归拢 moduleId==null 的顶级目录。\n * 再剥掉按钮节点后交给表格渲染。\n */\nconst filteredTree = computed(() =>\n stripButtons(\n tree.value.filter(r =>\n moduleFilter.value === ALL_MODULES\n ? true\n : moduleFilter.value === UNASSIGNED\n ? r.moduleId == null\n : r.moduleId === moduleFilter.value,\n ),\n ),\n)\n\n/**\n * 各节点直属按钮的数量 + 权限码拼串(取自未剥离的原树,无需额外请求)。\n * count 给「权限按钮」列的徽标;perms 给关键字搜索 —— 按钮不在树里,\n * 「这个权限码归哪个页面」只能靠父页面命中来回答,否则藏起按钮就等于把它搜没了。\n */\nconst buttonInfoById = computed(() => {\n const m = new Map<number, { count: number; perms: string }>()\n const walk = (nodes: MenuTreeNode[]) => {\n for (const n of nodes) {\n const btns = n.children.filter(c => c.type === MenuType.Button)\n m.set(n.id, {\n count: btns.length,\n perms: btns\n .flatMap(b => splitPermission(b.permission))\n .join(' ')\n .toLowerCase(),\n })\n walk(n.children)\n }\n }\n walk(tree.value)\n return m\n})\n\n// ── 取数 + 条件搜索 + 展开控制 ────────────────────────────────────\n// 内核开箱就播了整棵系统菜单树,全展开、没搜索、没折叠 = 第一天打开就糊脸。\n// 树表用远程模式:3.0 静态模式的条件过滤是平铺的 rows.filter,不递归 children,在树上只会命中顶层行。\n// 所以 fetcher 自己递归过滤,条件构造器只负责收集条件(全局序列化器摊平成 { title, path, permission })。\n// 取数器每次都重新拉一遍服务端:工具栏内置的刷新图标只会重新调 fetcher,\n// 只过滤内存里的旧树的话,点刷新就是假刷新(别处新建的菜单永远出不来)。\n// 过滤结果只喂给表格,不喂给 parentOptions —— 父级下拉必须始终是完整的当前应用子树,不能随搜索缩水。\nconst tableRef = ref<SmartTableInst<MenuTreeNode>>()\nconst reload = () => tableRef.value?.refresh()\n\n// 搜索项 → 取值。权限码是特例:过滤跑在已剥掉按钮的 filteredTree 上,而目录/页面的 permission 恒为空,\n// 写成 n.permission 等于永不命中。要按权限码搜,只能查该节点「按钮子节点」的码(见 buttonInfoById)。\nconst SEARCH_FIELDS: TreeSearchFields<MenuTreeNode> = {\n // 英文界面下表里显示的是译名,搜索要两边都认(库里存的中文原文 + 当前语言的显示名)。\n title: n => `${n.title} ${translateMenuTitle(n.title, n.path || undefined)}`,\n path: n => n.path,\n permission: n => buttonInfoById.value.get(n.id)?.perms,\n}\n\n// 每次取数结果是否带搜索条件:挂在结果数组上,@loaded 时按数组引用取回。\n// 不用「最近一次 fetcher 调用的参数」是因为库会丢弃过期响应,@loaded 对应的未必是最后一次调用。\nconst searchedResults = new WeakMap<object, boolean>()\nconst treeFetcher: SmartTableFetcher<MenuTreeNode> = async params => {\n await load()\n const items = filterTreeByParams(filteredTree.value, params, SEARCH_FIELDS)\n searchedResults.set(items, hasTreeCondition(params, SEARCH_FIELDS))\n return { items, total: items.length }\n}\n\n// 展开受控:一旦传了 expanded-row-keys,naive 就以它为准(default-expand-all 会被初始值直接覆盖)。\n// 初值留空 = 进来全折叠:先给一屏顶级目录的骨架,要看哪一支自己点开;\n// 整棵树一进门就全摊开,反而得先滚半天才找得到自己要改的那条。\nconst expandedKeys = ref<number[]>([])\n// 取数器返回的(已过滤的)树:「展开全部」与层级序号都按它算。\nconst visibleTree = shallowRef<MenuTreeNode[]>([])\n// 当前展示的结果是不是搜索结果。\nlet searching = false\n\nfunction onLoaded(rows: MenuTreeNode[]) {\n visibleTree.value = rows\n const now = searchedResults.get(toRaw(rows)) ?? false\n if (now) {\n // 搜索是唯一必须自动展开的场景:filterTree 命中的节点可能埋在任意深度,祖先还折着就等于搜了个寂寞。\n // 结果每变一次重播一次(收窄条件也算)。\n expandedKeys.value = expandableIds(rows)\n } else if (searching) {\n // 条件清空 → 回到默认的全折叠。\n expandedKeys.value = []\n }\n // 无条件且上一次也没搜索:一律不碰展开态 ——\n // 保存菜单后会重拉树,无条件重置的话用户手点开的行会被一起按回去,改完一条就迷路一次。\n searching = now\n}\n\n// 切应用 = 换了一棵树,展开态归位(搜索中则交给 onLoaded 按新结果重新展开);同时让表格按新应用重新取数。\nwatch(moduleFilter, () => {\n if (!searching) expandedKeys.value = []\n void reload()\n})\n\nconst allExpanded = computed(() => expandedKeys.value.length > 0)\nconst toggleExpandAll = () =>\n (expandedKeys.value = allExpanded.value ? [] : expandableIds(visibleTree.value))\n\n// 当前所属应用的路由匹配前缀(sys/biz…):传给 ButtonManager,权限路由下拉据此按应用软过滤。\n// 「未分配」筛选或该应用未填 apiPrefix → undefined,ButtonManager 退化为不过滤。\nconst currentAppPrefix = computed(() =>\n moduleFilter.value === UNASSIGNED\n ? undefined\n : (modules.value.find(m => m.id === moduleFilter.value)?.apiPrefix ?? undefined),\n)\n\n// ── 新增/编辑弹窗(MenuFormModal:表单态/父级下拉/保存均在其内,父页只传数据 + 收 saved)──\nconst menuFormRef = ref<InstanceType<typeof MenuFormModal> | null>(null)\n\n// ── 权限按钮弹窗 ────────────────────────────────────────────────\nconst buttonMgrRef = ref<InstanceType<typeof ButtonManager> | null>(null)\nconst openButtons = (r: MenuTreeNode) => buttonMgrRef.value?.open({ id: r.id, title: r.title })\n/** 菜单/按钮增删改后:重拉树(刷新徽标)+ 重建壳层(即时反映授权/菜单变更)。表单弹窗与按钮弹窗共用。 */\nconst reloadTree = () => Promise.all([reload(), syncShell()])\n\n/** 删除:下拉菜单项不适合内联 popconfirm,走 useConfirm().confirm 的 dialog(它的设计用途)。 */\nconst onDelete = (r: MenuTreeNode) =>\n confirm({\n content: t('menu.deleteConfirm', { title: r.title }),\n type: 'error',\n action: () => menuApi.remove(r.id),\n successMsg: t('menu.deleted'),\n }).then(ok => {\n if (ok) reloadTree()\n })\n\n// 展开图标:naive 默认三角太淡、展开态朝下,辨识度低。统一成固定尺寸的「>」caret,展开时旋转 90°\n// —— 观感清晰,尺寸恒定,行高不会因默认图标忽大忽小而参差。\nconst renderExpandIcon = ({ expanded }: { expanded: boolean }) =>\n h(\n 'span',\n {\n style: `display:inline-flex;transition:transform .2s var(--ease);transform:rotate(${expanded ? 90 : 0}deg)`,\n },\n h(AppIcon, { icon: 'ph:caret-right', size: 14 }),\n )\n\n/**\n * 层级序号:`5` / `5.2` / `5.2.3`,按当前可见树逐层递推。\n * 不能用表格自带的 index 列 —— naive 树表 flatten 时让每个后代继承「根行下标」\n * (Body.tsx: traverse(r.children, rootIndex)),一整棵子树全叫「5」,序号等于没有。\n * 自己数则行行唯一,点号路径本身就是一条「到根」的定位。\n */\nconst rowNoById = computed(() => {\n const m = new Map<number, string>()\n const walk = (nodes: MenuTreeNode[], prefix: string) => {\n nodes.forEach((n, i) => {\n const no = prefix ? `${prefix}.${i + 1}` : String(i + 1)\n m.set(n.id, no)\n walk(n.children, no)\n })\n }\n walk(visibleTree.value, '')\n return m\n})\n\n/** 路由 / 组件路径单元格:有值用等宽次级色,空值画灰色的「—」。 */\nconst cellPath = (v?: string | null) =>\n v ? h('span', { class: 'mono muted' }, v) : h('span', { class: 'faint' }, '—')\n\nconst columns: SmartTableColumn<MenuTreeNode>[] = [\n // 序号列是渲染 rowNoById 层级号的普通数据列,fixed:'left' 与标题列同锚 ——\n // 不锚定的话,横向滚动时会滑到 fixed 的标题列底下,「这是哪一行」照样丢。\n {\n title: () => t('common.rowNo'),\n key: '__no',\n width: 72,\n align: 'center',\n fixed: 'left',\n hideInSetting: true, // 结构性列,不进列设置\n render: r => {\n const no = rowNoById.value.get(r.id)\n if (!no) return null\n const cut = no.lastIndexOf('.') + 1\n // 祖先前缀压暗、末段留亮:一眼读出「哪一层的第几个」,不用逐字符数点号。\n return h('span', { class: 'row-no' }, [\n cut ? h('span', { class: 'row-no__path' }, no.slice(0, cut)) : null,\n h('span', { class: 'row-no__self' }, no.slice(cut)),\n ])\n },\n },\n {\n title: () => t('menu.title'),\n key: 'title',\n search: { actions: SEARCH_ACTIONS.fuzzy },\n align: 'left', // 树列左对齐,展开缩进才好读\n // 展开箭头与每层 26px 缩进钉死在这一列。默认会落到「首个无 type 的列」= 序号列,\n // 于是缩进把序号列里的数字一层层挤出可视区(展开后序号就看不见了);缩进也只有紧贴标题才读得通。\n tree: true,\n minWidth: 240, // 让出让给缩进的宽度\n fixed: 'left', // 横向滚动时不能丢失「这是哪一行」\n render: r =>\n // inline:必须行内 —— naive 的展开箭头是 inline-flex,默认块级 NSpace 会被挤到第二行。\n h(NSpace, { inline: true, align: 'center', size: 6, wrapItem: false }, () => [\n translateMenuTitle(r.title, r.path || undefined),\n // 「隐藏」是罕见状态(种子里的目录/页面全是显示),只在为真时才占视觉 —— 省掉一整列同一个词。\n r.visible\n ? null\n : h(NTag, { size: 'tiny', bordered: false, type: 'warning' }, () => t('common.hidden')),\n ]),\n },\n // 图标独占一列:留在标题列会和树形展开箭头 + 缩进挤在一起撑破首列换行。\n {\n title: () => t('menu.icon'),\n key: 'icon',\n width: 64,\n align: 'center',\n render: r => (r.icon ? h(AppIcon, { icon: lineIcon(r.icon), size: 18 }) : null),\n },\n // 类型独占一列,不塞在标题里。按类型着色,目录/页面一眼可辨。\n {\n title: () => t('menu.type'),\n key: 'type',\n width: 90,\n render: r =>\n h(NTag, { size: 'small', bordered: false, type: typeTagType(r.type) }, () =>\n typeText(r.type),\n ),\n },\n // 路由/组件路径:管理员核对菜单时真正要看的东西,直接列出,不必点开编辑弹窗。\n // 不设权限码列 —— 树里只有目录/页面,而它俩结构上永远没有权限码(种子里全为空),\n // 那一列必然是「—」。权限码的正主在「权限按钮」弹窗里。\n {\n title: () => t('menu.path'),\n key: 'path',\n align: 'left',\n width: 160,\n ellipsis: { tooltip: true },\n render: r => cellPath(r.path),\n search: { actions: SEARCH_ACTIONS.fuzzy },\n },\n // 权限码只作搜索项:表格里不设这一列(见上),但「这个权限码归哪个页面」得能搜到 ——\n // 取值与匹配见 SEARCH_FIELDS.permission(查该节点按钮子节点的码)。\n {\n key: 'permission',\n title: () => t('menu.permission'),\n hideInTable: true,\n search: { actions: SEARCH_ACTIONS.fuzzy },\n },\n {\n title: () => t('menu.component'),\n key: 'component',\n align: 'left',\n width: 180,\n ellipsis: { tooltip: true },\n render: r => cellPath(r.component),\n },\n {\n title: () => t('menu.buttons'),\n key: 'buttons',\n width: 140,\n render: r => {\n const n = buttonInfoById.value.get(r.id)?.count ?? 0\n // 页面和目录都能「配置权限」:按钮正常挂页面下;直接挂目录下的是无页面权限项\n //(只给移动端 / 第三方调的接口),目录就是它们的权限组,角色授权界面会把它们渲染成一行。\n // 无菜单新增权限则不显示「配置权限」入口(只读用户不该看到写入口;弹窗内写按钮亦各自设门,服务端兜底)\n if (!auth.hasPerm('POST:/api/v1/sys/menu/add')) return null\n return h(\n NButton,\n {\n size: 'small',\n quaternary: true,\n type: n > 0 ? 'primary' : undefined,\n onClick: () => openButtons(r),\n },\n {\n icon: () => h(AppIcon, { icon: 'ph:shield-check', size: 15 }),\n default: () => t('menu.configPerms', { n }),\n },\n )\n },\n },\n {\n title: () => t('menu.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: 84,\n render: r =>\n h(StatusSwitch, {\n value: r.enabled,\n disabled: !auth.hasPerm('PUT:/api/v1/sys/menu/{id}'), // 启停走全量 update,无更新权限则置灰\n // 停用是一键隐藏整棵子树的重操作,先确认;启用无副作用,跳过确认(返回 null)。\n confirm: (next: boolean) => (next ? null : t('menu.disableConfirm', { title: r.title })),\n request: (next: boolean) => menuApi.update(r.id, { ...toMenuInput(r), enabled: next }),\n // 重拉而非往行对象上写:搜索态下的祖先行是 filterTree 的浅拷贝,写它不会回到源树(开关会弹回去)。\n // StatusSwitch 是悲观更新(请求成功才 emit),重拉一次就是最终态。\n 'onUpdate:value': () => {\n reload()\n syncShell() // 停用/启用即刻反映到侧边栏\n },\n }),\n },\n // 操作收敛成「编辑 + 更多▾」且 fixed:'right':4 个操作平铺会把「删除」挤到第二行、行高参差,\n // 不 fixed 的话横向滚动时整列会被裁掉够不着。\n {\n title: () => t('common.operation'),\n key: 'op',\n width: 150,\n fixed: 'right',\n render: r =>\n h(NSpace, { size: 2, wrapItem: false, justify: 'center' }, () => {\n // 「更多」里两项各自按权限码保留;都无权时整个下拉不渲染,避免空触发器。\n const canAddChild = auth.hasPerm('POST:/api/v1/sys/menu/add')\n const canDelete = auth.hasPerm('DELETE:/api/v1/sys/menu/{id}')\n const moreOptions: DropdownOption[] = [\n canAddChild && {\n key: 'addChild',\n label: t('menu.addChild'),\n icon: () => h(AppIcon, { icon: 'ph:plus', size: 16 }),\n },\n // 新增与删除之间一条分隔线;只剩一项时不画\n canAddChild && canDelete && { type: 'divider', key: 'divider' },\n canDelete && {\n key: 'delete',\n label: t('common.delete'),\n icon: () => h(AppIcon, { icon: 'ph:trash', size: 16 }),\n props: { style: 'color: var(--err)' },\n },\n ].filter(Boolean) as DropdownOption[]\n return [\n auth.hasPerm('PUT:/api/v1/sys/menu/{id}')\n ? h(\n NButton,\n {\n size: 'small',\n quaternary: true,\n type: 'primary',\n onClick: () => menuFormRef.value?.openEdit(r),\n },\n () => t('common.edit'),\n )\n : null,\n moreOptions.length\n ? h(\n NDropdown,\n {\n trigger: 'click',\n options: moreOptions,\n onSelect: (key: string) =>\n key === 'addChild' ? menuFormRef.value?.openAdd(r.id) : onDelete(r),\n },\n () =>\n h(\n NButton,\n { size: 'small', quaternary: true, type: 'primary', iconPlacement: 'right' },\n {\n default: () => t('common.more'),\n icon: () => h(AppIcon, { icon: 'ph:caret-down', size: 12 }),\n },\n ),\n )\n : null,\n ]\n }),\n },\n]\nderiveHeaderFilters(columns)\n</script>\n\n<template>\n <!-- .fill-page 是站内约定(styles/layout.css):它的 :has() 规则把路由外层 .page-view 撑到 100%,\n 页面自身 flex 列 + overflow:hidden —— 卡片吃满内容区,滚动只发生在表体里。 -->\n <div class=\"view fill-page\">\n <!-- expanded-row-keys / update:expanded-row-keys 不是 SmartTable 的 prop —— 它 inheritAttrs:false + v-bind=\"attrs\",\n 未声明的 attr 原样透传给内层 n-data-table(:loading 走的也是这条路)。 -->\n <SmartTable\n ref=\"tableRef\"\n :columns=\"columns\"\n :fetcher=\"treeFetcher\"\n :loading=\"loading\"\n row-key=\"id\"\n :pagination=\"false\"\n :search=\"{ container: 'table' }\"\n :toolbar=\"TABLE_TOOLBAR\"\n storage-key=\"sys-menu\"\n :indent=\"26\"\n fill-height\n :min-row-height=\"TABLE_MIN_ROW_HEIGHT\"\n :render-expand-icon=\"renderExpandIcon\"\n :expanded-row-keys=\"expandedKeys\"\n @update:expanded-row-keys=\"(keys: number[]) => (expandedKeys = keys)\"\n @loaded=\"onLoaded\"\n >\n <!-- 应用选择器决定「看哪个应用的菜单树」,是限定数据范围的控件而不是业务按钮,所以留在工具栏左半。 -->\n <template #toolbar>\n <n-select\n v-model:value=\"moduleFilter\"\n :options=\"filterOptions\"\n style=\"width: 200px\"\n :placeholder=\"t('menu.module')\"\n />\n </template>\n <template #toolbar-right>\n <n-button secondary @click=\"toggleExpandAll\">\n <template #icon>\n <AppIcon\n :icon=\"allExpanded ? 'ph:arrows-in-line-vertical' : 'ph:arrows-out-line-vertical'\"\n :size=\"16\"\n />\n </template>\n {{ allExpanded ? t('common.collapseAll') : t('common.expandAll') }}\n </n-button>\n <n-button\n v-auth=\"'POST:/api/v1/sys/menu/add'\"\n type=\"primary\"\n @click=\"menuFormRef?.openAdd(0)\"\n >\n <template #icon><AppIcon icon=\"ph:plus\" :size=\"16\" /></template>\n {{ t('common.add') }}\n </n-button>\n </template>\n </SmartTable>\n\n <MenuFormModal\n ref=\"menuFormRef\"\n :modules=\"modules\"\n :tree=\"tree\"\n :filtered-tree=\"filteredTree\"\n :module-filter=\"moduleFilter\"\n @saved=\"reloadTree\"\n />\n\n <ButtonManager\n ref=\"buttonMgrRef\"\n :tree=\"tree\"\n :routes=\"routes\"\n :app-prefix=\"currentAppPrefix\"\n @changed=\"reloadTree\"\n />\n </div>\n</template>\n\n<style scoped>\n.view {\n display: flex;\n flex-direction: column;\n gap: var(--gap-card);\n}\n\n/* 层级序号:字号/字族都跟标题列走(不用 12px 等宽),只借 tabular-nums 让各行点号竖着对齐;\n 前缀是祖先路径(压暗),末段才是这一行自己的号。 */\n:deep(.row-no) {\n font-variant-numeric: tabular-nums;\n white-space: nowrap;\n}\n\n:deep(.row-no__path) {\n color: var(--text-3);\n}\n\n:deep(.row-no__self) {\n color: var(--text-2);\n font-weight: var(--font-weight-medium);\n}\n\n/* 单元格里的辅助字样:路径 / 组件用等宽,排序用等宽数字,空值灰色「—」(表格单元格由库渲染,要 :deep) */\n:deep(.mono) {\n font-family: var(--font-mono);\n font-size: 13.5px;\n letter-spacing: 0;\n}\n:deep(.muted) {\n color: var(--text-2);\n}\n:deep(.faint) {\n color: var(--text-3);\n}\n:deep(.num) {\n font-variant-numeric: tabular-nums;\n}\n</style>\n"],"names":["UNASSIGNED","ALL_MODULES","t","useI18n","message","useMessage","confirm","useConfirm","auth","useAuthStore","loading","ref","tree","shallowRef","modules","moduleFilter","routes","load","menuApi","translateError","syncShell","buildRoutesForModule","onMounted","moduleApi","filterOptions","o","_a","typeText","ty","MenuType","typeTagType","moduleOptions","computed","translateMenuTitle","m","stripButtons","nodes","n","filteredTree","r","buttonInfoById","walk","btns","c","b","splitPermission","tableRef","reload","SEARCH_FIELDS","searchedResults","treeFetcher","params","items","filterTreeByParams","hasTreeCondition","expandedKeys","visibleTree","searching","onLoaded","rows","now","toRaw","expandableIds","watch","allExpanded","toggleExpandAll","currentAppPrefix","menuFormRef","buttonMgrRef","openButtons","reloadTree","onDelete","ok","renderExpandIcon","expanded","h","AppIcon","rowNoById","prefix","i","no","cellPath","v","columns","cut","SEARCH_ACTIONS","NSpace","NTag","lineIcon","NButton","StatusSwitch","next","toMenuInput","canAddChild","canDelete","moreOptions","NDropdown","key","deriveHeaderFilters","_openBlock","_createElementBlock","_hoisted_1","_createVNode","_unref","SmartTable","TABLE_TOOLBAR","TABLE_MIN_ROW_HEIGHT","_cache","keys","NSelect","$event","_createTextVNode","_toDisplayString","_createBlock","MenuFormModal","ButtonManager"],"mappings":"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"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import o from "./index2.vue.js";
|
|
2
2
|
/* empty css */
|
|
3
3
|
import t from "../../../_virtual/_plugin-vue_export-helper.js";
|
|
4
|
-
const m = /* @__PURE__ */ t(o, [["__scopeId", "data-v-
|
|
4
|
+
const m = /* @__PURE__ */ t(o, [["__scopeId", "data-v-62ef6b1d"]]);
|
|
5
5
|
export {
|
|
6
6
|
m as default
|
|
7
7
|
};
|