feat(api,web): remove a movie, files optional
ci / web (push) Successful in 28s
ci / rust (push) Successful in 1m24s
e2e / e2e (push) Successful in 1m19s

`DELETE /api/movies/{id}` took the row and left the files, and no
surface exposed it. It now accepts `delete_files`, which unlinks the
title's §7.4 folder — atomic, so sidecars go with the feature. Targets
come from `media_files`, never from re-deriving the folder name, and a
path outside its root is never touched. The torrent is untouched (§7.3):
it keeps seeding and the reaper owns it.

The release deck grows a quiet REMOVE control opening one inline
confirmation: file count, size and folder first, then a delete-files
toggle that starts off, then what the choice costs.

Closes #104
This commit is contained in:
Miguel Palhas
2026-08-23 09:08:07 +01:00
parent 83ca921501
commit 4c73b3e7c6
11 changed files with 783 additions and 5 deletions
+12
View File
@@ -30,6 +30,18 @@ reads the library as derived status, not flags.
per-title override (rule→override mapping in releases.ts — bookkeeping,
never policy; verdicts always come from the API). Esc steps back one
layer: deck → search results → board.
- Removal (§7.4, issue 104): REMOVE is a quiet control in the deck head,
never a row affordance — a dense list is the wrong place for a delete.
It opens one inline confirmation carrying the evidence first (file count,
total size, the §7.4 folder as reported by `/api/movies/{id}/files`), then
the decision, then the cost. "delete files from disk" is a separate toggle
that starts OFF and stays disabled when nothing is on disk or the file list
cannot be read; armed, the panel, its toggle word, the note and the confirm
button all turn caution amber, and the confirm reads "remove and delete
files" instead of "remove from library". The note says what does not happen
either: the torrent keeps seeding (§7.3). Esc abandons the confirmation
before it abandons the deck. On success the deck closes and the surface it
opened over repaints, so a removed title never lingers in a list.
- Library view (§4.2, issue #32): the LIBRARY rail control opens the library
deck — SERIES then MOVIES groups. Status is derived and only displayed
(§4.2 status chips in the channel-violet/neutral family for series, state