From 45f5a35afe9f36f9875d5dfb5e33746df0d859c2 Mon Sep 17 00:00:00 2001 From: Dogfather Date: Tue, 15 Sep 2026 14:40:11 +0200 Subject: [PATCH] Die Kategorien lassen sich auf- und zuklappen MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Filipe: "mach das viel geiler alles bitte, ich will auch dass man die kategorien von den fragen, also die liste auf und zu druecken kann mit einem button." ACHTUNDZWANZIG PUNKTE OFFEN SIND RUND ZWEI METER SEITE. Man scrollt, verliert die Stelle und macht es beim naechsten Mal gar nicht mehr. - Jede Kategorie hat einen Knopf. Ein Klick wechselt nur DIESEN Abschnitt; die Karte wird nicht neu geholt, sonst springt die Seite bei 28 Punkten unter den Fingern weg. - Der Zustand liegt im Skript, nicht an den Elementen: Nach dem ersten Klick auf einen Punkt zeichnet die Karte sich neu (erst danach darf der Stand der anderen ausgeliefert werden). Am Element klappte dabei alles wieder zu -- mitten in der Arbeit. - Welche zuerst offen steht, ist die eigentliche Entscheidung: die erste, in der noch etwas fehlt. Alle zu hiesse jedes Mal suchen, alle auf waere der Zustand von vorher. - Der Kopf sagt ZUGEKLAPPT, was drin ist: "2 / 8" und, wenn etwas hakt, "1 x hakt". Eine zugeklappte Kategorie, die nichts sagt, klappt man einmal auf und danach nie wieder zu. - Daneben "Alle aufklappen" / "Alle zuklappen" fuer den Durchgang. WAS DAS BILDSCHIRMFOTO AUSSERDEM GEZEIGT HAT, und was ich im Code nicht gesehen haette: Die Karte hatte gar keine eigene Flaeche. "Frida · Modi · 2 von 28 angesehen" lag quer ueber dem Spicy-Media-Schriftzug, der Knopf darunter ueber einer Chilischote. Genau der Fall, fuer den die Kontrastmessung ihren dritten Ausgang hat ("konnte nicht nachsehen") -- ueber einem Foto laesst sich Lesbarkeit nicht ausrechnen. Die Antwort darauf ist keine hellere Schrift, sondern eine deckende Flaeche. Und der Hinweis "(bei 'Da hakt es' noetig)" stand bisher 28 Mal da, auch an Punkten, an denen nichts hakt. Ein Satz, der ueberall steht, wird nirgends gelesen. Jetzt meldet sich das Feld erst, wenn es gebraucht wird -- mit Rahmen in derselben Farbe wie die Antwort, und der Mauszeiger springt hinein. Beim Nachsehen im Bild gefunden: "2 von 28 angesehen" stand danach zweimal auf demselben Bildschirm. Zweimal dieselbe Zahl laesst einen ueberlegen, ob es zwei verschiedene sind. server/pruef-schritt.mjs 57 Pruefungen (vorher 46), 0 Fehler Der Knopf wird wirklich gedrueckt -- ein Knopf, den niemand betaetigt hat, ist kein geprueter Knopf. pruef-css-klassen, pruef-entwicklung 43, pruef-neue-seiten 93, pruef-nachwuchs 123 -- alle 0 Fehler Co-Authored-By: Claude Opus 5 --- server/pruef-schritt.mjs | 59 ++++++++++++ workspace/app.webmanifest | 8 +- workspace/assets/css/entwicklung.css | 123 +++++++++++++++++++++++- workspace/assets/js/entwicklung.js | 137 ++++++++++++++++++++++++++- workspace/aufgaben.html | 24 ++--- workspace/automation.html | 26 ++--- workspace/befinden.html | 24 ++--- workspace/bereich.html | 34 +++---- workspace/calls.html | 28 +++--- workspace/chat.html | 26 ++--- workspace/content.html | 30 +++--- workspace/crew-index.html | 10 +- workspace/crew.webmanifest | 8 +- workspace/dateien.html | 26 ++--- workspace/entwicklung.html | 24 ++--- workspace/index.html | 8 +- workspace/kalender.html | 28 +++--- workspace/leistung.html | 26 ++--- workspace/personen.html | 26 ++--- workspace/profil.html | 28 +++--- workspace/rechte.html | 24 ++--- workspace/report.html | 28 +++--- workspace/scouting.html | 26 ++--- workspace/start.html | 24 ++--- workspace/startcheck.html | 28 +++--- workspace/steckbrief.html | 28 +++--- workspace/talente.html | 24 ++--- workspace/team.html | 26 ++--- workspace/teamlage.html | 24 ++--- workspace/treff-moderation.html | 24 ++--- workspace/treff-regeln.html | 26 ++--- workspace/uebersicht.html | 26 ++--- workspace/wissen.html | 26 ++--- 33 files changed, 669 insertions(+), 368 deletions(-) diff --git a/server/pruef-schritt.mjs b/server/pruef-schritt.mjs index f3c4deb6..daf00a8b 100644 --- a/server/pruef-schritt.mjs +++ b/server/pruef-schritt.mjs @@ -341,6 +341,65 @@ melde("=== 8. Im Browser ==="); await seite.click('.e-person:has-text("Frida")'); await seite.waitForTimeout(900); + /* ===== DIE KATEGORIEN KLAPPEN AUF UND ZU (15.09.2026) ============== + + Filipe: „ich will auch dass man die kategorien von den fragen, also + die liste auf und zu drücken kann mit einem button." + + Geprüft wird nicht, dass es einen Knopf GIBT -- sondern dass er + etwas tut, und dass zugeklappt trotzdem dasteht, was drin ist. + ================================================================ */ + const bloecke = await seite.evaluate(() => { + const b = [...document.querySelectorAll(".e-block")]; + return { + anzahl: b.length, + offen: b.filter((x) => x.dataset.offen === "ja").length, + schalter: document.querySelectorAll(".e-block__schalter").length, + staende: [...document.querySelectorAll(".e-block__stand")].map((x) => x.textContent.trim()), + hakt: [...document.querySelectorAll(".e-block__hakt")].map((x) => x.textContent.trim()), + versteckt: b.filter((x) => x.querySelector(".e-block__koerper")?.hidden).length, + alleKnopf: document.querySelector(".e-bloecke__alle")?.textContent.trim() || "", + }; + }); + ok(bloecke.anzahl === 4, `${bloecke.anzahl} Kategorien stehen auf der Karte`); + ok(bloecke.schalter === bloecke.anzahl, "jede hat einen Knopf zum Auf- und Zuklappen"); + /* GENAU EINE STEHT OFFEN -- die erste, in der noch etwas fehlt. Alle + zu hieße jedes Mal suchen, alle auf wäre der Zustand von vorher. */ + ok(bloecke.offen === 1, `genau eine steht offen (${bloecke.offen})`); + ok(bloecke.versteckt === bloecke.anzahl - 1, + `die anderen ${bloecke.versteckt} sind wirklich zugeklappt`); + /* ZUGEKLAPPT MUSS SIE TROTZDEM ETWAS SAGEN. */ + ok(bloecke.staende.length === bloecke.anzahl + && bloecke.staende.every((x) => x.includes(' / ')), + `jeder Kopf sagt, wie weit er ist (${bloecke.staende.join(", ")})`); + ok(bloecke.hakt.some((x) => /hakt/.test(x)), + `und wo etwas hakt, steht es im Kopf (${bloecke.hakt.join(", ") || "nichts"})`); + ok(/Alle aufklappen/.test(bloecke.alleKnopf), + `daneben einer für alle auf einmal („${bloecke.alleKnopf}“)`); + + /* UND JETZT WIRKLICH DRÜCKEN. Ein Knopf, den niemand betätigt hat, + ist kein geprüfter Knopf. */ + await seite.click(".e-block:not([data-offen='ja']) .e-block__schalter"); + await seite.waitForTimeout(250); + const nachKlick = await seite.evaluate(() => ({ + offen: document.querySelectorAll('.e-block[data-offen="ja"]').length, + ausgeklappt: [...document.querySelectorAll(".e-block__schalter")] + .filter((x) => x.getAttribute("aria-expanded") === "true").length, + })); + ok(nachKlick.offen === 2, `nach einem Klick stehen zwei offen (${nachKlick.offen})`); + ok(nachKlick.ausgeklappt === 2, + "und ein Vorleseprogramm erfährt dasselbe (aria-expanded)"); + + await seite.click(".e-bloecke__alle"); + await seite.waitForTimeout(400); + const alle = await seite.evaluate(() => ({ + offen: document.querySelectorAll('.e-block[data-offen="ja"]').length, + knopf: document.querySelector(".e-bloecke__alle")?.textContent.trim() || "", + })); + ok(alle.offen === 4, `„Alle aufklappen“ öffnet alle vier (${alle.offen})`); + ok(/Alle zuklappen/.test(alle.knopf), + `und der Knopf heißt danach anders („${alle.knopf}“)`); + const stand = await seite.evaluate(() => ({ punkte: document.querySelectorAll(".e-punkt").length, laeuft: document.querySelectorAll('.e-schritt[data-lage="laeuft"]').length, diff --git a/workspace/app.webmanifest b/workspace/app.webmanifest index 0f00e6f8..452ab53b 100644 --- a/workspace/app.webmanifest +++ b/workspace/app.webmanifest @@ -13,25 +13,25 @@ "theme_color": "#06090f", "icons": [ { - "src": "/assets/img/app-symbole/workspace-192.png?v=202609151430", + "src": "/assets/img/app-symbole/workspace-192.png?v=202609151438", "sizes": "192x192", "type": "image/png", "purpose": "any" }, { - "src": "/assets/img/app-symbole/workspace-512.png?v=202609151430", + "src": "/assets/img/app-symbole/workspace-512.png?v=202609151438", "sizes": "512x512", "type": "image/png", "purpose": "any" }, { - "src": "/assets/img/app-symbole/workspace-192-maskable.png?v=202609151430", + "src": "/assets/img/app-symbole/workspace-192-maskable.png?v=202609151438", "sizes": "192x192", "type": "image/png", "purpose": "maskable" }, { - "src": "/assets/img/app-symbole/workspace-512-maskable.png?v=202609151430", + "src": "/assets/img/app-symbole/workspace-512-maskable.png?v=202609151438", "sizes": "512x512", "type": "image/png", "purpose": "maskable" diff --git a/workspace/assets/css/entwicklung.css b/workspace/assets/css/entwicklung.css index d52672d0..df2c6293 100644 --- a/workspace/assets/css/entwicklung.css +++ b/workspace/assets/css/entwicklung.css @@ -90,10 +90,26 @@ /* --------------------------------------------------------------------- Die Karte ------------------------------------------------------------------- */ -.e-karte { margin: 26px 0 0; } +/* DIE KARTE BEKOMMT EINE EIGENE FLÄCHE (15.09.2026). + + Bis heute hatte sie keine: Name, Rolle und der Weg zum Notizbrett + standen direkt auf der Bühne — also auf einem Foto. Im Bildschirmfoto + lag „Frida · Modi · 2 von 28 angesehen" quer über dem Spicy-Media- + Schriftzug, und der Knopf darunter über einer Chilischote. + + Das ist genau der Fall, für den die Kontrastmessung ihren dritten + Ausgang hat („konnte nicht nachsehen"): Über einem Foto lässt sich + Lesbarkeit nicht ausrechnen, weil das Dahinter von Bild zu Bild + wechselt. Die Antwort darauf ist keine hellere Schrift, sondern eine + deckende Fläche. */ +.e-karte { + margin: 26px 0 0; padding: 18px 20px; + background: color-mix(in srgb, var(--tinte) 92%, #ffffff 8%); + border: 1px solid var(--rand); +} .e-karte__kopf { display: flex; flex-wrap: wrap; align-items: baseline; gap: 10px; - padding-bottom: 10px; margin-bottom: 16px; + padding-bottom: 12px; margin-bottom: 16px; border-bottom: 1px solid var(--rand-hell); } .e-karte__name { margin: 0; font-size: 1.22rem; font-weight: 660; color: var(--text); } @@ -119,7 +135,87 @@ /* --------------------------------------------------------------------- Ein Block und seine Punkte ------------------------------------------------------------------- */ -.e-block { margin: 0 0 26px; } +/* ===================================================================== + DIE KATEGORIEN LASSEN SICH AUF- UND ZUKLAPPEN (15.09.2026) + + Filipe: „ich will auch dass man die kategorien von den fragen, also + die liste auf und zu drücken kann mit einem button." + + Achtundzwanzig Punkte offen sind rund zwei Meter Seite. Man scrollt, + verliert die Stelle und macht es beim nächsten Mal gar nicht mehr. + + DER KOPF MUSS ZUGEKLAPPT ETWAS SAGEN, sonst klappt man einmal auf und + danach nie wieder zu. Er trägt deshalb drei Dinge: den Namen, wie + weit die Kategorie ist (3 / 7) und ob darin etwas hakt. + ===================================================================== */ +.e-bloecke__leiste { + display: flex; flex-wrap: wrap; align-items: center; gap: 12px; + margin: 0 0 14px; +} +.e-bloecke__alle { + font: inherit; font-size: .81rem; font-weight: 600; + padding: 7px 14px; border-radius: 999px; cursor: pointer; + color: var(--text-leise); + background: transparent; + border: 1px solid var(--rand-hell); + transition: background .16s ease, color .16s ease; +} +.e-bloecke__alle:hover { color: var(--text); background: rgba(255, 255, 255, .05); } +.e-bloecke__alle:focus-visible { outline: 2px solid var(--akzent); outline-offset: 2px; } + +.e-block { + margin: 0 0 10px; + border: 1px solid var(--rand); + background: color-mix(in srgb, var(--tinte) 96%, #ffffff 4%); +} +/* Offen bekommt der Kasten etwas mehr Gewicht -- man soll auf einen + Blick sehen, welcher gerade aufgeschlagen ist. */ +.e-block[data-offen="ja"] { border-color: var(--rand-hell); } + +.e-block__zeile { margin: 0; } +.e-block__schalter { + display: flex; align-items: center; gap: 11px; + width: 100%; text-align: left; + font: inherit; + padding: 13px 15px; cursor: pointer; + background: transparent; border: 0; + color: var(--text); +} +.e-block__schalter:hover { background: rgba(255, 255, 255, .04); } +.e-block__schalter:focus-visible { outline: 2px solid var(--akzent); outline-offset: -2px; } + +.e-block__pfeil { + flex: 0 0 auto; width: 18px; height: 18px; + fill: none; stroke: var(--text-still); stroke-width: 2; + stroke-linecap: round; stroke-linejoin: round; + transition: transform .18s ease; +} +.e-block[data-offen="ja"] .e-block__pfeil { transform: rotate(90deg); stroke: var(--text-leise); } + +.e-block__name { + flex: 1 1 auto; font-size: 1rem; font-weight: 650; color: var(--text); +} +/* Der Stand. Zahlen in Tabellenbreite, damit 3 / 7 und 10 / 12 + untereinander nicht wackeln. */ +.e-block__stand { + flex: 0 0 auto; font-size: .82rem; color: var(--text-still); + font-variant-numeric: tabular-nums; + padding: 2px 9px; border-radius: 999px; border: 1px solid var(--rand); +} +.e-block__stand[data-fertig="ja"] { + color: #7fb08a; border-color: color-mix(in srgb, #668e6e 50%, transparent); +} +/* „2 × hakt" -- die einzige Stelle im Kopf, die eine Farbe bekommt. + Sie ist auch der einzige Grund, eine zugeklappte Kategorie zu + oeffnen, ohne dass man sie durchgehen will. */ +.e-block__hakt { + flex: 0 0 auto; display: inline-flex; align-items: baseline; gap: 4px; + font-size: .78rem; color: #d8a76a; + font-variant-numeric: tabular-nums; +} +.e-block__hakt-wort { font-size: .78rem; } + +.e-block__koerper { padding: 0 15px 13px; } .e-block__titel { margin: 0 0 4px; font-size: 1.02rem; font-weight: 650; color: var(--text); } .e-block__satz { margin: 0 0 12px; max-width: 64ch; @@ -204,8 +300,22 @@ color: var(--text); background: rgba(0, 0, 0, .28); border: 1px solid var(--rand); + transition: border-color .16s ease, background .16s ease; } .e-punkt__anlass::placeholder { color: var(--text-still); } +/* ES BLEIBT SICHTBAR, AUCH WENN ES NICHT GEBRAUCHT WIRD -- ein Feld, + das erst aufklappt, kostet einen zweiten Blick, und genau an der + Stelle hört man auf zu schreiben. Aber es tritt zurück. */ +.e-punkt__anlass[data-noetig="nein"] { + background: rgba(0, 0, 0, .18); + border-color: color-mix(in srgb, var(--rand) 70%, transparent); +} +/* Und es meldet sich, sobald es gebraucht wird. */ +.e-punkt__anlass[data-noetig="ja"] { + border-color: color-mix(in srgb, #cc9451 55%, transparent); + background: rgba(0, 0, 0, .3); +} +.e-punkt__anlass[data-noetig="ja"]::placeholder { color: #c99a62; } .e-punkt__andere, .e-punkt__verdeckt, .e-punkt__wann { margin: 8px 0 0; font-size: .78rem; line-height: 1.5; color: var(--text-still); @@ -355,7 +465,12 @@ .t-fuss a { color: var(--text-leise); } @media (prefers-reduced-motion: reduce) { - .e-person, .e-wahl__knopf, .t-merkmal { transition: none; } + .e-person, .e-wahl__knopf, .t-merkmal, + .e-bloecke__alle, .e-punkt__anlass { transition: none; } + /* Der Pfeil DREHT SICH weiterhin -- er ist keine Verzierung, + sondern die Auskunft "offen oder zu". Nur der Weg dorthin + faellt weg. */ + .e-block__pfeil { transition: none; } } @media (max-width: 620px) { diff --git a/workspace/assets/js/entwicklung.js b/workspace/assets/js/entwicklung.js index df9632f6..8f98464b 100644 --- a/workspace/assets/js/entwicklung.js +++ b/workspace/assets/js/entwicklung.js @@ -40,6 +40,33 @@ } let stufen = []; + + /* WELCHE KATEGORIEN OFFEN STEHEN (15.09.2026). + + Filipe: „ich will auch dass man die kategorien von den fragen, also + die liste auf und zu drücken kann mit einem button." + + Der Zustand liegt hier und nicht an den Elementen: Die Karte wird + nach dem ersten Klick auf einen Punkt neu gezeichnet (erst danach + darf der Stand der anderen ueberhaupt ausgeliefert werden). Waere + er an den Elementen, klappte dabei alles wieder zu -- mitten in der + Arbeit, bei jedem ersten Klick. */ + let offeneBloecke = null; + let karteFuer = null; + + /* Der Pfeil des Aufklappers. Als Zeichnung und nicht als Textzeichen: + „▸" sieht auf jedem Geraet anders aus und faellt bei manchen + Schriften ganz aus. */ + const pfeil = () => { + const s = document.createElementNS('http://www.w3.org/2000/svg', 'svg'); + s.setAttribute('class', 'e-block__pfeil'); + s.setAttribute('viewBox', '0 0 24 24'); + s.setAttribute('aria-hidden', 'true'); + const p = document.createElementNS('http://www.w3.org/2000/svg', 'path'); + p.setAttribute('d', 'M9 6l6 6-6 6'); + s.append(p); + return s; + }; let offen = null; // die gerade geöffnete Person /* ---- Die vier Knöpfe ------------------------------------------------ @@ -160,12 +187,99 @@ ziel.append(box); } - /* ---- Die Blöcke ---------------------------------------------------- */ + /* ---- Die Blöcke, auf- und zuklappbar -------------------------------- + + ACHTUNDZWANZIG PUNKTE SIND ZU VIEL FÜR EINEN BILDSCHIRM. Offen + sind es rund zwei Meter Seite; man scrollt, verliert die Stelle + und macht es beim nächsten Mal gar nicht mehr. + + WELCHER ZUERST OFFEN STEHT, IST DIE EIGENTLICHE ENTSCHEIDUNG. + Alle zu hieße: jedes Mal erst suchen. Alle auf wäre der Zustand + von vorher. Offen steht deshalb die erste Kategorie, in der noch + etwas fehlt — man landet dort, wo die Arbeit ist. Ist alles + gesetzt, steht die erste offen. + ================================================================ */ + if (karteFuer !== id) { karteFuer = id; offeneBloecke = null; } + if (offeneBloecke === null) { + offeneBloecke = new Set(); + const ersteOffene = r.bloecke.find((b) => b.punkte.some((pt) => !pt.meins)) + || r.bloecke[0]; + if (ersteOffene) offeneBloecke.add(ersteOffene.schluessel); + } + + const leiste = el('div', 'e-bloecke__leiste'); + const alleZu = () => r.bloecke.every((b) => offeneBloecke.has(b.schluessel)); + const alleKnopf = el('button', 'e-bloecke__alle'); + alleKnopf.type = 'button'; + const alleBeschriften = () => { + alleKnopf.textContent = alleZu() ? 'Alle zuklappen' : 'Alle aufklappen'; + }; + alleBeschriften(); + alleKnopf.addEventListener('click', () => { + if (alleZu()) offeneBloecke.clear(); + else for (const b of r.bloecke) offeneBloecke.add(b.schluessel); + karte(id); + }); + leiste.append(alleKnopf); + /* HIER STAND KURZ „2 von 28 angesehen" -- dieselbe Zahl, die zwei + Zeilen hoeher schon im Kopf der Karte steht. Zweimal dasselbe auf + einem Bildschirm laesst einen ueberlegen, ob es zwei verschiedene + Zahlen sind. Gesehen habe ich das im Bildschirmfoto, nicht im + Code. */ + ziel.append(leiste); + for (const b of r.bloecke) { + const gesetzt = b.punkte.filter((pt) => pt.meins).length; + const offen = offeneBloecke.has(b.schluessel); + const haktHier = b.punkte.filter((pt) => pt.meins?.stufe === 'hakt').length; + const abschnitt = el('section', 'e-block'); - abschnitt.append(el('h3', 'e-block__titel', b.name)); - abschnitt.append(el('p', 'e-block__satz', b.text)); - for (const pt of b.punkte) abschnitt.append(punktZeile(id, pt, r.erwartung)); + abschnitt.dataset.offen = offen ? 'ja' : 'nein'; + if (gesetzt === b.punkte.length) abschnitt.dataset.fertig = 'ja'; + + const koerper = el('div', 'e-block__koerper'); + koerper.id = `block-${b.schluessel}`; + koerper.hidden = !offen; + + const titel = el('h3', 'e-block__zeile'); + const schalter = el('button', 'e-block__schalter'); + schalter.type = 'button'; + schalter.setAttribute('aria-expanded', String(offen)); + schalter.setAttribute('aria-controls', koerper.id); + schalter.append(pfeil()); + schalter.append(el('span', 'e-block__name', b.name)); + /* DER STAND STEHT IM KOPF, damit man ihn ZUGEKLAPPT sieht. Eine + zugeklappte Kategorie, die nicht sagt, wie weit sie ist, klappt + man einmal auf und danach nie wieder zu. */ + const stand = el('span', 'e-block__stand', `${gesetzt} / ${b.punkte.length}`); + if (gesetzt === b.punkte.length) stand.dataset.fertig = 'ja'; + schalter.append(stand); + if (haktHier) { + const h = el('span', 'e-block__hakt', `${haktHier} ×`); + h.title = haktHier === 1 ? 'Hier hakt ein Punkt.' : `Hier haken ${haktHier} Punkte.`; + h.append(el('span', 'e-block__hakt-wort', 'hakt')); + schalter.append(h); + } + schalter.addEventListener('click', () => { + if (offeneBloecke.has(b.schluessel)) offeneBloecke.delete(b.schluessel); + else offeneBloecke.add(b.schluessel); + /* Nur DIESEN Abschnitt umschalten statt die Karte neu zu holen: + Ein Neuaufbau bei jedem Klick ließe die Seite unter den + Fingern springen -- und bei 28 Punkten sieht man das. */ + const jetztOffen = offeneBloecke.has(b.schluessel); + abschnitt.dataset.offen = jetztOffen ? 'ja' : 'nein'; + koerper.hidden = !jetztOffen; + schalter.setAttribute('aria-expanded', String(jetztOffen)); + alleBeschriften(); + }); + titel.append(schalter); + abschnitt.append(titel); + + /* Der erklärende Satz gehört in den Körper, nicht in den Kopf: + Zugeklappt will man die Überschrift lesen, nicht einen Absatz. */ + koerper.append(el('p', 'e-block__satz', b.text)); + for (const pt of b.punkte) koerper.append(punktZeile(id, pt, r.erwartung)); + abschnitt.append(koerper); ziel.append(abschnitt); } } @@ -193,7 +307,18 @@ const feld = el('textarea', 'e-punkt__anlass'); feld.rows = 2; feld.value = pt.meins?.anlass || ''; - feld.placeholder = 'Woran hast du das gemerkt? (bei „Da hakt es" nötig)'; + /* DER HINWEIS STAND BISHER ACHTUNDZWANZIGMAL DA -- auch an Punkten, + an denen nichts hakt. Ein Satz, der überall steht, wird nirgends + gelesen. Jetzt sagt das Feld erst dann, dass es gebraucht wird, + wenn es gebraucht wird. */ + const feldSetzen = (stufe) => { + const noetig = stufe === 'hakt'; + feld.dataset.noetig = noetig ? 'ja' : 'nein'; + feld.placeholder = noetig + ? 'Woran hast du das gemerkt? Ein Satz genügt – ohne ihn wird daraus kein Schritt.' + : 'Woran hast du das gemerkt? (kann leer bleiben)'; + }; + feldSetzen(pt.meins?.stufe || null); z.append(knopfsatz(pt.meins?.stufe || null, async (stufe, knopf) => { const reihe = knopf.parentElement; @@ -201,6 +326,8 @@ b.setAttribute('aria-pressed', String(b === knopf)); } z.dataset.stufe = stufe; + feldSetzen(stufe); + if (stufe === 'hakt' && !feld.value.trim()) feld.focus(); const a = await hole(`/workspace/api/entwicklung/person/${personId}/${pt.schluessel}`, { method: 'PUT', headers: { 'Content-Type': 'application/json' }, diff --git a/workspace/aufgaben.html b/workspace/aufgaben.html index d8056446..94c4fa30 100644 --- a/workspace/aufgaben.html +++ b/workspace/aufgaben.html @@ -12,19 +12,19 @@ Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite eine Flaeche sind statt zweier. --> - - - - - - + + + + + + - + @@ -282,10 +282,10 @@ - - - - - + + + + + diff --git a/workspace/automation.html b/workspace/automation.html index 2e71bc53..07f16f71 100644 --- a/workspace/automation.html +++ b/workspace/automation.html @@ -12,20 +12,20 @@ Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite eine Flaeche sind statt zweier. --> - - - - - - - + + + + + + + - + @@ -168,10 +168,10 @@ - - - - - + + + + + diff --git a/workspace/befinden.html b/workspace/befinden.html index 80431225..c925c0b9 100644 --- a/workspace/befinden.html +++ b/workspace/befinden.html @@ -7,14 +7,14 @@ - - - - - - - - + + + + + + + + @@ -84,9 +84,9 @@ - - - - + + + + diff --git a/workspace/bereich.html b/workspace/bereich.html index 29a2c438..28e5bdf6 100644 --- a/workspace/bereich.html +++ b/workspace/bereich.html @@ -12,20 +12,20 @@ Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite eine Flaeche sind statt zweier. --> - - - - - - - + + + + + + + - + @@ -181,14 +181,14 @@ - - - - - - - - - + + + + + + + + + diff --git a/workspace/calls.html b/workspace/calls.html index adcf809d..5c47ecc9 100644 --- a/workspace/calls.html +++ b/workspace/calls.html @@ -12,20 +12,20 @@ Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite eine Flaeche sind statt zweier. --> - - - - - - - + + + + + + + - + @@ -89,11 +89,11 @@ - - - - - - + + + + + + diff --git a/workspace/chat.html b/workspace/chat.html index b02c8a9a..2c2efb11 100644 --- a/workspace/chat.html +++ b/workspace/chat.html @@ -12,26 +12,26 @@ Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite eine Flaeche sind statt zweier. --> - - - - + + + + - - - + + + - + @@ -341,10 +341,10 @@ - - - - - + + + + + diff --git a/workspace/content.html b/workspace/content.html index 97c82f6f..49cefb0e 100644 --- a/workspace/content.html +++ b/workspace/content.html @@ -12,20 +12,20 @@ Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite eine Flaeche sind statt zweier. --> - - - - - - - + + + + + + + - + @@ -179,12 +179,12 @@ - - - - - - - + + + + + + + diff --git a/workspace/crew-index.html b/workspace/crew-index.html index c359f32e..71add695 100644 --- a/workspace/crew-index.html +++ b/workspace/crew-index.html @@ -36,15 +36,15 @@ - - - + + + - + @@ -339,6 +339,6 @@ - + diff --git a/workspace/crew.webmanifest b/workspace/crew.webmanifest index fffb4773..ce519b12 100644 --- a/workspace/crew.webmanifest +++ b/workspace/crew.webmanifest @@ -13,25 +13,25 @@ "theme_color": "#06090f", "icons": [ { - "src": "/assets/img/app-symbole/crew-192.png?v=202609151430", + "src": "/assets/img/app-symbole/crew-192.png?v=202609151438", "sizes": "192x192", "type": "image/png", "purpose": "any" }, { - "src": "/assets/img/app-symbole/crew-512.png?v=202609151430", + "src": "/assets/img/app-symbole/crew-512.png?v=202609151438", "sizes": "512x512", "type": "image/png", "purpose": "any" }, { - "src": "/assets/img/app-symbole/crew-192-maskable.png?v=202609151430", + "src": "/assets/img/app-symbole/crew-192-maskable.png?v=202609151438", "sizes": "192x192", "type": "image/png", "purpose": "maskable" }, { - "src": "/assets/img/app-symbole/crew-512-maskable.png?v=202609151430", + "src": "/assets/img/app-symbole/crew-512-maskable.png?v=202609151438", "sizes": "512x512", "type": "image/png", "purpose": "maskable" diff --git a/workspace/dateien.html b/workspace/dateien.html index 4080fb12..1048aaf6 100644 --- a/workspace/dateien.html +++ b/workspace/dateien.html @@ -12,20 +12,20 @@ Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite eine Flaeche sind statt zweier. --> - - - - - - - + + + + + + + - + @@ -108,10 +108,10 @@ - - - - - + + + + + diff --git a/workspace/entwicklung.html b/workspace/entwicklung.html index fbc6dc4a..0c503d57 100644 --- a/workspace/entwicklung.html +++ b/workspace/entwicklung.html @@ -7,14 +7,14 @@ - - - - - - - - + + + + + + + + @@ -102,9 +102,9 @@ - - - - + + + + diff --git a/workspace/index.html b/workspace/index.html index 978ef506..10aab2b8 100644 --- a/workspace/index.html +++ b/workspace/index.html @@ -30,9 +30,9 @@ - - - + + + @@ -401,6 +401,6 @@ - + diff --git a/workspace/kalender.html b/workspace/kalender.html index d3ed1cee..64e2a9c3 100644 --- a/workspace/kalender.html +++ b/workspace/kalender.html @@ -12,20 +12,20 @@ Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite eine Flaeche sind statt zweier. --> - - - - - - - + + + + + + + - + @@ -377,11 +377,11 @@ - - - - - - + + + + + + diff --git a/workspace/leistung.html b/workspace/leistung.html index 7b6ba433..33115cd6 100644 --- a/workspace/leistung.html +++ b/workspace/leistung.html @@ -12,20 +12,20 @@ Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite eine Flaeche sind statt zweier. --> - - - - - - - + + + + + + + - + @@ -423,10 +423,10 @@ - - - - - + + + + + diff --git a/workspace/personen.html b/workspace/personen.html index 036e6b17..ff5b027f 100644 --- a/workspace/personen.html +++ b/workspace/personen.html @@ -12,20 +12,20 @@ Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite eine Flaeche sind statt zweier. --> - - - - - - - + + + + + + + - + @@ -423,10 +423,10 @@ - - - - - + + + + + diff --git a/workspace/profil.html b/workspace/profil.html index e9cf8a42..07361abc 100644 --- a/workspace/profil.html +++ b/workspace/profil.html @@ -12,20 +12,20 @@ Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite eine Flaeche sind statt zweier. --> - - - - - - - + + + + + + + - + @@ -214,11 +214,11 @@ - - - - - - + + + + + + diff --git a/workspace/rechte.html b/workspace/rechte.html index d1f69fa5..558c0fbe 100644 --- a/workspace/rechte.html +++ b/workspace/rechte.html @@ -7,14 +7,14 @@ - - - - - - - - + + + + + + + + @@ -134,9 +134,9 @@ Beim ersten Anlauf fehlte die Zeile auf genau diesen beiden neuen Seiten. Gefunden hat das nicht das Auge, sondern pruef-css-klassen, die seit dem 07.09. jede Seite danach absucht. --> - - - - + + + + diff --git a/workspace/report.html b/workspace/report.html index 277e0711..178176cc 100644 --- a/workspace/report.html +++ b/workspace/report.html @@ -12,20 +12,20 @@ Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite eine Flaeche sind statt zweier. --> - - - - - - - + + + + + + + - + @@ -106,11 +106,11 @@ - - - - - - + + + + + + diff --git a/workspace/scouting.html b/workspace/scouting.html index 651a486e..2f6118f8 100644 --- a/workspace/scouting.html +++ b/workspace/scouting.html @@ -12,20 +12,20 @@ Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite eine Flaeche sind statt zweier. --> - - - - - - - + + + + + + + - + @@ -173,10 +173,10 @@ - - - - - + + + + + diff --git a/workspace/start.html b/workspace/start.html index dadd0daf..d7e95ffd 100644 --- a/workspace/start.html +++ b/workspace/start.html @@ -12,21 +12,21 @@ Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite eine Flaeche sind statt zweier. --> - - - - + + + + - - + + - + @@ -674,10 +674,10 @@

- - - - - + + + + + diff --git a/workspace/startcheck.html b/workspace/startcheck.html index 78708040..b1b83d68 100644 --- a/workspace/startcheck.html +++ b/workspace/startcheck.html @@ -12,20 +12,20 @@ Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite eine Flaeche sind statt zweier. --> - - - - - - - + + + + + + + - + @@ -85,11 +85,11 @@ - - - - - - + + + + + + diff --git a/workspace/steckbrief.html b/workspace/steckbrief.html index b3071594..eba24411 100644 --- a/workspace/steckbrief.html +++ b/workspace/steckbrief.html @@ -12,20 +12,20 @@ Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite eine Flaeche sind statt zweier. --> - - - - - - - + + + + + + + - + @@ -146,11 +146,11 @@ - - - - - - + + + + + + diff --git a/workspace/talente.html b/workspace/talente.html index 929004fa..8a383ab8 100644 --- a/workspace/talente.html +++ b/workspace/talente.html @@ -7,14 +7,14 @@ - - - - - - - - + + + + + + + + @@ -94,9 +94,9 @@ - - - - + + + + diff --git a/workspace/team.html b/workspace/team.html index 34c2193a..4e11bd41 100644 --- a/workspace/team.html +++ b/workspace/team.html @@ -7,20 +7,20 @@ - - - - - - - + + + + + + + - + @@ -110,10 +110,10 @@ - - - - - + + + + + diff --git a/workspace/teamlage.html b/workspace/teamlage.html index 44686973..d442905a 100644 --- a/workspace/teamlage.html +++ b/workspace/teamlage.html @@ -7,20 +7,20 @@ - - - - - - - + + + + + + + - + - - - - + + + + diff --git a/workspace/treff-moderation.html b/workspace/treff-moderation.html index c59381fa..acdbaee5 100644 --- a/workspace/treff-moderation.html +++ b/workspace/treff-moderation.html @@ -7,14 +7,14 @@ - - - - - - - - + + + + + + + + @@ -110,9 +110,9 @@ - - - - + + + + diff --git a/workspace/treff-regeln.html b/workspace/treff-regeln.html index 10f3fea2..b59dec16 100644 --- a/workspace/treff-regeln.html +++ b/workspace/treff-regeln.html @@ -7,18 +7,18 @@ - - - - - - - + + + + + + + - + @@ -210,10 +210,10 @@ Beim ersten Anlauf fehlte die Zeile auf genau diesen beiden neuen Seiten. Gefunden hat das nicht das Auge, sondern pruef-css-klassen, die seit dem 07.09. jede Seite danach absucht. --> - - - - - + + + + + diff --git a/workspace/uebersicht.html b/workspace/uebersicht.html index 36cf67c7..09957726 100644 --- a/workspace/uebersicht.html +++ b/workspace/uebersicht.html @@ -12,22 +12,22 @@ Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite eine Flaeche sind statt zweier. --> - - - - + + + + - - - + + + - + @@ -149,11 +149,11 @@ - + - - - - + + + + diff --git a/workspace/wissen.html b/workspace/wissen.html index 9b3608c3..07436c26 100644 --- a/workspace/wissen.html +++ b/workspace/wissen.html @@ -12,20 +12,20 @@ Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite eine Flaeche sind statt zweier. --> - - - - - - - + + + + + + + - + @@ -190,10 +190,10 @@ - - - - - + + + + +