1
0
Fork 0
mirror of https://github.com/immich-app/immich.git synced 2024-12-29 15:11:58 +00:00

delete all assets associated with stack on asset delete

This commit is contained in:
Lean Miguel 2024-12-10 21:09:39 +09:00
parent 1ba622adc9
commit 7302510870
2 changed files with 44 additions and 4 deletions

View file

@ -11,7 +11,7 @@
import { showDeleteModal } from '$lib/stores/preferences.store'; import { showDeleteModal } from '$lib/stores/preferences.store';
import { featureFlags } from '$lib/stores/server-config.store'; import { featureFlags } from '$lib/stores/server-config.store';
import { handleError } from '$lib/utils/handle-error'; import { handleError } from '$lib/utils/handle-error';
import { deleteAssets, type AssetResponseDto } from '@immich/sdk'; import { deleteStack, getStack, deleteAssets, type AssetResponseDto } from '@immich/sdk';
import { mdiDeleteForeverOutline, mdiDeleteOutline } from '@mdi/js'; import { mdiDeleteForeverOutline, mdiDeleteOutline } from '@mdi/js';
import { t } from 'svelte-i18n'; import { t } from 'svelte-i18n';
import type { OnAction } from './action'; import type { OnAction } from './action';
@ -41,7 +41,16 @@
const trashAsset = async () => { const trashAsset = async () => {
try { try {
await deleteAssets({ assetBulkDeleteDto: { ids: [asset.id] } }); if (asset.stack) {
const { assets } = await getStack({ id: asset.stack.id });
const assetIds = assets.map((asset) => asset.id);
await deleteStack({ id: asset.stack.id });
await deleteAssets({ assetBulkDeleteDto: { ids: assetIds } });
} else {
await deleteAssets({ assetBulkDeleteDto: { ids: [asset.id] } });
}
onAction({ type: AssetAction.TRASH, asset }); onAction({ type: AssetAction.TRASH, asset });
notificationController.show({ notificationController.show({

View file

@ -7,6 +7,9 @@
import { type OnDelete, deleteAssets } from '$lib/utils/actions'; import { type OnDelete, deleteAssets } from '$lib/utils/actions';
import DeleteAssetDialog from '../delete-asset-dialog.svelte'; import DeleteAssetDialog from '../delete-asset-dialog.svelte';
import { t } from 'svelte-i18n'; import { t } from 'svelte-i18n';
import { deleteStacks, getStack } from '@immich/sdk';
import { handleError } from '$lib/utils/handle-error';
interface Props { interface Props {
onAssetDelete: OnDelete; onAssetDelete: OnDelete;
@ -34,8 +37,36 @@
const handleDelete = async () => { const handleDelete = async () => {
loading = true; loading = true;
const ids = [...getOwnedAssets()].map((a) => a.id); const ownedAssets = [...getOwnedAssets()];
await deleteAssets(force, onAssetDelete, ids);
try {
const stackIds: string[] = [];
const pendingAssetIds: Array<Promise<string[]>> = [];
const assetIds: string[] = [];
for (const asset of ownedAssets) {
let stackId = asset.stack?.id;
if (stackId) {
stackIds.push(stackId);
const assetIds = getStack({ id: stackId }).then((stack) => stack.assets.map((asset) => asset.id));
pendingAssetIds.push(assetIds);
} else {
assetIds.push(asset.id);
}
}
let fetchedAssetIds = await Promise.all(pendingAssetIds);
const ids = assetIds.concat(...fetchedAssetIds.flat());
if (stackIds.length > 0) {
await deleteStacks({ bulkIdsDto: { ids: stackIds } });
}
await deleteAssets(force, onAssetDelete, ids);
} catch (error) {
handleError(error, $t('errors.unable_to_delete_assets'));
}
clearSelect(); clearSelect();
isShowConfirmation = false; isShowConfirmation = false;
loading = false; loading = false;