diff --git a/web/src/lib/components/asset-viewer/asset-viewer.svelte b/web/src/lib/components/asset-viewer/asset-viewer.svelte index 2a75ca4e83..cf1ad4be5a 100644 --- a/web/src/lib/components/asset-viewer/asset-viewer.svelte +++ b/web/src/lib/components/asset-viewer/asset-viewer.svelte @@ -396,7 +396,7 @@ ocrManager.hasOcrData, ); - const { Tag } = $derived(getAssetActions($t, asset)); + const { Tag, TagPeople } = $derived(getAssetActions($t, asset)); const showDetailPanel = $derived( asset.hasMetadata && $slideshowState === SlideshowState.None && @@ -405,7 +405,7 @@ ); - + diff --git a/web/src/lib/modals/ShortcutsModal.svelte b/web/src/lib/modals/ShortcutsModal.svelte index c233548878..56c666a17a 100644 --- a/web/src/lib/modals/ShortcutsModal.svelte +++ b/web/src/lib/modals/ShortcutsModal.svelte @@ -40,6 +40,7 @@ { key: ['s'], action: $t('stack_selected_photos') }, { key: ['l'], action: $t('add_to_album') }, { key: ['t'], action: $t('tag_assets') }, + { key: ['p'], action: $t('tag_people') }, { key: ['⇧', 'a'], action: $t('archive_or_unarchive_photo') }, { key: ['⇧', 'd'], action: $t('download') }, { key: ['Space'], action: $t('play_or_pause_video') }, diff --git a/web/src/lib/services/asset.service.ts b/web/src/lib/services/asset.service.ts index 530bbc70f1..5d7ae07684 100644 --- a/web/src/lib/services/asset.service.ts +++ b/web/src/lib/services/asset.service.ts @@ -5,6 +5,7 @@ import { eventManager } from '$lib/managers/event-manager.svelte'; import AssetAddToAlbumModal from '$lib/modals/AssetAddToAlbumModal.svelte'; import AssetTagModal from '$lib/modals/AssetTagModal.svelte'; import SharedLinkCreateModal from '$lib/modals/SharedLinkCreateModal.svelte'; +import { isFaceEditMode } from '$lib/stores/face-edit.svelte'; import { user as authUser, preferences } from '$lib/stores/user.store'; import type { AssetControlContext } from '$lib/types'; import { getSharedLink, sleep } from '$lib/utils'; @@ -31,6 +32,7 @@ import { mdiDatabaseRefreshOutline, mdiDownload, mdiDownloadBox, + mdiFaceRecognition, mdiHeadSyncOutline, mdiHeart, mdiHeartOutline, @@ -223,6 +225,17 @@ export const getAssetActions = ($t: MessageFormatter, asset: AssetResponseDto) = shortcuts: { key: 't' }, }; + const TagPeople: ActionItem = { + title: $t('tag_people'), + icon: mdiFaceRecognition, + type: $t('assets'), + $if: () => isOwner && asset.type === AssetTypeEnum.Image && !asset.isTrashed, + onAction: () => { + isFaceEditMode.value = !isFaceEditMode.value; + }, + shortcuts: { key: 'p' }, + }; + const Edit: ActionItem = { title: $t('editor'), icon: mdiTune, @@ -279,6 +292,7 @@ export const getAssetActions = ($t: MessageFormatter, asset: AssetResponseDto) = ZoomOut, Copy, Tag, + TagPeople, Edit, RefreshFacesJob, RefreshMetadataJob,