Auftrag vom 21.09.2026, Abschnitte 7 und 8. Aus der Kachel "Der Treff" wird die Willkommensseite. WARUM DAS NICHTS VERLIERT, gemessen am echten Bestand: Das Brett "treff" hatte NULL Eintraege, der Treff-Chat daneben 29 Nachrichten. Geredet wird im Chat; das Brett war eine Kachel ohne Inhalt. DIE SEITE ERKLAERT NICHT "DIE WEBSITE", SONDERN DEINE. Sie baut sich aus derselben Kachelliste wie die Startseite, durch denselben Filter (darfSeite). Wer morgen eine Kachel bekommt, bekommt automatisch auch ihre Erklaerung -- und wer eine nicht hat, liest nicht davon. Eine Liste von Dingen, die man nicht darf, ist keine Orientierung. Gemessen: DogFather 30 Kacheln, Modi 25, Community 11 -- und keine einzige davon ist fuer den Betreffenden gesperrt. DREI FEHLER, DIE ERST DAS BILDSCHIRMFOTO GEZEIGT HAT: body class="gate" ist die ANMELDEWAND (display:flex, zentriert). Kopfleiste und Inhalt standen dadurch NEBENEINANDER -- am Handy blieben dem Text 260 von 390 Pixeln. .huelle gibt es im Haus gar nicht. Der Inhalt stand linksbuendig statt mittig, ohne Sicherheitsrand an randlosen Geraeten. Jetzt .inhalt wie jede andere Seite. Der Text stand direkt auf dem Buehnenbild: Kontrast 1.68:1 am Rechner, 2.23:1 am Handy (noetig 4.5). Die Hausregel stand daneben in start.css -- "der Text steht auf eigenen Flaechen" -- und diese Seite hielt sich als einzige nicht daran. Jetzt 5.19 und 7.73. UND EIN LECK, ZUM DRITTEN MAL DIESELBE URSACHE: Die Kachel umzuleiten nahm dem Brett "treff" die Zugehoerigkeit -- TREFF_BRETTER wird aus Kachelzielen abgeleitet. Die Schranke laesst eine AGENTURROLLE unbesehen durch, wenn ein Brett in keiner Liste steht: Eine Creatorin konnte das Brett des Treffs lesen. Behoben, und diesmal dauerhaft laut gemacht: Nachgemessen ist die Trennung exakt und in beide Richtungen deckungsgleich -- die Bretter mit `fuerAlle` sind genau die des Treffs plus die Agenturablage. Das ist eine Eigenschaft des BRETTS und wandert nicht, wenn jemand eine Kachel umleitet. pruef-treff prueft das jetzt. Mein erster Entwurf der Regel war zu breit und meldete `content` und `schutz` -- beides Agenturbretter, die eine Agenturrolle zu Recht liest. Eine Pruefung, die zu viel meldet, wird abgeschaltet. AUSSERDEM: 16 Kennungen aus workspace-zuteilung.js hatten keinen deutschen Satz -- auf dem Bildschirm haette woertlich "nicht_zugeteilt" gestanden. Gefunden von pruef-meldungen am selben Tag. Und zwei Erwartungen in pruef-treff abgeleitet statt gezaehlt: die Zahl der Rollenkacheln auf der Wand (die Anmeldung sucht WHERE rolle=?, eine Rolle ohne Kachel ist unerreichbar) und "die breite Kachel steht vorne" ueber die Eigenschaft statt ueber den Namen. Geprueft: pruef-willkommen 66/0 (neu), pruef-treff 80/0 (war 59 ok / 13 FEHL), pruef-buehne fuer die neue Seite 10/0, pruef-meldungen 8/0, pruef-css-klassen 30/0, pruef-rechtetafel 19/0.
132 lines
4.8 KiB
JavaScript
132 lines
4.8 KiB
JavaScript
/* =====================================================================
|
|
willkommen.js — die persönliche Einführung
|
|
=====================================================================
|
|
|
|
Auftrag vom 21.09.2026, Abschnitte 7 und 8.
|
|
|
|
DIESE DATEI ENTHÄLT KEINEN EINZIGEN ROLLENNAMEN und keine Liste von
|
|
Kacheln. Beides kommt vom Server, der die Rechte ohnehin kennt.
|
|
Stünde es hier, stünde es in einer Datei, die jeder herunterlädt —
|
|
und wäre am Tag nach der nächsten Änderung falsch.
|
|
|
|
Die Seite ist damit für jede Rolle dieselbe Datei und trotzdem für
|
|
jeden ein anderer Text. Genau das verlangt Abschnitt 8.
|
|
===================================================================== */
|
|
(() => {
|
|
'use strict';
|
|
const $ = (id) => document.getElementById(id);
|
|
const el = (was, klasse, text) => {
|
|
const e = document.createElement(was);
|
|
if (klasse) e.className = klasse;
|
|
if (text !== undefined) e.textContent = text;
|
|
return e;
|
|
};
|
|
|
|
/* Ein Zeichen aus dem Vorrat der Startseite, damit dieselbe Kachel
|
|
hier dasselbe Bild trägt wie dort. Fehlt es, bleibt die Stelle
|
|
leer -- lieber kein Zeichen als ein falsches. */
|
|
function zeichen(name) {
|
|
if (!name || !window.Bereiche || !window.Bereiche.zeichenBauen) return null;
|
|
try { return window.Bereiche.zeichenBauen(name); } catch (e) { return null; }
|
|
}
|
|
|
|
function kachelBauen(k) {
|
|
const a = el('a', 'w-kachel');
|
|
a.href = k.ziel;
|
|
const z = zeichen(k.zeichen);
|
|
if (z) {
|
|
const huelle = el('span', 'w-kachel__zeichen');
|
|
huelle.setAttribute('aria-hidden', 'true');
|
|
huelle.append(z);
|
|
a.append(huelle);
|
|
}
|
|
const text = el('span', 'w-kachel__text');
|
|
text.append(el('span', 'w-kachel__name', k.name));
|
|
if (k.unter) text.append(el('span', 'w-kachel__unter', k.unter));
|
|
/* Der lange Satz nur, wo es einen gibt. Ein leerer Absatz unter
|
|
jeder Kachel wäre ein Raster aus Lücken. */
|
|
if (k.lang) text.append(el('span', 'w-kachel__lang', k.lang));
|
|
a.append(text);
|
|
return a;
|
|
}
|
|
|
|
async function bauen() {
|
|
const laedt = $('laedt');
|
|
try {
|
|
const antwort = await fetch('/workspace/api/willkommen');
|
|
if (!antwort.ok) {
|
|
/* DER DRITTE AUSGANG: nicht "nichts da", sondern "konnte nicht
|
|
nachsehen" -- mit einem Weg zurück. */
|
|
window.ladefehler?.({ nochmal: bauen });
|
|
if (laedt) laedt.hidden = true;
|
|
$('haupt')?.removeAttribute('aria-busy');
|
|
return;
|
|
}
|
|
const d = await antwort.json();
|
|
|
|
$('gruss').textContent = d.gruss || 'Willkommen!';
|
|
document.title = `Willkommen, ${d.name} · Team Dogi`;
|
|
|
|
if (d.rollentext) {
|
|
const r = $('rollentext');
|
|
r.textContent = d.rollentext;
|
|
r.hidden = false;
|
|
}
|
|
$('einleitung-was').textContent = d.einleitung?.was || '';
|
|
$('einleitung-dazu').textContent = d.einleitung?.dazu || '';
|
|
|
|
/* ---- Die Hinweise zur Rolle ---- */
|
|
const hk = $('hinweise');
|
|
const hinweise = d.hinweise || [];
|
|
if (hinweise.length) {
|
|
hk.replaceChildren();
|
|
for (const h of hinweise) {
|
|
const k = el('div', 'w-hinweis');
|
|
k.append(el('h2', 'w-hinweis__titel', h.titel));
|
|
k.append(el('p', 'w-hinweis__text', h.text));
|
|
hk.append(k);
|
|
}
|
|
hk.hidden = false;
|
|
}
|
|
|
|
/* ---- Die Kacheln, nach Gruppen ---- */
|
|
const ziel = $('gruppen');
|
|
ziel.replaceChildren();
|
|
const gruppen = d.gruppen || [];
|
|
if (!gruppen.length) {
|
|
/* KEIN LEERER BILDSCHIRM. Das kommt vor, wenn jemand gerade
|
|
erst angelegt wurde -- dann ist das kein Fehler, sondern ein
|
|
Zustand, und er gehört erklärt. */
|
|
ziel.append(el('p', 'w-leer',
|
|
'Für dich ist im Moment noch nichts freigeschaltet. '
|
|
+ 'Sag DogFather Bescheid — das ist schnell gemacht.'));
|
|
}
|
|
for (const g of gruppen) {
|
|
const abschnitt = el('section', 'w-gruppe');
|
|
abschnitt.append(el('h3', 'w-gruppe__titel', g.name));
|
|
const raster = el('div', 'w-raster');
|
|
for (const k of (g.kacheln || [])) raster.append(kachelBauen(k));
|
|
abschnitt.append(raster);
|
|
ziel.append(abschnitt);
|
|
}
|
|
|
|
const satz = $('bereiche-satz');
|
|
if (satz && d.kachelzahl) {
|
|
satz.textContent = d.kachelzahl + (d.kachelzahl === 1
|
|
? ' Bereich ist für dich freigeschaltet — und wofür er da ist. '
|
|
: ' Bereiche sind für dich freigeschaltet — und wofür sie da sind. ')
|
|
+ 'Tipp einen an, um hinzugehen.';
|
|
}
|
|
|
|
if (laedt) laedt.hidden = true;
|
|
$('haupt')?.removeAttribute('aria-busy');
|
|
} catch (f) {
|
|
window.ladefehler?.({ nochmal: bauen });
|
|
if (laedt) laedt.hidden = true;
|
|
$('haupt')?.removeAttribute('aria-busy');
|
|
}
|
|
}
|
|
|
|
bauen();
|
|
})();
|