Gelesene Antworten rutschen zur Seite -- statt sich zu stapeln
VanVan im Support, Meldung #15: „Die Modis können die Antworten auf die Bewerbungen im Bereich eure Aufgaben noch nicht einklappen. Das wird mit der Zeit unübersichtlich." WARUM ES NICHT EINFACH EIN SCHALTER GEWORDEN IST Am 30.09. habe ich diesen Kasten absichtlich NICHT einklappbar gebaut, und die Begruendung steht woertlich im Quelltext: „Eine Antwort, die man erst aufklappen muss, ist wieder keine." Sie ist richtig -- fuer eine Antwort, die man noch nicht gelesen hat. Danach ist sie falsch herum, und genau das meldet VanVan. Ein Schalter, der alles wegklappt, haette die naechste Absage mitversteckt: die Zeile, derentwegen der Kasten ueberhaupt entstanden ist. Deshalb nicht „einklappbar", sondern GELESEN: · Was noch niemand quittiert hat, steht offen da -- wie bisher. · „Verstanden" schiebt eine Zeile hinter „N ältere Antworten", zugeklappt, jederzeit wieder aufzumachen. Nichts wird geloescht; eine Absage samt Begruendung wegzuwerfen, weil jemand sie einmal gelesen hat, waere das Gegenteil des Umbaus vom 30.09. · Ab zwei offenen Antworten gibt es „Alle N verstanden" -- wer nach dem Urlaub sieben vorfindet, soll nicht siebenmal tippen, und sieben Anfragen waeren sieben Gelegenheiten, dass eine verloren geht. AM MENSCHEN, NICHT AM GERAET `gesehen_am` steht in `vorlagen_bewerbungen`, nicht im Browserspeicher. „Habe ich das gelesen?" ist eine Frage ueber die Person: Sonst waere dieselbe Antwort auf dem Handy wieder neu, nachdem man sie am Rechner gelesen hat -- und das waere genau die Unuebersichtlichkeit, die gemeldet wurde, nur eine Tuer weiter. Das AUFKLAPPEN der aelteren bleibt dagegen im Augenblick: kein Zustand, den man mitschleppt. Nach dem Neuladen ist wieder zu. GEGEN FREMDE ZEILEN GESCHUETZT: Nur die eigenen, nur die beantworteten, 404 statt 403 -- wie ueberall im Haus. Ein zweites „Verstanden" zaehlt nicht noch einmal, sonst wanderte die Zeile bei jedem Klick ans Ende und man saehe nicht mehr, wann man sie wirklich gelesen hat. WAS ICH FALSCH ERWARTET HATTE: Meine erste Pruefung verlangte, dass nach einem „Verstanden" OBEN NICHTS mehr steht. Sie wurde rot -- Frida hatte zwei Antworten, und der Knopf gilt je Zeile. Die Pruefung hatte recht; dass er nur seine eigene Zeile nimmt, ist das gewollte Verhalten und steht jetzt als Aussage dort. NEBENBEI: Ein 11,2-px-Pfeil (gemeldet von pruef-css-klassen). Unter 11,5 px faengt im Haus die Grenze an, ab der man zusammenkneift -- dass es „nur ein Zeichen" ist, aendert daran nichts. GEPRUEFT pruef-bewerbung-aufgaben 164 -> 178 ok Im echten Browser, am Handy (390 px): die ungelesene Antwort steht offen mit „Verstanden", danach ist genau diese eine Zeile weg (2 -> 1), sie liegt hinter „1 ältere Antwort", zugeklappt wird sie gar nicht erst gebaut, aufgeklappt steht sie samt Begruendung wieder da, „Alle verstanden" raeumt den Rest, nach dem Neuladen gilt beides weiter als gelesen und ist wieder zu. Am Server: fremde Antwort 404, erfundene Nummer 404, zweites „Verstanden" zaehlt 0. pruef-struktur 102 ok, 414 Routen (eine neue) · pruef-css-klassen · pruef-zeichen 7 · pruef-modi-katalog 150 · pruef-vorlagen 24 · pruef-aufgaben-vorlagen 60 NUR DAS AGENTURHAUS. „Eure Aufgaben" liegt unter `/workspace`; am Crew-Haus aendert sich keine Zeile. Co-Authored-By: Claude Opus 5 <[email protected]>
This commit is contained in:
@@ -2111,6 +2111,67 @@
|
||||
color: var(--text-leise);
|
||||
}
|
||||
|
||||
/* ---- „Verstanden" und die älteren Antworten (03.10.2026) ---------
|
||||
|
||||
VanVan im Support, Meldung #15: „Die Modis können die Antworten auf
|
||||
die Bewerbungen im Bereich eure Aufgaben noch nicht einklappen. Das
|
||||
wird mit der Zeit unübersichtlich."
|
||||
|
||||
DER KNOPF STEHT RECHTS UND IST KLEIN. Er ist nicht die Hauptsache
|
||||
der Zeile — die ist die Antwort. `margin-left: auto` schiebt ihn
|
||||
ans Ende, damit die Augen beim Lesen nicht über ihn stolpern.
|
||||
44 Pixel hoch bleibt er trotzdem: dieselbe Daumengrenze wie
|
||||
überall im Haus. */
|
||||
.vorlagenbrett__antwort-weg {
|
||||
margin-left: auto;
|
||||
min-height: 44px;
|
||||
padding: 0 12px;
|
||||
font: inherit; font-size: .82rem;
|
||||
color: var(--text-still);
|
||||
background: transparent;
|
||||
border: 1px solid var(--rand);
|
||||
border-radius: 999px;
|
||||
cursor: pointer;
|
||||
white-space: nowrap;
|
||||
}
|
||||
.vorlagenbrett__antwort-weg:hover,
|
||||
.vorlagenbrett__antwort-weg:focus-visible {
|
||||
color: var(--text);
|
||||
border-color: color-mix(in srgb, var(--akzent) 55%, var(--rand));
|
||||
}
|
||||
.vorlagenbrett__antwort-alle { justify-self: start; margin-top: 2px; }
|
||||
|
||||
/* DER KASTEN MIT DEN GELESENEN IST LEISER. Er steht da, um nachlesen
|
||||
zu können — nicht, um gesehen zu werden. Deshalb ohne Rahmen und
|
||||
ohne eigenen Grund: Sonst stünden zwei gleich laute Kästen
|
||||
untereinander, und der Unterschied zwischen „neu" und „gelesen"
|
||||
wäre weg. */
|
||||
.vorlagenbrett__antwort[data-alt="ja"] {
|
||||
border-color: transparent;
|
||||
background: transparent;
|
||||
padding: 0;
|
||||
gap: 6px;
|
||||
}
|
||||
.vorlagenbrett__antwort-kopf {
|
||||
display: flex; align-items: center; gap: 8px;
|
||||
min-height: 44px;
|
||||
padding: 0 4px;
|
||||
font: inherit; font-size: .84rem;
|
||||
color: var(--text-still);
|
||||
background: transparent; border: 0;
|
||||
cursor: pointer;
|
||||
text-align: left;
|
||||
}
|
||||
.vorlagenbrett__antwort-kopf:hover,
|
||||
.vorlagenbrett__antwort-kopf:focus-visible { color: var(--text); }
|
||||
/* KEINE EIGENE GROESSE FUER DEN PFEIL. Hier stand `.7rem` = 11,2 px --
|
||||
`pruef-css-klassen` hat es gemeldet, und zu Recht: Unter 11,5 px
|
||||
faengt im Haus die Grenze an, ab der man zusammenkneift. Dass es
|
||||
„nur ein Zeichen" ist, aendert daran nichts; geerbt sind es
|
||||
.84rem, und das Dreieck ist damit immer noch kleiner als der
|
||||
Text daneben wirkt. */
|
||||
.vorlagenbrett__antwort-pfeil { line-height: 1; }
|
||||
|
||||
/* ---- Was wir schon abgesagt haben --------------------------------
|
||||
ZUGEKLAPPT, solange niemand hinsieht. Es ist eine Auskunft zum
|
||||
Nachschlagen, kein Aushang: Eine Liste von Absagen, die immer offen
|
||||
|
||||
@@ -177,6 +177,10 @@
|
||||
let absagen = null;
|
||||
let darfEntscheidenV = false;
|
||||
let darfVerteilenV = false;
|
||||
/* Ob die gelesenen Antworten gerade aufgeklappt sind. Nur Anzeige,
|
||||
deshalb hier und nicht am Server: Wer nachlesen will, macht auf;
|
||||
beim naechsten Laden ist wieder zu, und das ist richtig so. */
|
||||
let aeltereOffen = false;
|
||||
let vBereich = 'live';
|
||||
let vStufe = 'anfaenger';
|
||||
|
||||
@@ -559,12 +563,25 @@
|
||||
Absage daneben wäre eine Liste, die nur schlechte Nachrichten
|
||||
sammelt. */
|
||||
if (antworten.length) {
|
||||
const band = el('div', 'vorlagenbrett__antwort');
|
||||
band.append(el('p', 'vorlagenbrett__antwort-schild',
|
||||
antworten.length === 1
|
||||
? 'Antwort auf deine Bewerbung:'
|
||||
: `${antworten.length} Antworten auf deine Bewerbungen:`));
|
||||
for (const a2 of antworten) {
|
||||
/* ==== GELESEN RUTSCHT NACH UNTEN (03.10.2026) ==============
|
||||
|
||||
VanVan im Support, Meldung #15: „Die Modis können die
|
||||
Antworten auf die Bewerbungen im Bereich eure Aufgaben noch
|
||||
nicht einklappen. Das wird mit der Zeit unübersichtlich."
|
||||
|
||||
KEIN SCHALTER, DER ALLES WEGKLAPPT. Der hätte auch die
|
||||
nächste Absage mitversteckt — also genau die Zeile, derent-
|
||||
wegen dieser Kasten am 30.09. überhaupt entstanden ist.
|
||||
Stattdessen: Was man mit „Verstanden" quittiert hat, wandert
|
||||
hinter eine zugeklappte Zeile. Neues steht weiter offen da.
|
||||
|
||||
Damit gilt die Begründung von vorgestern („eine Antwort, die
|
||||
man erst aufklappen muss, ist wieder keine") unverändert
|
||||
weiter — sie galt immer nur für die UNGELESENE. */
|
||||
const neueA = antworten.filter((a2) => !a2.gesehen);
|
||||
const alteA = antworten.filter((a2) => a2.gesehen);
|
||||
|
||||
const zeileBauen = (a2, mitKnopf) => {
|
||||
const z = el('div', 'vorlagenbrett__antwort-zeile');
|
||||
z.dataset.zustand = a2.zustand;
|
||||
z.append(el('span', 'vorlagenbrett__antwort-wort',
|
||||
@@ -578,9 +595,58 @@
|
||||
'„' + a2.entscheid_text + '“'
|
||||
+ (a2.von_name ? ' – ' + a2.von_name : '')));
|
||||
}
|
||||
band.append(z);
|
||||
if (mitKnopf) {
|
||||
const k = el('button', 'vorlagenbrett__antwort-weg', 'Verstanden');
|
||||
k.type = 'button';
|
||||
k.title = 'Rutscht zu den älteren Antworten – nachlesen kannst du sie weiter.';
|
||||
k.addEventListener('click', () => gesehenMelden(k, { id: a2.id }));
|
||||
z.append(k);
|
||||
}
|
||||
return z;
|
||||
};
|
||||
|
||||
if (neueA.length) {
|
||||
const band = el('div', 'vorlagenbrett__antwort');
|
||||
band.append(el('p', 'vorlagenbrett__antwort-schild',
|
||||
neueA.length === 1
|
||||
? 'Antwort auf deine Bewerbung:'
|
||||
: `${neueA.length} Antworten auf deine Bewerbungen:`));
|
||||
for (const a2 of neueA) band.append(zeileBauen(a2, true));
|
||||
/* AB ZWEI EIN KNOPF FÜR ALLE. Wer nach dem Urlaub sieben
|
||||
Antworten vorfindet, soll nicht siebenmal tippen — und
|
||||
sieben Anfragen wären sieben Gelegenheiten, dass eine
|
||||
unterwegs verlorengeht. */
|
||||
if (neueA.length > 1) {
|
||||
const alleK = el('button', 'abmelden vorlagenbrett__antwort-alle',
|
||||
`Alle ${neueA.length} verstanden`);
|
||||
alleK.type = 'button';
|
||||
alleK.addEventListener('click', () => gesehenMelden(alleK, { alle: true }));
|
||||
band.append(alleK);
|
||||
}
|
||||
ziel.append(band);
|
||||
}
|
||||
|
||||
if (alteA.length) {
|
||||
const band = el('div', 'vorlagenbrett__antwort');
|
||||
band.dataset.alt = 'ja';
|
||||
const kopfA = el('button', 'vorlagenbrett__antwort-kopf');
|
||||
kopfA.type = 'button';
|
||||
kopfA.setAttribute('aria-expanded', aeltereOffen ? 'true' : 'false');
|
||||
kopfA.append(el('span', null, alteA.length === 1
|
||||
? '1 ältere Antwort'
|
||||
: `${alteA.length} ältere Antworten`));
|
||||
kopfA.append(el('span', 'vorlagenbrett__antwort-pfeil', aeltereOffen ? '▴' : '▾'));
|
||||
kopfA.addEventListener('click', () => {
|
||||
aeltereOffen = !aeltereOffen;
|
||||
vorlagenbrettZeigen();
|
||||
});
|
||||
band.append(kopfA);
|
||||
/* ZUGEKLAPPT WIRD GAR NICHT ERST GEBAUT — dieselbe Regel wie
|
||||
beim Brett darunter: Zeilen anzulegen, die niemand sieht,
|
||||
ist Arbeit für nichts. */
|
||||
if (aeltereOffen) for (const a2 of alteA) band.append(zeileBauen(a2, false));
|
||||
ziel.append(band);
|
||||
}
|
||||
ziel.append(band);
|
||||
}
|
||||
|
||||
|
||||
@@ -1611,6 +1677,38 @@
|
||||
return k;
|
||||
}
|
||||
|
||||
/** „Verstanden" — die Antwort zur Kenntnis nehmen.
|
||||
*
|
||||
* DER SERVER MERKT ES SICH, nicht der Browser. Dieselbe Antwort
|
||||
* auf dem Handy noch einmal als neu zu sehen, nachdem man sie am
|
||||
* Rechner gelesen hat, wäre genau die Unübersichtlichkeit, die
|
||||
* VanVan gemeldet hat — nur eine Tür weiter.
|
||||
*
|
||||
* DIE FRISCHE LISTE KOMMT MIT DER ANTWORT. Ein zweiter Abruf
|
||||
* danach wäre eine zweite Gelegenheit zu scheitern, und dann
|
||||
* stünde die Zeile noch da, obwohl sie weg ist. */
|
||||
async function gesehenMelden(knopf, was) {
|
||||
knopf.disabled = true;
|
||||
try {
|
||||
const a = await U.hole('/workspace/api/vorlagen/bewerbung/gesehen', {
|
||||
method: 'POST',
|
||||
headers: { 'Content-Type': 'application/json' },
|
||||
body: JSON.stringify(was),
|
||||
});
|
||||
if (!a.ok) {
|
||||
U.melde('Das hat nicht geklappt.');
|
||||
knopf.disabled = false;
|
||||
return;
|
||||
}
|
||||
const d = await a.json().catch(() => ({}));
|
||||
if (Array.isArray(d.antworten)) antworten = d.antworten;
|
||||
await vorlagenbrettZeigen();
|
||||
} catch {
|
||||
U.melde('Das hat nicht geklappt.');
|
||||
knopf.disabled = false;
|
||||
}
|
||||
}
|
||||
|
||||
async function uebernehmen(knopf, was, fuer) {
|
||||
knopf.disabled = true;
|
||||
const vorher = knopf.textContent;
|
||||
|
||||
Reference in New Issue
Block a user