Ein als gesehen markierter Film war eine Einbahnstraße: im Zustand „gesehen" stand statt eines Knopfes ein <p> — ein Etikett ohne Klickziel. Serien hatten längst einen Umschalter, Filme nur einen Hinweg.
Was geändert wurde
unmarkMovie() in src/lib/library.ts, das fehlende Gegenstück zu unmarkEpisodes(). Eingegrenzt auf run: entry.currentRun und episodeId: null, danach reconcileStatus().
unmarkMovieAction analog zu toggleEpisodeAction.
Der Knopf ist wieder einer. Die grüne Plakette bleibt stehen, wird aber klickbar („— Markierung entfernen"), mit Hover-Zustand und title.
DELETE /api/v1/bibliothek/{entryId}/sichtungen nimmt jetzt auch {"action":"movie"} — das Gegenstück zum gleichnamigen POST, ohne dass man die watchIds kennen muss. docs/API.md und openapi.json nachgezogen.
Der Fallstrick, den das Issue benannt hat
Die Eingrenzung auf run ist der Kern: wer einen Film dreimal gesehen hat, hat drei Sichtungen. Ein deleteMany ohne run hätte alle drei gelöscht und rückwirkend die Statistik verfälscht. Dafür gibt es einen eigenen Test.
Eine Vermutung aus dem Issue trifft nicht zu
Unter „Nebenbei aufgefallen" stand, die Einblendung biete bei einem schon markierten Film ein wirkungsloses Zurücknehmen an. Nachgesehen: report() in src/components/Toasts.tsx:59 blendet den Knopf nur bei ids.length > 0 ein. Das Angebot gab es also nie — hier war nichts zu reparieren.
Geprüft
Drei neue Tests (Zurücknehmen samt erneutem Abhaken, Eingrenzung auf den laufenden Durchlauf, Serien werden abgewiesen). 59 Tests grün, Typecheck sauber.
Klickweg und Endpunkt gegen einen Produktionsbau durchgespielt:
Schritt
Gesehen-Knopf
Markieren-Knopf
Fortschritt
vorher
0
1
0 %
nach dem Markieren
1
0
100 %
nach dem Zurücknehmen
0
1
0 %
nach Neuladen
0
1
0 %
Meldung „Markierung entfernt", keine JS-Fehler. Über die Schnittstelle: POST {"action":"movie"} → 1 Sichtung, DELETE {"action":"movie"} → 200, 0 Sichtungen, 0 %.
Ein als gesehen markierter Film war eine Einbahnstraße: im Zustand „gesehen" stand statt eines Knopfes ein `<p>` — ein Etikett ohne Klickziel. Serien hatten längst einen Umschalter, Filme nur einen Hinweg.
## Was geändert wurde
- **`unmarkMovie()`** in `src/lib/library.ts`, das fehlende Gegenstück zu `unmarkEpisodes()`. Eingegrenzt auf `run: entry.currentRun` und `episodeId: null`, danach `reconcileStatus()`.
- **`unmarkMovieAction`** analog zu `toggleEpisodeAction`.
- **Der Knopf ist wieder einer.** Die grüne Plakette bleibt stehen, wird aber klickbar („— Markierung entfernen"), mit Hover-Zustand und `title`.
- **`DELETE /api/v1/bibliothek/{entryId}/sichtungen`** nimmt jetzt auch `{"action":"movie"}` — das Gegenstück zum gleichnamigen POST, ohne dass man die `watchIds` kennen muss. `docs/API.md` und `openapi.json` nachgezogen.
## Der Fallstrick, den das Issue benannt hat
Die Eingrenzung auf `run` ist der Kern: wer einen Film dreimal gesehen hat, hat drei Sichtungen. Ein `deleteMany` ohne `run` hätte alle drei gelöscht und rückwirkend die Statistik verfälscht. Dafür gibt es einen eigenen Test.
## Eine Vermutung aus dem Issue trifft nicht zu
Unter „Nebenbei aufgefallen" stand, die Einblendung biete bei einem schon markierten Film ein wirkungsloses Zurücknehmen an. Nachgesehen: `report()` in `src/components/Toasts.tsx:59` blendet den Knopf nur bei `ids.length > 0` ein. Das Angebot gab es also nie — hier war nichts zu reparieren.
## Geprüft
Drei neue Tests (Zurücknehmen samt erneutem Abhaken, Eingrenzung auf den laufenden Durchlauf, Serien werden abgewiesen). **59 Tests grün**, Typecheck sauber.
Klickweg und Endpunkt gegen einen **Produktionsbau** durchgespielt:
| Schritt | Gesehen-Knopf | Markieren-Knopf | Fortschritt |
|---|---|---|---|
| vorher | 0 | 1 | 0 % |
| nach dem Markieren | 1 | 0 | 100 % |
| nach dem Zurücknehmen | 0 | 1 | 0 % |
| nach Neuladen | 0 | 1 | 0 % |
Meldung „Markierung entfernt", keine JS-Fehler. Über die Schnittstelle: `POST {"action":"movie"}` → 1 Sichtung, `DELETE {"action":"movie"}` → 200, 0 Sichtungen, 0 %.
Closes #5
War ein Film einmal als gesehen markiert, gab es keinen Weg zurueck: im
Zustand "gesehen" stand statt eines Knopfes ein <p> — ein Etikett ohne
Klickziel. Der Statuswechsel konnte das nicht heilen, weil "gesehen" aus den
Sichtungen abgeleitet wird und setStatus() die absichtlich nicht anfasst.
Und eine Gegenfunktion fuer Filme gab es nicht: unmarkEpisodes() und
unmarkSeason() waren da, ein unmarkMovie() nie geschrieben.
unmarkMovie() ist auf run: entry.currentRun und episodeId: null eingegrenzt.
Wer einen Film dreimal gesehen hat, hat drei Sichtungen — ohne die
Eingrenzung loeschte das Zuruecknehmen alle drei und verfaelschte
rueckwirkend die Statistik.
Die gruene Plakette bleibt stehen, ist jetzt aber klickbar, so wie sich
Episodenhaekchen auch abwaehlen lassen. Ueber die Schnittstelle geht es mit
DELETE {"action":"movie"} als Gegenstueck zum gleichnamigen POST, ohne dass
man die watchIds kennen muss.
Drei Tests: Zuruecknehmen samt erneutem Abhaken, die Eingrenzung auf den
laufenden Durchlauf, und dass Serien abgewiesen werden. Klickweg und
Endpunkt gegen einen Produktionsbau geprueft.
Der im Issue vermutete Nebenpunkt trifft nicht zu: report() blendet das
Zuruecknehmen nur bei ids.length > 0 ein, ein wirkungsloses Angebot gab es
also nie.
Refs #5
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Ein als gesehen markierter Film war eine Einbahnstraße: im Zustand „gesehen" stand statt eines Knopfes ein
<p>— ein Etikett ohne Klickziel. Serien hatten längst einen Umschalter, Filme nur einen Hinweg.Was geändert wurde
unmarkMovie()insrc/lib/library.ts, das fehlende Gegenstück zuunmarkEpisodes(). Eingegrenzt aufrun: entry.currentRunundepisodeId: null, danachreconcileStatus().unmarkMovieActionanalog zutoggleEpisodeAction.title.DELETE /api/v1/bibliothek/{entryId}/sichtungennimmt jetzt auch{"action":"movie"}— das Gegenstück zum gleichnamigen POST, ohne dass man diewatchIdskennen muss.docs/API.mdundopenapi.jsonnachgezogen.Der Fallstrick, den das Issue benannt hat
Die Eingrenzung auf
runist der Kern: wer einen Film dreimal gesehen hat, hat drei Sichtungen. EindeleteManyohnerunhätte alle drei gelöscht und rückwirkend die Statistik verfälscht. Dafür gibt es einen eigenen Test.Eine Vermutung aus dem Issue trifft nicht zu
Unter „Nebenbei aufgefallen" stand, die Einblendung biete bei einem schon markierten Film ein wirkungsloses Zurücknehmen an. Nachgesehen:
report()insrc/components/Toasts.tsx:59blendet den Knopf nur beiids.length > 0ein. Das Angebot gab es also nie — hier war nichts zu reparieren.Geprüft
Drei neue Tests (Zurücknehmen samt erneutem Abhaken, Eingrenzung auf den laufenden Durchlauf, Serien werden abgewiesen). 59 Tests grün, Typecheck sauber.
Klickweg und Endpunkt gegen einen Produktionsbau durchgespielt:
Meldung „Markierung entfernt", keine JS-Fehler. Über die Schnittstelle:
POST {"action":"movie"}→ 1 Sichtung,DELETE {"action":"movie"}→ 200, 0 Sichtungen, 0 %.Closes #5
War ein Film einmal als gesehen markiert, gab es keinen Weg zurueck: im Zustand "gesehen" stand statt eines Knopfes ein <p> — ein Etikett ohne Klickziel. Der Statuswechsel konnte das nicht heilen, weil "gesehen" aus den Sichtungen abgeleitet wird und setStatus() die absichtlich nicht anfasst. Und eine Gegenfunktion fuer Filme gab es nicht: unmarkEpisodes() und unmarkSeason() waren da, ein unmarkMovie() nie geschrieben. unmarkMovie() ist auf run: entry.currentRun und episodeId: null eingegrenzt. Wer einen Film dreimal gesehen hat, hat drei Sichtungen — ohne die Eingrenzung loeschte das Zuruecknehmen alle drei und verfaelschte rueckwirkend die Statistik. Die gruene Plakette bleibt stehen, ist jetzt aber klickbar, so wie sich Episodenhaekchen auch abwaehlen lassen. Ueber die Schnittstelle geht es mit DELETE {"action":"movie"} als Gegenstueck zum gleichnamigen POST, ohne dass man die watchIds kennen muss. Drei Tests: Zuruecknehmen samt erneutem Abhaken, die Eingrenzung auf den laufenden Durchlauf, und dass Serien abgewiesen werden. Klickweg und Endpunkt gegen einen Produktionsbau geprueft. Der im Issue vermutete Nebenpunkt trifft nicht zu: report() blendet das Zuruecknehmen nur bei ids.length > 0 ein, ein wirkungsloses Angebot gab es also nie. Refs #5