Eine Zahl ohne das, worauf sie sich bezieht

„4 warten auf Freigabe" stand in der Mediathekenzeile, und die Liste darüber
war leer — sogar versteckt. Zwei Gründe, beide behoben.

Die Prüfliste wurde einmal beim Öffnen geholt und nie wieder. Findet ein
laufender Scan danach etwas Neues, zählt die Zeile es mit, die Liste aber
nicht. Sie hört jetzt auf dieselbe Meldung wie die Seitenleiste: Scan durch,
etwas freigegeben, Mediathek geändert — nachladen.

Und der Knopf gab blind frei. Auf die Frage „wo sehe ich die vier Filme?"
war das keine Antwort: er veröffentlichte sie, ohne sie zu zeigen. Jetzt
führt er dorthin, wo sie mit Plakat, Jahr und Dateiname stehen und sich
einzeln anhaken lassen — und hebt die Stelle kurz hervor, damit man nicht
weitersucht.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
Scarriffle
2026-10-06 13:56:12 +02:00
co-authored by Claude Opus 5
parent 58e06d0539
commit f44779c899
2 changed files with 52 additions and 19 deletions
+8
View File
@@ -1618,3 +1618,11 @@ body:has(.auswahlleiste:not(.hidden)) .hinweise { bottom: 104px; }
} }
.fassungsdatei .oz-dazu { flex: 1 1 auto; } .fassungsdatei .oz-dazu { flex: 1 1 auto; }
.btn.klein { padding: 4px 10px; font-size: 12px; flex: 0 0 auto; } .btn.klein { padding: 4px 10px; font-size: 12px; flex: 0 0 auto; }
/* Kurz hervorheben, wohin gesprungen wurde — sonst sucht man oben weiter. */
.hervor { animation: hervor 1.6s ease-out; }
@keyframes hervor {
0%, 60% { background: var(--accent-soft); border-radius: var(--r-karte); }
100% { background: transparent; }
}
@media (prefers-reduced-motion: reduce) { .hervor { animation: none; } }
+44 -19
View File
@@ -4,7 +4,7 @@ import {
vermisste, vermisstesEntfernen, type VermissteDatei, vermisste, vermisstesEntfernen, type VermissteDatei,
protokolltage, protokollAdresse, sprachen, spracheSetzen, uebersetzungenHolen, protokolltage, protokollAdresse, sprachen, spracheSetzen, uebersetzungenHolen,
meineSprache, zuPruefen, veroeffentlichen, zurueckziehen, pruefungSetzen, meineSprache, zuPruefen, veroeffentlichen, zurueckziehen, pruefungSetzen,
mediathekFreigeben, mediathekZuruecksetzen, mediathekZuruecksetzen,
type Pruefeintrag, type Pruefeintrag,
benutzer, benutzerAnlegen, metadatenEinstellung, metadatenSetzen, benutzer, benutzerAnlegen, metadatenEinstellung, metadatenSetzen,
servernameSetzen, systemauskunft, servernameSetzen, systemauskunft,
@@ -37,9 +37,19 @@ export function verwaltung(
signal: AbortSignal = new AbortController().signal, signal: AbortSignal = new AbortController().signal,
): HTMLElement { ): HTMLElement {
const wurzel = document.createElement('div'); const wurzel = document.createElement('div');
wurzel.append(dashboard(signal), sprachbereich(), pruefbereich(geaendert),
vermisstenbereich(geaendert), bibliotheksbereich(geaendert, signal), benutzerbereich(), // **Die Prüfliste hört mit.** Ändert sich der Bestand — ein Scan ist durch,
serverbereich(geaendert), speicherbereich(), ohneZuordnungBereich(), // etwas wurde freigegeben —, holt sie sich neu. Ohne das stand die Zahl in
// der Mediathekenzeile und die Liste darüber war leer.
const pruefung = pruefbereich(() => { geaendert(); pruefung.auffrischen(); });
const mitPruefung = (bekannt?: Bibliothek[]): void => {
geaendert(bekannt);
pruefung.auffrischen();
};
wurzel.append(dashboard(signal), sprachbereich(), pruefung.wurzel,
vermisstenbereich(mitPruefung), bibliotheksbereich(mitPruefung, signal), benutzerbereich(),
serverbereich(mitPruefung), speicherbereich(), ohneZuordnungBereich(),
unzugeordnetbereich(), unzugeordnetbereich(),
protokollbereich()); protokollbereich());
return wurzel; return wurzel;
@@ -182,9 +192,12 @@ function laufzeit(sekunden: number): string {
* Geplante bleiben in der Liste. Ein Titel mit Termin ist nicht erledigt, er * Geplante bleiben in der Liste. Ein Titel mit Termin ist nicht erledigt, er
* hat nur schon einen — ihn verschwinden zu lassen hiesse, dass man ihn nur * hat nur schon einen — ihn verschwinden zu lassen hiesse, dass man ihn nur
* wiederfindet, wenn man sich den Termin gemerkt hat. */ * wiederfindet, wenn man sich den Termin gemerkt hat. */
function pruefbereich(geaendert: () => void): HTMLElement { function pruefbereich(geaendert: () => void): {
wurzel: HTMLElement; auffrischen: () => void;
} {
const bereich = document.createElement('section'); const bereich = document.createElement('section');
bereich.className = 'hidden'; bereich.className = 'hidden';
bereich.id = 'zu-pruefen';
const liste = document.createElement('div'); const liste = document.createElement('div');
liste.className = 'einstellungen'; liste.className = 'einstellungen';
@@ -387,7 +400,12 @@ function pruefbereich(geaendert: () => void): HTMLElement {
+ `T${z(d.getHours())}:${z(d.getMinutes())}`; + `T${z(d.getHours())}:${z(d.getMinutes())}`;
} }
return bereich; // **Nachladbar, und das fehlte.** Die Liste wurde einmal beim Öffnen
// geholt. Fand ein laufender Scan danach etwas Neues, zählte die Zeile der
// Mediathek es mit — „4 warten auf Freigabe" —, die Liste darüber blieb
// aber leer und sogar versteckt. Da stand eine Zahl ohne das, worauf sie
// sich bezog.
return { wurzel: bereich, auffrischen: () => void laden() };
} }
/* ---------- Protokolle ---------- */ /* ---------- Protokolle ---------- */
@@ -1202,18 +1220,23 @@ function bibliotheksbereich(
// anzulegen und wieder wegzuwerfen wäre genau das Flackern, das hier // anzulegen und wieder wegzuwerfen wäre genau das Flackern, das hier
// gerade abgestellt wird. // gerade abgestellt wird.
const freigeben = knopf('', 'btn btn-primary'); const freigeben = knopf('', 'btn btn-primary');
freigeben.onclick = async () => { // **Zeigen statt blind freigeben.**
freigeben.disabled = true; //
try { // Der Knopf veröffentlichte bisher auf einen Klick alles, was wartete —
const bericht = await mediathekFreigeben(aktuell.id); // ohne dass man gesehen hätte, was. Auf die Frage „wo sehe ich die vier
stand.textContent = `${bericht.published} freigegeben.`; // Filme?" gab es damit keine Antwort: die Liste stand weiter oben, aber
await laden(); // niemand wusste das, und sie war obendrein nicht nachgeladen worden.
geaendert(); //
} catch (fehler) { // Jetzt führt er dorthin. Veröffentlicht wird dort, wo die Titel mit
d.appendChild(fehlerzeile(meldung(fehler))); // Plakat und Dateiname stehen und sich einzeln anhaken lassen.
} finally { freigeben.onclick = () => {
freigeben.disabled = false; const liste = document.getElementById('zu-pruefen');
} if (!liste) return;
liste.scrollIntoView({ behavior: 'smooth', block: 'start' });
// Kurz hervorheben — sonst sucht man oben wieder, was man sucht.
liste.classList.add('hervor');
window.setTimeout(() => liste.classList.remove('hervor'), 1600);
}; };
knoepfe.appendChild(freigeben); knoepfe.appendChild(freigeben);
@@ -1224,7 +1247,9 @@ function bibliotheksbereich(
// „0 Titel freigeben" da, obwohl nichts wartet. `.hidden` trägt ein // „0 Titel freigeben" da, obwohl nichts wartet. `.hidden` trägt ein
// `!important` und setzt sich durch. // `!important` und setzt sich durch.
freigeben.classList.toggle('hidden', aktuell.pendingCount === 0); freigeben.classList.toggle('hidden', aktuell.pendingCount === 0);
freigeben.textContent = `${aktuell.pendingCount} Titel freigeben`; freigeben.textContent = aktuell.pendingCount === 1
? 'Ein Titel wartet — ansehen'
: `${aktuell.pendingCount} Titel warten — ansehen`;
} }
freigabeSchreiben(); freigabeSchreiben();