smart-admin-web 10.12.2 → 10.13.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/dist/api/index.d.ts +16 -1
- package/dist/api/index.js +48 -33
- package/dist/api/index.js.map +1 -1
- package/dist/api/schema.d.ts +409 -0
- package/dist/assets/icons/ph-subset.json.js +1 -1
- package/dist/composables/useModule.js +35 -27
- package/dist/composables/useModule.js.map +1 -1
- package/dist/index.js +250 -249
- package/dist/layouts/AppHeader.vue.js +1 -1
- package/dist/layouts/AppHeader2.vue.js +306 -292
- package/dist/layouts/AppHeader2.vue.js.map +1 -1
- package/dist/lib/runtime.js +1 -1
- package/dist/locales/en-US.d.ts +37 -0
- package/dist/locales/en-US.js +37 -0
- package/dist/locales/en-US.js.map +1 -1
- package/dist/locales/zh-CN.d.ts +37 -0
- package/dist/locales/zh-CN.js +37 -0
- package/dist/locales/zh-CN.js.map +1 -1
- package/dist/router/viewRegistry.js +1 -1
- package/dist/router/viewRegistry.js.map +1 -1
- package/dist/stores/user.d.ts +6 -1
- package/dist/stores/user.js.map +1 -1
- package/dist/style.css +1 -1
- package/dist/types/api.d.ts +33 -0
- package/dist/types/api.js.map +1 -1
- package/dist/views/system/tenant/index.vue.d.ts +3 -0
- package/dist/views/system/tenant/index.vue.js +8 -0
- package/dist/views/system/tenant/index.vue.js.map +1 -0
- package/dist/views/system/tenant/index2.vue.js +366 -0
- package/dist/views/system/tenant/index2.vue.js.map +1 -0
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AppHeader2.vue.js","sources":["../../src/layouts/AppHeader.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { computed, h, ref } from 'vue'\nimport { useRoute, useRouter } from 'vue-router'\nimport {\n NAvatar,\n NButton,\n NDropdown,\n NTooltip,\n NMenu,\n NBreadcrumb,\n NBreadcrumbItem,\n useMessage,\n type DropdownOption,\n} from 'naive-ui'\nimport { Icon } from '@iconify/vue'\nimport { useI18n } from 'vue-i18n'\nimport { useAppStore, type Locale } from '#/stores/app'\nimport { useUserStore } from '#/stores/user'\nimport { useAuthStore } from '#/stores/auth'\nimport { useLayoutMenu } from '#/composables/useLayoutMenu'\nimport { useMenuFlat } from '#/composables/useMenuFlat'\nimport { useSite } from '#/composables/useSite'\nimport { useFullscreenToggle } from '#/composables/useFullscreenToggle'\nimport { useHeaderTools } from '#/composables/useHeaderTools'\nimport { authApi } from '#/api'\nimport { clearClientCache } from '#/composables/clearClientCache'\nimport { beginVoluntaryLogout } from '#/composables/useRealtime'\nimport { resetRouter } from '#/router'\nimport { translateError } from '#/utils/error'\nimport SmartLogo from '#/components/SmartLogo.vue'\nimport AppIcon from '#/components/AppIcon.vue'\nimport SettingsDrawer from './SettingsDrawer.vue'\nimport MenuSearch from '#/components/MenuSearch.vue'\nimport NoticeBell from './NoticeBell.vue'\n\nwithDefaults(\n defineProps<{\n showCollapse?: boolean\n showBrand?: boolean\n topMenu?: 'full' | 'l1' | 'l2' | null\n }>(),\n { showCollapse: true, showBrand: false, topMenu: null },\n)\n\nconst app = useAppStore()\nconst { site } = useSite()\nconst user = useUserStore()\nconst auth = useAuthStore()\nconst route = useRoute()\nconst router = useRouter()\nconst message = useMessage()\nconst { t } = useI18n()\n// 自研而非 VueUse useFullscreen:后者在 iPadOS 上只探标准 API,把明明能全屏的设备判成不支持。\n// isSupported=false(如 iPhone)时整个按钮不渲染,不留点了没反应的按钮。\nconst {\n isSupported: fullscreenSupported,\n isFullscreen,\n toggle: toggleFullscreen,\n} = useFullscreenToggle()\nconst { menuOptions, l1Options, l2Options, activeKey, selectedL1, onSelect, onSelectL1 } =\n useLayoutMenu()\nconst flat = useMenuFlat()\n// 扩展模块登记的顶栏入口(registerHeaderTool),渲染在内置铃铛左侧。\nconst headerTools = useHeaderTools()\n\nconst settingsOpen = ref(false)\nconst searchOpen = ref(false)\n\nconst title = computed(() => {\n const m = route.meta.title as string | undefined\n if (!m) return ''\n return m.includes('.') ? t(m) : m\n})\nconst crumbs = computed(() => flat.value.find(l => l.path === route.path)?.breadcrumb ?? [])\n\n// 语言名按各自书写系统展示,不随当前 locale 翻译。\nconst localeOptions: DropdownOption[] = [\n { label: '简体中文', key: 'zh-CN' },\n { label: 'English', key: 'en-US' },\n]\nfunction onLocale(key: string) {\n app.setLocale(key as Locale)\n}\n\n// 下拉图标(用户菜单:个人中心 / 清除缓存 / 退出)。\n// color 用于危险项(退出)整行红字+红图标。\nconst renderUserIcon = (name: string, color?: string) => () =>\n h(Icon, { icon: name, width: 16, style: color ? { color } : undefined })\n\n// 下拉:个人中心 / 清除缓存 / 退出;五块能力进 /personal 二级壳(见 PersonalLayout)。\nconst userOptions = computed<DropdownOption[]>(() => [\n { label: t('app.personalCenter'), key: 'personal', icon: renderUserIcon('ph:user') },\n { label: t('app.clearCache'), key: 'clearCache', icon: renderUserIcon('ph:broom') },\n { type: 'divider', key: 'd1' },\n // 退出用危险色突出,避免与普通项同权。\n {\n label: t('app.logout'),\n key: 'logout',\n icon: renderUserIcon('ph:sign-out', 'var(--color-danger)'),\n props: { style: 'color: var(--color-danger)' },\n },\n])\nasync function onUser(key: string) {\n if (key === 'personal') router.push('/personal/profile')\n else if (key === 'clearCache') await onClearCache()\n else if (key === 'logout') await logout()\n}\nasync function onClearCache() {\n try {\n await clearClientCache()\n message.success(t('app.cacheCleared'))\n } catch (e) {\n message.error(translateError(e))\n }\n}\nasync function logout() {\n // 先断实时并标记自愿退出:logout API 会 Revoke 会话并推 force-logout,避免误弹「您已被强制下线」。\n await beginVoluntaryLogout()\n try {\n await authApi.logout()\n } catch (e) {\n message.error(translateError(e)) // 尽力而为,不阻断登出\n }\n resetRouter()\n auth.reset() // 内部会 clearTabs()\n user.clear()\n router.replace('/login')\n}\n</script>\n\n<template>\n <div class=\"bar\">\n <div class=\"left\">\n <n-button\n v-if=\"showCollapse\"\n quaternary\n circle\n :aria-label=\"t('app.collapse')\"\n @click=\"app.toggleCollapsed()\"\n >\n <Icon :icon=\"app.collapsed ? 'ph:list' : 'ph:sidebar-simple'\" :width=\"20\" />\n </n-button>\n <div v-if=\"showBrand\" class=\"brand\">\n <SmartLogo :size=\"26\" />\n <span class=\"brand-name mobile-hide\">{{ site.title }}</span>\n </div>\n <n-breadcrumb v-if=\"app.showBreadcrumb && crumbs.length\">\n <n-breadcrumb-item v-for=\"(c, i) in crumbs\" :key=\"i\">{{ c }}</n-breadcrumb-item>\n </n-breadcrumb>\n <span v-else class=\"title\">{{ title }}</span>\n </div>\n\n <div v-if=\"topMenu\" class=\"center\">\n <n-menu\n v-if=\"topMenu === 'full'\"\n mode=\"horizontal\"\n responsive\n :options=\"menuOptions\"\n :value=\"activeKey\"\n @update:value=\"onSelect\"\n />\n <n-menu\n v-else-if=\"topMenu === 'l1'\"\n mode=\"horizontal\"\n responsive\n :options=\"l1Options\"\n :value=\"selectedL1\"\n @update:value=\"onSelectL1\"\n />\n <n-menu\n v-else\n mode=\"horizontal\"\n responsive\n :options=\"l2Options\"\n :value=\"activeKey\"\n @update:value=\"onSelect\"\n />\n </div>\n\n <!-- mobile-hide:窄屏(<768px)藏起来的次要项。顶栏总宽 > 屏宽时右端会被 layout 的 overflow:hidden 裁掉,\n 而全站唯一的登出入口就在最右边的用户下拉里 —— 手机上不能因为一排图标而退不出登录。\n 搜索有 Ctrl+K 兜底、全屏在手机上无意义、语言与设置属低频(设置抽屉本就是宽屏调布局用的)。 -->\n <div class=\"right\">\n <n-tooltip>\n <template #trigger>\n <n-button quaternary circle class=\"mobile-hide\" @click=\"searchOpen = true\">\n <Icon icon=\"ph:magnifying-glass\" :width=\"18\" />\n </n-button>\n </template>\n {{ t('app.search') }} (Ctrl+K)\n </n-tooltip>\n\n <n-tooltip v-if=\"fullscreenSupported\">\n <template #trigger>\n <n-button\n quaternary\n circle\n class=\"mobile-hide\"\n :aria-label=\"isFullscreen ? t('app.exitFullscreen') : t('app.fullscreen')\"\n @click=\"toggleFullscreen()\"\n >\n <Icon :icon=\"isFullscreen ? 'ph:arrows-in' : 'ph:arrows-out'\" :width=\"18\" />\n </n-button>\n </template>\n {{ isFullscreen ? t('app.exitFullscreen') : t('app.fullscreen') }}\n </n-tooltip>\n\n <n-tooltip>\n <template #trigger>\n <n-button quaternary circle @click=\"app.toggleDark()\">\n <Icon :icon=\"app.isDark ? 'ph:moon-stars' : 'ph:sun'\" :width=\"18\" />\n </n-button>\n </template>\n {{ app.isDark ? t('app.dark') : t('app.light') }}\n </n-tooltip>\n\n <n-dropdown :options=\"localeOptions\" @select=\"onLocale\">\n <n-button quaternary circle class=\"mobile-hide\" :aria-label=\"t('app.language')\">\n <Icon icon=\"ph:translate\" :width=\"18\" />\n </n-button>\n </n-dropdown>\n\n <n-tooltip>\n <template #trigger>\n <n-button quaternary circle class=\"mobile-hide\" @click=\"settingsOpen = true\">\n <Icon icon=\"ph:gear-six\" :width=\"18\" />\n </n-button>\n </template>\n {{ t('app.settings') }}\n </n-tooltip>\n\n <!-- 导航到应用选择页,而非下拉直切:应用一多下拉就难用,且\"设为默认\"只在选择页上。 -->\n <n-tooltip v-if=\"auth.modules.length > 1\">\n <template #trigger>\n <n-button\n quaternary\n circle\n :aria-label=\"t('app.switchModule')\"\n @click=\"router.push('/module')\"\n >\n <Icon icon=\"ph:squares-four\" :width=\"18\" />\n </n-button>\n </template>\n {{ t('app.switchModule') }}\n </n-tooltip>\n\n <!-- 扩展模块的入口:图标模式画成同款圆形按钮,组件模式整块交给它自己(自带角标/弹层时用) -->\n <template v-for=\"tool in headerTools\" :key=\"tool.key\">\n <component :is=\"tool.component\" v-if=\"tool.component\" />\n <n-tooltip v-else>\n <template #trigger>\n <n-button\n quaternary\n circle\n :class=\"{ 'mobile-hide': !tool.keepOnMobile }\"\n :aria-label=\"tool.label\"\n @click=\"tool.onClick()\"\n >\n <AppIcon :icon=\"tool.icon\" :size=\"18\" />\n </n-button>\n </template>\n {{ tool.label }}\n </n-tooltip>\n </template>\n\n <NoticeBell />\n\n <n-dropdown :options=\"userOptions\" @select=\"onUser\">\n <n-button quaternary :aria-label=\"t('app.profile')\">\n <!-- 有头像用头像(profile 页可传),没有回落原图标;头像来源见 stores/user.ts 的 avatar 注释 -->\n <n-avatar v-if=\"user.userInfo?.avatar\" round :size=\"22\" :src=\"user.userInfo.avatar\" />\n <Icon v-else icon=\"ph:user-circle\" :width=\"20\" />\n <span class=\"uname mobile-hide\">\n {{ user.userInfo?.name ?? user.userInfo?.account ?? '' }}\n </span>\n </n-button>\n </n-dropdown>\n </div>\n\n <SettingsDrawer v-model:show=\"settingsOpen\" />\n <MenuSearch v-model:show=\"searchOpen\" />\n </div>\n</template>\n\n<style scoped>\n.bar {\n height: 100%;\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 0 16px;\n}\n/* 可收缩(min-width:0 + overflow):右侧那组是刚需(含唯一的登出入口),要挤先挤左边的标题/面包屑。 */\n.left {\n display: flex;\n align-items: center;\n gap: 10px;\n min-width: 0;\n overflow: hidden;\n}\n.brand {\n display: flex;\n align-items: center;\n gap: 8px;\n color: var(--color-text-primary);\n font-weight: 600;\n flex-shrink: 0;\n}\n.brand-name {\n font-size: var(--font-size-md);\n}\n.title {\n font-size: var(--font-size-md);\n font-weight: 500;\n color: var(--color-text-primary);\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n.uname {\n margin-left: 6px;\n}\n.center {\n flex: 1;\n min-width: 0;\n overflow: hidden;\n}\n.right {\n display: flex;\n align-items: center;\n gap: 6px;\n margin-left: auto;\n flex-shrink: 0;\n}\n\n/* 窄屏(断点与 layouts/default.vue 的 breakpointsTailwind.smaller('md') 一致):\n 只留暗色/应用切换/铃铛/用户下拉,其余隐藏,保证最右的登出入口不被裁掉。 */\n@media (max-width: 767px) {\n .bar {\n gap: 8px;\n padding: 0 8px;\n }\n .mobile-hide {\n display: none;\n }\n}\n</style>\n"],"names":["app","useAppStore","site","useSite","user","useUserStore","auth","useAuthStore","route","useRoute","router","useRouter","message","useMessage","t","useI18n","fullscreenSupported","isFullscreen","toggleFullscreen","useFullscreenToggle","menuOptions","l1Options","l2Options","activeKey","selectedL1","onSelect","onSelectL1","useLayoutMenu","flat","useMenuFlat","headerTools","useHeaderTools","settingsOpen","ref","searchOpen","title","computed","m","crumbs","_a","l","localeOptions","onLocale","key","renderUserIcon","name","color","h","Icon","userOptions","onUser","onClearCache","logout","clearClientCache","e","translateError","beginVoluntaryLogout","authApi","resetRouter","_openBlock","_createElementBlock","_hoisted_1","_createElementVNode","_hoisted_2","__props","_createBlock","_unref","NButton","_cache","$event","_createVNode","_hoisted_3","SmartLogo","_hoisted_4","_toDisplayString","NBreadcrumb","_Fragment","_renderList","c","i","NBreadcrumbItem","_hoisted_5","_hoisted_6","NMenu","_hoisted_7","NTooltip","_createTextVNode","NDropdown","tool","_resolveDynamicComponent","_normalizeClass","AppIcon","NoticeBell","NAvatar","_hoisted_8","SettingsDrawer","MenuSearch"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"AppHeader2.vue.js","sources":["../../src/layouts/AppHeader.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { computed, h, ref } from 'vue'\nimport { useRoute, useRouter } from 'vue-router'\nimport {\n NAvatar,\n NButton,\n NDropdown,\n NTooltip,\n NMenu,\n NBreadcrumb,\n NBreadcrumbItem,\n useMessage,\n type DropdownOption,\n} from 'naive-ui'\nimport { Icon } from '@iconify/vue'\nimport { useI18n } from 'vue-i18n'\nimport { useAppStore, type Locale } from '#/stores/app'\nimport { useUserStore } from '#/stores/user'\nimport { useAuthStore } from '#/stores/auth'\nimport { useLayoutMenu } from '#/composables/useLayoutMenu'\nimport { useMenuFlat } from '#/composables/useMenuFlat'\nimport { useSite } from '#/composables/useSite'\nimport { useFullscreenToggle } from '#/composables/useFullscreenToggle'\nimport { useHeaderTools } from '#/composables/useHeaderTools'\nimport { authApi } from '#/api'\nimport { clearClientCache } from '#/composables/clearClientCache'\nimport { beginVoluntaryLogout } from '#/composables/useRealtime'\nimport { resetRouter } from '#/router'\nimport { translateError } from '#/utils/error'\nimport SmartLogo from '#/components/SmartLogo.vue'\nimport AppIcon from '#/components/AppIcon.vue'\nimport SettingsDrawer from './SettingsDrawer.vue'\nimport MenuSearch from '#/components/MenuSearch.vue'\nimport NoticeBell from './NoticeBell.vue'\n\nwithDefaults(\n defineProps<{\n showCollapse?: boolean\n showBrand?: boolean\n topMenu?: 'full' | 'l1' | 'l2' | null\n }>(),\n { showCollapse: true, showBrand: false, topMenu: null },\n)\n\nconst app = useAppStore()\nconst { site } = useSite()\nconst user = useUserStore()\nconst auth = useAuthStore()\nconst route = useRoute()\nconst router = useRouter()\nconst message = useMessage()\nconst { t } = useI18n()\n// 自研而非 VueUse useFullscreen:后者在 iPadOS 上只探标准 API,把明明能全屏的设备判成不支持。\n// isSupported=false(如 iPhone)时整个按钮不渲染,不留点了没反应的按钮。\nconst {\n isSupported: fullscreenSupported,\n isFullscreen,\n toggle: toggleFullscreen,\n} = useFullscreenToggle()\nconst { menuOptions, l1Options, l2Options, activeKey, selectedL1, onSelect, onSelectL1 } =\n useLayoutMenu()\nconst flat = useMenuFlat()\n// 扩展模块登记的顶栏入口(registerHeaderTool),渲染在内置铃铛左侧。\nconst headerTools = useHeaderTools()\n\nconst settingsOpen = ref(false)\nconst searchOpen = ref(false)\n\nconst title = computed(() => {\n const m = route.meta.title as string | undefined\n if (!m) return ''\n return m.includes('.') ? t(m) : m\n})\nconst crumbs = computed(() => flat.value.find(l => l.path === route.path)?.breadcrumb ?? [])\n\n// 语言名按各自书写系统展示,不随当前 locale 翻译。\nconst localeOptions: DropdownOption[] = [\n { label: '简体中文', key: 'zh-CN' },\n { label: 'English', key: 'en-US' },\n]\nfunction onLocale(key: string) {\n app.setLocale(key as Locale)\n}\n\n// 下拉图标(用户菜单:个人中心 / 清除缓存 / 退出)。\n// color 用于危险项(退出)整行红字+红图标。\nconst renderUserIcon = (name: string, color?: string) => () =>\n h(Icon, { icon: name, width: 16, style: color ? { color } : undefined })\n\n// 下拉:个人中心 / 清除缓存 / 退出;五块能力进 /personal 二级壳(见 PersonalLayout)。\nconst userOptions = computed<DropdownOption[]>(() => [\n { label: t('app.personalCenter'), key: 'personal', icon: renderUserIcon('ph:user') },\n { label: t('app.clearCache'), key: 'clearCache', icon: renderUserIcon('ph:broom') },\n { type: 'divider', key: 'd1' },\n // 退出用危险色突出,避免与普通项同权。\n {\n label: t('app.logout'),\n key: 'logout',\n icon: renderUserIcon('ph:sign-out', 'var(--color-danger)'),\n props: { style: 'color: var(--color-danger)' },\n },\n])\nasync function onUser(key: string) {\n if (key === 'personal') router.push('/personal/profile')\n else if (key === 'clearCache') await onClearCache()\n else if (key === 'logout') await logout()\n}\nasync function onClearCache() {\n try {\n await clearClientCache()\n message.success(t('app.cacheCleared'))\n } catch (e) {\n message.error(translateError(e))\n }\n}\nasync function logout() {\n // 先断实时并标记自愿退出:logout API 会 Revoke 会话并推 force-logout,避免误弹「您已被强制下线」。\n await beginVoluntaryLogout()\n try {\n await authApi.logout()\n } catch (e) {\n message.error(translateError(e)) // 尽力而为,不阻断登出\n }\n resetRouter()\n auth.reset() // 内部会 clearTabs()\n user.clear()\n router.replace('/login')\n}\n</script>\n\n<template>\n <div class=\"bar\">\n <div class=\"left\">\n <n-button\n v-if=\"showCollapse\"\n quaternary\n circle\n :aria-label=\"t('app.collapse')\"\n @click=\"app.toggleCollapsed()\"\n >\n <Icon :icon=\"app.collapsed ? 'ph:list' : 'ph:sidebar-simple'\" :width=\"20\" />\n </n-button>\n <div v-if=\"showBrand\" class=\"brand\">\n <SmartLogo :size=\"26\" />\n <span class=\"brand-name mobile-hide\">{{ site.title }}</span>\n </div>\n <n-breadcrumb v-if=\"app.showBreadcrumb && crumbs.length\">\n <n-breadcrumb-item v-for=\"(c, i) in crumbs\" :key=\"i\">{{ c }}</n-breadcrumb-item>\n </n-breadcrumb>\n <span v-else class=\"title\">{{ title }}</span>\n </div>\n\n <div v-if=\"topMenu\" class=\"center\">\n <n-menu\n v-if=\"topMenu === 'full'\"\n mode=\"horizontal\"\n responsive\n :options=\"menuOptions\"\n :value=\"activeKey\"\n @update:value=\"onSelect\"\n />\n <n-menu\n v-else-if=\"topMenu === 'l1'\"\n mode=\"horizontal\"\n responsive\n :options=\"l1Options\"\n :value=\"selectedL1\"\n @update:value=\"onSelectL1\"\n />\n <n-menu\n v-else\n mode=\"horizontal\"\n responsive\n :options=\"l2Options\"\n :value=\"activeKey\"\n @update:value=\"onSelect\"\n />\n </div>\n\n <!-- mobile-hide:窄屏(<768px)藏起来的次要项。顶栏总宽 > 屏宽时右端会被 layout 的 overflow:hidden 裁掉,\n 而全站唯一的登出入口就在最右边的用户下拉里 —— 手机上不能因为一排图标而退不出登录。\n 搜索有 Ctrl+K 兜底、全屏在手机上无意义、语言与设置属低频(设置抽屉本就是宽屏调布局用的)。 -->\n <div class=\"right\">\n <!-- 所属租户,只读展示(stores/user.ts 的 tenantName 注释):不做切换交互,窄屏隐藏。 -->\n <span v-if=\"user.userInfo?.tenantName\" class=\"tenant-tag mobile-hide\">\n <Icon icon=\"ph:buildings\" :width=\"16\" class=\"tenant-tag-icon\" />\n <span class=\"tenant-tag-text\">{{ user.userInfo.tenantName }}</span>\n </span>\n\n <n-tooltip>\n <template #trigger>\n <n-button quaternary circle class=\"mobile-hide\" @click=\"searchOpen = true\">\n <Icon icon=\"ph:magnifying-glass\" :width=\"18\" />\n </n-button>\n </template>\n {{ t('app.search') }} (Ctrl+K)\n </n-tooltip>\n\n <n-tooltip v-if=\"fullscreenSupported\">\n <template #trigger>\n <n-button\n quaternary\n circle\n class=\"mobile-hide\"\n :aria-label=\"isFullscreen ? t('app.exitFullscreen') : t('app.fullscreen')\"\n @click=\"toggleFullscreen()\"\n >\n <Icon :icon=\"isFullscreen ? 'ph:arrows-in' : 'ph:arrows-out'\" :width=\"18\" />\n </n-button>\n </template>\n {{ isFullscreen ? t('app.exitFullscreen') : t('app.fullscreen') }}\n </n-tooltip>\n\n <n-tooltip>\n <template #trigger>\n <n-button quaternary circle @click=\"app.toggleDark()\">\n <Icon :icon=\"app.isDark ? 'ph:moon-stars' : 'ph:sun'\" :width=\"18\" />\n </n-button>\n </template>\n {{ app.isDark ? t('app.dark') : t('app.light') }}\n </n-tooltip>\n\n <n-dropdown :options=\"localeOptions\" @select=\"onLocale\">\n <n-button quaternary circle class=\"mobile-hide\" :aria-label=\"t('app.language')\">\n <Icon icon=\"ph:translate\" :width=\"18\" />\n </n-button>\n </n-dropdown>\n\n <n-tooltip>\n <template #trigger>\n <n-button quaternary circle class=\"mobile-hide\" @click=\"settingsOpen = true\">\n <Icon icon=\"ph:gear-six\" :width=\"18\" />\n </n-button>\n </template>\n {{ t('app.settings') }}\n </n-tooltip>\n\n <!-- 导航到应用选择页,而非下拉直切:应用一多下拉就难用,且\"设为默认\"只在选择页上。 -->\n <n-tooltip v-if=\"auth.modules.length > 1\">\n <template #trigger>\n <n-button\n quaternary\n circle\n :aria-label=\"t('app.switchModule')\"\n @click=\"router.push('/module')\"\n >\n <Icon icon=\"ph:squares-four\" :width=\"18\" />\n </n-button>\n </template>\n {{ t('app.switchModule') }}\n </n-tooltip>\n\n <!-- 扩展模块的入口:图标模式画成同款圆形按钮,组件模式整块交给它自己(自带角标/弹层时用) -->\n <template v-for=\"tool in headerTools\" :key=\"tool.key\">\n <component :is=\"tool.component\" v-if=\"tool.component\" />\n <n-tooltip v-else>\n <template #trigger>\n <n-button\n quaternary\n circle\n :class=\"{ 'mobile-hide': !tool.keepOnMobile }\"\n :aria-label=\"tool.label\"\n @click=\"tool.onClick()\"\n >\n <AppIcon :icon=\"tool.icon\" :size=\"18\" />\n </n-button>\n </template>\n {{ tool.label }}\n </n-tooltip>\n </template>\n\n <NoticeBell />\n\n <n-dropdown :options=\"userOptions\" @select=\"onUser\">\n <n-button quaternary :aria-label=\"t('app.profile')\">\n <!-- 有头像用头像(profile 页可传),没有回落原图标;头像来源见 stores/user.ts 的 avatar 注释 -->\n <n-avatar v-if=\"user.userInfo?.avatar\" round :size=\"22\" :src=\"user.userInfo.avatar\" />\n <Icon v-else icon=\"ph:user-circle\" :width=\"20\" />\n <span class=\"uname mobile-hide\">\n {{ user.userInfo?.name ?? user.userInfo?.account ?? '' }}\n </span>\n </n-button>\n </n-dropdown>\n </div>\n\n <SettingsDrawer v-model:show=\"settingsOpen\" />\n <MenuSearch v-model:show=\"searchOpen\" />\n </div>\n</template>\n\n<style scoped>\n.bar {\n height: 100%;\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 0 16px;\n}\n/* 可收缩(min-width:0 + overflow):右侧那组是刚需(含唯一的登出入口),要挤先挤左边的标题/面包屑。 */\n.left {\n display: flex;\n align-items: center;\n gap: 10px;\n min-width: 0;\n overflow: hidden;\n}\n.brand {\n display: flex;\n align-items: center;\n gap: 8px;\n color: var(--color-text-primary);\n font-weight: 600;\n flex-shrink: 0;\n}\n.brand-name {\n font-size: var(--font-size-md);\n}\n.title {\n font-size: var(--font-size-md);\n font-weight: 500;\n color: var(--color-text-primary);\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n.uname {\n margin-left: 6px;\n}\n.tenant-tag {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n margin-right: 6px;\n /* 跟\"超级管理员\"同色:n-button quaternary 的文字色取自 NaiveUI 主题的 textColor2 → --color-text-secondary */\n color: var(--color-text-secondary);\n}\n.tenant-tag-icon {\n display: block;\n flex-shrink: 0;\n}\n.tenant-tag-text {\n line-height: 1;\n}\n.center {\n flex: 1;\n min-width: 0;\n overflow: hidden;\n}\n.right {\n display: flex;\n align-items: center;\n gap: 6px;\n margin-left: auto;\n flex-shrink: 0;\n}\n\n/* 窄屏(断点与 layouts/default.vue 的 breakpointsTailwind.smaller('md') 一致):\n 只留暗色/应用切换/铃铛/用户下拉,其余隐藏,保证最右的登出入口不被裁掉。 */\n@media (max-width: 767px) {\n .bar {\n gap: 8px;\n padding: 0 8px;\n }\n .mobile-hide {\n display: none;\n }\n}\n</style>\n"],"names":["app","useAppStore","site","useSite","user","useUserStore","auth","useAuthStore","route","useRoute","router","useRouter","message","useMessage","t","useI18n","fullscreenSupported","isFullscreen","toggleFullscreen","useFullscreenToggle","menuOptions","l1Options","l2Options","activeKey","selectedL1","onSelect","onSelectL1","useLayoutMenu","flat","useMenuFlat","headerTools","useHeaderTools","settingsOpen","ref","searchOpen","title","computed","m","crumbs","_a","localeOptions","onLocale","key","renderUserIcon","name","color","h","Icon","userOptions","onUser","onClearCache","logout","clearClientCache","e","translateError","beginVoluntaryLogout","authApi","resetRouter","_openBlock","_createElementBlock","_hoisted_1","_createElementVNode","_hoisted_2","__props","_createBlock","_unref","NButton","_cache","$event","_createVNode","_hoisted_3","SmartLogo","_hoisted_4","_toDisplayString","NBreadcrumb","_Fragment","_renderList","c","i","NBreadcrumbItem","_hoisted_5","_hoisted_6","NMenu","_hoisted_7","_hoisted_8","_hoisted_9","NTooltip","_createTextVNode","NDropdown","tool","_resolveDynamicComponent","_normalizeClass","AppIcon","NoticeBell","NAvatar","_hoisted_10","SettingsDrawer","MenuSearch"],"mappings":"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"}
|
package/dist/lib/runtime.js
CHANGED
package/dist/locales/en-US.d.ts
CHANGED
|
@@ -1372,6 +1372,13 @@ declare const _default: {
|
|
|
1372
1372
|
session: {
|
|
1373
1373
|
notFound: string;
|
|
1374
1374
|
};
|
|
1375
|
+
tenant: {
|
|
1376
|
+
notFound: string;
|
|
1377
|
+
codeExists: string;
|
|
1378
|
+
isolationModeNotSupported: string;
|
|
1379
|
+
protected: string;
|
|
1380
|
+
platformAdminRequired: string;
|
|
1381
|
+
};
|
|
1375
1382
|
dict: {
|
|
1376
1383
|
typeNotFound: string;
|
|
1377
1384
|
typeCodeExists: string;
|
|
@@ -1510,5 +1517,35 @@ declare const _default: {
|
|
|
1510
1517
|
logOp: {
|
|
1511
1518
|
fileName: string;
|
|
1512
1519
|
};
|
|
1520
|
+
tenant: {
|
|
1521
|
+
title: string;
|
|
1522
|
+
code: string;
|
|
1523
|
+
name: string;
|
|
1524
|
+
codePlaceholder: string;
|
|
1525
|
+
contactName: string;
|
|
1526
|
+
contactPhone: string;
|
|
1527
|
+
expireTime: string;
|
|
1528
|
+
isolationMode: string;
|
|
1529
|
+
isolationModeShared: string;
|
|
1530
|
+
isolationModeSharedDesc: string;
|
|
1531
|
+
isolationModeStandalone: string;
|
|
1532
|
+
isolationModeStandaloneDesc: string;
|
|
1533
|
+
isolationModePhase2: string;
|
|
1534
|
+
initialAdmin: string;
|
|
1535
|
+
adminAccount: string;
|
|
1536
|
+
adminAccountPlaceholder: string;
|
|
1537
|
+
adminPassword: string;
|
|
1538
|
+
adminPasswordPlaceholder: string;
|
|
1539
|
+
remark: string;
|
|
1540
|
+
codeRequired: string;
|
|
1541
|
+
nameRequired: string;
|
|
1542
|
+
adminAccountRequired: string;
|
|
1543
|
+
adminPasswordRequired: string;
|
|
1544
|
+
addTitle: string;
|
|
1545
|
+
editTitle: string;
|
|
1546
|
+
deleteConfirm: string;
|
|
1547
|
+
saved: string;
|
|
1548
|
+
deleted: string;
|
|
1549
|
+
};
|
|
1513
1550
|
};
|
|
1514
1551
|
export default _default;
|
package/dist/locales/en-US.js
CHANGED
|
@@ -1378,6 +1378,13 @@ const e = {
|
|
|
1378
1378
|
invalidParent: "Invalid parent menu (cannot be itself or its descendant)"
|
|
1379
1379
|
},
|
|
1380
1380
|
session: { notFound: "Session not found or already signed out" },
|
|
1381
|
+
tenant: {
|
|
1382
|
+
notFound: "Tenant not found",
|
|
1383
|
+
codeExists: "Tenant code already exists",
|
|
1384
|
+
isolationModeNotSupported: "This isolation mode is not supported yet",
|
|
1385
|
+
protected: "Default tenant is protected from this operation",
|
|
1386
|
+
platformAdminRequired: "This operation requires platform administrator privileges"
|
|
1387
|
+
},
|
|
1381
1388
|
dict: {
|
|
1382
1389
|
typeNotFound: "Dict type not found",
|
|
1383
1390
|
typeCodeExists: "Dict type code exists",
|
|
@@ -1512,6 +1519,36 @@ const e = {
|
|
|
1512
1519
|
},
|
|
1513
1520
|
logOp: {
|
|
1514
1521
|
fileName: "op-logs.xlsx"
|
|
1522
|
+
},
|
|
1523
|
+
tenant: {
|
|
1524
|
+
title: "Tenants",
|
|
1525
|
+
code: "Tenant Code",
|
|
1526
|
+
name: "Tenant Name",
|
|
1527
|
+
codePlaceholder: "e.g. acme, cannot be changed after creation",
|
|
1528
|
+
contactName: "Contact",
|
|
1529
|
+
contactPhone: "Contact Phone",
|
|
1530
|
+
expireTime: "Expires At",
|
|
1531
|
+
isolationMode: "Isolation Mode",
|
|
1532
|
+
isolationModeShared: "Shared database",
|
|
1533
|
+
isolationModeSharedDesc: "Shares the main database with other tenants, isolated by filtering on TenantId. The only option available in phase 1.",
|
|
1534
|
+
isolationModeStandalone: "Standalone database",
|
|
1535
|
+
isolationModeStandaloneDesc: "This tenant's business data is physically isolated to its own connection string; org structure, users and permissions still live in the shared database (hybrid mode).",
|
|
1536
|
+
isolationModePhase2: "Coming in phase 2",
|
|
1537
|
+
initialAdmin: "Initial Administrator",
|
|
1538
|
+
adminAccount: "Admin Account",
|
|
1539
|
+
adminAccountPlaceholder: "This tenant's first login account",
|
|
1540
|
+
adminPassword: "Admin Password",
|
|
1541
|
+
adminPasswordPlaceholder: "Must be changed on first login",
|
|
1542
|
+
remark: "Remark",
|
|
1543
|
+
codeRequired: "Please enter the tenant code",
|
|
1544
|
+
nameRequired: "Please enter the tenant name",
|
|
1545
|
+
adminAccountRequired: "Please enter the admin account",
|
|
1546
|
+
adminPasswordRequired: "Please enter the admin password",
|
|
1547
|
+
addTitle: "Add Tenant",
|
|
1548
|
+
editTitle: "Edit Tenant",
|
|
1549
|
+
deleteConfirm: 'Delete tenant "{name}"?',
|
|
1550
|
+
saved: "Saved",
|
|
1551
|
+
deleted: "Deleted"
|
|
1515
1552
|
}
|
|
1516
1553
|
};
|
|
1517
1554
|
export {
|