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
+4
View File
@@ -20,6 +20,7 @@ import { kontextmenue, menueAnZiel, type Menuepunkt } from '../menue';
import { bilddialog } from '../bilder';
import { zuordnungsdialog } from '../zuordnung';
import { titeldialog } from '../titel';
import { bearbeiten } from '../bearbeiten';
/** Die Verwaltung.
*
@@ -337,6 +338,9 @@ function pruefbereich(geaendert: () => void): HTMLElement {
mehr.innerHTML = icons.punkte;
mehr.setAttribute('aria-label', `Mehr zu „${e.title}“`);
const punkte = (): Menuepunkt[] => [
// Auch hier: ein Ort für alles, die Einzelnen bleiben als Abkürzung.
{ text: 'Bearbeiten', icon: 'stift',
tun: () => bearbeiten(art, e.id, () => void laden()) },
{ text: 'Titel ändern', icon: 'stift',
tun: () => titeldialog(art, e.id, e.title, () => void laden()) },
{ text: 'Bilder bearbeiten', icon: 'stift',
+50
View File
@@ -396,6 +396,56 @@ export function mediathek(
nachAuswahl();
}
/* ---------- Umsortieren nach einer Korrektur ----------
*
* **„WALL·E" stand nach der Korrektur weiter unter E.**
*
* Die Kachel wurde zwar neu beschriftet, blieb aber an ihrem Platz — bis
* man die Seite neu lud. Jetzt rutscht sie dorthin, wo sie hingehört.
*
* **Und wenn der Platz gar nicht geladen ist, geht sie.** Bei 447 Titeln
* sind zweihundert da; ein Film, der von E nach W wandert, hat seinen
* neuen Platz oft noch gar nicht vor sich. Ihn ans Ende zu hängen wäre
* falsch, ihn stehenzulassen auch — also sagt die Liste, wohin er ging,
* und nimmt ihn weg.
*/
gitter.addEventListener('kachel-umsortiert', e => {
const { id, sortTitel, titel } = (e as CustomEvent<{
id: string; sortTitel: string | null; titel: string;
}>).detail;
// Nur beim Sortieren nach Titel steht die Reihenfolge auf dem
// Sortiertitel. Nach Jahr oder Zugang entscheidet etwas anderes, und
// das kennt die Kachel nicht.
if (ordnung !== 'title') return;
const k = gitter.querySelector<HTMLElement>(`.kachel[data-id="${CSS.escape(id)}"]`);
if (!k) return;
const schluessel = (sortTitel ?? titel).toLocaleLowerCase('de');
const andere = [...gitter.querySelectorAll<HTMLElement>('.kachel')].filter(x => x !== k);
const davor = andere.find(x => {
const seiner = bekannt.get(x.dataset.id ?? '');
const sein = (seiner?.sortTitel ?? seiner?.titel ?? '').toLocaleLowerCase('de');
return sein.localeCompare(schluessel, 'de') > 0;
});
if (davor) { gitter.insertBefore(k, davor); return; }
// Hinter allem Geladenen — also irgendwo im noch nicht geholten Teil.
if (!amEnde) {
k.remove();
bekannt.delete(id);
gewaehlt.delete(id);
nachAuswahl();
hinweisZeigen(`„${titel}" steht jetzt weiter hinten in der Liste.`);
return;
}
gitter.appendChild(k);
});
/** Streicht man an den Rand, wandert die Seite mit.
*
* **Sonst endet jede Auswahl am unteren Bildrand.** Bei 447 Titeln sind