Files
dogfather-universe/workspace/assets/js/willkommen.js
T
DogFatherGit 66789aabcd Willkommen: eine Seite, die erklaert, was es hier gibt
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.
2026-09-22 00:00:14 +02:00

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();
})();