|
@@ -6,7 +6,7 @@ import type { AnyFunction } from '@vben/types';
|
|
|
import { computed, useTemplateRef, watch } from 'vue';
|
|
import { computed, useTemplateRef, watch } from 'vue';
|
|
|
|
|
|
|
|
import { useHoverToggle } from '@vben/hooks';
|
|
import { useHoverToggle } from '@vben/hooks';
|
|
|
-import { LockKeyhole, LogOut } from '@vben/icons';
|
|
|
|
|
|
|
+import { LockKeyhole, LogOut, Settings } from '@vben/icons';
|
|
|
import { $t } from '@vben/locales';
|
|
import { $t } from '@vben/locales';
|
|
|
import { preferences, usePreferences } from '@vben/preferences';
|
|
import { preferences, usePreferences } from '@vben/preferences';
|
|
|
import { useAccessStore } from '@vben/stores';
|
|
import { useAccessStore } from '@vben/stores';
|
|
@@ -29,6 +29,7 @@ import {
|
|
|
import { useMagicKeys, whenever } from '@vueuse/core';
|
|
import { useMagicKeys, whenever } from '@vueuse/core';
|
|
|
|
|
|
|
|
import { LockScreenModal } from '../lock-screen';
|
|
import { LockScreenModal } from '../lock-screen';
|
|
|
|
|
+import { Preferences } from '../preferences';
|
|
|
|
|
|
|
|
interface Props {
|
|
interface Props {
|
|
|
/**
|
|
/**
|
|
@@ -82,10 +83,13 @@ const props = withDefaults(defineProps<Props>(), {
|
|
|
hoverDelay: 500,
|
|
hoverDelay: 500,
|
|
|
});
|
|
});
|
|
|
|
|
|
|
|
-const emit = defineEmits<{ logout: [] }>();
|
|
|
|
|
|
|
+const emit = defineEmits<{ clearPreferencesAndLogout: []; logout: [] }>();
|
|
|
|
|
|
|
|
-const { globalLockScreenShortcutKey, globalLogoutShortcutKey } =
|
|
|
|
|
- usePreferences();
|
|
|
|
|
|
|
+const {
|
|
|
|
|
+ globalLockScreenShortcutKey,
|
|
|
|
|
+ globalLogoutShortcutKey,
|
|
|
|
|
+ preferencesButtonPosition,
|
|
|
|
|
+} = usePreferences();
|
|
|
const accessStore = useAccessStore();
|
|
const accessStore = useAccessStore();
|
|
|
const [LockModal, lockModalApi] = useVbenModal({
|
|
const [LockModal, lockModalApi] = useVbenModal({
|
|
|
connectedComponent: LockScreenModal,
|
|
connectedComponent: LockScreenModal,
|
|
@@ -98,6 +102,7 @@ const [LogoutModal, logoutModalApi] = useVbenModal({
|
|
|
|
|
|
|
|
const refTrigger = useTemplateRef('refTrigger');
|
|
const refTrigger = useTemplateRef('refTrigger');
|
|
|
const refContent = useTemplateRef('refContent');
|
|
const refContent = useTemplateRef('refContent');
|
|
|
|
|
+const refPreferences = useTemplateRef('refPreferences');
|
|
|
const [openPopover, hoverWatcher] = useHoverToggle(
|
|
const [openPopover, hoverWatcher] = useHoverToggle(
|
|
|
[refTrigger, refContent],
|
|
[refTrigger, refContent],
|
|
|
() => props.hoverDelay,
|
|
() => props.hoverDelay,
|
|
@@ -151,6 +156,11 @@ function handleSubmitLogout() {
|
|
|
logoutModalApi.close();
|
|
logoutModalApi.close();
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+// 设置 - 打开偏好设置抽屉
|
|
|
|
|
+function handleOpenSettings() {
|
|
|
|
|
+ refPreferences.value?.open();
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
if (enableShortcutKey.value) {
|
|
if (enableShortcutKey.value) {
|
|
|
const keys = useMagicKeys();
|
|
const keys = useMagicKeys();
|
|
|
const logoutKey = keys['Alt+KeyQ'];
|
|
const logoutKey = keys['Alt+KeyQ'];
|
|
@@ -195,6 +205,13 @@ if (enableShortcutKey.value) {
|
|
|
{{ $t('ui.widgets.logoutTip') }}
|
|
{{ $t('ui.widgets.logoutTip') }}
|
|
|
</LogoutModal>
|
|
</LogoutModal>
|
|
|
|
|
|
|
|
|
|
+ <Preferences
|
|
|
|
|
+ v-if="preferencesButtonPosition.userDropdown"
|
|
|
|
|
+ ref="refPreferences"
|
|
|
|
|
+ :show-button="false"
|
|
|
|
|
+ @clear-preferences-and-logout="emit('clearPreferencesAndLogout')"
|
|
|
|
|
+ />
|
|
|
|
|
+
|
|
|
<DropdownMenu v-model:open="openPopover">
|
|
<DropdownMenu v-model:open="openPopover">
|
|
|
<DropdownMenuTrigger ref="refTrigger" :disabled="props.trigger === 'hover'">
|
|
<DropdownMenuTrigger ref="refTrigger" :disabled="props.trigger === 'hover'">
|
|
|
<div class="mr-2 ml-1 cursor-pointer rounded-full p-1.5 hover:bg-accent">
|
|
<div class="mr-2 ml-1 cursor-pointer rounded-full p-1.5 hover:bg-accent">
|
|
@@ -241,6 +258,14 @@ if (enableShortcutKey.value) {
|
|
|
{{ menu.text }}
|
|
{{ menu.text }}
|
|
|
</DropdownMenuItem>
|
|
</DropdownMenuItem>
|
|
|
<DropdownMenuSeparator />
|
|
<DropdownMenuSeparator />
|
|
|
|
|
+ <DropdownMenuItem
|
|
|
|
|
+ v-if="preferencesButtonPosition.userDropdown"
|
|
|
|
|
+ class="mx-1 flex cursor-pointer items-center rounded-sm py-1 leading-8"
|
|
|
|
|
+ @click="handleOpenSettings"
|
|
|
|
|
+ >
|
|
|
|
|
+ <Settings class="mr-2 size-4" />
|
|
|
|
|
+ {{ $t('preferences.title') }}
|
|
|
|
|
+ </DropdownMenuItem>
|
|
|
<DropdownMenuItem
|
|
<DropdownMenuItem
|
|
|
v-if="preferences.widget.lockScreen"
|
|
v-if="preferences.widget.lockScreen"
|
|
|
class="mx-1 flex cursor-pointer items-center rounded-sm py-1 leading-8"
|
|
class="mx-1 flex cursor-pointer items-center rounded-sm py-1 leading-8"
|