Compare commits

...

4 Commits

Author SHA1 Message Date
Yaros
52578fe650 chore: remove getPersonStatistics import 2025-12-07 19:23:42 +01:00
Yaros
08066086d4 fix: delete/archive from keyboard updates count 2025-12-07 19:23:07 +01:00
Yaros
3e06b637cc chore(refactor): use derived for numberOfAssets 2025-12-07 19:08:06 +01:00
Yaros
9e9b1bcc24 fix(web): person asset count doesn't update 2025-12-07 18:38:43 +01:00
3 changed files with 20 additions and 15 deletions

View File

@@ -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}

View File

@@ -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();
}; };

View File

@@ -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 -->