Community: Starthilfe beim Schreiben -- und vier Funde aus den Bildern
Filipe: "perfektioniere jede einzelne kategorie der community ... ich will auch dass du fertige und beispiele machst fuer die community damit die auch start hilfe haben ueberall." STARTHILFE: Wer zum ersten Mal schreibt, steht vor einem leeren Feld -- der haeufigste Grund, warum ein Brett still bleibt, obwohl viele mitlesen. Im Formular stehen jetzt Beispiele: ein Klick fuellt Art, Ueberschrift und Text. Auf treff, wunsch, highlight und mitmachen -- nicht auf anschlag, ansteht, regeln, denn dort schreibt die Community nicht, und ein Angebot fuer eine verschlossene Tuer ist keins. JEDE VORLAGE HAT LUECKEN. Eine, die man absenden KANN, wird abgesendet; dann steht dort zehnmal derselbe Satz, und der elfte Mensch merkt, dass hier niemand wirklich schreibt. Die Pruefung misst das: keine Vorlage ohne "…". NICHT ZU VERWECHSELN MIT DEM STARTKATALOG. Der ist fuers Team (fertige Beitraege zum Uebernehmen), das hier fuer die Mitglieder. --- Vier Funde, drei davon nur aus dem Bild ------------------------- 1. ZWEI KNOPFREIHEN MIT DENSELBEN WOERTERN. Auf "Regeln & Hilfe" standen "Regel · Haeufige Frage · Hilfe · Was passiert, wenn" zweimal untereinander -- die eine filterte, die andere sprang zur Ueberschrift, und beide sahen gleich aus. Wo nach Art gegliedert wird, entfaellt jetzt der Filter; die Sprungmarken sind Links geworden, mit "Springe zu" davor und der Anzahl dahinter. 2. "MELDEN" UNTER JEDER REGEL. Siebzehn Melden-Knoepfe unter Texten des Teams -- man meldet keine Regel. Steht jetzt nur noch an Beitraegen von Mitgliedern. Die Gegenprobe im Messwerkzeug legt dafuer eigens einen Beitrag eines zweiten Mitglieds an: Ohne ihn saehe ein abgeschaffter Meldeweg genauso aus wie ein funktionierender. 3. DER HINWEIS LAG AUF DER NAECHSTEN BESCHRIFTUNG. Auf 412 px stand "Gehoert allen hier - wer Der Treff sieht ..." quer ueber "UEBERSCHRIFT". Der Hinweis haengt absolut unter dem Feld, und darunter sind 30 px Luft -- genug fuer EINE Zeile. Unter 560 px steht ohnehin nur ein Feld je Zeile; dort gibt es nichts auszurichten, und er darf einfach im Fluss stehen. 4. UND MEIN EIGENER FEHLER, der alles unsichtbar machte: `vorlagen` gab es hier schon -- als Checkliste fuer Creator, mit demselben Behaelter `#vorlagen`. Die spaetere Funktionsdeklaration gewinnt, zwei Elemente trugen dieselbe Kennung, und die Starthilfe erschien NIE. Keine Fehlermeldung, keine rote Pruefung, nichts in der Konsole. Gefunden nur durch einen Blick auf das Bild. Deshalb prueft pruef-vorlagen jetzt im Browser mit, dass keine Kennung doppelt vorkommt -- derselbe Fehler wie am 17.09. mit `.teilen`, und beim naechsten Mal soll ihn nicht der Zufall finden. Nebenbei messbar: "Regeln & Hilfe" ist von 4569 auf 3623 px geschrumpft, die Karten sind 54 px niedriger. Geprueft: pruef-vorlagen (neu, 24), pruef-video unveraendert 67. Gegenproben: unbekannte Art -> rot; Vorlage ohne Luecke -> rot. Co-Authored-By: Claude Opus 5 <[email protected]>
This commit is contained in:
@@ -106,6 +106,16 @@
|
||||
im Browser kann man aendern. */
|
||||
let treffBrett = false;
|
||||
let lage = null;
|
||||
/* WELCHE BRETTER NACH ART GEGLIEDERT WERDEN.
|
||||
Stand frueher mitten in der Zeichenfunktion -- dort konnte
|
||||
`filterBauen` sie nicht sehen, und deshalb baute die Filterreihe
|
||||
auf genau diesen Brettern eine ZWEITE Leiste mit denselben
|
||||
Woertern wie die Sprungmarken darunter. */
|
||||
const NACH_ART = {
|
||||
regeln: ['regel', 'folge', 'hilfe', 'frage'],
|
||||
mitmachen: ['gesucht', 'lust', 'frage'],
|
||||
};
|
||||
|
||||
let filter = '';
|
||||
/* WELCHER KANAL -- eine ZWEITE Dimension neben `filter`, nicht
|
||||
derselbe Wert.
|
||||
@@ -672,7 +682,22 @@
|
||||
den eigenen kann man loeschen, das ist der kuerzere Weg.
|
||||
Der Grund ist Pflicht (DSA Art. 16); der Server prueft ihn
|
||||
noch einmal, die Abfrage hier erspart nur den Fehlschlag. */
|
||||
if (!lage.team && e.erstellt_von !== ich.id) {
|
||||
/* NICHT AN BEITRAEGEN DES TEAMS (18.09.2026).
|
||||
|
||||
Unter jeder Regel stand „melden" -- auch unter „Achtzehn plus
|
||||
bleibt draussen". Man meldet keine Regel: Sie ist der Text des
|
||||
Teams selbst, und ein Knopf darunter legt nahe, das Team
|
||||
moderiere sich gegenseitig. Auf „Regeln & Hilfe" standen so
|
||||
siebzehn Melden-Knoepfe, von denen keiner einen Sinn hatte.
|
||||
|
||||
Wer mit dem Team reden will, findet den Weg unter „Hilfe" --
|
||||
dort steht, wie man DogFather und die Moderation erreicht.
|
||||
|
||||
IM ZWEIFEL BLEIBT DER KNOPF: Fehlt die Rollenangabe (alte
|
||||
Eintraege), gilt der Beitrag nicht als Team-Beitrag. Lieber
|
||||
ein Knopf zu viel als ein fehlender Meldeweg. */
|
||||
const vomTeam = !!e.erstellt_rolle && e.erstellt_rolle !== 'gast';
|
||||
if (!lage.team && e.erstellt_von !== ich.id && !vomTeam) {
|
||||
zeile.append(tuKnopf('melden', async () => {
|
||||
const grund = prompt('Was ist daran nicht in Ordnung?\n\n'
|
||||
+ 'Bitte schreib es in einem Satz – sonst können wir es nicht prüfen.');
|
||||
@@ -1089,9 +1114,95 @@
|
||||
return stueck;
|
||||
}
|
||||
|
||||
/* ---- STARTHILFE BEIM SCHREIBEN (18.09.2026) ---------------------
|
||||
|
||||
Filipe: „ich will auch dass du fertige und beispiele machst fuer
|
||||
die community damit die auch start hilfe haben ueberall."
|
||||
|
||||
Wer zum ersten Mal schreibt, steht vor einem leeren Feld. Die
|
||||
Vorlagen geben einen Anfang -- mit LUECKEN, die nur der
|
||||
Schreibende fuellen kann. Eine Vorlage, die man absenden KANN,
|
||||
wird abgesendet; dann steht dort zehnmal derselbe Satz.
|
||||
|
||||
SIE VERSCHWINDEN, SOBALD JEMAND TIPPT. Hilfe, die stehen bleibt,
|
||||
wenn man sie nicht mehr braucht, ist keine Hilfe mehr, sondern
|
||||
etwas, das man wegklickt -- und beim naechsten Mal gleich
|
||||
ignoriert. */
|
||||
/* HEISST `starthilfe` UND NICHT `vorlagen`.
|
||||
|
||||
`vorlagenZeigen` und `#vorlagen` gab es hier schon: die Checkliste
|
||||
fuer Creator auf live/community/technik. Meine gleichnamige
|
||||
Funktion wurde davon ueberschrieben -- die spaetere Deklaration
|
||||
gewinnt --, und im HTML standen zwei Elemente mit derselben
|
||||
Kennung. Die Starthilfe erschien deshalb NIE, ohne eine einzige
|
||||
Fehlermeldung. Aufgefallen ist es nur, weil ich nachgesehen habe,
|
||||
ob die Knoepfe wirklich dastehen. */
|
||||
let starthilfeGeholt = '';
|
||||
|
||||
async function starthilfeZeigen() {
|
||||
const kasten = $('starthilfe');
|
||||
const reihe = $('starthilfe-reihe');
|
||||
if (!kasten || !reihe) return;
|
||||
if (starthilfeGeholt === bereich) return;
|
||||
starthilfeGeholt = bereich;
|
||||
reihe.textContent = '';
|
||||
kasten.hidden = true;
|
||||
|
||||
let liste = [];
|
||||
try {
|
||||
const a = await hole(`/workspace/api/bereich/${bereich}/vorlagen`);
|
||||
if (!a.ok) return;
|
||||
liste = (await a.json())?.vorlagen || [];
|
||||
} catch { return; }
|
||||
if (!liste.length) return;
|
||||
|
||||
for (const v of liste) {
|
||||
const b = el('button', 'starthilfe__beispiel', einstellung?.arten?.[v.art] || v.art);
|
||||
b.type = 'button';
|
||||
/* Der volle Text als Titel-Attribut: Wer wissen will, was ihn
|
||||
erwartet, muss nicht erst klicken. */
|
||||
b.title = `${v.titel}\n\n${v.text}`;
|
||||
b.addEventListener('click', () => {
|
||||
const art = $('f-art');
|
||||
if (art && [...art.options].some((o) => o.value === v.art)) {
|
||||
art.value = v.art;
|
||||
art.dispatchEvent(new Event('change'));
|
||||
}
|
||||
$('f-titel').value = v.titel;
|
||||
$('f-text').value = v.text;
|
||||
kasten.hidden = true;
|
||||
/* Der Fokus wandert in die Ueberschrift und markiert sie: Der
|
||||
erste Handgriff ist, den Platzhalter zu ersetzen. */
|
||||
$('f-titel').focus();
|
||||
$('f-titel').select();
|
||||
});
|
||||
reihe.append(b);
|
||||
}
|
||||
kasten.hidden = false;
|
||||
|
||||
/* Sobald jemand selbst schreibt, sind die Beispiele erledigt. */
|
||||
for (const id of ['f-titel', 'f-text']) {
|
||||
$(id)?.addEventListener('input', () => { kasten.hidden = true; }, { once: true });
|
||||
}
|
||||
}
|
||||
|
||||
function filterBauen(eintraege = []) {
|
||||
const ziel = $('filter');
|
||||
ziel.textContent = '';
|
||||
|
||||
/* ---- EIN NACHSCHLAGEWERK BRAUCHT KEINEN FILTER (18.09.2026) ----
|
||||
|
||||
Auf „Regeln & Hilfe" standen zwei Knopfreihen direkt
|
||||
untereinander -- „Regel · Häufige Frage · Hilfe · Was passiert,
|
||||
wenn" und darunter dieselben vier Wörter noch einmal. Die eine
|
||||
filterte, die andere sprang zur Überschrift. Von außen sahen sie
|
||||
gleich aus, und niemand konnte erraten, was der Unterschied ist.
|
||||
|
||||
Dort, wo nach Art gegliedert wird, ist der Filter der
|
||||
überflüssige von beiden: Die Gliederung zeigt ohnehin schon
|
||||
alles, sortiert und mit Überschriften. Die Sprungmarken bleiben
|
||||
-- sie sind das Inhaltsverzeichnis. */
|
||||
if (NACH_ART[bereich]) { filter = ''; return; }
|
||||
const knopf = (wert, text) => {
|
||||
const b = el('button', 'schritt', text);
|
||||
b.type = 'button';
|
||||
@@ -1436,10 +1547,6 @@
|
||||
"Mitmachen" ist ein WEG: erst die drei Schritte, dann die
|
||||
Gebiete, dann die Fragen. Eine Liste beantwortet "was gibt
|
||||
es"; die Frage lautet aber "was tue ich als Erstes". */
|
||||
const NACH_ART = {
|
||||
regeln: ['regel', 'folge', 'hilfe', 'frage'],
|
||||
mitmachen: ['gesucht', 'lust', 'frage'],
|
||||
};
|
||||
if (NACH_ART[bereich] && !filter) {
|
||||
const reihe = NACH_ART[bereich];
|
||||
const faecher = new Map(reihe.map((a) => [a, []]));
|
||||
@@ -1451,13 +1558,22 @@
|
||||
einem Dokument und einer langen Seite. */
|
||||
const marken = el('nav', 'brettmarken');
|
||||
marken.setAttribute('aria-label', 'Zu einem Abschnitt springen');
|
||||
/* „Springe zu" davor: Ohne diese zwei Wörter sieht eine Reihe
|
||||
von Wörtern aus wie eine Reihe von Filtern -- genau die
|
||||
Verwechslung, die hier behoben wird. Mit ihnen ist es ein
|
||||
Inhaltsverzeichnis, und das ist es auch. */
|
||||
marken.append(el('span', 'brettmarken__wort', 'Springe zu'));
|
||||
for (const a of faecher.keys()) {
|
||||
if (!faecher.get(a).length) continue;
|
||||
const anzahl = faecher.get(a).length;
|
||||
if (!anzahl) continue;
|
||||
const m = el('a', 'brettmarken__weg', einstellung?.arten?.[a] || a);
|
||||
/* Die Anzahl gehört dazu: Sie sagt, ob sich der Sprung lohnt
|
||||
-- und sie verrät, dass hier nicht gefiltert wird. */
|
||||
m.append(el('span', 'brettmarken__zahl', String(anzahl)));
|
||||
m.href = `#abschnitt-${a}`;
|
||||
marken.append(m);
|
||||
}
|
||||
if (marken.childNodes.length > 1) ziel.append(marken);
|
||||
if (marken.childNodes.length > 2) ziel.append(marken);
|
||||
|
||||
for (const a of faecher.keys()) {
|
||||
const fach = faecher.get(a);
|
||||
@@ -1662,6 +1778,7 @@
|
||||
ist. */
|
||||
if (!darfEintragen()) { $('neu').hidden = true; $('neu-oeffnen').hidden = true; return; }
|
||||
$('neu').hidden = !auf; $('neu-oeffnen').hidden = auf;
|
||||
if (auf) starthilfeZeigen();
|
||||
if (auf) $('f-titel').focus();
|
||||
};
|
||||
$('neu-oeffnen').addEventListener('click', () => {
|
||||
|
||||
Reference in New Issue
Block a user