smart-admin-web 10.15.0 → 10.20.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +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 +1 -1
- package/dist/layouts/NoticeBell2.vue.js.map +1 -1
- package/dist/layouts/PersonalLayout.vue.js +2 -2
- package/dist/layouts/PersonalLayout2.vue.js +69 -47
- package/dist/layouts/PersonalLayout2.vue.js.map +1 -1
- package/dist/layouts/SettingsDrawer.vue.js +3 -3
- package/dist/layouts/SettingsDrawer2.vue.js +261 -325
- package/dist/layouts/SettingsDrawer2.vue.js.map +1 -1
- package/dist/layouts/TabsBar.vue.js +2 -2
- package/dist/layouts/TabsBar2.vue.js +97 -69
- package/dist/layouts/TabsBar2.vue.js.map +1 -1
- package/dist/layouts/components/SideNav.vue.d.ts +3 -0
- package/dist/layouts/components/SideNav.vue.js +1 -1
- package/dist/layouts/components/SideNav2.vue.js +54 -26
- package/dist/layouts/components/SideNav2.vue.js.map +1 -1
- package/dist/layouts/default.vue.js +1 -1
- package/dist/layouts/default2.vue.js +170 -140
- package/dist/layouts/default2.vue.js.map +1 -1
- package/dist/lib/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 +405 -75
- package/dist/theme/naive-theme.js.map +1 -1
- package/dist/utils/jwt.d.ts +8 -0
- package/dist/utils/jwt.js +14 -0
- package/dist/utils/jwt.js.map +1 -0
- package/dist/utils/menuIcon.d.ts +2 -0
- package/dist/utils/menuIcon.js +8 -0
- package/dist/utils/menuIcon.js.map +1 -0
- package/dist/utils/oauthBrand.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,112 +1,154 @@
|
|
|
1
|
-
import { defineComponent as
|
|
2
|
-
import { useMessage as
|
|
3
|
-
import { SmartTable as
|
|
4
|
-
import { useI18n as
|
|
5
|
-
import
|
|
6
|
-
import
|
|
1
|
+
import { defineComponent as ae, ref as v, computed as p, onMounted as ne, h as se, reactive as oe, openBlock as f, createBlock as _, unref as l, withCtx as h, createVNode as u, createTextVNode as g, toDisplayString as o, createCommentVNode as b, createElementVNode as r, normalizeClass as re, createElementBlock as C, withDirectives as A, vShow as K, Fragment as ie, renderList as ce } from "vue";
|
|
2
|
+
import { useMessage as ue, NButton as S, NTabs as de, NTab as L, NTree as pe, NTreeSelect as me, NInput as ve, NEmpty as fe } from "naive-ui";
|
|
3
|
+
import { SmartTable as he } from "smart-naive-table";
|
|
4
|
+
import { useI18n as ke } from "vue-i18n";
|
|
5
|
+
import { useWindowSize as ge } from "@vueuse/core";
|
|
6
|
+
import ye from "../AppIcon.vue.js";
|
|
7
|
+
import we from "../FormContainer/index.vue.js";
|
|
7
8
|
/* empty css */
|
|
8
|
-
import {
|
|
9
|
-
import {
|
|
10
|
-
import {
|
|
11
|
-
|
|
9
|
+
import { useShellBreakpoint as _e } from "../../composables/useShellBreakpoint.js";
|
|
10
|
+
import { orgApi as be, userApi as O } from "../../api/index.js";
|
|
11
|
+
import { buildTree as Se } from "../../utils/tree.js";
|
|
12
|
+
import { translateError as ze } from "../../utils/error.js";
|
|
13
|
+
import { SEARCH_ACTIONS as xe } from "../../utils/tableFilter.js";
|
|
14
|
+
const Ce = {
|
|
15
|
+
key: 0,
|
|
16
|
+
class: "picker-tree"
|
|
17
|
+
}, Ne = { class: "panel-header" }, Pe = { class: "picker-table" }, Ie = { class: "panel-header" }, Te = { class: "picker-selected" }, Ue = { class: "panel-header" }, Ee = { class: "selected-list" }, Be = { class: "selected-name" }, qe = { class: "selected-account" }, Ge = /* @__PURE__ */ ae({
|
|
12
18
|
__name: "index",
|
|
13
19
|
props: {
|
|
14
20
|
excludeIds: {}
|
|
15
21
|
},
|
|
16
22
|
emits: ["confirm"],
|
|
17
|
-
setup(
|
|
18
|
-
const
|
|
23
|
+
setup(R, { expose: V, emit: D }) {
|
|
24
|
+
const $ = R, F = D, { t: n } = ke(), M = ue(), z = v(!1), y = v(), { bp: N } = _e(), { width: W } = ge(), d = p(() => N.value === "narrow" || W.value < 900), H = p(() => N.value === "narrow" ? "drawer" : "modal"), k = v("users"), x = p(() => d.value ? "large" : "small"), P = v([]), I = p(() => [{ id: 0, parentId: -1, name: n("common.all"), children: Se(P.value) }]), c = v(null), j = p(
|
|
19
25
|
() => c.value && c.value !== 0 ? c.value : void 0
|
|
20
26
|
);
|
|
21
|
-
|
|
27
|
+
ne(async () => {
|
|
22
28
|
try {
|
|
23
|
-
|
|
29
|
+
P.value = await be.list();
|
|
24
30
|
} catch {
|
|
25
31
|
}
|
|
26
32
|
});
|
|
27
|
-
function
|
|
33
|
+
function G(t) {
|
|
28
34
|
var e;
|
|
29
|
-
c.value = t[0] ?? null, (e =
|
|
35
|
+
c.value = t[0] ?? null, (e = y.value) == null || e.refresh();
|
|
30
36
|
}
|
|
31
|
-
|
|
37
|
+
function J(t) {
|
|
38
|
+
var e;
|
|
39
|
+
c.value = t ?? null, (e = y.value) == null || e.refresh();
|
|
40
|
+
}
|
|
41
|
+
const m = v([]), T = p(() => new Set($.excludeIds ?? [])), Q = (t) => O.page({
|
|
32
42
|
page: t.page,
|
|
33
43
|
pageSize: t.pageSize,
|
|
34
|
-
|
|
35
|
-
orgId:
|
|
36
|
-
}),
|
|
44
|
+
account: t.account,
|
|
45
|
+
orgId: j.value
|
|
46
|
+
}), X = [
|
|
37
47
|
{ type: "selection" },
|
|
38
|
-
{ key: "name", title: () =>
|
|
39
|
-
{
|
|
48
|
+
{ key: "name", title: () => n("user.name"), width: 100 },
|
|
49
|
+
{
|
|
50
|
+
key: "account",
|
|
51
|
+
title: () => n("user.account"),
|
|
52
|
+
width: 120,
|
|
53
|
+
search: { actions: xe.fuzzy }
|
|
54
|
+
},
|
|
40
55
|
{
|
|
41
56
|
key: "op",
|
|
42
|
-
title: () =>
|
|
57
|
+
title: () => n("common.operation"),
|
|
43
58
|
width: 70,
|
|
44
59
|
render: (t) => {
|
|
45
|
-
const e =
|
|
46
|
-
return
|
|
47
|
-
|
|
60
|
+
const e = U.value.has(t.id) || T.value.has(t.id);
|
|
61
|
+
return se(
|
|
62
|
+
S,
|
|
48
63
|
{
|
|
49
64
|
size: "tiny",
|
|
50
65
|
type: "primary",
|
|
51
66
|
quaternary: !0,
|
|
52
67
|
disabled: e,
|
|
53
|
-
onClick: () =>
|
|
68
|
+
onClick: () => B([t])
|
|
54
69
|
},
|
|
55
|
-
() =>
|
|
70
|
+
() => n(e ? "userPicker.added" : "userPicker.add")
|
|
56
71
|
);
|
|
57
72
|
}
|
|
58
73
|
}
|
|
59
|
-
],
|
|
60
|
-
const t =
|
|
61
|
-
return t ?
|
|
74
|
+
], s = oe([]), U = p(() => new Set(s.map((t) => t.id))), w = v(""), E = p(() => {
|
|
75
|
+
const t = w.value.trim().toLowerCase();
|
|
76
|
+
return t ? s.filter(
|
|
62
77
|
(e) => e.name.toLowerCase().includes(t) || e.account.toLowerCase().includes(t)
|
|
63
|
-
) :
|
|
78
|
+
) : s;
|
|
64
79
|
});
|
|
65
|
-
function
|
|
80
|
+
function B(t) {
|
|
66
81
|
for (const e of t)
|
|
67
|
-
!
|
|
82
|
+
!U.value.has(e.id) && !T.value.has(e.id) && s.push(e);
|
|
68
83
|
}
|
|
69
|
-
function
|
|
84
|
+
function Y() {
|
|
70
85
|
var e;
|
|
71
|
-
const t = (l((e =
|
|
72
|
-
|
|
86
|
+
const t = (l((e = y.value) == null ? void 0 : e.rows) ?? []).filter((a) => m.value.includes(a.id));
|
|
87
|
+
B(t), m.value = [];
|
|
73
88
|
}
|
|
74
|
-
function
|
|
75
|
-
const e =
|
|
76
|
-
e >= 0 &&
|
|
89
|
+
function Z(t) {
|
|
90
|
+
const e = s.findIndex((a) => a.id === t);
|
|
91
|
+
e >= 0 && s.splice(e, 1);
|
|
77
92
|
}
|
|
78
|
-
function
|
|
79
|
-
|
|
93
|
+
function ee() {
|
|
94
|
+
s.splice(0, s.length);
|
|
80
95
|
}
|
|
81
|
-
async function
|
|
82
|
-
if (
|
|
96
|
+
async function te(t) {
|
|
97
|
+
if (s.splice(0, s.length), m.value = [], w.value = "", c.value = null, k.value = "users", z.value = !0, t != null && t.length)
|
|
83
98
|
try {
|
|
84
|
-
const { items: e } = await
|
|
85
|
-
for (const
|
|
86
|
-
for (const
|
|
87
|
-
|
|
99
|
+
const { items: e } = await O.page({ page: 1, pageSize: 200 }), a = e.filter((i) => t.includes(i.id)), q = new Set(a.map((i) => i.id));
|
|
100
|
+
for (const i of a) s.push(i);
|
|
101
|
+
for (const i of t)
|
|
102
|
+
q.has(i) || s.push({ id: i, account: String(i), name: String(i) });
|
|
88
103
|
} catch {
|
|
89
|
-
for (const e of t)
|
|
104
|
+
for (const e of t) s.push({ id: e, account: String(e), name: String(e) });
|
|
90
105
|
}
|
|
91
106
|
}
|
|
92
|
-
async function
|
|
93
|
-
const t =
|
|
94
|
-
|
|
107
|
+
async function le() {
|
|
108
|
+
const t = s.map((e) => e.id);
|
|
109
|
+
F("confirm", t);
|
|
95
110
|
}
|
|
96
|
-
return
|
|
97
|
-
show:
|
|
98
|
-
"onUpdate:show": e[
|
|
99
|
-
|
|
111
|
+
return V({ open: te }), (t, e) => (f(), _(we, {
|
|
112
|
+
show: z.value,
|
|
113
|
+
"onUpdate:show": e[4] || (e[4] = (a) => z.value = a),
|
|
114
|
+
variant: H.value,
|
|
115
|
+
title: l(n)("userPicker.title"),
|
|
100
116
|
width: 1100,
|
|
101
|
-
"on-confirm":
|
|
102
|
-
"confirm-text": l(
|
|
117
|
+
"on-confirm": le,
|
|
118
|
+
"confirm-text": l(n)("common.confirm")
|
|
103
119
|
}, {
|
|
104
|
-
default:
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
120
|
+
default: h(() => [
|
|
121
|
+
d.value ? (f(), _(l(de), {
|
|
122
|
+
key: 0,
|
|
123
|
+
value: k.value,
|
|
124
|
+
"onUpdate:value": e[0] || (e[0] = (a) => k.value = a),
|
|
125
|
+
type: "segment",
|
|
126
|
+
animated: "",
|
|
127
|
+
class: "picker-tabs"
|
|
128
|
+
}, {
|
|
129
|
+
default: h(() => [
|
|
130
|
+
u(l(L), { name: "users" }, {
|
|
131
|
+
default: h(() => [
|
|
132
|
+
g(o(l(n)("userPicker.available")), 1)
|
|
133
|
+
]),
|
|
134
|
+
_: 1
|
|
135
|
+
}),
|
|
136
|
+
u(l(L), { name: "selected" }, {
|
|
137
|
+
default: h(() => [
|
|
138
|
+
g(o(l(n)("userPicker.selected")) + "(" + o(s.length) + ")", 1)
|
|
139
|
+
]),
|
|
140
|
+
_: 1
|
|
141
|
+
})
|
|
142
|
+
]),
|
|
143
|
+
_: 1
|
|
144
|
+
}, 8, ["value"])) : b("", !0),
|
|
145
|
+
r("div", {
|
|
146
|
+
class: re(["user-picker", { "is-compact": d.value }])
|
|
147
|
+
}, [
|
|
148
|
+
d.value ? b("", !0) : (f(), C("div", Ce, [
|
|
149
|
+
r("div", Ne, o(l(n)("org.title")), 1),
|
|
150
|
+
u(l(pe), {
|
|
151
|
+
data: I.value,
|
|
110
152
|
"key-field": "id",
|
|
111
153
|
"label-field": "name",
|
|
112
154
|
"children-field": "children",
|
|
@@ -114,101 +156,118 @@ const de = { class: "user-picker" }, ue = { class: "picker-tree" }, pe = { class
|
|
|
114
156
|
"block-line": "",
|
|
115
157
|
"default-expand-all": "",
|
|
116
158
|
"selected-keys": c.value != null ? [c.value] : [],
|
|
117
|
-
"onUpdate:selectedKeys":
|
|
159
|
+
"onUpdate:selectedKeys": G
|
|
118
160
|
}, null, 8, ["data", "selected-keys"])
|
|
119
|
-
]),
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
161
|
+
])),
|
|
162
|
+
A(r("div", Pe, [
|
|
163
|
+
d.value ? (f(), _(l(me), {
|
|
164
|
+
key: 0,
|
|
165
|
+
value: c.value ?? 0,
|
|
166
|
+
options: I.value,
|
|
167
|
+
"key-field": "id",
|
|
168
|
+
"label-field": "name",
|
|
169
|
+
"children-field": "children",
|
|
170
|
+
"default-expand-all": "",
|
|
171
|
+
size: "large",
|
|
172
|
+
class: "picker-org-select",
|
|
173
|
+
"onUpdate:value": J
|
|
174
|
+
}, null, 8, ["value", "options"])) : b("", !0),
|
|
175
|
+
r("div", Ie, [
|
|
176
|
+
r("span", null, o(l(n)("userPicker.available")), 1),
|
|
177
|
+
u(l(S), {
|
|
178
|
+
size: x.value,
|
|
125
179
|
type: "primary",
|
|
126
|
-
disabled:
|
|
127
|
-
onClick:
|
|
180
|
+
disabled: m.value.length === 0,
|
|
181
|
+
onClick: Y
|
|
128
182
|
}, {
|
|
129
|
-
default:
|
|
130
|
-
|
|
183
|
+
default: h(() => [
|
|
184
|
+
g(o(l(n)("userPicker.addChecked")) + "(" + o(m.value.length) + ") ", 1)
|
|
131
185
|
]),
|
|
132
186
|
_: 1
|
|
133
|
-
}, 8, ["disabled"])
|
|
187
|
+
}, 8, ["size", "disabled"])
|
|
134
188
|
]),
|
|
135
|
-
u(l(
|
|
189
|
+
u(l(he), {
|
|
136
190
|
"default-page-size": 100,
|
|
137
191
|
ref_key: "tableRef",
|
|
138
|
-
ref:
|
|
139
|
-
columns:
|
|
140
|
-
fetcher:
|
|
192
|
+
ref: y,
|
|
193
|
+
columns: X,
|
|
194
|
+
fetcher: Q,
|
|
195
|
+
search: { container: "table" },
|
|
141
196
|
pagination: { pageSize: 10 },
|
|
142
197
|
size: "small",
|
|
143
198
|
"storage-key": "user-picker",
|
|
144
199
|
"tool-button": !1,
|
|
145
|
-
"checked-row-keys":
|
|
146
|
-
"onUpdate:checkedRowKeys": e[
|
|
147
|
-
onError: e[
|
|
200
|
+
"checked-row-keys": m.value,
|
|
201
|
+
"onUpdate:checkedRowKeys": e[1] || (e[1] = (a) => m.value = a),
|
|
202
|
+
onError: e[2] || (e[2] = (a) => l(M).error(l(ze)(a)))
|
|
148
203
|
}, null, 8, ["checked-row-keys"])
|
|
204
|
+
], 512), [
|
|
205
|
+
[K, !d.value || k.value === "users"]
|
|
149
206
|
]),
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
u(l(
|
|
154
|
-
size:
|
|
207
|
+
A(r("div", Te, [
|
|
208
|
+
r("div", Ue, [
|
|
209
|
+
r("span", null, o(l(n)("userPicker.selected")) + "(" + o(s.length) + ")", 1),
|
|
210
|
+
u(l(S), {
|
|
211
|
+
size: x.value,
|
|
155
212
|
quaternary: "",
|
|
156
213
|
type: "error",
|
|
157
|
-
disabled:
|
|
158
|
-
onClick:
|
|
214
|
+
disabled: s.length === 0,
|
|
215
|
+
onClick: ee
|
|
159
216
|
}, {
|
|
160
|
-
default:
|
|
161
|
-
|
|
217
|
+
default: h(() => [
|
|
218
|
+
g(o(l(n)("userPicker.clear")), 1)
|
|
162
219
|
]),
|
|
163
220
|
_: 1
|
|
164
|
-
}, 8, ["disabled"])
|
|
221
|
+
}, 8, ["size", "disabled"])
|
|
165
222
|
]),
|
|
166
|
-
u(l(
|
|
167
|
-
value:
|
|
168
|
-
"onUpdate:value": e[
|
|
169
|
-
size: "small",
|
|
223
|
+
u(l(ve), {
|
|
224
|
+
value: w.value,
|
|
225
|
+
"onUpdate:value": e[3] || (e[3] = (a) => w.value = a),
|
|
226
|
+
size: d.value ? "large" : "small",
|
|
170
227
|
clearable: "",
|
|
171
|
-
placeholder: l(
|
|
228
|
+
placeholder: l(n)("common.search"),
|
|
172
229
|
style: { "margin-bottom": "8px" }
|
|
173
|
-
}, null, 8, ["value", "placeholder"]),
|
|
174
|
-
|
|
175
|
-
(
|
|
176
|
-
key:
|
|
230
|
+
}, null, 8, ["value", "size", "placeholder"]),
|
|
231
|
+
r("div", Ee, [
|
|
232
|
+
(f(!0), C(ie, null, ce(E.value, (a) => (f(), C("div", {
|
|
233
|
+
key: a.id,
|
|
177
234
|
class: "selected-item"
|
|
178
235
|
}, [
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
236
|
+
r("span", Be, [
|
|
237
|
+
g(o(a.name) + " ", 1),
|
|
238
|
+
r("span", qe, "(" + o(a.account) + ")", 1)
|
|
182
239
|
]),
|
|
183
|
-
u(l(
|
|
184
|
-
size:
|
|
240
|
+
u(l(S), {
|
|
241
|
+
size: x.value,
|
|
185
242
|
quaternary: "",
|
|
186
243
|
type: "error",
|
|
187
|
-
onClick: (
|
|
244
|
+
onClick: (q) => Z(a.id)
|
|
188
245
|
}, {
|
|
189
|
-
icon:
|
|
190
|
-
u(
|
|
246
|
+
icon: h(() => [
|
|
247
|
+
u(ye, {
|
|
191
248
|
icon: "ph:x",
|
|
192
249
|
size: 14
|
|
193
250
|
})
|
|
194
251
|
]),
|
|
195
252
|
_: 1
|
|
196
|
-
}, 8, ["onClick"])
|
|
253
|
+
}, 8, ["size", "onClick"])
|
|
197
254
|
]))), 128)),
|
|
198
|
-
|
|
255
|
+
E.value.length === 0 ? (f(), _(l(fe), {
|
|
199
256
|
key: 0,
|
|
200
|
-
description: l(
|
|
257
|
+
description: l(n)("common.noData"),
|
|
201
258
|
style: { padding: "24px 0" }
|
|
202
|
-
}, null, 8, ["description"])) :
|
|
259
|
+
}, null, 8, ["description"])) : b("", !0)
|
|
203
260
|
])
|
|
261
|
+
], 512), [
|
|
262
|
+
[K, !d.value || k.value === "selected"]
|
|
204
263
|
])
|
|
205
|
-
])
|
|
264
|
+
], 2)
|
|
206
265
|
]),
|
|
207
266
|
_: 1
|
|
208
|
-
}, 8, ["show", "title", "confirm-text"]));
|
|
267
|
+
}, 8, ["show", "variant", "title", "confirm-text"]));
|
|
209
268
|
}
|
|
210
269
|
});
|
|
211
270
|
export {
|
|
212
|
-
|
|
271
|
+
Ge as default
|
|
213
272
|
};
|
|
214
273
|
//# sourceMappingURL=index2.vue.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index2.vue.js","sources":["../../../src/components/UserPicker/index.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { computed, h, onMounted, reactive, ref, unref } from 'vue'\nimport { NButton, NEmpty, NInput, NTree, useMessage } from 'naive-ui'\nimport { SmartTable, type SmartTableColumn, type SmartTableInst } from 'smart-naive-table'\nimport { useI18n } from 'vue-i18n'\nimport AppIcon from '#/components/AppIcon.vue'\nimport FormContainer from '#/components/FormContainer/index.vue'\nimport { orgApi, userApi } from '#/api'\nimport { buildTree } from '#/utils/tree'\nimport { translateError } from '#/utils/error'\nimport type { SysOrg, UserItem } from '#/types/api'\n\nconst props = defineProps<{ excludeIds?: number[] }>()\nconst emit = defineEmits<{ (e: 'confirm', ids: number[]): void }>()\n\nconst { t } = useI18n()\nconst message = useMessage()\n\nconst show = ref(false)\nconst tableRef = ref<SmartTableInst<UserItem>>()\n\n// ── 机构树(左面板) ──\nconst orgFlat = ref<SysOrg[]>([])\nconst orgTree = computed(() => {\n const all = { id: 0, parentId: -1, name: t('common.all'), children: buildTree(orgFlat.value) }\n return [all]\n})\nconst selectedOrgKey = ref<number | null>(null)\nconst orgId = computed(() =>\n selectedOrgKey.value && selectedOrgKey.value !== 0 ? selectedOrgKey.value : undefined,\n)\n\nonMounted(async () => {\n try {\n orgFlat.value = await orgApi.list()\n } catch {\n /* 静默 */\n }\n})\n\nfunction onOrgSelect(keys: Array<string | number>) {\n selectedOrgKey.value = (keys[0] as number) ?? null\n tableRef.value?.refresh()\n}\n\n// ── 可选用户表(中间面板) ──\nconst checkedKeys = ref<(string | number)[]>([])\nconst excludeSet = computed(() => new Set(props.excludeIds ?? []))\n\nconst fetcher = (params: { page: number; pageSize: number; name?: string }) =>\n userApi.page({\n page: params.page,\n pageSize: params.pageSize,\n name: params.name,\n orgId: orgId.value,\n })\n\nconst columns: SmartTableColumn<UserItem>[] = [\n { type: 'selection' },\n { key: 'name', title: () => t('user.name'), width: 100 },\n { key: 'account', title: () => t('user.account'), width: 120, search: true },\n {\n key: 'op',\n title: () => t('common.operation'),\n width: 70,\n render: r => {\n const already = selectedSet.value.has(r.id) || excludeSet.value.has(r.id)\n return h(\n NButton,\n {\n size: 'tiny',\n type: 'primary',\n quaternary: true,\n disabled: already,\n onClick: () => addUsers([r]),\n },\n () => (already ? t('userPicker.added') : t('userPicker.add')),\n )\n },\n },\n]\n\n// ── 已选用户(右面板) ──\nconst selected = reactive<UserItem[]>([])\nconst selectedSet = computed(() => new Set(selected.map(u => u.id)))\nconst selectedSearch = ref('')\nconst filteredSelected = computed(() => {\n const q = selectedSearch.value.trim().toLowerCase()\n if (!q) return selected\n return selected.filter(\n u => u.name.toLowerCase().includes(q) || u.account.toLowerCase().includes(q),\n )\n})\n\nfunction addUsers(users: UserItem[]) {\n for (const u of users) {\n if (!selectedSet.value.has(u.id) && !excludeSet.value.has(u.id)) {\n selected.push(u)\n }\n }\n}\n\nfunction addChecked() {\n // SmartTable 只 expose rows,别改用未公开的 tableData —— 恒为 undefined。\n // unref 兼容类型声明的 Ref 与运行时 expose 解包两种形态。\n const rows = (unref(tableRef.value?.rows) ?? []).filter(r => checkedKeys.value.includes(r.id))\n addUsers(rows)\n checkedKeys.value = []\n}\n\nfunction removeUser(id: number) {\n const idx = selected.findIndex(u => u.id === id)\n if (idx >= 0) selected.splice(idx, 1)\n}\n\nfunction clearSelected() {\n selected.splice(0, selected.length)\n}\n\n// ── 公共 API ──\nasync function open(ids?: number[]) {\n selected.splice(0, selected.length)\n checkedKeys.value = []\n selectedSearch.value = ''\n selectedOrgKey.value = null\n show.value = true\n\n if (ids?.length) {\n try {\n // ponytail: 拉一页,靠 id 过滤。200 是内核 Api:MaxPageSize 的默认上限,再大后端直接回 48001。\n // 用户超过 200 个时,排在后面的 id 解析不出名字,走下面那条退回显示 id 的分支;\n // 真要支持更大规模的用户名单,再改成分页搜索。\n const { items } = await userApi.page({ page: 1, pageSize: 200 })\n const all = items.filter(u => ids.includes(u.id))\n // 没拉到的 id(翻页之外),退回只显示 id\n const found = new Set(all.map(u => u.id))\n for (const u of all) selected.push(u)\n for (const id of ids) {\n if (!found.has(id)) selected.push({ id, account: String(id), name: String(id) } as UserItem)\n }\n } catch {\n for (const id of ids) selected.push({ id, account: String(id), name: String(id) } as UserItem)\n }\n }\n}\n\nasync function handleConfirm() {\n const ids = selected.map(u => u.id)\n emit('confirm', ids)\n}\n\ndefineExpose({ open })\n</script>\n\n<template>\n <FormContainer\n v-model:show=\"show\"\n :title=\"t('userPicker.title')\"\n :width=\"1100\"\n :on-confirm=\"handleConfirm\"\n :confirm-text=\"t('common.confirm')\"\n >\n <div class=\"user-picker\">\n <!-- 左面板:机构树 -->\n <div class=\"picker-tree\">\n <div class=\"panel-header\">{{ t('org.title') }}</div>\n <n-tree\n :data=\"orgTree\"\n key-field=\"id\"\n label-field=\"name\"\n children-field=\"children\"\n selectable\n block-line\n default-expand-all\n :selected-keys=\"selectedOrgKey != null ? [selectedOrgKey] : []\"\n @update:selected-keys=\"onOrgSelect\"\n />\n </div>\n\n <!-- 中间面板:可选用户 -->\n <div class=\"picker-table\">\n <div class=\"panel-header\">\n <span>{{ t('userPicker.available') }}</span>\n <n-button\n size=\"tiny\"\n type=\"primary\"\n :disabled=\"checkedKeys.length === 0\"\n @click=\"addChecked\"\n >\n {{ t('userPicker.addChecked') }}({{ checkedKeys.length }})\n </n-button>\n </div>\n <SmartTable\n :default-page-size=\"100\"\n ref=\"tableRef\"\n :columns=\"columns\"\n :fetcher=\"fetcher\"\n :pagination=\"{ pageSize: 10 }\"\n size=\"small\"\n storage-key=\"user-picker\"\n :tool-button=\"false\"\n :checked-row-keys=\"checkedKeys\"\n @update:checked-row-keys=\"(keys: (string | number)[]) => (checkedKeys = keys)\"\n @error=\"e => message.error(translateError(e))\"\n />\n </div>\n\n <!-- 右面板:已选用户 -->\n <div class=\"picker-selected\">\n <div class=\"panel-header\">\n <span>{{ t('userPicker.selected') }}({{ selected.length }})</span>\n <n-button\n size=\"tiny\"\n quaternary\n type=\"error\"\n :disabled=\"selected.length === 0\"\n @click=\"clearSelected\"\n >\n {{ t('userPicker.clear') }}\n </n-button>\n </div>\n <n-input\n v-model:value=\"selectedSearch\"\n size=\"small\"\n clearable\n :placeholder=\"t('common.search')\"\n style=\"margin-bottom: 8px\"\n />\n <div class=\"selected-list\">\n <div v-for=\"u in filteredSelected\" :key=\"u.id\" class=\"selected-item\">\n <span class=\"selected-name\">\n {{ u.name }}\n <span class=\"selected-account\">({{ u.account }})</span>\n </span>\n <n-button size=\"tiny\" quaternary type=\"error\" @click=\"removeUser(u.id)\">\n <template #icon><AppIcon icon=\"ph:x\" :size=\"14\" /></template>\n </n-button>\n </div>\n <n-empty\n v-if=\"filteredSelected.length === 0\"\n :description=\"t('common.noData')\"\n style=\"padding: 24px 0\"\n />\n </div>\n </div>\n </div>\n </FormContainer>\n</template>\n\n<style scoped>\n.user-picker {\n display: flex;\n gap: 12px;\n min-height: 400px;\n}\n.panel-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n font-size: 13px;\n font-weight: 600;\n padding: 0 0 8px;\n border-bottom: 1px solid var(--n-border-color, #e0e0e6);\n margin-bottom: 8px;\n}\n.picker-tree {\n width: 160px;\n flex-shrink: 0;\n overflow: auto;\n border-right: 1px solid var(--n-border-color, #e0e0e6);\n padding-right: 12px;\n}\n.picker-table {\n flex: 1;\n min-width: 0;\n overflow: hidden;\n}\n.picker-selected {\n width: 200px;\n flex-shrink: 0;\n border-left: 1px solid var(--n-border-color, #e0e0e6);\n padding-left: 12px;\n display: flex;\n flex-direction: column;\n}\n.selected-list {\n flex: 1;\n overflow: auto;\n max-height: 380px;\n}\n.selected-item {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 4px 0;\n font-size: 13px;\n border-bottom: 1px solid var(--n-border-color, #e0e0e6);\n}\n.selected-item:last-child {\n border-bottom: none;\n}\n.selected-name {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n.selected-account {\n color: var(--n-text-color-disabled, #999);\n font-size: 12px;\n margin-left: 2px;\n}\n</style>\n"],"names":["props","__props","emit","__emit","t","useI18n","message","useMessage","show","ref","tableRef","orgFlat","orgTree","computed","buildTree","selectedOrgKey","orgId","onMounted","orgApi","onOrgSelect","keys","_a","checkedKeys","excludeSet","fetcher","params","userApi","columns","r","already","selectedSet","h","NButton","addUsers","selected","reactive","u","selectedSearch","filteredSelected","q","users","addChecked","rows","unref","removeUser","id","idx","clearSelected","open","ids","items","all","found","handleConfirm","__expose","_createBlock","FormContainer","$event","_unref","_createElementVNode","_hoisted_1","_hoisted_2","_hoisted_3","_toDisplayString","_createVNode","NTree","_hoisted_4","_hoisted_5","_createTextVNode","SmartTable","_cache","e","translateError","_hoisted_6","_hoisted_7","NInput","_hoisted_8","_createElementBlock","_Fragment","_renderList","_hoisted_9","_hoisted_10","AppIcon","NEmpty"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index2.vue.js","sources":["../../../src/components/UserPicker/index.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { computed, h, onMounted, reactive, ref, unref } from 'vue'\nimport { NButton, NEmpty, NInput, NTab, NTabs, NTree, NTreeSelect, useMessage } from 'naive-ui'\nimport { SmartTable, type SmartTableColumn, type SmartTableInst } from 'smart-naive-table'\nimport { useI18n } from 'vue-i18n'\nimport { useWindowSize } from '@vueuse/core'\nimport AppIcon from '#/components/AppIcon.vue'\nimport FormContainer from '#/components/FormContainer/index.vue'\nimport { useShellBreakpoint } from '#/composables/useShellBreakpoint'\nimport { orgApi, userApi } from '#/api'\nimport { buildTree } from '#/utils/tree'\nimport { translateError } from '#/utils/error'\nimport { SEARCH_ACTIONS } from '#/utils/tableFilter'\nimport type { SysOrg, UserItem } from '#/types/api'\n\nconst props = defineProps<{ excludeIds?: number[] }>()\nconst emit = defineEmits<{ (e: 'confirm', ids: number[]): void }>()\n\nconst { t } = useI18n()\nconst message = useMessage()\n\nconst show = ref(false)\nconst tableRef = ref<SmartTableInst<UserItem>>()\n\n// 屏幕形态:\n// 宽 / 中档 = 居中弹窗里的三栏(机构树 | 可选用户 | 已选);\n// 窄档(壳层 < 600)= 底部抽屉,三栏收成「可选用户 / 已选」两页,机构树换成页内的树选择;\n// 内容区 < 900 但还不到窄档时仍是弹窗,三栏同样收成两页(1100 宽的三栏在这里放不下)。\n// 三栏选择器在抽屉里太局促,所以宽 / 中档固定用弹窗,不跟随「表单形态」全局偏好。\nconst { bp } = useShellBreakpoint()\nconst { width: winW } = useWindowSize()\nconst compact = computed(() => bp.value === 'narrow' || winW.value < 900)\nconst variant = computed(() => (bp.value === 'narrow' ? 'drawer' : 'modal'))\nconst tab = ref<'users' | 'selected'>('users')\nconst btnSize = computed(() => (compact.value ? 'large' : 'small'))\n\n// ── 机构树(左面板) ──\nconst orgFlat = ref<SysOrg[]>([])\nconst orgTree = computed(() => {\n const all = { id: 0, parentId: -1, name: t('common.all'), children: buildTree(orgFlat.value) }\n return [all]\n})\nconst selectedOrgKey = ref<number | null>(null)\nconst orgId = computed(() =>\n selectedOrgKey.value && selectedOrgKey.value !== 0 ? selectedOrgKey.value : undefined,\n)\n\nonMounted(async () => {\n try {\n orgFlat.value = await orgApi.list()\n } catch {\n /* 静默 */\n }\n})\n\nfunction onOrgSelect(keys: Array<string | number>) {\n selectedOrgKey.value = (keys[0] as number) ?? null\n tableRef.value?.refresh()\n}\n// 两页形态下机构树换成树选择:没有「再点一次取消」,选「全部」(id 0)即不限机构。\nfunction onOrgPick(key: number | null) {\n selectedOrgKey.value = key ?? null\n tableRef.value?.refresh()\n}\n\n// ── 可选用户表(中间面板) ──\nconst checkedKeys = ref<(string | number)[]>([])\nconst excludeSet = computed(() => new Set(props.excludeIds ?? []))\n\nconst fetcher = (params: { page: number; pageSize: number; account?: string }) =>\n userApi.page({\n page: params.page,\n pageSize: params.pageSize,\n account: params.account,\n orgId: orgId.value,\n })\n\nconst columns: SmartTableColumn<UserItem>[] = [\n { type: 'selection' },\n { key: 'name', title: () => t('user.name'), width: 100 },\n {\n key: 'account',\n title: () => t('user.account'),\n width: 120,\n search: { actions: SEARCH_ACTIONS.fuzzy },\n },\n {\n key: 'op',\n title: () => t('common.operation'),\n width: 70,\n render: r => {\n const already = selectedSet.value.has(r.id) || excludeSet.value.has(r.id)\n return h(\n NButton,\n {\n size: 'tiny',\n type: 'primary',\n quaternary: true,\n disabled: already,\n onClick: () => addUsers([r]),\n },\n () => (already ? t('userPicker.added') : t('userPicker.add')),\n )\n },\n },\n]\n\n// ── 已选用户(右面板) ──\nconst selected = reactive<UserItem[]>([])\nconst selectedSet = computed(() => new Set(selected.map(u => u.id)))\nconst selectedSearch = ref('')\nconst filteredSelected = computed(() => {\n const q = selectedSearch.value.trim().toLowerCase()\n if (!q) return selected\n return selected.filter(\n u => u.name.toLowerCase().includes(q) || u.account.toLowerCase().includes(q),\n )\n})\n\nfunction addUsers(users: UserItem[]) {\n for (const u of users) {\n if (!selectedSet.value.has(u.id) && !excludeSet.value.has(u.id)) {\n selected.push(u)\n }\n }\n}\n\nfunction addChecked() {\n // SmartTable 只 expose rows,别改用未公开的 tableData —— 恒为 undefined。\n // unref 兼容类型声明的 Ref 与运行时 expose 解包两种形态。\n const rows = (unref(tableRef.value?.rows) ?? []).filter(r => checkedKeys.value.includes(r.id))\n addUsers(rows)\n checkedKeys.value = []\n}\n\nfunction removeUser(id: number) {\n const idx = selected.findIndex(u => u.id === id)\n if (idx >= 0) selected.splice(idx, 1)\n}\n\nfunction clearSelected() {\n selected.splice(0, selected.length)\n}\n\n// ── 公共 API ──\nasync function open(ids?: number[]) {\n selected.splice(0, selected.length)\n checkedKeys.value = []\n selectedSearch.value = ''\n selectedOrgKey.value = null\n tab.value = 'users'\n show.value = true\n\n if (ids?.length) {\n try {\n // ponytail: 拉一页,靠 id 过滤。取 200 是为了在应用把 Api:MaxPageSize 调小时也不会被后端回 48001。\n // 用户超过 200 个时,排在后面的 id 解析不出名字,走下面那条退回显示 id 的分支;\n // 真要支持更大规模的用户名单,再改成分页搜索。\n const { items } = await userApi.page({ page: 1, pageSize: 200 })\n const all = items.filter(u => ids.includes(u.id))\n // 没拉到的 id(翻页之外),退回只显示 id\n const found = new Set(all.map(u => u.id))\n for (const u of all) selected.push(u)\n for (const id of ids) {\n if (!found.has(id)) selected.push({ id, account: String(id), name: String(id) } as UserItem)\n }\n } catch {\n for (const id of ids) selected.push({ id, account: String(id), name: String(id) } as UserItem)\n }\n }\n}\n\nasync function handleConfirm() {\n const ids = selected.map(u => u.id)\n emit('confirm', ids)\n}\n\ndefineExpose({ open })\n</script>\n\n<template>\n <FormContainer\n v-model:show=\"show\"\n :variant=\"variant\"\n :title=\"t('userPicker.title')\"\n :width=\"1100\"\n :on-confirm=\"handleConfirm\"\n :confirm-text=\"t('common.confirm')\"\n >\n <n-tabs v-if=\"compact\" v-model:value=\"tab\" type=\"segment\" animated class=\"picker-tabs\">\n <n-tab name=\"users\">{{ t('userPicker.available') }}</n-tab>\n <n-tab name=\"selected\">{{ t('userPicker.selected') }}({{ selected.length }})</n-tab>\n </n-tabs>\n <div class=\"user-picker\" :class=\"{ 'is-compact': compact }\">\n <!-- 左面板:机构树(两页形态下换成可选用户页顶部的树选择) -->\n <div v-if=\"!compact\" class=\"picker-tree\">\n <div class=\"panel-header\">{{ t('org.title') }}</div>\n <n-tree\n :data=\"orgTree\"\n key-field=\"id\"\n label-field=\"name\"\n children-field=\"children\"\n selectable\n block-line\n default-expand-all\n :selected-keys=\"selectedOrgKey != null ? [selectedOrgKey] : []\"\n @update:selected-keys=\"onOrgSelect\"\n />\n </div>\n\n <!-- 中间面板:可选用户 -->\n <div v-show=\"!compact || tab === 'users'\" class=\"picker-table\">\n <n-tree-select\n v-if=\"compact\"\n :value=\"selectedOrgKey ?? 0\"\n :options=\"orgTree\"\n key-field=\"id\"\n label-field=\"name\"\n children-field=\"children\"\n default-expand-all\n size=\"large\"\n class=\"picker-org-select\"\n @update:value=\"onOrgPick\"\n />\n <div class=\"panel-header\">\n <span>{{ t('userPicker.available') }}</span>\n <n-button\n :size=\"btnSize\"\n type=\"primary\"\n :disabled=\"checkedKeys.length === 0\"\n @click=\"addChecked\"\n >\n {{ t('userPicker.addChecked') }}({{ checkedKeys.length }})\n </n-button>\n </div>\n <SmartTable\n :default-page-size=\"100\"\n ref=\"tableRef\"\n :columns=\"columns\"\n :fetcher=\"fetcher\"\n :search=\"{ container: 'table' }\"\n :pagination=\"{ pageSize: 10 }\"\n size=\"small\"\n storage-key=\"user-picker\"\n :tool-button=\"false\"\n :checked-row-keys=\"checkedKeys\"\n @update:checked-row-keys=\"(keys: (string | number)[]) => (checkedKeys = keys)\"\n @error=\"e => message.error(translateError(e))\"\n />\n </div>\n\n <!-- 右面板:已选用户 -->\n <div v-show=\"!compact || tab === 'selected'\" class=\"picker-selected\">\n <div class=\"panel-header\">\n <span>{{ t('userPicker.selected') }}({{ selected.length }})</span>\n <n-button\n :size=\"btnSize\"\n quaternary\n type=\"error\"\n :disabled=\"selected.length === 0\"\n @click=\"clearSelected\"\n >\n {{ t('userPicker.clear') }}\n </n-button>\n </div>\n <n-input\n v-model:value=\"selectedSearch\"\n :size=\"compact ? 'large' : 'small'\"\n clearable\n :placeholder=\"t('common.search')\"\n style=\"margin-bottom: 8px\"\n />\n <div class=\"selected-list\">\n <div v-for=\"u in filteredSelected\" :key=\"u.id\" class=\"selected-item\">\n <span class=\"selected-name\">\n {{ u.name }}\n <span class=\"selected-account\">({{ u.account }})</span>\n </span>\n <n-button :size=\"btnSize\" quaternary type=\"error\" @click=\"removeUser(u.id)\">\n <template #icon><AppIcon icon=\"ph:x\" :size=\"14\" /></template>\n </n-button>\n </div>\n <n-empty\n v-if=\"filteredSelected.length === 0\"\n :description=\"t('common.noData')\"\n style=\"padding: 24px 0\"\n />\n </div>\n </div>\n </div>\n </FormContainer>\n</template>\n\n<style scoped>\n/* 选择器的尺寸、分隔线、字号。 */\n.user-picker {\n display: flex;\n gap: 12px;\n min-height: min(440px, calc(100vh - 250px));\n}\n.panel-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n min-height: 34px;\n font-size: 13.5px;\n font-weight: 600;\n padding: 0 0 8px;\n border-bottom: 1px solid var(--hairline);\n margin-bottom: 8px;\n}\n.picker-tree {\n width: 200px;\n flex-shrink: 0;\n overflow: auto;\n border-right: 1px solid var(--hairline);\n padding-right: 12px;\n}\n.picker-table {\n flex: 1;\n min-width: 0;\n overflow: hidden;\n}\n.picker-org-select {\n margin-bottom: 8px;\n}\n.picker-selected {\n width: 220px;\n flex-shrink: 0;\n border-left: 1px solid var(--hairline);\n padding-left: 12px;\n display: flex;\n flex-direction: column;\n min-height: 0;\n}\n.selected-list {\n flex: 1;\n min-height: 0;\n overflow: auto;\n max-height: 380px;\n}\n.selected-item {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 6px;\n padding: 2px 0;\n font-size: 13.5px;\n border-bottom: 1px solid var(--hairline);\n}\n.selected-item:last-child {\n border-bottom: none;\n}\n.selected-name {\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n.selected-account {\n color: var(--text-3);\n margin-left: 2px;\n}\n\n/* 两页形态:分段页签在上,当前页占满整行;已选页不再要左侧分隔线,条目行高放大到可点 */\n.picker-tabs {\n margin-bottom: 12px;\n}\n.user-picker.is-compact {\n min-height: 0;\n}\n.is-compact .picker-selected {\n width: auto;\n flex: 1;\n border-left: none;\n padding-left: 0;\n}\n.is-compact .selected-list {\n max-height: none;\n}\n.is-compact .selected-item {\n min-height: 44px;\n}\n</style>\n"],"names":["props","__props","emit","__emit","t","useI18n","message","useMessage","show","ref","tableRef","bp","useShellBreakpoint","winW","useWindowSize","compact","computed","variant","tab","btnSize","orgFlat","orgTree","buildTree","selectedOrgKey","orgId","onMounted","orgApi","onOrgSelect","keys","_a","onOrgPick","key","checkedKeys","excludeSet","fetcher","params","userApi","columns","SEARCH_ACTIONS","r","already","selectedSet","h","NButton","addUsers","selected","reactive","u","selectedSearch","filteredSelected","q","users","addChecked","rows","unref","removeUser","id","idx","clearSelected","open","ids","items","all","found","handleConfirm","__expose","_createBlock","FormContainer","$event","_unref","NTabs","_createVNode","NTab","_createTextVNode","_toDisplayString","_createElementVNode","_normalizeClass","_openBlock","_createElementBlock","_hoisted_1","_hoisted_2","NTree","_withDirectives","_hoisted_3","NTreeSelect","_hoisted_4","SmartTable","_cache","e","translateError","_vShow","_hoisted_5","_hoisted_6","NInput","_hoisted_7","_Fragment","_renderList","_hoisted_8","_hoisted_9","AppIcon","NEmpty"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useBatchDelete.js","sources":["../../src/composables/useBatchDelete.ts"],"sourcesContent":["// 表格批量删除的样板收敛:维护勾选态 + 二次确认(挂起对话框防连点)+ 成功后清选并刷新。\n// 用在 SmartTable(经 $attrs 把 checked-row-keys 透传到内层 n-data-table)
|
|
1
|
+
{"version":3,"file":"useBatchDelete.js","sources":["../../src/composables/useBatchDelete.ts"],"sourcesContent":["// 表格批量删除的样板收敛:维护勾选态 + 二次确认(挂起对话框防连点)+ 成功后清选并刷新。\n// 用在 SmartTable(经 $attrs 把 checked-row-keys 透传到内层 n-data-table)。\n// 仅限 setup 中调用(内部用 useConfirm → useI18n/useDialog)。\n// SmartTable 3.0 用 #batch 批量栏承载按钮(勾选后才出现),不需要 hasSelection 控制禁用;\n// hasSelection 仍返回,给批量按钮不在 #batch 里的调用方用(如字典项的窄档抽屉,按钮在抽屉底栏)。\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":";;;AAuBO,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;"}
|
|
@@ -1,25 +1,26 @@
|
|
|
1
|
-
import { computed as l, ref as
|
|
2
|
-
import { NBadge as
|
|
3
|
-
import { createSharedComposable as
|
|
4
|
-
import
|
|
5
|
-
import { menuBadge as
|
|
1
|
+
import { computed as l, ref as I, watch as s, h } from "vue";
|
|
2
|
+
import { NBadge as M } from "naive-ui";
|
|
3
|
+
import { createSharedComposable as O } from "@vueuse/core";
|
|
4
|
+
import w from "../components/AppIcon.vue.js";
|
|
5
|
+
import { menuBadge as A } from "./useMenuBadge.js";
|
|
6
6
|
import { router as a } from "../router/index.js";
|
|
7
7
|
import { useAuthStore as K } from "../stores/auth.js";
|
|
8
8
|
import { useAppStore as T } from "../stores/app.js";
|
|
9
9
|
import { translateMenuTitle as m } from "../locales/menuTitle.js";
|
|
10
10
|
import { isHttpUrl as W, isFullscreenPath as _ } from "../utils/url.js";
|
|
11
|
+
import { lineIcon as C } from "../utils/menuIcon.js";
|
|
11
12
|
import { MenuType as p } from "../types/menu.js";
|
|
12
13
|
function d(r) {
|
|
13
14
|
return !W(r) && !_(r) ? !1 : (window.open(r, "_blank", "noopener,noreferrer"), !0);
|
|
14
15
|
}
|
|
15
|
-
function v(r, e = "ph:dot-outline
|
|
16
|
-
return () => h(
|
|
16
|
+
function v(r, e = "ph:dot-outline") {
|
|
17
|
+
return () => h(w, { icon: C(r) || e, size: 18 });
|
|
17
18
|
}
|
|
18
|
-
function
|
|
19
|
+
function R(r) {
|
|
19
20
|
if (r)
|
|
20
21
|
return () => {
|
|
21
|
-
const e =
|
|
22
|
-
return e == null || e === 0 || e === "" ? null : h(
|
|
22
|
+
const e = A(r);
|
|
23
|
+
return e == null || e === 0 || e === "" ? null : h(M, { value: e, max: 99 });
|
|
23
24
|
};
|
|
24
25
|
}
|
|
25
26
|
function y(r) {
|
|
@@ -29,7 +30,7 @@ function y(r) {
|
|
|
29
30
|
return n.length ? {
|
|
30
31
|
label: m(e.title, e.path),
|
|
31
32
|
key: `cat-${e.id}`,
|
|
32
|
-
icon: v(e.icon, "ph:folder
|
|
33
|
+
icon: v(e.icon, "ph:folder"),
|
|
33
34
|
children: n
|
|
34
35
|
} : null;
|
|
35
36
|
}
|
|
@@ -37,7 +38,7 @@ function y(r) {
|
|
|
37
38
|
label: m(e.title, e.path),
|
|
38
39
|
key: e.path ?? `menu-${e.id}`,
|
|
39
40
|
icon: v(e.icon),
|
|
40
|
-
extra:
|
|
41
|
+
extra: R(e.path)
|
|
41
42
|
};
|
|
42
43
|
}).filter((e) => e !== null);
|
|
43
44
|
}
|
|
@@ -51,10 +52,10 @@ function k(r) {
|
|
|
51
52
|
if (n) return n;
|
|
52
53
|
}
|
|
53
54
|
}
|
|
54
|
-
function
|
|
55
|
+
function $() {
|
|
55
56
|
const r = K(), e = T(), n = l(() => (e.locale, y(r.menuTree))), b = l(
|
|
56
57
|
() => n.value.map((t) => ({ label: t.label, key: t.key, icon: t.icon, extra: t.extra }))
|
|
57
|
-
), c = l(() => a.currentRoute.value.path), i =
|
|
58
|
+
), c = l(() => a.currentRoute.value.path), i = I();
|
|
58
59
|
function f(t) {
|
|
59
60
|
const o = n.value.find((u) => g(u, t));
|
|
60
61
|
return o ? String(o.key) : void 0;
|
|
@@ -86,8 +87,8 @@ function R() {
|
|
|
86
87
|
}
|
|
87
88
|
return { menuOptions: n, l1Options: b, l2Options: S, selectedL1: i, activeKey: c, onSelect: x, onSelectL1: L };
|
|
88
89
|
}
|
|
89
|
-
const
|
|
90
|
+
const Q = O($);
|
|
90
91
|
export {
|
|
91
|
-
|
|
92
|
+
Q as useLayoutMenu
|
|
92
93
|
};
|
|
93
94
|
//# sourceMappingURL=useLayoutMenu.js.map
|