diff --git a/frontend/src/admin/Admin.tsx b/frontend/src/admin/Admin.tsx index 26c4045..bee99d4 100755 --- a/frontend/src/admin/Admin.tsx +++ b/frontend/src/admin/Admin.tsx @@ -85,11 +85,15 @@ function Inventory() { return fetchAdminItems(active) .then(rows => { if (seq === latestRequest.current) setItems(rows); + // Handed back so a caller that needs one fresh row (handleBackgrounds) + // can pick it out of this filtered fetch instead of issuing its own + // second, unfiltered one. + return rows; }) // Without this the table simply keeps showing whatever it had, so a // failed refetch after a save looks identical to a save that did not // change anything. - .catch(() => message.error('Could not load items')); + .catch(() => { message.error('Could not load items'); return undefined; }); }, [filters]); // The item form needs the current category tree and tag list; both change @@ -213,6 +217,7 @@ function Inventory() { * showing the previous files and the button looks like it did nothing. */ async function handleBackgrounds(itemId: number, action: 'remove-backgrounds' | 'restore-originals') { + const label = action === 'remove-backgrounds' ? 'remove backgrounds' : 'restore originals'; setBusyBackgrounds(true); try { const res = await fetch(`/api/admin/items/${itemId}/${action}`, { method: 'POST' }); @@ -231,14 +236,16 @@ function Inventory() { message.success('Done.'); } - // Re-read the item so the thumbnails match what is now on the server. - const fresh = await fetch('/api/admin/items'); - if (fresh.ok) { - const all: Item[] = await fresh.json(); - const updated = all.find((candidate) => candidate.id === itemId); - if (updated) setEditingItem(prev => (prev && prev.id === itemId ? updated : prev)); - setItems(all); - } + // Re-read the list through load() — same as every other mutation here — + // so a filtered view survives this, then pick this item's fresh images + // back out of it for the open modal. The item's own filtered fields + // (category, tags, status, search) are untouched by a background swap, + // so it stays in the result whenever it was in it before. + const rows = await load(); + const updated = rows?.find(candidate => candidate.id === itemId); + if (updated) setEditingItem(prev => (prev && prev.id === itemId ? updated : prev)); + } catch (err) { + message.error(`Couldn't ${label} — ${(err as Error).message}`); } finally { setBusyBackgrounds(false); }