fix(web): large files: better handling of asset deletions (#28117)

This commit is contained in:
Mees Frensel
2026-04-28 18:18:39 +02:00
committed by GitHub
parent f9b7ce9407
commit 2624f3884f
3 changed files with 19 additions and 11 deletions
@@ -45,10 +45,7 @@
await deleteAssets( await deleteAssets(
force, force,
(assetIds) => { (assetIds) => timelineManager.removeAssets(assetIds),
timelineManager.removeAssets(assetIds);
eventManager.emit('AssetsDelete', assetIds);
},
selectedAssets, selectedAssets,
force ? undefined : (assets) => timelineManager.upsertAssets(assets), force ? undefined : (assets) => timelineManager.upsertAssets(assets),
); );
+2
View File
@@ -80,6 +80,8 @@ websocket
.on('on_new_release', (event) => eventManager.emit('ReleaseEvent', event)) .on('on_new_release', (event) => eventManager.emit('ReleaseEvent', event))
.on('on_session_delete', () => eventManager.emit('SessionDelete')) .on('on_session_delete', () => eventManager.emit('SessionDelete'))
.on('on_user_delete', (id) => eventManager.emit('UserAdminDeleted', { id })) .on('on_user_delete', (id) => eventManager.emit('UserAdminDeleted', { id }))
.on('on_asset_delete', (asset) => eventManager.emit('AssetsDelete', [asset]))
.on('on_asset_trash', (assets) => eventManager.emit('AssetsDelete', assets))
.on('on_asset_update', (asset) => eventManager.emit('AssetUpdate', asset)) .on('on_asset_update', (asset) => eventManager.emit('AssetUpdate', asset))
.on('on_person_thumbnail', (id) => eventManager.emit('PersonThumbnailReady', { id })) .on('on_person_thumbnail', (id) => eventManager.emit('PersonThumbnailReady', { id }))
.on('on_notification', () => notificationManager.refresh()) .on('on_notification', () => notificationManager.refresh())
@@ -1,11 +1,12 @@
<script lang="ts"> <script lang="ts">
import type { Action } from '$lib/components/asset-viewer/actions/action'; import type { Action } from '$lib/components/asset-viewer/actions/action';
import UserPageLayout from '$lib/components/layouts/UserPageLayout.svelte'; import UserPageLayout from '$lib/components/layouts/UserPageLayout.svelte';
import OnEvents from '$lib/components/OnEvents.svelte';
import LargeAssetData from './LargeAssetData.svelte'; import LargeAssetData from './LargeAssetData.svelte';
import Portal from '$lib/elements/Portal.svelte'; import Portal from '$lib/elements/Portal.svelte';
import { assetViewerManager } from '$lib/managers/asset-viewer-manager.svelte'; import { assetViewerManager } from '$lib/managers/asset-viewer-manager.svelte';
import { handlePromiseError } from '$lib/utils'; import { handlePromiseError } from '$lib/utils';
import { getNextAsset, getPreviousAsset } from '$lib/utils/asset-utils'; import { getNextAsset, getPreviousAsset, navigateToAsset } from '$lib/utils/asset-utils';
import { navigate } from '$lib/utils/navigation'; import { navigate } from '$lib/utils/navigation';
import type { AssetResponseDto } from '@immich/sdk'; import type { AssetResponseDto } from '@immich/sdk';
import { t } from 'svelte-i18n'; import { t } from 'svelte-i18n';
@@ -17,7 +18,7 @@
let { data }: Props = $props(); let { data }: Props = $props();
let assets = $derived(data.assets); let assets = $state(data.assets);
let asset = $derived(data.asset); let asset = $derived(data.asset);
$effect(() => { $effect(() => {
@@ -36,13 +37,19 @@
return asset; return asset;
}; };
const onAction = (payload: Action) => { const preAction = async (payload: Action) => {
if (payload.type == 'trash') { if (payload.type == 'trash') {
assets = assets.filter((a) => a.id != payload.asset.id); // eslint-disable-next-line @typescript-eslint/no-unused-expressions
assetViewerManager.showAssetViewer(false); (await navigateToAsset(assetCursor?.nextAsset)) ||
(await navigateToAsset(assetCursor?.previousAsset)) ||
assetViewerManager.showAssetViewer(false);
} }
}; };
const onAssetsDelete = (assetIds: string[]) => {
assets = assets.filter(({ id }) => !assetIds.includes(id));
};
const onViewAsset = async (asset: AssetResponseDto) => { const onViewAsset = async (asset: AssetResponseDto) => {
await navigate({ targetRoute: 'current', assetId: asset.id }); await navigate({ targetRoute: 'current', assetId: asset.id });
}; };
@@ -54,9 +61,11 @@
}); });
</script> </script>
<OnEvents {onAssetsDelete} />
<UserPageLayout title={data.meta.title} scrollbar={true}> <UserPageLayout title={data.meta.title} scrollbar={true}>
<div class="grid gap-2 grid-cols-2 sm:grid-cols-3 lg:grid-cols-4 xl:grid-cols-6"> <div class="grid gap-2 grid-cols-2 sm:grid-cols-3 lg:grid-cols-4 xl:grid-cols-6">
{#if assets && data.assets.length > 0} {#if assets && assets.length > 0}
{#each assets as asset (asset.id)} {#each assets as asset (asset.id)}
<LargeAssetData {asset} {onViewAsset} /> <LargeAssetData {asset} {onViewAsset} />
{/each} {/each}
@@ -75,7 +84,7 @@
cursor={assetCursor} cursor={assetCursor}
showNavigation={assets.length > 1} showNavigation={assets.length > 1}
{onRandom} {onRandom}
{onAction} {preAction}
onClose={() => { onClose={() => {
assetViewerManager.showAssetViewer(false); assetViewerManager.showAssetViewer(false);
handlePromiseError(navigate({ targetRoute: 'current', assetId: null })); handlePromiseError(navigate({ targetRoute: 'current', assetId: null }));