Die Kanalzeile -- und der Kasten, der auf dem Chili-Motiv stand
SCHRITT 3 AUS DEM VIDEO-PLAN: DIE KANALZEILE
Filipe: "fuer meinen Account, dogfather, dann dogfather clips und
hasidog." Sobald Videos aus drei Kanaelen nebeneinander liegen, ist die
erste Frage nicht "welche Art", sondern "von welchem Kanal".
ALS ZWEITE DIMENSION, nicht als weiterer Wert in derselben Leiste. Der
vorhandene Filter ist EIN Wert (Alle / Nur offene / die Arten); wer den
Kanal dort hineinpresst, kann "nur offene Clips von HasiDog" nicht mehr
fragen. Zwei getrennte Reihen zeigen ausserdem, dass es zwei Fragen
sind -- in einer Zeile klickt man das zweite und wundert sich, warum
das erste wieder aus ist.
SIE ERSCHEINT NUR AB ZWEI KANAELEN, und die Kanaele werden aus den
vorhandenen Eintraegen abgeleitet statt aufgezaehlt. Auf einem Brett
ohne Videos steht keine leere Leiste; bei einem Kanal steht kein
Filter, der nichts tut. Ein Knopf, bei dem nichts passiert, kostet das
Vertrauen in den naechsten.
Die drei Toene sind dieselben wie am Zeichen auf der Karte -- wer
"DogFather Clips" in Tuerkis filtert, findet darunter Karten mit
tuerkisem Zeichen. Ungewaehlt bleiben sie gedeckt: drei bunte Knoepfe
nebeneinander waeren eine Ampel, und eine Ampel sagt "gut/schlecht",
wo nur "welcher Kanal" gemeint ist.
DER KASTEN, DER AUF DEM CHILI-MOTIV STAND
Der leere Zustand der Talente-Seite von heute Vormittag hatte nur einen
gestrichelten Rand. Solange dort EIN Satz stand, ging das; jetzt stehen
dort drei Absaetze, fuenf Merkmale und zwei Knoepfe -- und das
Spicy-Media-Motiv mit Chilischoten und Neonlicht schien voll durch den
Text. Lesbar war das nicht, augenschonend erst recht nicht.
DIE WARNUNG STAND 70 ZEILEN WEITER UNTEN in derselben Datei, bei
.t-fuss, und beschreibt exakt diesen Fehler ("Sie stand als einziger
Text der Seite direkt auf der Buehne"). Ich habe sie gelesen und bin
trotzdem hineingelaufen. Ein Kommentar, der vor einem Fehler warnt,
verhindert ihn nicht -- gefunden hat es erst das Bildschirmfoto.
GESEHEN STATT GEZAEHLT (server/bild-stufen.mjs)
Stufenleiter und Talente-Seite waren heute Vormittag nur an Zahlen
geprueft. Das Bild zeigte: die Leiste sitzt sauber in einer Zeile
(1400 px) und in vier auf 412 px, nichts laeuft ueber den Rand, keine
Konsolenfehler -- und den Kasten ohne Grund.
DIE PRUEFUNG (server/pruef-kanalzeile.mjs, 14 Pruefungen)
Sie prueft nicht nur, DASS gefiltert wird, sondern dass das Richtige
uebrig bleibt: "weniger" allein waere auch erfuellt, wenn der Filter
irgendetwas wegwirft. Dazu der zweite Klick (hebt auf) und Abschnitt 4:
Kanal UND Art zusammen -- der eigentliche Grund fuer zwei Reihen.
ZWEI GEGENPROBEN:
a) Kanalfilter ausgebaut -> 3 Pruefungen rot
b) Zeile immer anzeigen -> 1 rot, genau der Ein-Kanal-Fall
UND ZWEI FEHLER IN DER PRUEFUNG SELBST, beide von mir:
* Der Kartenselektor traf nichts, und die Messung meldete "0 -> 0".
Das sah aus wie ein Ergebnis und war keins.
* Beim Berichtigen machte String.replace aus "$$" ein "$" --
seite.$$() wurde zu seite.$(). Der Fehler steht woertlich in den
Hausregeln und hat trotzdem zugeschlagen. Aufgefallen ist er nur,
weil "undefined" in der Ausgabe stand; "0" waere durchgegangen.
* Und eine verlorene Escaping-Ebene machte aus /\s+/ ein /s+/ --
die Pruefung ersetzte jedes "s" durch ein Leerzeichen und las
"Ca per chläft im Wä chekorb". Sie wurde rot, und das war richtig.
Stempel 202609171407.
Co-Authored-By: Claude Opus 5 <[email protected]>
This commit is contained in:
@@ -107,6 +107,14 @@
|
||||
let treffBrett = false;
|
||||
let lage = null;
|
||||
let filter = '';
|
||||
/* WELCHER KANAL -- eine ZWEITE Dimension neben `filter`, nicht
|
||||
derselbe Wert.
|
||||
|
||||
Ein gemeinsamer Wert wäre einfacher zu bauen und falsch zu
|
||||
benutzen: Man könnte dann „nur offene" ODER „nur HasiDog" fragen,
|
||||
aber nie beides. Und genau das will man, sobald aus drei Kanälen
|
||||
Videos nebeneinander liegen. */
|
||||
let kanalFilter = '';
|
||||
/* Nur beim ersten Laden springen -- sonst reisst es die Seite nach
|
||||
jeder Bewertung erneut an dieselbe Stelle. */
|
||||
let gesprungen = false;
|
||||
@@ -908,7 +916,7 @@
|
||||
} catch { /* dann gilt die alte Regel, siehe darfEintragen */ }
|
||||
}
|
||||
|
||||
function filterBauen() {
|
||||
function filterBauen(eintraege = []) {
|
||||
const ziel = $('filter');
|
||||
ziel.textContent = '';
|
||||
const knopf = (wert, text) => {
|
||||
@@ -921,6 +929,47 @@
|
||||
ziel.append(knopf('', 'Alle'));
|
||||
ziel.append(knopf('offen', 'Nur offene'));
|
||||
for (const [wert, name] of Object.entries(einstellung.arten)) ziel.append(knopf(wert, name));
|
||||
|
||||
/* ---- UND DIE KANALZEILE, wenn hier Videos liegen ----------------
|
||||
|
||||
SIE ERSCHEINT NUR, WENN ES ETWAS ZU FILTERN GIBT. Die Kanäle
|
||||
werden aus den vorhandenen Einträgen abgeleitet, nicht
|
||||
aufgezählt: Auf einem Brett ohne Videos steht keine leere Leiste,
|
||||
und auf einem mit nur einem Kanal steht kein Filter, der nichts
|
||||
tut. Ein Knopf, der immer dasselbe zeigt, macht misstrauisch.
|
||||
|
||||
ERST AB ZWEI KANÄLEN. Bei einem gibt es nichts zu wählen. */
|
||||
const kanaele = [...new Set(eintraege.map((e) => e.quelle_kanal).filter(Boolean))];
|
||||
if (kanaele.length < 2) { kanalFilter = ''; return; }
|
||||
|
||||
const zweite = el('div', 'filter__kanaele');
|
||||
zweite.setAttribute('role', 'group');
|
||||
zweite.setAttribute('aria-label', 'Nach Kanal filtern');
|
||||
const kanalKnopf = (wert, text, zahl) => {
|
||||
const b = el('button', 'schritt filter__kanal', text);
|
||||
b.type = 'button';
|
||||
if (wert) b.dataset.kanal = wert;
|
||||
b.setAttribute('aria-pressed', String(kanalFilter === wert));
|
||||
if (zahl !== null) b.append(el('span', 'filter__kanal-zahl', String(zahl)));
|
||||
b.addEventListener('click', async () => {
|
||||
/* Ein zweiter Klick auf denselben Kanal hebt ihn auf -- sonst
|
||||
sucht man den Weg zurück zu „Alle Kanäle" und findet ihn
|
||||
nicht, weil man nicht mehr weiß, dass man gefiltert hat. */
|
||||
kanalFilter = (kanalFilter === wert) ? '' : wert;
|
||||
await laden();
|
||||
});
|
||||
return b;
|
||||
};
|
||||
zweite.append(kanalKnopf('', 'Alle Kanäle', null));
|
||||
/* IN DER REIHENFOLGE VON KANAL_WORT, nicht in der, in der die
|
||||
Einträge zufällig kommen. Sonst springen die Knöpfe, sobald
|
||||
jemand ein Video einfügt. */
|
||||
for (const wert of Object.keys(KANAL_WORT)) {
|
||||
if (!kanaele.includes(wert)) continue;
|
||||
zweite.append(kanalKnopf(wert, KANAL_WORT[wert],
|
||||
eintraege.filter((e) => e.quelle_kanal === wert).length));
|
||||
}
|
||||
ziel.append(zweite);
|
||||
}
|
||||
|
||||
/* WAS AUS DEN EINTRAEGEN GEWORDEN IST -- einmal fuer das ganze Brett.
|
||||
@@ -1061,7 +1110,7 @@
|
||||
einstellung = daten.einstellung;
|
||||
treffBrett = !!daten.treff;
|
||||
await lageHolen();
|
||||
filterBauen();
|
||||
filterBauen(daten.eintraege || []);
|
||||
|
||||
const ziel = $('liste');
|
||||
ziel.textContent = '';
|
||||
@@ -1080,6 +1129,10 @@
|
||||
else delete ziel.dataset.aushang;
|
||||
|
||||
const sichtbar = daten.eintraege.filter((e) => {
|
||||
/* DER KANAL ZUERST und als eigene Bedingung: Er schließt den
|
||||
Art-Filter nicht aus, er kommt dazu. „Nur offene Clips von
|
||||
HasiDog" ist eine sinnvolle Frage. */
|
||||
if (kanalFilter && e.quelle_kanal !== kanalFilter) return false;
|
||||
if (!filter) return true;
|
||||
if (filter === 'offen') return e.status === 'offen';
|
||||
return e.art === filter;
|
||||
|
||||
Reference in New Issue
Block a user