smart-admin-web 10.15.0 → 10.20.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/dist/api/index.d.ts +4 -2
- package/dist/api/index.js +1 -1
- package/dist/api/index.js.map +1 -1
- package/dist/api/schema.d.ts +39 -5
- package/dist/assets/icons/ph-subset.json.js +5 -5
- 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/TableTotal/index.vue.d.ts +6 -0
- 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/useModule.js +39 -29
- package/dist/composables/useModule.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 +15 -0
- package/dist/composables/useSite.js +16 -14
- 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 +219 -205
- 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 +19 -18
- 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/loginHero.d.ts +2 -2
- package/dist/lib/loginHero.js.map +1 -1
- package/dist/lib/runtime.js +1 -1
- 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 +221 -15
- package/dist/locales/en-US.js +230 -21
- 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 +221 -15
- package/dist/locales/zh-CN.js +238 -28
- 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 +8 -8
- 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 +407 -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.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.js +3 -3
- package/dist/views/login/components/LoginHeroPanel2.vue.js +34 -39
- package/dist/views/login/components/LoginHeroPanel2.vue.js.map +1 -1
- 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 +2 -2
- package/dist/views/system/config/components/AdminMock2.vue.js +60 -43
- package/dist/views/system/config/components/AdminMock2.vue.js.map +1 -1
- package/dist/views/system/config/components/AdvancedSection.vue.js +5 -2
- package/dist/views/system/config/components/AdvancedSection.vue.js.map +1 -1
- package/dist/views/system/config/components/AdvancedSection2.vue.js +98 -70
- package/dist/views/system/config/components/AdvancedSection2.vue.js.map +1 -1
- package/dist/views/system/config/components/BrandSection.vue.js +2 -2
- package/dist/views/system/config/components/BrandSection2.vue.js +121 -119
- package/dist/views/system/config/components/BrandSection2.vue.js.map +1 -1
- package/dist/views/system/config/components/CfgGroup.vue.js +3 -3
- package/dist/views/system/config/components/CfgGroup2.vue.js.map +1 -1
- package/dist/views/system/config/components/CfgRow.vue.js +1 -1
- package/dist/views/system/config/components/CfgRow2.vue.js +24 -23
- package/dist/views/system/config/components/CfgRow2.vue.js.map +1 -1
- package/dist/views/system/config/components/CfgSegment.vue.js +1 -1
- package/dist/views/system/config/components/CfgSegment2.vue.js +16 -15
- package/dist/views/system/config/components/CfgSegment2.vue.js.map +1 -1
- package/dist/views/system/config/components/ConfigFormModal.vue.js +2 -2
- package/dist/views/system/config/components/ConfigFormModal2.vue.js +35 -33
- package/dist/views/system/config/components/ConfigFormModal2.vue.js.map +1 -1
- package/dist/views/system/config/components/JobSection.vue.js +2 -2
- package/dist/views/system/config/components/JobSection2.vue.js +46 -44
- package/dist/views/system/config/components/JobSection2.vue.js.map +1 -1
- package/dist/views/system/config/components/LoginMock.vue.js +3 -3
- package/dist/views/system/config/components/LoginMock2.vue.js +83 -72
- package/dist/views/system/config/components/LoginMock2.vue.js.map +1 -1
- package/dist/views/system/config/components/LogoCropper.vue.js +1 -1
- package/dist/views/system/config/components/LogoCropper2.vue.js.map +1 -1
- package/dist/views/system/config/components/LogoEditor.vue.js +2 -2
- package/dist/views/system/config/components/LogoEditor2.vue.js +11 -13
- package/dist/views/system/config/components/LogoEditor2.vue.js.map +1 -1
- package/dist/views/system/config/components/ProviderSheet.vue.js +3 -3
- package/dist/views/system/config/components/ProviderSheet2.vue.js.map +1 -1
- package/dist/views/system/config/components/SectionLayout.vue.d.ts +4 -2
- package/dist/views/system/config/components/SectionLayout.vue.js +2 -2
- package/dist/views/system/config/components/SectionLayout2.vue.js +51 -27
- package/dist/views/system/config/components/SectionLayout2.vue.js.map +1 -1
- package/dist/views/system/config/components/SecuritySection.vue.js +2 -2
- package/dist/views/system/config/components/SecuritySection2.vue.js +207 -206
- package/dist/views/system/config/components/SecuritySection2.vue.js.map +1 -1
- package/dist/views/system/config/components/SensitiveSection.vue.js +2 -2
- package/dist/views/system/config/components/SensitiveSection2.vue.js +107 -102
- package/dist/views/system/config/components/SensitiveSection2.vue.js.map +1 -1
- package/dist/views/system/config/components/UploadSection.vue.js +2 -2
- package/dist/views/system/config/components/UploadSection2.vue.js +86 -77
- package/dist/views/system/config/components/UploadSection2.vue.js.map +1 -1
- 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 +2 -2
- package/dist/views/system/config/draft.js.map +1 -1
- package/dist/views/system/config/groups.d.ts +4 -1
- package/dist/views/system/config/groups.js +54 -49
- package/dist/views/system/config/groups.js.map +1 -1
- package/dist/views/system/config/index.vue.js +3 -2
- package/dist/views/system/config/index.vue.js.map +1 -1
- package/dist/views/system/config/index2.vue.js +173 -148
- 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/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 +3 -5
- 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.d.ts +0 -16
- 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.d.ts +0 -3
- 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 -65
- package/dist/views/login/skins/SplitPanel2.vue.js.map +0 -1
- package/dist/views/login/skins/Spotlight.vue.d.ts +0 -3
- 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/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/WatermarkSection.vue.d.ts} +0 -0
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
import { use as
|
|
2
|
-
import { CanvasRenderer as
|
|
1
|
+
import { use as i } from "echarts/core";
|
|
2
|
+
import { CanvasRenderer as c } from "echarts/renderers";
|
|
3
3
|
import { LineChart as m, BarChart as s, PieChart as p, GaugeChart as C, RadarChart as x, ScatterChart as d } from "echarts/charts";
|
|
4
|
-
import { TitleComponent as u, TooltipComponent as y, LegendComponent as
|
|
5
|
-
|
|
6
|
-
|
|
4
|
+
import { TitleComponent as u, TooltipComponent as y, LegendComponent as h, GridComponent as S, DataZoomComponent as g, ToolboxComponent as b } from "echarts/components";
|
|
5
|
+
i([
|
|
6
|
+
c,
|
|
7
7
|
m,
|
|
8
8
|
s,
|
|
9
9
|
p,
|
|
@@ -12,33 +12,28 @@ a([
|
|
|
12
12
|
d,
|
|
13
13
|
u,
|
|
14
14
|
y,
|
|
15
|
-
g,
|
|
16
|
-
S,
|
|
17
15
|
h,
|
|
18
|
-
|
|
16
|
+
S,
|
|
17
|
+
g,
|
|
18
|
+
b
|
|
19
19
|
]);
|
|
20
20
|
function k() {
|
|
21
|
-
const
|
|
21
|
+
const l = getComputedStyle(document.documentElement), o = (r) => l.getPropertyValue(r).trim(), t = o("--color-text-secondary"), a = o("--color-text-primary"), e = o("--color-border"), n = {
|
|
22
22
|
axisLine: { lineStyle: { color: e } },
|
|
23
23
|
axisTick: { lineStyle: { color: e } },
|
|
24
24
|
axisLabel: { color: t },
|
|
25
25
|
splitLine: { lineStyle: { color: e } }
|
|
26
26
|
};
|
|
27
27
|
return {
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
o("--color-warning"),
|
|
32
|
-
o("--color-danger"),
|
|
33
|
-
o("--color-info"),
|
|
34
|
-
"#7C5CFF"
|
|
35
|
-
],
|
|
28
|
+
// 数据色 = 强调色的邻近色相(--chart-1..6,由 useTheme 随强调色与明暗写到 <html>);
|
|
29
|
+
// 不用状态语义色(--color-success / warning / danger):绿 / 棕 / 红在蓝色主题里既不搭,又暗示「正常 / 警告 / 出错」。
|
|
30
|
+
color: [1, 2, 3, 4, 5, 6].map((r) => o(`--chart-${r}`)),
|
|
36
31
|
backgroundColor: "transparent",
|
|
37
32
|
textStyle: { color: t },
|
|
38
|
-
title: { textStyle: { color:
|
|
33
|
+
title: { textStyle: { color: a } },
|
|
39
34
|
legend: { textStyle: { color: t } },
|
|
40
|
-
categoryAxis:
|
|
41
|
-
valueAxis:
|
|
35
|
+
categoryAxis: n,
|
|
36
|
+
valueAxis: n
|
|
42
37
|
};
|
|
43
38
|
}
|
|
44
39
|
export {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"echarts.js","sources":["../../../src/components/Chart/echarts.ts"],"sourcesContent":["// ECharts 按需注册 + 主题构建(BaseChart 的运行时基座)。\n// 新增图种/组件时在下方 use([...]) 加一行即可,不引 echarts 全量 → 控包体。\nimport { use } from 'echarts/core'\nimport { CanvasRenderer } from 'echarts/renderers'\nimport { LineChart, BarChart, PieChart, GaugeChart, RadarChart, ScatterChart } from 'echarts/charts'\nimport {\n TitleComponent,\n TooltipComponent,\n LegendComponent,\n GridComponent,\n DataZoomComponent,\n ToolboxComponent,\n} from 'echarts/components'\n\nuse([\n CanvasRenderer,\n LineChart,\n BarChart,\n PieChart,\n GaugeChart,\n RadarChart,\n ScatterChart,\n TitleComponent,\n TooltipComponent,\n LegendComponent,\n GridComponent,\n DataZoomComponent,\n ToolboxComponent,\n])\n\n// 从 CSS tokens 现读一套 echarts 主题对象。单一色源 = tokens:\n// 明暗切换 / accent 换色都由 useTheme 写 <html> 的 CSS 变量,这里现读即随之变。\n// 调用点用 computed 显式依赖 app.isDark / app.accent 触发重算(见 index.vue)。\nexport function buildEChartsTheme() {\n const css = getComputedStyle(document.documentElement)\n const v = (name: string) => css.getPropertyValue(name).trim()\n const text = v('--color-text-secondary')\n const textStrong = v('--color-text-primary')\n const line = v('--color-border')\n const axis = {\n axisLine: { lineStyle: { color: line } },\n axisTick: { lineStyle: { color: line } },\n axisLabel: { color: text },\n splitLine: { lineStyle: { color: line } },\n }\n return {\n
|
|
1
|
+
{"version":3,"file":"echarts.js","sources":["../../../src/components/Chart/echarts.ts"],"sourcesContent":["// ECharts 按需注册 + 主题构建(BaseChart 的运行时基座)。\n// 新增图种/组件时在下方 use([...]) 加一行即可,不引 echarts 全量 → 控包体。\nimport { use } from 'echarts/core'\nimport { CanvasRenderer } from 'echarts/renderers'\nimport { LineChart, BarChart, PieChart, GaugeChart, RadarChart, ScatterChart } from 'echarts/charts'\nimport {\n TitleComponent,\n TooltipComponent,\n LegendComponent,\n GridComponent,\n DataZoomComponent,\n ToolboxComponent,\n} from 'echarts/components'\n\nuse([\n CanvasRenderer,\n LineChart,\n BarChart,\n PieChart,\n GaugeChart,\n RadarChart,\n ScatterChart,\n TitleComponent,\n TooltipComponent,\n LegendComponent,\n GridComponent,\n DataZoomComponent,\n ToolboxComponent,\n])\n\n// 从 CSS tokens 现读一套 echarts 主题对象。单一色源 = tokens:\n// 明暗切换 / accent 换色都由 useTheme 写 <html> 的 CSS 变量,这里现读即随之变。\n// 调用点用 computed 显式依赖 app.isDark / app.accent 触发重算(见 index.vue)。\nexport function buildEChartsTheme() {\n const css = getComputedStyle(document.documentElement)\n const v = (name: string) => css.getPropertyValue(name).trim()\n const text = v('--color-text-secondary')\n const textStrong = v('--color-text-primary')\n const line = v('--color-border')\n const axis = {\n axisLine: { lineStyle: { color: line } },\n axisTick: { lineStyle: { color: line } },\n axisLabel: { color: text },\n splitLine: { lineStyle: { color: line } },\n }\n return {\n // 数据色 = 强调色的邻近色相(--chart-1..6,由 useTheme 随强调色与明暗写到 <html>);\n // 不用状态语义色(--color-success / warning / danger):绿 / 棕 / 红在蓝色主题里既不搭,又暗示「正常 / 警告 / 出错」。\n color: [1, 2, 3, 4, 5, 6].map(i => v(`--chart-${i}`)),\n backgroundColor: 'transparent',\n textStyle: { color: text },\n title: { textStyle: { color: textStrong } },\n legend: { textStyle: { color: text } },\n categoryAxis: axis,\n valueAxis: axis,\n }\n}\n"],"names":["use","CanvasRenderer","LineChart","BarChart","PieChart","GaugeChart","RadarChart","ScatterChart","TitleComponent","TooltipComponent","LegendComponent","GridComponent","DataZoomComponent","ToolboxComponent","buildEChartsTheme","css","v","name","text","textStrong","line","axis","i"],"mappings":";;;;AAcAA,EAAI;AAAA,EACFC;AAAA,EACAC;AAAA,EACAC;AAAA,EACAC;AAAA,EACAC;AAAA,EACAC;AAAA,EACAC;AAAA,EACAC;AAAA,EACAC;AAAA,EACAC;AAAA,EACAC;AAAA,EACAC;AAAA,EACAC;AACF,CAAC;AAKM,SAASC,IAAoB;AAClC,QAAMC,IAAM,iBAAiB,SAAS,eAAe,GAC/CC,IAAI,CAACC,MAAiBF,EAAI,iBAAiBE,CAAI,EAAE,KAAA,GACjDC,IAAOF,EAAE,wBAAwB,GACjCG,IAAaH,EAAE,sBAAsB,GACrCI,IAAOJ,EAAE,gBAAgB,GACzBK,IAAO;AAAA,IACX,UAAU,EAAE,WAAW,EAAE,OAAOD,IAAK;AAAA,IACrC,UAAU,EAAE,WAAW,EAAE,OAAOA,IAAK;AAAA,IACrC,WAAW,EAAE,OAAOF,EAAA;AAAA,IACpB,WAAW,EAAE,WAAW,EAAE,OAAOE,IAAK;AAAA,EAAE;AAE1C,SAAO;AAAA;AAAA;AAAA,IAGL,OAAO,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC,EAAE,IAAI,CAAAE,MAAKN,EAAE,WAAWM,CAAC,EAAE,CAAC;AAAA,IACpD,iBAAiB;AAAA,IACjB,WAAW,EAAE,OAAOJ,EAAA;AAAA,IACpB,OAAO,EAAE,WAAW,EAAE,OAAOC,IAAW;AAAA,IACxC,QAAQ,EAAE,WAAW,EAAE,OAAOD,IAAK;AAAA,IACnC,cAAcG;AAAA,IACd,WAAWA;AAAA,EAAA;AAEf;"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import o from "./index2.vue.js";
|
|
2
2
|
/* empty css */
|
|
3
3
|
import r from "../../_virtual/_plugin-vue_export-helper.js";
|
|
4
|
-
const p = /* @__PURE__ */ r(o, [["__scopeId", "data-v-
|
|
4
|
+
const p = /* @__PURE__ */ r(o, [["__scopeId", "data-v-f39c0e4b"]]);
|
|
5
5
|
export {
|
|
6
6
|
p as default
|
|
7
7
|
};
|
|
@@ -7,7 +7,7 @@ import { translateError as ue } from "../../utils/error.js";
|
|
|
7
7
|
const me = { class: "cron-editor" }, pe = { class: "cron-row" }, ve = {
|
|
8
8
|
key: 0,
|
|
9
9
|
class: "cron-row"
|
|
10
|
-
}, fe = { class: "cron-row" }, ye = { class: "cron-sep" }, be = { class: "cron-row" }, _e = { class: "cron-sep" }, he = { class: "cron-sep" }, we = { class: "cron-row cron-row-list" }, ke = { class: "cron-row" }, xe = { class: "cron-
|
|
10
|
+
}, fe = { class: "cron-row" }, ye = { class: "cron-sep" }, be = { class: "cron-row" }, _e = { class: "cron-sep" }, he = { class: "cron-sep" }, we = { class: "cron-row cron-row-list" }, ke = { class: "cron-row" }, xe = { class: "cron-faint" }, je = { class: "cron-row" }, Ue = { class: "cron-faint" }, Oe = { class: "cron-row" }, De = { class: "cron-row" }, We = { class: "cron-row" }, Ne = { class: "cron-sep" }, Se = { class: "cron-sep" }, ze = { class: "cron-hint" }, $e = {
|
|
11
11
|
key: 0,
|
|
12
12
|
class: "cron-preview"
|
|
13
13
|
}, Ee = {
|
|
@@ -480,6 +480,7 @@ const me = { class: "cron-editor" }, pe = { class: "cron-row" }, ve = {
|
|
|
480
480
|
default: d(() => [
|
|
481
481
|
r(n(le), {
|
|
482
482
|
value: y.value,
|
|
483
|
+
class: "mono",
|
|
483
484
|
placeholder: n(s)("job.cron.expressionPlaceholder"),
|
|
484
485
|
"onUpdate:value": g
|
|
485
486
|
}, null, 8, ["value", "placeholder"]),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index2.vue.js","sources":["../../../src/components/CronEditor/index.vue"],"sourcesContent":["<script setup lang=\"ts\">\n// 6 段秒级 cron 可视化编辑器(秒/分/时/日/月/周 + 表达式直填)。\n// 后端语法为准(SmartAdmin.Core CronExpression):日段 L/L-n/LW/nW、周段 nL/n#m、周 0=周日(7≡0);\n// 日与周互斥——一侧受限(非 */?)时另一侧自动落 `?`,否则后端直接拒 47003,与其让用户撞墙不如替他落好。\n// 预览走 POST /preview-cron(任何登录用户可用):防抖 400ms,展示归一化结果 + 未来若干次时刻;\n// 非法表达式显示后端 47003 文案;everySecondWarning 只提示不拦截(后端同款态度)。\nimport { computed, reactive, ref, watch, onMounted } from 'vue'\nimport {\n NTabs,\n NTabPane,\n NRadioGroup,\n NRadio,\n NInputNumber,\n NSelect,\n NInput,\n NAlert,\n} from 'naive-ui'\nimport { useI18n } from 'vue-i18n'\nimport { watchDebounced } from '@vueuse/core'\nimport { jobApi } from '#/api'\nimport { translateError } from '#/utils/error'\nimport type { CronPreviewOutput } from '#/types/api'\n\nconst props = withDefaults(\n defineProps<{\n modelValue?: string\n /** 预览条数(透传后端 count,上限 20)。 */\n previewCount?: number\n }>(),\n { modelValue: '', previewCount: 5 },\n)\nconst emit = defineEmits<{ (e: 'update:modelValue', v: string): void }>()\n\nconst { t } = useI18n()\n\ntype SegMode =\n | 'every'\n | 'any'\n | 'range'\n | 'step'\n | 'list'\n | 'last'\n | 'lastWeekday'\n | 'nearestWeekday' // 日段专项:L/L-n · LW · nW\n | 'lastOfWeek'\n | 'nth' // 周段专项:nL · n#m\n\n/** 单段编辑态:各模式的参数并存(切模式不丢已填值),build 时只取当前模式用到的。 */\ninterface SegState {\n mode: SegMode\n rangeFrom: number\n rangeTo: number\n stepFrom: number\n stepSize: number\n list: number[]\n lastOffset: number\n nearestDay: number\n lastDow: number\n nthDow: number\n nthIndex: number\n}\n\nfunction blankState(mode: SegMode, min: number, max: number): SegState {\n return {\n mode,\n rangeFrom: min,\n rangeTo: max,\n stepFrom: min,\n stepSize: 1,\n list: [],\n lastOffset: 0,\n nearestDay: 1,\n lastDow: 5,\n nthDow: 1,\n nthIndex: 1,\n }\n}\n\n// 默认表达式形态 = `0 * * * * ?`(秒指定 0,其余每),避免初始就是\"每秒执行\"\nconst states = {\n second: reactive(blankState('list', 0, 59)),\n minute: reactive(blankState('every', 0, 59)),\n hour: reactive(blankState('every', 0, 23)),\n day: reactive(blankState('every', 1, 31)),\n month: reactive(blankState('every', 1, 12)),\n week: reactive(blankState('any', 0, 6)),\n}\nstates.second.list = [0]\n\nconst numOptions = (min: number, max: number) =>\n Array.from({ length: max - min + 1 }, (_, i) => ({ label: String(min + i), value: min + i }))\n\nconst DOW_KEYS = ['sun', 'mon', 'tue', 'wed', 'thu', 'fri', 'sat'] as const\nconst dowOptions = computed(() => DOW_KEYS.map((k, i) => ({ label: t(`job.cron.${k}`), value: i })))\n\ninterface SegDef {\n key: keyof typeof states\n st: SegState\n min: number\n max: number\n tab: () => string\n listOptions: () => { label: string; value: number }[]\n}\nconst segs: SegDef[] = [\n {\n key: 'second',\n st: states.second,\n min: 0,\n max: 59,\n tab: () => t('job.cron.tabSecond'),\n listOptions: () => numOptions(0, 59),\n },\n {\n key: 'minute',\n st: states.minute,\n min: 0,\n max: 59,\n tab: () => t('job.cron.tabMinute'),\n listOptions: () => numOptions(0, 59),\n },\n {\n key: 'hour',\n st: states.hour,\n min: 0,\n max: 23,\n tab: () => t('job.cron.tabHour'),\n listOptions: () => numOptions(0, 23),\n },\n {\n key: 'day',\n st: states.day,\n min: 1,\n max: 31,\n tab: () => t('job.cron.tabDay'),\n listOptions: () => numOptions(1, 31),\n },\n {\n key: 'month',\n st: states.month,\n min: 1,\n max: 12,\n tab: () => t('job.cron.tabMonth'),\n listOptions: () => numOptions(1, 12),\n },\n {\n key: 'week',\n st: states.week,\n min: 0,\n max: 6,\n tab: () => t('job.cron.tabWeek'),\n listOptions: () => dowOptions.value,\n },\n]\n\nconst activeTab = ref('second')\nconst expr = ref(props.modelValue ?? '')\n/** parse 期间静音各段 watcher,防止\"解析回填 → 重建表达式\"把用户正敲到一半的原文改写掉。 */\nlet parsing = false\n\n// ── 段 → token ──\nconst restricted = (tok: string) => tok !== '*' && tok !== '?'\n\nfunction build(seg: SegDef): string {\n const st = seg.st\n switch (st.mode) {\n case 'any':\n return '?'\n case 'range':\n return `${st.rangeFrom}-${st.rangeTo}`\n case 'step':\n return `${st.stepFrom}/${st.stepSize}`\n case 'list':\n return st.list.length ? st.list.toSorted((a, b) => a - b).join(',') : '*'\n case 'last':\n return st.lastOffset > 0 ? `L-${st.lastOffset}` : 'L'\n case 'lastWeekday':\n return 'LW'\n case 'nearestWeekday':\n return `${st.nearestDay}W`\n case 'lastOfWeek':\n return `${st.lastDow}L`\n case 'nth':\n return `${st.nthDow}#${st.nthIndex}`\n default:\n return '*'\n }\n}\n\nfunction syncFromStates(edited?: 'day' | 'week') {\n // 日/周互斥:刚编辑的一侧受限 → 另一侧自动落 ?(mutate 在 parsing 静音下做,防 watcher 递归)\n parsing = true\n try {\n if (edited === 'day' && restricted(build(segs[3])) && states.week.mode !== 'any')\n states.week.mode = 'any'\n if (edited === 'week' && restricted(build(segs[5])) && states.day.mode !== 'any')\n states.day.mode = 'any'\n } finally {\n parsing = false\n }\n setExpr(segs.map(build).join(' '))\n}\n\nfunction setExpr(v: string) {\n if (v === expr.value) return\n expr.value = v\n emit('update:modelValue', v)\n}\n\n// ── token → 段(尽力解析;解析不动的形态保留原编辑态,表达式本身不丢) ──\nconst MONTH_NAMES: Record<string, number> = {\n JAN: 1,\n FEB: 2,\n MAR: 3,\n APR: 4,\n MAY: 5,\n JUN: 6,\n JUL: 7,\n AUG: 8,\n SEP: 9,\n OCT: 10,\n NOV: 11,\n DEC: 12,\n}\nconst DOW_NAMES: Record<string, number> = { SUN: 0, MON: 1, TUE: 2, WED: 3, THU: 4, FRI: 5, SAT: 6 }\n\nfunction mapNames(tok: string, table: Record<string, number>): string {\n return tok.toUpperCase().replace(/[A-Z]{3}/g, m => (m in table ? String(table[m]) : m))\n}\n\nfunction parseGeneric(tok: string, seg: SegDef) {\n const st = seg.st\n if (tok === '*') {\n st.mode = 'every'\n return\n }\n if (tok === '?') {\n st.mode = seg.key === 'day' || seg.key === 'week' ? 'any' : 'every'\n return\n }\n const norm = (n: number) => (seg.key === 'week' ? n % 7 : n) // 周 7≡0(后端同款)\n let m = /^(\\d+)-(\\d+)$/.exec(tok)\n if (m) {\n st.mode = 'range'\n st.rangeFrom = norm(+m[1])\n st.rangeTo = norm(+m[2])\n return\n }\n m = /^(\\d+|\\*)\\/(\\d+)$/.exec(tok)\n if (m) {\n st.mode = 'step'\n st.stepFrom = m[1] === '*' ? seg.min : norm(+m[1])\n st.stepSize = +m[2]\n return\n }\n if (/^\\d+(,\\d+)*$/.test(tok)) {\n st.mode = 'list'\n st.list = tok.split(',').map(s => norm(+s))\n return\n }\n // 区间/步长里带名字或混写等复杂形态:不强行归类,留在表达式页签编辑\n}\n\nfunction parseDay(tok: string) {\n const st = states.day\n if (tok === 'L') {\n st.mode = 'last'\n st.lastOffset = 0\n return\n }\n if (tok === 'LW') {\n st.mode = 'lastWeekday'\n return\n }\n let m = /^L-(\\d+)$/.exec(tok)\n if (m) {\n st.mode = 'last'\n st.lastOffset = +m[1]\n return\n }\n m = /^(\\d+)W$/.exec(tok)\n if (m) {\n st.mode = 'nearestWeekday'\n st.nearestDay = +m[1]\n return\n }\n parseGeneric(tok, segs[3])\n}\n\nfunction parseWeek(tok: string) {\n const st = states.week\n const mapped = mapNames(tok, DOW_NAMES)\n if (mapped === 'L') {\n st.mode = 'list'\n st.list = [6]\n return\n } // 孤立 L = SAT(Quartz 同款)\n let m = /^(\\d+)#(\\d+)$/.exec(mapped)\n if (m) {\n st.mode = 'nth'\n st.nthDow = +m[1] % 7\n st.nthIndex = +m[2]\n return\n }\n m = /^(\\d+)L$/.exec(mapped)\n if (m) {\n st.mode = 'lastOfWeek'\n st.lastDow = +m[1] % 7\n return\n }\n parseGeneric(mapped, segs[5])\n}\n\nfunction parse(raw: string) {\n const tokens = raw.trim().split(/\\s+/).filter(Boolean)\n if (tokens.length === 5) tokens.unshift('0') // 5 段自动升 6 段(与后端一致)\n if (tokens.length !== 6) return\n parsing = true\n try {\n parseGeneric(tokens[0], segs[0])\n parseGeneric(tokens[1], segs[1])\n parseGeneric(tokens[2], segs[2])\n parseDay(tokens[3].toUpperCase())\n parseGeneric(mapNames(tokens[4], MONTH_NAMES), segs[4])\n parseWeek(tokens[5])\n } finally {\n parsing = false\n }\n}\n\n// 段编辑 → 重建表达式。必须 sync flush:parse 的静音旗标是同步置回的,异步 watcher 会漏看\nfor (const seg of segs) {\n watch(\n seg.st,\n () => {\n if (parsing) return\n syncFromStates(seg.key === 'day' ? 'day' : seg.key === 'week' ? 'week' : undefined)\n },\n { deep: true, flush: 'sync' },\n )\n}\n\n// 外部(表单回填/清空)改 modelValue → 同步进来\nwatch(\n () => props.modelValue,\n v => {\n const next = v ?? ''\n if (next === expr.value) return\n expr.value = next\n if (next.trim()) parse(next)\n },\n)\n\nfunction onRawInput(v: string) {\n setExpr(v)\n if (v.trim()) parse(v)\n}\n\nif (expr.value.trim()) parse(expr.value)\n\n// ── 预览(防抖 400ms;seq 挡乱序响应) ──\nconst previewData = ref<CronPreviewOutput | null>(null)\nconst previewError = ref('')\nlet previewSeq = 0\n\nasync function loadPreview(v: string) {\n const seq = ++previewSeq\n if (!v.trim()) {\n previewData.value = null\n previewError.value = ''\n return\n }\n try {\n const out = await jobApi.previewCron({ cron: v, count: props.previewCount })\n if (seq !== previewSeq) return\n previewData.value = out\n previewError.value = ''\n } catch (e) {\n if (seq !== previewSeq) return\n previewData.value = null\n previewError.value = translateError(e)\n }\n}\n\nwatchDebounced(expr, v => void loadPreview(v), { debounce: 400 })\nonMounted(() => void loadPreview(expr.value))\n</script>\n\n<template>\n <div class=\"cron-editor\">\n <n-tabs v-model:value=\"activeTab\" type=\"line\" size=\"small\">\n <n-tab-pane v-for=\"seg in segs\" :key=\"seg.key\" :name=\"seg.key\" :tab=\"seg.tab()\">\n <n-radio-group\n :value=\"seg.st.mode\"\n class=\"cron-rows\"\n @update:value=\"(v: SegMode) => (seg.st.mode = v)\"\n >\n <div class=\"cron-row\">\n <n-radio value=\"every\">{{ t('job.cron.every') }}</n-radio>\n </div>\n <div v-if=\"seg.key === 'day' || seg.key === 'week'\" class=\"cron-row\">\n <n-radio value=\"any\">{{ t('job.cron.any') }}</n-radio>\n </div>\n <div class=\"cron-row\">\n <n-radio value=\"range\">{{ t('job.cron.range') }}</n-radio>\n <n-input-number\n v-model:value=\"seg.st.rangeFrom\"\n :min=\"seg.min\"\n :max=\"seg.max\"\n size=\"small\"\n class=\"cron-num\"\n :disabled=\"seg.st.mode !== 'range'\"\n />\n <span class=\"cron-sep\">{{ t('job.cron.to') }}</span>\n <n-input-number\n v-model:value=\"seg.st.rangeTo\"\n :min=\"seg.min\"\n :max=\"seg.max\"\n size=\"small\"\n class=\"cron-num\"\n :disabled=\"seg.st.mode !== 'range'\"\n />\n </div>\n <div class=\"cron-row\">\n <n-radio value=\"step\">{{ t('job.cron.step') }}</n-radio>\n <span class=\"cron-sep\">{{ t('job.cron.stepFrom') }}</span>\n <n-input-number\n v-model:value=\"seg.st.stepFrom\"\n :min=\"seg.min\"\n :max=\"seg.max\"\n size=\"small\"\n class=\"cron-num\"\n :disabled=\"seg.st.mode !== 'step'\"\n />\n <span class=\"cron-sep\">{{ t('job.cron.stepEvery') }}</span>\n <n-input-number\n v-model:value=\"seg.st.stepSize\"\n :min=\"1\"\n :max=\"seg.max\"\n size=\"small\"\n class=\"cron-num\"\n :disabled=\"seg.st.mode !== 'step'\"\n />\n </div>\n <div class=\"cron-row cron-row-list\">\n <n-radio value=\"list\">{{ t('job.cron.list') }}</n-radio>\n <n-select\n :value=\"seg.st.list\"\n multiple\n size=\"small\"\n class=\"cron-list\"\n :options=\"seg.listOptions()\"\n :disabled=\"seg.st.mode !== 'list'\"\n :max-tag-count=\"8\"\n @update:value=\"(v: number[]) => (seg.st.list = v)\"\n />\n </div>\n <!-- 日段专项:L / L-n / nW / LW -->\n <template v-if=\"seg.key === 'day'\">\n <div class=\"cron-row\">\n <n-radio value=\"last\">{{ t('job.cron.lastDay') }}</n-radio>\n <n-input-number\n v-model:value=\"seg.st.lastOffset\"\n :min=\"0\"\n :max=\"30\"\n size=\"small\"\n class=\"cron-num\"\n :disabled=\"seg.st.mode !== 'last'\"\n />\n <span class=\"cron-sep\">{{ t('job.cron.lastDayHint') }}</span>\n </div>\n <div class=\"cron-row\">\n <n-radio value=\"nearestWeekday\">{{ t('job.cron.nearestWeekday') }}</n-radio>\n <n-input-number\n v-model:value=\"seg.st.nearestDay\"\n :min=\"1\"\n :max=\"31\"\n size=\"small\"\n class=\"cron-num\"\n :disabled=\"seg.st.mode !== 'nearestWeekday'\"\n />\n <span class=\"cron-sep\">{{ t('job.cron.nearestWeekdayHint') }}</span>\n </div>\n <div class=\"cron-row\">\n <n-radio value=\"lastWeekday\">{{ t('job.cron.lastWeekday') }}</n-radio>\n </div>\n </template>\n <!-- 周段专项:nL / n#m -->\n <template v-if=\"seg.key === 'week'\">\n <div class=\"cron-row\">\n <n-radio value=\"lastOfWeek\">{{ t('job.cron.lastOfWeek') }}</n-radio>\n <n-select\n :value=\"seg.st.lastDow\"\n size=\"small\"\n class=\"cron-dow\"\n :options=\"dowOptions\"\n :disabled=\"seg.st.mode !== 'lastOfWeek'\"\n @update:value=\"(v: number) => (seg.st.lastDow = v)\"\n />\n </div>\n <div class=\"cron-row\">\n <n-radio value=\"nth\">{{ t('job.cron.nth') }}</n-radio>\n <span class=\"cron-sep\">{{ t('job.cron.nthPrefix') }}</span>\n <n-input-number\n v-model:value=\"seg.st.nthIndex\"\n :min=\"1\"\n :max=\"5\"\n size=\"small\"\n class=\"cron-num\"\n :disabled=\"seg.st.mode !== 'nth'\"\n />\n <span class=\"cron-sep\">{{ t('job.cron.nthInfix') }}</span>\n <n-select\n :value=\"seg.st.nthDow\"\n size=\"small\"\n class=\"cron-dow\"\n :options=\"dowOptions\"\n :disabled=\"seg.st.mode !== 'nth'\"\n @update:value=\"(v: number) => (seg.st.nthDow = v)\"\n />\n </div>\n </template>\n </n-radio-group>\n </n-tab-pane>\n <n-tab-pane name=\"expr\" :tab=\"t('job.cron.tabExpression')\">\n <n-input\n :value=\"expr\"\n :placeholder=\"t('job.cron.expressionPlaceholder')\"\n @update:value=\"onRawInput\"\n />\n <div class=\"cron-hint\">{{ t('job.cron.expressionHint') }}</div>\n </n-tab-pane>\n </n-tabs>\n\n <!-- 预览区:归一化 + 未来 N 次;非法显示后端 47003 文案 -->\n <div v-if=\"expr.trim()\" class=\"cron-preview\">\n <n-alert\n v-if=\"previewData?.everySecondWarning\"\n type=\"warning\"\n :bordered=\"false\"\n class=\"cron-warn\"\n >\n {{ t('job.cron.everySecondWarning') }}\n </n-alert>\n <div v-if=\"previewError\" class=\"cron-preview-error\">{{ previewError }}</div>\n <template v-else-if=\"previewData\">\n <div class=\"cron-preview-row\">\n <span class=\"cron-preview-label\">{{ t('job.cron.normalized') }}</span>\n <code class=\"cron-code\">{{ previewData.normalized }}</code>\n </div>\n <div class=\"cron-preview-row\">\n <span class=\"cron-preview-label\">{{ t('job.cron.nextRuns', { n: previewCount }) }}</span>\n <div class=\"cron-occurrences\">\n <template v-if=\"previewData.occurrences.length\">\n <div v-for=\"o in previewData.occurrences\" :key=\"o\" class=\"cron-occurrence\">\n {{ o.replace('T', ' ') }}\n </div>\n </template>\n <span v-else class=\"cron-empty\">{{ t('job.cron.noUpcoming') }}</span>\n </div>\n </div>\n </template>\n </div>\n </div>\n</template>\n\n<style scoped>\n.cron-editor {\n width: 100%;\n}\n.cron-rows {\n display: flex;\n flex-direction: column;\n gap: 10px;\n width: 100%;\n}\n.cron-row {\n display: flex;\n align-items: center;\n gap: 8px;\n flex-wrap: wrap;\n}\n.cron-num {\n width: 96px;\n}\n.cron-dow {\n width: 120px;\n}\n.cron-list {\n flex: 1;\n min-width: 200px;\n}\n.cron-sep {\n color: var(--color-text-secondary);\n font-size: var(--font-size-sm);\n}\n.cron-hint {\n margin-top: 6px;\n font-size: 12px;\n color: var(--color-text-tertiary);\n}\n.cron-preview {\n margin-top: 12px;\n padding: 10px 12px;\n border-radius: var(--radius-md);\n background: var(--color-fill);\n display: flex;\n flex-direction: column;\n gap: 8px;\n}\n.cron-warn {\n margin-bottom: 2px;\n}\n.cron-preview-error {\n color: var(--color-danger);\n font-size: var(--font-size-sm);\n}\n.cron-preview-row {\n display: flex;\n gap: 12px;\n align-items: flex-start;\n}\n.cron-preview-label {\n flex: 0 0 auto;\n color: var(--color-text-secondary);\n font-size: var(--font-size-sm);\n line-height: 22px;\n}\n.cron-code {\n font-family: var(--font-family-mono, ui-monospace, monospace);\n font-size: 13px;\n line-height: 22px;\n}\n/* 横向 wrap 而非一行一个:5 个时刻竖排要占 110px 高,在任务表单里这是纯浪费 */\n.cron-occurrences {\n display: flex;\n flex-wrap: wrap;\n gap: 2px 16px;\n}\n.cron-occurrence {\n font-family: var(--font-family-mono, ui-monospace, monospace);\n font-size: 13px;\n line-height: 22px;\n font-variant-numeric: tabular-nums;\n}\n.cron-empty {\n color: var(--color-text-tertiary);\n font-size: var(--font-size-sm);\n}\n</style>\n"],"names":["props","__props","emit","__emit","t","useI18n","blankState","mode","min","max","states","reactive","numOptions","_","i","DOW_KEYS","dowOptions","computed","k","segs","activeTab","ref","expr","parsing","restricted","tok","build","seg","st","a","b","syncFromStates","edited","setExpr","v","MONTH_NAMES","DOW_NAMES","mapNames","table","m","parseGeneric","norm","n","s","parseDay","parseWeek","mapped","parse","raw","tokens","watch","next","onRawInput","previewData","previewError","previewSeq","loadPreview","seq","out","jobApi","e","translateError","watchDebounced","onMounted","_openBlock","_createElementBlock","_hoisted_1","_createVNode","_unref","NTabs","$event","_Fragment","_renderList","NTabPane","NRadioGroup","_createElementVNode","_hoisted_2","NRadio","_hoisted_3","_hoisted_4","NInputNumber","_hoisted_5","_toDisplayString","_hoisted_6","_hoisted_7","_hoisted_8","_hoisted_9","NSelect","_hoisted_10","_hoisted_11","_hoisted_12","_hoisted_13","_hoisted_14","_hoisted_15","_hoisted_16","_hoisted_17","_hoisted_18","NInput","_hoisted_19","_hoisted_20","_a","_createBlock","NAlert","_hoisted_21","_hoisted_22","_hoisted_23","_hoisted_24","_hoisted_25","_hoisted_26","_hoisted_27","o","_hoisted_28"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index2.vue.js","sources":["../../../src/components/CronEditor/index.vue"],"sourcesContent":["<script setup lang=\"ts\">\n// 6 段秒级 cron 可视化编辑器(秒/分/时/日/月/周 + 表达式直填)。\n// 后端语法为准(SmartAdmin.Core CronExpression):日段 L/L-n/LW/nW、周段 nL/n#m、周 0=周日(7≡0);\n// 日与周互斥——一侧受限(非 */?)时另一侧自动落 `?`,否则后端直接拒 47003,与其让用户撞墙不如替他落好。\n// 预览走 POST /preview-cron(任何登录用户可用):防抖 400ms,展示归一化结果 + 未来若干次时刻;\n// 非法表达式显示后端 47003 文案;everySecondWarning 只提示不拦截(后端同款态度)。\nimport { computed, reactive, ref, watch, onMounted } from 'vue'\nimport {\n NTabs,\n NTabPane,\n NRadioGroup,\n NRadio,\n NInputNumber,\n NSelect,\n NInput,\n NAlert,\n} from 'naive-ui'\nimport { useI18n } from 'vue-i18n'\nimport { watchDebounced } from '@vueuse/core'\nimport { jobApi } from '#/api'\nimport { translateError } from '#/utils/error'\nimport type { CronPreviewOutput } from '#/types/api'\n\nconst props = withDefaults(\n defineProps<{\n modelValue?: string\n /** 预览条数(透传后端 count,上限 20)。 */\n previewCount?: number\n }>(),\n { modelValue: '', previewCount: 5 },\n)\nconst emit = defineEmits<{ (e: 'update:modelValue', v: string): void }>()\n\nconst { t } = useI18n()\n\ntype SegMode =\n | 'every'\n | 'any'\n | 'range'\n | 'step'\n | 'list'\n | 'last'\n | 'lastWeekday'\n | 'nearestWeekday' // 日段专项:L/L-n · LW · nW\n | 'lastOfWeek'\n | 'nth' // 周段专项:nL · n#m\n\n/** 单段编辑态:各模式的参数并存(切模式不丢已填值),build 时只取当前模式用到的。 */\ninterface SegState {\n mode: SegMode\n rangeFrom: number\n rangeTo: number\n stepFrom: number\n stepSize: number\n list: number[]\n lastOffset: number\n nearestDay: number\n lastDow: number\n nthDow: number\n nthIndex: number\n}\n\nfunction blankState(mode: SegMode, min: number, max: number): SegState {\n return {\n mode,\n rangeFrom: min,\n rangeTo: max,\n stepFrom: min,\n stepSize: 1,\n list: [],\n lastOffset: 0,\n nearestDay: 1,\n lastDow: 5,\n nthDow: 1,\n nthIndex: 1,\n }\n}\n\n// 默认表达式形态 = `0 * * * * ?`(秒指定 0,其余每),避免初始就是\"每秒执行\"\nconst states = {\n second: reactive(blankState('list', 0, 59)),\n minute: reactive(blankState('every', 0, 59)),\n hour: reactive(blankState('every', 0, 23)),\n day: reactive(blankState('every', 1, 31)),\n month: reactive(blankState('every', 1, 12)),\n week: reactive(blankState('any', 0, 6)),\n}\nstates.second.list = [0]\n\nconst numOptions = (min: number, max: number) =>\n Array.from({ length: max - min + 1 }, (_, i) => ({ label: String(min + i), value: min + i }))\n\nconst DOW_KEYS = ['sun', 'mon', 'tue', 'wed', 'thu', 'fri', 'sat'] as const\nconst dowOptions = computed(() => DOW_KEYS.map((k, i) => ({ label: t(`job.cron.${k}`), value: i })))\n\ninterface SegDef {\n key: keyof typeof states\n st: SegState\n min: number\n max: number\n tab: () => string\n listOptions: () => { label: string; value: number }[]\n}\nconst segs: SegDef[] = [\n {\n key: 'second',\n st: states.second,\n min: 0,\n max: 59,\n tab: () => t('job.cron.tabSecond'),\n listOptions: () => numOptions(0, 59),\n },\n {\n key: 'minute',\n st: states.minute,\n min: 0,\n max: 59,\n tab: () => t('job.cron.tabMinute'),\n listOptions: () => numOptions(0, 59),\n },\n {\n key: 'hour',\n st: states.hour,\n min: 0,\n max: 23,\n tab: () => t('job.cron.tabHour'),\n listOptions: () => numOptions(0, 23),\n },\n {\n key: 'day',\n st: states.day,\n min: 1,\n max: 31,\n tab: () => t('job.cron.tabDay'),\n listOptions: () => numOptions(1, 31),\n },\n {\n key: 'month',\n st: states.month,\n min: 1,\n max: 12,\n tab: () => t('job.cron.tabMonth'),\n listOptions: () => numOptions(1, 12),\n },\n {\n key: 'week',\n st: states.week,\n min: 0,\n max: 6,\n tab: () => t('job.cron.tabWeek'),\n listOptions: () => dowOptions.value,\n },\n]\n\nconst activeTab = ref('second')\nconst expr = ref(props.modelValue ?? '')\n/** parse 期间静音各段 watcher,防止\"解析回填 → 重建表达式\"把用户正敲到一半的原文改写掉。 */\nlet parsing = false\n\n// ── 段 → token ──\nconst restricted = (tok: string) => tok !== '*' && tok !== '?'\n\nfunction build(seg: SegDef): string {\n const st = seg.st\n switch (st.mode) {\n case 'any':\n return '?'\n case 'range':\n return `${st.rangeFrom}-${st.rangeTo}`\n case 'step':\n return `${st.stepFrom}/${st.stepSize}`\n case 'list':\n return st.list.length ? st.list.toSorted((a, b) => a - b).join(',') : '*'\n case 'last':\n return st.lastOffset > 0 ? `L-${st.lastOffset}` : 'L'\n case 'lastWeekday':\n return 'LW'\n case 'nearestWeekday':\n return `${st.nearestDay}W`\n case 'lastOfWeek':\n return `${st.lastDow}L`\n case 'nth':\n return `${st.nthDow}#${st.nthIndex}`\n default:\n return '*'\n }\n}\n\nfunction syncFromStates(edited?: 'day' | 'week') {\n // 日/周互斥:刚编辑的一侧受限 → 另一侧自动落 ?(mutate 在 parsing 静音下做,防 watcher 递归)\n parsing = true\n try {\n if (edited === 'day' && restricted(build(segs[3])) && states.week.mode !== 'any')\n states.week.mode = 'any'\n if (edited === 'week' && restricted(build(segs[5])) && states.day.mode !== 'any')\n states.day.mode = 'any'\n } finally {\n parsing = false\n }\n setExpr(segs.map(build).join(' '))\n}\n\nfunction setExpr(v: string) {\n if (v === expr.value) return\n expr.value = v\n emit('update:modelValue', v)\n}\n\n// ── token → 段(尽力解析;解析不动的形态保留原编辑态,表达式本身不丢) ──\nconst MONTH_NAMES: Record<string, number> = {\n JAN: 1,\n FEB: 2,\n MAR: 3,\n APR: 4,\n MAY: 5,\n JUN: 6,\n JUL: 7,\n AUG: 8,\n SEP: 9,\n OCT: 10,\n NOV: 11,\n DEC: 12,\n}\nconst DOW_NAMES: Record<string, number> = { SUN: 0, MON: 1, TUE: 2, WED: 3, THU: 4, FRI: 5, SAT: 6 }\n\nfunction mapNames(tok: string, table: Record<string, number>): string {\n return tok.toUpperCase().replace(/[A-Z]{3}/g, m => (m in table ? String(table[m]) : m))\n}\n\nfunction parseGeneric(tok: string, seg: SegDef) {\n const st = seg.st\n if (tok === '*') {\n st.mode = 'every'\n return\n }\n if (tok === '?') {\n st.mode = seg.key === 'day' || seg.key === 'week' ? 'any' : 'every'\n return\n }\n const norm = (n: number) => (seg.key === 'week' ? n % 7 : n) // 周 7≡0(后端同款)\n let m = /^(\\d+)-(\\d+)$/.exec(tok)\n if (m) {\n st.mode = 'range'\n st.rangeFrom = norm(+m[1])\n st.rangeTo = norm(+m[2])\n return\n }\n m = /^(\\d+|\\*)\\/(\\d+)$/.exec(tok)\n if (m) {\n st.mode = 'step'\n st.stepFrom = m[1] === '*' ? seg.min : norm(+m[1])\n st.stepSize = +m[2]\n return\n }\n if (/^\\d+(,\\d+)*$/.test(tok)) {\n st.mode = 'list'\n st.list = tok.split(',').map(s => norm(+s))\n return\n }\n // 区间/步长里带名字或混写等复杂形态:不强行归类,留在表达式页签编辑\n}\n\nfunction parseDay(tok: string) {\n const st = states.day\n if (tok === 'L') {\n st.mode = 'last'\n st.lastOffset = 0\n return\n }\n if (tok === 'LW') {\n st.mode = 'lastWeekday'\n return\n }\n let m = /^L-(\\d+)$/.exec(tok)\n if (m) {\n st.mode = 'last'\n st.lastOffset = +m[1]\n return\n }\n m = /^(\\d+)W$/.exec(tok)\n if (m) {\n st.mode = 'nearestWeekday'\n st.nearestDay = +m[1]\n return\n }\n parseGeneric(tok, segs[3])\n}\n\nfunction parseWeek(tok: string) {\n const st = states.week\n const mapped = mapNames(tok, DOW_NAMES)\n if (mapped === 'L') {\n st.mode = 'list'\n st.list = [6]\n return\n } // 孤立 L = SAT(Quartz 同款)\n let m = /^(\\d+)#(\\d+)$/.exec(mapped)\n if (m) {\n st.mode = 'nth'\n st.nthDow = +m[1] % 7\n st.nthIndex = +m[2]\n return\n }\n m = /^(\\d+)L$/.exec(mapped)\n if (m) {\n st.mode = 'lastOfWeek'\n st.lastDow = +m[1] % 7\n return\n }\n parseGeneric(mapped, segs[5])\n}\n\nfunction parse(raw: string) {\n const tokens = raw.trim().split(/\\s+/).filter(Boolean)\n if (tokens.length === 5) tokens.unshift('0') // 5 段自动升 6 段(与后端一致)\n if (tokens.length !== 6) return\n parsing = true\n try {\n parseGeneric(tokens[0], segs[0])\n parseGeneric(tokens[1], segs[1])\n parseGeneric(tokens[2], segs[2])\n parseDay(tokens[3].toUpperCase())\n parseGeneric(mapNames(tokens[4], MONTH_NAMES), segs[4])\n parseWeek(tokens[5])\n } finally {\n parsing = false\n }\n}\n\n// 段编辑 → 重建表达式。必须 sync flush:parse 的静音旗标是同步置回的,异步 watcher 会漏看\nfor (const seg of segs) {\n watch(\n seg.st,\n () => {\n if (parsing) return\n syncFromStates(seg.key === 'day' ? 'day' : seg.key === 'week' ? 'week' : undefined)\n },\n { deep: true, flush: 'sync' },\n )\n}\n\n// 外部(表单回填/清空)改 modelValue → 同步进来\nwatch(\n () => props.modelValue,\n v => {\n const next = v ?? ''\n if (next === expr.value) return\n expr.value = next\n if (next.trim()) parse(next)\n },\n)\n\nfunction onRawInput(v: string) {\n setExpr(v)\n if (v.trim()) parse(v)\n}\n\nif (expr.value.trim()) parse(expr.value)\n\n// ── 预览(防抖 400ms;seq 挡乱序响应) ──\nconst previewData = ref<CronPreviewOutput | null>(null)\nconst previewError = ref('')\nlet previewSeq = 0\n\nasync function loadPreview(v: string) {\n const seq = ++previewSeq\n if (!v.trim()) {\n previewData.value = null\n previewError.value = ''\n return\n }\n try {\n const out = await jobApi.previewCron({ cron: v, count: props.previewCount })\n if (seq !== previewSeq) return\n previewData.value = out\n previewError.value = ''\n } catch (e) {\n if (seq !== previewSeq) return\n previewData.value = null\n previewError.value = translateError(e)\n }\n}\n\nwatchDebounced(expr, v => void loadPreview(v), { debounce: 400 })\nonMounted(() => void loadPreview(expr.value))\n</script>\n\n<template>\n <div class=\"cron-editor\">\n <n-tabs v-model:value=\"activeTab\" type=\"line\" size=\"small\">\n <n-tab-pane v-for=\"seg in segs\" :key=\"seg.key\" :name=\"seg.key\" :tab=\"seg.tab()\">\n <n-radio-group\n :value=\"seg.st.mode\"\n class=\"cron-rows\"\n @update:value=\"(v: SegMode) => (seg.st.mode = v)\"\n >\n <div class=\"cron-row\">\n <n-radio value=\"every\">{{ t('job.cron.every') }}</n-radio>\n </div>\n <div v-if=\"seg.key === 'day' || seg.key === 'week'\" class=\"cron-row\">\n <n-radio value=\"any\">{{ t('job.cron.any') }}</n-radio>\n </div>\n <div class=\"cron-row\">\n <n-radio value=\"range\">{{ t('job.cron.range') }}</n-radio>\n <n-input-number\n v-model:value=\"seg.st.rangeFrom\"\n :min=\"seg.min\"\n :max=\"seg.max\"\n size=\"small\"\n class=\"cron-num\"\n :disabled=\"seg.st.mode !== 'range'\"\n />\n <span class=\"cron-sep\">{{ t('job.cron.to') }}</span>\n <n-input-number\n v-model:value=\"seg.st.rangeTo\"\n :min=\"seg.min\"\n :max=\"seg.max\"\n size=\"small\"\n class=\"cron-num\"\n :disabled=\"seg.st.mode !== 'range'\"\n />\n </div>\n <div class=\"cron-row\">\n <n-radio value=\"step\">{{ t('job.cron.step') }}</n-radio>\n <span class=\"cron-sep\">{{ t('job.cron.stepFrom') }}</span>\n <n-input-number\n v-model:value=\"seg.st.stepFrom\"\n :min=\"seg.min\"\n :max=\"seg.max\"\n size=\"small\"\n class=\"cron-num\"\n :disabled=\"seg.st.mode !== 'step'\"\n />\n <span class=\"cron-sep\">{{ t('job.cron.stepEvery') }}</span>\n <n-input-number\n v-model:value=\"seg.st.stepSize\"\n :min=\"1\"\n :max=\"seg.max\"\n size=\"small\"\n class=\"cron-num\"\n :disabled=\"seg.st.mode !== 'step'\"\n />\n </div>\n <div class=\"cron-row cron-row-list\">\n <n-radio value=\"list\">{{ t('job.cron.list') }}</n-radio>\n <n-select\n :value=\"seg.st.list\"\n multiple\n size=\"small\"\n class=\"cron-list\"\n :options=\"seg.listOptions()\"\n :disabled=\"seg.st.mode !== 'list'\"\n :max-tag-count=\"8\"\n @update:value=\"(v: number[]) => (seg.st.list = v)\"\n />\n </div>\n <!-- 日段专项:L / L-n / nW / LW -->\n <template v-if=\"seg.key === 'day'\">\n <div class=\"cron-row\">\n <n-radio value=\"last\">{{ t('job.cron.lastDay') }}</n-radio>\n <n-input-number\n v-model:value=\"seg.st.lastOffset\"\n :min=\"0\"\n :max=\"30\"\n size=\"small\"\n class=\"cron-num\"\n :disabled=\"seg.st.mode !== 'last'\"\n />\n <span class=\"cron-faint\">{{ t('job.cron.lastDayHint') }}</span>\n </div>\n <div class=\"cron-row\">\n <n-radio value=\"nearestWeekday\">{{ t('job.cron.nearestWeekday') }}</n-radio>\n <n-input-number\n v-model:value=\"seg.st.nearestDay\"\n :min=\"1\"\n :max=\"31\"\n size=\"small\"\n class=\"cron-num\"\n :disabled=\"seg.st.mode !== 'nearestWeekday'\"\n />\n <span class=\"cron-faint\">{{ t('job.cron.nearestWeekdayHint') }}</span>\n </div>\n <div class=\"cron-row\">\n <n-radio value=\"lastWeekday\">{{ t('job.cron.lastWeekday') }}</n-radio>\n </div>\n </template>\n <!-- 周段专项:nL / n#m -->\n <template v-if=\"seg.key === 'week'\">\n <div class=\"cron-row\">\n <n-radio value=\"lastOfWeek\">{{ t('job.cron.lastOfWeek') }}</n-radio>\n <n-select\n :value=\"seg.st.lastDow\"\n size=\"small\"\n class=\"cron-dow\"\n :options=\"dowOptions\"\n :disabled=\"seg.st.mode !== 'lastOfWeek'\"\n @update:value=\"(v: number) => (seg.st.lastDow = v)\"\n />\n </div>\n <div class=\"cron-row\">\n <n-radio value=\"nth\">{{ t('job.cron.nth') }}</n-radio>\n <span class=\"cron-sep\">{{ t('job.cron.nthPrefix') }}</span>\n <n-input-number\n v-model:value=\"seg.st.nthIndex\"\n :min=\"1\"\n :max=\"5\"\n size=\"small\"\n class=\"cron-num\"\n :disabled=\"seg.st.mode !== 'nth'\"\n />\n <span class=\"cron-sep\">{{ t('job.cron.nthInfix') }}</span>\n <n-select\n :value=\"seg.st.nthDow\"\n size=\"small\"\n class=\"cron-dow\"\n :options=\"dowOptions\"\n :disabled=\"seg.st.mode !== 'nth'\"\n @update:value=\"(v: number) => (seg.st.nthDow = v)\"\n />\n </div>\n </template>\n </n-radio-group>\n </n-tab-pane>\n <n-tab-pane name=\"expr\" :tab=\"t('job.cron.tabExpression')\">\n <n-input\n :value=\"expr\"\n class=\"mono\"\n :placeholder=\"t('job.cron.expressionPlaceholder')\"\n @update:value=\"onRawInput\"\n />\n <div class=\"cron-hint\">{{ t('job.cron.expressionHint') }}</div>\n </n-tab-pane>\n </n-tabs>\n\n <!-- 预览区:归一化 + 未来 N 次;非法显示后端 47003 文案 -->\n <div v-if=\"expr.trim()\" class=\"cron-preview\">\n <n-alert\n v-if=\"previewData?.everySecondWarning\"\n type=\"warning\"\n :bordered=\"false\"\n class=\"cron-warn\"\n >\n {{ t('job.cron.everySecondWarning') }}\n </n-alert>\n <div v-if=\"previewError\" class=\"cron-preview-error\">{{ previewError }}</div>\n <template v-else-if=\"previewData\">\n <div class=\"cron-preview-row\">\n <span class=\"cron-preview-label\">{{ t('job.cron.normalized') }}</span>\n <code class=\"cron-code\">{{ previewData.normalized }}</code>\n </div>\n <div class=\"cron-preview-row\">\n <span class=\"cron-preview-label\">{{ t('job.cron.nextRuns', { n: previewCount }) }}</span>\n <div class=\"cron-occurrences\">\n <template v-if=\"previewData.occurrences.length\">\n <div v-for=\"o in previewData.occurrences\" :key=\"o\" class=\"cron-occurrence\">\n {{ o.replace('T', ' ') }}\n </div>\n </template>\n <span v-else class=\"cron-empty\">{{ t('job.cron.noUpcoming') }}</span>\n </div>\n </div>\n </template>\n </div>\n </div>\n</template>\n\n<style scoped>\n/* Cron 编辑器:字段输入行 + 预览区。 */\n.cron-editor {\n width: 100%;\n min-width: 0;\n /* 单选标签定宽与否看编辑器自己的宽度而不是视口:同一个编辑器可能在抽屉里,也可能在弹窗里 */\n container-type: inline-size;\n}\n.cron-rows {\n display: flex;\n flex-direction: column;\n gap: 10px;\n width: 100%;\n padding-top: 4px;\n}\n.cron-row {\n display: flex;\n align-items: center;\n gap: 8px;\n flex-wrap: wrap;\n min-height: 32px;\n}\n.cron-row :deep(.n-input-number .n-input) {\n text-align: left;\n}\n.cron-num {\n width: 100px;\n}\n.cron-dow {\n width: 120px;\n}\n.cron-list {\n flex: 1;\n min-width: 200px;\n}\n/* 够宽时各行的单选标签定宽 168px,后面的输入框上下对齐成一列;窄了就让它自然折行 */\n@container (min-width: 600px) {\n .cron-row :deep(.n-radio) {\n width: 168px;\n flex: none;\n }\n}\n.cron-sep {\n color: var(--text-2);\n font-size: var(--font-size-base);\n}\n.cron-faint {\n color: var(--text-3);\n font-size: var(--font-size-base);\n}\n.cron-hint {\n margin-top: 6px;\n font-size: 13px;\n color: var(--text-3);\n}\n.cron-preview {\n margin-top: 12px;\n padding: 10px 12px;\n border-radius: var(--radius-md);\n background: var(--fill);\n display: flex;\n flex-direction: column;\n gap: 8px;\n}\n.cron-warn {\n margin-bottom: 2px;\n}\n.cron-preview-error {\n color: var(--err);\n font-size: var(--font-size-base);\n}\n.cron-preview-row {\n display: flex;\n gap: 12px;\n align-items: flex-start;\n}\n.cron-preview-label {\n flex: none;\n min-width: 64px;\n color: var(--text-2);\n line-height: 22px;\n}\n.cron-code {\n font-family: var(--font-mono);\n font-size: 13.5px;\n line-height: 22px;\n}\n/* 横向 wrap 而非一行一个:5 个时刻竖排要占 110px 高,在任务表单里这是纯浪费 */\n.cron-occurrences {\n display: flex;\n flex-wrap: wrap;\n gap: 2px 16px;\n min-width: 0;\n}\n.cron-occurrence {\n font-family: var(--font-mono);\n font-size: 13.5px;\n line-height: 22px;\n font-variant-numeric: tabular-nums;\n}\n.cron-empty {\n color: var(--text-3);\n line-height: 22px;\n}\n</style>\n"],"names":["props","__props","emit","__emit","t","useI18n","blankState","mode","min","max","states","reactive","numOptions","_","i","DOW_KEYS","dowOptions","computed","k","segs","activeTab","ref","expr","parsing","restricted","tok","build","seg","st","a","b","syncFromStates","edited","setExpr","v","MONTH_NAMES","DOW_NAMES","mapNames","table","m","parseGeneric","norm","n","s","parseDay","parseWeek","mapped","parse","raw","tokens","watch","next","onRawInput","previewData","previewError","previewSeq","loadPreview","seq","out","jobApi","e","translateError","watchDebounced","onMounted","_openBlock","_createElementBlock","_hoisted_1","_createVNode","_unref","NTabs","$event","_Fragment","_renderList","NTabPane","NRadioGroup","_createElementVNode","_hoisted_2","NRadio","_hoisted_3","_hoisted_4","NInputNumber","_hoisted_5","_toDisplayString","_hoisted_6","_hoisted_7","_hoisted_8","_hoisted_9","NSelect","_hoisted_10","_hoisted_11","_hoisted_12","_hoisted_13","_hoisted_14","_hoisted_15","_hoisted_16","_hoisted_17","_hoisted_18","NInput","_hoisted_19","_hoisted_20","_a","_createBlock","NAlert","_hoisted_21","_hoisted_22","_hoisted_23","_hoisted_24","_hoisted_25","_hoisted_26","_hoisted_27","o","_hoisted_28"],"mappings":"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"}
|
|
@@ -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-4e7ef954"]]);
|
|
5
5
|
export {
|
|
6
|
-
|
|
6
|
+
m as default
|
|
7
7
|
};
|
|
8
8
|
//# sourceMappingURL=index.vue.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index2.vue.js","sources":["../../../src/components/DetailPage/index.vue"],"sourcesContent":["<script setup lang=\"ts\">\n// 详情页外壳:返回按钮 + 标题 + actions 插槽 + body 插槽。\n// 补偿非菜单详情路由的空面包屑(菜单树里没这条路由 → 头部面包屑为空,故详情页自带标题/返回)。\n// @back 交父级决定语义:路由态 = 关标签回列表;就地态 = 清列表页的详情状态(骨架见 skills/create-page-variant/detail.md)。\nimport { NButton, NSpin } from 'naive-ui'\nimport { useI18n } from 'vue-i18n'\nimport AppIcon from '#/components/AppIcon.vue'\n\nwithDefaults(defineProps<{ title?: string; loading?: boolean; showBack?: boolean }>(), {\n showBack: true,\n})\ndefineEmits<{ back: [] }>()\nconst { t } = useI18n()\n</script>\n\n<template>\n <div class=\"detail-page\">\n <div class=\"detail-header\">\n <n-button\n v-if=\"showBack\"\n quaternary\n size=\"small\"\n :aria-label=\"t('common.back')\"\n @click=\"$emit('back')\"\n >\n <template #icon><AppIcon icon=\"ph:arrow-left\" :size=\"18\" /></template>\n </n-button>\n <h2 class=\"detail-title\">{{ title }}</h2>\n <div class=\"detail-actions\"><slot name=\"actions\" /></div>\n </div>\n <n-spin :show=\"loading\">\n <div class=\"detail-body\"><slot /></div>\n </n-spin>\n </div>\n</template>\n\n<style scoped>\n.detail-page {\n display: flex;\n flex-direction: column;\n gap: var(--gap-card
|
|
1
|
+
{"version":3,"file":"index2.vue.js","sources":["../../../src/components/DetailPage/index.vue"],"sourcesContent":["<script setup lang=\"ts\">\n// 详情页外壳:返回按钮 + 标题 + actions 插槽 + body 插槽。\n// 补偿非菜单详情路由的空面包屑(菜单树里没这条路由 → 头部面包屑为空,故详情页自带标题/返回)。\n// @back 交父级决定语义:路由态 = 关标签回列表;就地态 = 清列表页的详情状态(骨架见 skills/create-page-variant/detail.md)。\nimport { NButton, NSpin } from 'naive-ui'\nimport { useI18n } from 'vue-i18n'\nimport AppIcon from '#/components/AppIcon.vue'\n\nwithDefaults(defineProps<{ title?: string; loading?: boolean; showBack?: boolean }>(), {\n showBack: true,\n})\ndefineEmits<{ back: [] }>()\nconst { t } = useI18n()\n</script>\n\n<template>\n <div class=\"detail-page\">\n <div class=\"detail-header\">\n <n-button\n v-if=\"showBack\"\n quaternary\n size=\"small\"\n :aria-label=\"t('common.back')\"\n @click=\"$emit('back')\"\n >\n <template #icon><AppIcon icon=\"ph:arrow-left\" :size=\"18\" /></template>\n </n-button>\n <h2 class=\"detail-title\">{{ title }}</h2>\n <div class=\"detail-actions\"><slot name=\"actions\" /></div>\n </div>\n <n-spin :show=\"loading\">\n <div class=\"detail-body\"><slot /></div>\n </n-spin>\n </div>\n</template>\n\n<style scoped>\n.detail-page {\n display: flex;\n flex-direction: column;\n gap: var(--gap-card);\n}\n.detail-header {\n display: flex;\n align-items: center;\n gap: 8px;\n}\n.detail-title {\n margin: 0;\n font-size: var(--font-size-lg, 18px);\n font-weight: 600;\n color: var(--color-text-primary);\n}\n.detail-actions {\n margin-left: auto;\n}\n</style>\n"],"names":["t","useI18n","_openBlock","_createElementBlock","_hoisted_1","_createElementVNode","_hoisted_2","__props","_createBlock","_unref","NButton","$emit","_createVNode","AppIcon","_hoisted_3","_toDisplayString","_hoisted_4","_renderSlot","_ctx","NSpin","_hoisted_5"],"mappings":";;;;;;;;;;;;;AAYA,UAAM,EAAE,GAAAA,EAAA,IAAMC,EAAA;sBAIZC,EAAA,GAAAC,EAiBM,OAjBNC,GAiBM;AAAA,MAhBJC,EAYM,OAZNC,GAYM;AAAA,QAVIC,EAAA,iBADRC,EAQWC,EAAAC,CAAA,GAAA;AAAA;UANT,YAAA;AAAA,UACA,MAAK;AAAA,UACJ,cAAYD,EAAAT,CAAA,EAAC,aAAA;AAAA,UACb,gCAAOW,EAAAA,MAAK,MAAA;AAAA,QAAA;UAEF,QAAK,MAA2C;AAAA,YAA3CC,EAA2CC,GAAA;AAAA,cAAlC,MAAK;AAAA,cAAiB,MAAM;AAAA,YAAA;;;;QAEvDR,EAAyC,MAAzCS,GAAyCC,EAAbR,EAAA,KAAK,GAAA,CAAA;AAAA,QACjCF,EAAyD,OAAzDW,GAAyD;AAAA,UAA7BC,EAAuBC,EAAA,QAAA,WAAA,CAAA,GAAA,QAAA,EAAA;AAAA,QAAA;;MAErDN,EAESH,EAAAU,CAAA,GAAA,EAFA,MAAMZ,EAAA,WAAO;AAAA,mBACpB,MAAuC;AAAA,UAAvCF,EAAuC,OAAvCe,GAAuC;AAAA,YAAdH,EAAQC,EAAA,QAAA,WAAA,CAAA,GAAA,QAAA,EAAA;AAAA,UAAA;;;;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.vue.js","sources":["../../../src/components/DictTag/index.vue"],"sourcesContent":["<script setup lang=\"ts\">\n// 字典值 → 标签(表格列翻译)。SysDictItem
|
|
1
|
+
{"version":3,"file":"index.vue.js","sources":["../../../src/components/DictTag/index.vue"],"sourcesContent":["<script setup lang=\"ts\">\n// 字典值 → 标签(表格列翻译)。SysDictItem 没有样式字段,配色靠 fallback 约定。\n// 启用项按 sort 升序取下标 i%4 映射固定语义色序(info/success/warning/error),\n// 稳定性由后端 sort 保证——即后端通过排序间接控制颜色。当前限制:后端若提供 tagType 字段,应改读字段并取消本约定。\n// 显式 typeMap 优先;value 未命中字典/未加载完 → 渲染原始值文本,不空白不闪烁。\nimport { computed, watch } from 'vue'\nimport { NTag } from 'naive-ui'\nimport { useDictStore } from '#/stores/dict'\n\ntype TagType = 'default' | 'primary' | 'info' | 'success' | 'warning' | 'error'\nconst FALLBACK: TagType[] = ['info', 'success', 'warning', 'error']\n\nconst props = defineProps<{\n typeCode: string\n value?: string | null\n /** 显式 value→type 映射,优先于 fallback 约定 */\n typeMap?: Record<string, TagType>\n}>()\n\nconst store = useDictStore()\n// typeCode 可变 → watch 而非一次性加载;失败静默(容错渲染原始值),typeCode 变化/重挂载自动重试。\nwatch(\n () => props.typeCode,\n code => {\n void store.load(code).catch(() => {})\n },\n { immediate: true },\n)\n\nconst hit = computed(() => {\n const items = (store.cache[props.typeCode] ?? []).filter(i => i.enabled)\n const idx = items.findIndex(i => i.value === props.value)\n return idx >= 0 ? { label: items[idx].label, index: idx } : null\n})\nconst label = computed(() => hit.value?.label ?? props.value ?? '')\nconst type = computed<TagType>(() => {\n const mapped = props.value != null ? props.typeMap?.[props.value] : undefined\n if (mapped) return mapped\n return hit.value ? FALLBACK[hit.value.index % FALLBACK.length] : 'default'\n})\n</script>\n\n<template>\n <!-- 空值按页面惯例渲染「—」,不渲染空标签 -->\n <n-tag v-if=\"value != null && value !== ''\" :type=\"type\" size=\"small\" :bordered=\"false\">\n {{ label }}\n </n-tag>\n <span v-else>—</span>\n</template>\n"],"names":["FALLBACK","props","__props","store","useDictStore","watch","code","hit","computed","items","i","idx","label","_a","type","mapped","_createBlock","_unref","NTag","_openBlock","_createElementBlock"],"mappings":";;;;;;;;;;;AAUA,UAAMA,IAAsB,CAAC,QAAQ,WAAW,WAAW,OAAO,GAE5DC,IAAQC,GAORC,IAAQC,EAAA;AAEd,IAAAC;AAAA,MACE,MAAMJ,EAAM;AAAA,MACZ,CAAAK,MAAQ;AACN,QAAKH,EAAM,KAAKG,CAAI,EAAE,MAAM,MAAM;AAAA,QAAC,CAAC;AAAA,MACtC;AAAA,MACA,EAAE,WAAW,GAAA;AAAA,IAAK;AAGpB,UAAMC,IAAMC,EAAS,MAAM;AACzB,YAAMC,KAASN,EAAM,MAAMF,EAAM,QAAQ,KAAK,CAAA,GAAI,OAAO,CAAAS,MAAKA,EAAE,OAAO,GACjEC,IAAMF,EAAM,UAAU,OAAKC,EAAE,UAAUT,EAAM,KAAK;AACxD,aAAOU,KAAO,IAAI,EAAE,OAAOF,EAAME,CAAG,EAAE,OAAO,OAAOA,EAAA,IAAQ;AAAA,IAC9D,CAAC,GACKC,IAAQJ,EAAS;;AAAM,eAAAK,IAAAN,EAAI,UAAJ,gBAAAM,EAAW,UAASZ,EAAM,SAAS;AAAA,KAAE,GAC5Da,IAAON,EAAkB,MAAM;;AACnC,YAAMO,IAASd,EAAM,SAAS,QAAOY,IAAAZ,EAAM,YAAN,gBAAAY,EAAgBZ,EAAM,SAAS;AACpE,aAAIc,MACGR,EAAI,QAAQP,EAASO,EAAI,MAAM,QAAQP,EAAS,MAAM,IAAI;AAAA,IACnE,CAAC;qBAKcE,EAAA,iBAAiBA,EAAA,UAAK,WAAnCc,EAEQC,EAAAC,CAAA,GAAA;AAAA;MAFqC,MAAMJ,EAAA;AAAA,MAAM,MAAK;AAAA,MAAS,UAAU;AAAA,IAAA;iBAC/E,MAAW;AAAA,YAARF,EAAA,KAAK,GAAA,CAAA;AAAA,MAAA;;wBAEVO,KAAAC,EAAqB,WAAR,GAAC;AAAA;;"}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import o from "./index2.vue.js";
|
|
2
2
|
/* empty css */
|
|
3
3
|
import r from "../../_virtual/_plugin-vue_export-helper.js";
|
|
4
|
-
const
|
|
4
|
+
const d = /* @__PURE__ */ r(o, [["__scopeId", "data-v-fd3eef0d"]]);
|
|
5
5
|
export {
|
|
6
|
-
|
|
6
|
+
d as default
|
|
7
7
|
};
|
|
8
8
|
//# sourceMappingURL=index.vue.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index2.vue.js","sources":["../../../src/components/ErrorBoundary/index.vue"],"sourcesContent":["<script setup lang=\"ts\">\n// 渲染错误边界:子树里未捕获的渲染/生命周期异常在这里收口。\n// 没有它时,Vue 会把整棵子树卸干净 —— 内容区直接变白,侧栏还在,看着像\"点了没反应\"。\nimport { nextTick, ref, onErrorCaptured } from 'vue'\nimport { useRouter } from 'vue-router'\nimport { NButton, NSpace } from 'naive-ui'\nimport { useI18n } from 'vue-i18n'\nimport AppIcon from '#/components/AppIcon.vue'\nimport { reloadOnChunkError } from '#/lib/chunkReload'\n\nconst { t } = useI18n()\nconst router = useRouter()\n\nconst failed = ref(false)\nconst detail = ref('')\n// 重试靠 v-if 关开一次重挂子树:清掉 failed 而不重挂,出错的组件会立刻再抛一次。\nconst alive = ref(true)\n\nonErrorCaptured(err => {\n // 发版后旧 chunk 失效:自动重载一次拿新 index.html,这里就不必打扰用户。\n if (reloadOnChunkError(err)) return false\n console.error('[SmartAdmin] 页面渲染异常', err)\n detail.value = err instanceof Error ? err.message : String(err)\n failed.value = true\n return false // 不再向上冒泡:上面没有第二道边界,冒上去就是白屏\n})\n\nasync function retry() {\n failed.value = false\n alive.value = false\n await nextTick()\n alive.value = true\n}\n\nfunction goHome() {\n failed.value = false\n alive.value = true\n router.replace('/')\n}\n</script>\n\n<template>\n <div v-if=\"failed\" class=\"error-boundary\">\n <AppIcon icon=\"ph:warning-circle
|
|
1
|
+
{"version":3,"file":"index2.vue.js","sources":["../../../src/components/ErrorBoundary/index.vue"],"sourcesContent":["<script setup lang=\"ts\">\n// 渲染错误边界:子树里未捕获的渲染/生命周期异常在这里收口。\n// 没有它时,Vue 会把整棵子树卸干净 —— 内容区直接变白,侧栏还在,看着像\"点了没反应\"。\nimport { nextTick, ref, onErrorCaptured } from 'vue'\nimport { useRouter } from 'vue-router'\nimport { NButton, NSpace } from 'naive-ui'\nimport { useI18n } from 'vue-i18n'\nimport AppIcon from '#/components/AppIcon.vue'\nimport { reloadOnChunkError } from '#/lib/chunkReload'\n\nconst { t } = useI18n()\nconst router = useRouter()\n\nconst failed = ref(false)\nconst detail = ref('')\n// 重试靠 v-if 关开一次重挂子树:清掉 failed 而不重挂,出错的组件会立刻再抛一次。\nconst alive = ref(true)\n\nonErrorCaptured(err => {\n // 发版后旧 chunk 失效:自动重载一次拿新 index.html,这里就不必打扰用户。\n if (reloadOnChunkError(err)) return false\n console.error('[SmartAdmin] 页面渲染异常', err)\n detail.value = err instanceof Error ? err.message : String(err)\n failed.value = true\n return false // 不再向上冒泡:上面没有第二道边界,冒上去就是白屏\n})\n\nasync function retry() {\n failed.value = false\n alive.value = false\n await nextTick()\n alive.value = true\n}\n\nfunction goHome() {\n failed.value = false\n alive.value = true\n router.replace('/')\n}\n</script>\n\n<template>\n <div v-if=\"failed\" class=\"error-boundary\">\n <AppIcon icon=\"ph:warning-circle\" :size=\"56\" />\n <h2>{{ t('errorBoundary.title') }}</h2>\n <p class=\"desc\">{{ t('errorBoundary.desc') }}</p>\n <code v-if=\"detail\" class=\"detail\">{{ detail }}</code>\n <n-space>\n <n-button type=\"primary\" @click=\"retry\">{{ t('errorBoundary.retry') }}</n-button>\n <n-button quaternary @click=\"goHome\">{{ t('errorBoundary.home') }}</n-button>\n </n-space>\n </div>\n <slot v-else-if=\"alive\" />\n</template>\n\n<style scoped>\n.error-boundary {\n min-height: 60vh;\n height: 100%;\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n gap: 12px;\n padding: 24px;\n text-align: center;\n color: var(--color-text-secondary);\n}\nh2 {\n margin: 0;\n color: var(--color-text-primary);\n font-size: var(--font-size-lg);\n}\n/* 说明和异常信息都不折行:一行放得下就一行,放不下时 .detail 自己横向滚 */\n.desc {\n margin: 0;\n white-space: nowrap;\n}\n.detail {\n max-width: 100%;\n padding: 6px 10px;\n white-space: nowrap;\n overflow-x: auto;\n border: 1px solid var(--color-border);\n border-radius: var(--radius-sm);\n background: var(--color-bg-container);\n color: var(--color-danger);\n font-family: var(--font-family-mono);\n font-size: var(--font-size-xs);\n}\n/* 手机宽度放不下一整行,只好折行,否则整页横向溢出 */\n@media (max-width: 560px) {\n .desc {\n white-space: normal;\n }\n}\n</style>\n"],"names":["t","useI18n","router","useRouter","failed","ref","detail","alive","onErrorCaptured","err","reloadOnChunkError","retry","nextTick","goHome","_openBlock","_createElementBlock","_hoisted_1","_createVNode","AppIcon","_createElementVNode","_unref","_hoisted_2","_toDisplayString","_hoisted_3","NSpace","NButton","_renderSlot","_ctx"],"mappings":";;;;;;;;;;;;;;;AAUA,UAAM,EAAE,GAAAA,EAAA,IAAMC,EAAA,GACRC,IAASC,EAAA,GAETC,IAASC,EAAI,EAAK,GAClBC,IAASD,EAAI,EAAE,GAEfE,IAAQF,EAAI,EAAI;AAEtB,IAAAG,EAAgB,CAAAC,OAEVC,EAAmBD,CAAG,MAC1B,QAAQ,MAAM,uBAAuBA,CAAG,GACxCH,EAAO,QAAQG,aAAe,QAAQA,EAAI,UAAU,OAAOA,CAAG,GAC9DL,EAAO,QAAQ,KACR,GACR;AAED,mBAAeO,IAAQ;AACrB,MAAAP,EAAO,QAAQ,IACfG,EAAM,QAAQ,IACd,MAAMK,EAAA,GACNL,EAAM,QAAQ;AAAA,IAChB;AAEA,aAASM,IAAS;AAChB,MAAAT,EAAO,QAAQ,IACfG,EAAM,QAAQ,IACdL,EAAO,QAAQ,GAAG;AAAA,IACpB;qBAIaE,EAAA,SAAXU,EAAA,GAAAC,EASM,OATNC,GASM;AAAA,MARJC,EAA+CC,GAAA;AAAA,QAAtC,MAAK;AAAA,QAAqB,MAAM;AAAA,MAAA;MACzCC,EAAuC,cAAhCC,EAAApB,CAAA,EAAC,qBAAA,CAAA,GAAA,CAAA;AAAA,MACRmB,EAAiD,KAAjDE,GAAiDC,EAA9BF,EAAApB,CAAA,EAAC,oBAAA,CAAA,GAAA,CAAA;AAAA,MACRM,EAAA,cAAZS,EAAsD,QAAtDQ,GAAsDD,EAAhBhB,EAAA,KAAM,GAAA,CAAA;MAC5CW,EAGUG,EAAAI,CAAA,GAAA,MAAA;AAAA,mBAFR,MAAiF;AAAA,UAAjFP,EAAiFG,EAAAK,CAAA,GAAA;AAAA,YAAvE,MAAK;AAAA,YAAW,SAAOd;AAAA,UAAA;uBAAO,MAA8B;AAAA,kBAA3BS,EAAApB,CAAA,EAAC,qBAAA,CAAA,GAAA,CAAA;AAAA,YAAA;;;UAC5CiB,EAA6EG,EAAAK,CAAA,GAAA;AAAA,YAAnE,YAAA;AAAA,YAAY,SAAOZ;AAAA,UAAA;uBAAQ,MAA6B;AAAA,kBAA1BO,EAAApB,CAAA,EAAC,oBAAA,CAAA,GAAA,CAAA;AAAA,YAAA;;;;;;UAG5BO,EAAA,QAAjBmB,EAA0BC,EAAA,QAAA,WAAA,CAAA,GAAA,QAAA,IAAA,CAAA;;;"}
|