diff --git a/.gitignore b/.gitignore index 89d6cb9cb..5c1422735 100644 --- a/.gitignore +++ b/.gitignore @@ -4,7 +4,7 @@ dist dist-ssr coverage *.local -**/*/.vitepress/cache/deps +**/.vitepress/cache .cache .turbo .stylelintcache diff --git a/apps/web-antd/src/views/_essential/fallback/internal-error.vue b/apps/web-antd/src/views/_essential/fallback/internal-error.vue index bf581764e..7154e725e 100644 --- a/apps/web-antd/src/views/_essential/fallback/internal-error.vue +++ b/apps/web-antd/src/views/_essential/fallback/internal-error.vue @@ -3,5 +3,5 @@ import { Fallback } from '@vben/common-ui'; diff --git a/internal/lint-configs/eslint-config/package.json b/internal/lint-configs/eslint-config/package.json index a7554c5c9..f12aa7ada 100644 --- a/internal/lint-configs/eslint-config/package.json +++ b/internal/lint-configs/eslint-config/package.json @@ -33,7 +33,7 @@ "eslint-plugin-command": "^0.2.3" }, "devDependencies": { - "@eslint/js": "^9.4.0", + "@eslint/js": "^9.5.0", "@types/eslint": "^8.56.10", "@typescript-eslint/eslint-plugin": "^7.13.0", "@typescript-eslint/parser": "^7.13.0", @@ -41,18 +41,18 @@ "eslint-config-prettier": "^9.1.0", "eslint-plugin-eslint-comments": "^3.2.0", "eslint-plugin-i": "^2.29.1", - "eslint-plugin-jsdoc": "^48.2.11", + "eslint-plugin-jsdoc": "^48.2.12", "eslint-plugin-jsonc": "^2.16.0", "eslint-plugin-n": "^17.9.0", "eslint-plugin-no-only-tests": "^3.1.0", "eslint-plugin-perfectionist": "^2.11.0", "eslint-plugin-prettier": "^5.1.3", "eslint-plugin-regexp": "^2.6.0", - "eslint-plugin-unicorn": "^53.0.0", + "eslint-plugin-unicorn": "^54.0.0", "eslint-plugin-unused-imports": "^4.0.0", "eslint-plugin-vitest": "^0.5.4", "eslint-plugin-vue": "^9.26.0", - "globals": "^15.4.0", + "globals": "^15.5.0", "jsonc-eslint-parser": "^2.4.0", "vue-eslint-parser": "^9.4.3" } diff --git a/internal/tsconfig/package.json b/internal/tsconfig/package.json index 8cf72d835..658654717 100644 --- a/internal/tsconfig/package.json +++ b/internal/tsconfig/package.json @@ -20,6 +20,6 @@ ], "dependencies": { "@vben/types": "workspace:*", - "vite": "6.0.0-alpha.17" + "vite": "5.3.0" } } diff --git a/internal/vite-config/package.json b/internal/vite-config/package.json index 177a5b6ab..25d7e7b86 100644 --- a/internal/vite-config/package.json +++ b/internal/vite-config/package.json @@ -48,7 +48,7 @@ "rollup-plugin-visualizer": "^5.12.0", "sass": "^1.77.5", "unplugin-turbo-console": "^1.8.6", - "vite": "6.0.0-alpha.17", + "vite": "5.3.0", "vite-plugin-compression": "^0.5.1", "vite-plugin-dts": "^3.9.1", "vite-plugin-html": "^3.2.2", diff --git a/package.json b/package.json index 13b806be1..0a27ecc86 100644 --- a/package.json +++ b/package.json @@ -65,10 +65,10 @@ "jsdom": "^24.1.0", "rimraf": "^5.0.7", "taze": "^0.13.8", - "turbo": "^2.0.3", + "turbo": "^2.0.4", "typescript": "^5.4.5", "unbuild": "^2.0.0", - "vite": "6.0.0-alpha.17", + "vite": "5.3.0", "vitest": "^2.0.0-beta.3", "vue-tsc": "^2.0.21" }, diff --git a/packages/@core/forward/preferences/src/config.ts b/packages/@core/forward/preferences/src/config.ts index 85daed918..cbf379647 100644 --- a/packages/@core/forward/preferences/src/config.ts +++ b/packages/@core/forward/preferences/src/config.ts @@ -45,7 +45,12 @@ const defaultPreferences: Preferences = { split: true, styleType: 'rounded', }, - shortcutKeys: { enable: true }, + shortcutKeys: { + enable: true, + globalLogout: true, + globalPreferences: true, + globalSearch: true, + }, sidebar: { collapsed: false, collapsedShowTitle: true, diff --git a/packages/@core/forward/preferences/src/types.ts b/packages/@core/forward/preferences/src/types.ts index 2a577a77c..192da9d29 100644 --- a/packages/@core/forward/preferences/src/types.ts +++ b/packages/@core/forward/preferences/src/types.ts @@ -112,6 +112,12 @@ interface SidebarPreferences { interface ShortcutKeyPreferences { /** 是否启用快捷键-全局 */ enable: boolean; + /** 是否启用全局注销快捷键 */ + globalLogout: boolean; + /** 是否启用全局偏好设置快捷键 */ + globalPreferences: boolean; + /** 是否启用全局搜索快捷键 */ + globalSearch: boolean; } interface TabbarPreferences { diff --git a/packages/@core/forward/preferences/src/use-preferences.ts b/packages/@core/forward/preferences/src/use-preferences.ts index 6c20dae42..d1f5b8ecc 100644 --- a/packages/@core/forward/preferences/src/use-preferences.ts +++ b/packages/@core/forward/preferences/src/use-preferences.ts @@ -16,6 +16,8 @@ function usePreferences() { const appPreferences = computed(() => preferences.app); + const shortcutKeysPreferences = computed(() => preferences.shortcutKeys); + /** * @zh_CN 判断是否为暗黑模式 * @param preferences - 当前偏好设置对象,它的主题值将被用来判断是否为暗黑模式。 @@ -107,11 +109,38 @@ function usePreferences() { return appPreferences.value.authPageLayout === 'panel-center'; }); + /** + * @zh_CN 是否启用全局搜索快捷键 + */ + const globalSearchShortcutKey = computed(() => { + const { enable, globalSearch } = shortcutKeysPreferences.value; + return enable && globalSearch; + }); + + /** + * @zh_CN 是否启用全局注销快捷键 + */ + const globalLogoutShortcutKey = computed(() => { + const { enable, globalLogout } = shortcutKeysPreferences.value; + return enable && globalLogout; + }); + + /** + * @zh_CN 是否启用全局偏好设置快捷键 + */ + const globalPreferencesShortcutKey = computed(() => { + const { enable, globalPreferences } = shortcutKeysPreferences.value; + return enable && globalPreferences; + }); + return { authPanelCenter, authPanelLeft, authPanelRight, diffPreference, + globalLogoutShortcutKey, + globalPreferencesShortcutKey, + globalSearchShortcutKey, isDark, isFullContent, isHeaderNav, diff --git a/packages/@core/shared/toolkit/package.json b/packages/@core/shared/toolkit/package.json index 5ca3a0987..6936196c5 100644 --- a/packages/@core/shared/toolkit/package.json +++ b/packages/@core/shared/toolkit/package.json @@ -40,7 +40,7 @@ }, "dependencies": { "@ctrl/tinycolor": "4.1.0", - "@vue/shared": "^3.4.27", + "@vue/shared": "^3.4.29", "dayjs": "^1.11.11", "defu": "^6.1.4", "nprogress": "^0.2.0" diff --git a/packages/business/common-ui/src/fallback/fallback.ts b/packages/business/common-ui/src/fallback/fallback.ts index 44dd261aa..b82845f7a 100644 --- a/packages/business/common-ui/src/fallback/fallback.ts +++ b/packages/business/common-ui/src/fallback/fallback.ts @@ -13,16 +13,10 @@ interface FallbackProps { * @default pageNotFoundSvg */ image?: string; - - /** - * @zh_CN 是否显示返回首页按钮 - * @default true - */ - showBack?: boolean; /** * @zh_CN 内置类型 */ - status?: '403' | '404' | '500' | 'offline'; + status?: '403' | '404' | '500' | 'hello' | 'offline'; /** * @zh_CN 页面提示语 */ diff --git a/packages/business/common-ui/src/fallback/fallback.vue b/packages/business/common-ui/src/fallback/fallback.vue index 9cf54f804..ee79f7975 100644 --- a/packages/business/common-ui/src/fallback/fallback.vue +++ b/packages/business/common-ui/src/fallback/fallback.vue @@ -5,7 +5,7 @@ import { computed, defineAsyncComponent } from 'vue'; import { useRouter } from 'vue-router'; import { $t } from '@vben/locales'; -import { IcRoundArrowBackIosNew } from '@vben-core/iconify'; +import { IcRoundArrowBackIosNew, IcRoundRefresh } from '@vben-core/iconify'; import { VbenButton } from '@vben-core/shadcn-ui'; interface Props extends FallbackProps {} @@ -19,13 +19,14 @@ const props = withDefaults(defineProps(), { homePath: '/', image: '', showBack: true, - status: '404', + status: 'hello', title: '', }); const Icon403 = defineAsyncComponent(() => import('./icons/icon-403.vue')); const Icon404 = defineAsyncComponent(() => import('./icons/icon-404.vue')); const Icon500 = defineAsyncComponent(() => import('./icons/icon-500.vue')); +const IconHello = defineAsyncComponent(() => import('./icons/icon-hello.vue')); const IconOffline = defineAsyncComponent( () => import('./icons/icon-offline.vue'), ); @@ -39,6 +40,9 @@ const titleText = computed(() => { case '403': { return $t('fallback.forbidden'); } + case '404': { + return $t('fallback.page-not-found'); + } case '500': { return $t('fallback.internal-error'); } @@ -46,7 +50,7 @@ const titleText = computed(() => { return $t('fallback.offline-error'); } default: { - return $t('fallback.page-not-found'); + return ''; } } }); @@ -59,6 +63,9 @@ const descText = computed(() => { case '403': { return $t('fallback.forbidden-desc'); } + case '404': { + return $t('fallback.page-not-found-desc'); + } case '500': { return $t('fallback.internal-error-desc'); } @@ -66,7 +73,7 @@ const descText = computed(() => { return $t('fallback.offline-error-desc'); } default: { - return $t('fallback.page-not-found-desc'); + return ''; } } }); @@ -76,47 +83,76 @@ const fallbackIcon = computed(() => { case '403': { return Icon403; } + case '404': { + return Icon404; + } case '500': { return Icon500; } case 'offline': { return IconOffline; } + case 'hello': { + return IconHello; + } default: { - return Icon404; + return null; } } }); +const showBack = computed(() => { + return ['403', '404'].includes(props.status); +}); + +const showRefresh = computed(() => { + return ['500', 'offline'].includes(props.status); +}); + const { push } = useRouter(); // 返回首页 function back() { push(props.homePath); } + +function refresh() { + location.reload(); +} diff --git a/packages/business/common-ui/src/fallback/icons/icon-hello.vue b/packages/business/common-ui/src/fallback/icons/icon-hello.vue new file mode 100644 index 000000000..ee91c4f7e --- /dev/null +++ b/packages/business/common-ui/src/fallback/icons/icon-hello.vue @@ -0,0 +1,262 @@ + diff --git a/packages/business/common-ui/src/preferences/blocks/general/animation.vue b/packages/business/common-ui/src/preferences/blocks/general/animation.vue index bb4def97e..4c334f257 100644 --- a/packages/business/common-ui/src/preferences/blocks/general/animation.vue +++ b/packages/business/common-ui/src/preferences/blocks/general/animation.vue @@ -23,10 +23,10 @@ function handleClick(value: string) { diff --git a/packages/business/common-ui/src/preferences/blocks/layout/sidebar.vue b/packages/business/common-ui/src/preferences/blocks/layout/sidebar.vue index d26f502d3..59c6af7fb 100644 --- a/packages/business/common-ui/src/preferences/blocks/layout/sidebar.vue +++ b/packages/business/common-ui/src/preferences/blocks/layout/sidebar.vue @@ -18,15 +18,15 @@ const sidebarCollapsed = defineModel('sidebarCollapsed'); diff --git a/packages/business/common-ui/src/preferences/blocks/layout/tabbar.vue b/packages/business/common-ui/src/preferences/blocks/layout/tabbar.vue index 04bb8acd4..2bf28a24c 100644 --- a/packages/business/common-ui/src/preferences/blocks/layout/tabbar.vue +++ b/packages/business/common-ui/src/preferences/blocks/layout/tabbar.vue @@ -15,12 +15,12 @@ const tabbarShowIcon = defineModel('tabbarShowIcon'); diff --git a/packages/business/common-ui/src/preferences/blocks/shortcut-keys/global.vue b/packages/business/common-ui/src/preferences/blocks/shortcut-keys/global.vue new file mode 100644 index 000000000..ab3bf9a18 --- /dev/null +++ b/packages/business/common-ui/src/preferences/blocks/shortcut-keys/global.vue @@ -0,0 +1,42 @@ + + + diff --git a/packages/business/common-ui/src/preferences/blocks/switch-item.vue b/packages/business/common-ui/src/preferences/blocks/switch-item.vue index dc2d70cc9..bade87261 100644 --- a/packages/business/common-ui/src/preferences/blocks/switch-item.vue +++ b/packages/business/common-ui/src/preferences/blocks/switch-item.vue @@ -39,6 +39,9 @@ function handleClick() { + + + diff --git a/packages/business/common-ui/src/preferences/blocks/theme/color-mode.vue b/packages/business/common-ui/src/preferences/blocks/theme/color-mode.vue index db7cc5a03..c74aff36e 100644 --- a/packages/business/common-ui/src/preferences/blocks/theme/color-mode.vue +++ b/packages/business/common-ui/src/preferences/blocks/theme/color-mode.vue @@ -18,9 +18,9 @@ const appColorGrayMode = defineModel('appColorGrayMode', { diff --git a/packages/business/common-ui/src/preferences/blocks/theme/theme.vue b/packages/business/common-ui/src/preferences/blocks/theme/theme.vue index ad3d0ee24..50b04fc1a 100644 --- a/packages/business/common-ui/src/preferences/blocks/theme/theme.vue +++ b/packages/business/common-ui/src/preferences/blocks/theme/theme.vue @@ -39,13 +39,13 @@ function activeClass(theme: string): string[] { function nameView(name: string) { switch (name) { case 'light': { - return $t('preference.light'); + return $t('preferences.light'); } case 'dark': { - return $t('preference.dark'); + return $t('preferences.dark'); } case 'auto': { - return $t('preference.follow-system'); + return $t('preferences.follow-system'); } } } @@ -75,7 +75,7 @@ function nameView(name: string) { :disabled="modelValue !== 'light'" class="mt-6" > - {{ $t('preference.dark-menu') }} + {{ $t('preferences.dark-menu') }} diff --git a/packages/business/common-ui/src/preferences/preferences-widget.vue b/packages/business/common-ui/src/preferences/preferences-widget.vue index 72eb94475..7cdf330a0 100644 --- a/packages/business/common-ui/src/preferences/preferences-widget.vue +++ b/packages/business/common-ui/src/preferences/preferences-widget.vue @@ -32,6 +32,11 @@ import Preferences from './preferences.vue'; :navigation-split="preferences.navigation.split" :navigation-style-type="preferences.navigation.styleType" :shortcut-keys-enable="preferences.shortcutKeys.enable" + :shortcut-keys-global-logout="preferences.shortcutKeys.globalLogout" + :shortcut-keys-global-preferences=" + preferences.shortcutKeys.globalPreferences + " + :shortcut-keys-global-search="preferences.shortcutKeys.globalSearch" :sidebar-collapsed="preferences.sidebar.collapsed" :sidebar-collapsed-show-title="preferences.sidebar.collapsedShowTitle" :sidebar-enable="preferences.sidebar.enable" @@ -103,6 +108,15 @@ import Preferences from './preferences.vue'; @update:shortcut-keys-enable=" (val) => updatePreferences({ shortcutKeys: { enable: val } }) " + @update:shortcut-keys-global-logout=" + (val) => updatePreferences({ shortcutKeys: { globalLogout: val } }) + " + @update:shortcut-keys-global-preferences=" + (val) => updatePreferences({ shortcutKeys: { globalPreferences: val } }) + " + @update:shortcut-keys-global-search=" + (val) => updatePreferences({ shortcutKeys: { globalSearch: val } }) + " @update:sidebar-collapsed=" (val) => updatePreferences({ sidebar: { collapsed: val } }) " diff --git a/packages/business/common-ui/src/preferences/preferences.vue b/packages/business/common-ui/src/preferences/preferences.vue index df2882ea2..f9962315d 100644 --- a/packages/business/common-ui/src/preferences/preferences.vue +++ b/packages/business/common-ui/src/preferences/preferences.vue @@ -39,6 +39,7 @@ import { Content, Footer, General, + GlobalShortcutKeys, Header, Layout, Navigation, @@ -101,6 +102,15 @@ const footerEnable = defineModel('footerEnable'); const footerFixed = defineModel('footerFixed'); const shortcutKeysEnable = defineModel('shortcutKeysEnable'); +const shortcutKeysGlobalSearch = defineModel( + 'shortcutKeysGlobalSearch', +); +const shortcutKeysGlobalLogout = defineModel( + 'shortcutKeysGlobalLogout', +); +const shortcutKeysGlobalPreferences = defineModel( + 'shortcutKeysGlobalPreferences', +); const { diffPreference, @@ -116,21 +126,21 @@ const { copy } = useClipboard(); const tabs = computed((): SegmentedItem[] => { return [ { - label: $t('preference.appearance'), + label: $t('preferences.appearance'), value: 'appearance', }, { - label: $t('preference.layout'), + label: $t('preferences.layout'), value: 'layout', }, { - label: $t('preference.general'), + label: $t('preferences.general'), value: 'general', }, - // { - // label: $t('preference.shortcut-key'), - // value: 'shortcutKey', - // }, + { + label: $t('preferences.shortcut-keys.title'), + value: 'shortcutKey', + }, ]; }); @@ -148,7 +158,7 @@ const { openPreferences } = useOpenPreferences(); async function handleCopy() { await copy(JSON.stringify(diffPreference.value, null, 2)); - toast($t('preference.copy-success')); + toast($t('preferences.copy-success')); } function handleReset() { @@ -156,7 +166,7 @@ function handleReset() { return; } resetPreferences(); - toast($t('preference.reset-success')); + toast($t('preferences.reset-success')); } @@ -164,8 +174,8 @@ function handleReset() {
diff --git a/packages/business/common-ui/src/preferences/trigger.vue b/packages/business/common-ui/src/preferences/trigger.vue index 5db5b64d9..ca82bc932 100644 --- a/packages/business/common-ui/src/preferences/trigger.vue +++ b/packages/business/common-ui/src/preferences/trigger.vue @@ -11,7 +11,7 @@ defineOptions({