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,