- Thumbnail jobs and the legacy scan_output_dir listing leave
library-removed files out (one mark check, mark_hides).
- Missing-file links also forgets removal marks that hide nothing any
more (file gone from a folder that exists, or changed), only under a
readable, non-empty source, re-checked at apply.
- The sidebar Images, Favorites and Needs review counts and the
collection counts are read again when an image_delete job ends.
- utils/media_folders.py: one skip for thumbnails and trash folders
(.Trash, .Trash-<uid>, .Trashes, $RECYCLE.BIN) used by every walker,
the image monitor and the delete review.
* feat(trash): a freedesktop trash backend that renames without replacing or refuses (#480)
* feat(images): remove a file's records and hide it with a removal mark (#480)
Deletes every record of one file under every recorded spelling (image links,
tags, auto-tag marks, pending review items, category, collection memberships,
favorite) in one transaction. A Needs review item that is kept keeps its
annotation rows (ON DELETE RESTRICT). The image_removals table hides an exact
file (locator, size, mtime_ns) until it changes; linking skips a marked file,
and an explicit tag, category, favorite or collection write shows it again.
* feat(images): review and apply Delete images as a reviewed plan job (#480)
POST /prompt_manager/images/delete/preview reviews both modes; the
maintenance apply takes {token, mode}. Library mode removes the records and
writes the removal mark; trash mode moves the file first and removes its
records only after a successful move. The workspace listing, the output scan,
the duplicate find and Tag output images skip marked files.
* feat(images): Delete… in the Images selection bar, inspector and viewer (#480)
The concept's Remove links… place, D159: one review per selection that asks
each time (nothing preselected) whether to remove the files from the library
only or also move them to the trash. The browser test server uses a fake
trash.
* test(images): portable delete tests, the native no-trash proof, D159 in TESTING.md (#480)
* perf(images): cache the removal marks so a listing page reads no extra table (#480)
The marks reload only when this process writes or clears one, or a restore
replaces the database. The route snapshot gains the preview route.
* test(images): the full inspector specs expect D159's Delete… in the panel and the viewer (#480)
* fix(images): the delete review starts nothing without a chosen mode, and dims its primary until then (#480)
An aria-disabled primary ignores every activation, a chosen one starts once,
and the apply helper refuses a missing mode. Tests cover a forced click, a
double click, Enter and Space on the primary, Enter in the dialog and a
submit event, and the server refusing an apply without an exact mode.