fixed delete overlay
This commit is contained in:
parent
d95b65817f
commit
f2b8cb2457
@ -3670,7 +3670,33 @@ export default function FinishedDownloads({
|
|||||||
const ok = window.confirm(`${selectedFiles.length} Downloads löschen?`)
|
const ok = window.confirm(`${selectedFiles.length} Downloads löschen?`)
|
||||||
if (!ok) return
|
if (!ok) return
|
||||||
|
|
||||||
|
const selectedDeleteItems = selectedFiles
|
||||||
|
.map((file) => {
|
||||||
|
const cleanFile = String(file || '').trim()
|
||||||
|
if (!cleanFile) return null
|
||||||
|
|
||||||
|
return {
|
||||||
|
file: cleanFile,
|
||||||
|
key: fileToKeyRef.current.get(cleanFile) || cleanFile,
|
||||||
|
}
|
||||||
|
})
|
||||||
|
.filter(Boolean) as Array<{ file: string; key: string }>
|
||||||
|
|
||||||
|
if (selectedDeleteItems.length === 0) return
|
||||||
|
|
||||||
|
const selectedDeleteKeys = selectedDeleteItems.map((item) => item.key)
|
||||||
|
|
||||||
|
// Sofort Overlay anzeigen, noch bevor der Bulk-Request läuft.
|
||||||
|
setDeletingKeys((prev) => {
|
||||||
|
const next = new Set(prev)
|
||||||
|
for (const key of selectedDeleteKeys) {
|
||||||
|
next.add(key)
|
||||||
|
}
|
||||||
|
return next
|
||||||
|
})
|
||||||
|
|
||||||
setBulkBusy(true)
|
setBulkBusy(true)
|
||||||
|
|
||||||
try {
|
try {
|
||||||
const res = await fetch('/api/record/delete-many', {
|
const res = await fetch('/api/record/delete-many', {
|
||||||
method: 'POST',
|
method: 'POST',
|
||||||
@ -3686,20 +3712,57 @@ export default function FinishedDownloads({
|
|||||||
const data = await res.json().catch(() => null)
|
const data = await res.json().catch(() => null)
|
||||||
const results = Array.isArray(data?.results) ? data.results : []
|
const results = Array.isArray(data?.results) ? data.results : []
|
||||||
|
|
||||||
for (const item of results) {
|
const deletedKeys = new Set<string>()
|
||||||
if (!item?.ok) continue
|
const failedKeys = new Set<string>()
|
||||||
|
|
||||||
const file = String(item.file || '').trim()
|
for (const item of results) {
|
||||||
|
const file = String(item?.file || '').trim()
|
||||||
if (!file) continue
|
if (!file) continue
|
||||||
|
|
||||||
const key =
|
const key = fileToKeyRef.current.get(file) || file
|
||||||
fileToKeyRef.current.get(file) ||
|
|
||||||
file
|
|
||||||
|
|
||||||
animateRemove(key, file)
|
if (item?.ok) {
|
||||||
|
deletedKeys.add(key)
|
||||||
|
animateRemove(key, file)
|
||||||
|
} else {
|
||||||
|
failedKeys.add(key)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const deletedCount = Number(data?.deleted ?? results.filter((x: any) => x?.ok).length ?? 0)
|
// Falls das Backend einzelne Dateien gar nicht zurückmeldet:
|
||||||
|
// nicht ewig als "Wird gelöscht" stehen lassen.
|
||||||
|
for (const item of selectedDeleteItems) {
|
||||||
|
if (!deletedKeys.has(item.key) && !failedKeys.has(item.key)) {
|
||||||
|
failedKeys.add(item.key)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (failedKeys.size > 0) {
|
||||||
|
setDeletingKeys((prev) => {
|
||||||
|
const next = new Set(prev)
|
||||||
|
for (const key of failedKeys) {
|
||||||
|
next.delete(key)
|
||||||
|
}
|
||||||
|
return next
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// Erfolgreiche Keys nach der Remove-Animation aus dem Busy-State räumen.
|
||||||
|
if (deletedKeys.size > 0) {
|
||||||
|
window.setTimeout(() => {
|
||||||
|
setDeletingKeys((prev) => {
|
||||||
|
const next = new Set(prev)
|
||||||
|
for (const key of deletedKeys) {
|
||||||
|
next.delete(key)
|
||||||
|
}
|
||||||
|
return next
|
||||||
|
})
|
||||||
|
}, 450)
|
||||||
|
}
|
||||||
|
|
||||||
|
const deletedCount = Number(
|
||||||
|
data?.deleted ?? results.filter((x: any) => x?.ok).length ?? 0
|
||||||
|
)
|
||||||
|
|
||||||
clearSelection()
|
clearSelection()
|
||||||
emitCountHint(-deletedCount)
|
emitCountHint(-deletedCount)
|
||||||
@ -3708,6 +3771,15 @@ export default function FinishedDownloads({
|
|||||||
notify.success?.('Löschen erfolgreich', `${deletedCount} Downloads gelöscht.`)
|
notify.success?.('Löschen erfolgreich', `${deletedCount} Downloads gelöscht.`)
|
||||||
}
|
}
|
||||||
} catch (e: any) {
|
} catch (e: any) {
|
||||||
|
// Bei komplettem Fehler alle zuvor markierten Overlays wieder entfernen.
|
||||||
|
setDeletingKeys((prev) => {
|
||||||
|
const next = new Set(prev)
|
||||||
|
for (const key of selectedDeleteKeys) {
|
||||||
|
next.delete(key)
|
||||||
|
}
|
||||||
|
return next
|
||||||
|
})
|
||||||
|
|
||||||
notify.error('Bulk-Löschen fehlgeschlagen', String(e?.message || e))
|
notify.error('Bulk-Löschen fehlgeschlagen', String(e?.message || e))
|
||||||
} finally {
|
} finally {
|
||||||
setBulkBusy(false)
|
setBulkBusy(false)
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user