Der Orden des Phönix stand vor dem Stein der Weisen

Alphabetisch stimmt das, nur sieht man sie andersherum. Es gibt jetzt einen
Sortiertitel: „Harry Potter 1", „Harry Potter 2" — und die Reihe steht in
der Ordnung, in der man sie schaut. Leer gelassen bleibt alles wie bisher,
beim Titel ohne Artikel davor.

Er hat einen eigenen Merker, nicht den des Titels. Wer die Reihenfolge
festlegt, soll den Titel trotzdem weiter automatisch bekommen; beides an
einem Schalter hiesse, für das eine auf das andere zu verzichten. Eine
Korrektur der Zuordnung lässt ihn ebenfalls stehen.

Und WALL·E bleibt nicht mehr unter E. Die Kachel wurde nach einer Korrektur
zwar neu beschriftet, blieb aber an ihrem Platz — jetzt rutscht sie dorthin,
wo sie hingehört. Liegt der Platz im noch nicht geladenen Teil der Liste,
geht sie weg und sagt wohin, statt falsch stehenzubleiben.

Dazu ein Dialog, in dem alles zu einem Titel beieinander steht: Titel,
Sortiertitel, Bilder, Zuordnung. Die vier Menüpunkte gab es schon, jeder für
sich richtig — zusammen aber kein Ort. Wer einen Film geraderückt, macht
selten nur eines davon. Die Abkürzungen bleiben.

Beim Bauen gefunden: das Zurücksetzen des Sortiertitels endete in einer 500.
SortTitle.For ist eine C#-Methode, und EF Core übersetzt sie nicht nach SQL.
Es geht um eine Zeile — die wird jetzt geladen und zurückgeschrieben, statt
die Regel ein zweites Mal als SQL zu schreiben.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
Scarriffle
2026-10-05 22:25:31 +02:00
co-authored by Claude Opus 5
parent e70c33f7e2
commit fcf40e4394
16 changed files with 1722 additions and 13 deletions
+37 -1
View File
@@ -8,6 +8,7 @@ import { kontextmenue, menueAnZiel, type Menuepunkt } from './menue';
import { bilddialog } from './bilder';
import { zuordnungsdialog } from './zuordnung';
import { titeldialog } from './titel';
import { bearbeiten } from './bearbeiten';
/** Was eine Kachel zeigt — unabhängig davon, woher sie kommt. */
export type Kachel = {
@@ -32,6 +33,10 @@ export type Kachel = {
offen?: number | null;
/** Wie viele Folgen es überhaupt sind — um die Plakette wiederherzustellen. */
gesamt?: number | null;
/** Wonach einsortiert wird. **Damit die Kachel weiss, wohin sie gehört**,
* wenn sich der Titel ändert — sonst stand „WALL·E" nach der Korrektur
* weiter unter E, bis man die Seite neu lud. */
sortTitel?: string | null;
/** `null` heisst: wartet auf Freigabe. Ein Zeitpunkt in der Zukunft: geplant. */
freigabe?: string | null;
};
@@ -47,6 +52,7 @@ export const alsKachel = (e: Film | Serie): Kachel => ({
stand: e.state,
offen: 'unwatchedCount' in e ? e.unwatchedCount : null,
gesamt: 'episodeCount' in e ? e.episodeCount : null,
sortTitel: e.sortTitle,
freigabe: e.publishAt,
});
@@ -319,6 +325,24 @@ function kachelpunkte(
if (istAdmin()) {
const art = k.art === 'serien' ? 'series' : 'movies';
// **Ein Ort für alles, und die Abkürzungen bleiben.** Titel, Sortiertitel,
// Bilder und Zuordnung gehören zusammen: wer einen Film geraderückt, macht
// selten nur eines davon. Wer weiss, was er will, nimmt weiter den
// einzelnen Punkt darunter.
punkte.push({
text: 'Bearbeiten',
icon: 'stift',
tun: () => bearbeiten(art, k.id, ergebnis => {
if (ergebnis.verschmolzen) {
knopf.remove();
hinweisZeigen(`„${ergebnis.titel}" wurde mit einem vorhandenen Eintrag zusammengelegt.`);
return;
}
void kachelAuffrischen(k, knopf);
}),
});
punkte.push({
text: 'Bilder bearbeiten',
icon: 'stift',
@@ -377,14 +401,26 @@ function kachelpunkte(
* Eintrag. Alles neu zu laden kostet einen Netzabruf über mehrere hundert
* Titel und setzt die Ansicht an den Anfang zurück.
*/
async function kachelAuffrischen(k: Kachel, knopf: HTMLElement): Promise<void> {
export async function kachelAuffrischen(k: Kachel, knopf: HTMLElement): Promise<void> {
let frisch: Film | Serie;
try { frisch = k.art === 'serien' ? await serie(k.id) : await film(k.id); }
catch { return; } // Still bleiben: die alte Kachel ist besser als eine Meldung.
const vorher = k.sortTitel;
k.titel = frisch.title;
k.zweite = frisch.year ? String(frisch.year) : null;
k.bild = frisch.posterImage;
k.sortTitel = frisch.sortTitle;
// **Die Liste erfährt, dass die Kachel woandershin gehört.** Sie allein
// weiss, ob der neue Platz überhaupt geladen ist.
if (vorher !== k.sortTitel) {
knopf.dispatchEvent(new CustomEvent('kachel-umsortiert', {
bubbles: true,
detail: { id: k.id, sortTitel: k.sortTitel, titel: k.titel },
}));
}
const text = knopf.querySelector('.kacheltext');
if (text) {