Skip to content

Commit 629eead

Browse files
viva-jinyiclaude
andcommitted
[fix] Improve batch delete error handling with Promise.allSettled
Fixed issue where partial deletion failures were not reported to users. Previously, if some assets failed to delete, the UI would still show "all assets deleted successfully" which could mislead users about data loss. Changes: - Replaced Promise.all with Promise.allSettled in deleteMultipleAssets - Track individual success/failure for each asset deletion - Show different toast messages based on results: - All success: success toast with count - All failed: error toast - Partial success: warning toast with succeeded/failed counts - Improved error logging with asset names for debugging Added i18n: - mediaAsset.selection.partialDeleteSuccess: "{succeeded} deleted successfully, {failed} failed" This addresses PR review comment #2 (Medium Priority). 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
1 parent d3070b4 commit 629eead

File tree

2 files changed

+52
-21
lines changed

2 files changed

+52
-21
lines changed

src/locales/en/main.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2043,7 +2043,8 @@
20432043
"downloadStarted": "Downloading {count} files...",
20442044
"downloadsStarted": "Started downloading {count} file(s)",
20452045
"assetsDeletedSuccessfully": "{count} asset(s) deleted successfully",
2046-
"failedToDeleteAssets": "Failed to delete selected assets"
2046+
"failedToDeleteAssets": "Failed to delete selected assets",
2047+
"partialDeleteSuccess": "{succeeded} deleted successfully, {failed} failed"
20472048
},
20482049
"noJobIdFound": "No job ID found for this asset",
20492050
"unsupportedFileType": "Unsupported file type for loader node",

src/platform/assets/composables/useMediaAssetActions.ts

Lines changed: 50 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -384,20 +384,27 @@ export function useMediaAssetActions() {
384384
itemList: assets.map((asset) => asset.name),
385385
onConfirm: async () => {
386386
try {
387-
// Delete all assets using the shared helper
388-
// Silently skip assets that can't be deleted (e.g., input assets in non-cloud)
389-
await Promise.all(
390-
assets.map(async (asset) => {
391-
const assetType = getAssetType(asset)
392-
try {
393-
await deleteAssetApi(asset, assetType)
394-
} catch (error) {
395-
// Log but don't fail the entire batch for individual errors
396-
console.warn(`Failed to delete asset ${asset.name}:`, error)
397-
}
398-
})
387+
// Delete all assets using Promise.allSettled to track individual results
388+
const results = await Promise.allSettled(
389+
assets.map((asset) =>
390+
deleteAssetApi(asset, getAssetType(asset))
391+
)
399392
)
400393

394+
// Count successes and failures
395+
const succeeded = results.filter(
396+
(r) => r.status === 'fulfilled'
397+
).length
398+
const failed = results.filter((r) => r.status === 'rejected')
399+
400+
// Log failed deletions for debugging
401+
failed.forEach((result, index) => {
402+
console.warn(
403+
`Failed to delete asset ${assets[index].name}:`,
404+
result.reason
405+
)
406+
})
407+
401408
// Update stores after deletions
402409
const hasOutputAssets = assets.some(
403410
(a) => getAssetType(a) === 'output'
@@ -413,14 +420,37 @@ export function useMediaAssetActions() {
413420
await assetsStore.updateInputs()
414421
}
415422

416-
toast.add({
417-
severity: 'success',
418-
summary: t('g.success'),
419-
detail: t('mediaAsset.selection.assetsDeletedSuccessfully', {
420-
count: assets.length
421-
}),
422-
life: 2000
423-
})
423+
// Show appropriate feedback based on results
424+
if (failed.length === 0) {
425+
// All succeeded
426+
toast.add({
427+
severity: 'success',
428+
summary: t('g.success'),
429+
detail: t('mediaAsset.selection.assetsDeletedSuccessfully', {
430+
count: succeeded
431+
}),
432+
life: 2000
433+
})
434+
} else if (succeeded === 0) {
435+
// All failed
436+
toast.add({
437+
severity: 'error',
438+
summary: t('g.error'),
439+
detail: t('mediaAsset.selection.failedToDeleteAssets'),
440+
life: 3000
441+
})
442+
} else {
443+
// Partial success
444+
toast.add({
445+
severity: 'warn',
446+
summary: t('g.warning'),
447+
detail: t('mediaAsset.selection.partialDeleteSuccess', {
448+
succeeded,
449+
failed: failed.length
450+
}),
451+
life: 3000
452+
})
453+
}
424454
} catch (error) {
425455
console.error('Failed to delete assets:', error)
426456
toast.add({

0 commit comments

Comments
 (0)