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,127 +1,217 @@
|
|
|
1
|
-
import { defineComponent as
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import
|
|
5
|
-
import
|
|
6
|
-
import
|
|
7
|
-
import
|
|
8
|
-
import
|
|
9
|
-
import
|
|
10
|
-
|
|
1
|
+
import { defineComponent as M, ref as L, computed as _, onMounted as j, onBeforeUnmount as J, openBlock as a, createBlock as S, unref as t, normalizeClass as $, withCtx as k, createElementVNode as f, createElementBlock as u, Fragment as C, renderList as A, createCommentVNode as v, createVNode as c, toDisplayString as y, withDirectives as m, vShow as p, Transition as W, createTextVNode as x, nextTick as Z } from "vue";
|
|
2
|
+
import { useRoute as Q, useRouter as X, onBeforeRouteLeave as Y } from "vue-router";
|
|
3
|
+
import { useMessage as ee, NCard as te, NSpin as oe, NButton as q } from "naive-ui";
|
|
4
|
+
import { useElementSize as ne } from "@vueuse/core";
|
|
5
|
+
import { useI18n as ae } from "vue-i18n";
|
|
6
|
+
import re from "../../../components/AppIcon.vue.js";
|
|
7
|
+
import { useConfirm as ie } from "../../../composables/useConfirm.js";
|
|
8
|
+
import { useAuthStore as le } from "../../../stores/auth.js";
|
|
9
|
+
import { translateError as R } from "../../../utils/error.js";
|
|
10
|
+
import { CONFIG_TABS as d, TAB_GROUPS as se, TAB_ICONS as ce } from "./groups.js";
|
|
11
|
+
import { createConfigDraft as ue, provideConfigDraft as de, checkDraft as fe } from "./draft.js";
|
|
12
|
+
import { createConfigLayout as ve, provideConfigLayout as me } from "./layoutMode.js";
|
|
13
|
+
import pe from "./components/BrandSection.vue.js";
|
|
14
|
+
import ge from "./components/SecuritySection.vue.js";
|
|
15
|
+
import be from "./components/SigninSection.vue.js";
|
|
16
|
+
import ye from "./components/WatermarkSection.vue.js";
|
|
17
|
+
import he from "./components/SensitiveSection.vue.js";
|
|
18
|
+
import _e from "./components/UploadSection.vue.js";
|
|
19
|
+
import Se from "./components/JobSection.vue.js";
|
|
20
|
+
import ke from "./components/AdvancedSection.vue.js";
|
|
21
|
+
const Ce = ["aria-label"], we = {
|
|
22
|
+
key: 0,
|
|
23
|
+
class: "gap",
|
|
24
|
+
"aria-hidden": "true"
|
|
25
|
+
}, xe = ["aria-selected", "tabindex", "data-tab", "onClick"], Te = ["title"], Be = { class: "sr-only" }, Ne = {
|
|
26
|
+
key: 0,
|
|
27
|
+
class: "cfg-loading"
|
|
28
|
+
}, ze = {
|
|
29
|
+
key: 1,
|
|
30
|
+
class: "cfg-body"
|
|
31
|
+
}, De = {
|
|
32
|
+
key: 0,
|
|
33
|
+
class: "savebar",
|
|
34
|
+
"data-testid": "config-savebar"
|
|
35
|
+
}, Ee = {
|
|
36
|
+
class: "msg",
|
|
37
|
+
role: "status",
|
|
38
|
+
"aria-live": "polite"
|
|
39
|
+
}, et = /* @__PURE__ */ M({
|
|
11
40
|
__name: "index",
|
|
12
|
-
setup(
|
|
13
|
-
const { t:
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
41
|
+
setup(Le) {
|
|
42
|
+
const { t: n } = ae(), g = ee(), { ask: U } = ie(), O = le(), w = Q(), V = X(), i = ue();
|
|
43
|
+
de(i);
|
|
44
|
+
const T = L(null), { width: I } = ne(T, { width: 0, height: 0 }, { box: "border-box" }), B = ve(I);
|
|
45
|
+
me(B);
|
|
46
|
+
const { nar: N, side: K, btn: z } = B, P = _(
|
|
47
|
+
() => N.value ? { padding: 0, position: "relative" } : {
|
|
48
|
+
padding: 0,
|
|
49
|
+
position: "relative",
|
|
50
|
+
display: "flex",
|
|
51
|
+
flexDirection: "column",
|
|
52
|
+
flex: "1 1 0",
|
|
53
|
+
minHeight: 0
|
|
54
|
+
}
|
|
55
|
+
), F = _(() => O.hasPerm("PUT:/api/v1/sys/config/batch")), h = _(() => i.dirtyKeys.value.length), D = L(null);
|
|
56
|
+
function G(e) {
|
|
57
|
+
const s = d.indexOf(o.value), l = e.key === "ArrowRight" ? (s + 1) % d.length : e.key === "ArrowLeft" ? (s - 1 + d.length) % d.length : e.key === "Home" ? 0 : e.key === "End" ? d.length - 1 : -1;
|
|
58
|
+
l < 0 || (e.preventDefault(), o.value = d[l], Z(
|
|
59
|
+
() => {
|
|
60
|
+
var b, r;
|
|
61
|
+
return (r = (b = e.currentTarget) == null ? void 0 : b.querySelector(`[data-tab="${d[l]}"]`)) == null ? void 0 : r.focus();
|
|
62
|
+
}
|
|
63
|
+
));
|
|
64
|
+
}
|
|
65
|
+
const o = _({
|
|
66
|
+
get: () => {
|
|
67
|
+
const e = w.query.tab;
|
|
68
|
+
return d.includes(e) ? e : "brand";
|
|
69
|
+
},
|
|
70
|
+
set: (e) => {
|
|
71
|
+
V.replace({ query: { ...w.query, tab: e } });
|
|
72
|
+
}
|
|
73
|
+
});
|
|
74
|
+
j(async () => {
|
|
75
|
+
try {
|
|
76
|
+
await i.load();
|
|
77
|
+
} catch (e) {
|
|
78
|
+
g.error(R(e));
|
|
79
|
+
}
|
|
80
|
+
});
|
|
81
|
+
async function H() {
|
|
82
|
+
var s;
|
|
83
|
+
const e = fe(i.values);
|
|
84
|
+
if (e.error) {
|
|
85
|
+
o.value = e.error.tab, e.error.locale && ((s = D.value) == null || s.setLocale(e.error.locale)), g.error(n(e.error.message));
|
|
86
|
+
return;
|
|
87
|
+
}
|
|
88
|
+
for (const l of e.warnings)
|
|
89
|
+
g.warning(
|
|
90
|
+
`${n(`config.login.locale${l.locale === "zh-CN" ? "Zh" : "En"}`)}: ${n(l.message)}`
|
|
91
|
+
);
|
|
92
|
+
try {
|
|
93
|
+
await i.save(), g.success(n("config.saved"));
|
|
94
|
+
} catch (l) {
|
|
95
|
+
g.error(R(l));
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
Y(async (e) => !h.value || e.path === w.path ? !0 : U({ title: n("config.leaveTitle"), content: n("config.leaveConfirm") }));
|
|
99
|
+
function E(e) {
|
|
100
|
+
h.value && e.preventDefault();
|
|
101
|
+
}
|
|
102
|
+
return window.addEventListener("beforeunload", E), J(() => {
|
|
103
|
+
window.removeEventListener("beforeunload", E), i.discard();
|
|
104
|
+
}), (e, s) => (a(), S(t(te), {
|
|
105
|
+
ref_key: "root",
|
|
106
|
+
ref: T,
|
|
107
|
+
class: $(["config-center", "fill-page", t(N) ? "fill-page--soft nar" : "fit", { side: t(K) }]),
|
|
108
|
+
"content-style": P.value
|
|
17
109
|
}, {
|
|
18
|
-
default:
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
"
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
110
|
+
default: k(() => [
|
|
111
|
+
f("nav", {
|
|
112
|
+
class: "cfg-nav",
|
|
113
|
+
role: "tablist",
|
|
114
|
+
"aria-label": t(n)("config.title"),
|
|
115
|
+
"data-testid": "config-nav",
|
|
116
|
+
onKeydown: G
|
|
117
|
+
}, [
|
|
118
|
+
(a(!0), u(C, null, A(t(se), (l, b) => (a(), u(C, { key: b }, [
|
|
119
|
+
b ? (a(), u("span", we)) : v("", !0),
|
|
120
|
+
(a(!0), u(C, null, A(l, (r) => (a(), u("button", {
|
|
121
|
+
key: r,
|
|
122
|
+
type: "button",
|
|
123
|
+
role: "tab",
|
|
124
|
+
"aria-selected": o.value === r,
|
|
125
|
+
tabindex: o.value === r ? 0 : -1,
|
|
126
|
+
class: $(["nav-item", { on: o.value === r }]),
|
|
127
|
+
"data-tab": r,
|
|
128
|
+
onClick: ($e) => o.value = r
|
|
129
|
+
}, [
|
|
130
|
+
c(re, {
|
|
131
|
+
icon: t(ce)[r],
|
|
132
|
+
size: 22
|
|
133
|
+
}, null, 8, ["icon"]),
|
|
134
|
+
f("span", null, y(t(n)(`config.tab.${r}`)), 1),
|
|
135
|
+
t(i).dirtyTabs.value.has(r) ? (a(), u(C, { key: 0 }, [
|
|
136
|
+
f("i", {
|
|
137
|
+
class: "dot",
|
|
138
|
+
"aria-hidden": "true",
|
|
139
|
+
title: t(n)("config.unsavedTab")
|
|
140
|
+
}, null, 8, Te),
|
|
141
|
+
f("span", Be, y(t(n)("config.unsavedTab")), 1)
|
|
142
|
+
], 64)) : v("", !0)
|
|
143
|
+
], 10, xe))), 128))
|
|
144
|
+
], 64))), 128))
|
|
145
|
+
], 40, Ce),
|
|
146
|
+
t(i).loading.value ? (a(), u("div", Ne, [
|
|
147
|
+
c(t(oe))
|
|
148
|
+
])) : (a(), u("div", ze, [
|
|
149
|
+
m(c(pe, {
|
|
150
|
+
ref_key: "brandSection",
|
|
151
|
+
ref: D
|
|
152
|
+
}, null, 512), [
|
|
153
|
+
[p, o.value === "brand"]
|
|
34
154
|
]),
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
e(t(o), {
|
|
38
|
-
name: "security",
|
|
39
|
-
tab: t(i)("config.tab.security"),
|
|
40
|
-
"display-directive": "show:lazy"
|
|
41
|
-
}, {
|
|
42
|
-
default: a(() => [
|
|
43
|
-
e(t(r), {
|
|
44
|
-
bordered: !1,
|
|
45
|
-
title: t(i)("config.tab.security")
|
|
46
|
-
}, {
|
|
47
|
-
default: a(() => [
|
|
48
|
-
e(s)
|
|
49
|
-
]),
|
|
50
|
-
_: 1
|
|
51
|
-
}, 8, ["title"])
|
|
155
|
+
m(c(be, null, null, 512), [
|
|
156
|
+
[p, o.value === "signin"]
|
|
52
157
|
]),
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
e(t(o), {
|
|
56
|
-
name: "externalAuth",
|
|
57
|
-
tab: t(i)("config.tab.externalAuth"),
|
|
58
|
-
"display-directive": "show:lazy"
|
|
59
|
-
}, {
|
|
60
|
-
default: a(() => [
|
|
61
|
-
e(t(r), {
|
|
62
|
-
bordered: !1,
|
|
63
|
-
title: t(i)("config.tab.externalAuth")
|
|
64
|
-
}, {
|
|
65
|
-
default: a(() => [
|
|
66
|
-
e(m)
|
|
67
|
-
]),
|
|
68
|
-
_: 1
|
|
69
|
-
}, 8, ["title"])
|
|
158
|
+
m(c(ge, null, null, 512), [
|
|
159
|
+
[p, o.value === "security"]
|
|
70
160
|
]),
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
e(t(o), {
|
|
74
|
-
name: "upload",
|
|
75
|
-
tab: t(i)("config.tab.upload"),
|
|
76
|
-
"display-directive": "show:lazy"
|
|
77
|
-
}, {
|
|
78
|
-
default: a(() => [
|
|
79
|
-
e(t(r), {
|
|
80
|
-
bordered: !1,
|
|
81
|
-
title: t(i)("config.tab.upload")
|
|
82
|
-
}, {
|
|
83
|
-
default: a(() => [
|
|
84
|
-
e(u)
|
|
85
|
-
]),
|
|
86
|
-
_: 1
|
|
87
|
-
}, 8, ["title"])
|
|
161
|
+
m(c(ye, null, null, 512), [
|
|
162
|
+
[p, o.value === "watermark"]
|
|
88
163
|
]),
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
name: "job",
|
|
93
|
-
tab: t(i)("config.tab.job"),
|
|
94
|
-
"display-directive": "show:lazy"
|
|
95
|
-
}, {
|
|
96
|
-
default: a(() => [
|
|
97
|
-
e(t(r), {
|
|
98
|
-
bordered: !1,
|
|
99
|
-
title: t(i)("config.tab.job")
|
|
100
|
-
}, {
|
|
101
|
-
default: a(() => [
|
|
102
|
-
e(_)
|
|
103
|
-
]),
|
|
104
|
-
_: 1
|
|
105
|
-
}, 8, ["title"])
|
|
164
|
+
o.value === "sensitive" ? (a(), S(he, { key: 0 })) : v("", !0),
|
|
165
|
+
m(c(_e, null, null, 512), [
|
|
166
|
+
[p, o.value === "upload"]
|
|
106
167
|
]),
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
168
|
+
m(c(Se, null, null, 512), [
|
|
169
|
+
[p, o.value === "job"]
|
|
170
|
+
]),
|
|
171
|
+
o.value === "advanced" ? (a(), S(ke, { key: 1 })) : v("", !0)
|
|
172
|
+
])),
|
|
173
|
+
c(W, { name: "savebar" }, {
|
|
174
|
+
default: k(() => [
|
|
175
|
+
h.value ? (a(), u("div", De, [
|
|
176
|
+
f("span", Ee, [
|
|
177
|
+
s[1] || (s[1] = f("i", {
|
|
178
|
+
class: "dot",
|
|
179
|
+
"aria-hidden": "true"
|
|
180
|
+
}, null, -1)),
|
|
181
|
+
x(" " + y(t(n)("config.unsaved", { n: h.value })), 1)
|
|
182
|
+
]),
|
|
183
|
+
c(t(q), {
|
|
184
|
+
size: t(z),
|
|
185
|
+
disabled: t(i).saving.value,
|
|
186
|
+
onClick: s[0] || (s[0] = (l) => t(i).discard())
|
|
187
|
+
}, {
|
|
188
|
+
default: k(() => [
|
|
189
|
+
x(y(t(n)("config.discard")), 1)
|
|
190
|
+
]),
|
|
191
|
+
_: 1
|
|
192
|
+
}, 8, ["size", "disabled"]),
|
|
193
|
+
F.value ? (a(), S(t(q), {
|
|
194
|
+
key: 0,
|
|
195
|
+
size: t(z),
|
|
196
|
+
type: "primary",
|
|
197
|
+
loading: t(i).saving.value,
|
|
198
|
+
onClick: H
|
|
199
|
+
}, {
|
|
200
|
+
default: k(() => [
|
|
201
|
+
x(y(t(n)("common.save")), 1)
|
|
202
|
+
]),
|
|
203
|
+
_: 1
|
|
204
|
+
}, 8, ["size", "loading"])) : v("", !0)
|
|
205
|
+
])) : v("", !0)
|
|
116
206
|
]),
|
|
117
207
|
_: 1
|
|
118
|
-
}
|
|
208
|
+
})
|
|
119
209
|
]),
|
|
120
210
|
_: 1
|
|
121
|
-
}));
|
|
211
|
+
}, 8, ["class", "content-style"]));
|
|
122
212
|
}
|
|
123
213
|
});
|
|
124
214
|
export {
|
|
125
|
-
|
|
215
|
+
et as default
|
|
126
216
|
};
|
|
127
217
|
//# sourceMappingURL=index2.vue.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index2.vue.js","sources":["../../../../src/views/system/config/index.vue"],"sourcesContent":["<script setup lang=\"ts\">\n// 分类配置中心:按分类 Tab 组织,一个结构化 Tab 管一个分组(见 groups.ts)。系统基础=结构化表单(字段级 UI);\n// 安全策略=锁定/密码/会话结构化表单(后端 ISecurityPolicyProvider 强制执行,改值即时生效);\n// 结构化 Tab 下方的「本组其它配置」列同组里没被字段认领的行;其他配置=不归任何结构化 Tab 的分组的扁平 CRUD 兜底。\nimport { NTabs, NTabPane, NCard } from 'naive-ui'\nimport { useI18n } from 'vue-i18n'\nimport SysBaseConfig from './components/SysBaseConfig.vue'\nimport SecurityConfig from './components/SecurityConfig.vue'\nimport ExternalAuthConfig from './components/ExternalAuthConfig.vue'\nimport UploadConfig from './components/UploadConfig.vue'\nimport JobConfig from './components/JobConfig.vue'\nimport OtherConfig from './components/OtherConfig.vue'\n\nconst { t } = useI18n()\n</script>\n\n<template>\n <!-- display-directive=\"show:lazy\":每个面板首次访问才挂载(保住懒加载),之后常驻、切走只是 v-show 隐藏。\n naive 的默认值是 'if' —— 面板一离场就销毁,而四个子面板的未保存改动全在各自的组件本地 state 里,\n 于是\"改了值 → 切个 Tab 看一眼 → 切回来\"就把改动无声吃掉了(回来还会重新拉一遍后端旧值,让人以为没改过)。\n 注意 display-directive 是 n-tab-pane 的 prop,不是 n-tabs 的,四个都得写。 -->\n <n-tabs type=\"line\" animated>\n <n-tab-pane name=\"base\" :tab=\"t('config.tab.base')\" display-directive=\"show:lazy\">\n <n-card :bordered=\"false\" :title=\"t('config.tab.base')\">\n <sys-base-config />\n </n-card>\n </n-tab-pane>\n <n-tab-pane name=\"security\" :tab=\"t('config.tab.security')\" display-directive=\"show:lazy\">\n <n-card :bordered=\"false\" :title=\"t('config.tab.security')\">\n <security-config />\n </n-card>\n </n-tab-pane>\n <n-tab-pane\n name=\"externalAuth\"\n :tab=\"t('config.tab.externalAuth')\"\n display-directive=\"show:lazy\"\n >\n <n-card :bordered=\"false\" :title=\"t('config.tab.externalAuth')\">\n <external-auth-config />\n </n-card>\n </n-tab-pane>\n <n-tab-pane name=\"upload\" :tab=\"t('config.tab.upload')\" display-directive=\"show:lazy\">\n <n-card :bordered=\"false\" :title=\"t('config.tab.upload')\">\n <upload-config />\n </n-card>\n </n-tab-pane>\n <n-tab-pane name=\"job\" :tab=\"t('config.tab.job')\" display-directive=\"show:lazy\">\n <n-card :bordered=\"false\" :title=\"t('config.tab.job')\">\n <job-config />\n </n-card>\n </n-tab-pane>\n <n-tab-pane name=\"other\" :tab=\"t('config.tab.other')\" display-directive=\"show:lazy\">\n <other-config />\n </n-tab-pane>\n </n-tabs>\n</template>\n"],"names":["t","useI18n","_createBlock","_unref","NTabs","_createVNode","NTabPane","NCard","SysBaseConfig","SecurityConfig","ExternalAuthConfig","UploadConfig","JobConfig","OtherConfig"],"mappings":";;;;;;;;;;;;AAaA,UAAM,EAAE,GAAAA,EAAA,IAAMC,EAAA;2BAQZC,EAiCSC,EAAAC,CAAA,GAAA;AAAA,MAjCD,MAAK;AAAA,MAAO,UAAA;AAAA,IAAA;iBAClB,MAIa;AAAA,QAJbC,EAIaF,EAAAG,CAAA,GAAA;AAAA,UAJD,MAAK;AAAA,UAAQ,KAAKH,EAAAH,CAAA,EAAC,iBAAA;AAAA,UAAqB,qBAAkB;AAAA,QAAA;qBACpE,MAES;AAAA,YAFTK,EAESF,EAAAI,CAAA,GAAA;AAAA,cAFA,UAAU;AAAA,cAAQ,OAAOJ,EAAAH,CAAA,EAAC,iBAAA;AAAA,YAAA;yBACjC,MAAmB;AAAA,gBAAnBK,EAAmBG,CAAA;AAAA,cAAA;;;;;;QAGvBH,EAIaF,EAAAG,CAAA,GAAA;AAAA,UAJD,MAAK;AAAA,UAAY,KAAKH,EAAAH,CAAA,EAAC,qBAAA;AAAA,UAAyB,qBAAkB;AAAA,QAAA;qBAC5E,MAES;AAAA,YAFTK,EAESF,EAAAI,CAAA,GAAA;AAAA,cAFA,UAAU;AAAA,cAAQ,OAAOJ,EAAAH,CAAA,EAAC,qBAAA;AAAA,YAAA;yBACjC,MAAmB;AAAA,gBAAnBK,EAAmBI,CAAA;AAAA,cAAA;;;;;;QAGvBJ,EAQaF,EAAAG,CAAA,GAAA;AAAA,UAPX,MAAK;AAAA,UACJ,KAAKH,EAAAH,CAAA,EAAC,yBAAA;AAAA,UACP,qBAAkB;AAAA,QAAA;qBAElB,MAES;AAAA,YAFTK,EAESF,EAAAI,CAAA,GAAA;AAAA,cAFA,UAAU;AAAA,cAAQ,OAAOJ,EAAAH,CAAA,EAAC,yBAAA;AAAA,YAAA;yBACjC,MAAwB;AAAA,gBAAxBK,EAAwBK,CAAA;AAAA,cAAA;;;;;;QAG5BL,EAIaF,EAAAG,CAAA,GAAA;AAAA,UAJD,MAAK;AAAA,UAAU,KAAKH,EAAAH,CAAA,EAAC,mBAAA;AAAA,UAAuB,qBAAkB;AAAA,QAAA;qBACxE,MAES;AAAA,YAFTK,EAESF,EAAAI,CAAA,GAAA;AAAA,cAFA,UAAU;AAAA,cAAQ,OAAOJ,EAAAH,CAAA,EAAC,mBAAA;AAAA,YAAA;yBACjC,MAAiB;AAAA,gBAAjBK,EAAiBM,CAAA;AAAA,cAAA;;;;;;QAGrBN,EAIaF,EAAAG,CAAA,GAAA;AAAA,UAJD,MAAK;AAAA,UAAO,KAAKH,EAAAH,CAAA,EAAC,gBAAA;AAAA,UAAoB,qBAAkB;AAAA,QAAA;qBAClE,MAES;AAAA,YAFTK,EAESF,EAAAI,CAAA,GAAA;AAAA,cAFA,UAAU;AAAA,cAAQ,OAAOJ,EAAAH,CAAA,EAAC,gBAAA;AAAA,YAAA;yBACjC,MAAc;AAAA,gBAAdK,EAAcO,CAAA;AAAA,cAAA;;;;;;QAGlBP,EAEaF,EAAAG,CAAA,GAAA;AAAA,UAFD,MAAK;AAAA,UAAS,KAAKH,EAAAH,CAAA,EAAC,kBAAA;AAAA,UAAsB,qBAAkB;AAAA,QAAA;qBACtE,MAAgB;AAAA,YAAhBK,EAAgBQ,CAAA;AAAA,UAAA;;;;;;;;"}
|
|
1
|
+
{"version":3,"file":"index2.vue.js","sources":["../../../../src/views/system/config/index.vue"],"sourcesContent":["<script setup lang=\"ts\">\n// 配置中心:仿 macOS「系统设置」。顶部图标页签,每个分类一屏放下、「左边设置、右边预览」\n// (没有可预览效果的分类不放预览)。结构化表单共用一份页面级草稿(draft.ts),改动由底部浮出的\n// 保存条统一保存;改过的行和页签带橙点。当前分类写进 ?tab=,刷新和分享链接能回到同一处。\nimport { computed, nextTick, onBeforeUnmount, onMounted, ref } from 'vue'\nimport { onBeforeRouteLeave, useRoute, useRouter } from 'vue-router'\nimport { NButton, NCard, NSpin, useMessage } from 'naive-ui'\nimport { useElementSize } from '@vueuse/core'\nimport { useI18n } from 'vue-i18n'\nimport AppIcon from '#/components/AppIcon.vue'\nimport { useConfirm } from '#/composables/useConfirm'\nimport { useAuthStore } from '#/stores/auth'\nimport { translateError } from '#/utils/error'\nimport { CONFIG_TABS, TAB_GROUPS, TAB_ICONS, type ConfigTab } from './groups'\nimport { checkDraft, createConfigDraft, provideConfigDraft } from './draft'\nimport { createConfigLayout, provideConfigLayout } from './layoutMode'\nimport BrandSection from './components/BrandSection.vue'\nimport SecuritySection from './components/SecuritySection.vue'\nimport SigninSection from './components/SigninSection.vue'\nimport WatermarkSection from './components/WatermarkSection.vue'\nimport SensitiveSection from './components/SensitiveSection.vue'\nimport UploadSection from './components/UploadSection.vue'\nimport JobSection from './components/JobSection.vue'\nimport AdvancedSection from './components/AdvancedSection.vue'\n\nconst { t } = useI18n()\nconst message = useMessage()\nconst { ask } = useConfirm()\nconst auth = useAuthStore()\nconst route = useRoute()\nconst router = useRouter()\n\nconst draft = createConfigDraft()\nprovideConfigDraft(draft)\n\n// 版面分档:量自己卡片的宽度(边框盒),窄档整页自然滚动,宽档分栏定高\nconst root = ref<InstanceType<typeof NCard> | null>(null)\nconst { width } = useElementSize(root, { width: 0, height: 0 }, { box: 'border-box' })\nconst layout = createConfigLayout(width)\nprovideConfigLayout(layout)\nconst { nar, side, btn } = layout\nconst contentStyle = computed(() =>\n nar.value\n ? { padding: 0, position: 'relative' as const }\n : {\n padding: 0,\n position: 'relative' as const,\n display: 'flex',\n flexDirection: 'column' as const,\n flex: '1 1 0',\n minHeight: 0,\n },\n)\nconst canSave = computed(() => auth.hasPerm('PUT:/api/v1/sys/config/batch'))\nconst dirtyCount = computed(() => draft.dirtyKeys.value.length)\nconst brandSection = ref<InstanceType<typeof BrandSection> | null>(null)\n\n/** 方向键在页签间移动并切换,焦点跟过去 */\nfunction onNavKey(e: KeyboardEvent) {\n const i = CONFIG_TABS.indexOf(tab.value)\n const next =\n e.key === 'ArrowRight'\n ? (i + 1) % CONFIG_TABS.length\n : e.key === 'ArrowLeft'\n ? (i - 1 + CONFIG_TABS.length) % CONFIG_TABS.length\n : e.key === 'Home'\n ? 0\n : e.key === 'End'\n ? CONFIG_TABS.length - 1\n : -1\n if (next < 0) return\n e.preventDefault()\n tab.value = CONFIG_TABS[next]\n void nextTick(() =>\n (e.currentTarget as HTMLElement | null)\n ?.querySelector<HTMLElement>(`[data-tab=\"${CONFIG_TABS[next]}\"]`)\n ?.focus(),\n )\n}\n\nconst tab = computed<ConfigTab>({\n get: () => {\n const q = route.query.tab\n return CONFIG_TABS.includes(q as ConfigTab) ? (q as ConfigTab) : 'brand'\n },\n set: v => {\n void router.replace({ query: { ...route.query, tab: v } })\n },\n})\n\nonMounted(async () => {\n try {\n await draft.load()\n } catch (e) {\n message.error(translateError(e))\n }\n})\n\nasync function save() {\n const check = checkDraft(draft.values)\n if (check.error) {\n tab.value = check.error.tab\n if (check.error.locale) brandSection.value?.setLocale(check.error.locale)\n message.error(t(check.error.message))\n return\n }\n for (const w of check.warnings)\n message.warning(\n `${t(`config.login.locale${w.locale === 'zh-CN' ? 'Zh' : 'En'}`)}: ${t(w.message)}`,\n )\n try {\n await draft.save()\n message.success(t('config.saved'))\n } catch (e) {\n message.error(translateError(e))\n }\n}\n\n// 有未保存改动时离开要确认;关标签页/刷新交给浏览器自己的提示\nonBeforeRouteLeave(async to => {\n if (!dirtyCount.value || to.path === route.path) return true\n return ask({ title: t('config.leaveTitle'), content: t('config.leaveConfirm') })\n})\nfunction onBeforeUnload(e: BeforeUnloadEvent) {\n if (dirtyCount.value) e.preventDefault()\n}\nwindow.addEventListener('beforeunload', onBeforeUnload)\nonBeforeUnmount(() => {\n window.removeEventListener('beforeunload', onBeforeUnload)\n draft.discard() // 释放预览用的 blob: 地址\n})\n</script>\n\n<template>\n <!-- .fill-page:整页吃满一屏(内核 styles/layout.css 的高度链),每个分类在 .cfg-body 里一屏放下。\n 窄档改 .fill-page--soft:整页自然滚动,保存条改成贴底的粘性条 -->\n <n-card\n ref=\"root\"\n :class=\"['config-center', 'fill-page', nar ? 'fill-page--soft nar' : 'fit', { side }]\"\n :content-style=\"contentStyle\"\n >\n <!-- 页签导航:role=tablist + 漫游 tabindex,方向键 / Home / End 切换(WAI-ARIA Tabs 模式) -->\n <nav\n class=\"cfg-nav\"\n role=\"tablist\"\n :aria-label=\"t('config.title')\"\n data-testid=\"config-nav\"\n @keydown=\"onNavKey\"\n >\n <template v-for=\"(group, gi) in TAB_GROUPS\" :key=\"gi\">\n <span v-if=\"gi\" class=\"gap\" aria-hidden=\"true\" />\n <button\n v-for=\"key in group\"\n :key=\"key\"\n type=\"button\"\n role=\"tab\"\n :aria-selected=\"tab === key\"\n :tabindex=\"tab === key ? 0 : -1\"\n :class=\"['nav-item', { on: tab === key }]\"\n :data-tab=\"key\"\n @click=\"tab = key\"\n >\n <AppIcon :icon=\"TAB_ICONS[key]\" :size=\"22\" />\n <span>{{ t(`config.tab.${key}`) }}</span>\n <template v-if=\"draft.dirtyTabs.value.has(key)\">\n <i class=\"dot\" aria-hidden=\"true\" :title=\"t('config.unsavedTab')\" />\n <span class=\"sr-only\">{{ t('config.unsavedTab') }}</span>\n </template>\n </button>\n </template>\n </nav>\n\n <div v-if=\"draft.loading.value\" class=\"cfg-loading\"><n-spin /></div>\n <div v-else class=\"cfg-body\">\n <BrandSection v-show=\"tab === 'brand'\" ref=\"brandSection\" />\n <SigninSection v-show=\"tab === 'signin'\" />\n <SecuritySection v-show=\"tab === 'security'\" />\n <WatermarkSection v-show=\"tab === 'watermark'\" />\n <SensitiveSection v-if=\"tab === 'sensitive'\" />\n <UploadSection v-show=\"tab === 'upload'\" />\n <JobSection v-show=\"tab === 'job'\" />\n <AdvancedSection v-if=\"tab === 'advanced'\" />\n </div>\n\n <!-- 保存条浮在底部正中(毛玻璃胶囊),有改动才出现;窄档整页在滚,改成贴底的粘性条 -->\n <transition name=\"savebar\">\n <div v-if=\"dirtyCount\" class=\"savebar\" data-testid=\"config-savebar\">\n <span class=\"msg\" role=\"status\" aria-live=\"polite\">\n <i class=\"dot\" aria-hidden=\"true\" />\n {{ t('config.unsaved', { n: dirtyCount }) }}\n </span>\n <n-button :size=\"btn\" :disabled=\"draft.saving.value\" @click=\"draft.discard()\">\n {{ t('config.discard') }}\n </n-button>\n <n-button\n v-if=\"canSave\"\n :size=\"btn\"\n type=\"primary\"\n :loading=\"draft.saving.value\"\n @click=\"save\"\n >\n {{ t('common.save') }}\n </n-button>\n </div>\n </transition>\n </n-card>\n</template>\n\n<style scoped>\n.config-center {\n /* 预览画布里「纸面」要用不透明实底色(设置行、迷你界面、规则卡都铺在半透明的 --fill 上) */\n --cfg-card: var(--color-bg-container-solid);\n --cfg-app: var(--color-bg-body);\n /* 分段控件的轨道与滑块,暗色另取 */\n --cfg-seg-track: rgba(70, 90, 130, 0.12);\n --cfg-seg-thumb: #fff;\n position: relative;\n min-width: 0;\n}\n.config-center.fit {\n overflow: hidden;\n}\n.cfg-nav {\n display: flex;\n flex: none;\n flex-wrap: wrap;\n align-items: center;\n justify-content: center;\n gap: 2px;\n padding: 8px 12px;\n border-bottom: 1px solid var(--hairline);\n}\n.gap {\n width: 14px;\n}\n.nav-item {\n position: relative;\n display: inline-flex;\n flex-direction: column;\n align-items: center;\n gap: 3px;\n min-width: 76px;\n min-height: 52px;\n padding: 6px 10px 5px;\n border: 0;\n border-radius: 9px;\n background: none;\n font: inherit;\n font-size: 13px;\n color: var(--text-2);\n cursor: pointer;\n user-select: none;\n}\n.nar .nav-item {\n min-width: 72px;\n padding: 6px 6px 5px;\n}\n.nav-item:hover {\n background: var(--hover);\n}\n.nav-item.on {\n background: var(--tab-on-bg);\n color: var(--tab-on-fg);\n}\n.nav-item.on span {\n color: var(--text-1);\n font-weight: 500;\n}\n.nav-item:focus-visible {\n outline: 2px solid var(--signal);\n outline-offset: -2px;\n}\n.nav-item .dot {\n position: absolute;\n top: 6px;\n right: 16px;\n box-shadow: 0 0 0 2px var(--cfg-card);\n}\n.sr-only {\n position: absolute;\n width: 1px;\n height: 1px;\n overflow: hidden;\n clip-path: inset(50%);\n white-space: nowrap;\n}\n.dot {\n display: inline-block;\n width: 7px;\n height: 7px;\n border-radius: 50%;\n background: var(--warn);\n}\n.cfg-loading {\n display: grid;\n flex: 1;\n min-height: 240px;\n place-items: center;\n}\n/* 内容区吃掉导航之外的全部高度;每个分类自己保证一屏放下(SectionLayout)。\n 宽档(左右分栏)内容区不滚、由两栏各自在列内滚;中档(单栏)整块在内容区里滚;窄档随页面自然滚动 */\n.cfg-body {\n flex: 1 1 0;\n min-height: 0;\n padding: 14px 20px 18px;\n}\n.fit .cfg-body {\n overflow: auto;\n}\n.fit.side .cfg-body {\n display: flex;\n flex-direction: column;\n overflow: hidden;\n}\n.side .cfg-body > :deep(.cfg-section) {\n flex: 1 1 0;\n}\n.nar .cfg-body {\n flex: none;\n padding: 12px 12px 18px;\n}\n.savebar {\n position: absolute;\n left: 50%;\n bottom: 16px;\n z-index: 10;\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n justify-content: center;\n gap: 10px;\n max-width: calc(100% - 24px);\n padding: 7px 7px 7px 16px;\n border: 1px solid var(--glass-border);\n border-radius: 14px;\n background: var(--glass-panel);\n backdrop-filter: blur(20px) saturate(170%);\n -webkit-backdrop-filter: blur(20px) saturate(170%);\n box-shadow: var(--glass-shadow);\n transform: translateX(-50%);\n}\n.nar .savebar {\n position: sticky;\n left: auto;\n bottom: 12px;\n width: fit-content;\n margin: 8px auto 12px;\n transform: none;\n}\n.savebar .msg {\n display: inline-flex;\n align-items: center;\n gap: 8px;\n margin-right: 4px;\n font-size: 14px;\n color: var(--text-2);\n white-space: nowrap;\n}\n/* 保存条:像 macOS 的浮动提示条那样减速落定,不回弹(带过冲的曲线会冲过头再弹回);退场更快收走 */\n.savebar-enter-active {\n transition:\n transform 0.28s var(--ease-sheet),\n opacity 0.2s var(--ease);\n}\n.savebar-leave-active {\n transition:\n transform 0.16s ease-in,\n opacity 0.14s ease-in;\n}\n.fit .savebar-enter-from,\n.fit .savebar-leave-to {\n transform: translate(-50%, 140%);\n opacity: 0;\n}\n.nar .savebar-enter-from,\n.nar .savebar-leave-to {\n transform: translateY(60%);\n opacity: 0;\n}\n/* 系统开了「减少动态效果」就只淡入淡出,不做位移 */\n@media (prefers-reduced-motion: reduce) {\n .savebar-enter-active,\n .savebar-leave-active {\n transition: opacity var(--transition-fast);\n }\n .fit .savebar-enter-from,\n .fit .savebar-leave-to {\n transform: translateX(-50%);\n }\n .nar .savebar-enter-from,\n .nar .savebar-leave-to {\n transform: none;\n }\n}\n/* 矮屏:收紧留白 */\n@media (max-height: 899px) {\n .cfg-nav {\n padding: 6px 12px;\n }\n .nav-item {\n min-height: 48px;\n padding: 4px 10px 3px;\n }\n .cfg-body {\n padding: 12px 20px 14px;\n }\n .nar .cfg-body {\n padding: 12px 12px 18px;\n }\n}\n</style>\n\n<style>\n/* 分段控件在深色下的轨道与滑块。必须是非 scoped:放在 scoped 块里用 :global(:root…) 写,\n 实测编译后不生效(滑块在深色下仍是白色,白字白底看不见),e2e 截图才暴露。 */\n:root[data-theme='dark'] .config-center {\n --cfg-seg-track: rgba(120, 120, 128, 0.24);\n --cfg-seg-thumb: rgba(110, 110, 116, 0.85);\n}\n</style>\n"],"names":["t","useI18n","message","useMessage","ask","useConfirm","auth","useAuthStore","route","useRoute","router","useRouter","draft","createConfigDraft","provideConfigDraft","root","ref","width","useElementSize","layout","createConfigLayout","provideConfigLayout","nar","side","btn","contentStyle","computed","canSave","dirtyCount","brandSection","onNavKey","i","CONFIG_TABS","tab","next","nextTick","_b","_a","q","v","onMounted","translateError","save","check","checkDraft","w","e","onBeforeRouteLeave","to","onBeforeUnload","onBeforeUnmount","_createBlock","_unref","NCard","_normalizeClass","_createElementVNode","_openBlock","_createElementBlock","_Fragment","_renderList","TAB_GROUPS","group","gi","_hoisted_2","key","$event","_createVNode","AppIcon","TAB_ICONS","_toDisplayString","_hoisted_5","_hoisted_6","NSpin","_hoisted_7","BrandSection","SigninSection","SecuritySection","WatermarkSection","SensitiveSection","UploadSection","JobSection","AdvancedSection","_Transition","_hoisted_8","_hoisted_9","NButton","_cache"],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { ComputedRef, Ref } from 'vue';
|
|
2
|
+
/** 卡片(边框盒)宽度低于它算窄档 */
|
|
3
|
+
export declare const NARROW_MAX = 600;
|
|
4
|
+
/** 卡片宽度达到它才左右分栏 */
|
|
5
|
+
export declare const SIDE_MIN = 896;
|
|
6
|
+
export type ControlSize = 'medium' | 'large';
|
|
7
|
+
export type SmallControlSize = 'small' | 'large';
|
|
8
|
+
export interface ConfigLayout {
|
|
9
|
+
nar: ComputedRef<boolean>;
|
|
10
|
+
side: ComputedRef<boolean>;
|
|
11
|
+
/** 输入框 / 数字框:窄档放大成 large,方便手指点 */
|
|
12
|
+
ctl: ComputedRef<ControlSize>;
|
|
13
|
+
/** 行内的小按钮、分段控件 */
|
|
14
|
+
sm: ComputedRef<SmallControlSize>;
|
|
15
|
+
/** 保存条、弹窗里的主按钮 */
|
|
16
|
+
btn: ComputedRef<ControlSize>;
|
|
17
|
+
/** 窄档下预览栏是否展开(各分类共用,切页签不收回去) */
|
|
18
|
+
previewOpen: Ref<boolean>;
|
|
19
|
+
}
|
|
20
|
+
export declare function createConfigLayout(width: Ref<number>): ConfigLayout;
|
|
21
|
+
export declare function provideConfigLayout(layout: ConfigLayout): void;
|
|
22
|
+
/** 没有祖先提供时(单独挂载某个分类)按宽屏处理 */
|
|
23
|
+
export declare function useConfigLayout(): ConfigLayout;
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { computed as o, ref as u, provide as r, inject as l } from "vue";
|
|
2
|
+
const c = 600, i = 896;
|
|
3
|
+
function f(e) {
|
|
4
|
+
const n = o(() => e.value > 0 && e.value < c), a = o(() => e.value === 0 || e.value >= i);
|
|
5
|
+
return {
|
|
6
|
+
nar: n,
|
|
7
|
+
side: a,
|
|
8
|
+
ctl: o(() => n.value ? "large" : "medium"),
|
|
9
|
+
sm: o(() => n.value ? "large" : "small"),
|
|
10
|
+
btn: o(() => n.value ? "large" : "medium"),
|
|
11
|
+
previewOpen: u(!1)
|
|
12
|
+
};
|
|
13
|
+
}
|
|
14
|
+
const t = Symbol("config-layout");
|
|
15
|
+
function s(e) {
|
|
16
|
+
r(t, e);
|
|
17
|
+
}
|
|
18
|
+
function v() {
|
|
19
|
+
return l(t, () => f(u(0)), !0);
|
|
20
|
+
}
|
|
21
|
+
export {
|
|
22
|
+
c as NARROW_MAX,
|
|
23
|
+
i as SIDE_MIN,
|
|
24
|
+
f as createConfigLayout,
|
|
25
|
+
s as provideConfigLayout,
|
|
26
|
+
v as useConfigLayout
|
|
27
|
+
};
|
|
28
|
+
//# sourceMappingURL=layoutMode.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"layoutMode.js","sources":["../../../../src/views/system/config/layoutMode.ts"],"sourcesContent":["// 配置中心的版面分档(只管样式,不碰业务):由 index.vue 量自己卡片的宽度,经 provide 下发给各分类。\n// 三档:\n// nar 卡片 < 600:整页自然滚动,设置行上下排(标签一行、控件占满一行),预览收成可展开的一条并排到最前;\n// side 卡片 ≥ 896:左边设置、右边预览,两栏各自在列内滚;\n// 其余(600 到 896):单栏,预览叠在设置下面,整块在内容区里滚。\n// 600 与表格窄档对齐(SmartTable 容器宽 < 600 即卡片列表),这样页面进入窄档时,「高级」页的表一定是卡片列表。\nimport { computed, inject, provide, ref, type ComputedRef, type InjectionKey, type Ref } from 'vue'\n\n/** 卡片(边框盒)宽度低于它算窄档 */\nexport const NARROW_MAX = 600\n/** 卡片宽度达到它才左右分栏 */\nexport const SIDE_MIN = 896\n\nexport type ControlSize = 'medium' | 'large'\nexport type SmallControlSize = 'small' | 'large'\n\nexport interface ConfigLayout {\n nar: ComputedRef<boolean>\n side: ComputedRef<boolean>\n /** 输入框 / 数字框:窄档放大成 large,方便手指点 */\n ctl: ComputedRef<ControlSize>\n /** 行内的小按钮、分段控件 */\n sm: ComputedRef<SmallControlSize>\n /** 保存条、弹窗里的主按钮 */\n btn: ComputedRef<ControlSize>\n /** 窄档下预览栏是否展开(各分类共用,切页签不收回去) */\n previewOpen: Ref<boolean>\n}\n\nexport function createConfigLayout(width: Ref<number>): ConfigLayout {\n // 宽度还没量到(0)时按宽屏处理,免得首帧闪一下窄档\n const nar = computed(() => width.value > 0 && width.value < NARROW_MAX)\n const side = computed(() => width.value === 0 || width.value >= SIDE_MIN)\n return {\n nar,\n side,\n ctl: computed(() => (nar.value ? 'large' : 'medium')),\n sm: computed(() => (nar.value ? 'large' : 'small')),\n btn: computed(() => (nar.value ? 'large' : 'medium')),\n previewOpen: ref(false),\n }\n}\n\nconst KEY: InjectionKey<ConfigLayout> = Symbol('config-layout')\n\nexport function provideConfigLayout(layout: ConfigLayout) {\n provide(KEY, layout)\n}\n\n/** 没有祖先提供时(单独挂载某个分类)按宽屏处理 */\nexport function useConfigLayout(): ConfigLayout {\n return inject(KEY, () => createConfigLayout(ref(0)), true)\n}\n"],"names":["NARROW_MAX","SIDE_MIN","createConfigLayout","width","nar","computed","side","ref","KEY","provideConfigLayout","layout","provide","useConfigLayout","inject"],"mappings":";AASO,MAAMA,IAAa,KAEbC,IAAW;AAkBjB,SAASC,EAAmBC,GAAkC;AAEnE,QAAMC,IAAMC,EAAS,MAAMF,EAAM,QAAQ,KAAKA,EAAM,QAAQH,CAAU,GAChEM,IAAOD,EAAS,MAAMF,EAAM,UAAU,KAAKA,EAAM,SAASF,CAAQ;AACxE,SAAO;AAAA,IACL,KAAAG;AAAA,IACA,MAAAE;AAAA,IACA,KAAKD,EAAS,MAAOD,EAAI,QAAQ,UAAU,QAAS;AAAA,IACpD,IAAIC,EAAS,MAAOD,EAAI,QAAQ,UAAU,OAAQ;AAAA,IAClD,KAAKC,EAAS,MAAOD,EAAI,QAAQ,UAAU,QAAS;AAAA,IACpD,aAAaG,EAAI,EAAK;AAAA,EAAA;AAE1B;AAEA,MAAMC,IAAkC,OAAO,eAAe;AAEvD,SAASC,EAAoBC,GAAsB;AACxD,EAAAC,EAAQH,GAAKE,CAAM;AACrB;AAGO,SAASE,IAAgC;AAC9C,SAAOC,EAAOL,GAAK,MAAMN,EAAmBK,EAAI,CAAC,CAAC,GAAG,EAAI;AAC3D;"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { ExternalAuthField, ExternalAuthProvider, ExternalAuthProviderSaveInput, ExternalAuthProviderTestInput } from '../../../api';
|
|
2
|
+
/** 新增 OIDC 时标识的写法:小写字母开头,字母数字与连字符,2–32 位。与后端规则一致。 */
|
|
3
|
+
export declare const CODE_PATTERN: RegExp;
|
|
4
|
+
export interface ProviderForm {
|
|
5
|
+
/** 新增(标识可填)还是编辑(标识固定) */
|
|
6
|
+
isNew: boolean;
|
|
7
|
+
code: string;
|
|
8
|
+
displayName: string;
|
|
9
|
+
/** 非机密字段当前输入 */
|
|
10
|
+
values: Record<string, string>;
|
|
11
|
+
/** 机密字段当前输入;空串 = 不改 */
|
|
12
|
+
secrets: Record<string, string>;
|
|
13
|
+
}
|
|
14
|
+
/** 用目录里已有的配置(或类型缺省值)起一份表单;`identity` 是还没存过时的标识与展示名。 */
|
|
15
|
+
export declare function createForm(fields: readonly ExternalAuthField[], saved: ExternalAuthProvider | undefined, isNew: boolean, identity: {
|
|
16
|
+
code: string;
|
|
17
|
+
displayName: string;
|
|
18
|
+
}): ProviderForm;
|
|
19
|
+
/** 改了「决定请求发往哪里」的字段(如 OIDC 的 Authority,忽略末尾 `/`)。新增不算。 */
|
|
20
|
+
export declare function endpointChanged(fields: readonly ExternalAuthField[], form: ProviderForm, saved: ExternalAuthProvider | undefined): boolean;
|
|
21
|
+
/** 这个机密字段现在必须填吗:还没配过,或者改了端点(防止把已保存的密钥发到新地址)。 */
|
|
22
|
+
export declare function secretRequired(field: ExternalAuthField, saved: ExternalAuthProvider | undefined, endpointMoved: boolean): boolean;
|
|
23
|
+
/** 缺哪些必填项(字段名列表);空数组 = 可以保存。 */
|
|
24
|
+
export declare function missingFields(fields: readonly ExternalAuthField[], form: ProviderForm, saved: ExternalAuthProvider | undefined): string[];
|
|
25
|
+
/** 保存入参:非机密进 values,机密进 secrets(后端按名字对操作日志打码,别混放)。 */
|
|
26
|
+
export declare function buildSaveBody(type: string, form: ProviderForm): ExternalAuthProviderSaveInput;
|
|
27
|
+
/** 测试入参:用表单里的值;库里已有这条时带上 code,机密留空则取已保存的。 */
|
|
28
|
+
export declare function buildTestBody(type: string, form: ProviderForm, saved: ExternalAuthProvider | undefined): ExternalAuthProviderTestInput;
|
|
29
|
+
/**
|
|
30
|
+
* 要填到厂商后台的回调地址:后端给的模板里把 `{code}` 换成标识(新增时标识没填,保留占位)。
|
|
31
|
+
* 没配回调基址时模板为空串,返回空串,由页面提示。
|
|
32
|
+
*/
|
|
33
|
+
export declare function callbackFor(template: string, code: string): string;
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
const a = /^[a-z][a-z0-9-]{1,31}$/;
|
|
2
|
+
function f(n, e, t, c) {
|
|
3
|
+
const i = {}, u = {};
|
|
4
|
+
for (const s of n)
|
|
5
|
+
s.secret ? u[s.name] = "" : i[s.name] = (e == null ? void 0 : e.values[s.name]) ?? s.default ?? "";
|
|
6
|
+
return {
|
|
7
|
+
isNew: t,
|
|
8
|
+
code: (e == null ? void 0 : e.code) ?? c.code,
|
|
9
|
+
displayName: (e == null ? void 0 : e.displayName) ?? c.displayName,
|
|
10
|
+
values: i,
|
|
11
|
+
secrets: u
|
|
12
|
+
};
|
|
13
|
+
}
|
|
14
|
+
const o = (n) => (n ?? "").trim().replace(/\/+$/, "");
|
|
15
|
+
function m(n, e, t) {
|
|
16
|
+
return e.isNew || !t ? !1 : n.some(
|
|
17
|
+
(c) => c.definesEndpoint && o(e.values[c.name]) !== o(t.values[c.name])
|
|
18
|
+
);
|
|
19
|
+
}
|
|
20
|
+
function p(n, e, t) {
|
|
21
|
+
var c;
|
|
22
|
+
return n.secret ? !((c = e == null ? void 0 : e.secrets[n.name]) != null && c.hasValue) || t : !1;
|
|
23
|
+
}
|
|
24
|
+
function N(n, e, t) {
|
|
25
|
+
var u, s;
|
|
26
|
+
const c = m(n, e, t), i = [];
|
|
27
|
+
e.isNew && (e.displayName.trim() || i.push("displayName"), a.test(e.code) || i.push("code"));
|
|
28
|
+
for (const r of n)
|
|
29
|
+
r.secret ? p(r, t, c) && !((u = e.secrets[r.name]) != null && u.trim()) && i.push(r.name) : r.required && !((s = e.values[r.name]) != null && s.trim()) && i.push(r.name);
|
|
30
|
+
return i;
|
|
31
|
+
}
|
|
32
|
+
const l = (n) => Object.fromEntries(Object.entries(n).map(([e, t]) => [e, t.trim()]));
|
|
33
|
+
function d(n, e) {
|
|
34
|
+
return {
|
|
35
|
+
type: n,
|
|
36
|
+
displayName: e.displayName.trim() || null,
|
|
37
|
+
icon: null,
|
|
38
|
+
values: l(e.values),
|
|
39
|
+
secrets: l(e.secrets)
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
function y(n, e, t) {
|
|
43
|
+
return {
|
|
44
|
+
code: t ? e.code : null,
|
|
45
|
+
type: n,
|
|
46
|
+
values: l(e.values),
|
|
47
|
+
secrets: l(e.secrets)
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
function h(n, e) {
|
|
51
|
+
return n.replace("{code}", e || "{code}");
|
|
52
|
+
}
|
|
53
|
+
export {
|
|
54
|
+
a as CODE_PATTERN,
|
|
55
|
+
d as buildSaveBody,
|
|
56
|
+
y as buildTestBody,
|
|
57
|
+
h as callbackFor,
|
|
58
|
+
f as createForm,
|
|
59
|
+
m as endpointChanged,
|
|
60
|
+
N as missingFields,
|
|
61
|
+
p as secretRequired
|
|
62
|
+
};
|
|
63
|
+
//# sourceMappingURL=providerForm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"providerForm.js","sources":["../../../../src/views/system/config/providerForm.ts"],"sourcesContent":["// 第三方登录设置面板的表单规则(纯函数,vitest 直接驱动)。\n// 字段清单来自后端类型目录:非机密字段回显,机密字段只有「已配置 + 尾四位」,留空表示不改。\nimport type {\n ExternalAuthField,\n ExternalAuthProvider,\n ExternalAuthProviderSaveInput,\n ExternalAuthProviderTestInput,\n} from '#/api'\n\n/** 新增 OIDC 时标识的写法:小写字母开头,字母数字与连字符,2–32 位。与后端规则一致。 */\nexport const CODE_PATTERN = /^[a-z][a-z0-9-]{1,31}$/\n\nexport interface ProviderForm {\n /** 新增(标识可填)还是编辑(标识固定) */\n isNew: boolean\n code: string\n displayName: string\n /** 非机密字段当前输入 */\n values: Record<string, string>\n /** 机密字段当前输入;空串 = 不改 */\n secrets: Record<string, string>\n}\n\n/** 用目录里已有的配置(或类型缺省值)起一份表单;`identity` 是还没存过时的标识与展示名。 */\nexport function createForm(\n fields: readonly ExternalAuthField[],\n saved: ExternalAuthProvider | undefined,\n isNew: boolean,\n identity: { code: string; displayName: string },\n): ProviderForm {\n const values: Record<string, string> = {}\n const secrets: Record<string, string> = {}\n for (const f of fields) {\n if (f.secret) secrets[f.name] = ''\n else values[f.name] = saved?.values[f.name] ?? f.default ?? ''\n }\n return {\n isNew,\n code: saved?.code ?? identity.code,\n displayName: saved?.displayName ?? identity.displayName,\n values,\n secrets,\n }\n}\n\nconst normEndpoint = (v: string | undefined) => (v ?? '').trim().replace(/\\/+$/, '')\n\n/** 改了「决定请求发往哪里」的字段(如 OIDC 的 Authority,忽略末尾 `/`)。新增不算。 */\nexport function endpointChanged(\n fields: readonly ExternalAuthField[],\n form: ProviderForm,\n saved: ExternalAuthProvider | undefined,\n): boolean {\n if (form.isNew || !saved) return false\n return fields.some(\n f =>\n f.definesEndpoint && normEndpoint(form.values[f.name]) !== normEndpoint(saved.values[f.name]),\n )\n}\n\n/** 这个机密字段现在必须填吗:还没配过,或者改了端点(防止把已保存的密钥发到新地址)。 */\nexport function secretRequired(\n field: ExternalAuthField,\n saved: ExternalAuthProvider | undefined,\n endpointMoved: boolean,\n): boolean {\n if (!field.secret) return false\n return !saved?.secrets[field.name]?.hasValue || endpointMoved\n}\n\n/** 缺哪些必填项(字段名列表);空数组 = 可以保存。 */\nexport function missingFields(\n fields: readonly ExternalAuthField[],\n form: ProviderForm,\n saved: ExternalAuthProvider | undefined,\n): string[] {\n const moved = endpointChanged(fields, form, saved)\n const missing: string[] = []\n if (form.isNew) {\n if (!form.displayName.trim()) missing.push('displayName')\n if (!CODE_PATTERN.test(form.code)) missing.push('code')\n }\n for (const f of fields) {\n if (f.secret) {\n if (secretRequired(f, saved, moved) && !form.secrets[f.name]?.trim()) missing.push(f.name)\n } else if (f.required && !form.values[f.name]?.trim()) {\n missing.push(f.name)\n }\n }\n return missing\n}\n\nconst trimmed = (src: Record<string, string>) =>\n Object.fromEntries(Object.entries(src).map(([k, v]) => [k, v.trim()]))\n\n/** 保存入参:非机密进 values,机密进 secrets(后端按名字对操作日志打码,别混放)。 */\nexport function buildSaveBody(type: string, form: ProviderForm): ExternalAuthProviderSaveInput {\n return {\n type,\n displayName: form.displayName.trim() || null,\n icon: null,\n values: trimmed(form.values),\n secrets: trimmed(form.secrets),\n }\n}\n\n/** 测试入参:用表单里的值;库里已有这条时带上 code,机密留空则取已保存的。 */\nexport function buildTestBody(\n type: string,\n form: ProviderForm,\n saved: ExternalAuthProvider | undefined,\n): ExternalAuthProviderTestInput {\n return {\n code: saved ? form.code : null,\n type,\n values: trimmed(form.values),\n secrets: trimmed(form.secrets),\n }\n}\n\n/**\n * 要填到厂商后台的回调地址:后端给的模板里把 `{code}` 换成标识(新增时标识没填,保留占位)。\n * 没配回调基址时模板为空串,返回空串,由页面提示。\n */\nexport function callbackFor(template: string, code: string): string {\n return template.replace('{code}', code || '{code}')\n}\n"],"names":["CODE_PATTERN","createForm","fields","saved","isNew","identity","values","secrets","f","normEndpoint","v","endpointChanged","form","secretRequired","field","endpointMoved","_a","missingFields","_b","moved","missing","trimmed","src","k","buildSaveBody","type","buildTestBody","callbackFor","template","code"],"mappings":"AAUO,MAAMA,IAAe;AAcrB,SAASC,EACdC,GACAC,GACAC,GACAC,GACc;AACd,QAAMC,IAAiC,CAAA,GACjCC,IAAkC,CAAA;AACxC,aAAWC,KAAKN;AACd,IAAIM,EAAE,SAAQD,EAAQC,EAAE,IAAI,IAAI,KAC3BF,EAAOE,EAAE,IAAI,KAAIL,KAAA,gBAAAA,EAAO,OAAOK,EAAE,UAASA,EAAE,WAAW;AAE9D,SAAO;AAAA,IACL,OAAAJ;AAAA,IACA,OAAMD,KAAA,gBAAAA,EAAO,SAAQE,EAAS;AAAA,IAC9B,cAAaF,KAAA,gBAAAA,EAAO,gBAAeE,EAAS;AAAA,IAC5C,QAAAC;AAAA,IACA,SAAAC;AAAA,EAAA;AAEJ;AAEA,MAAME,IAAe,CAACC,OAA2BA,KAAK,IAAI,OAAO,QAAQ,QAAQ,EAAE;AAG5E,SAASC,EACdT,GACAU,GACAT,GACS;AACT,SAAIS,EAAK,SAAS,CAACT,IAAc,KAC1BD,EAAO;AAAA,IACZ,CAAAM,MACEA,EAAE,mBAAmBC,EAAaG,EAAK,OAAOJ,EAAE,IAAI,CAAC,MAAMC,EAAaN,EAAM,OAAOK,EAAE,IAAI,CAAC;AAAA,EAAA;AAElG;AAGO,SAASK,EACdC,GACAX,GACAY,GACS;AAvDJ,MAAAC;AAwDL,SAAKF,EAAM,SACJ,GAACE,IAAAb,KAAA,gBAAAA,EAAO,QAAQW,EAAM,UAArB,QAAAE,EAA4B,aAAYD,IADtB;AAE5B;AAGO,SAASE,EACdf,GACAU,GACAT,GACU;AAjEL,MAAAa,GAAAE;AAkEL,QAAMC,IAAQR,EAAgBT,GAAQU,GAAMT,CAAK,GAC3CiB,IAAoB,CAAA;AAC1B,EAAIR,EAAK,UACFA,EAAK,YAAY,UAAQQ,EAAQ,KAAK,aAAa,GACnDpB,EAAa,KAAKY,EAAK,IAAI,KAAGQ,EAAQ,KAAK,MAAM;AAExD,aAAWZ,KAAKN;AACd,IAAIM,EAAE,SACAK,EAAeL,GAAGL,GAAOgB,CAAK,KAAK,GAACH,IAAAJ,EAAK,QAAQJ,EAAE,IAAI,MAAnB,QAAAQ,EAAsB,WAAQI,EAAQ,KAAKZ,EAAE,IAAI,IAChFA,EAAE,YAAY,GAACU,IAAAN,EAAK,OAAOJ,EAAE,IAAI,MAAlB,QAAAU,EAAqB,WAC7CE,EAAQ,KAAKZ,EAAE,IAAI;AAGvB,SAAOY;AACT;AAEA,MAAMC,IAAU,CAACC,MACf,OAAO,YAAY,OAAO,QAAQA,CAAG,EAAE,IAAI,CAAC,CAACC,GAAGb,CAAC,MAAM,CAACa,GAAGb,EAAE,KAAA,CAAM,CAAC,CAAC;AAGhE,SAASc,EAAcC,GAAcb,GAAmD;AAC7F,SAAO;AAAA,IACL,MAAAa;AAAA,IACA,aAAab,EAAK,YAAY,KAAA,KAAU;AAAA,IACxC,MAAM;AAAA,IACN,QAAQS,EAAQT,EAAK,MAAM;AAAA,IAC3B,SAASS,EAAQT,EAAK,OAAO;AAAA,EAAA;AAEjC;AAGO,SAASc,EACdD,GACAb,GACAT,GAC+B;AAC/B,SAAO;AAAA,IACL,MAAMA,IAAQS,EAAK,OAAO;AAAA,IAC1B,MAAAa;AAAA,IACA,QAAQJ,EAAQT,EAAK,MAAM;AAAA,IAC3B,SAASS,EAAQT,EAAK,OAAO;AAAA,EAAA;AAEjC;AAMO,SAASe,EAAYC,GAAkBC,GAAsB;AAClE,SAAOD,EAAS,QAAQ,UAAUC,KAAQ,QAAQ;AACpD;"}
|
|
@@ -1,8 +1,8 @@
|
|
|
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
|
|
4
|
+
const m = /* @__PURE__ */ t(o, [["__scopeId", "data-v-3ddc0a11"]]);
|
|
5
5
|
export {
|
|
6
|
-
|
|
6
|
+
m as default
|
|
7
7
|
};
|
|
8
8
|
//# sourceMappingURL=index.vue.js.map
|