Yaros 2025-12-10 18:20:45 +07:00 committed by GitHub
commit 670d15e401
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 20 additions and 15 deletions

@ -54,6 +54,8 @@
isShowDeleteConfirmation?: boolean; isShowDeleteConfirmation?: boolean;
onSelect?: (asset: TimelineAsset) => void; onSelect?: (asset: TimelineAsset) => void;
onEscape?: () => void; onEscape?: () => void;
onKeyboardDelete?: (assetIds: string[]) => void;
onKeyboardArchive?: (ids: string[]) => void;
children?: Snippet; children?: Snippet;
empty?: Snippet; empty?: Snippet;
customThumbnailLayout?: Snippet<[TimelineAsset]>; customThumbnailLayout?: Snippet<[TimelineAsset]>;
@ -87,6 +89,8 @@
isShowDeleteConfirmation = $bindable(false), isShowDeleteConfirmation = $bindable(false),
onSelect = () => {}, onSelect = () => {},
onEscape = () => {}, onEscape = () => {},
onKeyboardDelete,
onKeyboardArchive,
children, children,
empty, empty,
customThumbnailLayout, customThumbnailLayout,
@ -604,6 +608,8 @@
{assetInteraction} {assetInteraction}
bind:isShowDeleteConfirmation bind:isShowDeleteConfirmation
{onEscape} {onEscape}
onAssetDelete={onKeyboardDelete}
onArchive={onKeyboardArchive}
/> />
{#if timelineManager.months.length > 0} {#if timelineManager.months.length > 0}

@ -27,6 +27,8 @@
assetInteraction: AssetInteraction; assetInteraction: AssetInteraction;
isShowDeleteConfirmation: boolean; isShowDeleteConfirmation: boolean;
onEscape?: () => void; onEscape?: () => void;
onAssetDelete?: (assetIds: string[]) => void;
onArchive?: (ids: string[]) => void;
scrollToAsset: (asset: TimelineAsset) => boolean; scrollToAsset: (asset: TimelineAsset) => boolean;
} }
@ -35,6 +37,8 @@
assetInteraction, assetInteraction,
isShowDeleteConfirmation = $bindable(false), isShowDeleteConfirmation = $bindable(false),
onEscape, onEscape,
onAssetDelete,
onArchive,
scrollToAsset, scrollToAsset,
}: Props = $props(); }: Props = $props();
@ -44,7 +48,10 @@
isShowDeleteConfirmation = false; isShowDeleteConfirmation = false;
await deleteAssets( await deleteAssets(
!(isTrashEnabled && !force), !(isTrashEnabled && !force),
(assetIds) => timelineManager.removeAssets(assetIds), (assetIds) => {
timelineManager.removeAssets(assetIds);
onAssetDelete?.(assetIds);
},
assetInteraction.selectedAssets, assetInteraction.selectedAssets,
!isTrashEnabled || force ? undefined : (assets) => timelineManager.upsertAssets(assets), !isTrashEnabled || force ? undefined : (assets) => timelineManager.upsertAssets(assets),
); );
@ -81,6 +88,7 @@
const visibility = assetInteraction.isAllArchived ? AssetVisibility.Timeline : AssetVisibility.Archive; const visibility = assetInteraction.isAllArchived ? AssetVisibility.Timeline : AssetVisibility.Archive;
const ids = await archiveAssets(assetInteraction.selectedAssets, visibility); const ids = await archiveAssets(assetInteraction.selectedAssets, visibility);
timelineManager.update(ids, (asset) => (asset.visibility = visibility)); timelineManager.update(ids, (asset) => (asset.visibility = visibility));
onArchive?.(ids);
deselectAllAssets(); deselectAllAssets();
}; };

@ -38,13 +38,7 @@
import { getPeopleThumbnailUrl } from '$lib/utils'; import { getPeopleThumbnailUrl } from '$lib/utils';
import { handleError } from '$lib/utils/handle-error'; import { handleError } from '$lib/utils/handle-error';
import { isExternalUrl } from '$lib/utils/navigation'; import { isExternalUrl } from '$lib/utils/navigation';
import { import { AssetVisibility, searchPerson, updatePerson, type PersonResponseDto } from '@immich/sdk';
AssetVisibility,
getPersonStatistics,
searchPerson,
updatePerson,
type PersonResponseDto,
} from '@immich/sdk';
import { LoadingSpinner, modalManager, toastManager } from '@immich/ui'; import { LoadingSpinner, modalManager, toastManager } from '@immich/ui';
import { import {
mdiAccountBoxOutline, mdiAccountBoxOutline,
@ -69,7 +63,7 @@
let { data }: Props = $props(); let { data }: Props = $props();
let numberOfAssets = $state(data.statistics.assets); let numberOfAssets = $derived(data.statistics.assets);
let { isViewing: showAssetViewer } = assetViewingStore; let { isViewing: showAssetViewer } = assetViewingStore;
let timelineManager = $state<TimelineManager>() as TimelineManager; let timelineManager = $state<TimelineManager>() as TimelineManager;
@ -129,12 +123,7 @@
}; };
const updateAssetCount = async () => { const updateAssetCount = async () => {
try { await invalidateAll();
const { assets } = await getPersonStatistics({ id: person.id });
numberOfAssets = assets;
} catch (error) {
handleError(error, "Can't update the asset count");
}
}; };
afterNavigate(({ from }) => { afterNavigate(({ from }) => {
@ -373,6 +362,8 @@
singleSelect={viewMode === PersonPageViewMode.SELECT_PERSON} singleSelect={viewMode === PersonPageViewMode.SELECT_PERSON}
onSelect={handleSelectFeaturePhoto} onSelect={handleSelectFeaturePhoto}
onEscape={handleEscape} onEscape={handleEscape}
onKeyboardDelete={() => updateAssetCount()}
onKeyboardArchive={() => updateAssetCount()}
> >
{#if viewMode === PersonPageViewMode.VIEW_ASSETS} {#if viewMode === PersonPageViewMode.VIEW_ASSETS}
<!-- Person information block --> <!-- Person information block -->