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,15 +1,19 @@
|
|
|
1
|
-
import { defineComponent as
|
|
2
|
-
import { useMessage as
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
8
|
-
import {
|
|
9
|
-
|
|
1
|
+
import { defineComponent as z, ref as h, openBlock as v, createElementBlock as b, createVNode as l, unref as o, withCtx as c, Fragment as C, renderList as N, h as a } from "vue";
|
|
2
|
+
import { useMessage as A, NTabs as P, NTabPane as S, NSpace as B, NPopconfirm as T, NButton as _ } from "naive-ui";
|
|
3
|
+
import { useMediaQuery as F } from "@vueuse/core";
|
|
4
|
+
import { SmartTable as I } from "smart-naive-table";
|
|
5
|
+
import { useI18n as L } from "vue-i18n";
|
|
6
|
+
import { useConfirm as O } from "../../../composables/useConfirm.js";
|
|
7
|
+
import { useAuthStore as R } from "../../../stores/auth.js";
|
|
8
|
+
import { recycleApi as m } from "../../../api/index.js";
|
|
9
|
+
import { translateError as j } from "../../../utils/error.js";
|
|
10
|
+
import { TABLE_MIN_ROW_HEIGHT as H, TABLE_TOOLBAR as M } from "../../../utils/tableToolbar.js";
|
|
11
|
+
import q from "../../../components/TableTotal/index.vue.js";
|
|
12
|
+
import { createClientFilterFetcher as $, deriveHeaderFilters as D, passthroughFilterSerializer as G } from "../../../utils/tableFilter.js";
|
|
13
|
+
const Q = { class: "view fill-page" }, ae = /* @__PURE__ */ z({
|
|
10
14
|
__name: "index",
|
|
11
|
-
setup(
|
|
12
|
-
const { t
|
|
15
|
+
setup(U) {
|
|
16
|
+
const { t } = L(), w = A(), { run: u } = O(), f = R(), d = [
|
|
13
17
|
"user",
|
|
14
18
|
"role",
|
|
15
19
|
"org",
|
|
@@ -19,103 +23,122 @@ const R = { class: "view fill-page" }, H = /* @__PURE__ */ x({
|
|
|
19
23
|
"dict",
|
|
20
24
|
"menu",
|
|
21
25
|
"job"
|
|
22
|
-
],
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
+
], n = h("user"), k = F("(max-width: 604px)"), E = Object.fromEntries(
|
|
27
|
+
d.map((e) => [e, $(m.page(e), ["name", "code"])])
|
|
28
|
+
), p = h({});
|
|
29
|
+
function x(e) {
|
|
30
|
+
return (r) => {
|
|
31
|
+
r && (p.value[e] = r);
|
|
26
32
|
};
|
|
27
33
|
}
|
|
28
|
-
function
|
|
29
|
-
var
|
|
30
|
-
(
|
|
34
|
+
function y(e) {
|
|
35
|
+
var r;
|
|
36
|
+
(r = p.value[e]) == null || r.refresh();
|
|
31
37
|
}
|
|
32
|
-
const
|
|
33
|
-
{ type: "index", title: () =>
|
|
34
|
-
{ key: "name", title: () =>
|
|
35
|
-
{
|
|
36
|
-
|
|
38
|
+
const g = [
|
|
39
|
+
{ type: "index", title: () => t("common.rowNo"), width: 64, align: "center" },
|
|
40
|
+
{ key: "name", title: () => t("recycle.name"), search: {} },
|
|
41
|
+
{
|
|
42
|
+
key: "code",
|
|
43
|
+
title: () => t("recycle.code"),
|
|
44
|
+
search: {},
|
|
45
|
+
// 编码可能为空(如岗位):空值画灰色的「—」
|
|
46
|
+
render: (e) => e.code ? a("span", { class: "mono muted" }, e.code) : a("span", { class: "faint" }, "—")
|
|
47
|
+
},
|
|
48
|
+
{ key: "deletedAt", title: () => t("recycle.deletedAt"), format: "datetime", width: 180 },
|
|
37
49
|
{
|
|
38
50
|
key: "op",
|
|
39
|
-
title: () =>
|
|
51
|
+
title: () => t("common.operation"),
|
|
40
52
|
width: 180,
|
|
53
|
+
align: "right",
|
|
41
54
|
fixed: "right",
|
|
42
55
|
hideInSetting: !0,
|
|
43
|
-
render: (
|
|
44
|
-
|
|
45
|
-
|
|
56
|
+
render: (e) => a(B, { size: 2, justify: "end", wrapItem: !1 }, () => [
|
|
57
|
+
f.hasPerm("POST:/api/v1/sys/recycle/{type}/{id}/restore") ? a(
|
|
58
|
+
T,
|
|
46
59
|
{
|
|
47
|
-
onPositiveClick: () =>
|
|
48
|
-
(
|
|
49
|
-
|
|
60
|
+
onPositiveClick: () => u(() => m.restore(n.value, e.id), t("recycle.restored")).then(
|
|
61
|
+
(r) => {
|
|
62
|
+
r && y(n.value);
|
|
50
63
|
}
|
|
51
64
|
)
|
|
52
65
|
},
|
|
53
66
|
{
|
|
54
|
-
trigger: () =>
|
|
55
|
-
|
|
67
|
+
trigger: () => a(
|
|
68
|
+
_,
|
|
56
69
|
{ size: "small", quaternary: !0, type: "primary" },
|
|
57
|
-
() =>
|
|
70
|
+
() => t("recycle.restore")
|
|
58
71
|
),
|
|
59
|
-
default: () =>
|
|
72
|
+
default: () => t("recycle.restoreConfirm", { name: e.name })
|
|
60
73
|
}
|
|
61
74
|
) : null,
|
|
62
|
-
|
|
63
|
-
|
|
75
|
+
f.hasPerm("DELETE:/api/v1/sys/recycle/{type}/{id}") ? a(
|
|
76
|
+
T,
|
|
64
77
|
{
|
|
65
|
-
onPositiveClick: () =>
|
|
66
|
-
(
|
|
67
|
-
|
|
78
|
+
onPositiveClick: () => u(() => m.purge(n.value, e.id), t("recycle.purged")).then(
|
|
79
|
+
(r) => {
|
|
80
|
+
r && y(n.value);
|
|
68
81
|
}
|
|
69
82
|
)
|
|
70
83
|
},
|
|
71
84
|
{
|
|
72
|
-
trigger: () =>
|
|
73
|
-
|
|
85
|
+
trigger: () => a(
|
|
86
|
+
_,
|
|
74
87
|
{ size: "small", quaternary: !0, type: "error" },
|
|
75
|
-
() =>
|
|
88
|
+
() => t("recycle.purge")
|
|
76
89
|
),
|
|
77
|
-
default: () =>
|
|
90
|
+
default: () => t("recycle.purgeConfirm", { name: e.name })
|
|
78
91
|
}
|
|
79
92
|
) : null
|
|
80
93
|
])
|
|
81
94
|
}
|
|
82
95
|
];
|
|
83
|
-
return (
|
|
84
|
-
|
|
85
|
-
value:
|
|
86
|
-
"onUpdate:value":
|
|
87
|
-
type: "
|
|
96
|
+
return D(g), (e, r) => (v(), b("div", Q, [
|
|
97
|
+
l(o(P), {
|
|
98
|
+
value: n.value,
|
|
99
|
+
"onUpdate:value": r[1] || (r[1] = (i) => n.value = i),
|
|
100
|
+
type: "segment",
|
|
88
101
|
animated: "",
|
|
89
|
-
class: "fill-tabs"
|
|
102
|
+
class: "fill-tabs recycle-seg",
|
|
103
|
+
size: o(k) ? "large" : "medium",
|
|
104
|
+
"pane-style": { padding: 0 }
|
|
90
105
|
}, {
|
|
91
|
-
default:
|
|
92
|
-
(
|
|
93
|
-
key:
|
|
94
|
-
name:
|
|
95
|
-
tab:
|
|
106
|
+
default: c(() => [
|
|
107
|
+
(v(), b(C, null, N(d, (i) => l(o(S), {
|
|
108
|
+
key: i,
|
|
109
|
+
name: i,
|
|
110
|
+
tab: o(t)(`recycle.tabs.${i}`)
|
|
96
111
|
}, {
|
|
97
|
-
default:
|
|
98
|
-
|
|
99
|
-
"default-page-size": 100,
|
|
112
|
+
default: c(() => [
|
|
113
|
+
l(o(I), {
|
|
100
114
|
ref_for: !0,
|
|
101
|
-
ref:
|
|
102
|
-
columns:
|
|
103
|
-
fetcher:
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
"
|
|
107
|
-
|
|
108
|
-
|
|
115
|
+
ref: x(i),
|
|
116
|
+
columns: g,
|
|
117
|
+
fetcher: o(E)[i],
|
|
118
|
+
toolbar: o(M),
|
|
119
|
+
search: { container: "table" },
|
|
120
|
+
"filter-serializer": o(G),
|
|
121
|
+
"fill-height": "",
|
|
122
|
+
"min-row-height": o(H),
|
|
123
|
+
"card-on-narrow": "",
|
|
124
|
+
"storage-key": `sys-recycle-${i}`,
|
|
125
|
+
onError: r[0] || (r[0] = (s) => o(w).error(o(j)(s)))
|
|
126
|
+
}, {
|
|
127
|
+
"pagination-prefix": c(({ itemCount: s }) => [
|
|
128
|
+
l(q, { count: s }, null, 8, ["count"])
|
|
129
|
+
]),
|
|
130
|
+
_: 1
|
|
131
|
+
}, 8, ["fetcher", "toolbar", "filter-serializer", "min-row-height", "storage-key"])
|
|
109
132
|
]),
|
|
110
133
|
_: 2
|
|
111
134
|
}, 1032, ["name", "tab"])), 64))
|
|
112
135
|
]),
|
|
113
136
|
_: 1
|
|
114
|
-
}, 8, ["value"])
|
|
137
|
+
}, 8, ["value", "size"])
|
|
115
138
|
]));
|
|
116
139
|
}
|
|
117
140
|
});
|
|
118
141
|
export {
|
|
119
|
-
|
|
142
|
+
ae as default
|
|
120
143
|
};
|
|
121
144
|
//# sourceMappingURL=index2.vue.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index2.vue.js","sources":["../../../../src/views/system/recycle/index.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { h, ref } from 'vue'\nimport { NButton, NSpace, NTabs, NTabPane, NPopconfirm, useMessage } from 'naive-ui'\nimport { SmartTable, type SmartTableColumn, type SmartTableInst } from 'smart-naive-table'\nimport { useI18n } from 'vue-i18n'\nimport { useConfirm } from '#/composables/useConfirm'\nimport { useAuthStore } from '#/stores/auth'\nimport { recycleApi, type RecycleBinItem } from '#/api'\nimport { translateError } from '#/utils/error'\n\nconst { t } = useI18n()\nconst message = useMessage()\nconst { run } = useConfirm()\nconst authStore = useAuthStore()\n\nconst types = [\n 'user',\n 'role',\n 'org',\n 'position',\n 'module',\n 'config',\n 'dict',\n 'menu',\n 'job',\n] as const\ntype RecycleType = (typeof types)[number]\nconst activeTab = ref<RecycleType>('user')\nconst tableRefs = ref<Record<string, SmartTableInst<RecycleBinItem>>>({})\n\nfunction setTableRef(type: string) {\n // 函数 ref 的参数类型是宽泛的组件实例,收窄为 SmartTableInst 后存入映射\n return (el: unknown) => {\n if (el) tableRefs.value[type] = el as SmartTableInst<RecycleBinItem>\n }\n}\n\nfunction refreshTab(type: string) {\n tableRefs.value[type]?.refresh()\n}\n\nconst columns: SmartTableColumn<RecycleBinItem>[] = [\n { type: 'index', title: () => t('common.rowNo'), width: 64, align: 'center' },\n { key: 'name', title: () => t('recycle.name') },\n { key: 'code', title: () => t('recycle.code') },\n { key: 'deletedAt', title: () => t('recycle.deletedAt'), format: 'datetime', width: 180 },\n {\n key: 'op',\n title: () => t('common.operation'),\n width: 180,\n fixed: 'right',\n hideInSetting: true,\n render: r =>\n h(NSpace, { size: 4, wrapItem: false }, () => [\n authStore.hasPerm('POST:/api/v1/sys/recycle/{type}/{id}/restore')\n ? h(\n NPopconfirm,\n {\n onPositiveClick: () =>\n run(() => recycleApi.restore(activeTab.value, r.id), t('recycle.restored')).then(\n ok => {\n if (ok) refreshTab(activeTab.value)\n },\n ),\n },\n {\n trigger: () =>\n h(NButton, { size: 'small', quaternary: true, type: 'primary' }, () =>\n t('recycle.restore'),\n ),\n default: () => t('recycle.restoreConfirm', { name: r.name }),\n },\n )\n : null,\n authStore.hasPerm('DELETE:/api/v1/sys/recycle/{type}/{id}')\n ? h(\n NPopconfirm,\n {\n onPositiveClick: () =>\n run(() => recycleApi.purge(activeTab.value, r.id), t('recycle.purged')).then(\n ok => {\n if (ok) refreshTab(activeTab.value)\n },\n ),\n },\n {\n trigger: () =>\n h(NButton, { size: 'small', quaternary: true, type: 'error' }, () =>\n t('recycle.purge'),\n ),\n default: () => t('recycle.purgeConfirm', { name: r.name }),\n },\n )\n : null,\n ]),\n },\n]\n</script>\n\n<template>\n <div class=\"view fill-page\">\n <!-- 形状 4:.fill-tabs 把 n-tabs → 面板容器 → .n-tab-pane 一路拉成 flex 列,\n 面板里的 SmartTable 就接上高度链了(见 styles/layout.css ⑧)。 -->\n <n-tabs v-model:value=\"activeTab\" type=\"line\" animated class=\"fill-tabs\">\n <n-tab-pane v-for=\"type in types\" :key=\"type\" :name=\"type\" :tab=\"t(`recycle.tabs.${type}`)\">\n <SmartTable\n :default-page-size=\"100\"\n :ref=\"setTableRef(type)\"\n :columns=\"columns\"\n :fetcher=\"recycleApi.page(type)\"\n flex-height\n virtual-scroll\n :storage-key=\"`sys-recycle-${type}`\"\n @error=\"(e: unknown) => message.error(translateError(e))\"\n />\n </n-tab-pane>\n </n-tabs>\n </div>\n</template>\n\n<style scoped>\n/* display / flex-direction / 整屏高度链都在 styles/layout.css 的 .fill-page,这里只留卡片间距。 */\n.view {\n gap: var(--gap-card);\n}\n</style>\n"],"names":["t","useI18n","message","useMessage","run","useConfirm","authStore","useAuthStore","types","activeTab","ref","tableRefs","setTableRef","type","el","refreshTab","_a","columns","r","h","NSpace","NPopconfirm","recycleApi","ok","NButton","_openBlock","_createElementBlock","_hoisted_1","_createVNode","_unref","NTabs","$event","_Fragment","_renderList","NTabPane","SmartTable","_cache","e","translateError"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index2.vue.js","sources":["../../../../src/views/system/recycle/index.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { h, ref } from 'vue'\nimport { NButton, NSpace, NTabs, NTabPane, NPopconfirm, useMessage } from 'naive-ui'\nimport { useMediaQuery } from '@vueuse/core'\nimport { SmartTable, type SmartTableColumn, type SmartTableInst } from 'smart-naive-table'\nimport { useI18n } from 'vue-i18n'\nimport { useConfirm } from '#/composables/useConfirm'\nimport { useAuthStore } from '#/stores/auth'\nimport { recycleApi, type RecycleBinItem } from '#/api'\nimport { translateError } from '#/utils/error'\nimport { TABLE_MIN_ROW_HEIGHT, TABLE_TOOLBAR } from '#/utils/tableToolbar'\nimport TableTotal from '#/components/TableTotal/index.vue'\nimport {\n createClientFilterFetcher,\n passthroughFilterSerializer,\n deriveHeaderFilters,\n} from '#/utils/tableFilter'\n\nconst { t } = useI18n()\nconst message = useMessage()\nconst { run } = useConfirm()\nconst authStore = useAuthStore()\n\nconst types = [\n 'user',\n 'role',\n 'org',\n 'position',\n 'module',\n 'config',\n 'dict',\n 'menu',\n 'job',\n] as const\ntype RecycleType = (typeof types)[number]\nconst activeTab = ref<RecycleType>('user')\n// 窄屏页签放大到触控尺寸\nconst narrow = useMediaQuery('(max-width: 604px)')\n// 回收站端点没有过滤能力,搜索由前端求值;每个标签的接口不同,各配一个取数器。\n// fields 要与下面声明了 search 的列 key 一致\nconst clientFetchers = Object.fromEntries(\n types.map(type => [type, createClientFilterFetcher(recycleApi.page(type), ['name', 'code'])]),\n) as Record<RecycleType, ReturnType<typeof createClientFilterFetcher<RecycleBinItem>>>\nconst tableRefs = ref<Record<string, SmartTableInst<RecycleBinItem>>>({})\n\nfunction setTableRef(type: string) {\n // 函数 ref 的参数类型是宽泛的组件实例,收窄为 SmartTableInst 后存入映射\n return (el: unknown) => {\n if (el) tableRefs.value[type] = el as SmartTableInst<RecycleBinItem>\n }\n}\n\nfunction refreshTab(type: string) {\n tableRefs.value[type]?.refresh()\n}\n\nconst columns: SmartTableColumn<RecycleBinItem>[] = [\n { type: 'index', title: () => t('common.rowNo'), width: 64, align: 'center' },\n { key: 'name', title: () => t('recycle.name'), search: {} },\n {\n key: 'code',\n title: () => t('recycle.code'),\n search: {},\n // 编码可能为空(如岗位):空值画灰色的「—」\n render: r =>\n r.code ? h('span', { class: 'mono muted' }, r.code) : h('span', { class: 'faint' }, '—'),\n },\n { key: 'deletedAt', title: () => t('recycle.deletedAt'), format: 'datetime', width: 180 },\n {\n key: 'op',\n title: () => t('common.operation'),\n width: 180,\n align: 'right',\n fixed: 'right',\n hideInSetting: true,\n render: r =>\n h(NSpace, { size: 2, justify: 'end', wrapItem: false }, () => [\n authStore.hasPerm('POST:/api/v1/sys/recycle/{type}/{id}/restore')\n ? h(\n NPopconfirm,\n {\n onPositiveClick: () =>\n run(() => recycleApi.restore(activeTab.value, r.id), t('recycle.restored')).then(\n ok => {\n if (ok) refreshTab(activeTab.value)\n },\n ),\n },\n {\n trigger: () =>\n h(NButton, { size: 'small', quaternary: true, type: 'primary' }, () =>\n t('recycle.restore'),\n ),\n default: () => t('recycle.restoreConfirm', { name: r.name }),\n },\n )\n : null,\n authStore.hasPerm('DELETE:/api/v1/sys/recycle/{type}/{id}')\n ? h(\n NPopconfirm,\n {\n onPositiveClick: () =>\n run(() => recycleApi.purge(activeTab.value, r.id), t('recycle.purged')).then(\n ok => {\n if (ok) refreshTab(activeTab.value)\n },\n ),\n },\n {\n trigger: () =>\n h(NButton, { size: 'small', quaternary: true, type: 'error' }, () =>\n t('recycle.purge'),\n ),\n default: () => t('recycle.purgeConfirm', { name: r.name }),\n },\n )\n : null,\n ]),\n },\n]\nderiveHeaderFilters(columns)\n</script>\n\n<template>\n <div class=\"view fill-page\">\n <!-- 形状 4:.fill-tabs 把 n-tabs → 面板容器 → .n-tab-pane 一路拉成 flex 列,\n 面板里的 SmartTable 就接上高度链了(见 styles/layout.css ⑧)。 -->\n <!-- 9 个资源类型用 macOS 分段控件(轨道 + 滑块)切换:控件按内容收窄、靠左,不撑满整行;\n 窄屏放不下时轨道自己横向滑动。轨道 / 滑块色走主题的 --seg-track / --seg-thumb。 -->\n <n-tabs\n v-model:value=\"activeTab\"\n type=\"segment\"\n animated\n class=\"fill-tabs recycle-seg\"\n :size=\"narrow ? 'large' : 'medium'\"\n :pane-style=\"{ padding: 0 }\"\n >\n <n-tab-pane v-for=\"type in types\" :key=\"type\" :name=\"type\" :tab=\"t(`recycle.tabs.${type}`)\">\n <SmartTable\n :ref=\"setTableRef(type)\"\n :columns=\"columns\"\n :fetcher=\"clientFetchers[type]\"\n :toolbar=\"TABLE_TOOLBAR\"\n :search=\"{ container: 'table' }\"\n :filter-serializer=\"passthroughFilterSerializer\"\n fill-height\n :min-row-height=\"TABLE_MIN_ROW_HEIGHT\"\n card-on-narrow\n :storage-key=\"`sys-recycle-${type}`\"\n @error=\"(e: unknown) => message.error(translateError(e))\"\n >\n <template #pagination-prefix=\"{ itemCount }\">\n <TableTotal :count=\"itemCount\" />\n </template>\n </SmartTable>\n </n-tab-pane>\n </n-tabs>\n </div>\n</template>\n\n<style scoped>\n/* display / flex-direction / 整屏高度链都在 styles/layout.css 的 .fill-page,这里只留卡片间距。 */\n.view {\n gap: var(--gap-card);\n}\n\n/* 分段控件:naive 的 segment 轨道默认 width:100% 且各格等分,9 格会被撑成一条长带。\n 这里让轨道按内容收窄、靠左;格子按文字自适应宽度(滑块位置由 naive 按实际格宽量,不受影响)。 */\n.recycle-seg :deep(.n-tabs-nav) {\n align-self: flex-start;\n max-width: 100%;\n margin-bottom: var(--gap-card);\n}\n.recycle-seg :deep(.n-tabs-rail) {\n width: auto;\n overflow-x: auto;\n scrollbar-width: none;\n}\n.recycle-seg :deep(.n-tabs-rail::-webkit-scrollbar) {\n display: none;\n}\n.recycle-seg :deep(.n-tabs-tab-wrapper) {\n flex: 0 0 auto;\n}\n.recycle-seg :deep(.n-tabs-tab) {\n padding: 4px 14px;\n white-space: nowrap;\n}\n\n/* 辅助字样(表格单元格由库渲染,要 :deep) */\n:deep(.mono) {\n font-family: var(--font-mono);\n font-size: 13.5px;\n letter-spacing: 0;\n}\n:deep(.muted) {\n color: var(--text-2);\n}\n:deep(.faint) {\n color: var(--text-3);\n}\n</style>\n"],"names":["useI18n","message","useMessage","run","useConfirm","authStore","useAuthStore","types","activeTab","ref","narrow","useMediaQuery","clientFetchers","type","createClientFilterFetcher","recycleApi","tableRefs","setTableRef","el","refreshTab","_a","columns","r","h","NSpace","NPopconfirm","ok","NButton","deriveHeaderFilters","_openBlock","_createElementBlock","_hoisted_1","_createVNode","_unref","NTabs","$event","_Fragment","_renderList","NTabPane","SmartTable","TABLE_TOOLBAR","passthroughFilterSerializer","TABLE_MIN_ROW_HEIGHT","_cache","e","translateError","_withCtx","itemCount","TableTotal"],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { MenuTreeNode } from '../../../../types/menu';
|
|
2
|
+
import { ModuleRow } from '../../../../types/api';
|
|
3
|
+
type __VLS_Props = {
|
|
4
|
+
tree: MenuTreeNode[];
|
|
5
|
+
granted: number[];
|
|
6
|
+
modules: ModuleRow[];
|
|
7
|
+
defaultModuleId: number;
|
|
8
|
+
onSave: (ids: number[]) => unknown | Promise<unknown>;
|
|
9
|
+
};
|
|
10
|
+
type __VLS_ModelProps = {
|
|
11
|
+
'show'?: boolean;
|
|
12
|
+
};
|
|
13
|
+
type __VLS_PublicProps = __VLS_Props & __VLS_ModelProps;
|
|
14
|
+
declare const __VLS_export: import('vue').DefineComponent<__VLS_PublicProps, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {
|
|
15
|
+
"update:show": (value: boolean) => any;
|
|
16
|
+
}, string, import('vue').PublicProps, Readonly<__VLS_PublicProps> & Readonly<{
|
|
17
|
+
"onUpdate:show"?: ((value: boolean) => any) | undefined;
|
|
18
|
+
}>, {}, {}, {}, {}, string, import('vue').ComponentProvideOptions, false, {}, any>;
|
|
19
|
+
declare const _default: typeof __VLS_export;
|
|
20
|
+
export default _default;
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import t from "./GrantMenuSheet2.vue.js";
|
|
2
|
+
/* empty css */
|
|
3
|
+
import o from "../../../../_virtual/_plugin-vue_export-helper.js";
|
|
4
|
+
const m = /* @__PURE__ */ o(t, [["__scopeId", "data-v-cd5d3924"]]);
|
|
5
|
+
export {
|
|
6
|
+
m as default
|
|
7
|
+
};
|
|
8
|
+
//# sourceMappingURL=GrantMenuSheet.vue.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"GrantMenuSheet.vue.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;"}
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
import { defineComponent as V, useModel as I, computed as c, shallowRef as T, ref as w, watch as U, openBlock as S, createBlock as D, unref as e, normalizeStyle as E, withCtx as m, createElementVNode as r, normalizeClass as x, createVNode as v, toDisplayString as i, createElementBlock as G, createCommentVNode as W, createTextVNode as M, mergeModels as A } from "vue";
|
|
2
|
+
import { NModal as F, NButton as b } from "naive-ui";
|
|
3
|
+
import { useI18n as H } from "vue-i18n";
|
|
4
|
+
import { useWindowSize as O } from "@vueuse/core";
|
|
5
|
+
import P from "./GrantMenuTable.vue.js";
|
|
6
|
+
const R = { class: "gs-summary" }, $ = {
|
|
7
|
+
key: 0,
|
|
8
|
+
class: "gs-dirty"
|
|
9
|
+
}, j = 640, X = /* @__PURE__ */ V({
|
|
10
|
+
__name: "GrantMenuSheet",
|
|
11
|
+
props: /* @__PURE__ */ A({
|
|
12
|
+
tree: {},
|
|
13
|
+
granted: {},
|
|
14
|
+
modules: {},
|
|
15
|
+
defaultModuleId: {},
|
|
16
|
+
onSave: { type: Function }
|
|
17
|
+
}, {
|
|
18
|
+
show: { type: Boolean, default: !1 },
|
|
19
|
+
showModifiers: {}
|
|
20
|
+
}),
|
|
21
|
+
emits: ["update:show"],
|
|
22
|
+
setup(l) {
|
|
23
|
+
const s = I(l, "show"), p = l, { t: a } = H(), { width: k } = O(), u = c(() => k.value <= j), C = c(
|
|
24
|
+
() => u.value ? { width: "calc(100vw - 16px)", height: "calc(100dvh - 16px)" } : { width: "min(960px, calc(100vw - 48px))", height: "min(760px, calc(100dvh - 48px))" }
|
|
25
|
+
), g = c(() => u.value ? "large" : "medium"), z = {
|
|
26
|
+
display: "flex",
|
|
27
|
+
flexDirection: "column",
|
|
28
|
+
flex: "1 1 0",
|
|
29
|
+
minHeight: "0",
|
|
30
|
+
padding: "0",
|
|
31
|
+
overflow: "hidden"
|
|
32
|
+
}, N = { padding: "0" }, f = T([]), o = w({ on: 0, total: 0, pages: 0, buttons: 0, dirty: !1 });
|
|
33
|
+
U(
|
|
34
|
+
s,
|
|
35
|
+
(h) => {
|
|
36
|
+
h && (f.value = p.granted);
|
|
37
|
+
},
|
|
38
|
+
{ immediate: !0 }
|
|
39
|
+
);
|
|
40
|
+
const d = w(!1), y = c(() => !d.value);
|
|
41
|
+
async function B() {
|
|
42
|
+
d.value = !0;
|
|
43
|
+
try {
|
|
44
|
+
await p.onSave(f.value) !== !1 && (s.value = !1);
|
|
45
|
+
} catch {
|
|
46
|
+
} finally {
|
|
47
|
+
d.value = !1;
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
return (h, t) => (S(), D(e(F), {
|
|
51
|
+
show: s.value,
|
|
52
|
+
"onUpdate:show": t[3] || (t[3] = (n) => s.value = n),
|
|
53
|
+
preset: "card",
|
|
54
|
+
title: e(a)("role.grantMenus"),
|
|
55
|
+
closable: y.value,
|
|
56
|
+
"close-on-esc": y.value,
|
|
57
|
+
"mask-closable": !1,
|
|
58
|
+
"auto-focus": !1,
|
|
59
|
+
style: E(C.value),
|
|
60
|
+
"content-style": z,
|
|
61
|
+
"footer-style": N
|
|
62
|
+
}, {
|
|
63
|
+
footer: m(() => [
|
|
64
|
+
r("footer", {
|
|
65
|
+
class: x(["gs-foot", { "is-narrow": u.value }])
|
|
66
|
+
}, [
|
|
67
|
+
r("div", R, [
|
|
68
|
+
r("span", null, i(e(a)("role.grantSummary", { on: o.value.on, total: o.value.total })), 1),
|
|
69
|
+
r("span", null, i(e(a)("role.grantSummarySplit", { pages: o.value.pages, buttons: o.value.buttons })), 1),
|
|
70
|
+
o.value.dirty ? (S(), G("span", $, i(e(a)("role.grantUnsaved")), 1)) : W("", !0)
|
|
71
|
+
]),
|
|
72
|
+
v(e(b), {
|
|
73
|
+
size: g.value,
|
|
74
|
+
disabled: d.value,
|
|
75
|
+
onClick: t[2] || (t[2] = (n) => s.value = !1)
|
|
76
|
+
}, {
|
|
77
|
+
default: m(() => [
|
|
78
|
+
M(i(e(a)("common.cancel")), 1)
|
|
79
|
+
]),
|
|
80
|
+
_: 1
|
|
81
|
+
}, 8, ["size", "disabled"]),
|
|
82
|
+
v(e(b), {
|
|
83
|
+
type: "primary",
|
|
84
|
+
size: g.value,
|
|
85
|
+
loading: d.value,
|
|
86
|
+
onClick: B
|
|
87
|
+
}, {
|
|
88
|
+
default: m(() => [
|
|
89
|
+
M(i(e(a)("common.save")), 1)
|
|
90
|
+
]),
|
|
91
|
+
_: 1
|
|
92
|
+
}, 8, ["size", "loading"])
|
|
93
|
+
], 2)
|
|
94
|
+
]),
|
|
95
|
+
default: m(() => [
|
|
96
|
+
r("div", {
|
|
97
|
+
class: x(["gs", { "is-narrow": u.value }])
|
|
98
|
+
}, [
|
|
99
|
+
v(P, {
|
|
100
|
+
tree: l.tree,
|
|
101
|
+
granted: l.granted,
|
|
102
|
+
modules: l.modules,
|
|
103
|
+
"default-module-id": l.defaultModuleId,
|
|
104
|
+
compact: u.value,
|
|
105
|
+
"onUpdate:checked": t[0] || (t[0] = (n) => f.value = n),
|
|
106
|
+
onSummary: t[1] || (t[1] = (n) => o.value = n)
|
|
107
|
+
}, null, 8, ["tree", "granted", "modules", "default-module-id", "compact"])
|
|
108
|
+
], 2)
|
|
109
|
+
]),
|
|
110
|
+
_: 1
|
|
111
|
+
}, 8, ["show", "title", "closable", "close-on-esc", "style"]));
|
|
112
|
+
}
|
|
113
|
+
});
|
|
114
|
+
export {
|
|
115
|
+
X as default
|
|
116
|
+
};
|
|
117
|
+
//# sourceMappingURL=GrantMenuSheet2.vue.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"GrantMenuSheet2.vue.js","sources":["../../../../../src/views/system/role/components/GrantMenuSheet.vue"],"sourcesContent":["<script setup lang=\"ts\">\n// 授权菜单弹窗:居中卡片(窄屏近乎铺满),标题 / 工具区 / 列表 / 底栏四段。只有列表纵向滚动,\n// 底栏(已授权统计 + 取消/保存)永远在视野里 —— 不复用 FormContainer,因为它在 modal 形态下会随内容撑高,\n// 长列表会把保存钮顶出视口。弹窗定高、内容区 flex 吃满,滚动只发生在列表里。\n// onSave 协议同 FormContainer.onConfirm:返回 false 或抛错 → 不关闭;其余情况自动关。\nimport { computed, ref, shallowRef, watch, type CSSProperties } from 'vue'\nimport { NButton, NModal } from 'naive-ui'\nimport { useI18n } from 'vue-i18n'\nimport { useWindowSize } from '@vueuse/core'\nimport type { MenuTreeNode } from '#/types/menu'\nimport type { ModuleRow } from '#/types/api'\nimport GrantMenuTable from './GrantMenuTable.vue'\nimport type { GrantSummary } from './grantMenuGroups'\n\nconst show = defineModel<boolean>('show', { default: false })\n\nconst props = defineProps<{\n tree: MenuTreeNode[]\n granted: number[]\n modules: ModuleRow[]\n defaultModuleId: number\n onSave: (ids: number[]) => unknown | Promise<unknown>\n}>()\n\nconst { t } = useI18n()\n\n/** 窄于此宽度弹窗几乎铺满视口、控件放大一档。 */\nconst COMPACT = 640\nconst { width: winW } = useWindowSize()\nconst compact = computed(() => winW.value <= COMPACT)\n// 定高:列表再长弹窗也不超过视口;卡片是 flex 列,内容区吃剩余高度,滚动只在列表里\nconst modalStyle = computed(() =>\n compact.value\n ? { width: 'calc(100vw - 16px)', height: 'calc(100dvh - 16px)' }\n : { width: 'min(960px, calc(100vw - 48px))', height: 'min(760px, calc(100dvh - 48px))' },\n)\n// 窄屏是触屏:控件放大一档\nconst ctlSize = computed(() => (compact.value ? 'large' : 'medium'))\nconst contentStyle: CSSProperties = {\n display: 'flex',\n flexDirection: 'column',\n flex: '1 1 0',\n minHeight: '0',\n padding: '0',\n overflow: 'hidden',\n}\nconst footerStyle = { padding: '0' }\n\n// 勾选态在列表自己的 reactive 里,这里只收结果:打开时先是服务端现状,用户一改就跟着列表走\nconst checked = shallowRef<number[]>([])\nconst summary = ref<GrantSummary>({ on: 0, total: 0, pages: 0, buttons: 0, dirty: false })\nwatch(\n show,\n v => {\n if (v) checked.value = props.granted\n },\n { immediate: true },\n)\n\nconst saving = ref(false)\n// 提交中禁止任何途径关闭,防提交中途关闭导致状态错乱\nconst canClose = computed(() => !saving.value)\n\nasync function handleSave() {\n saving.value = true\n try {\n if ((await props.onSave(checked.value)) !== false) show.value = false\n } catch {\n // 静默:错误 toast 由业务 onSave 内负责\n } finally {\n saving.value = false\n }\n}\n</script>\n\n<template>\n <n-modal\n v-model:show=\"show\"\n preset=\"card\"\n :title=\"t('role.grantMenus')\"\n :closable=\"canClose\"\n :close-on-esc=\"canClose\"\n :mask-closable=\"false\"\n :auto-focus=\"false\"\n :style=\"modalStyle\"\n :content-style=\"contentStyle\"\n :footer-style=\"footerStyle\"\n >\n <div class=\"gs\" :class=\"{ 'is-narrow': compact }\">\n <GrantMenuTable\n :tree=\"tree\"\n :granted=\"granted\"\n :modules=\"modules\"\n :default-module-id=\"defaultModuleId\"\n :compact=\"compact\"\n @update:checked=\"checked = $event\"\n @summary=\"summary = $event\"\n />\n </div>\n\n <template #footer>\n <footer class=\"gs-foot\" :class=\"{ 'is-narrow': compact }\">\n <div class=\"gs-summary\">\n <span>{{ t('role.grantSummary', { on: summary.on, total: summary.total }) }}</span>\n <span>\n {{ t('role.grantSummarySplit', { pages: summary.pages, buttons: summary.buttons }) }}\n </span>\n <span v-if=\"summary.dirty\" class=\"gs-dirty\">{{ t('role.grantUnsaved') }}</span>\n </div>\n <n-button :size=\"ctlSize\" :disabled=\"saving\" @click=\"show = false\">\n {{ t('common.cancel') }}\n </n-button>\n <n-button type=\"primary\" :size=\"ctlSize\" :loading=\"saving\" @click=\"handleSave\">\n {{ t('common.save') }}\n </n-button>\n </footer>\n </template>\n </n-modal>\n</template>\n\n<style scoped>\n.gs {\n display: flex;\n flex: 1 1 0;\n flex-direction: column;\n min-height: 0;\n color: var(--text-1);\n}\n\n/* 底栏:永远可见,与列表之间一条发丝线 */\n.gs-foot {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 12px 20px 14px;\n border-top: 1px solid var(--hairline);\n}\n.gs-summary {\n flex: 1;\n min-width: 0;\n display: flex;\n align-items: center;\n flex-wrap: wrap;\n gap: 4px 12px;\n font-size: 13px;\n color: var(--text-2);\n font-variant-numeric: tabular-nums;\n}\n.gs-dirty {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n color: var(--warn);\n}\n.gs-dirty::before {\n content: '';\n width: 7px;\n height: 7px;\n border-radius: 50%;\n background: var(--warn);\n}\n\n/* 窄屏:统计行独占一行,按钮等分 */\n.gs-foot.is-narrow {\n flex-wrap: wrap;\n padding: 10px 16px 14px;\n}\n.gs-foot.is-narrow .gs-summary {\n flex: 1 1 100%;\n}\n.gs-foot.is-narrow .n-button {\n flex: 1;\n}\n</style>\n"],"names":["COMPACT","show","_useModel","__props","props","t","useI18n","winW","useWindowSize","compact","computed","modalStyle","ctlSize","contentStyle","footerStyle","checked","shallowRef","summary","ref","watch","v","saving","canClose","handleSave","_createBlock","_unref","NModal","$event","_createElementVNode","_normalizeClass","_hoisted_1","_toDisplayString","_createElementBlock","_hoisted_2","_createVNode","NButton","GrantMenuTable","_cache"],"mappings":";;;;;;;;GA2BMA,IAAU;;;;;;;;;;;;;;AAbhB,UAAMC,IAAOC,EAAoBC,GAAC,MAA0B,GAEtDC,IAAQD,GAQR,EAAE,GAAAE,EAAA,IAAMC,EAAA,GAIR,EAAE,OAAOC,EAAA,IAASC,EAAA,GAClBC,IAAUC,EAAS,MAAMH,EAAK,SAASP,CAAO,GAE9CW,IAAaD;AAAA,MAAS,MAC1BD,EAAQ,QACJ,EAAE,OAAO,sBAAsB,QAAQ,sBAAA,IACvC,EAAE,OAAO,kCAAkC,QAAQ,kCAAA;AAAA,IAAkC,GAGrFG,IAAUF,EAAS,MAAOD,EAAQ,QAAQ,UAAU,QAAS,GAC7DI,IAA8B;AAAA,MAClC,SAAS;AAAA,MACT,eAAe;AAAA,MACf,MAAM;AAAA,MACN,WAAW;AAAA,MACX,SAAS;AAAA,MACT,UAAU;AAAA,IAAA,GAENC,IAAc,EAAE,SAAS,IAAA,GAGzBC,IAAUC,EAAqB,EAAE,GACjCC,IAAUC,EAAkB,EAAE,IAAI,GAAG,OAAO,GAAG,OAAO,GAAG,SAAS,GAAG,OAAO,IAAO;AACzF,IAAAC;AAAA,MACElB;AAAA,MACA,CAAAmB,MAAK;AACH,QAAIA,MAAGL,EAAQ,QAAQX,EAAM;AAAA,MAC/B;AAAA,MACA,EAAE,WAAW,GAAA;AAAA,IAAK;AAGpB,UAAMiB,IAASH,EAAI,EAAK,GAElBI,IAAWZ,EAAS,MAAM,CAACW,EAAO,KAAK;AAE7C,mBAAeE,IAAa;AAC1B,MAAAF,EAAO,QAAQ;AACf,UAAI;AACF,QAAK,MAAMjB,EAAM,OAAOW,EAAQ,KAAK,MAAO,SAAY,QAAQ;AAAA,MAClE,QAAQ;AAAA,MAER,UAAA;AACE,QAAAM,EAAO,QAAQ;AAAA,MACjB;AAAA,IACF;2BAIEG,EAyCUC,EAAAC,CAAA,GAAA;AAAA,MAxCA,MAAMzB,EAAA;AAAA,8CAAAA,EAAI,QAAA0B;AAAA,MAClB,QAAO;AAAA,MACN,OAAOF,EAAApB,CAAA,EAAC,iBAAA;AAAA,MACR,UAAUiB,EAAA;AAAA,MACV,gBAAcA,EAAA;AAAA,MACd,iBAAe;AAAA,MACf,cAAY;AAAA,MACZ,SAAOX,EAAA,KAAU;AAAA,MACjB,iBAAeE;AAAA,MACf,gBAAcC;AAAA,IAAA;MAcJ,UACT,MAcS;AAAA,QAdTc,EAcS,UAAA;AAAA,UAdD,OAAKC,EAAA,CAAC,WAAS,EAAA,aAAwBpB,EAAA,OAAO,CAAA;AAAA,QAAA;UACpDmB,EAMM,OANNE,GAMM;AAAA,YALJF,EAAmF,QAAA,MAAAG,EAA1EN,KAAC,qBAAA,EAAA,IAA4BR,EAAA,MAAQ,IAAE,OAASA,EAAA,MAAQ,OAAK,CAAA,GAAA,CAAA;AAAA,YACtEW,EAEO,QAAA,MAAAG,EADFN,KAAC,0BAAA,EAAA,OAAoCR,EAAA,MAAQ,OAAK,SAAWA,EAAA,MAAQ,SAAO,CAAA,GAAA,CAAA;AAAA,YAErEA,EAAA,MAAQ,cAApBe,EAA+E,QAA/EC,GAA+EF,EAAhCN,EAAApB,CAAA,EAAC,mBAAA,CAAA,GAAA,CAAA;;UAElD6B,EAEWT,EAAAU,CAAA,GAAA;AAAA,YAFA,MAAMvB,EAAA;AAAA,YAAU,UAAUS,EAAA;AAAA,YAAS,gCAAOpB,EAAA,QAAI;AAAA,UAAA;uBACvD,MAAwB;AAAA,kBAArBwB,EAAApB,CAAA,EAAC,eAAA,CAAA,GAAA,CAAA;AAAA,YAAA;;;UAEN6B,EAEWT,EAAAU,CAAA,GAAA;AAAA,YAFD,MAAK;AAAA,YAAW,MAAMvB,EAAA;AAAA,YAAU,SAASS,EAAA;AAAA,YAAS,SAAOE;AAAA,UAAA;uBACjE,MAAsB;AAAA,kBAAnBE,EAAApB,CAAA,EAAC,aAAA,CAAA,GAAA,CAAA;AAAA,YAAA;;;;;iBAzBV,MAUM;AAAA,QAVNuB,EAUM,OAAA;AAAA,UAVD,OAAKC,EAAA,CAAC,MAAI,EAAA,aAAwBpB,EAAA,OAAO,CAAA;AAAA,QAAA;UAC5CyB,EAQEE,GAAA;AAAA,YAPC,MAAMjC,EAAA;AAAA,YACN,SAASA,EAAA;AAAA,YACT,SAASA,EAAA;AAAA,YACT,qBAAmBA,EAAA;AAAA,YACnB,SAASM,EAAA;AAAA,YACT,oBAAc4B,EAAA,CAAA,MAAAA,EAAA,CAAA,IAAA,CAAAV,MAAEZ,EAAA,QAAUY;AAAA,YAC1B,WAAOU,EAAA,CAAA,MAAAA,EAAA,CAAA,IAAA,CAAAV,MAAEV,EAAA,QAAUU;AAAA,UAAA;;;;;;;"}
|
|
@@ -1,17 +1,19 @@
|
|
|
1
1
|
import { MenuTreeNode } from '../../../../types/menu';
|
|
2
2
|
import { ModuleRow } from '../../../../types/api';
|
|
3
|
+
import { GrantSummary } from './grantMenuGroups';
|
|
3
4
|
type __VLS_Props = {
|
|
4
5
|
tree: MenuTreeNode[];
|
|
5
6
|
granted: number[];
|
|
6
7
|
modules: ModuleRow[];
|
|
7
8
|
defaultModuleId: number;
|
|
9
|
+
/** 窄屏(触屏):控件放大一档,行改成「名称 + 已选数」一行、胶囊另起一行 */
|
|
10
|
+
compact?: boolean;
|
|
8
11
|
};
|
|
9
|
-
declare
|
|
10
|
-
|
|
11
|
-
collectChecked: typeof collectChecked;
|
|
12
|
-
}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {} & {
|
|
12
|
+
declare const __VLS_export: import('vue').DefineComponent<__VLS_Props, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {} & {
|
|
13
|
+
summary: (summary: GrantSummary) => any;
|
|
13
14
|
"update:checked": (ids: number[]) => any;
|
|
14
15
|
}, string, import('vue').PublicProps, Readonly<__VLS_Props> & Readonly<{
|
|
16
|
+
onSummary?: ((summary: GrantSummary) => any) | undefined;
|
|
15
17
|
"onUpdate:checked"?: ((ids: number[]) => any) | undefined;
|
|
16
18
|
}>, {}, {}, {}, {}, string, import('vue').ComponentProvideOptions, false, {}, any>;
|
|
17
19
|
declare const _default: typeof __VLS_export;
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import o from "./GrantMenuTable2.vue.js";
|
|
2
2
|
/* empty css */
|
|
3
3
|
import t from "../../../../_virtual/_plugin-vue_export-helper.js";
|
|
4
|
-
const
|
|
4
|
+
const f = /* @__PURE__ */ t(o, [["__scopeId", "data-v-4bf1bdcb"]]);
|
|
5
5
|
export {
|
|
6
|
-
|
|
6
|
+
f as default
|
|
7
7
|
};
|
|
8
8
|
//# sourceMappingURL=GrantMenuTable.vue.js.map
|