Aus jedem Fenster kommt man heraus, die Kachel dreht sich, der Eingang sieht aus wie das Haus
VIER DINGE, und das erste ist eine Meldung aus dem Support.
1. MISS KAM AUS "AUFGABE BEARBEITEN" NICHT HERAUS.
„Ich konnte da wieder nicht zurück gehen, musste die App schließen
damit ich wieder auf die Hauptseite kam."
Gemessen (mess-dialog-ausgang.mjs), vier Größen:
412x915 App 782 px Inhalt in 784 px -- knapp ja
412x780 Browser 782 px Inhalt in 742 px -- SACKGASSE
360x640 klein 794 px Inhalt in 602 px -- SACKGASSE
412x430 Tastatur 794 px Inhalt in 392 px -- SACKGASSE
`.dialog` hatte `overflow: hidden`, eine Scroll-Höhe gab es NUR für
`.dialog--breit`. Alles unterhalb des Rands wurde abgeschnitten --
samt "Abbrechen". Jetzt rollt JEDES Fenster, und Kopf wie Knopfzeile
bleiben stehen (`position: sticky`), damit man den Ausgang SIEHT,
ohne erst durch acht Felder zu scrollen. Alle vier Größen: ja.
2. DIE VORLAGENKACHEL DREHT SICH.
„wenn ich drauf drücke dreht sich die kachel und dan seh ich wer es
gemacht hat, und immer noch die option es nochmal zu verteilen falls
neue leute ins team zustoßen."
Vorne bleibt die Kurzfassung ("liegt bei 3 von 4"), hinten stehen
die Namen mit ihrem Stand und zwei Knöpfe: "Nachholen – 1 fehlt"
(oder "Nochmal an alle", wenn wirklich alle sie haben) und "Zurück".
Nach dem Verteilen dreht sie sich von selbst; wer nur nachsehen
will, drückt "Wer hat sie?".
3. DER EINGANG SIEHT AUS WIE DAS HAUS.
Fase und Leuchtschiene statt flachem Kasten, die Schiene in der
Farbe des Stands. Die drei Zahlen werden drei Felder -- und die
"0 neu" leuchtet nicht mehr rot: Eine Warnung, die immer kommt, ist
keine Warnung. Ab 760 px steht das Bild neben dem Text statt
darunter; die Karte war dadurch dreimal so hoch wie nötig.
4. DER CREATOR-KATALOG IST AUF DER TEAM-SEITE WEG.
„es gibt keine creator auf dieser seite" -- dort stand "Wähle oben
einen Creator", eine Aufforderung zu etwas Unmöglichem. Gefragt wird
jetzt nach den Daten (gibt es jemanden, dem ich das geben kann?),
nicht nach der Adresse.
DAZU FERTIG GEMACHT, WAS VON GESTERN OFFEN WAR:
* Die zwei Serien ohne Haus ("Community-Call", "Schulung-Agentur").
Ursache war meine eigene Abschrift: Bei den Terminen frage ich die
Teilnehmerliste, bei den Serien hatte ich sie vergessen. Auf einer
Kopie der echten Datenbank: 0 offene Zeilen.
* Sieben Schreibwege setzen jetzt `haus` (Aufgaben, Einträge,
Dateien, Material, Wissen, Video-Titelbild). Dabei gefunden:
`material` verwaltet seine Spalten SELBST -- meine Spalte stand in
der falschen Liste und fehlte auf einer frischen Datenbank
(78 Fehlschläge in pruef-material, jetzt 159/0).
* unterstuetzen.html lud meldung.js gar nicht -- dort stand das
Maschinenwort des Servers statt eines Satzes (pruef-meldungen 8/0).
DREI VERALTETE PRÜFUNGEN NACHGEZOGEN, jede STRENGER als vorher:
* "der Modi legt eine Aufgabe an (201)" -- seit dem 22.09. ist das
403 und gewollt. Geprüft wird jetzt auch das WORT.
* "calls.html ist verboten" -- Filipe hat die Kachel selbst verlangt
("jeder der einen kalender hat"). Mit Gegenprobe ersetzt.
* "Review" heißt seit dem 20.09. "Zur Freigabe". Der Name wird jetzt
aus STATUS_NAME GELESEN statt abgeschrieben.
GEPRÜFT: modi-katalog 150/0 (war 144), modi-verborgen 85/0 (war 80/2),
haus-trennung 97/0, material 159/0, meldungen 8/0, abbrechen-optik 0
Fehler. Dazu grün: an-alle, vorlagen, support, css-klassen,
aufgabenbrett, aufgaben-vorlagen, unterstuetzung, formulare, loeschen,
nachfrage, kalender, chat, leerzustand.
OFFEN UND NICHT ANGEFASST: pruef-breiten meldet auf report.html ein
Berührziel von 27x18 px. Der Link (`class="zurueck"`) ist auf 30
Seiten derselbe und hat gar keinen eigenen Stil; beanstandet wird nur
diese eine Seite, weil dort hinter ihm nur "· Review" steht und die
Prüfung Fließtext-Links erst ab 12 Zeichen Umgebung ausnimmt. Eine
Klasse auf 30 Seiten ohne Prüflauf zu ändern wäre geraten.
Co-Authored-By: Claude Opus 5 <[email protected]>
This commit is contained in:
@@ -1755,8 +1755,10 @@
|
||||
/* ERST DIE AUFGABEN, DANN DER KATALOG. Er markiert daran, was
|
||||
schon uebernommen wurde -- in umgekehrter Reihenfolge waere die
|
||||
Markierung beim ersten Zeichnen leer. */
|
||||
vorlagenbrettAnschliessen();
|
||||
await window.Vorlagenbrett?.zeigen();
|
||||
/* NUR ZEICHNEN, WENN AUCH EINGERICHTET WURDE. `zeigen()` ohne
|
||||
`einrichten()` liest aus einer Schnittstelle, die es nicht gibt
|
||||
-- ein Fehler in der Konsole und ein halb gezeichneter Kasten. */
|
||||
if (vorlagenbrettAnschliessen()) await window.Vorlagenbrett?.zeigen();
|
||||
})();
|
||||
|
||||
/* =====================================================================
|
||||
@@ -1779,7 +1781,41 @@
|
||||
ZWEIG 'creator': Der Team-Katalog wird hier NICHT gezeigt, auch
|
||||
wenn der Server ihn mitschickt. Er hat seine Seite. */
|
||||
function vorlagenbrettAnschliessen() {
|
||||
if (!window.Vorlagenbrett) return;
|
||||
if (!window.Vorlagenbrett) return false;
|
||||
|
||||
/* ==== OHNE CREATOR KEIN CREATOR-KATALOG (25.09.2026) ============
|
||||
|
||||
Filipe, zu einem Bildschirmfoto dieser Seite: „es gibt keine
|
||||
creator auf dieser seite. die app ist nur fuer modis und
|
||||
community also steht das falsch da."
|
||||
|
||||
Er hatte den Satz „Waehle oben einen Creator, dann lassen sich
|
||||
diese Aufgaben uebernehmen" vor sich -- unter einem Katalog mit
|
||||
vier Bereichen und vier Stufen, der fuer Creator gemacht ist.
|
||||
Auf der Team-Adresse gibt es keine. Der Satz war also nicht nur
|
||||
falsch, sondern eine Aufforderung zu etwas Unmoeglichem: Man
|
||||
sucht oben nach einer Auswahl, die dort nie erscheinen wird.
|
||||
|
||||
GEFRAGT WIRD NACH DEN DATEN, NICHT NACH DER ADRESSE. „Gibt es
|
||||
jemanden, dem ich das geben kann?" ist dieselbe Frage, egal auf
|
||||
welcher Seite man steht -- und sie beantwortet sich aus der
|
||||
Personenliste, die die Seite ohnehin schon geholt hat. Eine
|
||||
Abfrage auf das Haus waere eine zweite Regel neben der
|
||||
Personenliste, und die beiden koennten auseinanderlaufen.
|
||||
|
||||
Ein Creator selbst behaelt den Katalog immer: Er nimmt Aufgaben
|
||||
fuer sich, dafuer braucht er niemanden zum Auswaehlen. */
|
||||
const gibtCreator = ich?.rolle === 'creator'
|
||||
|| (personenListe || []).some((p) => p.rolle === 'creator');
|
||||
if (!gibtCreator) {
|
||||
/* Der ganze Kasten geht weg, nicht nur der Satz. Eine
|
||||
Ueberschrift ueber einem Katalog, den niemand uebernehmen
|
||||
kann, ist dieselbe Sackgasse in leiser. */
|
||||
const kasten = document.getElementById('vorlagenbrett');
|
||||
if (kasten) kasten.hidden = true;
|
||||
return false;
|
||||
}
|
||||
|
||||
window.Vorlagenbrett.einrichten({
|
||||
zweig: 'creator',
|
||||
hole,
|
||||
@@ -1811,6 +1847,7 @@
|
||||
zielWaehlen: () => {},
|
||||
nachAenderung: () => laden(),
|
||||
});
|
||||
return true;
|
||||
}
|
||||
})();
|
||||
|
||||
|
||||
@@ -325,7 +325,13 @@
|
||||
]) {
|
||||
const kasten = el('div', 's-bilanz__feld');
|
||||
kasten.dataset.stand = stand;
|
||||
kasten.append(el('span', 's-bilanz__zahl', String(zahl(stand))));
|
||||
/* OB DAS FELD LEER IST, steht als Merkmal daran -- das Stilblatt
|
||||
faerbt die "neu"-Null damit nicht mehr rot. Gerechnet wird es
|
||||
hier und nicht im CSS: Dort gibt es keine Zahlen, nur Text,
|
||||
und ":empty" traefe eine "0" nicht. */
|
||||
const n = zahl(stand);
|
||||
if (!n) kasten.dataset.leer = 'ja';
|
||||
kasten.append(el('span', 's-bilanz__zahl', String(n)));
|
||||
kasten.append(el('span', 's-bilanz__wort', wort));
|
||||
ziel.append(kasten);
|
||||
}
|
||||
|
||||
@@ -29,6 +29,19 @@
|
||||
===================================================================== */
|
||||
(() => {
|
||||
const $ = (id) => document.getElementById(id);
|
||||
|
||||
/* DER SATZ ZU EINER SERVER-KENNUNG -- mit Rueckfall (25.09.2026).
|
||||
|
||||
Ueber `window` und nicht als blanker Aufruf: Wuerde diese Datei
|
||||
einmal ohne meldung.js geladen, waere `sagWas(...)` ein
|
||||
ReferenceError -- und der traete ausgerechnet dann auf, wenn
|
||||
ohnehin schon etwas schiefgegangen ist. Eine Fehlerbehandlung,
|
||||
die selbst abstuerzt, verschluckt den eigentlichen Fehler.
|
||||
Dieselbe Bauart steht in vorlagenbrett.js und ist dort aus
|
||||
demselben Grund entstanden. */
|
||||
const sagWas = (fehler, ersatz) => (typeof window.sagWas === 'function'
|
||||
? window.sagWas(fehler, ersatz)
|
||||
: (ersatz || 'Das hat nicht geklappt.'));
|
||||
const el = (t, k, text) => {
|
||||
const n = document.createElement(t);
|
||||
if (k) n.className = k;
|
||||
@@ -301,7 +314,13 @@
|
||||
});
|
||||
if (!a.ok) {
|
||||
const r = await a.json().catch(() => ({}));
|
||||
melde(r.fehler || 'Das ließ sich nicht speichern.');
|
||||
/* SATZ STATT MASCHINENWORT (25.09.2026). Hier stand
|
||||
`r.fehler || …` -- also wurde die Kennung des Servers
|
||||
ungefiltert angezeigt. Wer "nicht_gefunden" liest, weiss
|
||||
weder, was los ist, noch was er tun soll. `sagWas` macht
|
||||
daraus den Satz aus meldung.js und faellt auf den Text
|
||||
dahinter zurueck, wenn es die Kennung dort nicht gibt. */
|
||||
melde(sagWas(r.fehler, 'Das ließ sich nicht speichern.'));
|
||||
return;
|
||||
}
|
||||
melde('Gespeichert.', true);
|
||||
@@ -339,7 +358,7 @@
|
||||
});
|
||||
if (!a.ok) {
|
||||
const r = await a.json().catch(() => ({}));
|
||||
melde(r.fehler || 'Das ließ sich nicht anlegen.');
|
||||
melde(sagWas(r.fehler, 'Das ließ sich nicht anlegen.'));
|
||||
return;
|
||||
}
|
||||
await laden();
|
||||
|
||||
@@ -61,6 +61,23 @@
|
||||
? window.sagWas(fehler, ersatz)
|
||||
: (ersatz || 'Das hat nicht geklappt.'));
|
||||
|
||||
/* ==== WELCHE KARTE SICH NACH DEM VERTEILEN ZEIGEN SOLL ==========
|
||||
|
||||
Filipe: „wenn ich drauf drücke dreht sich die kachel und dan seh
|
||||
ich wer es gemacht hat, und immer noch die option es nochmal zu
|
||||
verteilen falls neue leute ins team zustoßen."
|
||||
|
||||
WARUM EIN MERKZETTEL UND KEIN DIREKTES UMSCHALTEN: Nach dem
|
||||
Verteilen wird das ganze Brett NEU gezeichnet (die Zahlen an den
|
||||
Namen stimmen sonst nicht mehr). Eine Karte, die man vorher
|
||||
umdreht, ist danach weg -- samt ihrer Drehung. Der Schluessel
|
||||
ueberlebt das Neuzeichnen; die Karte findet sich selbst wieder.
|
||||
|
||||
EINER UND NICHT EINE LISTE: Man verteilt eine Karte und sieht sie
|
||||
an. Zwei gleichzeitig gedrehte Karten waeren ein Zustand, den
|
||||
niemand hergestellt hat. */
|
||||
let zuletztVerteilt = null;
|
||||
|
||||
/* DIE PFLICHTANGABEN als Liste und nicht als Reihe von if-Abfragen:
|
||||
Eine Liste laesst sich nicht halb vergessen. */
|
||||
const NOETIG = ['zweig', 'hole', 'melde', 'ich', 'aufgaben', 'ziel',
|
||||
@@ -959,10 +976,16 @@
|
||||
ist -- nicht, dass er die Sperre vergessen soll. Bei "alle"
|
||||
fuellt er sonst nur die Luecken; steht hier "Nochmal", haben
|
||||
wirklich alle sie, und dann ist der Druck eine Entscheidung. */
|
||||
k.addEventListener('click', () => uebernehmen(k, {
|
||||
art: 'katalog', nr: v.nr, gruppe: kGruppe,
|
||||
person_id: katalogZiel(), nochmal: wirklichNochmal,
|
||||
}));
|
||||
k.addEventListener('click', () => {
|
||||
/* VOR dem Verteilen merken, nicht danach: `uebernehmen`
|
||||
zeichnet am Ende neu, und dann gibt es diese Karte als
|
||||
Objekt nicht mehr. */
|
||||
if (anAlle) zuletztVerteilt = v.schluessel;
|
||||
uebernehmen(k, {
|
||||
art: 'katalog', nr: v.nr, gruppe: kGruppe,
|
||||
person_id: katalogZiel(), nochmal: wirklichNochmal,
|
||||
});
|
||||
});
|
||||
fuss.append(k);
|
||||
} else if (meine) {
|
||||
/* SCHON BEWORBEN. Der Satz sagt, WER antwortet -- sonst wartet
|
||||
@@ -1025,7 +1048,93 @@
|
||||
: ((U.statusName[a2.status] || a2.status) + (spaet ? ' · überfällig' : ''))));
|
||||
reihe.append(marke);
|
||||
}
|
||||
karte.append(reihe);
|
||||
|
||||
/* ==== DIE KARTE BEKOMMT ZWEI SEITEN (25.09.2026) =============
|
||||
|
||||
Bis heute stand die Namensreihe UNTER der Karte -- immer
|
||||
sichtbar, bei zwoelf Karten also zwoelfmal. Das war Filipes
|
||||
erste Entscheidung und richtig, solange es nur um "wie
|
||||
weit" ging. Jetzt will er das Einzelne auf Druck sehen:
|
||||
„wenn ich drauf drücke dreht sich die kachel".
|
||||
|
||||
VORNE BLEIBT DIE KURZFASSUNG. „liegt bei 3 von 4" steht
|
||||
weiterhin im Fuss -- man soll den Stand ueberfliegen
|
||||
koennen, ohne zwoelf Karten umzudrehen. Die Namen sind die
|
||||
Vertiefung, nicht die Grundauskunft.
|
||||
|
||||
UMGEBAUT STATT NEU GEBAUT: Alles, was schon an der Karte
|
||||
haengt, wandert geschlossen auf die Vorderseite. So kann
|
||||
die Rueckseite nichts vergessen, was vorne steht -- und ein
|
||||
kuenftiger Zusatz landet von selbst richtig. */
|
||||
const vorn = el('div', 'vorlagenbrett__seite vorlagenbrett__seite--vorn');
|
||||
while (karte.firstChild) vorn.append(karte.firstChild);
|
||||
|
||||
const hinten = el('div', 'vorlagenbrett__seite vorlagenbrett__seite--hinten');
|
||||
hinten.append(el('p', 'vorlagenbrett__wer-schild', alleHabenSie
|
||||
? `Alle ${zielbar.length} haben sie`
|
||||
: `${werHat.size} von ${zielbar.length} haben sie`));
|
||||
hinten.append(reihe);
|
||||
|
||||
const fussH = el('div', 'vorlagenbrett__fuss');
|
||||
/* ==== „NOCHMAL VERTEILEN" GEHOERT AUF DIE RUECKSEITE =========
|
||||
|
||||
Filipe ausdruecklich: „und immer noch die option es nochmal
|
||||
zu verteilen falls neue leute ins team zustoßen."
|
||||
|
||||
DER KNOPF SAGT, WAS ER TUT, und das ist bei den zwei Faellen
|
||||
NICHT dasselbe: Fehlt noch jemand, holt er die Fehlenden
|
||||
nach und laesst die anderen in Ruhe. Haben alle sie, ist der
|
||||
naechste Druck eine bewusste Wiederholung -- dann heisst er
|
||||
so und sagt es dem Server auch (`nochmal`). */
|
||||
/* DIE ZAHL IN KLAMMERN UND NICHT IM SATZ (25.09.2026).
|
||||
Der erste Entwurf setzte sie hinein: „Die 1 Fehlenden
|
||||
nachholen" -- bei genau einer Person falsches Deutsch, und
|
||||
„Die 1 Fehlende" waere je nach Mensch das falsche
|
||||
Geschlecht. So stimmt der Satz bei jeder Zahl, ohne
|
||||
Sonderfall und ohne zu raten. */
|
||||
const fehlt = zielbar.length - werHat.size;
|
||||
const nachholen = el('button', 'knopf knopf--klein', alleHabenSie
|
||||
? 'Nochmal an alle'
|
||||
: `Nachholen – ${fehlt === 1 ? '1 fehlt' : fehlt + ' fehlen'}`);
|
||||
nachholen.type = 'button';
|
||||
nachholen.title = alleHabenSie
|
||||
? 'Alle bekommen sie noch einmal – auch die, die sie schon haben.'
|
||||
: 'Nur die, die sie noch nicht haben. Niemand bekommt sie doppelt.';
|
||||
nachholen.addEventListener('click', () => {
|
||||
zuletztVerteilt = v.schluessel;
|
||||
uebernehmen(nachholen, {
|
||||
art: 'katalog', nr: v.nr, gruppe: kGruppe,
|
||||
person_id: katalogZiel(), nochmal: alleHabenSie,
|
||||
});
|
||||
});
|
||||
fussH.append(nachholen);
|
||||
|
||||
const zurueck = el('button', 'knopf knopf--klein vorlagenbrett__zurueck', 'Zurück');
|
||||
zurueck.type = 'button';
|
||||
zurueck.addEventListener('click', () => { karte.dataset.gedreht = 'nein'; });
|
||||
fussH.append(zurueck);
|
||||
hinten.append(fussH);
|
||||
|
||||
karte.append(vorn);
|
||||
karte.append(hinten);
|
||||
karte.dataset.dreh = 'ja';
|
||||
/* WER SIE SCHON HAT, KANN MAN AUCH OHNE VERTEILEN NACHSEHEN --
|
||||
sonst waere die Rueckseite nur als Nebenwirkung einer
|
||||
Handlung erreichbar, und wer nur nachsehen will, muesste
|
||||
erst etwas verteilen. */
|
||||
const umdrehen = el('button', 'knopf knopf--klein vorlagenbrett__drehknopf',
|
||||
'Wer hat sie?');
|
||||
umdrehen.type = 'button';
|
||||
umdrehen.addEventListener('click', () => { karte.dataset.gedreht = 'ja'; });
|
||||
vorn.querySelector('.vorlagenbrett__fuss')?.append(umdrehen);
|
||||
|
||||
/* Und wenn gerade DIESE Karte verteilt wurde: gedreht zeigen. */
|
||||
if (zuletztVerteilt === v.schluessel) {
|
||||
karte.dataset.gedreht = 'ja';
|
||||
zuletztVerteilt = null;
|
||||
} else {
|
||||
karte.dataset.gedreht = 'nein';
|
||||
}
|
||||
}
|
||||
|
||||
/* ==== DIE BEWERBUNGEN ANDERER -- nur für die, die entscheiden ==
|
||||
|
||||
Reference in New Issue
Block a user