smart-admin-web 10.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +201 -0
- package/README.md +78 -0
- package/dist/App.vue.d.ts +3 -0
- package/dist/App.vue.js +54 -0
- package/dist/App.vue.js.map +1 -0
- package/dist/App2.vue.js +5 -0
- package/dist/App2.vue.js.map +1 -0
- package/dist/_virtual/_plugin-vue_export-helper.js +10 -0
- package/dist/_virtual/_plugin-vue_export-helper.js.map +1 -0
- package/dist/api/client.d.ts +29 -0
- package/dist/api/client.js +139 -0
- package/dist/api/client.js.map +1 -0
- package/dist/api/index.d.ts +672 -0
- package/dist/api/index.js +638 -0
- package/dist/api/index.js.map +1 -0
- package/dist/api/reauthGate.d.ts +16 -0
- package/dist/api/reauthGate.js +21 -0
- package/dist/api/reauthGate.js.map +1 -0
- package/dist/api/schema.d.ts +10230 -0
- package/dist/assets/icons/ph-subset.json.js +16 -0
- package/dist/assets/icons/ph-subset.json.js.map +1 -0
- package/dist/assets/oauth/dingtalk.svg.js +5 -0
- package/dist/assets/oauth/dingtalk.svg.js.map +1 -0
- package/dist/assets/oauth/gitee.svg.js +5 -0
- package/dist/assets/oauth/gitee.svg.js.map +1 -0
- package/dist/assets/oauth/github.svg.js +5 -0
- package/dist/assets/oauth/github.svg.js.map +1 -0
- package/dist/assets/oauth/qq.svg.js +5 -0
- package/dist/assets/oauth/qq.svg.js.map +1 -0
- package/dist/assets/oauth/wechat.svg.js +5 -0
- package/dist/assets/oauth/wechat.svg.js.map +1 -0
- package/dist/assets/oauth/wecom.svg.js +5 -0
- package/dist/assets/oauth/wecom.svg.js.map +1 -0
- package/dist/assets/svg/star.svg.js +6 -0
- package/dist/assets/svg/star.svg.js.map +1 -0
- package/dist/components/ApiSelect/index.vue.d.ts +22 -0
- package/dist/components/ApiSelect/index.vue.js +50 -0
- package/dist/components/ApiSelect/index.vue.js.map +1 -0
- package/dist/components/ApiSelect/index2.vue.js +5 -0
- package/dist/components/ApiSelect/index2.vue.js.map +1 -0
- package/dist/components/AppIcon.vue.d.ts +7 -0
- package/dist/components/AppIcon.vue.js +33 -0
- package/dist/components/AppIcon.vue.js.map +1 -0
- package/dist/components/AppIcon2.vue.js +5 -0
- package/dist/components/AppIcon2.vue.js.map +1 -0
- package/dist/components/Chart/BarChart.vue.d.ts +13 -0
- package/dist/components/Chart/BarChart.vue.js +27 -0
- package/dist/components/Chart/BarChart.vue.js.map +1 -0
- package/dist/components/Chart/BarChart2.vue.js +5 -0
- package/dist/components/Chart/BarChart2.vue.js.map +1 -0
- package/dist/components/Chart/LineChart.vue.d.ts +15 -0
- package/dist/components/Chart/LineChart.vue.js +33 -0
- package/dist/components/Chart/LineChart.vue.js.map +1 -0
- package/dist/components/Chart/LineChart2.vue.js +5 -0
- package/dist/components/Chart/LineChart2.vue.js.map +1 -0
- package/dist/components/Chart/PieChart.vue.d.ts +14 -0
- package/dist/components/Chart/PieChart.vue.js +31 -0
- package/dist/components/Chart/PieChart.vue.js.map +1 -0
- package/dist/components/Chart/PieChart2.vue.js +5 -0
- package/dist/components/Chart/PieChart2.vue.js.map +1 -0
- package/dist/components/Chart/echarts.d.ts +57 -0
- package/dist/components/Chart/echarts.js +47 -0
- package/dist/components/Chart/echarts.js.map +1 -0
- package/dist/components/Chart/index.vue.d.ts +12 -0
- package/dist/components/Chart/index.vue.js +8 -0
- package/dist/components/Chart/index.vue.js.map +1 -0
- package/dist/components/Chart/index2.vue.js +27 -0
- package/dist/components/Chart/index2.vue.js.map +1 -0
- package/dist/components/CodeBlock/index.vue.d.ts +17 -0
- package/dist/components/CodeBlock/index.vue.js +8 -0
- package/dist/components/CodeBlock/index.vue.js.map +1 -0
- package/dist/components/CodeBlock/index2.vue.js +48 -0
- package/dist/components/CodeBlock/index2.vue.js.map +1 -0
- package/dist/components/CronEditor/index.vue.d.ts +15 -0
- package/dist/components/CronEditor/index.vue.js +8 -0
- package/dist/components/CronEditor/index.vue.js.map +1 -0
- package/dist/components/CronEditor/index2.vue.js +528 -0
- package/dist/components/CronEditor/index2.vue.js.map +1 -0
- package/dist/components/DetailPage/index.vue.d.ts +26 -0
- package/dist/components/DetailPage/index.vue.js +8 -0
- package/dist/components/DetailPage/index.vue.js.map +1 -0
- package/dist/components/DetailPage/index2.vue.js +51 -0
- package/dist/components/DetailPage/index2.vue.js.map +1 -0
- package/dist/components/DictCheckbox/index.vue.d.ts +6 -0
- package/dist/components/DictCheckbox/index.vue.js +43 -0
- package/dist/components/DictCheckbox/index.vue.js.map +1 -0
- package/dist/components/DictCheckbox/index2.vue.js +5 -0
- package/dist/components/DictCheckbox/index2.vue.js.map +1 -0
- package/dist/components/DictRadio/index.vue.d.ts +6 -0
- package/dist/components/DictRadio/index.vue.js +38 -0
- package/dist/components/DictRadio/index.vue.js.map +1 -0
- package/dist/components/DictRadio/index2.vue.js +5 -0
- package/dist/components/DictRadio/index2.vue.js.map +1 -0
- package/dist/components/DictSelect/index.vue.d.ts +6 -0
- package/dist/components/DictSelect/index.vue.js +37 -0
- package/dist/components/DictSelect/index.vue.js.map +1 -0
- package/dist/components/DictSelect/index2.vue.js +5 -0
- package/dist/components/DictSelect/index2.vue.js.map +1 -0
- package/dist/components/DictTag/index.vue.d.ts +10 -0
- package/dist/components/DictTag/index.vue.js +48 -0
- package/dist/components/DictTag/index.vue.js.map +1 -0
- package/dist/components/DictTag/index2.vue.js +5 -0
- package/dist/components/DictTag/index2.vue.js.map +1 -0
- package/dist/components/ErrorBoundary/index.vue.d.ts +13 -0
- package/dist/components/ErrorBoundary/index.vue.js +8 -0
- package/dist/components/ErrorBoundary/index.vue.js.map +1 -0
- package/dist/components/ErrorBoundary/index2.vue.js +61 -0
- package/dist/components/ErrorBoundary/index2.vue.js.map +1 -0
- package/dist/components/ExportColumnsModal/index.vue.d.ts +19 -0
- package/dist/components/ExportColumnsModal/index.vue.js +8 -0
- package/dist/components/ExportColumnsModal/index.vue.js.map +1 -0
- package/dist/components/ExportColumnsModal/index2.vue.js +121 -0
- package/dist/components/ExportColumnsModal/index2.vue.js.map +1 -0
- package/dist/components/FileUpload/index.vue.d.ts +24 -0
- package/dist/components/FileUpload/index.vue.js +42 -0
- package/dist/components/FileUpload/index.vue.js.map +1 -0
- package/dist/components/FileUpload/index2.vue.js +5 -0
- package/dist/components/FileUpload/index2.vue.js.map +1 -0
- package/dist/components/FormContainer/index.vue.d.ts +51 -0
- package/dist/components/FormContainer/index.vue.js +160 -0
- package/dist/components/FormContainer/index.vue.js.map +1 -0
- package/dist/components/FormContainer/index3.vue.js +6 -0
- package/dist/components/FormContainer/index3.vue.js.map +1 -0
- package/dist/components/IconPicker/index.vue.d.ts +18 -0
- package/dist/components/IconPicker/index.vue.js +43 -0
- package/dist/components/IconPicker/index.vue.js.map +1 -0
- package/dist/components/IconPicker/index2.vue.js +5 -0
- package/dist/components/IconPicker/index2.vue.js.map +1 -0
- package/dist/components/ImportWizard/index.vue.d.ts +39 -0
- package/dist/components/ImportWizard/index.vue.js +8 -0
- package/dist/components/ImportWizard/index.vue.js.map +1 -0
- package/dist/components/ImportWizard/index2.vue.js +634 -0
- package/dist/components/ImportWizard/index2.vue.js.map +1 -0
- package/dist/components/JsonEditor/index.vue.d.ts +12 -0
- package/dist/components/JsonEditor/index.vue.js +87 -0
- package/dist/components/JsonEditor/index.vue.js.map +1 -0
- package/dist/components/JsonEditor/index2.vue.js +5 -0
- package/dist/components/JsonEditor/index2.vue.js.map +1 -0
- package/dist/components/MarkdownEditor/MarkdownView.vue.d.ts +6 -0
- package/dist/components/MarkdownEditor/MarkdownView.vue.js +33 -0
- package/dist/components/MarkdownEditor/MarkdownView.vue.js.map +1 -0
- package/dist/components/MarkdownEditor/MarkdownView2.vue.js +5 -0
- package/dist/components/MarkdownEditor/MarkdownView2.vue.js.map +1 -0
- package/dist/components/MarkdownEditor/index.vue.d.ts +10 -0
- package/dist/components/MarkdownEditor/index.vue.js +35 -0
- package/dist/components/MarkdownEditor/index.vue.js.map +1 -0
- package/dist/components/MarkdownEditor/index2.vue.js +5 -0
- package/dist/components/MarkdownEditor/index2.vue.js.map +1 -0
- package/dist/components/MenuSearch.vue.d.ts +10 -0
- package/dist/components/MenuSearch.vue.js +8 -0
- package/dist/components/MenuSearch.vue.js.map +1 -0
- package/dist/components/MenuSearch2.vue.js +121 -0
- package/dist/components/MenuSearch2.vue.js.map +1 -0
- package/dist/components/OrgTreeSelect/index.vue.d.ts +6 -0
- package/dist/components/OrgTreeSelect/index.vue.js +42 -0
- package/dist/components/OrgTreeSelect/index.vue.js.map +1 -0
- package/dist/components/OrgTreeSelect/index2.vue.js +5 -0
- package/dist/components/OrgTreeSelect/index2.vue.js.map +1 -0
- package/dist/components/PasswordStrength/index.vue.d.ts +6 -0
- package/dist/components/PasswordStrength/index.vue.js +8 -0
- package/dist/components/PasswordStrength/index.vue.js.map +1 -0
- package/dist/components/PasswordStrength/index2.vue.js +91 -0
- package/dist/components/PasswordStrength/index2.vue.js.map +1 -0
- package/dist/components/ReauthModal.vue.d.ts +3 -0
- package/dist/components/ReauthModal.vue.js +8 -0
- package/dist/components/ReauthModal.vue.js.map +1 -0
- package/dist/components/ReauthModal2.vue.js +139 -0
- package/dist/components/ReauthModal2.vue.js.map +1 -0
- package/dist/components/RoleSelect/index.vue.d.ts +8 -0
- package/dist/components/RoleSelect/index.vue.js +26 -0
- package/dist/components/RoleSelect/index.vue.js.map +1 -0
- package/dist/components/RoleSelect/index2.vue.js +5 -0
- package/dist/components/RoleSelect/index2.vue.js.map +1 -0
- package/dist/components/SelectTable/index.vue.d.ts +76 -0
- package/dist/components/SelectTable/index.vue.js +8 -0
- package/dist/components/SelectTable/index.vue.js.map +1 -0
- package/dist/components/SelectTable/index2.vue.js +256 -0
- package/dist/components/SelectTable/index2.vue.js.map +1 -0
- package/dist/components/SmartLogo.vue.d.ts +8 -0
- package/dist/components/SmartLogo.vue.js +8 -0
- package/dist/components/SmartLogo.vue.js.map +1 -0
- package/dist/components/SmartLogo2.vue.js +74 -0
- package/dist/components/SmartLogo2.vue.js.map +1 -0
- package/dist/components/StatusSwitch/index.vue.d.ts +21 -0
- package/dist/components/StatusSwitch/index.vue.js +45 -0
- package/dist/components/StatusSwitch/index.vue.js.map +1 -0
- package/dist/components/StatusSwitch/index2.vue.js +5 -0
- package/dist/components/StatusSwitch/index2.vue.js.map +1 -0
- package/dist/components/TableZoomButton/index.vue.d.ts +13 -0
- package/dist/components/TableZoomButton/index.vue.js +42 -0
- package/dist/components/TableZoomButton/index.vue.js.map +1 -0
- package/dist/components/TableZoomButton/index2.vue.js +5 -0
- package/dist/components/TableZoomButton/index2.vue.js.map +1 -0
- package/dist/components/UserPicker/index.vue.d.ts +13 -0
- package/dist/components/UserPicker/index.vue.js +8 -0
- package/dist/components/UserPicker/index.vue.js.map +1 -0
- package/dist/components/UserPicker/index2.vue.js +214 -0
- package/dist/components/UserPicker/index2.vue.js.map +1 -0
- package/dist/components/UserSelect/index.vue.d.ts +9 -0
- package/dist/components/UserSelect/index.vue.js +32 -0
- package/dist/components/UserSelect/index.vue.js.map +1 -0
- package/dist/components/UserSelect/index2.vue.js +5 -0
- package/dist/components/UserSelect/index2.vue.js.map +1 -0
- package/dist/components/oauth/BrandIcon.vue.d.ts +12 -0
- package/dist/components/oauth/BrandIcon.vue.js +8 -0
- package/dist/components/oauth/BrandIcon.vue.js.map +1 -0
- package/dist/components/oauth/BrandIcon2.vue.js +95 -0
- package/dist/components/oauth/BrandIcon2.vue.js.map +1 -0
- package/dist/composables/authMenuRoute.d.ts +32 -0
- package/dist/composables/authMenuRoute.js +37 -0
- package/dist/composables/authMenuRoute.js.map +1 -0
- package/dist/composables/clearClientCache.d.ts +10 -0
- package/dist/composables/clearClientCache.js +17 -0
- package/dist/composables/clearClientCache.js.map +1 -0
- package/dist/composables/useAuthMenu.d.ts +3 -0
- package/dist/composables/useAuthMenu.js +61 -0
- package/dist/composables/useAuthMenu.js.map +1 -0
- package/dist/composables/useBatchDelete.d.ts +18 -0
- package/dist/composables/useBatchDelete.js +21 -0
- package/dist/composables/useBatchDelete.js.map +1 -0
- package/dist/composables/useCompactScreen.d.ts +12 -0
- package/dist/composables/useCompactScreen.js +17 -0
- package/dist/composables/useCompactScreen.js.map +1 -0
- package/dist/composables/useConfirm.d.ts +18 -0
- package/dist/composables/useConfirm.js +61 -0
- package/dist/composables/useConfirm.js.map +1 -0
- package/dist/composables/useFullscreenToggle.d.ts +11 -0
- package/dist/composables/useFullscreenToggle.js +64 -0
- package/dist/composables/useFullscreenToggle.js.map +1 -0
- package/dist/composables/useHeaderTools.d.ts +31 -0
- package/dist/composables/useHeaderTools.js +15 -0
- package/dist/composables/useHeaderTools.js.map +1 -0
- package/dist/composables/useLayoutMenu.d.ts +17 -0
- package/dist/composables/useLayoutMenu.js +93 -0
- package/dist/composables/useLayoutMenu.js.map +1 -0
- package/dist/composables/useMenuBadge.d.ts +11 -0
- package/dist/composables/useMenuBadge.js +17 -0
- package/dist/composables/useMenuBadge.js.map +1 -0
- package/dist/composables/useMenuFlat.d.ts +8 -0
- package/dist/composables/useMenuFlat.js +29 -0
- package/dist/composables/useMenuFlat.js.map +1 -0
- package/dist/composables/useModule.d.ts +16 -0
- package/dist/composables/useModule.js +44 -0
- package/dist/composables/useModule.js.map +1 -0
- package/dist/composables/useNoticeAction.d.ts +8 -0
- package/dist/composables/useNoticeAction.js +79 -0
- package/dist/composables/useNoticeAction.js.map +1 -0
- package/dist/composables/usePageTitle.d.ts +1 -0
- package/dist/composables/usePageTitle.js +20 -0
- package/dist/composables/usePageTitle.js.map +1 -0
- package/dist/composables/useRealtime.d.ts +31 -0
- package/dist/composables/useRealtime.js +59 -0
- package/dist/composables/useRealtime.js.map +1 -0
- package/dist/composables/useSite.d.ts +24 -0
- package/dist/composables/useSite.js +27 -0
- package/dist/composables/useSite.js.map +1 -0
- package/dist/composables/useTabTitle.d.ts +1 -0
- package/dist/composables/useTabTitle.js +10 -0
- package/dist/composables/useTabTitle.js.map +1 -0
- package/dist/composables/useTableRowSort.d.ts +20 -0
- package/dist/composables/useTableRowSort.js +59 -0
- package/dist/composables/useTableRowSort.js.map +1 -0
- package/dist/composables/useTableZoom.d.ts +5 -0
- package/dist/composables/useTableZoom.js +30 -0
- package/dist/composables/useTableZoom.js.map +1 -0
- package/dist/composables/useTheme.d.ts +13 -0
- package/dist/composables/useTheme.js +30 -0
- package/dist/composables/useTheme.js.map +1 -0
- package/dist/composables/useVisualViewportHeight.d.ts +3 -0
- package/dist/composables/useVisualViewportHeight.js +16 -0
- package/dist/composables/useVisualViewportHeight.js.map +1 -0
- package/dist/createSmartAdmin.d.ts +56 -0
- package/dist/createSmartAdmin.js +76 -0
- package/dist/createSmartAdmin.js.map +1 -0
- package/dist/directives/auth.d.ts +16 -0
- package/dist/directives/auth.js +19 -0
- package/dist/directives/auth.js.map +1 -0
- package/dist/env.d.ts +10 -0
- package/dist/index.d.ts +90 -0
- package/dist/index.js +273 -0
- package/dist/index.js.map +1 -0
- package/dist/layouts/AppHeader.vue.d.ts +12 -0
- package/dist/layouts/AppHeader.vue.js +8 -0
- package/dist/layouts/AppHeader.vue.js.map +1 -0
- package/dist/layouts/AppHeader2.vue.js +352 -0
- package/dist/layouts/AppHeader2.vue.js.map +1 -0
- package/dist/layouts/LayoutModeCards.vue.d.ts +3 -0
- package/dist/layouts/LayoutModeCards.vue.js +8 -0
- package/dist/layouts/LayoutModeCards.vue.js.map +1 -0
- package/dist/layouts/LayoutModeCards2.vue.js +67 -0
- package/dist/layouts/LayoutModeCards2.vue.js.map +1 -0
- package/dist/layouts/NoticeBell.vue.d.ts +3 -0
- package/dist/layouts/NoticeBell.vue.js +8 -0
- package/dist/layouts/NoticeBell.vue.js.map +1 -0
- package/dist/layouts/NoticeBell2.vue.js +292 -0
- package/dist/layouts/NoticeBell2.vue.js.map +1 -0
- package/dist/layouts/PersonalLayout.vue.d.ts +3 -0
- package/dist/layouts/PersonalLayout.vue.js +8 -0
- package/dist/layouts/PersonalLayout.vue.js.map +1 -0
- package/dist/layouts/PersonalLayout2.vue.js +65 -0
- package/dist/layouts/PersonalLayout2.vue.js.map +1 -0
- package/dist/layouts/SettingRow.vue.d.ts +16 -0
- package/dist/layouts/SettingRow.vue.js +8 -0
- package/dist/layouts/SettingRow.vue.js.map +1 -0
- package/dist/layouts/SettingRow2.vue.js +23 -0
- package/dist/layouts/SettingRow2.vue.js.map +1 -0
- package/dist/layouts/SettingsDrawer.vue.d.ts +10 -0
- package/dist/layouts/SettingsDrawer.vue.js +8 -0
- package/dist/layouts/SettingsDrawer.vue.js.map +1 -0
- package/dist/layouts/SettingsDrawer2.vue.js +380 -0
- package/dist/layouts/SettingsDrawer2.vue.js.map +1 -0
- package/dist/layouts/TabsBar.vue.d.ts +3 -0
- package/dist/layouts/TabsBar.vue.js +8 -0
- package/dist/layouts/TabsBar.vue.js.map +1 -0
- package/dist/layouts/TabsBar2.vue.js +132 -0
- package/dist/layouts/TabsBar2.vue.js.map +1 -0
- package/dist/layouts/components/SideNav.vue.d.ts +15 -0
- package/dist/layouts/components/SideNav.vue.js +8 -0
- package/dist/layouts/components/SideNav.vue.js.map +1 -0
- package/dist/layouts/components/SideNav2.vue.js +49 -0
- package/dist/layouts/components/SideNav2.vue.js.map +1 -0
- package/dist/layouts/default.vue.d.ts +3 -0
- package/dist/layouts/default.vue.js +8 -0
- package/dist/layouts/default.vue.js.map +1 -0
- package/dist/layouts/default2.vue.js +213 -0
- package/dist/layouts/default2.vue.js.map +1 -0
- package/dist/lib/chunkReload.d.ts +9 -0
- package/dist/lib/chunkReload.js +24 -0
- package/dist/lib/chunkReload.js.map +1 -0
- package/dist/lib/icons.d.ts +2 -0
- package/dist/lib/icons.js +39 -0
- package/dist/lib/icons.js.map +1 -0
- package/dist/lib/loadingBar.d.ts +7 -0
- package/dist/lib/loadingBar.js +18 -0
- package/dist/lib/loadingBar.js.map +1 -0
- package/dist/lib/markdown.d.ts +8 -0
- package/dist/lib/markdown.js +16 -0
- package/dist/lib/markdown.js.map +1 -0
- package/dist/lib/markdownLinks.d.ts +26 -0
- package/dist/lib/markdownLinks.js +21 -0
- package/dist/lib/markdownLinks.js.map +1 -0
- package/dist/lib/noticeActions.d.ts +13 -0
- package/dist/lib/noticeActions.js +16 -0
- package/dist/lib/noticeActions.js.map +1 -0
- package/dist/lib/runtime.d.ts +21 -0
- package/dist/lib/runtime.js +13 -0
- package/dist/lib/runtime.js.map +1 -0
- package/dist/locales/en-US.d.ts +1358 -0
- package/dist/locales/en-US.js +1362 -0
- package/dist/locales/en-US.js.map +1 -0
- package/dist/locales/index.d.ts +30 -0
- package/dist/locales/index.js +46 -0
- package/dist/locales/index.js.map +1 -0
- package/dist/locales/menuTitle.d.ts +8 -0
- package/dist/locales/menuTitle.js +19 -0
- package/dist/locales/menuTitle.js.map +1 -0
- package/dist/locales/zh-CN.d.ts +1358 -0
- package/dist/locales/zh-CN.js +1368 -0
- package/dist/locales/zh-CN.js.map +1 -0
- package/dist/router/bootFailure.d.ts +8 -0
- package/dist/router/bootFailure.js +11 -0
- package/dist/router/bootFailure.js.map +1 -0
- package/dist/router/detailRoutes.d.ts +2 -0
- package/dist/router/detailRoutes.js +19 -0
- package/dist/router/detailRoutes.js.map +1 -0
- package/dist/router/index.d.ts +3 -0
- package/dist/router/index.js +58 -0
- package/dist/router/index.js.map +1 -0
- package/dist/router/namedPage.d.ts +13 -0
- package/dist/router/namedPage.js +12 -0
- package/dist/router/namedPage.js.map +1 -0
- package/dist/router/routes.d.ts +2 -0
- package/dist/router/routes.js +121 -0
- package/dist/router/routes.js.map +1 -0
- package/dist/router/viewRegistry.d.ts +18 -0
- package/dist/router/viewRegistry.js +26 -0
- package/dist/router/viewRegistry.js.map +1 -0
- package/dist/stores/app.d.ts +83 -0
- package/dist/stores/app.js +82 -0
- package/dist/stores/app.js.map +1 -0
- package/dist/stores/auth.d.ts +106 -0
- package/dist/stores/auth.js +59 -0
- package/dist/stores/auth.js.map +1 -0
- package/dist/stores/dict.d.ts +11 -0
- package/dist/stores/dict.js +36 -0
- package/dist/stores/dict.js.map +1 -0
- package/dist/stores/tabs.d.ts +53 -0
- package/dist/stores/tabs.js +88 -0
- package/dist/stores/tabs.js.map +1 -0
- package/dist/stores/user.d.ts +64 -0
- package/dist/stores/user.js +64 -0
- package/dist/stores/user.js.map +1 -0
- package/dist/style.css +1 -0
- package/dist/theme/accents.d.ts +2 -0
- package/dist/theme/accents.js +5 -0
- package/dist/theme/accents.js.map +1 -0
- package/dist/theme/mix.d.ts +26 -0
- package/dist/theme/mix.js +43 -0
- package/dist/theme/mix.js.map +1 -0
- package/dist/theme/naive-theme.d.ts +9 -0
- package/dist/theme/naive-theme.js +89 -0
- package/dist/theme/naive-theme.js.map +1 -0
- package/dist/types/api.d.ts +714 -0
- package/dist/types/api.js +15 -0
- package/dist/types/api.js.map +1 -0
- package/dist/types/menu.d.ts +67 -0
- package/dist/types/menu.js +26 -0
- package/dist/types/menu.js.map +1 -0
- package/dist/utils/chunkUpload.d.ts +6 -0
- package/dist/utils/chunkUpload.js +35 -0
- package/dist/utils/chunkUpload.js.map +1 -0
- package/dist/utils/download.d.ts +8 -0
- package/dist/utils/download.js +8 -0
- package/dist/utils/download.js.map +1 -0
- package/dist/utils/error.d.ts +14 -0
- package/dist/utils/error.js +50 -0
- package/dist/utils/error.js.map +1 -0
- package/dist/utils/format.d.ts +20 -0
- package/dist/utils/format.js +19 -0
- package/dist/utils/format.js.map +1 -0
- package/dist/utils/importDup.d.ts +17 -0
- package/dist/utils/importDup.js +18 -0
- package/dist/utils/importDup.js.map +1 -0
- package/dist/utils/oauthBrand.d.ts +100 -0
- package/dist/utils/oauthBrand.js +97 -0
- package/dist/utils/oauthBrand.js.map +1 -0
- package/dist/utils/tree.d.ts +33 -0
- package/dist/utils/tree.js +47 -0
- package/dist/utils/tree.js.map +1 -0
- package/dist/utils/ua.d.ts +7 -0
- package/dist/utils/ua.js +33 -0
- package/dist/utils/ua.js.map +1 -0
- package/dist/utils/url.d.ts +16 -0
- package/dist/utils/url.js +13 -0
- package/dist/utils/url.js.map +1 -0
- package/dist/views/dashboard/biz.vue.d.ts +3 -0
- package/dist/views/dashboard/biz.vue.js +8 -0
- package/dist/views/dashboard/biz.vue.js.map +1 -0
- package/dist/views/dashboard/biz2.vue.js +136 -0
- package/dist/views/dashboard/biz2.vue.js.map +1 -0
- package/dist/views/dashboard/workbench.vue.d.ts +3 -0
- package/dist/views/dashboard/workbench.vue.js +8 -0
- package/dist/views/dashboard/workbench.vue.js.map +1 -0
- package/dist/views/dashboard/workbench2.vue.js +195 -0
- package/dist/views/dashboard/workbench2.vue.js.map +1 -0
- package/dist/views/embed/iframe.vue.d.ts +3 -0
- package/dist/views/embed/iframe.vue.js +8 -0
- package/dist/views/embed/iframe.vue.js.map +1 -0
- package/dist/views/embed/iframe2.vue.js +21 -0
- package/dist/views/embed/iframe2.vue.js.map +1 -0
- package/dist/views/error/404.vue.d.ts +3 -0
- package/dist/views/error/404.vue.js +8 -0
- package/dist/views/error/404.vue.js.map +1 -0
- package/dist/views/error/4042.vue.js +31 -0
- package/dist/views/error/4042.vue.js.map +1 -0
- package/dist/views/error/BootError.vue.d.ts +3 -0
- package/dist/views/error/BootError.vue.js +8 -0
- package/dist/views/error/BootError.vue.js.map +1 -0
- package/dist/views/error/BootError2.vue.js +57 -0
- package/dist/views/error/BootError2.vue.js.map +1 -0
- package/dist/views/error/MissingRoute.vue.d.ts +3 -0
- package/dist/views/error/MissingRoute.vue.js +8 -0
- package/dist/views/error/MissingRoute.vue.js.map +1 -0
- package/dist/views/error/MissingRoute2.vue.js +23 -0
- package/dist/views/error/MissingRoute2.vue.js.map +1 -0
- package/dist/views/login/LoginForm.vue.d.ts +12 -0
- package/dist/views/login/LoginForm.vue.js +8 -0
- package/dist/views/login/LoginForm.vue.js.map +1 -0
- package/dist/views/login/LoginForm2.vue.js +642 -0
- package/dist/views/login/LoginForm2.vue.js.map +1 -0
- package/dist/views/login/index.vue.d.ts +3 -0
- package/dist/views/login/index.vue.js +8 -0
- package/dist/views/login/index.vue.js.map +1 -0
- package/dist/views/login/index2.vue.js +79 -0
- package/dist/views/login/index2.vue.js.map +1 -0
- package/dist/views/login/skins/AuroraGlass.vue.d.ts +3 -0
- package/dist/views/login/skins/AuroraGlass.vue.js +8 -0
- package/dist/views/login/skins/AuroraGlass.vue.js.map +1 -0
- package/dist/views/login/skins/AuroraGlass2.vue.js +80 -0
- package/dist/views/login/skins/AuroraGlass2.vue.js.map +1 -0
- package/dist/views/login/skins/SplitPanel.vue.d.ts +3 -0
- package/dist/views/login/skins/SplitPanel.vue.js +8 -0
- package/dist/views/login/skins/SplitPanel.vue.js.map +1 -0
- package/dist/views/login/skins/SplitPanel2.vue.js +85 -0
- package/dist/views/login/skins/SplitPanel2.vue.js.map +1 -0
- package/dist/views/login/skins/Spotlight.vue.d.ts +3 -0
- package/dist/views/login/skins/Spotlight.vue.js +8 -0
- package/dist/views/login/skins/Spotlight.vue.js.map +1 -0
- package/dist/views/login/skins/Spotlight2.vue.js +36 -0
- package/dist/views/login/skins/Spotlight2.vue.js.map +1 -0
- package/dist/views/login/skins.d.ts +8 -0
- package/dist/views/login/skins.js +13 -0
- package/dist/views/login/skins.js.map +1 -0
- package/dist/views/mfa/bindComplete.d.ts +7 -0
- package/dist/views/mfa/bindComplete.js +8 -0
- package/dist/views/mfa/bindComplete.js.map +1 -0
- package/dist/views/mfa/index.vue.d.ts +3 -0
- package/dist/views/mfa/index.vue.js +8 -0
- package/dist/views/mfa/index.vue.js.map +1 -0
- package/dist/views/mfa/index2.vue.js +425 -0
- package/dist/views/mfa/index2.vue.js.map +1 -0
- package/dist/views/module/index.vue.d.ts +3 -0
- package/dist/views/module/index.vue.js +8 -0
- package/dist/views/module/index.vue.js.map +1 -0
- package/dist/views/module/index2.vue.js +142 -0
- package/dist/views/module/index2.vue.js.map +1 -0
- package/dist/views/oauth/callback.vue.d.ts +3 -0
- package/dist/views/oauth/callback.vue.js +8 -0
- package/dist/views/oauth/callback.vue.js.map +1 -0
- package/dist/views/oauth/callback2.vue.js +86 -0
- package/dist/views/oauth/callback2.vue.js.map +1 -0
- package/dist/views/personal/bindings.vue.d.ts +3 -0
- package/dist/views/personal/bindings.vue.js +8 -0
- package/dist/views/personal/bindings.vue.js.map +1 -0
- package/dist/views/personal/bindings2.vue.js +220 -0
- package/dist/views/personal/bindings2.vue.js.map +1 -0
- package/dist/views/personal/notice.vue.d.ts +3 -0
- package/dist/views/personal/notice.vue.js +5 -0
- package/dist/views/personal/notice.vue.js.map +1 -0
- package/dist/views/personal/notice2.vue.js +163 -0
- package/dist/views/personal/notice2.vue.js.map +1 -0
- package/dist/views/personal/password.vue.d.ts +3 -0
- package/dist/views/personal/password.vue.js +5 -0
- package/dist/views/personal/password.vue.js.map +1 -0
- package/dist/views/personal/password2.vue.js +147 -0
- package/dist/views/personal/password2.vue.js.map +1 -0
- package/dist/views/personal/profile.vue.d.ts +3 -0
- package/dist/views/personal/profile.vue.js +8 -0
- package/dist/views/personal/profile.vue.js.map +1 -0
- package/dist/views/personal/profile2.vue.js +264 -0
- package/dist/views/personal/profile2.vue.js.map +1 -0
- package/dist/views/personal/security.vue.d.ts +3 -0
- package/dist/views/personal/security.vue.js +8 -0
- package/dist/views/personal/security.vue.js.map +1 -0
- package/dist/views/personal/security2.vue.js +82 -0
- package/dist/views/personal/security2.vue.js.map +1 -0
- package/dist/views/personal/sessions.vue.d.ts +3 -0
- package/dist/views/personal/sessions.vue.js +8 -0
- package/dist/views/personal/sessions.vue.js.map +1 -0
- package/dist/views/personal/sessions2.vue.js +101 -0
- package/dist/views/personal/sessions2.vue.js.map +1 -0
- package/dist/views/system/cache/index.vue.d.ts +3 -0
- package/dist/views/system/cache/index.vue.js +8 -0
- package/dist/views/system/cache/index.vue.js.map +1 -0
- package/dist/views/system/cache/index2.vue.js +113 -0
- package/dist/views/system/cache/index2.vue.js.map +1 -0
- package/dist/views/system/config/components/ConfigFormModal.vue.d.ts +16 -0
- package/dist/views/system/config/components/ConfigFormModal.vue.js +5 -0
- package/dist/views/system/config/components/ConfigFormModal.vue.js.map +1 -0
- package/dist/views/system/config/components/ConfigFormModal2.vue.js +177 -0
- package/dist/views/system/config/components/ConfigFormModal2.vue.js.map +1 -0
- package/dist/views/system/config/components/ExternalAuthConfig.vue.d.ts +3 -0
- package/dist/views/system/config/components/ExternalAuthConfig.vue.js +8 -0
- package/dist/views/system/config/components/ExternalAuthConfig.vue.js.map +1 -0
- package/dist/views/system/config/components/ExternalAuthConfig2.vue.js +218 -0
- package/dist/views/system/config/components/ExternalAuthConfig2.vue.js.map +1 -0
- package/dist/views/system/config/components/GroupExtraConfig.vue.d.ts +9 -0
- package/dist/views/system/config/components/GroupExtraConfig.vue.js +8 -0
- package/dist/views/system/config/components/GroupExtraConfig.vue.js.map +1 -0
- package/dist/views/system/config/components/GroupExtraConfig2.vue.js +108 -0
- package/dist/views/system/config/components/GroupExtraConfig2.vue.js.map +1 -0
- package/dist/views/system/config/components/HighSensConfig.vue.d.ts +3 -0
- package/dist/views/system/config/components/HighSensConfig.vue.js +5 -0
- package/dist/views/system/config/components/HighSensConfig.vue.js.map +1 -0
- package/dist/views/system/config/components/HighSensConfig2.vue.js +134 -0
- package/dist/views/system/config/components/HighSensConfig2.vue.js.map +1 -0
- package/dist/views/system/config/components/JobConfig.vue.d.ts +3 -0
- package/dist/views/system/config/components/JobConfig.vue.js +5 -0
- package/dist/views/system/config/components/JobConfig.vue.js.map +1 -0
- package/dist/views/system/config/components/JobConfig2.vue.js +116 -0
- package/dist/views/system/config/components/JobConfig2.vue.js.map +1 -0
- package/dist/views/system/config/components/OtherConfig.vue.d.ts +3 -0
- package/dist/views/system/config/components/OtherConfig.vue.js +5 -0
- package/dist/views/system/config/components/OtherConfig.vue.js.map +1 -0
- package/dist/views/system/config/components/OtherConfig2.vue.js +121 -0
- package/dist/views/system/config/components/OtherConfig2.vue.js.map +1 -0
- package/dist/views/system/config/components/SecurityConfig.vue.d.ts +3 -0
- package/dist/views/system/config/components/SecurityConfig.vue.js +8 -0
- package/dist/views/system/config/components/SecurityConfig.vue.js.map +1 -0
- package/dist/views/system/config/components/SecurityConfig2.vue.js +456 -0
- package/dist/views/system/config/components/SecurityConfig2.vue.js.map +1 -0
- package/dist/views/system/config/components/SysBaseConfig.vue.d.ts +3 -0
- package/dist/views/system/config/components/SysBaseConfig.vue.js +5 -0
- package/dist/views/system/config/components/SysBaseConfig.vue.js.map +1 -0
- package/dist/views/system/config/components/SysBaseConfig2.vue.js +107 -0
- package/dist/views/system/config/components/SysBaseConfig2.vue.js.map +1 -0
- package/dist/views/system/config/components/UploadConfig.vue.d.ts +3 -0
- package/dist/views/system/config/components/UploadConfig.vue.js +5 -0
- package/dist/views/system/config/components/UploadConfig.vue.js.map +1 -0
- package/dist/views/system/config/components/UploadConfig2.vue.js +135 -0
- package/dist/views/system/config/components/UploadConfig2.vue.js.map +1 -0
- package/dist/views/system/config/groups.d.ts +9 -0
- package/dist/views/system/config/groups.js +18 -0
- package/dist/views/system/config/groups.js.map +1 -0
- package/dist/views/system/config/index.vue.d.ts +3 -0
- package/dist/views/system/config/index.vue.js +5 -0
- package/dist/views/system/config/index.vue.js.map +1 -0
- package/dist/views/system/config/index2.vue.js +127 -0
- package/dist/views/system/config/index2.vue.js.map +1 -0
- package/dist/views/system/dict/index.vue.d.ts +3 -0
- package/dist/views/system/dict/index.vue.js +8 -0
- package/dist/views/system/dict/index.vue.js.map +1 -0
- package/dist/views/system/dict/index2.vue.js +560 -0
- package/dist/views/system/dict/index2.vue.js.map +1 -0
- package/dist/views/system/file/index.vue.d.ts +3 -0
- package/dist/views/system/file/index.vue.js +5 -0
- package/dist/views/system/file/index.vue.js.map +1 -0
- package/dist/views/system/file/index2.vue.js +186 -0
- package/dist/views/system/file/index2.vue.js.map +1 -0
- package/dist/views/system/job/index.vue.d.ts +3 -0
- package/dist/views/system/job/index.vue.js +8 -0
- package/dist/views/system/job/index.vue.js.map +1 -0
- package/dist/views/system/job/index2.vue.js +1167 -0
- package/dist/views/system/job/index2.vue.js.map +1 -0
- package/dist/views/system/job-log/index.vue.d.ts +3 -0
- package/dist/views/system/job-log/index.vue.js +8 -0
- package/dist/views/system/job-log/index.vue.js.map +1 -0
- package/dist/views/system/job-log/index2.vue.js +411 -0
- package/dist/views/system/job-log/index2.vue.js.map +1 -0
- package/dist/views/system/job-monitor/index.vue.d.ts +3 -0
- package/dist/views/system/job-monitor/index.vue.js +8 -0
- package/dist/views/system/job-monitor/index.vue.js.map +1 -0
- package/dist/views/system/job-monitor/index2.vue.js +253 -0
- package/dist/views/system/job-monitor/index2.vue.js.map +1 -0
- package/dist/views/system/log/exception/index.vue.d.ts +3 -0
- package/dist/views/system/log/exception/index.vue.js +8 -0
- package/dist/views/system/log/exception/index.vue.js.map +1 -0
- package/dist/views/system/log/exception/index2.vue.js +216 -0
- package/dist/views/system/log/exception/index2.vue.js.map +1 -0
- package/dist/views/system/log/login/index.vue.d.ts +3 -0
- package/dist/views/system/log/login/index.vue.js +5 -0
- package/dist/views/system/log/login/index.vue.js.map +1 -0
- package/dist/views/system/log/login/index2.vue.js +113 -0
- package/dist/views/system/log/login/index2.vue.js.map +1 -0
- package/dist/views/system/log/op/index.vue.d.ts +3 -0
- package/dist/views/system/log/op/index.vue.js +8 -0
- package/dist/views/system/log/op/index.vue.js.map +1 -0
- package/dist/views/system/log/op/index2.vue.js +332 -0
- package/dist/views/system/log/op/index2.vue.js.map +1 -0
- package/dist/views/system/menu/components/ButtonManager.vue.d.ts +21 -0
- package/dist/views/system/menu/components/ButtonManager.vue.js +8 -0
- package/dist/views/system/menu/components/ButtonManager.vue.js.map +1 -0
- package/dist/views/system/menu/components/ButtonManager2.vue.js +498 -0
- package/dist/views/system/menu/components/ButtonManager2.vue.js.map +1 -0
- package/dist/views/system/menu/components/MenuFormModal.vue.d.ts +22 -0
- package/dist/views/system/menu/components/MenuFormModal.vue.js +8 -0
- package/dist/views/system/menu/components/MenuFormModal.vue.js.map +1 -0
- package/dist/views/system/menu/components/MenuFormModal2.vue.js +259 -0
- package/dist/views/system/menu/components/MenuFormModal2.vue.js.map +1 -0
- package/dist/views/system/menu/index.vue.d.ts +3 -0
- package/dist/views/system/menu/index.vue.js +8 -0
- package/dist/views/system/menu/index.vue.js.map +1 -0
- package/dist/views/system/menu/index2.vue.js +391 -0
- package/dist/views/system/menu/index2.vue.js.map +1 -0
- package/dist/views/system/module/index.vue.d.ts +3 -0
- package/dist/views/system/module/index.vue.js +8 -0
- package/dist/views/system/module/index.vue.js.map +1 -0
- package/dist/views/system/module/index2.vue.js +344 -0
- package/dist/views/system/module/index2.vue.js.map +1 -0
- package/dist/views/system/monitor/index.vue.d.ts +3 -0
- package/dist/views/system/monitor/index.vue.js +8 -0
- package/dist/views/system/monitor/index.vue.js.map +1 -0
- package/dist/views/system/monitor/index2.vue.js +184 -0
- package/dist/views/system/monitor/index2.vue.js.map +1 -0
- package/dist/views/system/notice/index.vue.d.ts +3 -0
- package/dist/views/system/notice/index.vue.js +8 -0
- package/dist/views/system/notice/index.vue.js.map +1 -0
- package/dist/views/system/notice/index2.vue.js +401 -0
- package/dist/views/system/notice/index2.vue.js.map +1 -0
- package/dist/views/system/org/index.vue.d.ts +3 -0
- package/dist/views/system/org/index.vue.js +8 -0
- package/dist/views/system/org/index.vue.js.map +1 -0
- package/dist/views/system/org/index2.vue.js +397 -0
- package/dist/views/system/org/index2.vue.js.map +1 -0
- package/dist/views/system/position/index.vue.d.ts +3 -0
- package/dist/views/system/position/index.vue.js +5 -0
- package/dist/views/system/position/index.vue.js.map +1 -0
- package/dist/views/system/position/index2.vue.js +211 -0
- package/dist/views/system/position/index2.vue.js.map +1 -0
- package/dist/views/system/recycle/index.vue.d.ts +3 -0
- package/dist/views/system/recycle/index.vue.js +8 -0
- package/dist/views/system/recycle/index.vue.js.map +1 -0
- package/dist/views/system/recycle/index2.vue.js +121 -0
- package/dist/views/system/recycle/index2.vue.js.map +1 -0
- package/dist/views/system/role/components/GrantMenuTable.vue.d.ts +18 -0
- package/dist/views/system/role/components/GrantMenuTable.vue.js +8 -0
- package/dist/views/system/role/components/GrantMenuTable.vue.js.map +1 -0
- package/dist/views/system/role/components/GrantMenuTable2.vue.js +212 -0
- package/dist/views/system/role/components/GrantMenuTable2.vue.js.map +1 -0
- package/dist/views/system/role/components/grantMenuGroups.d.ts +31 -0
- package/dist/views/system/role/components/grantMenuGroups.js +76 -0
- package/dist/views/system/role/components/grantMenuGroups.js.map +1 -0
- package/dist/views/system/role/index.vue.d.ts +3 -0
- package/dist/views/system/role/index.vue.js +5 -0
- package/dist/views/system/role/index.vue.js.map +1 -0
- package/dist/views/system/role/index2.vue.js +476 -0
- package/dist/views/system/role/index2.vue.js.map +1 -0
- package/dist/views/system/session/index.vue.d.ts +3 -0
- package/dist/views/system/session/index.vue.js +5 -0
- package/dist/views/system/session/index.vue.js.map +1 -0
- package/dist/views/system/session/index2.vue.js +80 -0
- package/dist/views/system/session/index2.vue.js.map +1 -0
- package/dist/views/system/user/components/ResetPasswordModal.vue.d.ts +10 -0
- package/dist/views/system/user/components/ResetPasswordModal.vue.js +8 -0
- package/dist/views/system/user/components/ResetPasswordModal.vue.js.map +1 -0
- package/dist/views/system/user/components/ResetPasswordModal2.vue.js +111 -0
- package/dist/views/system/user/components/ResetPasswordModal2.vue.js.map +1 -0
- package/dist/views/system/user/components/UserFormModal.vue.d.ts +30 -0
- package/dist/views/system/user/components/UserFormModal.vue.js +8 -0
- package/dist/views/system/user/components/UserFormModal.vue.js.map +1 -0
- package/dist/views/system/user/components/UserFormModal2.vue.js +415 -0
- package/dist/views/system/user/components/UserFormModal2.vue.js.map +1 -0
- package/dist/views/system/user/index.vue.d.ts +3 -0
- package/dist/views/system/user/index.vue.js +8 -0
- package/dist/views/system/user/index.vue.js.map +1 -0
- package/dist/views/system/user/index2.vue.js +427 -0
- package/dist/views/system/user/index2.vue.js.map +1 -0
- package/package.json +99 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useAuthMenu.js","sources":["../../src/composables/useAuthMenu.ts"],"sourcesContent":["// 后端菜单树 → vue-router 动态路由的物化层(决策部分在 authMenuRoute.ts,这里只管注册)。\n// 动态路由只活在内存里,F5/深链后是空的,所以路由守卫里的 useModule().enterInitial() 会再调一次\n// buildRoutesForModule 重建 —— 本文件被重复调用是常态,resetRouter + hasRoute/removeRoute 保证幂等。\n// 坑:菜单 component 字段必须落在页面表(router/viewRegistry)里;拼错不会静默 404,\n// 而是注册成 MissingRoute 诊断页,这样配错的人能看见到底缺哪个文件。\nimport { router, resetRouter, registerDynamic } from '#/router'\nimport { namedPage } from '#/router/namedPage'\nimport { registerDetailRoutes } from '#/router/detailRoutes'\nimport { getView, viewComponentPaths } from '#/router/viewRegistry'\nimport { useAuthStore } from '#/stores/auth'\nimport { personalApi } from '#/api'\nimport { describeMenuRoute } from './authMenuRoute'\nimport type { MenuNode } from '#/types/menu'\n\nexport { registerViews, viewComponentPaths, type ViewLoader } from '#/router/viewRegistry'\n\nfunction flatten(nodes: MenuNode[]): MenuNode[] {\n return nodes.flatMap(n => [n, ...(n.children?.length ? flatten(n.children) : [])])\n}\n\n/** 拉某应用的菜单树 → 重建动态路由(挂在 layout 下)。 */\nexport async function buildRoutesForModule(moduleId: number): Promise<void> {\n const auth = useAuthStore()\n const tree = await personalApi.menu(moduleId)\n auth.menuTree = tree\n auth.currentModuleId = moduleId\n\n const viewKeys = new Set(viewComponentPaths())\n resetRouter()\n for (const node of flatten(tree)) {\n const route = describeMenuRoute(node, viewKeys)\n if (!route) continue\n\n if (router.hasRoute(route.name)) router.removeRoute(route.name)\n if (route.kind === 'iframe') {\n router.addRoute('layout', {\n path: route.path,\n name: route.name,\n component: namedPage(route.name, () => import('#/views/embed/iframe.vue')),\n meta: { title: route.title, icon: route.icon, keepAlive: true, iframeSrc: route.iframeSrc },\n })\n registerDynamic(route.name)\n continue\n }\n\n if (route.kind === 'missing') {\n // 组件路径配错是运维需要在控制台看到的诊断信息\n // eslint-disable-next-line no-console\n console.warn('[menu] 缺少视图组件:', route.component)\n router.addRoute('layout', {\n path: route.path,\n name: route.name,\n component: namedPage(route.name, () => import('#/views/error/MissingRoute.vue')),\n meta: {\n title: route.title,\n icon: route.icon,\n keepAlive: true,\n missingComponent: route.component,\n },\n })\n registerDynamic(route.name)\n continue\n }\n\n const loader = getView(route.viewKey)!\n router.addRoute('layout', {\n path: route.path,\n name: route.name,\n component: namedPage(route.name, loader),\n meta: { title: route.title, icon: route.icon, keepAlive: true },\n })\n registerDynamic(route.name)\n }\n // 约定式详情路由(views/**/detail.vue → /<路径>/:id/detail)随菜单路由一并注册,\n // 故 F5/深链走守卫重建时详情路由也复活(见 router/detailRoutes.ts)。\n registerDetailRoutes()\n auth.routesReady = true\n}\n"],"names":["flatten","nodes","n","_a","buildRoutesForModule","moduleId","auth","useAuthStore","tree","personalApi","viewKeys","viewComponentPaths","resetRouter","node","route","describeMenuRoute","router","namedPage","registerDynamic","loader","getView","registerDetailRoutes"],"mappings":";;;;;;;;AAgBA,SAASA,EAAQC,GAA+B;AAC9C,SAAOA,EAAM,QAAQ,CAAAC,MAAA;;AAAK,YAACA,GAAG,IAAIC,IAAAD,EAAE,aAAF,QAAAC,EAAY,SAASH,EAAQE,EAAE,QAAQ,IAAI,CAAA,CAAG;AAAA,GAAC;AACnF;AAGA,eAAsBE,EAAqBC,GAAiC;AAC1E,QAAMC,IAAOC,EAAA,GACPC,IAAO,MAAMC,EAAY,KAAKJ,CAAQ;AAC5C,EAAAC,EAAK,WAAWE,GAChBF,EAAK,kBAAkBD;AAEvB,QAAMK,IAAW,IAAI,IAAIC,GAAoB;AAC7C,EAAAC,EAAA;AACA,aAAWC,KAAQb,EAAQQ,CAAI,GAAG;AAChC,UAAMM,IAAQC,EAAkBF,GAAMH,CAAQ;AAC9C,QAAI,CAACI,EAAO;AAGZ,QADIE,EAAO,SAASF,EAAM,IAAI,KAAGE,EAAO,YAAYF,EAAM,IAAI,GAC1DA,EAAM,SAAS,UAAU;AAC3B,MAAAE,EAAO,SAAS,UAAU;AAAA,QACxB,MAAMF,EAAM;AAAA,QACZ,MAAMA,EAAM;AAAA,QACZ,WAAWG,EAAUH,EAAM,MAAM,MAAM,OAAO,8BAA0B,CAAC;AAAA,QACzE,MAAM,EAAE,OAAOA,EAAM,OAAO,MAAMA,EAAM,MAAM,WAAW,IAAM,WAAWA,EAAM,UAAA;AAAA,MAAU,CAC3F,GACDI,EAAgBJ,EAAM,IAAI;AAC1B;AAAA,IACF;AAEA,QAAIA,EAAM,SAAS,WAAW;AAG5B,cAAQ,KAAK,kBAAkBA,EAAM,SAAS,GAC9CE,EAAO,SAAS,UAAU;AAAA,QACxB,MAAMF,EAAM;AAAA,QACZ,MAAMA,EAAM;AAAA,QACZ,WAAWG,EAAUH,EAAM,MAAM,MAAM,OAAO,oCAAgC,CAAC;AAAA,QAC/E,MAAM;AAAA,UACJ,OAAOA,EAAM;AAAA,UACb,MAAMA,EAAM;AAAA,UACZ,WAAW;AAAA,UACX,kBAAkBA,EAAM;AAAA,QAAA;AAAA,MAC1B,CACD,GACDI,EAAgBJ,EAAM,IAAI;AAC1B;AAAA,IACF;AAEA,UAAMK,IAASC,EAAQN,EAAM,OAAO;AACpC,IAAAE,EAAO,SAAS,UAAU;AAAA,MACxB,MAAMF,EAAM;AAAA,MACZ,MAAMA,EAAM;AAAA,MACZ,WAAWG,EAAUH,EAAM,MAAMK,CAAM;AAAA,MACvC,MAAM,EAAE,OAAOL,EAAM,OAAO,MAAMA,EAAM,MAAM,WAAW,GAAA;AAAA,IAAK,CAC/D,GACDI,EAAgBJ,EAAM,IAAI;AAAA,EAC5B;AAGA,EAAAO,EAAA,GACAf,EAAK,cAAc;AACrB;"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
export interface UseBatchDeleteOptions {
|
|
2
|
+
/** 批量删除接口(收 number[] 主键)。 */
|
|
3
|
+
remove: (ids: number[]) => Promise<unknown>;
|
|
4
|
+
/** 删除成功后刷新数据。 */
|
|
5
|
+
refresh: () => void;
|
|
6
|
+
/** 成功 toast 文案;false = 不弹(另有提示)。缺省用 common.success。 */
|
|
7
|
+
successMsg?: string | false;
|
|
8
|
+
/**
|
|
9
|
+
* 自定义确认文案(可异步:删前要先查点东西才能把话说清楚时用,如"这些角色关联了 N 个用户")。
|
|
10
|
+
* 缺省是按条数的通用文案。有此需求的页面若只给行内单删加警告,勾选+批量删就能绕过去。
|
|
11
|
+
*/
|
|
12
|
+
content?: (ids: number[]) => string | Promise<string>;
|
|
13
|
+
}
|
|
14
|
+
export declare function useBatchDelete(opts: UseBatchDeleteOptions): {
|
|
15
|
+
checkedKeys: import('vue').Ref<(string | number)[], (string | number)[]>;
|
|
16
|
+
hasSelection: import('vue').ComputedRef<boolean>;
|
|
17
|
+
run: () => Promise<void>;
|
|
18
|
+
};
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { ref as m, computed as s } from "vue";
|
|
2
|
+
import { useI18n as a } from "vue-i18n";
|
|
3
|
+
import { useConfirm as f } from "./useConfirm.js";
|
|
4
|
+
function d(e) {
|
|
5
|
+
const { t: o } = a(), { confirm: r } = f(), n = m([]), u = s(() => n.value.length > 0);
|
|
6
|
+
async function i() {
|
|
7
|
+
var t;
|
|
8
|
+
const c = n.value.map(Number);
|
|
9
|
+
if (c.length === 0) return;
|
|
10
|
+
await r({
|
|
11
|
+
content: await ((t = e.content) == null ? void 0 : t.call(e, c)) ?? o("common.batchDeleteConfirm", { count: c.length }),
|
|
12
|
+
action: () => e.remove(c),
|
|
13
|
+
successMsg: e.successMsg
|
|
14
|
+
}) && (n.value = [], e.refresh());
|
|
15
|
+
}
|
|
16
|
+
return { checkedKeys: n, hasSelection: u, run: i };
|
|
17
|
+
}
|
|
18
|
+
export {
|
|
19
|
+
d as useBatchDelete
|
|
20
|
+
};
|
|
21
|
+
//# sourceMappingURL=useBatchDelete.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useBatchDelete.js","sources":["../../src/composables/useBatchDelete.ts"],"sourcesContent":["// 表格批量删除的样板收敛:维护勾选态 + 二次确认(挂起对话框防连点)+ 成功后清选并刷新。\n// 用在 SmartTable(经 $attrs 把 checked-row-keys 透传到内层 n-data-table)与裸 n-data-table 两处。\n// 仅限 setup 中调用(内部用 useConfirm → useI18n/useDialog)。\nimport { computed, ref } from 'vue'\nimport { useI18n } from 'vue-i18n'\nimport { useConfirm } from '#/composables/useConfirm'\n\nexport interface UseBatchDeleteOptions {\n /** 批量删除接口(收 number[] 主键)。 */\n remove: (ids: number[]) => Promise<unknown>\n /** 删除成功后刷新数据。 */\n refresh: () => void\n /** 成功 toast 文案;false = 不弹(另有提示)。缺省用 common.success。 */\n successMsg?: string | false\n /**\n * 自定义确认文案(可异步:删前要先查点东西才能把话说清楚时用,如\"这些角色关联了 N 个用户\")。\n * 缺省是按条数的通用文案。有此需求的页面若只给行内单删加警告,勾选+批量删就能绕过去。\n */\n content?: (ids: number[]) => string | Promise<string>\n}\n\nexport function useBatchDelete(opts: UseBatchDeleteOptions) {\n const { t } = useI18n()\n const { confirm } = useConfirm()\n /** 勾选的行主键(绑到表格的 checked-row-keys)。 */\n const checkedKeys = ref<Array<string | number>>([])\n const hasSelection = computed(() => checkedKeys.value.length > 0)\n\n async function run() {\n const ids = checkedKeys.value.map(Number)\n if (ids.length === 0) return\n const ok = await confirm({\n content: (await opts.content?.(ids)) ?? t('common.batchDeleteConfirm', { count: ids.length }),\n action: () => opts.remove(ids),\n successMsg: opts.successMsg,\n })\n if (ok) {\n checkedKeys.value = []\n opts.refresh()\n }\n }\n\n return { checkedKeys, hasSelection, run }\n}\n"],"names":["useBatchDelete","opts","t","useI18n","confirm","useConfirm","checkedKeys","ref","hasSelection","computed","run","ids","_a"],"mappings":";;;AAqBO,SAASA,EAAeC,GAA6B;AAC1D,QAAM,EAAE,GAAAC,EAAA,IAAMC,EAAA,GACR,EAAE,SAAAC,EAAA,IAAYC,EAAA,GAEdC,IAAcC,EAA4B,EAAE,GAC5CC,IAAeC,EAAS,MAAMH,EAAY,MAAM,SAAS,CAAC;AAEhE,iBAAeI,IAAM;;AACnB,UAAMC,IAAML,EAAY,MAAM,IAAI,MAAM;AACxC,QAAIK,EAAI,WAAW,EAAG;AAMtB,IALW,MAAMP,EAAQ;AAAA,MACvB,SAAU,QAAMQ,IAAAX,EAAK,YAAL,gBAAAW,EAAA,KAAAX,GAAeU,OAAST,EAAE,6BAA6B,EAAE,OAAOS,EAAI,OAAA,CAAQ;AAAA,MAC5F,QAAQ,MAAMV,EAAK,OAAOU,CAAG;AAAA,MAC7B,YAAYV,EAAK;AAAA,IAAA,CAClB,MAECK,EAAY,QAAQ,CAAA,GACpBL,EAAK,QAAA;AAAA,EAET;AAEA,SAAO,EAAE,aAAAK,GAAa,cAAAE,GAAc,KAAAE,EAAA;AACtC;"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { ComputedRef } from 'vue';
|
|
2
|
+
/** 宽度阈值:iPad 竖屏是 768 / 834,横屏 1024 起;手机远小于此。 */
|
|
3
|
+
export declare const COMPACT_MAX_WIDTH = 900;
|
|
4
|
+
/** 高度阈值:1280×600 这类矮屏笔记本,以及横屏平板弹出软键盘后剩下的高度。 */
|
|
5
|
+
export declare const COMPACT_MAX_HEIGHT = 640;
|
|
6
|
+
/** 纯判定,便于单测与非响应式场景直接调用。 */
|
|
7
|
+
export declare function isCompactSize(width: number, height: number, maxWidth?: number, maxHeight?: number): boolean;
|
|
8
|
+
/** 响应式紧凑屏标记。阈值可按页覆盖(如某张宽表要更早切紧凑)。 */
|
|
9
|
+
export declare function useCompactScreen(opts?: {
|
|
10
|
+
maxWidth?: number;
|
|
11
|
+
maxHeight?: number;
|
|
12
|
+
}): ComputedRef<boolean>;
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { computed as c } from "vue";
|
|
2
|
+
import { useWindowSize as m } from "@vueuse/core";
|
|
3
|
+
const u = 900, t = 640;
|
|
4
|
+
function a(e, i, n = u, r = t) {
|
|
5
|
+
return e <= n || i <= r;
|
|
6
|
+
}
|
|
7
|
+
function o(e) {
|
|
8
|
+
const { width: i, height: n } = m();
|
|
9
|
+
return c(() => a(i.value, n.value, e == null ? void 0 : e.maxWidth, e == null ? void 0 : e.maxHeight));
|
|
10
|
+
}
|
|
11
|
+
export {
|
|
12
|
+
t as COMPACT_MAX_HEIGHT,
|
|
13
|
+
u as COMPACT_MAX_WIDTH,
|
|
14
|
+
a as isCompactSize,
|
|
15
|
+
o as useCompactScreen
|
|
16
|
+
};
|
|
17
|
+
//# sourceMappingURL=useCompactScreen.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useCompactScreen.js","sources":["../../src/composables/useCompactScreen.ts"],"sourcesContent":["// 紧凑屏判定:视口小到「桌面密度那一套(560px 卡片、并排两栏、悬停操作)不再合适」的时候。\n//\n// 判据是视口尺寸而不是 UA:平板既可能横屏当笔记本用,也可能竖屏当大手机用,同一台设备两种形态,\n// 认 UA 只会两边都判错。软键盘弹起把可视区压扁的情况同理 —— 那时也该按紧凑处理。\nimport { computed, type ComputedRef } from 'vue'\nimport { useWindowSize } from '@vueuse/core'\n\n/** 宽度阈值:iPad 竖屏是 768 / 834,横屏 1024 起;手机远小于此。 */\nexport const COMPACT_MAX_WIDTH = 900\n/** 高度阈值:1280×600 这类矮屏笔记本,以及横屏平板弹出软键盘后剩下的高度。 */\nexport const COMPACT_MAX_HEIGHT = 640\n\n/** 纯判定,便于单测与非响应式场景直接调用。 */\nexport function isCompactSize(\n width: number,\n height: number,\n maxWidth = COMPACT_MAX_WIDTH,\n maxHeight = COMPACT_MAX_HEIGHT,\n): boolean {\n return width <= maxWidth || height <= maxHeight\n}\n\n/** 响应式紧凑屏标记。阈值可按页覆盖(如某张宽表要更早切紧凑)。 */\nexport function useCompactScreen(opts?: {\n maxWidth?: number\n maxHeight?: number\n}): ComputedRef<boolean> {\n const { width, height } = useWindowSize()\n return computed(() => isCompactSize(width.value, height.value, opts?.maxWidth, opts?.maxHeight))\n}\n"],"names":["COMPACT_MAX_WIDTH","COMPACT_MAX_HEIGHT","isCompactSize","width","height","maxWidth","maxHeight","useCompactScreen","opts","useWindowSize","computed"],"mappings":";;AAQO,MAAMA,IAAoB,KAEpBC,IAAqB;AAG3B,SAASC,EACdC,GACAC,GACAC,IAAWL,GACXM,IAAYL,GACH;AACT,SAAOE,KAASE,KAAYD,KAAUE;AACxC;AAGO,SAASC,EAAiBC,GAGR;AACvB,QAAM,EAAE,OAAAL,GAAO,QAAAC,EAAA,IAAWK,EAAA;AAC1B,SAAOC,EAAS,MAAMR,EAAcC,EAAM,OAAOC,EAAO,OAAOI,KAAA,gBAAAA,EAAM,UAAUA,KAAA,gBAAAA,EAAM,SAAS,CAAC;AACjG;"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
export interface ConfirmOptions<T> {
|
|
2
|
+
content: string;
|
|
3
|
+
/** 默认 t('common.confirmTitle') */
|
|
4
|
+
title?: string;
|
|
5
|
+
type?: 'warning' | 'error' | 'info';
|
|
6
|
+
action: () => Promise<T>;
|
|
7
|
+
/** false = 成功不弹 toast(后续另有提示时) */
|
|
8
|
+
successMsg?: string | false;
|
|
9
|
+
}
|
|
10
|
+
export declare function useConfirm(): {
|
|
11
|
+
ask: (opts: {
|
|
12
|
+
content: string;
|
|
13
|
+
title?: string;
|
|
14
|
+
type?: "warning" | "error" | "info";
|
|
15
|
+
}) => Promise<boolean>;
|
|
16
|
+
confirm: <T>(opts: ConfirmOptions<T>) => Promise<boolean>;
|
|
17
|
+
run: <T>(action: () => Promise<T>, successMsg?: string | false) => Promise<boolean>;
|
|
18
|
+
};
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import { useDialog as l, useMessage as m } from "naive-ui";
|
|
2
|
+
import { useI18n as u } from "vue-i18n";
|
|
3
|
+
import { translateError as g } from "../utils/error.js";
|
|
4
|
+
function T() {
|
|
5
|
+
const c = l(), a = m(), { t } = u();
|
|
6
|
+
function s(n) {
|
|
7
|
+
return new Promise((e) => {
|
|
8
|
+
c.create({
|
|
9
|
+
type: n.type ?? "warning",
|
|
10
|
+
title: n.title ?? t("common.confirmTitle"),
|
|
11
|
+
content: n.content,
|
|
12
|
+
positiveText: t("common.confirm"),
|
|
13
|
+
negativeText: t("common.cancel"),
|
|
14
|
+
onPositiveClick: () => e(!0),
|
|
15
|
+
onNegativeClick: () => e(!1),
|
|
16
|
+
onClose: () => e(!1),
|
|
17
|
+
onMaskClick: () => e(!1),
|
|
18
|
+
onEsc: () => e(!1)
|
|
19
|
+
});
|
|
20
|
+
});
|
|
21
|
+
}
|
|
22
|
+
async function r(n, e) {
|
|
23
|
+
try {
|
|
24
|
+
return await n(), e !== !1 && a.success(e ?? t("common.success")), !0;
|
|
25
|
+
} catch (i) {
|
|
26
|
+
return a.error(g(i)), !1;
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
function f(n) {
|
|
30
|
+
return new Promise((e) => {
|
|
31
|
+
let i = !1;
|
|
32
|
+
const o = c.create({
|
|
33
|
+
type: n.type ?? "warning",
|
|
34
|
+
title: n.title ?? t("common.confirmTitle"),
|
|
35
|
+
content: n.content,
|
|
36
|
+
positiveText: t("common.confirm"),
|
|
37
|
+
negativeText: t("common.cancel"),
|
|
38
|
+
onPositiveClick: () => (i = !0, o.loading = !0, o.closeOnEsc = !1, o.maskClosable = !1, r(n.action, n.successMsg).then(e)),
|
|
39
|
+
onNegativeClick: () => {
|
|
40
|
+
if (i) return !1;
|
|
41
|
+
e(!1);
|
|
42
|
+
},
|
|
43
|
+
onClose: () => {
|
|
44
|
+
if (i) return !1;
|
|
45
|
+
e(!1);
|
|
46
|
+
},
|
|
47
|
+
onMaskClick: () => {
|
|
48
|
+
if (i) return !1;
|
|
49
|
+
e(!1);
|
|
50
|
+
},
|
|
51
|
+
onEsc: () => e(!1)
|
|
52
|
+
// busy 时已由 closeOnEsc=false 挡住,不会走到这里
|
|
53
|
+
});
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
return { ask: s, confirm: f, run: r };
|
|
57
|
+
}
|
|
58
|
+
export {
|
|
59
|
+
T as useConfirm
|
|
60
|
+
};
|
|
61
|
+
//# sourceMappingURL=useConfirm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useConfirm.js","sources":["../../src/composables/useConfirm.ts"],"sourcesContent":["// 二次确认 + 结果 toast 的样板收敛(参考参照实现 useHandleData 的取舍):\n// ask —— 仅弹确认框不执行动作,resolve(用户是否确认);给需要自管后续流程的组件(如 StatusSwitch)。\n// confirm —— dialog 确认后执行 action,成/败统一 toast,resolve(执行是否成功);给不适合内联的重操作。\n// run —— 不弹 dialog 的后半段「执行 → toast」,配模板层 n-popconfirm 的 positive-click 用\n// (popconfirm 是触发器旁的内联组件,保留在模板层比 composable 化更顺手)。\n// 仅限 setup 中调用:useDialog/useMessage 依赖 App.vue 的 Provider 注入。\nimport { useDialog, useMessage } from 'naive-ui'\nimport { useI18n } from 'vue-i18n'\nimport { translateError } from '#/utils/error'\n\nexport interface ConfirmOptions<T> {\n content: string\n /** 默认 t('common.confirmTitle') */\n title?: string\n type?: 'warning' | 'error' | 'info'\n action: () => Promise<T>\n /** false = 成功不弹 toast(后续另有提示时) */\n successMsg?: string | false\n}\n\nexport function useConfirm() {\n const dialog = useDialog()\n const message = useMessage()\n const { t } = useI18n()\n\n /** 仅确认不执行:取消/关闭/遮罩/Esc 均 resolve(false)。Esc 必须显式接 onEsc——Naive 的 Esc 路径不走 onClose。 */\n function ask(opts: {\n content: string\n title?: string\n type?: 'warning' | 'error' | 'info'\n }): Promise<boolean> {\n return new Promise(resolve => {\n dialog.create({\n type: opts.type ?? 'warning',\n title: opts.title ?? t('common.confirmTitle'),\n content: opts.content,\n positiveText: t('common.confirm'),\n negativeText: t('common.cancel'),\n onPositiveClick: () => resolve(true),\n onNegativeClick: () => resolve(false),\n onClose: () => resolve(false),\n onMaskClick: () => resolve(false),\n onEsc: () => resolve(false),\n })\n })\n }\n\n /** 执行 → 成/败 toast。resolve(true) 仅当执行成功。 */\n async function run<T>(action: () => Promise<T>, successMsg?: string | false): Promise<boolean> {\n try {\n await action()\n if (successMsg !== false) message.success(successMsg ?? t('common.success'))\n return true\n } catch (e) {\n message.error(translateError(e))\n return false\n }\n }\n\n /** dialog 确认 → run(action 在 dialog 挂起期间执行)。取消/关闭/Esc/失败均 resolve(false)。 */\n function confirm<T>(opts: ConfirmOptions<T>): Promise<boolean> {\n return new Promise(resolve => {\n // Naive 只把关闭延迟到 onPositiveClick 的 Promise settle,不会自动置 loading/锁按钮——\n // 手动锁死全部关闭路径,防连点重复执行、防执行中取消导致「已删成功但表格没刷新」。\n let busy = false\n const inst = dialog.create({\n type: opts.type ?? 'warning',\n title: opts.title ?? t('common.confirmTitle'),\n content: opts.content,\n positiveText: t('common.confirm'),\n negativeText: t('common.cancel'),\n onPositiveClick: () => {\n busy = true\n inst.loading = true // 确认钮 loading + 禁点\n inst.closeOnEsc = false\n inst.maskClosable = false\n return run(opts.action, opts.successMsg).then(resolve)\n },\n onNegativeClick: () => {\n if (busy) return false // 执行中禁取消\n resolve(false)\n },\n onClose: () => {\n if (busy) return false\n resolve(false)\n },\n onMaskClick: () => {\n if (busy) return false\n resolve(false)\n },\n onEsc: () => resolve(false), // busy 时已由 closeOnEsc=false 挡住,不会走到这里\n })\n })\n }\n\n return { ask, confirm, run }\n}\n"],"names":["useConfirm","dialog","useDialog","message","useMessage","useI18n","ask","opts","resolve","run","action","successMsg","e","translateError","confirm","busy","inst"],"mappings":";;;AAoBO,SAASA,IAAa;AAC3B,QAAMC,IAASC,EAAA,GACTC,IAAUC,EAAA,GACV,EAAE,EAAA,IAAMC,EAAA;AAGd,WAASC,EAAIC,GAIQ;AACnB,WAAO,IAAI,QAAQ,CAAAC,MAAW;AAC5B,MAAAP,EAAO,OAAO;AAAA,QACZ,MAAMM,EAAK,QAAQ;AAAA,QACnB,OAAOA,EAAK,SAAS,EAAE,qBAAqB;AAAA,QAC5C,SAASA,EAAK;AAAA,QACd,cAAc,EAAE,gBAAgB;AAAA,QAChC,cAAc,EAAE,eAAe;AAAA,QAC/B,iBAAiB,MAAMC,EAAQ,EAAI;AAAA,QACnC,iBAAiB,MAAMA,EAAQ,EAAK;AAAA,QACpC,SAAS,MAAMA,EAAQ,EAAK;AAAA,QAC5B,aAAa,MAAMA,EAAQ,EAAK;AAAA,QAChC,OAAO,MAAMA,EAAQ,EAAK;AAAA,MAAA,CAC3B;AAAA,IACH,CAAC;AAAA,EACH;AAGA,iBAAeC,EAAOC,GAA0BC,GAA+C;AAC7F,QAAI;AACF,mBAAMD,EAAA,GACFC,MAAe,MAAOR,EAAQ,QAAQQ,KAAc,EAAE,gBAAgB,CAAC,GACpE;AAAA,IACT,SAASC,GAAG;AACV,aAAAT,EAAQ,MAAMU,EAAeD,CAAC,CAAC,GACxB;AAAA,IACT;AAAA,EACF;AAGA,WAASE,EAAWP,GAA2C;AAC7D,WAAO,IAAI,QAAQ,CAAAC,MAAW;AAG5B,UAAIO,IAAO;AACX,YAAMC,IAAOf,EAAO,OAAO;AAAA,QACzB,MAAMM,EAAK,QAAQ;AAAA,QACnB,OAAOA,EAAK,SAAS,EAAE,qBAAqB;AAAA,QAC5C,SAASA,EAAK;AAAA,QACd,cAAc,EAAE,gBAAgB;AAAA,QAChC,cAAc,EAAE,eAAe;AAAA,QAC/B,iBAAiB,OACfQ,IAAO,IACPC,EAAK,UAAU,IACfA,EAAK,aAAa,IAClBA,EAAK,eAAe,IACbP,EAAIF,EAAK,QAAQA,EAAK,UAAU,EAAE,KAAKC,CAAO;AAAA,QAEvD,iBAAiB,MAAM;AACrB,cAAIO,EAAM,QAAO;AACjB,UAAAP,EAAQ,EAAK;AAAA,QACf;AAAA,QACA,SAAS,MAAM;AACb,cAAIO,EAAM,QAAO;AACjB,UAAAP,EAAQ,EAAK;AAAA,QACf;AAAA,QACA,aAAa,MAAM;AACjB,cAAIO,EAAM,QAAO;AACjB,UAAAP,EAAQ,EAAK;AAAA,QACf;AAAA,QACA,OAAO,MAAMA,EAAQ,EAAK;AAAA;AAAA,MAAA,CAC3B;AAAA,IACH,CAAC;AAAA,EACH;AAEA,SAAO,EAAE,KAAAF,GAAK,SAAAQ,GAAS,KAAAL,EAAA;AACzB;"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { Ref } from 'vue';
|
|
2
|
+
export interface FullscreenToggle {
|
|
3
|
+
/** 本设备是否真能全屏。false 时调用方应隐藏按钮,而不是留个点了没反应的。 */
|
|
4
|
+
isSupported: boolean;
|
|
5
|
+
isFullscreen: Ref<boolean>;
|
|
6
|
+
enter: () => Promise<void>;
|
|
7
|
+
exit: () => Promise<void>;
|
|
8
|
+
toggle: () => Promise<void>;
|
|
9
|
+
}
|
|
10
|
+
/** @param target 要全屏的元素,默认整个文档。 */
|
|
11
|
+
export declare function useFullscreenToggle(target?: () => Element | null | undefined): FullscreenToggle;
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import { ref as S, onScopeDispose as w } from "vue";
|
|
2
|
+
const d = [
|
|
3
|
+
"requestFullscreen",
|
|
4
|
+
"webkitRequestFullscreen",
|
|
5
|
+
"webkitRequestFullScreen",
|
|
6
|
+
"mozRequestFullScreen",
|
|
7
|
+
"msRequestFullscreen"
|
|
8
|
+
], k = [
|
|
9
|
+
"exitFullscreen",
|
|
10
|
+
"webkitExitFullscreen",
|
|
11
|
+
"webkitCancelFullScreen",
|
|
12
|
+
"mozCancelFullScreen",
|
|
13
|
+
"msExitFullscreen"
|
|
14
|
+
], p = [
|
|
15
|
+
"fullscreenElement",
|
|
16
|
+
"webkitFullscreenElement",
|
|
17
|
+
"webkitCurrentFullScreenElement",
|
|
18
|
+
"mozFullScreenElement",
|
|
19
|
+
"msFullscreenElement"
|
|
20
|
+
], m = [
|
|
21
|
+
"fullscreenchange",
|
|
22
|
+
"webkitfullscreenchange",
|
|
23
|
+
"mozfullscreenchange",
|
|
24
|
+
"MSFullscreenChange"
|
|
25
|
+
];
|
|
26
|
+
function F(l, n) {
|
|
27
|
+
return n.find((e) => typeof l[e] == "function");
|
|
28
|
+
}
|
|
29
|
+
function y(l) {
|
|
30
|
+
for (const n of p) {
|
|
31
|
+
const e = l[n];
|
|
32
|
+
if (e) return e;
|
|
33
|
+
}
|
|
34
|
+
return null;
|
|
35
|
+
}
|
|
36
|
+
function v(l) {
|
|
37
|
+
const n = document, e = S(!1), o = () => (l == null ? void 0 : l()) ?? document.documentElement, u = F(o(), d), s = F(n, k), r = !!u && !!s;
|
|
38
|
+
function c() {
|
|
39
|
+
e.value = !!y(n);
|
|
40
|
+
}
|
|
41
|
+
c();
|
|
42
|
+
async function i() {
|
|
43
|
+
var t, E;
|
|
44
|
+
!u || e.value || (await ((E = (t = o())[u]) == null ? void 0 : E.call(t)), c());
|
|
45
|
+
}
|
|
46
|
+
async function f() {
|
|
47
|
+
var t;
|
|
48
|
+
!s || !e.value || (await ((t = n[s]) == null ? void 0 : t.call(n)), c());
|
|
49
|
+
}
|
|
50
|
+
async function a() {
|
|
51
|
+
await (e.value ? f() : i());
|
|
52
|
+
}
|
|
53
|
+
if (r) {
|
|
54
|
+
for (const t of m) document.addEventListener(t, c);
|
|
55
|
+
w(() => {
|
|
56
|
+
for (const t of m) document.removeEventListener(t, c);
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
return { isSupported: r, isFullscreen: e, enter: i, exit: f, toggle: a };
|
|
60
|
+
}
|
|
61
|
+
export {
|
|
62
|
+
v as useFullscreenToggle
|
|
63
|
+
};
|
|
64
|
+
//# sourceMappingURL=useFullscreenToggle.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useFullscreenToggle.js","sources":["../../src/composables/useFullscreenToggle.ts"],"sourcesContent":["// 原生全屏开关。自己写而不用 VueUse 的 `useFullscreen`,只为一件事:**iPadOS 上它把 isSupported 判成 false**。\n//\n// iPadOS 的 Safari 默认「请求桌面网站」,UA 看着就是 macOS Safari,于是不会走移动端分支;\n// 但它的 Element 上只有带 `webkit` 前缀的 `webkitRequestFullscreen`,没有标准名。VueUse 只探标准名,\n// 结论就是「不支持」—— 顶栏的全屏按钮在一台明明能全屏的设备上永远是灰的。\n//\n// 真不支持的设备(iPhone Safari:只有 video 能全屏)照旧回 false,调用方据此把按钮藏掉,\n// 而不是留一个点了没反应的按钮。\nimport { onScopeDispose, ref, type Ref } from 'vue'\n\ntype FullscreenElement = Element & {\n requestFullscreen?: () => Promise<void>\n webkitRequestFullscreen?: () => Promise<void> | void\n webkitRequestFullScreen?: () => Promise<void> | void\n mozRequestFullScreen?: () => Promise<void> | void\n msRequestFullscreen?: () => Promise<void> | void\n}\n\ntype FullscreenDocument = Document & {\n exitFullscreen?: () => Promise<void>\n webkitExitFullscreen?: () => Promise<void> | void\n webkitCancelFullScreen?: () => Promise<void> | void\n mozCancelFullScreen?: () => Promise<void> | void\n msExitFullscreen?: () => Promise<void> | void\n fullscreenElement?: Element | null\n webkitFullscreenElement?: Element | null\n webkitCurrentFullScreenElement?: Element | null\n mozFullScreenElement?: Element | null\n msFullscreenElement?: Element | null\n}\n\nconst REQUEST_KEYS = [\n 'requestFullscreen',\n 'webkitRequestFullscreen',\n 'webkitRequestFullScreen',\n 'mozRequestFullScreen',\n 'msRequestFullscreen',\n] as const\n\nconst EXIT_KEYS = [\n 'exitFullscreen',\n 'webkitExitFullscreen',\n 'webkitCancelFullScreen',\n 'mozCancelFullScreen',\n 'msExitFullscreen',\n] as const\n\nconst ELEMENT_KEYS = [\n 'fullscreenElement',\n 'webkitFullscreenElement',\n 'webkitCurrentFullScreenElement',\n 'mozFullScreenElement',\n 'msFullscreenElement',\n] as const\n\n// 前缀实现派发的是各自的事件名,少监听一个就会出现「已全屏但图标没变」。\nconst CHANGE_EVENTS = [\n 'fullscreenchange',\n 'webkitfullscreenchange',\n 'mozfullscreenchange',\n 'MSFullscreenChange',\n] as const\n\nfunction pickMethod<T extends string>(host: object, keys: readonly T[]): T | undefined {\n return keys.find(k => typeof (host as Record<string, unknown>)[k] === 'function')\n}\n\n/** 当前是否处于全屏(把带前缀的 fullscreenElement 一并认全)。 */\nfunction currentFullscreenElement(doc: FullscreenDocument): Element | null {\n for (const key of ELEMENT_KEYS) {\n const el = doc[key]\n if (el) return el\n }\n return null\n}\n\nexport interface FullscreenToggle {\n /** 本设备是否真能全屏。false 时调用方应隐藏按钮,而不是留个点了没反应的。 */\n isSupported: boolean\n isFullscreen: Ref<boolean>\n enter: () => Promise<void>\n exit: () => Promise<void>\n toggle: () => Promise<void>\n}\n\n/** @param target 要全屏的元素,默认整个文档。 */\nexport function useFullscreenToggle(target?: () => Element | null | undefined): FullscreenToggle {\n const doc = document as FullscreenDocument\n const isFullscreen = ref(false)\n\n const el = () => (target?.() ?? document.documentElement) as FullscreenElement\n const requestKey = pickMethod(el(), REQUEST_KEYS)\n const exitKey = pickMethod(doc, EXIT_KEYS)\n const isSupported = !!requestKey && !!exitKey\n\n function sync() {\n isFullscreen.value = !!currentFullscreenElement(doc)\n }\n sync()\n\n async function enter() {\n if (!requestKey || isFullscreen.value) return\n await el()[requestKey]?.()\n sync() // 前缀实现未必派发事件,进出后主动对一次状态\n }\n\n async function exit() {\n if (!exitKey || !isFullscreen.value) return\n await doc[exitKey]?.()\n sync()\n }\n\n async function toggle() {\n await (isFullscreen.value ? exit() : enter())\n }\n\n if (isSupported) {\n for (const e of CHANGE_EVENTS) document.addEventListener(e, sync)\n onScopeDispose(() => {\n for (const e of CHANGE_EVENTS) document.removeEventListener(e, sync)\n })\n }\n\n return { isSupported, isFullscreen, enter, exit, toggle }\n}\n"],"names":["REQUEST_KEYS","EXIT_KEYS","ELEMENT_KEYS","CHANGE_EVENTS","pickMethod","host","keys","k","currentFullscreenElement","doc","key","el","useFullscreenToggle","target","isFullscreen","ref","requestKey","exitKey","isSupported","sync","enter","_b","_a","exit","toggle","e","onScopeDispose"],"mappings":";AA+BA,MAAMA,IAAe;AAAA,EACnB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAEMC,IAAY;AAAA,EAChB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAEMC,IAAe;AAAA,EACnB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAGMC,IAAgB;AAAA,EACpB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEA,SAASC,EAA6BC,GAAcC,GAAmC;AACrF,SAAOA,EAAK,KAAK,CAAAC,MAAK,OAAQF,EAAiCE,CAAC,KAAM,UAAU;AAClF;AAGA,SAASC,EAAyBC,GAAyC;AACzE,aAAWC,KAAOR,GAAc;AAC9B,UAAMS,IAAKF,EAAIC,CAAG;AAClB,QAAIC,EAAI,QAAOA;AAAA,EACjB;AACA,SAAO;AACT;AAYO,SAASC,EAAoBC,GAA6D;AAC/F,QAAMJ,IAAM,UACNK,IAAeC,EAAI,EAAK,GAExBJ,IAAK,OAAOE,KAAA,gBAAAA,QAAc,SAAS,iBACnCG,IAAaZ,EAAWO,EAAA,GAAMX,CAAY,GAC1CiB,IAAUb,EAAWK,GAAKR,CAAS,GACnCiB,IAAc,CAAC,CAACF,KAAc,CAAC,CAACC;AAEtC,WAASE,IAAO;AACd,IAAAL,EAAa,QAAQ,CAAC,CAACN,EAAyBC,CAAG;AAAA,EACrD;AACA,EAAAU,EAAA;AAEA,iBAAeC,IAAQ;;AACrB,IAAI,CAACJ,KAAcF,EAAa,UAChC,QAAMO,KAAAC,IAAAX,EAAA,GAAKK,OAAL,gBAAAK,EAAA,KAAAC,KACNH,EAAA;AAAA,EACF;AAEA,iBAAeI,IAAO;;AACpB,IAAI,CAACN,KAAW,CAACH,EAAa,UAC9B,QAAMQ,IAAAb,EAAIQ,OAAJ,gBAAAK,EAAA,KAAAb,KACNU,EAAA;AAAA,EACF;AAEA,iBAAeK,IAAS;AACtB,WAAOV,EAAa,QAAQS,EAAA,IAASH,EAAA;AAAA,EACvC;AAEA,MAAIF,GAAa;AACf,eAAWO,KAAKtB,EAAe,UAAS,iBAAiBsB,GAAGN,CAAI;AAChE,IAAAO,EAAe,MAAM;AACnB,iBAAWD,KAAKtB,EAAe,UAAS,oBAAoBsB,GAAGN,CAAI;AAAA,IACrE,CAAC;AAAA,EACH;AAEA,SAAO,EAAE,aAAAD,GAAa,cAAAJ,GAAc,OAAAM,GAAO,MAAAG,GAAM,QAAAC,EAAA;AACnD;"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { Component, ComputedRef } from 'vue';
|
|
2
|
+
interface HeaderToolBase {
|
|
3
|
+
/** 唯一键,重复登记以最后一次为准 */
|
|
4
|
+
key: string;
|
|
5
|
+
/** 排序,越小越靠左;内置项(铃铛、用户下拉)恒在登记项右侧 */
|
|
6
|
+
order?: number;
|
|
7
|
+
/** 窄屏(<768px)是否保留。默认隐藏:顶栏挤不下时右端会被裁,最右的登出入口优先 */
|
|
8
|
+
keepOnMobile?: boolean;
|
|
9
|
+
}
|
|
10
|
+
/** 图标模式:一个圆形 quaternary 按钮 + 悬浮提示,适合"点了就跳/就开弹窗"的入口。 */
|
|
11
|
+
export interface HeaderToolIcon extends HeaderToolBase {
|
|
12
|
+
/** iconify 名(Phosphor 的 calendar-dots 之类)。子集外的名字由 AppIcon 懒加载兜底 */
|
|
13
|
+
icon: string;
|
|
14
|
+
/** 悬浮提示与 aria-label(自行翻译好) */
|
|
15
|
+
label: string;
|
|
16
|
+
onClick: () => void;
|
|
17
|
+
component?: never;
|
|
18
|
+
}
|
|
19
|
+
/** 组件模式:整块交给你自己的组件渲染(自带角标 / 弹层的入口,内置铃铛就是这个形状)。 */
|
|
20
|
+
export interface HeaderToolComponent extends HeaderToolBase {
|
|
21
|
+
component: Component;
|
|
22
|
+
icon?: never;
|
|
23
|
+
label?: never;
|
|
24
|
+
onClick?: never;
|
|
25
|
+
}
|
|
26
|
+
export type HeaderTool = HeaderToolIcon | HeaderToolComponent;
|
|
27
|
+
/** 往顶栏工具区放一项,返回注销函数。 */
|
|
28
|
+
export declare function registerHeaderTool(tool: HeaderTool): () => void;
|
|
29
|
+
/** 已登记的工具项,按 order 升序(同 order 保持登记先后)。AppHeader 渲染用。 */
|
|
30
|
+
export declare function useHeaderTools(): ComputedRef<HeaderTool[]>;
|
|
31
|
+
export {};
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { computed as o, shallowReactive as n } from "vue";
|
|
2
|
+
const r = n(/* @__PURE__ */ new Map());
|
|
3
|
+
function d(e) {
|
|
4
|
+
return r.set(e.key, e), () => {
|
|
5
|
+
r.get(e.key) === e && r.delete(e.key);
|
|
6
|
+
};
|
|
7
|
+
}
|
|
8
|
+
function u() {
|
|
9
|
+
return o(() => [...r.values()].toSorted((e, t) => (e.order ?? 0) - (t.order ?? 0)));
|
|
10
|
+
}
|
|
11
|
+
export {
|
|
12
|
+
d as registerHeaderTool,
|
|
13
|
+
u as useHeaderTools
|
|
14
|
+
};
|
|
15
|
+
//# sourceMappingURL=useHeaderTools.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useHeaderTools.js","sources":["../../src/composables/useHeaderTools.ts"],"sourcesContent":["// 顶栏工具区登记表:扩展模块把自己的入口(图标按钮或整块组件)放进顶栏。\n// 不做成 AppHeader 上的具名插槽:AppHeader 只有 layouts/default.vue 一处使用,走插槽就得连 default.vue\n// 一起改,而两者都在包里,应用改不到。登记表让扩展代码留在应用自己的文件里。\nimport { computed, shallowReactive, type Component, type ComputedRef } from 'vue'\n\ninterface HeaderToolBase {\n /** 唯一键,重复登记以最后一次为准 */\n key: string\n /** 排序,越小越靠左;内置项(铃铛、用户下拉)恒在登记项右侧 */\n order?: number\n /** 窄屏(<768px)是否保留。默认隐藏:顶栏挤不下时右端会被裁,最右的登出入口优先 */\n keepOnMobile?: boolean\n}\n\n/** 图标模式:一个圆形 quaternary 按钮 + 悬浮提示,适合\"点了就跳/就开弹窗\"的入口。 */\nexport interface HeaderToolIcon extends HeaderToolBase {\n /** iconify 名(Phosphor 的 calendar-dots 之类)。子集外的名字由 AppIcon 懒加载兜底 */\n icon: string\n /** 悬浮提示与 aria-label(自行翻译好) */\n label: string\n onClick: () => void\n component?: never\n}\n\n/** 组件模式:整块交给你自己的组件渲染(自带角标 / 弹层的入口,内置铃铛就是这个形状)。 */\nexport interface HeaderToolComponent extends HeaderToolBase {\n component: Component\n icon?: never\n label?: never\n onClick?: never\n}\n\nexport type HeaderTool = HeaderToolIcon | HeaderToolComponent\n\nconst tools = shallowReactive(new Map<string, HeaderTool>())\n\n/** 往顶栏工具区放一项,返回注销函数。 */\nexport function registerHeaderTool(tool: HeaderTool): () => void {\n tools.set(tool.key, tool)\n return () => {\n if (tools.get(tool.key) === tool) tools.delete(tool.key)\n }\n}\n\n/** 已登记的工具项,按 order 升序(同 order 保持登记先后)。AppHeader 渲染用。 */\nexport function useHeaderTools(): ComputedRef<HeaderTool[]> {\n return computed(() => [...tools.values()].toSorted((a, b) => (a.order ?? 0) - (b.order ?? 0)))\n}\n"],"names":["tools","shallowReactive","registerHeaderTool","tool","useHeaderTools","computed","a","b"],"mappings":";AAkCA,MAAMA,IAAQC,EAAgB,oBAAI,KAAyB;AAGpD,SAASC,EAAmBC,GAA8B;AAC/D,SAAAH,EAAM,IAAIG,EAAK,KAAKA,CAAI,GACjB,MAAM;AACX,IAAIH,EAAM,IAAIG,EAAK,GAAG,MAAMA,KAAMH,EAAM,OAAOG,EAAK,GAAG;AAAA,EACzD;AACF;AAGO,SAASC,IAA4C;AAC1D,SAAOC,EAAS,MAAM,CAAC,GAAGL,EAAM,OAAA,CAAQ,EAAE,SAAS,CAACM,GAAGC,OAAOD,EAAE,SAAS,MAAMC,EAAE,SAAS,EAAE,CAAC;AAC/F;"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { MenuOption } from 'naive-ui';
|
|
2
|
+
/**
|
|
3
|
+
* 布局菜单派生 + 一/二级选中态联动(混合布局用)。
|
|
4
|
+
* createSharedComposable → default.vue 与 AppHeader 共享同一份 selectedL1,不各自漂移。
|
|
5
|
+
* 走 router.currentRoute(全局 ref),不依赖组件上下文的 useRoute。
|
|
6
|
+
*/
|
|
7
|
+
declare function useLayoutMenuImpl(): {
|
|
8
|
+
menuOptions: import('vue').ComputedRef<MenuOption[]>;
|
|
9
|
+
l1Options: import('vue').ComputedRef<MenuOption[]>;
|
|
10
|
+
l2Options: import('vue').ComputedRef<MenuOption[]>;
|
|
11
|
+
selectedL1: import('vue').Ref<string | undefined, string | undefined>;
|
|
12
|
+
activeKey: import('vue').ComputedRef<string>;
|
|
13
|
+
onSelect: (key: string) => void;
|
|
14
|
+
onSelectL1: (key: string) => void;
|
|
15
|
+
};
|
|
16
|
+
export declare const useLayoutMenu: typeof useLayoutMenuImpl;
|
|
17
|
+
export {};
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
import { computed as l, ref as M, watch as s, h } from "vue";
|
|
2
|
+
import { NBadge as O } from "naive-ui";
|
|
3
|
+
import { createSharedComposable as w } from "@vueuse/core";
|
|
4
|
+
import A from "../components/AppIcon.vue.js";
|
|
5
|
+
import { menuBadge as I } from "./useMenuBadge.js";
|
|
6
|
+
import { router as a } from "../router/index.js";
|
|
7
|
+
import { useAuthStore as K } from "../stores/auth.js";
|
|
8
|
+
import { useAppStore as T } from "../stores/app.js";
|
|
9
|
+
import { translateMenuTitle as m } from "../locales/menuTitle.js";
|
|
10
|
+
import { isHttpUrl as W, isFullscreenPath as _ } from "../utils/url.js";
|
|
11
|
+
import { MenuType as p } from "../types/menu.js";
|
|
12
|
+
function d(r) {
|
|
13
|
+
return !W(r) && !_(r) ? !1 : (window.open(r, "_blank", "noopener,noreferrer"), !0);
|
|
14
|
+
}
|
|
15
|
+
function v(r, e = "ph:dot-outline-duotone") {
|
|
16
|
+
return () => h(A, { icon: r || e, size: 18 });
|
|
17
|
+
}
|
|
18
|
+
function C(r) {
|
|
19
|
+
if (r)
|
|
20
|
+
return () => {
|
|
21
|
+
const e = I(r);
|
|
22
|
+
return e == null || e === 0 || e === "" ? null : h(O, { value: e, max: 99 });
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
function y(r) {
|
|
26
|
+
return r.toSorted((e, n) => e.sort - n.sort).filter((e) => e.type !== p.Button && e.visible !== !1).map((e) => {
|
|
27
|
+
if (e.type === p.Catalog) {
|
|
28
|
+
const n = y(e.children ?? []);
|
|
29
|
+
return n.length ? {
|
|
30
|
+
label: m(e.title, e.path),
|
|
31
|
+
key: `cat-${e.id}`,
|
|
32
|
+
icon: v(e.icon, "ph:folder-duotone"),
|
|
33
|
+
children: n
|
|
34
|
+
} : null;
|
|
35
|
+
}
|
|
36
|
+
return {
|
|
37
|
+
label: m(e.title, e.path),
|
|
38
|
+
key: e.path ?? `menu-${e.id}`,
|
|
39
|
+
icon: v(e.icon),
|
|
40
|
+
extra: C(e.path)
|
|
41
|
+
};
|
|
42
|
+
}).filter((e) => e !== null);
|
|
43
|
+
}
|
|
44
|
+
function g(r, e) {
|
|
45
|
+
return r.key === e ? !0 : (r.children ?? []).some((n) => g(n, e));
|
|
46
|
+
}
|
|
47
|
+
function k(r) {
|
|
48
|
+
if (typeof r.key == "string" && r.key.startsWith("/")) return r.key;
|
|
49
|
+
for (const e of r.children ?? []) {
|
|
50
|
+
const n = k(e);
|
|
51
|
+
if (n) return n;
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
function R() {
|
|
55
|
+
const r = K(), e = T(), n = l(() => (e.locale, y(r.menuTree))), b = l(
|
|
56
|
+
() => n.value.map((t) => ({ label: t.label, key: t.key, icon: t.icon, extra: t.extra }))
|
|
57
|
+
), c = l(() => a.currentRoute.value.path), i = M();
|
|
58
|
+
function f(t) {
|
|
59
|
+
const o = n.value.find((u) => g(u, t));
|
|
60
|
+
return o ? String(o.key) : void 0;
|
|
61
|
+
}
|
|
62
|
+
s(
|
|
63
|
+
() => a.currentRoute.value.path,
|
|
64
|
+
(t) => {
|
|
65
|
+
var u;
|
|
66
|
+
const o = f(t);
|
|
67
|
+
o ? i.value = o : i.value === void 0 && (i.value = (u = n.value[0]) == null ? void 0 : u.key);
|
|
68
|
+
},
|
|
69
|
+
{ immediate: !0 }
|
|
70
|
+
), s(n, (t) => {
|
|
71
|
+
var o;
|
|
72
|
+
(i.value === void 0 || !t.some((u) => u.key === i.value)) && (i.value = f(c.value) ?? ((o = t[0]) == null ? void 0 : o.key));
|
|
73
|
+
});
|
|
74
|
+
const S = l(() => {
|
|
75
|
+
const t = n.value.find((o) => o.key === i.value);
|
|
76
|
+
return (t == null ? void 0 : t.children) ?? [];
|
|
77
|
+
});
|
|
78
|
+
function x(t) {
|
|
79
|
+
d(t) || t.startsWith("/") && a.push(t);
|
|
80
|
+
}
|
|
81
|
+
function L(t) {
|
|
82
|
+
if (d(t)) return;
|
|
83
|
+
i.value = t;
|
|
84
|
+
const o = n.value.find((B) => B.key === t), u = t.startsWith("/") ? t : o ? k(o) : void 0;
|
|
85
|
+
u && a.push(u);
|
|
86
|
+
}
|
|
87
|
+
return { menuOptions: n, l1Options: b, l2Options: S, selectedL1: i, activeKey: c, onSelect: x, onSelectL1: L };
|
|
88
|
+
}
|
|
89
|
+
const G = w(R);
|
|
90
|
+
export {
|
|
91
|
+
G as useLayoutMenu
|
|
92
|
+
};
|
|
93
|
+
//# sourceMappingURL=useLayoutMenu.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useLayoutMenu.js","sources":["../../src/composables/useLayoutMenu.ts"],"sourcesContent":["// auth.menuTree → n-menu 的 MenuOption,外加混合布局下顶栏一级 / 侧栏二级的选中态联动。\n// 用法:default.vue 与 AppHeader 各自 useLayoutMenu(),createSharedComposable 保证它们共享同一份选中态。\n// 坑:off-menu 路由(如 /personal/*)命中不到任何一级,此时保留上一次的一级选中,别把顶栏清空。\nimport { computed, h, ref, watch } from 'vue'\nimport { NBadge, type MenuOption } from 'naive-ui'\nimport { createSharedComposable } from '@vueuse/core'\nimport AppIcon from '#/components/AppIcon.vue'\nimport { menuBadge } from '#/composables/useMenuBadge'\nimport { router } from '#/router'\nimport { useAuthStore } from '#/stores/auth'\nimport { useAppStore } from '#/stores/app'\nimport { translateMenuTitle } from '#/locales/menuTitle'\nimport { isFullscreenPath, isHttpUrl } from '#/utils/url'\nimport { MenuType, type MenuNode } from '#/types/menu'\n\n/**\n * 新标签页打开的两类 key → window.open;返回是否已处理。\n * - 外链菜单:path 为 http(s) URL。\n * - 站内整屏页:path 以 `/fullscreen/` 开头(大屏看板),站内静态路由,但必须脱离布局壳整屏显示。\n */\nfunction openIfExternal(key: string): boolean {\n if (!isHttpUrl(key) && !isFullscreenPath(key)) return false\n window.open(key, '_blank', 'noopener,noreferrer')\n return true\n}\n\n// 无图标兜底:rail/折叠态的 n-menu 只画图标,缺图标会渲染成空槽“消失”(§组织管理),故永不返回 undefined。\n// 走 AppIcon 而非裸 Icon:菜单图标是库里配的,子集外的名字要由它懒加载整集兜底,否则渲染不出来。\nfunction renderIcon(name: string | undefined, fallback = 'ph:dot-outline-duotone') {\n return () => h(AppIcon, { icon: name || fallback, size: 18 })\n}\n\n// 角标(registerMenuBadge 登记的未读数/待办数)→ n-menu 的 extra 槽。\n// 读值在渲染函数里做,故登记的 ref 一变角标就变,不必重算整棵 options。\n// 折叠 / rail 态 n-menu 只画图标、不渲染 extra,角标随之隐藏——这是 n-menu 的行为,不另做补偿。\nfunction renderBadge(path: string | undefined) {\n if (!path) return undefined\n return () => {\n const value = menuBadge(path)\n if (value === null || value === undefined || value === 0 || value === '') return null\n return h(NBadge, { value, max: 99 })\n }\n}\n\n// 菜单树 → n-menu options:剥按钮、丢空目录、页面叶子 key=路由 path。目录/叶子各自兜底图标。\nfunction toOptions(nodes: MenuNode[]): MenuOption[] {\n return nodes\n .toSorted((a, b) => a.sort - b.sort)\n .filter(n => n.type !== MenuType.Button && n.visible !== false)\n .map<MenuOption | null>(n => {\n if (n.type === MenuType.Catalog) {\n const children = toOptions(n.children ?? [])\n if (!children.length) return null\n return {\n label: translateMenuTitle(n.title, n.path),\n key: `cat-${n.id}`,\n icon: renderIcon(n.icon, 'ph:folder-duotone'),\n children,\n }\n }\n return {\n label: translateMenuTitle(n.title, n.path),\n key: n.path ?? `menu-${n.id}`,\n icon: renderIcon(n.icon),\n extra: renderBadge(n.path),\n }\n })\n .filter((o): o is MenuOption => o !== null)\n}\n\nfunction containsKey(opt: MenuOption, path: string): boolean {\n if (opt.key === path) return true\n return ((opt.children as MenuOption[]) ?? []).some(c => containsKey(c, path))\n}\nfunction firstLeafKey(opt: MenuOption): string | undefined {\n if (typeof opt.key === 'string' && opt.key.startsWith('/')) return opt.key\n for (const c of (opt.children as MenuOption[]) ?? []) {\n const k = firstLeafKey(c)\n if (k) return k\n }\n return undefined\n}\n\n/**\n * 布局菜单派生 + 一/二级选中态联动(混合布局用)。\n * createSharedComposable → default.vue 与 AppHeader 共享同一份 selectedL1,不各自漂移。\n * 走 router.currentRoute(全局 ref),不依赖组件上下文的 useRoute。\n */\nfunction useLayoutMenuImpl() {\n const auth = useAuthStore()\n const app = useAppStore()\n\n // 工作台是每个应用菜单树里的一条(Sort=0 → 排第一项),跟着应用变,不用手工 prepend。\n const menuOptions = computed<MenuOption[]>(() => {\n void app.locale // 依赖:切换语言时 i18n key 标题重算\n return toOptions(auth.menuTree)\n })\n\n // 一级(剥 children → n-menu 渲染为可选普通项,无展开箭头)。\n const l1Options = computed<MenuOption[]>(() =>\n menuOptions.value.map(o => ({ label: o.label, key: o.key, icon: o.icon, extra: o.extra })),\n )\n\n const activeKey = computed(() => router.currentRoute.value.path)\n const selectedL1 = ref<string>()\n\n function findActiveL1(path: string): string | undefined {\n const top = menuOptions.value.find(o => containsKey(o, path))\n return top ? String(top.key) : undefined\n }\n\n // 路由 → 一级同步:命中才覆写(off-menu 路由如 /personal/* 保留上次);首次 seed 头一项。\n watch(\n () => router.currentRoute.value.path,\n path => {\n const l1 = findActiveL1(path)\n if (l1) selectedL1.value = l1\n else if (selectedL1.value === undefined)\n selectedL1.value = menuOptions.value[0]?.key as string | undefined\n },\n { immediate: true },\n )\n // 菜单可能晚于首个 watch 到达(F5 重建):补 seed / 修正失效选择。\n watch(menuOptions, opts => {\n if (selectedL1.value === undefined || !opts.some(o => o.key === selectedL1.value)) {\n selectedL1.value = findActiveL1(activeKey.value) ?? (opts[0]?.key as string | undefined)\n }\n })\n\n const l2Options = computed<MenuOption[]>(() => {\n const top = menuOptions.value.find(o => o.key === selectedL1.value)\n return (top?.children as MenuOption[]) ?? []\n })\n\n function onSelect(key: string) {\n if (openIfExternal(key)) return\n if (key.startsWith('/')) router.push(key)\n }\n function onSelectL1(key: string) {\n if (openIfExternal(key)) return\n selectedL1.value = key // 先设,L2 列立即刷新,不等导航\n const top = menuOptions.value.find(o => o.key === key)\n const target = key.startsWith('/') ? key : top ? firstLeafKey(top) : undefined\n if (target) router.push(target)\n }\n\n return { menuOptions, l1Options, l2Options, selectedL1, activeKey, onSelect, onSelectL1 }\n}\n\nexport const useLayoutMenu = createSharedComposable(useLayoutMenuImpl)\n"],"names":["openIfExternal","key","isHttpUrl","isFullscreenPath","renderIcon","name","fallback","AppIcon","renderBadge","path","value","menuBadge","NBadge","toOptions","nodes","a","b","n","MenuType","children","translateMenuTitle","o","containsKey","opt","c","firstLeafKey","k","useLayoutMenuImpl","auth","useAuthStore","app","useAppStore","menuOptions","computed","l1Options","activeKey","router","selectedL1","ref","findActiveL1","top","watch","l1","_a","opts","l2Options","onSelect","onSelectL1","target","useLayoutMenu","createSharedComposable"],"mappings":";;;;;;;;;;;AAoBA,SAASA,EAAeC,GAAsB;AAC5C,SAAI,CAACC,EAAUD,CAAG,KAAK,CAACE,EAAiBF,CAAG,IAAU,MACtD,OAAO,KAAKA,GAAK,UAAU,qBAAqB,GACzC;AACT;AAIA,SAASG,EAAWC,GAA0BC,IAAW,0BAA0B;AACjF,SAAO,MAAM,EAAEC,GAAS,EAAE,MAAMF,KAAQC,GAAU,MAAM,IAAI;AAC9D;AAKA,SAASE,EAAYC,GAA0B;AAC7C,MAAKA;AACL,WAAO,MAAM;AACX,YAAMC,IAAQC,EAAUF,CAAI;AAC5B,aAAIC,KAAU,QAA+BA,MAAU,KAAKA,MAAU,KAAW,OAC1E,EAAEE,GAAQ,EAAE,OAAAF,GAAO,KAAK,IAAI;AAAA,IACrC;AACF;AAGA,SAASG,EAAUC,GAAiC;AAClD,SAAOA,EACJ,SAAS,CAACC,GAAGC,MAAMD,EAAE,OAAOC,EAAE,IAAI,EAClC,OAAO,CAAAC,MAAKA,EAAE,SAASC,EAAS,UAAUD,EAAE,YAAY,EAAK,EAC7D,IAAuB,CAAAA,MAAK;AAC3B,QAAIA,EAAE,SAASC,EAAS,SAAS;AAC/B,YAAMC,IAAWN,EAAUI,EAAE,YAAY,CAAA,CAAE;AAC3C,aAAKE,EAAS,SACP;AAAA,QACL,OAAOC,EAAmBH,EAAE,OAAOA,EAAE,IAAI;AAAA,QACzC,KAAK,OAAOA,EAAE,EAAE;AAAA,QAChB,MAAMb,EAAWa,EAAE,MAAM,mBAAmB;AAAA,QAC5C,UAAAE;AAAA,MAAA,IAL2B;AAAA,IAO/B;AACA,WAAO;AAAA,MACL,OAAOC,EAAmBH,EAAE,OAAOA,EAAE,IAAI;AAAA,MACzC,KAAKA,EAAE,QAAQ,QAAQA,EAAE,EAAE;AAAA,MAC3B,MAAMb,EAAWa,EAAE,IAAI;AAAA,MACvB,OAAOT,EAAYS,EAAE,IAAI;AAAA,IAAA;AAAA,EAE7B,CAAC,EACA,OAAO,CAACI,MAAuBA,MAAM,IAAI;AAC9C;AAEA,SAASC,EAAYC,GAAiBd,GAAuB;AAC3D,SAAIc,EAAI,QAAQd,IAAa,MACpBc,EAAI,YAA6B,IAAI,KAAK,CAAAC,MAAKF,EAAYE,GAAGf,CAAI,CAAC;AAC9E;AACA,SAASgB,EAAaF,GAAqC;AACzD,MAAI,OAAOA,EAAI,OAAQ,YAAYA,EAAI,IAAI,WAAW,GAAG,EAAG,QAAOA,EAAI;AACvE,aAAWC,KAAMD,EAAI,YAA6B,CAAA,GAAI;AACpD,UAAMG,IAAID,EAAaD,CAAC;AACxB,QAAIE,EAAG,QAAOA;AAAA,EAChB;AAEF;AAOA,SAASC,IAAoB;AAC3B,QAAMC,IAAOC,EAAA,GACPC,IAAMC,EAAA,GAGNC,IAAcC,EAAuB,OACpCH,EAAI,QACFjB,EAAUe,EAAK,QAAQ,EAC/B,GAGKM,IAAYD;AAAA,IAAuB,MACvCD,EAAY,MAAM,IAAI,CAAAX,OAAM,EAAE,OAAOA,EAAE,OAAO,KAAKA,EAAE,KAAK,MAAMA,EAAE,MAAM,OAAOA,EAAE,QAAQ;AAAA,EAAA,GAGrFc,IAAYF,EAAS,MAAMG,EAAO,aAAa,MAAM,IAAI,GACzDC,IAAaC,EAAA;AAEnB,WAASC,EAAa9B,GAAkC;AACtD,UAAM+B,IAAMR,EAAY,MAAM,KAAK,OAAKV,EAAYD,GAAGZ,CAAI,CAAC;AAC5D,WAAO+B,IAAM,OAAOA,EAAI,GAAG,IAAI;AAAA,EACjC;AAGA,EAAAC;AAAA,IACE,MAAML,EAAO,aAAa,MAAM;AAAA,IAChC,CAAA3B,MAAQ;;AACN,YAAMiC,IAAKH,EAAa9B,CAAI;AAC5B,MAAIiC,MAAe,QAAQA,IAClBL,EAAW,UAAU,WAC5BA,EAAW,SAAQM,IAAAX,EAAY,MAAM,CAAC,MAAnB,gBAAAW,EAAsB;AAAA,IAC7C;AAAA,IACA,EAAE,WAAW,GAAA;AAAA,EAAK,GAGpBF,EAAMT,GAAa,CAAAY,MAAQ;;AACzB,KAAIP,EAAW,UAAU,UAAa,CAACO,EAAK,KAAK,CAAAvB,MAAKA,EAAE,QAAQgB,EAAW,KAAK,OAC9EA,EAAW,QAAQE,EAAaJ,EAAU,KAAK,OAAMQ,IAAAC,EAAK,CAAC,MAAN,gBAAAD,EAAS;AAAA,EAElE,CAAC;AAED,QAAME,IAAYZ,EAAuB,MAAM;AAC7C,UAAMO,IAAMR,EAAY,MAAM,KAAK,OAAK,EAAE,QAAQK,EAAW,KAAK;AAClE,YAAQG,KAAA,gBAAAA,EAAK,aAA6B,CAAA;AAAA,EAC5C,CAAC;AAED,WAASM,EAAS7C,GAAa;AAC7B,IAAID,EAAeC,CAAG,KAClBA,EAAI,WAAW,GAAG,KAAGmC,EAAO,KAAKnC,CAAG;AAAA,EAC1C;AACA,WAAS8C,EAAW9C,GAAa;AAC/B,QAAID,EAAeC,CAAG,EAAG;AACzB,IAAAoC,EAAW,QAAQpC;AACnB,UAAMuC,IAAMR,EAAY,MAAM,KAAK,CAAAX,MAAKA,EAAE,QAAQpB,CAAG,GAC/C+C,IAAS/C,EAAI,WAAW,GAAG,IAAIA,IAAMuC,IAAMf,EAAae,CAAG,IAAI;AACrE,IAAIQ,KAAQZ,EAAO,KAAKY,CAAM;AAAA,EAChC;AAEA,SAAO,EAAE,aAAAhB,GAAa,WAAAE,GAAW,WAAAW,GAAW,YAAAR,GAAY,WAAAF,GAAW,UAAAW,GAAU,YAAAC,EAAA;AAC/E;AAEO,MAAME,IAAgBC,EAAuBvB,CAAiB;"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { MaybeRefOrGetter } from 'vue';
|
|
2
|
+
/** 角标值。0 / '' / null / undefined 一律不渲染——未读为零时不该在菜单上留个空圈。 */
|
|
3
|
+
export type MenuBadgeValue = number | string | null | undefined;
|
|
4
|
+
/**
|
|
5
|
+
* 给菜单项挂角标,返回注销函数。
|
|
6
|
+
* <p>`path` 用菜单的路由 path(与 MenuNode.path 同一个值)。value 可传 ref / getter:
|
|
7
|
+
* 值变了角标自己跟着变,不必重新登记。同一 path 重复登记以最后一次为准。</p>
|
|
8
|
+
*/
|
|
9
|
+
export declare function registerMenuBadge(path: string, value: MaybeRefOrGetter<MenuBadgeValue>): () => void;
|
|
10
|
+
/** 取某菜单项当前的角标值(useLayoutMenu 渲染用)。 */
|
|
11
|
+
export declare function menuBadge(path: string): MenuBadgeValue;
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { reactive as o, toValue as u } from "vue";
|
|
2
|
+
const n = o(/* @__PURE__ */ new Map());
|
|
3
|
+
function i(e, t) {
|
|
4
|
+
const r = () => u(t);
|
|
5
|
+
return n.set(e, r), () => {
|
|
6
|
+
n.get(e) === r && n.delete(e);
|
|
7
|
+
};
|
|
8
|
+
}
|
|
9
|
+
function a(e) {
|
|
10
|
+
var t;
|
|
11
|
+
return (t = n.get(e)) == null ? void 0 : t();
|
|
12
|
+
}
|
|
13
|
+
export {
|
|
14
|
+
a as menuBadge,
|
|
15
|
+
i as registerMenuBadge
|
|
16
|
+
};
|
|
17
|
+
//# sourceMappingURL=useMenuBadge.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useMenuBadge.js","sources":["../../src/composables/useMenuBadge.ts"],"sourcesContent":["// 菜单角标登记表(未读数 / 待办数)。\n// 不做成 MenuNode 上的字段:菜单树是后端拉的,每次重拉都会把前端算出来的动态值冲掉;\n// 这里按路由 path 登记,渲染在 useLayoutMenu 产出的 MenuOption.extra 上,\n// 侧栏 / 顶栏 / 二级 / 移动抽屉四处共用同一份。\nimport { reactive, toValue, type MaybeRefOrGetter } from 'vue'\n\n/** 角标值。0 / '' / null / undefined 一律不渲染——未读为零时不该在菜单上留个空圈。 */\nexport type MenuBadgeValue = number | string | null | undefined\n\nconst badges = reactive(new Map<string, () => MenuBadgeValue>())\n\n/**\n * 给菜单项挂角标,返回注销函数。\n * <p>`path` 用菜单的路由 path(与 MenuNode.path 同一个值)。value 可传 ref / getter:\n * 值变了角标自己跟着变,不必重新登记。同一 path 重复登记以最后一次为准。</p>\n */\nexport function registerMenuBadge(\n path: string,\n value: MaybeRefOrGetter<MenuBadgeValue>,\n): () => void {\n const read = () => toValue(value)\n badges.set(path, read)\n return () => {\n if (badges.get(path) === read) badges.delete(path)\n }\n}\n\n/** 取某菜单项当前的角标值(useLayoutMenu 渲染用)。 */\nexport function menuBadge(path: string): MenuBadgeValue {\n return badges.get(path)?.()\n}\n"],"names":["badges","reactive","registerMenuBadge","path","value","read","toValue","menuBadge","_a"],"mappings":";AASA,MAAMA,IAASC,EAAS,oBAAI,KAAmC;AAOxD,SAASC,EACdC,GACAC,GACY;AACZ,QAAMC,IAAO,MAAMC,EAAQF,CAAK;AAChC,SAAAJ,EAAO,IAAIG,GAAME,CAAI,GACd,MAAM;AACX,IAAIL,EAAO,IAAIG,CAAI,MAAME,KAAML,EAAO,OAAOG,CAAI;AAAA,EACnD;AACF;AAGO,SAASI,EAAUJ,GAA8B;;AACtD,UAAOK,IAAAR,EAAO,IAAIG,CAAI,MAAf,gBAAAK;AACT;"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { computed as a } from "vue";
|
|
2
|
+
import { useAuthStore as m } from "../stores/auth.js";
|
|
3
|
+
import { useAppStore as f } from "../stores/app.js";
|
|
4
|
+
import { translateMenuTitle as h, menuTitleKey as d } from "../locales/menuTitle.js";
|
|
5
|
+
import { MenuType as i } from "../types/menu.js";
|
|
6
|
+
function v() {
|
|
7
|
+
const p = m(), u = f();
|
|
8
|
+
return a(() => {
|
|
9
|
+
u.locale;
|
|
10
|
+
const o = [], r = (c, l) => {
|
|
11
|
+
var n;
|
|
12
|
+
for (const t of c.toSorted((e, s) => e.sort - s.sort)) {
|
|
13
|
+
if (t.type === i.Button || t.visible === !1) continue;
|
|
14
|
+
const e = [...l, h(t.title, t.path)];
|
|
15
|
+
t.type === i.Menu && t.path && o.push({
|
|
16
|
+
title: d(t.title, t.path),
|
|
17
|
+
path: t.path,
|
|
18
|
+
icon: t.icon,
|
|
19
|
+
breadcrumb: e
|
|
20
|
+
}), (n = t.children) != null && n.length && r(t.children, e);
|
|
21
|
+
}
|
|
22
|
+
};
|
|
23
|
+
return r(p.menuTree, []), o;
|
|
24
|
+
});
|
|
25
|
+
}
|
|
26
|
+
export {
|
|
27
|
+
v as useMenuFlat
|
|
28
|
+
};
|
|
29
|
+
//# sourceMappingURL=useMenuFlat.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useMenuFlat.js","sources":["../../src/composables/useMenuFlat.ts"],"sourcesContent":["// 面包屑与全局搜索共同需要的「菜单叶子清单」:把 auth.menuTree 压平成带完整标题链的叶子数组。\n// 坑:按钮/隐藏/排序规则必须与 useLayoutMenu 的 toOptions 保持一致,否则搜索能搜到侧栏里看不见的页面。\nimport { computed } from 'vue'\nimport { useAuthStore } from '#/stores/auth'\nimport { useAppStore } from '#/stores/app'\nimport { menuTitleKey, translateMenuTitle } from '#/locales/menuTitle'\nimport { MenuType, type MenuNode } from '#/types/menu'\n\nexport interface MenuLeaf {\n title: string // 原始标题(后端串或 i18n key)\n path: string\n icon?: string\n breadcrumb: string[] // 从根到叶的标题链\n}\n\n/** auth.menuTree 扁平为叶子(供面包屑与全局搜索共用),复刻 toOptions 的按钮/隐藏/排序规则。 */\nexport function useMenuFlat() {\n const auth = useAuthStore()\n const app = useAppStore()\n\n return computed<MenuLeaf[]>(() => {\n void app.locale // 依赖:切换语言时 i18n key 标题重算\n const out: MenuLeaf[] = [] // 工作台是菜单树里的一条,不用手工注入\n const walk = (nodes: MenuNode[], trail: string[]) => {\n for (const n of nodes.toSorted((a, b) => a.sort - b.sort)) {\n if (n.type === MenuType.Button || n.visible === false) continue\n const here = [...trail, translateMenuTitle(n.title, n.path)]\n if (n.type === MenuType.Menu && n.path)\n out.push({\n title: menuTitleKey(n.title, n.path),\n path: n.path,\n icon: n.icon,\n breadcrumb: here,\n })\n if (n.children?.length) walk(n.children, here)\n }\n }\n walk(auth.menuTree, [])\n return out\n })\n}\n"],"names":["useMenuFlat","auth","useAuthStore","app","useAppStore","computed","out","walk","nodes","trail","n","a","b","MenuType","here","translateMenuTitle","menuTitleKey","_a"],"mappings":";;;;;AAgBO,SAASA,IAAc;AAC5B,QAAMC,IAAOC,EAAA,GACPC,IAAMC,EAAA;AAEZ,SAAOC,EAAqB,MAAM;AAChC,IAAKF,EAAI;AACT,UAAMG,IAAkB,CAAA,GAClBC,IAAO,CAACC,GAAmBC,MAAoB;;AACnD,iBAAWC,KAAKF,EAAM,SAAS,CAACG,GAAGC,MAAMD,EAAE,OAAOC,EAAE,IAAI,GAAG;AACzD,YAAIF,EAAE,SAASG,EAAS,UAAUH,EAAE,YAAY,GAAO;AACvD,cAAMI,IAAO,CAAC,GAAGL,GAAOM,EAAmBL,EAAE,OAAOA,EAAE,IAAI,CAAC;AAC3D,QAAIA,EAAE,SAASG,EAAS,QAAQH,EAAE,QAChCJ,EAAI,KAAK;AAAA,UACP,OAAOU,EAAaN,EAAE,OAAOA,EAAE,IAAI;AAAA,UACnC,MAAMA,EAAE;AAAA,UACR,MAAMA,EAAE;AAAA,UACR,YAAYI;AAAA,QAAA,CACb,IACCG,IAAAP,EAAE,aAAF,QAAAO,EAAY,UAAQV,EAAKG,EAAE,UAAUI,CAAI;AAAA,MAC/C;AAAA,IACF;AACA,WAAAP,EAAKN,EAAK,UAAU,EAAE,GACfK;AAAA,EACT,CAAC;AACH;"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
type EnterResult = {
|
|
2
|
+
chooser: true;
|
|
3
|
+
} | {
|
|
4
|
+
chooser: false;
|
|
5
|
+
moduleId: number;
|
|
6
|
+
};
|
|
7
|
+
/** 进指定应用:重建它的动态路由。 */
|
|
8
|
+
declare function enter(moduleId: number): Promise<EnterResult>;
|
|
9
|
+
/** 门户:登录后决定直接进 / 进默认 / 弹选择器,以及切换应用。逻辑与 Naive 无关。 */
|
|
10
|
+
export declare function useModule(): {
|
|
11
|
+
enter: typeof enter;
|
|
12
|
+
enterInitial: () => Promise<EnterResult>;
|
|
13
|
+
switchModule: (moduleId: number) => Promise<void>;
|
|
14
|
+
setDefault: (moduleId: number) => Promise<void>;
|
|
15
|
+
};
|
|
16
|
+
export {};
|