Nichts verschwindet mehr ohne eine Nachfrage, die sagt was passiert
Filipe: "Es darf vor allem keine Stellen geben, an denen ein Benutzer
etwas falsch machen kann, nur weil die Seite es nicht verstaendlich
genug erklaert."
Gemessen: 30 Stellen in 16 Dateien benutzten confirm() oder prompt().
Das Haus hatte die richtige Bauweise laengst -- einen <dialog>, in
aufgaben.html sogar ausfuehrlich begruendet -- aber sie stand IN EINER
SEITE. Wer anderswo etwas loeschen liess, hatte sie nicht.
confirm('Wirklich loeschen?') stellt die falsche Frage: Es fragt, ob
man sicher ist, und nennt nicht, WAS passiert, was BLEIBT und ob es
ZURUECK geht. Jetzt beantwortet jeder der 41 Dialoge alle drei.
Neu: workspace/assets/js/nachfrage.js -- window.frageNach() mit
Pflichtgrund, Zahlenfeld, einzeiliger Eingabe und Abtippsicherung.
Drei Ausgaenge: <dialog> / confirm()-Notnagel fuer Safari vor 15.4 /
Abbruch (Esc, Klick daneben, "Doch nicht" -- immer false).
DREIMAL DERSELBE FALLSTRICK, dreimal nachgemessen statt vermutet:
.dialog stand in aufgaben.css und leistung.css -> auf dateien.html
waere der Dialog ein weisser Systemkasten gewesen. 14 Regeln
klammergenau nach module.css verschoben (Klammern gezaehlt, nicht
per Muster geschnitten -- heute frueh hat ein nicht-gieriges
Muster schon einmal CSS zerrissen).
Das Formular trug .neu neu--blank -- und .neu gibt seine Abstaende
nur in aufgaben.css. Gemessen: padding 0px, und die Felder
verloren ihre height:44px. Jetzt steht alles unter
.nachfrage__form in module.css; der Dialog borgt nichts mehr.
Die erste Fassung der Pruefung zaehlte nachfrage.js SELBST als
Nutzer -- damit war jede Seite trivialerweise "Nutzer" und die
Pruefung gruen ohne Inhalt. Jetzt ausdruecklich ausgenommen.
ZWEI FUNDE NEBENBEI:
hilfeAufraeumen() wird im Betrieb NIE aufgerufen. Der Kommentar
behauptete "wird beim Start aufgerufen (siehe index.js)" -- das
war nie wahr; einziger Aufrufer ist die eigene Pruefung. Folge:
geschlossene vertrauliche Faelle bleiben unbegrenzt stehen. NICHT
eingeschaltet (das loescht echte Daten und ist Filipes
Entscheidung), sondern der Kommentar richtiggestellt.
Einen Hilfe-Fall zu schliessen ist endgueltig -- es gibt keine
Route, die ihn wieder oeffnet. Vorher stand darueber nur die
Frage nach einem Schlusswort. Jetzt sagt der Dialog es.
pruef-struktur hat meine eigene Pruefung von heute Nachmittag
erwischt: Sie bildete ihr Datum aus UTC. Beim Beheben erst
heuteLokal(datum) genommen -- die Funktion nimmt gar kein Argument
und haette still "heute" statt "+3 Tage" geliefert. Jetzt tagLokal(3),
nachgerechnet: Abstand 3 Tage.
Am Bildschirm angesehen (Rechner 1280, Handy 390): passt rein, Esc
ergibt false, Fokus liegt auf dem harmlosen Knopf, Knoepfe 44px auf
Touch. Der Platzhalter im Abtippfeld zeigte den erwarteten Namen --
das sah aus wie ein schon ausgefuelltes Feld, entfernt.
Neu: server/pruef-nachfrage.mjs -- 17/0, mit sechs Gegenproben und
beiden Richtungen (wer fragt, laedt die Datei; wer nie fragt, laedt
sie nicht -- sonst truege die Anmeldewand 4,8 KB fuer nichts).
pruef-meldungen 8/0, pruef-css-klassen gruen, pruef-struktur gruen,
pruef-leistung gruen.
This commit is contained in:
@@ -97,6 +97,7 @@
|
||||
Dauer: rund drei Minuten (4 Rollen × 2 Breiten × ~20 Seiten).
|
||||
===================================================================== */
|
||||
|
||||
import { tagLokal } from "./helfer-zeit.mjs";
|
||||
import { mkdtempSync, rmSync } from "node:fs";
|
||||
import { tmpdir } from "node:os";
|
||||
import { join, dirname } from "node:path";
|
||||
@@ -182,7 +183,11 @@ for (const [titel, wer] of [
|
||||
+ " erstellt, frist) VALUES (?,?,?,?,?,?,?)",
|
||||
titel, "Beschreibung mit genug Text, dass die Karte wirklich Höhe bekommt "
|
||||
+ "und ein Umbruch entstehen kann.", "offen", wer, idDogi, jetzt,
|
||||
new Date(Date.now() + 3 * 86400000).toISOString().slice(0, 10));
|
||||
/* Ortszeit, nicht UTC: Zwischen 00:00 und 02:00 deutscher Zeit
|
||||
liegt UTC noch im Vortag -- die Frist waere dann um einen Tag
|
||||
verschoben, und die Pruefung schluege nachts falsch an.
|
||||
Gefunden hat das `pruef-struktur`, nicht ich. */
|
||||
tagLokal(3));
|
||||
}
|
||||
|
||||
for (const [bereich, titel] of [
|
||||
|
||||
@@ -0,0 +1,274 @@
|
||||
/* =====================================================================
|
||||
pruef-nachfrage.mjs — Nichts verschwindet ohne Nachfrage.
|
||||
|
||||
Filipe, 19.09.2026: „Es darf vor allem keine Stellen geben, an denen
|
||||
ein Benutzer etwas falsch machen kann, nur weil die Seite es nicht
|
||||
verständlich genug erklärt." Und: „Fehler möglichst verhindern,
|
||||
bevor sie entstehen."
|
||||
|
||||
---------------------------------------------------------------------
|
||||
WAS DAS PROBLEM WAR
|
||||
|
||||
Das Haus hatte die richtige Bauweise — einen <dialog> statt
|
||||
`confirm()` — und begründete sie in `aufgaben.html` sogar ausführlich.
|
||||
Nur stand sie IN EINER SEITE. Gemessen am 19.09.2026: **30 Stellen**
|
||||
in 16 Dateien griffen weiterhin zu `confirm()` oder `prompt()`.
|
||||
|
||||
Der Unterschied ist nicht Geschmack. `confirm('Wirklich löschen?')`
|
||||
stellt die falsche Frage: Es fragt, ob man sicher ist, und nennt
|
||||
nicht, WAS passiert, was BLEIBT und ob es ZURÜCK geht. Genau das
|
||||
sind die drei Dinge, die man vor einem Löschen wissen will.
|
||||
|
||||
---------------------------------------------------------------------
|
||||
VIER DINGE WERDEN GEPRÜFT
|
||||
|
||||
1. KEIN NATIVER DIALOG mehr in einer Seiten-Datei. Ausgenommen ist
|
||||
allein der Notnagel in `nachfrage.js` selbst — für Browser ohne
|
||||
<dialog>. (Ein Verbot ohne diese Ausnahme wäre falsch: Ein
|
||||
iPhone vor Safari 15.4 bekäme sonst gar nichts angezeigt.)
|
||||
|
||||
2. ANGESCHLOSSEN — jede Seite, deren Skripte `frageNach` benutzen,
|
||||
lädt auch `nachfrage.js`. Ohne die Datei wäre `frageNach` nicht
|
||||
definiert, und aus einer Rückfrage würde ein Absturz: Der Knopf
|
||||
täte stillschweigend nichts.
|
||||
|
||||
ACHTUNG, hier steckte beim Bauen schon eine Falle: Die erste
|
||||
Fassung dieser Prüfung zählte `nachfrage.js` SELBST als Nutzer
|
||||
(die Datei enthält das Wort natürlich) — damit war jede Seite
|
||||
„Nutzer", die Prüfung immer grün und sie bewies nichts. Deshalb
|
||||
ist die Datei unten ausdrücklich ausgenommen.
|
||||
|
||||
3. GESTALTET — `.dialog` wird in einer Datei gestaltet, die JEDE
|
||||
Seite lädt. Vorher stand sie in `aufgaben.css`; auf `dateien.html`
|
||||
wäre der Dialog ein weißer Systemkasten auf dunkler Seite
|
||||
gewesen. Das ist keine Schönheitsfrage: Ein Kasten, der aussieht
|
||||
wie eine Browser-Warnung, wird weggeklickt statt gelesen.
|
||||
|
||||
4. VOLLSTÄNDIG — jeder Aufruf hat einen `titel` und sagt, was
|
||||
passiert (`was`). Ein Dialog ohne diese Angabe ist ein
|
||||
`confirm()` mit mehr Zeilen Code.
|
||||
|
||||
Dazu GEGENPROBEN: Jede Prüfung muss beweisen, dass sie auch
|
||||
„nicht in Ordnung" sagen kann.
|
||||
|
||||
AUFRUF: node server/pruef-nachfrage.mjs
|
||||
Läuft in unter zwei Sekunden, ohne Server.
|
||||
===================================================================== */
|
||||
|
||||
import { readFileSync, readdirSync } from "node:fs";
|
||||
import { join, dirname } from "node:path";
|
||||
import { fileURLToPath } from "node:url";
|
||||
|
||||
const HIER = dirname(fileURLToPath(import.meta.url));
|
||||
const WURZEL = join(HIER, "..");
|
||||
const SEITEN_ORDNER = join(WURZEL, "workspace");
|
||||
const JS_ORDNER = join(SEITEN_ORDNER, "assets", "js");
|
||||
const CSS_ORDNER = join(SEITEN_ORDNER, "assets", "css");
|
||||
|
||||
/* Die eine Datei, die `confirm`/`prompt` benutzen DARF -- sie ist der
|
||||
Notnagel fuer Browser ohne <dialog>. */
|
||||
const DER_NOTNAGEL = "nachfrage.js";
|
||||
|
||||
let ok = 0, fehl = 0;
|
||||
const pruef = (name, bedingung, zusatz = "") => {
|
||||
if (bedingung) { ok++; console.log(` OK ${name}`); }
|
||||
else { fehl++; console.log(` FEHL ${name}${zusatz ? "\n " + zusatz : ""}`); }
|
||||
};
|
||||
|
||||
const lies = (p) => readFileSync(p, "utf8");
|
||||
const seiten = readdirSync(SEITEN_ORDNER).filter((f) => f.endsWith(".html"));
|
||||
const skripte = readdirSync(JS_ORDNER).filter((f) => f.endsWith(".js"));
|
||||
|
||||
console.log("\n=== Nachfragen: kein nativer Dialog, und keiner ohne Erklärung ===\n");
|
||||
|
||||
/* ---------------------------------------------------------------------
|
||||
1. KEIN NATIVER DIALOG
|
||||
------------------------------------------------------------------ */
|
||||
|
||||
/** Entfernt Kommentare, bevor gesucht wird. Ohne das zaehlt jeder
|
||||
* Kommentar, der `confirm()` ERWAEHNT, als Fund -- und davon gibt es
|
||||
* in diesem Haus absichtlich mehrere (die Begruendungen). */
|
||||
function ohneKommentare(js) {
|
||||
return js.replace(/\/\*[\s\S]*?\*\//g, "").replace(/(^|[^:])\/\/.*$/gm, "$1");
|
||||
}
|
||||
|
||||
const nativ = [];
|
||||
for (const f of skripte) {
|
||||
if (f === DER_NOTNAGEL) continue;
|
||||
const code = ohneKommentare(lies(join(JS_ORDNER, f)));
|
||||
for (const m of code.matchAll(/(?:^|[^.\w])(confirm|prompt)\s*\(/g)) {
|
||||
const zeile = code.slice(0, m.index).split("\n").length;
|
||||
nativ.push(`${f}:${zeile} → ${m[1]}()`);
|
||||
}
|
||||
}
|
||||
pruef("keine Seite benutzt noch confirm() oder prompt()", nativ.length === 0,
|
||||
nativ.slice(0, 8).join("\n "));
|
||||
|
||||
/* Und der Notnagel ist da -- sonst haetten Browser ohne <dialog> gar
|
||||
nichts. Die ZAHL gehoert in die Bedingung, nicht nur in den Text. */
|
||||
const notnagel = lies(join(JS_ORDNER, DER_NOTNAGEL));
|
||||
pruef("der Notnagel für alte Browser ist vorhanden",
|
||||
/HTMLDialogElement/.test(notnagel) && /window\.confirm\(/.test(notnagel));
|
||||
|
||||
/* ---------------------------------------------------------------------
|
||||
2. ANGESCHLOSSEN
|
||||
------------------------------------------------------------------ */
|
||||
|
||||
/** Welche Skripte rufen frageNach auf? OHNE die Datei, die es
|
||||
* DEFINIERT -- sonst ist die Antwort immer „alle". */
|
||||
const nutzer = new Set();
|
||||
for (const f of skripte) {
|
||||
if (f === DER_NOTNAGEL) continue;
|
||||
if (/\bfrageNach\s*\(/.test(ohneKommentare(lies(join(JS_ORDNER, f))))) nutzer.add(f);
|
||||
}
|
||||
pruef("es gibt überhaupt Seiten, die nachfragen", nutzer.size > 0,
|
||||
`gefunden: ${nutzer.size}`);
|
||||
|
||||
const ohneDatei = [], totesGewicht = [], fragendeSeiten = [];
|
||||
let mitNutzung = 0;
|
||||
for (const s of seiten) {
|
||||
const html = lies(join(SEITEN_ORDNER, s));
|
||||
const geladen = [...html.matchAll(/<script src="assets\/js\/([a-z0-9-]+\.js)/g)]
|
||||
.map((m) => m[1]);
|
||||
const kannFragen = geladen.some((g) => nutzer.has(g));
|
||||
const hatDatei = html.includes("assets/js/nachfrage.js");
|
||||
if (kannFragen) { mitNutzung++; fragendeSeiten.push(s); if (!hatDatei) ohneDatei.push(s); }
|
||||
else if (hatDatei) totesGewicht.push(s);
|
||||
}
|
||||
pruef("jede Seite, die nachfragt, lädt auch nachfrage.js",
|
||||
mitNutzung > 0 && ohneDatei.length === 0,
|
||||
`${mitNutzung} Seiten nutzen es, ohne Datei: ${ohneDatei.join(", ") || "keine"}`);
|
||||
|
||||
/* UND DIE GEGENRICHTUNG. Ohne sie waere „ueberall einbinden" die
|
||||
bequeme Antwort -- und die Anmeldewand, die jeder Besucher als
|
||||
erste laedt, truege 4,8 KB fuer einen Dialog, den sie nie zeigt.
|
||||
Zwei Richtungen, eine Regel: Die Datei liegt genau dort, wo sie
|
||||
gebraucht wird. */
|
||||
pruef("und keine Seite lädt sie, ohne je nachzufragen",
|
||||
totesGewicht.length === 0,
|
||||
`unnötig geladen auf: ${totesGewicht.join(", ")}`);
|
||||
|
||||
/* ---------------------------------------------------------------------
|
||||
3. GESTALTET, UND ZWAR ÜBERALL
|
||||
------------------------------------------------------------------ */
|
||||
|
||||
/** In welchen CSS-Dateien wird `.dialog` gestaltet? */
|
||||
const dialogCss = readdirSync(CSS_ORDNER).filter((f) => f.endsWith(".css"))
|
||||
.filter((f) => /^\.dialog[\s,{:]/m.test(lies(join(CSS_ORDNER, f))));
|
||||
|
||||
/** Und welche davon laedt jede Seite, DIE NACHFRAGEN KANN? Abgeleitet,
|
||||
* nicht behauptet -- eine Liste „module.css laedt ueberall" waere genau
|
||||
* die abgeschriebene Liste, vor der die Hausregeln warnen.
|
||||
*
|
||||
* Gemessen wird gegen die fragenden Seiten, nicht gegen alle: Die zwei
|
||||
* Anmeldewaende zeigen nie einen Dialog. Von ihnen die Dialog-
|
||||
* Gestaltung zu verlangen hiesse, 12 KB auf die Seite zu legen, die
|
||||
* jeder Besucher als erste laedt -- fuer nichts. */
|
||||
const ueberall = new Set(dialogCss);
|
||||
for (const s of fragendeSeiten) {
|
||||
const html = lies(join(SEITEN_ORDNER, s));
|
||||
const css = new Set([...html.matchAll(/href="assets\/css\/([a-z0-9-]+\.css)/g)]
|
||||
.map((m) => m[1]));
|
||||
for (const d of [...ueberall]) if (!css.has(d)) ueberall.delete(d);
|
||||
}
|
||||
pruef(".dialog wird dort gestaltet, wo jede fragende Seite es lädt",
|
||||
ueberall.size > 0 && fragendeSeiten.length > 0,
|
||||
`.dialog steht in: ${dialogCss.join(", ")} — von allen `
|
||||
+ `${fragendeSeiten.length} fragenden Seiten geladen: `
|
||||
+ `${[...ueberall].join(", ") || "KEINE"}`);
|
||||
|
||||
/* Die zwei eigenen Bauteile des Nachfrage-Dialogs gehoeren in dieselbe
|
||||
Datei -- sonst waere der wichtigste Satz ("nicht rueckgaengig")
|
||||
ungestaltet. */
|
||||
const gemeinsam = [...ueberall][0];
|
||||
const gCss = gemeinsam ? lies(join(CSS_ORDNER, gemeinsam)) : "";
|
||||
pruef("auch die Warnzeile und die Fehlerzeile sind dort gestaltet",
|
||||
/\.nachfrage__endgueltig/.test(gCss) && /\.nachfrage__fehler/.test(gCss));
|
||||
|
||||
/* Und sie traegt ihre Aussage nicht nur ueber Farbe. */
|
||||
pruef("die Warnzeile hat ein Zeichen, nicht nur eine Farbe",
|
||||
/\.nachfrage__endgueltig::before\s*{[^}]*content/.test(gCss),
|
||||
"Farbe allein trägt keine Aussage — Rot-Grün-Schwäche, Kontrastmodus");
|
||||
|
||||
/* ---------------------------------------------------------------------
|
||||
4. VOLLSTÄNDIG: jeder Aufruf sagt, was passiert
|
||||
------------------------------------------------------------------ */
|
||||
|
||||
/** Schneidet den Objektliteral-Teil eines frageNach-Aufrufs heraus,
|
||||
* klammergenau. Ein Muster „bis zur naechsten }" wuerde bei jedem
|
||||
* verschachtelten Ausdruck danebengreifen. */
|
||||
function aufrufe(js) {
|
||||
const out = [];
|
||||
for (const m of js.matchAll(/frageNach\s*\(\s*{/g)) {
|
||||
let i = m.index + m[0].length - 1, tiefe = 0, j = i;
|
||||
for (; j < js.length; j++) {
|
||||
if (js[j] === "{") tiefe++;
|
||||
else if (js[j] === "}") { tiefe--; if (tiefe === 0) { j++; break; } }
|
||||
}
|
||||
out.push(js.slice(i, j));
|
||||
}
|
||||
return out;
|
||||
}
|
||||
|
||||
let gezaehlt = 0;
|
||||
const ohneTitel = [], ohneWas = [];
|
||||
for (const f of skripte) {
|
||||
if (f === DER_NOTNAGEL) continue;
|
||||
const code = ohneKommentare(lies(join(JS_ORDNER, f)));
|
||||
for (const a of aufrufe(code)) {
|
||||
gezaehlt++;
|
||||
if (!/\btitel\s*:/.test(a)) ohneTitel.push(f);
|
||||
if (!/\bwas\s*:/.test(a)) ohneWas.push(f);
|
||||
}
|
||||
}
|
||||
/* DIE ZAHL GEHOERT IN DIE BEDINGUNG: Bei null Aufrufen waere
|
||||
„alle haben einen Titel" trivialerweise wahr. */
|
||||
pruef("jeder Aufruf hat einen Titel", gezaehlt > 0 && ohneTitel.length === 0,
|
||||
`${gezaehlt} Aufrufe geprüft, ohne Titel: ${ohneTitel.join(", ") || "keiner"}`);
|
||||
pruef("jeder Aufruf sagt, WAS passiert", gezaehlt > 0 && ohneWas.length === 0,
|
||||
`ohne „was": ${ohneWas.join(", ") || "keiner"}`);
|
||||
|
||||
/* Und die gefaehrlichste Handlung im Haus -- eine Person loeschen --
|
||||
verlangt das Abtippen des Namens. Das ist keine Schikane: Der
|
||||
Loeschknopf sitzt neben dem Sperrknopf. */
|
||||
pruef("eine Person löschen verlangt den Namen abgetippt",
|
||||
/tippen:\s*v\.person\.name/.test(lies(join(JS_ORDNER, "personen.js"))));
|
||||
|
||||
/* ---------------------------------------------------------------------
|
||||
DIE GEGENPROBEN — jede muss anschlagen
|
||||
------------------------------------------------------------------ */
|
||||
console.log("\n --- Gegenproben (jede MUSS anschlagen) ---");
|
||||
|
||||
pruef("Gegenprobe: ein erfundenes confirm() würde gefunden",
|
||||
/(?:^|[^.\w])(confirm|prompt)\s*\(/.test(
|
||||
ohneKommentare("function x(){ if (!confirm('weg?')) return; }")));
|
||||
|
||||
pruef("Gegenprobe: ein confirm() im KOMMENTAR wird NICHT gemeldet",
|
||||
!/(?:^|[^.\w])(confirm|prompt)\s*\(/.test(
|
||||
ohneKommentare("/* frueher stand hier confirm('weg?') */")));
|
||||
|
||||
pruef("Gegenprobe: nachfrage.js selbst zählt nicht als Nutzer",
|
||||
!nutzer.has(DER_NOTNAGEL),
|
||||
'sonst wäre jede Seite trivialerweise Nutzer und die Prüfung grün ohne Inhalt');
|
||||
|
||||
pruef("Gegenprobe: die Gestaltung-Prüfung kann auch NEIN sagen",
|
||||
(() => {
|
||||
/* Eine erfundene Seite, die nachfragt, aber die Datei nicht laedt:
|
||||
Die Schnittmenge muss dadurch leer werden. */
|
||||
const probe = new Set(dialogCss);
|
||||
for (const d of [...probe]) if (!new Set(["gibt-es-nicht.css"]).has(d)) probe.delete(d);
|
||||
return probe.size === 0;
|
||||
})());
|
||||
|
||||
pruef("Gegenprobe: ein Aufruf ohne Titel würde auffallen",
|
||||
aufrufe("frageNach({ was: 'x' })").length === 1
|
||||
&& !/\btitel\s*:/.test(aufrufe("frageNach({ was: 'x' })")[0]));
|
||||
|
||||
pruef("Gegenprobe: der Klammerzähler findet das Ende auch bei Verschachtelung",
|
||||
aufrufe("frageNach({ titel: f({a:1}), was: 'x' }) ; danach")[0]
|
||||
=== "{ titel: f({a:1}), was: 'x' }");
|
||||
|
||||
console.log(`\n ${ok} bestanden, ${fehl} fehlgeschlagen`);
|
||||
console.log(` (${gezaehlt} Rückfragen in ${nutzer.size} Dateien, `
|
||||
+ `${mitNutzung} Seiten)\n`);
|
||||
process.exit(fehl ? 1 : 0);
|
||||
@@ -322,9 +322,28 @@ async function schlussBenachrichtigen(fall) {
|
||||
|
||||
/** Löscht geschlossene Fälle, die älter sind als die Aufbewahrung.
|
||||
*
|
||||
* Wird beim Start aufgerufen (siehe index.js). Läuft still: Wenn es
|
||||
* nichts zu tun gibt, sagt es auch nichts -- eine Meldung, die jeden
|
||||
* Start begleitet, wird nach einer Woche nicht mehr gelesen. */
|
||||
* ACHTUNG, NACHGEMESSEN AM 19.09.2026: Diese Funktion wird im Betrieb
|
||||
* NICHT aufgerufen. Hier stand vorher "Wird beim Start aufgerufen
|
||||
* (siehe index.js)" -- das war nie wahr. Gesucht im ganzen Verzeichnis:
|
||||
* der einzige Aufrufer ist `pruef-hilfe.mjs`, also ihre eigene Prüfung.
|
||||
*
|
||||
* Die Prüfung ist deshalb grün und beweist nichts über den Betrieb:
|
||||
* Sie zeigt, dass die Funktion richtig löscht -- nicht, dass jemand
|
||||
* sie aufruft. Genau das Muster, vor dem die Hausregeln warnen.
|
||||
*
|
||||
* FOLGE: Geschlossene Fälle bleiben derzeit unbegrenzt stehen. Das ist
|
||||
* die sichere Richtung (nichts geht verloren), aber nicht die
|
||||
* gewollte -- ein vertraulicher Fall über einen Menschen soll nicht
|
||||
* ewig gespeichert bleiben.
|
||||
*
|
||||
* Das EINZUSCHALTEN löscht echte Daten und ist deshalb keine
|
||||
* Reparatur, die nebenbei passiert, sondern Filipes Entscheidung:
|
||||
* Wie lange sollen abgeschlossene Fälle stehen bleiben? Die Prüfung
|
||||
* rechnet mit 90 Tagen, das ist aber nur ihre Annahme.
|
||||
*
|
||||
* Läuft still: Wenn es nichts zu tun gibt, sagt es auch nichts --
|
||||
* eine Meldung, die jeden Start begleitet, wird nach einer Woche
|
||||
* nicht mehr gelesen. */
|
||||
export function hilfeAufraeumen(tage) {
|
||||
try {
|
||||
const grenze = new Date(Date.now() - tage * 86400000).toISOString();
|
||||
|
||||
@@ -16,15 +16,15 @@
|
||||
verdeckt. Gefunden hat es pruef-struktur.
|
||||
|
||||
Richtig sind `gate.css` (die Farbwerte des Hauses) und `haus.css`. -->
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/haus.css?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609191956" />
|
||||
<link rel="stylesheet" href="assets/css/haus.css?v=202609191956" />
|
||||
<!-- Ohne diese drei nimmt ein iPhone einen Bildschirmausschnitt als
|
||||
Symbol, Android zeichnet die Leiste weiss, und die Seite oeffnet
|
||||
ausserhalb der App -- auf einer Seite, die genau erklaeren soll,
|
||||
WARUM das Telefon nicht klingelt, ist das besonders unpassend. -->
|
||||
<link rel="manifest" href="/workspace/crew.webmanifest?v=202609191018" />
|
||||
<meta name="theme-color" content="#06090f" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609191915" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609191956" />
|
||||
<style>
|
||||
/* Bewusst in der Seite und nicht in einer eigenen Datei: Diese Seite
|
||||
soll auch dann noch etwas anzeigen, wenn genau das schiefgeht,
|
||||
@@ -124,8 +124,8 @@
|
||||
<p class="probe__ende" id="rat"></p>
|
||||
</main>
|
||||
|
||||
<script src="assets/js/meldung.js?v=202609191915" defer></script>
|
||||
<script src="assets/js/meldung.js?v=202609191956" defer></script>␍
|
||||
|
||||
<script src="assets/js/anruf-probe.js?v=202609191915" defer></script>
|
||||
<script src="assets/js/anruf-probe.js?v=202609191956" defer></script>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
@@ -22,25 +22,25 @@
|
||||
},
|
||||
"icons": [
|
||||
{
|
||||
"src": "/assets/img/app-symbole/workspace-192.png?v=202609191915",
|
||||
"src": "/assets/img/app-symbole/workspace-192.png?v=202609191956",
|
||||
"sizes": "192x192",
|
||||
"type": "image/png",
|
||||
"purpose": "any"
|
||||
},
|
||||
{
|
||||
"src": "/assets/img/app-symbole/workspace-512.png?v=202609191915",
|
||||
"src": "/assets/img/app-symbole/workspace-512.png?v=202609191956",
|
||||
"sizes": "512x512",
|
||||
"type": "image/png",
|
||||
"purpose": "any"
|
||||
},
|
||||
{
|
||||
"src": "/assets/img/app-symbole/workspace-192-maskable.png?v=202609191915",
|
||||
"src": "/assets/img/app-symbole/workspace-192-maskable.png?v=202609191956",
|
||||
"sizes": "192x192",
|
||||
"type": "image/png",
|
||||
"purpose": "maskable"
|
||||
},
|
||||
{
|
||||
"src": "/assets/img/app-symbole/workspace-512-maskable.png?v=202609191915",
|
||||
"src": "/assets/img/app-symbole/workspace-512-maskable.png?v=202609191956",
|
||||
"sizes": "512x512",
|
||||
"type": "image/png",
|
||||
"purpose": "maskable"
|
||||
|
||||
@@ -269,132 +269,10 @@
|
||||
|
||||
/* ---------- Bearbeiten-Dialog ------------------------------------------ */
|
||||
|
||||
/* =====================================================================
|
||||
DIALOGE (07.09.2026 überarbeitet)
|
||||
|
||||
Filipe zu zwei davon: "lass alles in dieser kachel viel spezieller und
|
||||
geiler aussehen" und "dass soll auch viel besser aussehen".
|
||||
|
||||
Er hatte recht, und der Grund war nicht Geschmack: Ein Dialog war
|
||||
bisher ein grauer Kasten (`background: #0b1018`, ein Rand, fertig) --
|
||||
während die Seite dahinter aus beleuchteten Platten mit Schienen,
|
||||
Körnung und Glanz besteht. Beim Öffnen fiel man aus dem einen
|
||||
Material ins andere.
|
||||
|
||||
Jetzt trägt er dieselbe Sprache wie alles übrige:
|
||||
- Leuchtschiene links, im Hausakzent
|
||||
- Kopfzeile abgesetzt mit einer feinen Fuge
|
||||
- Körnung und ein fester Glanz von links oben
|
||||
- Materialstärke: Licht oben, Schatten unten
|
||||
Und er ist deutlich TIEFER als vorher (#0b1018 war ein helles Grau
|
||||
gegen das, was jetzt hinter ihm liegt) -- ein Dialog muss sich vom
|
||||
Untergrund abheben, sonst schwimmt er darin.
|
||||
|
||||
Der Hintergrund dahinter wird STÄRKER abgedunkelt und weicher
|
||||
gezeichnet: Ein Dialog ist der einzige Ort, an dem ein Weichzeichner
|
||||
richtig ist -- er soll das Dahinter ausdrücklich zurücktreten
|
||||
lassen. Genau dafür ist er gemacht, und genau deshalb war er unter
|
||||
den Kacheln falsch.
|
||||
===================================================================== */
|
||||
.dialog {
|
||||
position: relative;
|
||||
width: min(580px, calc(100vw - 32px));
|
||||
padding: 0;
|
||||
border: 1px solid rgba(150, 186, 220, .16);
|
||||
/* DIE FASE STATT RUNDER ECKEN (08.09.2026).
|
||||
|
||||
Filipe: "alles was sie sehen soll dan auch nach der neuen struktur
|
||||
aufgebaut sein" -- und ein Dialog ist das, was man am genauesten
|
||||
ansieht, weil er alles andere verdeckt.
|
||||
|
||||
Er kann NICHT in die Modulliste von module.css: Die belegt
|
||||
`::before` und `::after` fuer die Eckwinkel, und beide sind hier
|
||||
schon vergeben -- an die Leuchtschiene links und den Lichtsaum.
|
||||
Beides gegen zwei Winkel zu tauschen waere ein Rueckschritt.
|
||||
Deshalb hier nur der Zuschnitt, von Hand, mit derselben Groesse
|
||||
`--fase` wie ueberall. Wer die Fase spaeter aendert, aendert sie
|
||||
hier mit. */
|
||||
clip-path: polygon(var(--fase, 18px) 0, 100% 0, 100% 100%, 0 100%, 0 var(--fase, 18px));
|
||||
border-radius: 0;
|
||||
background:
|
||||
linear-gradient(90deg,
|
||||
color-mix(in srgb, var(--akzent) 16%, transparent) 0%,
|
||||
color-mix(in srgb, var(--akzent) 5%, transparent) 14%,
|
||||
transparent 40%),
|
||||
linear-gradient(163deg, #141c29 0%, #0a0e17 58%, #070a11 100%);
|
||||
color: var(--text);
|
||||
box-shadow:
|
||||
inset 0 1px 0 rgba(255, 255, 255, .10),
|
||||
inset 0 -1px 0 rgba(0, 0, 0, .55),
|
||||
inset 2px 0 0 -1px color-mix(in srgb, var(--akzent) 34%, transparent),
|
||||
0 30px 70px -24px rgba(0, 0, 0, .92),
|
||||
0 4px 12px -6px rgba(0, 0, 0, .7);
|
||||
overflow: hidden;
|
||||
}
|
||||
/* Die Leuchtschiene -- dieselbe wie an jeder Kachel. */
|
||||
.dialog::before {
|
||||
content: ""; position: absolute; left: 0; top: 0; bottom: 0; width: 4px;
|
||||
border-radius: 4px 0 0 4px;
|
||||
background: linear-gradient(180deg,
|
||||
color-mix(in srgb, var(--akzent) 55%, #fff) 0%,
|
||||
var(--akzent) 26%,
|
||||
color-mix(in srgb, var(--akzent) 48%, transparent) 100%);
|
||||
box-shadow:
|
||||
0 0 9px 0 color-mix(in srgb, var(--akzent) 55%, transparent),
|
||||
3px 0 20px -3px color-mix(in srgb, var(--akzent) 42%, transparent);
|
||||
z-index: 2;
|
||||
}
|
||||
/* Glanz und Körnung. `pointer-events: none` ist Pflicht: Ohne das läge
|
||||
eine unsichtbare Fläche über dem ganzen Formular, und kein einziges
|
||||
Feld wäre anklickbar. */
|
||||
.dialog::after {
|
||||
content: ""; position: absolute; inset: 0; pointer-events: none;
|
||||
border-radius: inherit;
|
||||
background:
|
||||
linear-gradient(122deg,
|
||||
rgba(255, 255, 255, .075) 0%,
|
||||
rgba(255, 255, 255, .020) 15%,
|
||||
transparent 34%);
|
||||
/* Ohne Körnung -- siehe die Begründung in automation.css: Auf einer
|
||||
Ebene mit der Spiegelung erbt sie deren Deckkraft und wird zum
|
||||
grauen Schleier. */
|
||||
opacity: .55;
|
||||
z-index: 1;
|
||||
}
|
||||
.dialog > * { position: relative; z-index: 2; }
|
||||
|
||||
.dialog::backdrop {
|
||||
background: rgba(2, 4, 8, .78);
|
||||
backdrop-filter: blur(6px) saturate(80%);
|
||||
}
|
||||
|
||||
.neu--blank { margin: 0; border: 0; background: none; padding: 22px 24px 20px; }
|
||||
|
||||
/* Der Kopf steht auf einer eigenen Stufe: Überschrift, darunter der
|
||||
erklärende Satz, darunter eine feine Fuge. Ohne diese Trennung
|
||||
verschwimmt die Ansage mit dem ersten Feld -- und genau die Ansage
|
||||
ist das, was den Dialog erklärt. */
|
||||
.dialog__titel {
|
||||
margin: 0 0 4px;
|
||||
font-size: 1.24rem; font-weight: 700; letter-spacing: -.015em;
|
||||
color: #f2f7fd;
|
||||
}
|
||||
.dialog__unter {
|
||||
margin: 0 0 16px; padding-bottom: 16px;
|
||||
border-bottom: 1px solid rgba(150, 186, 220, .12);
|
||||
font-size: .87rem; line-height: 1.55;
|
||||
color: var(--text-leise);
|
||||
}
|
||||
/* Hat ein Dialog keine Erklärung, muss die Fuge trotzdem da sein --
|
||||
sonst hängt die Überschrift am ersten Feld. */
|
||||
.dialog__titel:last-of-type,
|
||||
.dialog__unter:empty { border-bottom: 0; }
|
||||
.dialog__unter:empty {
|
||||
margin: 0 0 16px; padding-bottom: 16px;
|
||||
border-bottom: 1px solid rgba(150, 186, 220, .12);
|
||||
}
|
||||
|
||||
.dialog__knoepfe { display: flex; gap: 10px; align-items: center; margin-top: 16px; flex-wrap: wrap; }
|
||||
.dialog__knoepfe #b-loeschen { margin-left: auto; }
|
||||
|
||||
.abmelden--warnung { color: var(--warn); border-color: rgba(255, 154, 162, .35); }
|
||||
@@ -858,13 +736,6 @@
|
||||
}
|
||||
.abbruch-karte .schritt { font-size: .8rem; padding: 7px 13px; }
|
||||
|
||||
/* ---------- Der Dialog --------------------------------------------------- */
|
||||
|
||||
.dialog__unter {
|
||||
margin: -4px 0 14px;
|
||||
font-size: .85rem; color: var(--text-still);
|
||||
max-width: 60ch; line-height: 1.5;
|
||||
}
|
||||
|
||||
#abbruch-grund {
|
||||
width: 100%;
|
||||
|
||||
@@ -225,9 +225,6 @@
|
||||
color: var(--text); border-color: var(--rand-hell);
|
||||
}
|
||||
|
||||
/* ---------- Der Import --------------------------------------------------- */
|
||||
|
||||
.dialog--breit { max-width: 720px; }
|
||||
|
||||
.import-vorschau {
|
||||
margin: 4px 0 14px; padding: 16px;
|
||||
@@ -355,7 +352,6 @@
|
||||
.anleitung li::marker { color: var(--akzent); font-weight: 700; }
|
||||
.anleitung strong { color: var(--text-leise); }
|
||||
|
||||
.dialog__unter--still { font-size: .8rem; color: var(--text-still); }
|
||||
|
||||
/* ---- EINGEKLAPPTE HILFE (11.09.2026) ------------------------------
|
||||
Filipe zum Backstage-Fenster: "die sieht so scheisse aus."
|
||||
@@ -426,10 +422,6 @@
|
||||
}
|
||||
.feld-datei { flex: 1 1 220px; min-width: 0; font-size: .76rem; }
|
||||
|
||||
/* Ein Fenster, das laenger ist als der Bildschirm, versteckt seine
|
||||
eigenen Knoepfe. Gerollt wird INNEN, damit "Uebernehmen" immer
|
||||
erreichbar bleibt. */
|
||||
.dialog--breit .neu { max-height: min(86vh, 900px); overflow-y: auto; }
|
||||
|
||||
/* =====================================================================
|
||||
ZEITRÄUME AUS BACKSTAGE — dritte Fassung (16.09.2026)
|
||||
|
||||
@@ -559,3 +559,259 @@
|
||||
der Rundgang sechsmal gemeldet hat. */
|
||||
.filterreihe__knopf, .k-chip { min-width: 44px; }
|
||||
}
|
||||
|
||||
|
||||
/* =====================================================================
|
||||
DER DIALOG — hierher verschoben am 19.09.2026
|
||||
|
||||
Er stand in `aufgaben.css` und `leistung.css`. Das war richtig,
|
||||
solange nur diese zwei Seiten einen Dialog hatten. Seit es
|
||||
`nachfrage.js` gibt, kann JEDE Seite nachfragen, bevor etwas weg
|
||||
ist -- und auf einer Seite, die `aufgaben.css` nicht laedt, waere
|
||||
der Dialog ungestaltet gewesen: weisser Kasten, Systemschrift,
|
||||
mitten auf einer dunklen Seite.
|
||||
|
||||
`module.css` laedt auf jeder Seite (vorletzte Datei, direkt vor
|
||||
`haus.css`). Was mehr als eine Seite benutzt, gehoert hierher.
|
||||
|
||||
In `aufgaben.css` bleibt genau eine Regel: `.dialog__knoepfe
|
||||
#b-loeschen` -- die haengt an einer ID, die es nur dort gibt.
|
||||
===================================================================== */
|
||||
/* =====================================================================
|
||||
DIALOGE (07.09.2026 überarbeitet)
|
||||
|
||||
Filipe zu zwei davon: "lass alles in dieser kachel viel spezieller und
|
||||
geiler aussehen" und "dass soll auch viel besser aussehen".
|
||||
|
||||
Er hatte recht, und der Grund war nicht Geschmack: Ein Dialog war
|
||||
bisher ein grauer Kasten (`background: #0b1018`, ein Rand, fertig) --
|
||||
während die Seite dahinter aus beleuchteten Platten mit Schienen,
|
||||
Körnung und Glanz besteht. Beim Öffnen fiel man aus dem einen
|
||||
Material ins andere.
|
||||
|
||||
Jetzt trägt er dieselbe Sprache wie alles übrige:
|
||||
- Leuchtschiene links, im Hausakzent
|
||||
- Kopfzeile abgesetzt mit einer feinen Fuge
|
||||
- Körnung und ein fester Glanz von links oben
|
||||
- Materialstärke: Licht oben, Schatten unten
|
||||
Und er ist deutlich TIEFER als vorher (#0b1018 war ein helles Grau
|
||||
gegen das, was jetzt hinter ihm liegt) -- ein Dialog muss sich vom
|
||||
Untergrund abheben, sonst schwimmt er darin.
|
||||
|
||||
Der Hintergrund dahinter wird STÄRKER abgedunkelt und weicher
|
||||
gezeichnet: Ein Dialog ist der einzige Ort, an dem ein Weichzeichner
|
||||
richtig ist -- er soll das Dahinter ausdrücklich zurücktreten
|
||||
lassen. Genau dafür ist er gemacht, und genau deshalb war er unter
|
||||
den Kacheln falsch.
|
||||
===================================================================== */
|
||||
.dialog {
|
||||
position: relative;
|
||||
width: min(580px, calc(100vw - 32px));
|
||||
padding: 0;
|
||||
border: 1px solid rgba(150, 186, 220, .16);
|
||||
/* DIE FASE STATT RUNDER ECKEN (08.09.2026).
|
||||
|
||||
Filipe: "alles was sie sehen soll dan auch nach der neuen struktur
|
||||
aufgebaut sein" -- und ein Dialog ist das, was man am genauesten
|
||||
ansieht, weil er alles andere verdeckt.
|
||||
|
||||
Er kann NICHT in die Modulliste von module.css: Die belegt
|
||||
`::before` und `::after` fuer die Eckwinkel, und beide sind hier
|
||||
schon vergeben -- an die Leuchtschiene links und den Lichtsaum.
|
||||
Beides gegen zwei Winkel zu tauschen waere ein Rueckschritt.
|
||||
Deshalb hier nur der Zuschnitt, von Hand, mit derselben Groesse
|
||||
`--fase` wie ueberall. Wer die Fase spaeter aendert, aendert sie
|
||||
hier mit. */
|
||||
clip-path: polygon(var(--fase, 18px) 0, 100% 0, 100% 100%, 0 100%, 0 var(--fase, 18px));
|
||||
border-radius: 0;
|
||||
background:
|
||||
linear-gradient(90deg,
|
||||
color-mix(in srgb, var(--akzent) 16%, transparent) 0%,
|
||||
color-mix(in srgb, var(--akzent) 5%, transparent) 14%,
|
||||
transparent 40%),
|
||||
linear-gradient(163deg, #141c29 0%, #0a0e17 58%, #070a11 100%);
|
||||
color: var(--text);
|
||||
box-shadow:
|
||||
inset 0 1px 0 rgba(255, 255, 255, .10),
|
||||
inset 0 -1px 0 rgba(0, 0, 0, .55),
|
||||
inset 2px 0 0 -1px color-mix(in srgb, var(--akzent) 34%, transparent),
|
||||
0 30px 70px -24px rgba(0, 0, 0, .92),
|
||||
0 4px 12px -6px rgba(0, 0, 0, .7);
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
/* Die Leuchtschiene -- dieselbe wie an jeder Kachel. */
|
||||
.dialog::before {
|
||||
content: ""; position: absolute; left: 0; top: 0; bottom: 0; width: 4px;
|
||||
border-radius: 4px 0 0 4px;
|
||||
background: linear-gradient(180deg,
|
||||
color-mix(in srgb, var(--akzent) 55%, #fff) 0%,
|
||||
var(--akzent) 26%,
|
||||
color-mix(in srgb, var(--akzent) 48%, transparent) 100%);
|
||||
box-shadow:
|
||||
0 0 9px 0 color-mix(in srgb, var(--akzent) 55%, transparent),
|
||||
3px 0 20px -3px color-mix(in srgb, var(--akzent) 42%, transparent);
|
||||
z-index: 2;
|
||||
}
|
||||
|
||||
/* Glanz und Körnung. `pointer-events: none` ist Pflicht: Ohne das läge
|
||||
eine unsichtbare Fläche über dem ganzen Formular, und kein einziges
|
||||
Feld wäre anklickbar. */
|
||||
.dialog::after {
|
||||
content: ""; position: absolute; inset: 0; pointer-events: none;
|
||||
border-radius: inherit;
|
||||
background:
|
||||
linear-gradient(122deg,
|
||||
rgba(255, 255, 255, .075) 0%,
|
||||
rgba(255, 255, 255, .020) 15%,
|
||||
transparent 34%);
|
||||
/* Ohne Körnung -- siehe die Begründung in automation.css: Auf einer
|
||||
Ebene mit der Spiegelung erbt sie deren Deckkraft und wird zum
|
||||
grauen Schleier. */
|
||||
opacity: .55;
|
||||
z-index: 1;
|
||||
}
|
||||
|
||||
.dialog > * { position: relative; z-index: 2; }
|
||||
|
||||
.dialog::backdrop {
|
||||
background: rgba(2, 4, 8, .78);
|
||||
backdrop-filter: blur(6px) saturate(80%);
|
||||
}
|
||||
|
||||
/* Der Kopf steht auf einer eigenen Stufe: Überschrift, darunter der
|
||||
erklärende Satz, darunter eine feine Fuge. Ohne diese Trennung
|
||||
verschwimmt die Ansage mit dem ersten Feld -- und genau die Ansage
|
||||
ist das, was den Dialog erklärt. */
|
||||
.dialog__titel {
|
||||
margin: 0 0 4px;
|
||||
font-size: 1.24rem; font-weight: 700; letter-spacing: -.015em;
|
||||
color: #f2f7fd;
|
||||
}
|
||||
|
||||
.dialog__unter {
|
||||
margin: 0 0 16px; padding-bottom: 16px;
|
||||
border-bottom: 1px solid rgba(150, 186, 220, .12);
|
||||
font-size: .87rem; line-height: 1.55;
|
||||
color: var(--text-leise);
|
||||
}
|
||||
|
||||
/* Hat ein Dialog keine Erklärung, muss die Fuge trotzdem da sein --
|
||||
sonst hängt die Überschrift am ersten Feld. */
|
||||
.dialog__titel:last-of-type,
|
||||
.dialog__unter:empty { border-bottom: 0; }
|
||||
|
||||
.dialog__unter:empty {
|
||||
margin: 0 0 16px; padding-bottom: 16px;
|
||||
border-bottom: 1px solid rgba(150, 186, 220, .12);
|
||||
}
|
||||
|
||||
.dialog__knoepfe { display: flex; gap: 10px; align-items: center; margin-top: 16px; flex-wrap: wrap; }
|
||||
|
||||
/* ---------- Der Dialog --------------------------------------------------- */
|
||||
|
||||
.dialog__unter {
|
||||
margin: -4px 0 14px;
|
||||
font-size: .85rem; color: var(--text-still);
|
||||
max-width: 60ch; line-height: 1.5;
|
||||
}
|
||||
|
||||
/* ---------- Der Import --------------------------------------------------- */
|
||||
|
||||
.dialog--breit { max-width: 720px; }
|
||||
|
||||
.dialog__unter--still { font-size: .8rem; color: var(--text-still); }
|
||||
|
||||
/* Ein Fenster, das laenger ist als der Bildschirm, versteckt seine
|
||||
eigenen Knoepfe. Gerollt wird INNEN, damit "Uebernehmen" immer
|
||||
erreichbar bleibt. */
|
||||
.dialog--breit .neu { max-height: min(86vh, 900px); overflow-y: auto; }
|
||||
|
||||
/* ---- Die zwei Zeilen, die confirm() nicht kann ---------------------
|
||||
`nachfrage.js` baut den Dialog; diese beiden Teile gibt es nur dort.
|
||||
|
||||
Die Endgueltig-Zeile ist der wichtigste Satz im ganzen Dialog --
|
||||
sie beantwortet die einzige Frage, die vor einem Loeschen zaehlt.
|
||||
Deshalb bekommt sie eine eigene Farbe UND ein Zeichen davor: Farbe
|
||||
allein traegt keine Aussage (Rot-Gruen-Schwaeche, Kontrastmodus),
|
||||
und im Kontrastmodus wird `color` ohnehin ersetzt. Das Zeichen
|
||||
bleibt in jedem Fall. */
|
||||
.nachfrage__endgueltig {
|
||||
margin: 0 0 4px;
|
||||
padding: 8px 10px;
|
||||
font-size: .86rem;
|
||||
line-height: 1.45;
|
||||
color: #ffd9d2;
|
||||
background: rgba(190, 74, 60, .13);
|
||||
border-left: 3px solid rgba(214, 96, 80, .62);
|
||||
}
|
||||
.nachfrage__endgueltig::before { content: "! "; font-weight: 800; }
|
||||
|
||||
/* Der Fehler IM Dialog (z. B. fehlender Grund). Er darf nicht
|
||||
aussehen wie der Fehlerstreifen der Seite dahinter -- der ist
|
||||
verdeckt, dieser hier gehoert zum Formular. Leer nimmt er keinen
|
||||
Platz weg, sonst rutschten die Knoepfe beim ersten Fehler. */
|
||||
.nachfrage__fehler { margin: 0; font-size: .86rem; color: #ffb4a8; }
|
||||
.nachfrage__fehler:empty { display: none; }
|
||||
|
||||
/* Am Handy klebt der Dialog sonst am oberen Rand und die Knoepfe
|
||||
liegen unter der Tastatur. Er waechst von unten, wie ein Blatt,
|
||||
das hochgezogen wird -- das ist dort die gewohnte Richtung. */
|
||||
@media (max-width: 560px) {
|
||||
.nachfrage { margin: auto auto 0; width: 100vw; max-width: 100vw; }
|
||||
}
|
||||
|
||||
@media (forced-colors: active) {
|
||||
.nachfrage__endgueltig { border-left: 3px solid CanvasText; background: Canvas; }
|
||||
}
|
||||
|
||||
/* Der kleine Hinweis unter einem Feld im Nachfrage-Dialog ("Du kannst
|
||||
bis zu 14 Tage geben"). Er steht UNTER dem Feld, nicht daneben:
|
||||
daneben rutscht er am Handy weg, und dort liest ihn niemand. */
|
||||
.nachfrage__hinweis { margin: 4px 0 0; font-size: .8rem; color: var(--text-still); }
|
||||
.nachfrage__hinweis:empty { display: none; }
|
||||
|
||||
/* ---- Der Dialog steht auf eigenen Füßen ---------------------------
|
||||
NACHGEMESSEN AM 19.09.2026, und es war genau derselbe Fehler wie
|
||||
bei `.dialog` selbst: Das Formular trug erst die Klassen
|
||||
`neu neu--blank` — und `.neu` gibt seine Abstände NUR in
|
||||
`aufgaben.css`. Gemessen auf einer Seite ohne diese Datei:
|
||||
`padding: 0px`. Der Text klebte am Rand, und die Eingabefelder
|
||||
verloren ihre `height: 44px` — also ausgerechnet die Größe, die
|
||||
ein Daumen trifft.
|
||||
|
||||
Am Bildschirm sah es trotzdem "irgendwie richtig" aus, weil die
|
||||
Schrift und die Farben aus `gate.css` kamen. Solche Abhängigkeiten
|
||||
sieht man nicht, man misst sie.
|
||||
|
||||
Deshalb steht hier alles, was der Dialog braucht — er borgt nichts
|
||||
mehr aus einer Seitendatei. `.knopf`, `.abmelden` und `.feld-schild`
|
||||
bleiben: die stehen in `gate.css` bzw. `start.css`, und die lädt
|
||||
jede Seite. */
|
||||
.nachfrage__form { margin: 0; padding: 20px; display: grid; gap: 10px; }
|
||||
.nachfrage__zeile { display: grid; gap: 5px; }
|
||||
.nachfrage__form input,
|
||||
.nachfrage__form textarea {
|
||||
width: 100%;
|
||||
box-sizing: border-box;
|
||||
font: inherit;
|
||||
color: var(--text);
|
||||
background: var(--tinte);
|
||||
border: 1px solid var(--rand);
|
||||
border-radius: var(--radius, 10px);
|
||||
padding: 8px 10px;
|
||||
}
|
||||
/* 44 Pixel, weil ein Daumen weniger nicht sicher trifft. Dieselbe Zahl
|
||||
wie überall im Haus -- sie steht hier, damit sie nicht davon abhängt,
|
||||
welche Seitendatei zufällig geladen ist. */
|
||||
.nachfrage__form input { height: 44px; }
|
||||
.nachfrage__form textarea { min-height: 62px; resize: vertical; }
|
||||
.nachfrage__form input:focus,
|
||||
.nachfrage__form textarea:focus {
|
||||
outline: none;
|
||||
box-shadow: inset 0 2px 5px -3px rgba(0, 0, 0, .75),
|
||||
0 0 0 3px rgba(63, 189, 245, .16);
|
||||
}
|
||||
/* Die Knöpfe unten bekommen Luft nach oben -- sonst sitzt "Löschen"
|
||||
direkt unter dem Satz, der davor warnt. */
|
||||
.nachfrage .dialog__knoepfe { margin-top: 6px; }
|
||||
|
||||
@@ -110,9 +110,17 @@
|
||||
es sonst ab, und das ist richtig so. Hier wird deshalb
|
||||
gleich danach gefragt statt eine Fehlermeldung zu zeigen. */
|
||||
if (wert === 'verbessern') {
|
||||
grund = prompt('Was genau soll verbessert werden?\n\n'
|
||||
+ 'Ohne diesen Satz kann der Creator nichts damit anfangen.', grund) || '';
|
||||
if (grund.trim().length < 5) return;
|
||||
const ag = await frageNach({
|
||||
titel: 'Noch verbessern',
|
||||
was: 'Der Creator sieht diesen Satz an seinem Eintrag.',
|
||||
bleibt: 'Der Eintrag bleibt stehen – er wird nur als „noch '
|
||||
+ 'verbessern" markiert und kann überarbeitet werden.',
|
||||
ja: 'Zurückgeben',
|
||||
grund: 'Was genau soll verbessert werden?', grundPflicht: true,
|
||||
platzhalter: 'z. B. Das Licht ist zu dunkel – bitte heller nachdrehen.',
|
||||
});
|
||||
if (!ag) return;
|
||||
grund = ag.grund;
|
||||
}
|
||||
k.disabled = true;
|
||||
try {
|
||||
@@ -204,7 +212,12 @@
|
||||
weg.type = 'button';
|
||||
weg.title = 'Eigene Nachricht zurücknehmen';
|
||||
weg.addEventListener('click', async () => {
|
||||
if (!confirm('Diese Nachricht zurücknehmen?')) return;
|
||||
if (!await frageNach({
|
||||
titel: 'Nachricht zurücknehmen?',
|
||||
was: 'Der Text verschwindet für alle, die ihn noch nicht gelesen haben.',
|
||||
bleibt: 'Wer ihn schon gelesen hat, erinnert sich trotzdem daran.',
|
||||
endgueltig: true, ja: 'Zurücknehmen',
|
||||
})) return;
|
||||
try {
|
||||
const a = await hole(`/workspace/api/eintrag/${eintragId}/nachricht/${n.id}`,
|
||||
{ method: 'DELETE' });
|
||||
|
||||
@@ -129,7 +129,12 @@
|
||||
weg.title = 'Rückmeldung entfernen';
|
||||
weg.setAttribute('aria-label', 'Rückmeldung entfernen');
|
||||
weg.addEventListener('click', async () => {
|
||||
if (!confirm('Diese Rückmeldung entfernen?')) return;
|
||||
if (!await frageNach({
|
||||
titel: 'Rückmeldung entfernen?',
|
||||
was: 'Sie verschwindet aus der Aufgabe.',
|
||||
bleibt: 'Die Aufgabe selbst bleibt unverändert stehen.',
|
||||
endgueltig: true, ja: 'Entfernen',
|
||||
})) return;
|
||||
const r = await hole('/workspace/api/notizen/' + n.id, { method: 'DELETE' });
|
||||
if (!r.ok) { melde('Entfernen hat nicht geklappt.'); return; }
|
||||
await laden();
|
||||
@@ -997,11 +1002,15 @@
|
||||
});
|
||||
|
||||
$('b-loeschen').addEventListener('click', async () => {
|
||||
if (!confirm(`Aufgabe wirklich loeschen?
|
||||
|
||||
"${bearbeitet.titel}"
|
||||
|
||||
Das laesst sich nicht rueckgaengig machen. Erledigte Aufgaben sollten normalerweise stehen bleiben.`)) return;
|
||||
/* Loeschen ist hier fast nie das Richtige -- deshalb nennt der
|
||||
Dialog den sanfteren Weg beim Namen, statt nur zu warnen. */
|
||||
if (!await frageNach({
|
||||
titel: `„${bearbeitet.titel}" löschen?`,
|
||||
was: 'Die Aufgabe wird samt Rückmeldungen und Verlauf entfernt.',
|
||||
bleibt: 'Wenn sie nur nicht mehr stören soll: „Abbrechen" legt sie '
|
||||
+ 'beiseite, ohne etwas wegzuwerfen – dort ist sie später noch da.',
|
||||
endgueltig: true, ja: 'Endgültig löschen',
|
||||
})) return;
|
||||
try {
|
||||
const a = await hole(`/workspace/api/aufgaben/${bearbeitet.id}`, { method: 'DELETE' });
|
||||
if (!a.ok) { $('b-fehler').textContent = 'Loeschen ging nicht.'; return; }
|
||||
|
||||
@@ -518,8 +518,13 @@
|
||||
b.type = 'button';
|
||||
b.title = 'Schickt Art, Titel und Text als Nachricht in den Chat.';
|
||||
b.addEventListener('click', async () => {
|
||||
if (!confirm(`„${e.titel}“ als Nachricht schicken?\n\n`
|
||||
+ 'Die Person bekommt Art, Titel und Text im Chat – einmalig.')) return;
|
||||
if (!await frageNach({
|
||||
titel: `„${e.titel}" als Nachricht schicken?`,
|
||||
was: 'Die Person bekommt Art, Titel und Text im Chat – einmalig.',
|
||||
bleibt: 'Der Eintrag bleibt hier stehen. Zurückholen lässt sich '
|
||||
+ 'die Nachricht nicht, sobald sie unterwegs ist.',
|
||||
ja: 'Schicken',
|
||||
})) return;
|
||||
b.disabled = true;
|
||||
const a = await hole(`/workspace/api/bereich/entwicklung/${e.id}/senden`,
|
||||
{ method: 'POST', headers: { 'Content-Type': 'application/json' } });
|
||||
@@ -897,9 +902,17 @@
|
||||
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.');
|
||||
if (grund === null) return;
|
||||
const a0 = await frageNach({
|
||||
titel: 'Diesen Beitrag melden?',
|
||||
was: 'Das Team sieht sich den Beitrag an. Du bleibst dabei ungenannt.',
|
||||
bleibt: 'Der Beitrag bleibt vorerst stehen – gemeldet heißt noch '
|
||||
+ 'nicht entfernt.',
|
||||
ja: 'Melden',
|
||||
grund: 'Was ist daran nicht in Ordnung?', grundPflicht: true,
|
||||
platzhalter: 'Bitte in einem Satz – sonst können wir es nicht prüfen.',
|
||||
});
|
||||
if (!a0) return;
|
||||
const grund = a0.grund;
|
||||
const a = await hole('/workspace/api/treff/eintrag/' + e.id + '/melden', {
|
||||
method: 'POST', headers: { 'Content-Type': 'application/json' },
|
||||
body: JSON.stringify({ grund }),
|
||||
@@ -956,7 +969,13 @@
|
||||
dass er einer wird, entscheidet ein Mensch. */
|
||||
if (bereich === 'mitmachen' && e.erstellt_rolle === 'gast') {
|
||||
zeile.append(tuKnopf('zu den Talenten', async () => {
|
||||
if (!confirm('„' + e.titel + '“ zu den Talenten übernehmen?')) return;
|
||||
if (!await frageNach({
|
||||
titel: '„' + e.titel + '" zu den Talenten übernehmen?',
|
||||
was: 'Die Person erscheint danach in der Talente-Liste.',
|
||||
bleibt: 'Der Beitrag hier bleibt stehen. Übernehmen heißt noch '
|
||||
+ 'keine Zusage – es entscheidet weiterhin ein Mensch.',
|
||||
ja: 'Übernehmen',
|
||||
})) return;
|
||||
const a = await hole('/workspace/api/treff/mitmachen/' + e.id + '/uebernehmen',
|
||||
{ method: 'POST', headers: { 'Content-Type': 'application/json' }, body: '{}' });
|
||||
const j = await a.json().catch(() => ({}));
|
||||
@@ -971,9 +990,17 @@
|
||||
fuer den eigenen Beitrag, und der braucht keine Begruendung. */
|
||||
if (e.erstellt_von !== ich.id) {
|
||||
zeile.append(tuKnopf('entfernen', async () => {
|
||||
const grund = prompt('Warum wird „' + e.titel + '“ entfernt?\n\n'
|
||||
+ 'Der Grund wird festgehalten – die Person hat ein Recht darauf.');
|
||||
if (grund === null) return;
|
||||
const a1 = await frageNach({
|
||||
titel: '„' + e.titel + '" entfernen?',
|
||||
was: 'Der Beitrag verschwindet vom Brett.',
|
||||
bleibt: 'Der Grund wird festgehalten und der Person mitgeteilt – '
|
||||
+ 'sie hat ein Recht darauf (DSA Art. 17).',
|
||||
endgueltig: true, ja: 'Entfernen',
|
||||
grund: 'Warum wird er entfernt?', grundPflicht: true,
|
||||
platzhalter: 'z. B. Beleidigende Sprache gegenüber einem anderen Mitglied.',
|
||||
});
|
||||
if (!a1) return;
|
||||
const grund = a1.grund;
|
||||
/* DER GRUND REIST IN DER ADRESSE, nicht im Koerper -- aus
|
||||
demselben gemessenen Grund wie oben. Er ist kein
|
||||
Geheimnis: Er wird der Person, die den Beitrag
|
||||
@@ -1208,7 +1235,12 @@
|
||||
|
||||
if (LEITUNG.has(ich.rolle) || e.erstellt_von === ich.id) {
|
||||
knoepfe.append(tuKnopf('löschen', async () => {
|
||||
if (!confirm(`„${e.titel}" wirklich löschen?`)) return;
|
||||
if (!await frageNach({
|
||||
titel: `„${e.titel}" löschen?`,
|
||||
was: 'Der Eintrag verschwindet vom Brett – für alle.',
|
||||
bleibt: 'Nachrichten, die dazu geschrieben wurden, gehen mit.',
|
||||
endgueltig: true, ja: 'Löschen',
|
||||
})) return;
|
||||
const a = await hole(`/workspace/api/bereich/${bereich}/${e.id}`, { method: 'DELETE' });
|
||||
if (!a.ok) { melde('Löschen hat nicht geklappt.'); return; }
|
||||
await laden();
|
||||
|
||||
@@ -368,11 +368,13 @@
|
||||
if (ich?.rolle === 'admin') {
|
||||
const weg = el('div', 'kk__knoepfe');
|
||||
weg.append(tuKnopf('Protokoll löschen', async () => {
|
||||
if (!confirm('Protokoll zu „' + c.titel + '" löschen?\n\n'
|
||||
+ 'Der Text ist danach weg und lässt sich nicht wiederholen.\n\n'
|
||||
+ 'Das Gespräch selbst bleibt im Kalender und steht danach '
|
||||
+ 'wieder unter „Protokoll fehlt".\n\n'
|
||||
+ 'Bereits daraus entstandene Aufgaben bleiben ebenfalls stehen.')) return;
|
||||
if (!await frageNach({
|
||||
titel: 'Protokoll zu „' + c.titel + '" löschen?',
|
||||
was: 'Der Text ist danach weg und lässt sich nicht wiederholen.',
|
||||
bleibt: 'Das Gespräch bleibt im Kalender und steht danach wieder '
|
||||
+ 'unter „Protokoll fehlt". Daraus entstandene Aufgaben bleiben auch.',
|
||||
endgueltig: true, ja: 'Protokoll löschen',
|
||||
})) return;
|
||||
const a = await hole('/workspace/api/calls/' + c.id + '/protokoll', { method: 'DELETE' });
|
||||
if (!a.ok) {
|
||||
melde(sagWas((await a.json().catch(() => ({}))).fehler, 'Löschen ging nicht.'));
|
||||
|
||||
+21
-14
@@ -1418,8 +1418,12 @@
|
||||
}
|
||||
|
||||
async function zuruecknehmen(id) {
|
||||
if (!window.confirm('Diese Nachricht zurücknehmen? Der Text ist dann weg, '
|
||||
+ 'im Verlauf bleibt ein Hinweis stehen.')) return;
|
||||
if (!await frageNach({
|
||||
titel: 'Nachricht zurücknehmen?',
|
||||
was: 'Der Text ist danach weg – auch bei allen anderen.',
|
||||
bleibt: 'Im Verlauf bleibt ein Hinweis stehen, dass hier etwas stand.',
|
||||
endgueltig: true, ja: 'Zurücknehmen',
|
||||
})) return;
|
||||
try {
|
||||
const a = await hole(`/workspace/api/chat/nachrichten/${id}`, { method: 'DELETE' });
|
||||
if (!a.ok) { melde('Ging nicht.'); return; }
|
||||
@@ -2220,11 +2224,13 @@
|
||||
$('gespraech-weg').addEventListener('click', async () => {
|
||||
if (!offen) return;
|
||||
const wer = offen.name;
|
||||
if (!window.confirm(
|
||||
`Gespräch mit ${wer} wegräumen?\n\n`
|
||||
+ 'Es verschwindet nur bei dir. Der Verlauf beim Gegenüber bleibt '
|
||||
+ 'vollständig.\n\nSchreibt euch jemand wieder, kommt das Gespräch '
|
||||
+ 'mit dem Neuen zurück – das Alte bleibt weg.')) return;
|
||||
if (!await frageNach({
|
||||
titel: `Gespräch mit ${wer} wegräumen?`,
|
||||
was: 'Es verschwindet nur bei dir aus der Liste.',
|
||||
bleibt: `Der Verlauf bei ${wer} bleibt vollständig. Schreibt ihr euch `
|
||||
+ 'wieder, kommt das Gespräch mit dem Neuen zurück – das Alte bleibt weg.',
|
||||
ja: 'Wegräumen',
|
||||
})) return;
|
||||
try {
|
||||
const a = await hole(`/workspace/api/chat/raeume/${offen.id}`, { method: 'DELETE' });
|
||||
if (!a.ok) { melde('Ging nicht.'); return; }
|
||||
@@ -2252,13 +2258,14 @@
|
||||
if (!offen || !offen.darf_aufloesen) return;
|
||||
const wasIstEs = offen.art === 'kanal' ? 'Kanal' : 'Gruppe';
|
||||
const andere = Math.max(0, (offen.teilnehmer?.length || 1) - 1);
|
||||
if (!window.confirm(
|
||||
`${wasIstEs} „${offen.name}" für alle auflösen?\n\n`
|
||||
+ `Der ganze Verlauf wird gelöscht – auch bei ${andere === 1
|
||||
? 'der anderen Person' : `den ${andere} anderen`}, samt aller `
|
||||
+ 'Anhänge. Das lässt sich nicht rückgängig machen.\n\n'
|
||||
+ 'Wenn du sie nur bei dir loswerden willst, nimm den Knopf '
|
||||
+ 'daneben – dann behalten die anderen alles.')) return;
|
||||
if (!await frageNach({
|
||||
titel: `${wasIstEs} „${offen.name}" für alle auflösen?`,
|
||||
was: `Der ganze Verlauf wird gelöscht – auch bei ${andere === 1
|
||||
? 'der anderen Person' : `den ${andere} anderen`}, samt aller Anhänge.`,
|
||||
bleibt: 'Wenn du sie nur bei dir loswerden willst, nimm den Knopf '
|
||||
+ 'daneben – dann behalten die anderen alles.',
|
||||
endgueltig: true, ja: 'Für alle auflösen',
|
||||
})) return;
|
||||
const knopf = $('raum-aufloesen');
|
||||
knopf.disabled = true;
|
||||
try {
|
||||
|
||||
@@ -440,9 +440,17 @@
|
||||
const neu = stufe === wert ? 'offen' : wert;
|
||||
let grund = stand?.begruendung || '';
|
||||
if (neu === 'verbessern') {
|
||||
grund = prompt(`„${p.titel}“\n\nWas genau soll verbessert werden?\n\n`
|
||||
+ 'Ohne diesen Satz kann er nichts damit anfangen.', grund) || '';
|
||||
if (grund.trim().length < 5) return;
|
||||
const ag = await frageNach({
|
||||
titel: `„${p.titel}" – noch verbessern`,
|
||||
was: 'Dein Satz steht danach an diesem Punkt.',
|
||||
bleibt: 'Der Punkt bleibt offen und kann jederzeit wieder '
|
||||
+ 'auf „in Ordnung" gesetzt werden.',
|
||||
ja: 'Zurückgeben',
|
||||
grund: 'Was genau soll verbessert werden?', grundPflicht: true,
|
||||
platzhalter: 'z. B. Fehlt noch das Impressum unten auf der Seite.',
|
||||
});
|
||||
if (!ag) return;
|
||||
grund = ag.grund;
|
||||
}
|
||||
b.disabled = true;
|
||||
try {
|
||||
@@ -549,7 +557,12 @@
|
||||
weg.type = 'button';
|
||||
weg.title = 'Eigene Nachricht zurücknehmen';
|
||||
weg.addEventListener('click', async () => {
|
||||
if (!confirm('Diese Nachricht zurücknehmen?')) return;
|
||||
if (!await frageNach({
|
||||
titel: 'Nachricht zurücknehmen?',
|
||||
was: 'Der Text verschwindet aus diesem Punkt.',
|
||||
bleibt: 'Der Punkt selbst und sein Stand bleiben unverändert.',
|
||||
endgueltig: true, ja: 'Zurücknehmen',
|
||||
})) return;
|
||||
try {
|
||||
const a = await hole(`/workspace/api/checkliste/nachricht/${n.id}`,
|
||||
{ method: 'DELETE' });
|
||||
|
||||
@@ -213,7 +213,12 @@
|
||||
knoepfe.append(tuKnopf('→ LIVE', 'Als LIVE-Thema vormerken', () => uebernehmen(e, 'live')));
|
||||
}
|
||||
knoepfe.append(tuKnopf('löschen', 'Dieses Video entfernen', async () => {
|
||||
if (!confirm(`„${e.titel}" wirklich löschen?`)) return;
|
||||
if (!await frageNach({
|
||||
titel: `„${e.titel}" löschen?`,
|
||||
was: 'Die Idee verschwindet aus der Planung.',
|
||||
bleibt: 'Ein schon eingetragener Drehtermin im Kalender bleibt stehen.',
|
||||
endgueltig: true, ja: 'Löschen',
|
||||
})) return;
|
||||
const a = await hole(`/workspace/api/bereich/content/${e.id}`, { method: 'DELETE' });
|
||||
if (!a.ok) { melde('Löschen hat nicht geklappt.'); return; }
|
||||
await laden();
|
||||
@@ -383,7 +388,13 @@
|
||||
Ausgeblendet ist nicht dasselbe wie nicht vorhanden. */
|
||||
if (!darfEintragen()) { ziel.append(z); continue; }
|
||||
z.append(tuKnopf('löschen', 'Säule entfernen, Videos bleiben', async () => {
|
||||
if (!confirm(`Säule „${s.name}" entfernen? Die Videos bleiben, sie verlieren nur die Zuordnung.`)) return;
|
||||
if (!await frageNach({
|
||||
titel: `Säule „${s.name}" entfernen?`,
|
||||
was: 'Die Säule verschwindet aus der Auswahl.',
|
||||
bleibt: 'Alle Videos bleiben – sie stehen danach nur ohne Säule da '
|
||||
+ 'und lassen sich jederzeit einer anderen zuordnen.',
|
||||
ja: 'Säule entfernen',
|
||||
})) return;
|
||||
const a = await hole(`/workspace/api/content/saeulen/${s.id}`, { method: 'DELETE' });
|
||||
if (!a.ok) { melde('Ging nicht.'); return; }
|
||||
await laden();
|
||||
|
||||
@@ -220,7 +220,12 @@
|
||||
}
|
||||
if (LEITUNG.has(ich.rolle) || (d.hochgeladen_von === ich.id && d.status !== 'freigegeben')) {
|
||||
knoepfe.append(tuKnopf('löschen', async () => {
|
||||
if (!confirm(`„${d.name_original}" wirklich löschen?`)) return;
|
||||
if (!await frageNach({
|
||||
titel: `„${d.name_original}" löschen?`,
|
||||
was: 'Die Datei wird vom Server entfernt.',
|
||||
bleibt: 'Wer sie schon heruntergeladen hat, behält seine Kopie.',
|
||||
endgueltig: true, ja: 'Löschen',
|
||||
})) return;
|
||||
const a = await hole(`/workspace/api/dateien/${d.id}`, { method: 'DELETE' });
|
||||
if (!a.ok) { melde('Löschen hat nicht geklappt.'); return; }
|
||||
await laden();
|
||||
|
||||
@@ -287,8 +287,25 @@
|
||||
}
|
||||
|
||||
async function fallSchliessen(id) {
|
||||
const wort = prompt('Ein Schlusswort? (Kann auch leer bleiben)');
|
||||
if (wort === null) return;
|
||||
/* DER EINZIGE WEG IST VORWAERTS. Gemessen am 19.09.2026: Es gibt
|
||||
keine Route, die einen geschlossenen Fall wieder oeffnet -- weder
|
||||
fuer die Leitung noch fuer die meldende Person. Ein Klick hier
|
||||
ist also endgueltig, und vorher stand darueber nur die Frage
|
||||
nach einem Schlusswort. Wer sie las, konnte nicht ahnen, dass
|
||||
damit der Fall zugeht. */
|
||||
const antwort = await frageNach({
|
||||
titel: 'Diesen Fall abschließen?',
|
||||
was: 'Der Fall gilt danach als erledigt. Es kann niemand mehr '
|
||||
+ 'antworten – auch die Person nicht, die ihn gemeldet hat.',
|
||||
bleibt: 'Der ganze Verlauf bleibt lesbar. Wieder aufmachen lässt '
|
||||
+ 'sich der Fall aber nicht – dafür müsste er neu gemeldet werden.',
|
||||
endgueltig: true,
|
||||
ja: 'Abschließen',
|
||||
grund: 'Ein Schlusswort für die Person? (darf leer bleiben)',
|
||||
platzhalter: 'z. B. Wir haben mit beiden gesprochen, es ist geklärt.',
|
||||
});
|
||||
if (!antwort) return;
|
||||
const wort = antwort.grund;
|
||||
try {
|
||||
const a = await hole('/workspace/api/hilfe/' + id + '/schliessen', {
|
||||
method: 'POST',
|
||||
|
||||
@@ -64,10 +64,13 @@
|
||||
}
|
||||
|
||||
async function erzeugen(erneuern) {
|
||||
if (erneuern && !window.confirm(
|
||||
'Neuen Link erzeugen?\n\nDer alte hört im selben Moment auf zu funktionieren. '
|
||||
+ 'Ein Kalender, der ihn abonniert hat, bekommt danach keine Termine mehr, '
|
||||
+ 'bis du ihm den neuen gibst.')) return;
|
||||
if (erneuern && !await frageNach({
|
||||
titel: 'Neuen Link erzeugen?',
|
||||
was: 'Der alte hört im selben Moment auf zu funktionieren.',
|
||||
bleibt: 'Deine Termine selbst bleiben. Ein Kalender, der den alten Link '
|
||||
+ 'abonniert hat, bekommt aber keine mehr – bis du ihm den neuen gibst.',
|
||||
endgueltig: true, ja: 'Neuen Link erzeugen',
|
||||
})) return;
|
||||
melde('');
|
||||
try {
|
||||
const a = await hole('/workspace/api/ics', {
|
||||
@@ -83,9 +86,13 @@
|
||||
}
|
||||
|
||||
async function abschalten() {
|
||||
if (!window.confirm(
|
||||
'Abschalten?\n\nDeine Termine verschwinden dann aus jedem Kalender, '
|
||||
+ 'der sie abonniert hat.')) return;
|
||||
if (!await frageNach({
|
||||
titel: 'Kalender-Link abschalten?',
|
||||
was: 'Deine Termine verschwinden aus jedem Kalender, der sie abonniert hat.',
|
||||
bleibt: 'Die Termine selbst bleiben hier im Workspace vollständig stehen. '
|
||||
+ 'Du kannst jederzeit einen neuen Link erzeugen.',
|
||||
ja: 'Abschalten',
|
||||
})) return;
|
||||
melde('');
|
||||
try {
|
||||
const a = await hole('/workspace/api/ics', { method: 'DELETE' });
|
||||
|
||||
@@ -949,11 +949,14 @@
|
||||
if (s.darf_aendern) {
|
||||
const knoepfe = el('div', 'k-serie__knoepfe');
|
||||
knoepfe.append(tuKnopf(s.aktiv ? 'abstellen' : 'wieder starten', async () => {
|
||||
if (s.aktiv && !confirm(
|
||||
'Wiederholung „' + s.titel + '" abstellen?\n\n'
|
||||
+ 'Kommende Termine, die noch niemand angefasst hat, werden aus dem '
|
||||
+ 'Kalender genommen. Vergangene und bearbeitete Termine bleiben stehen.\n\n'
|
||||
+ 'Du kannst sie jederzeit wieder starten.')) return;
|
||||
if (s.aktiv && !await frageNach({
|
||||
titel: 'Wiederholung „' + s.titel + '" abstellen?',
|
||||
was: 'Kommende Termine, die noch niemand angefasst hat, werden aus '
|
||||
+ 'dem Kalender genommen.',
|
||||
bleibt: 'Vergangene und bearbeitete Termine bleiben stehen. Du kannst '
|
||||
+ 'die Wiederholung jederzeit wieder starten.',
|
||||
ja: 'Abstellen',
|
||||
})) return;
|
||||
const a = await hole('/workspace/api/serien/' + s.id, {
|
||||
method: 'PATCH',
|
||||
headers: { 'Content-Type': 'application/json' },
|
||||
@@ -963,10 +966,14 @@
|
||||
await laden();
|
||||
}));
|
||||
knoepfe.append(tuKnopf('löschen', async () => {
|
||||
if (!confirm('Wiederholung „' + s.titel + '" ganz löschen?\n\n'
|
||||
+ 'Die Regel ist damit weg. Kommende, unangetastete Termine werden '
|
||||
+ 'entfernt; vergangene und bearbeitete bleiben als normale Termine '
|
||||
+ 'stehen.')) return;
|
||||
if (!await frageNach({
|
||||
titel: 'Wiederholung „' + s.titel + '" ganz löschen?',
|
||||
was: 'Die Regel ist damit weg. Kommende, noch unangetastete Termine '
|
||||
+ 'werden entfernt.',
|
||||
bleibt: 'Vergangene und schon bearbeitete Termine bleiben als '
|
||||
+ 'normale Termine stehen.',
|
||||
endgueltig: true, ja: 'Wiederholung löschen',
|
||||
})) return;
|
||||
const a = await hole('/workspace/api/serien/' + s.id, { method: 'DELETE' });
|
||||
if (!a.ok) { melde('Löschen ging nicht.'); return; }
|
||||
await laden();
|
||||
@@ -1221,12 +1228,20 @@
|
||||
dass NUR dieser eine Tag entfällt. Sonst löscht jemand ihn
|
||||
in der Annahme, die Wiederholung sei damit abgestellt --
|
||||
und wundert sich nächste Woche. */
|
||||
const frage = e.serie_id
|
||||
? 'Nur diesen einen Termin am ' + tagLang(e.tag) + ' streichen?\n\n'
|
||||
+ 'Die Wiederholung „' + e.titel + '" läuft weiter. Zum Abstellen '
|
||||
|
||||
if (!await frageNach({
|
||||
titel: e.serie_id
|
||||
? 'Nur diesen einen Termin am ' + tagLang(e.tag) + ' streichen?'
|
||||
: 'Termin „' + e.titel + '" löschen?',
|
||||
was: e.serie_id
|
||||
? 'Nur dieser eine Tag entfällt.'
|
||||
: 'Der Termin verschwindet aus dem Kalender.',
|
||||
bleibt: e.serie_id
|
||||
? 'Die Wiederholung „' + e.titel + '" läuft weiter. Zum Abstellen '
|
||||
+ 'den Schalter unter „Läuft von allein" benutzen.'
|
||||
: 'Termin „' + e.titel + '" löschen?';
|
||||
if (!confirm(frage)) return;
|
||||
: 'Alle anderen Termine bleiben stehen.',
|
||||
endgueltig: true, ja: e.serie_id ? 'Diesen Tag streichen' : 'Löschen',
|
||||
})) return;
|
||||
const a = await hole('/workspace/api/termine/' + e.id, { method: 'DELETE' });
|
||||
if (!a.ok) { melde('Löschen ging nicht.'); return; }
|
||||
await laden();
|
||||
|
||||
@@ -404,7 +404,13 @@
|
||||
|
||||
async function tagLoeschen() {
|
||||
const d = $('tag-dialog');
|
||||
if (!window.confirm('Diese Zeile wirklich löschen? Die Zahlen des Tages sind dann weg.')) return;
|
||||
if (!await frageNach({
|
||||
titel: 'Zahlen dieses Tages löschen?',
|
||||
was: 'Die eingetragenen Zahlen für diesen Tag werden entfernt.',
|
||||
bleibt: 'Alle anderen Tage bleiben unverändert. Du kannst den Tag '
|
||||
+ 'jederzeit neu eintragen.',
|
||||
endgueltig: true, ja: 'Zeile löschen',
|
||||
})) return;
|
||||
try {
|
||||
const a = await hole(`/workspace/api/leistung/${offenerCreator}/${d.dataset.tag}`,
|
||||
{ method: 'DELETE' });
|
||||
|
||||
@@ -0,0 +1,326 @@
|
||||
/* =====================================================================
|
||||
NACHFRAGEN, BEVOR ETWAS WEG IST — window.frageNach()
|
||||
|
||||
Filipe, 19.09.2026: „Es darf vor allem keine Stellen geben, an denen
|
||||
ein Benutzer etwas falsch machen kann, nur weil die Seite es nicht
|
||||
verstaendlich genug erklaert." Und: „Fehler moeglichst verhindern,
|
||||
bevor sie entstehen."
|
||||
|
||||
---------------------------------------------------------------------
|
||||
WARUM ES DIESE DATEI GIBT
|
||||
|
||||
Das Haus hatte die richtige Bauweise laengst -- in `aufgaben.html`
|
||||
steht sie sogar begruendet: ein <dialog>, kein confirm(), weil
|
||||
confirm die ganze Seite anhaelt, kein Textfeld aufnimmt und auf
|
||||
jedem Rechner anders aussieht.
|
||||
|
||||
Nur stand diese Bauweise IN EINER SEITE. Wer auf einer anderen Seite
|
||||
etwas loeschen liess, hatte sie nicht -- und griff zu confirm().
|
||||
Gemessen am 19.09.2026: 30 Stellen im Workspace, in 16 Dateien.
|
||||
Also wandert sie hierher, wo jede Seite sie hat.
|
||||
|
||||
Das ist dieselbe Lehre wie bei den Fehlermeldungen (`meldung.js`)
|
||||
und bei den Kachelfarben: Was an 30 Stellen gepflegt werden muss,
|
||||
wird an 30 Stellen unterschiedlich. Eine Stelle, die alle benutzen,
|
||||
kann nicht auseinanderlaufen.
|
||||
|
||||
---------------------------------------------------------------------
|
||||
WAS EIN GUTER NACHFRAGE-DIALOG SAGT
|
||||
|
||||
confirm('Wirklich loeschen?') stellt die falsche Frage. Es fragt, ob
|
||||
man sicher ist -- und wer soll das wissen, wenn nicht dasteht, was
|
||||
danach passiert? Der Dialog hier beantwortet drei Dinge:
|
||||
|
||||
1. WAS passiert -- "Die Datei wird geloescht."
|
||||
2. Was NICHT passiert -- "Der Chat-Verlauf bleibt."
|
||||
3. Ob es ZURUECK geht -- "Das laesst sich nicht rueckgaengig machen."
|
||||
|
||||
Punkt 3 ist der wichtigste und in confirm() gar nicht ausdrueckbar.
|
||||
Deshalb traegt der Bestaetigungsknopf bei `endgueltig: true` eine
|
||||
sichtbare Warnfarbe UND der Text sagt es noch einmal in Worten --
|
||||
Farbe allein traegt keine Aussage (Rot-Gruen-Schwaeche, Kontrastmodus).
|
||||
|
||||
---------------------------------------------------------------------
|
||||
DREI AUSGAENGE, wie ueberall im Haus
|
||||
|
||||
<dialog> vorhanden -> der richtige Dialog
|
||||
<dialog> fehlt (alt) -> confirm() als Notnagel, mit DEMSELBEN
|
||||
Text, damit der Nutzer dieselbe
|
||||
Auskunft bekommt -- nur haesslicher
|
||||
Nutzer bricht ab -> false, und zwar immer: bei Esc, beim
|
||||
Klick daneben und beim "Doch nicht"
|
||||
|
||||
Der mittlere Ausgang ist nicht theoretisch: showModal gibt es erst ab
|
||||
Safari 15.4. Ein iPhone, das nicht aktualisiert wurde, wuerde ohne
|
||||
Notnagel gar nichts anzeigen -- und der Knopf taete stillschweigend
|
||||
nichts. Das waere schlimmer als ein haesslicher Dialog.
|
||||
|
||||
---------------------------------------------------------------------
|
||||
AUFRUF
|
||||
|
||||
if (!await frageNach({
|
||||
titel: 'Datei loeschen?',
|
||||
was: 'Die Datei wird vom Server entfernt.',
|
||||
bleibt:'Die Nachricht im Chat bleibt stehen.',
|
||||
endgueltig: true,
|
||||
ja: 'Loeschen',
|
||||
})) return;
|
||||
|
||||
Mit Grund (gibt dann { grund } statt true zurueck):
|
||||
|
||||
const a = await frageNach({ titel: '...', grund: 'Warum?',
|
||||
grundPflicht: true });
|
||||
if (!a) return; // abgebrochen
|
||||
... a.grund ...
|
||||
===================================================================== */
|
||||
|
||||
(function () {
|
||||
'use strict';
|
||||
|
||||
/* Ein einziger Dialog fuer die ganze Seite. Er wird beim ersten
|
||||
Gebrauch gebaut und danach wiederverwendet -- zwei offene Dialoge
|
||||
gleichzeitig kann der Browser ohnehin nicht, und ein neuer je
|
||||
Aufruf wuerde den Fokus verlieren. */
|
||||
var dlg = null, feld = null, tippfeld = null, zahlfeld = null, fehlerZeile = null;
|
||||
|
||||
function bauen() {
|
||||
if (dlg) return dlg;
|
||||
dlg = document.createElement('dialog');
|
||||
dlg.className = 'dialog nachfrage';
|
||||
dlg.innerHTML =
|
||||
'<form method="dialog" class="nachfrage__form">'
|
||||
+ '<h2 class="dialog__titel" data-teil="titel"></h2>'
|
||||
+ '<p class="dialog__unter" data-teil="was"></p>'
|
||||
+ '<p class="dialog__unter dialog__unter--still" data-teil="bleibt"></p>'
|
||||
+ '<p class="nachfrage__endgueltig" data-teil="endgueltig" hidden>'
|
||||
+ 'Das lässt sich danach nicht mehr rückgängig machen.</p>'
|
||||
+ '<div class="nachfrage__zeile" data-teil="tippzeile" hidden>'
|
||||
+ '<label class="feld-schild" data-teil="tippschild" for="nachfrage-tipp"></label>'
|
||||
+ '<input id="nachfrage-tipp" type="text" autocomplete="off"'
|
||||
+ ' autocapitalize="off" spellcheck="false" />'
|
||||
+ '</div>'
|
||||
+ '<div class="nachfrage__zeile" data-teil="grundzeile" hidden>'
|
||||
+ '<label class="feld-schild" data-teil="grundschild" for="nachfrage-grund"></label>'
|
||||
+ '<textarea id="nachfrage-grund" rows="3" maxlength="500"></textarea>'
|
||||
+ '</div>'
|
||||
+ '<div class="nachfrage__zeile" data-teil="zahlzeile" hidden>'
|
||||
+ '<label class="feld-schild" data-teil="zahlschild" for="nachfrage-zahl"></label>'
|
||||
+ '<input id="nachfrage-zahl" type="number" min="1" inputmode="numeric" />'
|
||||
+ '<p class="nachfrage__hinweis" data-teil="zahlhinweis"></p>'
|
||||
+ '</div>'
|
||||
+ '<p class="nachfrage__fehler" data-teil="fehler" role="alert"></p>'
|
||||
+ '<div class="dialog__knoepfe">'
|
||||
+ '<button type="submit" class="knopf knopf--klein" data-teil="ja"></button>'
|
||||
+ '<button type="button" class="abmelden" data-teil="nein">Doch nicht</button>'
|
||||
+ '</div></form>';
|
||||
document.body.appendChild(dlg);
|
||||
feld = dlg.querySelector('#nachfrage-grund');
|
||||
tippfeld = dlg.querySelector('#nachfrage-tipp');
|
||||
zahlfeld = dlg.querySelector('#nachfrage-zahl');
|
||||
fehlerZeile = dlg.querySelector('[data-teil="fehler"]');
|
||||
return dlg;
|
||||
}
|
||||
|
||||
function teil(name) { return dlg.querySelector('[data-teil="' + name + '"]'); }
|
||||
|
||||
/** Setzt Text und blendet die Zeile aus, wenn es keinen gibt.
|
||||
* Eine leere Zeile, die Platz einnimmt, sieht aus wie ein Fehler. */
|
||||
function zeile(name, text) {
|
||||
var e = teil(name);
|
||||
e.textContent = text || '';
|
||||
e.hidden = !text;
|
||||
}
|
||||
|
||||
window.frageNach = function frageNach(o) {
|
||||
o = o || {};
|
||||
var titel = o.titel || 'Sicher?';
|
||||
var was = o.was || '';
|
||||
var bleibt = o.bleibt || '';
|
||||
var ja = o.ja || 'Ja, machen';
|
||||
var nein = o.nein || 'Doch nicht';
|
||||
var endgueltig = !!o.endgueltig;
|
||||
var grund = o.grund || '';
|
||||
var grundPflicht = !!o.grundPflicht;
|
||||
var platzhalter = o.platzhalter || '';
|
||||
/* ABTIPPEN STATT ANKLICKEN. Fuer die Handgriffe, bei denen ein
|
||||
Fehlklick nicht zu reparieren ist (eine Person loeschen). Wer den
|
||||
Namen abtippt, hat ihn gelesen -- das ist der eigentliche Zweck,
|
||||
nicht die Huerde. */
|
||||
var tippen = o.tippen || '';
|
||||
/* EIN EINZEILIGES FELD, wenn nach einem Namen gefragt wird und
|
||||
nicht nach einem Grund. Ein Textfeld ueber drei Zeilen fuer einen
|
||||
Vornamen sieht aus, als erwarte jemand einen Aufsatz. Benutzt
|
||||
dasselbe Feld wie `tippen` -- beides gleichzeitig kommt nicht vor
|
||||
und waere auch nicht sinnvoll. */
|
||||
var eingabe = o.eingabe || '';
|
||||
var eingabeWert = o.eingabeWert || '';
|
||||
var eingabeMin = o.eingabeMin === undefined ? 2 : o.eingabeMin;
|
||||
/* EINE ZAHL IM SELBEN DIALOG. Vorher fragte die Moderation zweimal
|
||||
hintereinander (Grund, dann Dauer) -- zwei Kaesten nacheinander,
|
||||
und wer beim zweiten abbrach, hatte den ersten umsonst getippt.
|
||||
Reihenfolge bleibt: erst WARUM, dann WIE LANGE. Wer zuerst nach
|
||||
der Dauer gefragt wird, hat die Strafe festgelegt, bevor er sie
|
||||
begruendet hat. */
|
||||
var zahl = o.zahl || '';
|
||||
var zahlWert = o.zahlWert === undefined ? '' : String(o.zahlWert);
|
||||
var zahlMax = o.zahlMax || 0;
|
||||
var zahlLeer = !!o.zahlLeer;
|
||||
var zahlHinweis = o.zahlHinweis || '';
|
||||
var NIE_ZURUECK = 'Das lässt sich danach nicht mehr rückgängig machen.';
|
||||
|
||||
/* ---- Ausgang 2: kein <dialog> -> confirm() mit DEMSELBEN Text ----
|
||||
Nicht "Sicher?" -- wer den Notnagel bekommt, soll dieselbe
|
||||
Auskunft haben wie alle anderen. */
|
||||
if (typeof HTMLDialogElement === 'undefined'
|
||||
|| !HTMLDialogElement.prototype.showModal) {
|
||||
var text = [titel, was, bleibt, endgueltig ? NIE_ZURUECK : '']
|
||||
.filter(Boolean).join('\n\n');
|
||||
if (!window.confirm(text)) return Promise.resolve(false);
|
||||
if (tippen) {
|
||||
var t0 = window.prompt('Zum Bestätigen genau eingeben: ' + tippen, '');
|
||||
if (t0 === null || t0.trim() !== tippen) return Promise.resolve(false);
|
||||
}
|
||||
var erg = {};
|
||||
if (eingabe) {
|
||||
var e0 = window.prompt(eingabe, eingabeWert);
|
||||
if (e0 === null || e0.trim().length < eingabeMin) return Promise.resolve(false);
|
||||
erg.eingabe = e0.trim();
|
||||
}
|
||||
if (grund) {
|
||||
var g0 = window.prompt(grund, '');
|
||||
if (g0 === null) return Promise.resolve(false);
|
||||
if (grundPflicht && g0.trim().length < 3) return Promise.resolve(false);
|
||||
erg.grund = g0.trim();
|
||||
}
|
||||
if (zahl) {
|
||||
var z0 = window.prompt(zahl + (zahlHinweis ? ' (' + zahlHinweis + ')' : ''),
|
||||
zahlWert);
|
||||
if (z0 === null) return Promise.resolve(false);
|
||||
erg.zahl = z0.trim() === '' ? null : Number(z0);
|
||||
}
|
||||
return Promise.resolve((grund || zahl || eingabe) ? erg : true);
|
||||
}
|
||||
|
||||
bauen();
|
||||
teil('titel').textContent = titel;
|
||||
zeile('was', was);
|
||||
zeile('bleibt', bleibt);
|
||||
teil('endgueltig').hidden = !endgueltig;
|
||||
teil('ja').textContent = ja;
|
||||
teil('nein').textContent = nein;
|
||||
/* Warnfarbe NUR zusaetzlich zum Satz oben, nie statt seiner. */
|
||||
teil('ja').classList.toggle('knopf--warn', endgueltig);
|
||||
teil('tippzeile').hidden = !(tippen || eingabe);
|
||||
if (eingabe) {
|
||||
teil('tippschild').textContent = eingabe;
|
||||
tippfeld.value = eingabeWert;
|
||||
tippfeld.placeholder = '';
|
||||
} else if (tippen) {
|
||||
teil('tippschild').textContent = 'Zum Bestätigen genau eingeben: ' + tippen;
|
||||
tippfeld.value = '';
|
||||
/* KEIN Platzhalter mit dem erwarteten Wort. Er sieht in einem
|
||||
leeren Feld aus wie ein bereits eingetragener Text -- und wer
|
||||
glaubt, es stehe schon da, drueckt auf "Loeschen" und wundert
|
||||
sich ueber die Fehlermeldung. Der Name steht ohnehin in der
|
||||
Beschriftung direkt darueber. */
|
||||
tippfeld.placeholder = '';
|
||||
}
|
||||
teil('grundzeile').hidden = !grund;
|
||||
if (grund) {
|
||||
teil('grundschild').textContent = grund;
|
||||
feld.value = '';
|
||||
feld.placeholder = platzhalter;
|
||||
}
|
||||
teil('zahlzeile').hidden = !zahl;
|
||||
if (zahl) {
|
||||
teil('zahlschild').textContent = zahl;
|
||||
teil('zahlhinweis').textContent = zahlHinweis;
|
||||
zahlfeld.value = zahlWert;
|
||||
if (zahlMax) zahlfeld.max = String(zahlMax); else zahlfeld.removeAttribute('max');
|
||||
zahlfeld.required = !zahlLeer;
|
||||
}
|
||||
fehlerZeile.textContent = '';
|
||||
|
||||
return new Promise(function (fertig) {
|
||||
var antwort = false;
|
||||
var form = dlg.querySelector('form');
|
||||
|
||||
function aufraeumen() {
|
||||
dlg.removeEventListener('close', beiSchliessen);
|
||||
form.removeEventListener('submit', beiJa);
|
||||
teil('nein').removeEventListener('click', beiNein);
|
||||
dlg.removeEventListener('click', beiDaneben);
|
||||
}
|
||||
function beiSchliessen() { aufraeumen(); fertig(antwort); }
|
||||
function beiNein() { antwort = false; dlg.close(); }
|
||||
function beiDaneben(e) {
|
||||
/* Klick auf den abgedunkelten Rand = abbrechen. Das erwartet
|
||||
jeder, und ohne es bleibt der Dialog am Handy gefuehlt
|
||||
haengen, weil dort kein Esc zur Verfuegung steht. */
|
||||
if (e.target === dlg) { antwort = false; dlg.close(); }
|
||||
}
|
||||
function beiJa(e) {
|
||||
e.preventDefault();
|
||||
if (eingabe && tippfeld.value.trim().length < eingabeMin) {
|
||||
fehlerZeile.textContent = eingabeMin > 1
|
||||
? 'Bitte mindestens ' + eingabeMin + ' Zeichen eintragen.'
|
||||
: 'Bitte etwas eintragen.';
|
||||
tippfeld.focus(); return;
|
||||
}
|
||||
if (tippen && tippfeld.value.trim() !== tippen) {
|
||||
/* Sagt, WAS nicht stimmt -- "falsch" allein hilft niemandem,
|
||||
der sich vertippt hat. */
|
||||
fehlerZeile.textContent = 'Das stimmt noch nicht. Erwartet wird genau: '
|
||||
+ tippen;
|
||||
tippfeld.focus();
|
||||
tippfeld.select();
|
||||
return;
|
||||
}
|
||||
var erg2 = {};
|
||||
if (eingabe) erg2.eingabe = tippfeld.value.trim();
|
||||
if (grund) {
|
||||
var g = feld.value.trim();
|
||||
if (grundPflicht && g.length < 3) {
|
||||
fehlerZeile.textContent = 'Bitte kurz sagen, warum.';
|
||||
feld.focus();
|
||||
return; /* NICHT schliessen -- sonst waere die Eingabe weg */
|
||||
}
|
||||
erg2.grund = g;
|
||||
}
|
||||
if (zahl) {
|
||||
var roh = zahlfeld.value.trim();
|
||||
if (roh === '' && !zahlLeer) {
|
||||
fehlerZeile.textContent = 'Bitte eine Anzahl eintragen.';
|
||||
zahlfeld.focus(); return;
|
||||
}
|
||||
var n = roh === '' ? null : Number(roh);
|
||||
if (n !== null && !(n > 0)) {
|
||||
fehlerZeile.textContent = 'Das ist keine gültige Anzahl.';
|
||||
zahlfeld.focus(); return;
|
||||
}
|
||||
if (n !== null && zahlMax && n > zahlMax) {
|
||||
fehlerZeile.textContent = 'Mehr als ' + zahlMax + ' geht hier nicht.';
|
||||
zahlfeld.focus(); return;
|
||||
}
|
||||
erg2.zahl = n;
|
||||
}
|
||||
antwort = (grund || zahl || eingabe) ? erg2 : true;
|
||||
dlg.close();
|
||||
}
|
||||
|
||||
dlg.addEventListener('close', beiSchliessen);
|
||||
form.addEventListener('submit', beiJa);
|
||||
teil('nein').addEventListener('click', beiNein);
|
||||
dlg.addEventListener('click', beiDaneben);
|
||||
|
||||
dlg.showModal();
|
||||
/* Der Fokus liegt auf dem harmlosen Knopf, nicht auf "Loeschen".
|
||||
Wer aus Gewohnheit Enter drueckt, bricht damit ab -- das ist
|
||||
die richtige Richtung fuer einen Fehlgriff. Ausser es gibt ein
|
||||
Textfeld, dann gehoert der Fokus dorthin. */
|
||||
if (tippen || eingabe) tippfeld.focus();
|
||||
else if (grund) feld.focus();
|
||||
else teil('nein').focus();
|
||||
});
|
||||
};
|
||||
})();
|
||||
@@ -311,8 +311,14 @@
|
||||
allein sagt nicht, WAS sich ändert -- und es ist der Handgriff,
|
||||
der jemandem den Zugang zu einer ganzen Seite nimmt oder gibt. */
|
||||
const name = $('rolle-wahl').querySelector('.rollenwahl__knopf[data-an="ja"] .rollenwahl__name')?.textContent || gewaehlt;
|
||||
if (!confirm(`${rolleFuer.name} wird von "${ROLLENNAME[rolleFuer.rolle] || rolleFuer.rolle}" zu "${name}".\n\n`
|
||||
+ 'Der Zugangscode bleibt derselbe. Offene Sitzungen werden beendet.')) return;
|
||||
if (!await frageNach({
|
||||
titel: `${rolleFuer.name}: Rolle ändern?`,
|
||||
was: `Von „${ROLLENNAME[rolleFuer.rolle] || rolleFuer.rolle}" zu „${name}".`
|
||||
+ ' Damit ändert sich, welche Seiten die Person öffnen darf.',
|
||||
bleibt: 'Der Zugangscode bleibt derselbe. Offene Sitzungen werden beendet, '
|
||||
+ 'danach kann sie sich mit dem alten Code wieder anmelden.',
|
||||
ja: `Zu „${name}" machen`,
|
||||
})) return;
|
||||
|
||||
const a = await hole(`/workspace/api/verwaltung/personen/${rolleFuer.id}/rolle`, {
|
||||
method: 'PUT',
|
||||
@@ -577,18 +583,17 @@ Der Code gilt einmal fuer die `
|
||||
|
||||
knoepfe.append(tuKnopf('Neuer Code', async () => {
|
||||
const eigen = p.id === ich.id;
|
||||
const frage = eigen
|
||||
/* Der Satz stimmte bis zum 02.09.2026 -- und beschrieb genau die
|
||||
Falle: Man bestätigte, der Code erschien, und im selben Moment
|
||||
war die Sitzung weg. Jetzt bleibt sie bestehen, und der Text
|
||||
sagt, was wirklich passiert. */
|
||||
? 'Neuer Code für dich selbst?\n\n'
|
||||
+ 'Der alte Code gilt danach nicht mehr, und alle ANDEREN Geräte '
|
||||
+ 'werden abgemeldet.\n\n'
|
||||
+ 'Hier bleibst du angemeldet – der neue Code steht danach auf dem '
|
||||
+ 'Bildschirm, bis du ihn selbst wegklickst.'
|
||||
: `Neuer Code für ${p.name}?\n\nDer alte Code gilt dann nicht mehr, offene Sitzungen werden beendet.`;
|
||||
if (!confirm(frage)) return;
|
||||
if (!await frageNach({
|
||||
titel: eigen ? 'Neuer Code für dich selbst?' : `Neuer Code für ${p.name}?`,
|
||||
was: 'Der alte Code gilt danach nicht mehr.',
|
||||
bleibt: eigen
|
||||
? 'Alle ANDEREN Geräte werden abgemeldet – hier bleibst du '
|
||||
+ 'angemeldet. Der neue Code steht danach auf dem Bildschirm, '
|
||||
+ 'bis du ihn selbst wegklickst.'
|
||||
: `Offene Sitzungen von ${p.name} werden beendet. Alles andere `
|
||||
+ 'bleibt unverändert – nur der Code ist neu.',
|
||||
endgueltig: true, ja: 'Neuen Code erzeugen',
|
||||
})) return;
|
||||
const a = await hole(`/workspace/api/verwaltung/personen/${p.id}/code`, {
|
||||
method: 'POST',
|
||||
headers: { 'Content-Type': 'application/json' },
|
||||
@@ -601,7 +606,13 @@ Der Code gilt einmal fuer die `
|
||||
|
||||
if (p.id !== ich.id) {
|
||||
knoepfe.append(tuKnopf(p.aktiv ? 'Sperren' : 'Entsperren', async () => {
|
||||
if (p.aktiv && !confirm(`${p.name} sperren?\n\nOffene Sitzungen werden sofort beendet.`)) return;
|
||||
if (p.aktiv && !await frageNach({
|
||||
titel: `${p.name} sperren?`,
|
||||
was: 'Offene Sitzungen werden sofort beendet. Anmelden geht danach nicht mehr.',
|
||||
bleibt: 'Alle Daten bleiben stehen – Aufgaben, Nachrichten, Steckbrief. '
|
||||
+ 'Entsperren geht jederzeit mit demselben Knopf.',
|
||||
ja: 'Sperren',
|
||||
})) return;
|
||||
const a = await hole(`/workspace/api/verwaltung/personen/${p.id}`, {
|
||||
method: 'PATCH',
|
||||
headers: { 'Content-Type': 'application/json' },
|
||||
@@ -704,43 +715,42 @@ Der Code gilt einmal fuer die `
|
||||
|
||||
if (v.hindernis) { melde(v.hindernis); return; }
|
||||
|
||||
const zeilen = [];
|
||||
const mit = Object.entries(v.mit).filter(([, n]) => n > 0);
|
||||
const bleibt = Object.entries(v.bleibt).filter(([, n]) => n > 0);
|
||||
|
||||
zeilen.push(`„${v.person.name}" wirklich löschen?`, '');
|
||||
if (mit.length) {
|
||||
zeilen.push('Wird MITGELÖSCHT:');
|
||||
for (const [was, n] of mit) zeilen.push(` · ${was}: ${n}`);
|
||||
zeilen.push('');
|
||||
}
|
||||
if (bleibt.length) {
|
||||
zeilen.push('BLEIBT erhalten, verliert nur die Zuordnung:');
|
||||
for (const [was, n] of bleibt) zeilen.push(` · ${was}: ${n}`);
|
||||
zeilen.push('');
|
||||
}
|
||||
if (v.verliertBetreuung.length) {
|
||||
zeilen.push(`ACHTUNG: ${v.verliertBetreuung.join(', ')} `
|
||||
+ `${v.verliertBetreuung.length === 1 ? 'steht' : 'stehen'} danach ohne zuständige Person da.`, '');
|
||||
}
|
||||
if (!mit.length && !bleibt.length && !v.verliertBetreuung.length) {
|
||||
zeilen.push('An dieser Person hängt nichts.', '');
|
||||
}
|
||||
zeilen.push('Vorher wird automatisch eine Sicherung geschrieben.', '',
|
||||
`Zum Bestätigen den Namen genau eingeben: ${v.person.name}`);
|
||||
/* Was mitgeht und was bleibt, sind ZWEI Aussagen -- deshalb stehen
|
||||
sie im Dialog auch in zwei Zeilen und nicht in einer Liste, die
|
||||
man von oben nach unten durchliest und in der Mitte aufgibt. */
|
||||
const wasWeg = mit.length
|
||||
? 'Mitgelöscht wird: ' + mit.map(([w, n]) => `${w} (${n})`).join(', ') + '.'
|
||||
: 'An dieser Person hängt nichts, was mitgelöscht würde.';
|
||||
const wasBleibt = [
|
||||
bleibt.length
|
||||
? 'Erhalten bleibt, verliert aber die Zuordnung: '
|
||||
+ bleibt.map(([w, n]) => `${w} (${n})`).join(', ') + '.'
|
||||
: '',
|
||||
v.verliertBetreuung.length
|
||||
? `${v.verliertBetreuung.join(', ')} `
|
||||
+ `${v.verliertBetreuung.length === 1 ? 'steht' : 'stehen'} danach `
|
||||
+ 'ohne zuständige Person da.'
|
||||
: '',
|
||||
'Vorher wird automatisch eine Sicherung geschrieben.',
|
||||
].filter(Boolean).join(' ');
|
||||
|
||||
const eingabe = prompt(zeilen.join('\n'), '');
|
||||
if (eingabe === null) return;
|
||||
if (eingabe.trim() !== v.person.name) {
|
||||
melde('Der Name stimmt nicht – es wurde nichts gelöscht.');
|
||||
return;
|
||||
}
|
||||
if (!await frageNach({
|
||||
titel: `„${v.person.name}" löschen?`,
|
||||
was: wasWeg,
|
||||
bleibt: wasBleibt,
|
||||
endgueltig: true,
|
||||
ja: 'Endgültig löschen',
|
||||
tippen: v.person.name,
|
||||
})) return;
|
||||
|
||||
try {
|
||||
const a = await hole(`/workspace/api/verwaltung/personen/${person.id}`, {
|
||||
method: 'DELETE',
|
||||
headers: { 'Content-Type': 'application/json' },
|
||||
body: JSON.stringify({ name: eingabe.trim() }),
|
||||
body: JSON.stringify({ name: v.person.name }),
|
||||
});
|
||||
const d = await a.json().catch(() => ({}));
|
||||
if (!a.ok) { melde(sagWas(d.fehler, 'Löschen hat nicht geklappt.')); return; }
|
||||
|
||||
@@ -109,9 +109,13 @@
|
||||
sieht sofort jemand. Etwas aufzumachen merkt unter Umständen
|
||||
lange niemand — und genau das ist der Klick, bei dem eine
|
||||
Sekunde Nachdenken etwas wert ist. */
|
||||
if (erlaubt && !confirm(
|
||||
`„${rolle.name}" darf danach ${seite.datei} öffnen.\n\n`
|
||||
+ 'Das gilt sofort, für alle mit dieser Rolle. Sicher?')) return;
|
||||
if (erlaubt && !await frageNach({
|
||||
titel: `„${rolle.name}" darf danach ${seite.datei} öffnen`,
|
||||
was: 'Das gilt sofort, für alle mit dieser Rolle.',
|
||||
bleibt: 'Zurücknehmen geht jederzeit mit demselben Schalter – aber bis '
|
||||
+ 'dahin hat jeder mit dieser Rolle Zugang.',
|
||||
ja: 'Freigeben',
|
||||
})) return;
|
||||
|
||||
knopf.disabled = true;
|
||||
try {
|
||||
@@ -167,8 +171,13 @@
|
||||
const b = el('button', 'schritt', 'Alles zurück auf Grundstand');
|
||||
b.type = 'button';
|
||||
b.addEventListener('click', async () => {
|
||||
if (!confirm(`${daten.abweichungen} Änderungen zurücknehmen?\n\n`
|
||||
+ 'Danach gilt wieder genau das, was im Code steht.')) return;
|
||||
if (!await frageNach({
|
||||
titel: `${daten.abweichungen} Änderungen zurücknehmen?`,
|
||||
was: 'Danach gilt wieder genau das, was im Code steht.',
|
||||
bleibt: 'Die Rechte selbst gehen nicht verloren – nur die von Hand '
|
||||
+ 'gesetzten Abweichungen. Du kannst sie jederzeit neu setzen.',
|
||||
ja: 'Auf Grundstand zurück',
|
||||
})) return;
|
||||
b.disabled = true;
|
||||
const a = await hole('/workspace/api/rechte/abweichungen', { method: 'DELETE' });
|
||||
b.disabled = false;
|
||||
|
||||
@@ -166,9 +166,14 @@
|
||||
const b = el('button', 'knopf knopf--klein', 'Durchgegangen und bestätigt');
|
||||
b.type = 'button';
|
||||
b.addEventListener('click', async () => {
|
||||
if (!confirm('Bestätigen, dass ihr das Dokument gemeinsam durchgegangen seid?\n\n'
|
||||
+ 'Sobald BEIDE bestätigt haben, ist der Nachweis endgültig und lässt sich '
|
||||
+ 'nicht mehr ändern.')) return;
|
||||
if (!await frageNach({
|
||||
titel: 'Gemeinsam durchgegangen?',
|
||||
was: 'Deine Bestätigung wird mit Datum festgehalten.',
|
||||
bleibt: 'Sobald BEIDE bestätigt haben, ist der Nachweis endgültig '
|
||||
+ 'und lässt sich nicht mehr ändern. Solange nur du bestätigt '
|
||||
+ 'hast, ist noch nichts festgeschrieben.',
|
||||
ja: 'Ja, bestätigen',
|
||||
})) return;
|
||||
b.disabled = true;
|
||||
b.textContent = 'wird gespeichert …';
|
||||
try {
|
||||
|
||||
@@ -329,7 +329,12 @@
|
||||
const wg = el('button', 'knopf-still knopf-still--warn', 'Löschen');
|
||||
wg.type = 'button';
|
||||
wg.addEventListener('click', async () => {
|
||||
if (!confirm(`„${l.name}" wirklich aus der Pipeline entfernen?`)) return;
|
||||
if (!await frageNach({
|
||||
titel: `„${l.name}" aus der Pipeline entfernen?`,
|
||||
was: 'Der Lead verschwindet aus der Liste, samt Notizen und Verlauf.',
|
||||
bleibt: 'Andere Leads bleiben unberührt.',
|
||||
endgueltig: true, ja: 'Entfernen',
|
||||
})) return;
|
||||
if (await schicke('/workspace/api/leads/' + l.id, 'DELETE')) { offen.delete(l.id); await laden(); }
|
||||
});
|
||||
unten.append(wg);
|
||||
@@ -344,7 +349,13 @@
|
||||
}
|
||||
|
||||
async function onboarding(l, knopf) {
|
||||
if (!confirm(`Aus „${l.name}" jetzt einen Creator mit eigenem Zugang anlegen?`)) return;
|
||||
if (!await frageNach({
|
||||
titel: `Aus „${l.name}" einen Creator mit eigenem Zugang anlegen?`,
|
||||
was: 'Es entsteht ein Konto mit eigenem Zugangscode.',
|
||||
bleibt: 'Der Lead bleibt in der Pipeline stehen und wird als '
|
||||
+ 'übernommen markiert.',
|
||||
ja: 'Creator anlegen',
|
||||
})) return;
|
||||
knopf.disabled = true;
|
||||
const r = await schicke('/workspace/api/leads/' + l.id + '/onboarding', 'POST', { name: l.name });
|
||||
knopf.disabled = false;
|
||||
|
||||
@@ -160,7 +160,14 @@
|
||||
});
|
||||
|
||||
$('sb-bild-weg').addEventListener('click', async () => {
|
||||
if (!confirm('Profilbild entfernen?')) return;
|
||||
if (!await frageNach({
|
||||
titel: 'Profilbild entfernen?',
|
||||
was: 'Dein Bild verschwindet überall – aus der Liste, aus dem Chat, '
|
||||
+ 'aus deinem Steckbrief.',
|
||||
bleibt: 'Alles andere an deinem Steckbrief bleibt stehen. Du kannst '
|
||||
+ 'jederzeit ein neues Bild hochladen.',
|
||||
ja: 'Bild entfernen',
|
||||
})) return;
|
||||
try {
|
||||
const a = await hole('/workspace/api/steckbrief/bild', { method: 'DELETE' });
|
||||
if (!a.ok) { melde('Entfernen ging nicht.'); return; }
|
||||
|
||||
@@ -650,12 +650,18 @@
|
||||
if (!darfAnlegen()) { melde('Zugänge legt DogFather an.'); return null; }
|
||||
|
||||
const vorschlag = String(k.titel || '').split(/[\s,(–-]+/)[0] || '';
|
||||
const name = prompt(
|
||||
'Wie soll die Person im Workspace heißen?\n\n'
|
||||
+ 'Das ist der Name, den euer Team sieht. Gleich danach bekommst du '
|
||||
+ 'einmalig ihren Zugangscode – danach nie wieder.',
|
||||
vorschlag);
|
||||
if (name === null) return null; // abgebrochen
|
||||
const an = await frageNach({
|
||||
titel: 'Zugang anlegen',
|
||||
was: 'Die Person bekommt ein eigenes Konto im Workspace.',
|
||||
bleibt: 'Gleich danach siehst du einmalig ihren Zugangscode – danach '
|
||||
+ 'nie wieder. Schreib ihn dir vorher auf oder hab den Chat offen.',
|
||||
ja: 'Zugang anlegen',
|
||||
eingabe: 'Wie soll die Person im Workspace heißen?',
|
||||
eingabeWert: vorschlag,
|
||||
eingabeMin: 2,
|
||||
});
|
||||
if (!an) return null; // abgebrochen
|
||||
const name = an.eingabe;
|
||||
if (String(name).trim().length < 2) { melde('Der Name ist zu kurz.'); return null; }
|
||||
|
||||
let a;
|
||||
|
||||
@@ -181,10 +181,24 @@
|
||||
}
|
||||
|
||||
async function entscheiden(id, status) {
|
||||
const entscheid = prompt(status === 'erledigt'
|
||||
? 'Was hast du getan?\n\nEin Satz genügt – er wird zur Meldung festgehalten.'
|
||||
: 'Warum ist daran nichts dran?\n\nEin Satz genügt – er wird festgehalten.');
|
||||
if (entscheid === null) return;
|
||||
const ae = await frageNach({
|
||||
titel: status === 'erledigt' ? 'Meldung als erledigt schließen'
|
||||
: 'Meldung als unbegründet schließen',
|
||||
was: status === 'erledigt'
|
||||
? 'Die Meldung gilt danach als bearbeitet.'
|
||||
: 'Die Meldung gilt danach als geprüft, ohne Folgen für die Person.',
|
||||
bleibt: 'Dein Satz wird zur Meldung festgehalten und bleibt im Verlauf '
|
||||
+ 'lesbar. Der Beitrag selbst ändert sich dadurch nicht.',
|
||||
ja: 'Schließen',
|
||||
grund: status === 'erledigt' ? 'Was hast du getan?'
|
||||
: 'Warum ist daran nichts dran?',
|
||||
grundPflicht: true,
|
||||
platzhalter: status === 'erledigt'
|
||||
? 'z. B. Beitrag entfernt und die Person angeschrieben.'
|
||||
: 'z. B. Der Beitrag verstößt gegen keine Regel.',
|
||||
});
|
||||
if (!ae) return;
|
||||
const entscheid = ae.grund;
|
||||
const a = await hole('/workspace/api/treff/meldung/' + id, {
|
||||
method: 'PATCH',
|
||||
headers: { 'Content-Type': 'application/json' },
|
||||
@@ -270,24 +284,36 @@
|
||||
wird, hat die Strafe schon festgelegt, bevor er sie begründet hat.
|
||||
So steht am Anfang die Frage, was eigentlich passiert ist. */
|
||||
async function massnahme(m, art, darf) {
|
||||
const grund = prompt(art === 'hinweis'
|
||||
? `Hinweis an ${m.name} – worum geht es?`
|
||||
: `${art === 'pause' ? 'Pause' : 'Ausschluss'} für ${m.name} – warum?\n\n`
|
||||
+ 'Der Grund wird festgehalten, und die Person hat ein Recht darauf.');
|
||||
if (grund === null) return;
|
||||
|
||||
let tage;
|
||||
if (art !== 'hinweis') {
|
||||
const hinweis = darf?.frist_tage
|
||||
? `Du kannst bis zu ${darf.frist_tage} Tage geben.`
|
||||
: 'Leer lassen = dauerhaft (nur bei Ausschluss).';
|
||||
const ein = prompt(`Für wie viele Tage?\n\n${hinweis}`,
|
||||
darf?.frist_tage ? String(darf.frist_tage) : '7');
|
||||
if (ein === null) return;
|
||||
tage = ein.trim() === '' ? null : Number(ein);
|
||||
if (tage !== null && !(tage > 0)) { melde('Das ist keine Anzahl Tage.'); return; }
|
||||
if (tage === null && art === 'pause') { melde('Eine Pause braucht eine Dauer.'); return; }
|
||||
}
|
||||
const istHinweis = art === 'hinweis';
|
||||
const wieLang = istHinweis ? null : (darf?.frist_tage || 0);
|
||||
const a0 = await frageNach({
|
||||
titel: istHinweis
|
||||
? `Hinweis an ${m.name}`
|
||||
: `${art === 'pause' ? 'Pause' : 'Ausschluss'} für ${m.name}`,
|
||||
was: istHinweis
|
||||
? 'Die Person bekommt deinen Text zu lesen. Sie darf weiter mitmachen.'
|
||||
: (art === 'pause'
|
||||
? 'Die Person kann für die eingetragene Zeit nichts schreiben.'
|
||||
: 'Die Person kann nichts mehr schreiben.'),
|
||||
bleibt: 'Der Grund wird festgehalten und der Person mitgeteilt – sie hat '
|
||||
+ 'ein Recht darauf. Aufheben geht jederzeit.',
|
||||
ja: istHinweis ? 'Hinweis schicken' : 'Eintragen',
|
||||
grund: istHinweis ? 'Worum geht es?' : 'Warum?', grundPflicht: true,
|
||||
platzhalter: istHinweis
|
||||
? 'z. B. Bitte nicht mehrfach dasselbe posten.'
|
||||
: 'z. B. Wiederholte Beleidigungen trotz Hinweis.',
|
||||
zahl: istHinweis ? '' : 'Für wie viele Tage?',
|
||||
zahlWert: wieLang ? String(wieLang) : '7',
|
||||
zahlMax: wieLang || 0,
|
||||
/* Leer = dauerhaft, aber NUR beim Ausschluss -- eine Pause ohne
|
||||
Ende waere ein Ausschluss unter falschem Namen. */
|
||||
zahlLeer: art === 'ausschluss' && !wieLang,
|
||||
zahlHinweis: wieLang ? `Höchstens ${wieLang} Tage.`
|
||||
: (art === 'ausschluss' ? 'Leer lassen = dauerhaft.' : ''),
|
||||
});
|
||||
if (!a0) return;
|
||||
const grund = a0.grund;
|
||||
const tage = istHinweis ? undefined : a0.zahl;
|
||||
|
||||
const a = await hole('/workspace/api/treff/massnahme', {
|
||||
method: 'POST',
|
||||
@@ -324,7 +350,13 @@
|
||||
+ ' am ' + datum(m.zeitpunkt)],
|
||||
], laeuft && m.art !== 'hinweis' ? [
|
||||
knopf('aufheben', async () => {
|
||||
if (!confirm(`Maßnahme gegen ${m.person_name} aufheben?`)) return;
|
||||
if (!await frageNach({
|
||||
titel: `Maßnahme gegen ${m.person_name} aufheben?`,
|
||||
was: 'Die Person darf danach sofort wieder mitmachen.',
|
||||
bleibt: 'Die Maßnahme bleibt im Verlauf sichtbar – sie wird nur '
|
||||
+ 'beendet, nicht gelöscht.',
|
||||
ja: 'Aufheben',
|
||||
})) return;
|
||||
const r = await hole('/workspace/api/treff/massnahme/' + m.id, { method: 'DELETE' });
|
||||
if (!r.ok) {
|
||||
melde(sagWas((await r.json().catch(() => ({}))).fehler, 'Ging nicht.'));
|
||||
|
||||
@@ -146,8 +146,13 @@
|
||||
: `Alle ${liste.length} Punkte übernehmen`);
|
||||
allesNehmen.type = 'button';
|
||||
allesNehmen.addEventListener('click', async () => {
|
||||
if (!confirm(`Wirklich alle ${liste.length} übernehmen? `
|
||||
+ 'Sie landen als eigene Einträge in der Liste und lassen sich einzeln löschen.')) return;
|
||||
if (!await frageNach({
|
||||
titel: `Alle ${liste.length} übernehmen?`,
|
||||
was: 'Sie landen als eigene Einträge in deiner Liste.',
|
||||
bleibt: 'Die Vorlage bleibt unverändert. Jeder übernommene Eintrag '
|
||||
+ 'lässt sich einzeln wieder löschen.',
|
||||
ja: `Alle ${liste.length} übernehmen`,
|
||||
})) return;
|
||||
allesNehmen.disabled = true;
|
||||
allesNehmen.textContent = 'wird übernommen …';
|
||||
try {
|
||||
|
||||
@@ -251,7 +251,13 @@
|
||||
const weg = el('button', 'knopf-still knopf-still--warn', 'Löschen');
|
||||
weg.type = 'button';
|
||||
weg.addEventListener('click', async () => {
|
||||
if (!confirm(`„${e.titel}" wirklich löschen?\n\nDie PDF wird dabei auch vom Server entfernt.`)) return;
|
||||
if (!await frageNach({
|
||||
titel: `„${e.titel}" löschen?`,
|
||||
was: 'Der Eintrag verschwindet aus dem Wissen. Die PDF wird dabei '
|
||||
+ 'auch vom Server entfernt.',
|
||||
bleibt: 'Wer sie schon heruntergeladen hat, behält seine Kopie.',
|
||||
endgueltig: true, ja: 'Löschen',
|
||||
})) return;
|
||||
const a = await hole('/workspace/api/wissen/' + e.id, { method: 'DELETE' });
|
||||
if (!a.ok) { melde('Löschen hat nicht geklappt.'); return; }
|
||||
await laden_();
|
||||
|
||||
+14
-13
@@ -12,19 +12,19 @@
|
||||
Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite
|
||||
eine Flaeche sind statt zweier. -->
|
||||
<meta name="theme-color" content="#06090f" />
|
||||
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609191915" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?v=202609191915" />
|
||||
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609191956" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609191956" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609191956" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609191956" />
|
||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609191956" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?v=202609191956" />
|
||||
<!-- haus.css MUSS die letzte Stilvorlage sein (10.09.2026).
|
||||
Auf der Agenturadresse ist sie leer -- das Haus hier IST der
|
||||
Grundzustand. Auf der Adresse von Team Dogi biegt der Server
|
||||
genau diesen Dateinamen auf crew-haus.css um, und die Seite
|
||||
kommt schon beim ERSTEN Abruf in Lila und Babyblau an --
|
||||
ohne Umfaerben im Browser, ohne Flackern. -->
|
||||
<link rel="stylesheet" href="assets/css/haus.css?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/haus.css?v=202609191956" />
|
||||
</head>
|
||||
|
||||
<body class="start">
|
||||
@@ -291,12 +291,13 @@
|
||||
</form>
|
||||
</dialog>
|
||||
|
||||
<script src="assets/js/meldung.js?v=202609191915" defer></script>
|
||||
<script src="assets/js/meldung.js?v=202609191956" defer></script>
|
||||
<script src="assets/js/nachfrage.js?v=202609191956" defer></script>
|
||||
|
||||
<script src="assets/js/wahl.js?v=202609191915" defer></script>
|
||||
<script src="assets/js/bereiche.js?v=202609191915" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609191915" defer></script>
|
||||
<script src="assets/js/glocke.js?v=202609191915" defer></script>
|
||||
<script src="assets/js/aufgaben.js?v=202609191915" defer></script>
|
||||
<script src="assets/js/wahl.js?v=202609191956" defer></script>
|
||||
<script src="assets/js/bereiche.js?v=202609191956" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609191956" defer></script>
|
||||
<script src="assets/js/glocke.js?v=202609191956" defer></script>
|
||||
<script src="assets/js/aufgaben.js?v=202609191956" defer></script>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
+14
-14
@@ -12,20 +12,20 @@
|
||||
Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite
|
||||
eine Flaeche sind statt zweier. -->
|
||||
<meta name="theme-color" content="#06090f" />
|
||||
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609191915" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/automation.css?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?v=202609191915" />
|
||||
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609191956" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609191956" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609191956" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609191956" />
|
||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609191956" />
|
||||
<link rel="stylesheet" href="assets/css/automation.css?v=202609191956" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?v=202609191956" />
|
||||
<!-- haus.css MUSS die letzte Stilvorlage sein (10.09.2026).
|
||||
Auf der Agenturadresse ist sie leer -- das Haus hier IST der
|
||||
Grundzustand. Auf der Adresse von Team Dogi biegt der Server
|
||||
genau diesen Dateinamen auf crew-haus.css um, und die Seite
|
||||
kommt schon beim ERSTEN Abruf in Lila und Babyblau an --
|
||||
ohne Umfaerben im Browser, ohne Flackern. -->
|
||||
<link rel="stylesheet" href="assets/css/haus.css?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/haus.css?v=202609191956" />
|
||||
</head>
|
||||
|
||||
<body class="start">
|
||||
@@ -168,12 +168,12 @@
|
||||
|
||||
</main>
|
||||
|
||||
<script src="assets/js/meldung.js?v=202609191915" defer></script>
|
||||
<script src="assets/js/meldung.js?v=202609191956" defer></script>
|
||||
|
||||
<script src="assets/js/wahl.js?v=202609191915" defer></script>
|
||||
<script src="assets/js/bereiche.js?v=202609191915" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609191915" defer></script>
|
||||
<script src="assets/js/glocke.js?v=202609191915" defer></script>
|
||||
<script src="assets/js/automation.js?v=202609191915" defer></script>
|
||||
<script src="assets/js/wahl.js?v=202609191956" defer></script>
|
||||
<script src="assets/js/bereiche.js?v=202609191956" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609191956" defer></script>
|
||||
<script src="assets/js/glocke.js?v=202609191956" defer></script>
|
||||
<script src="assets/js/automation.js?v=202609191956" defer></script>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
+13
-13
@@ -7,14 +7,14 @@
|
||||
<meta name="robots" content="noindex, nofollow" />
|
||||
<link rel="manifest" href="/workspace/app.webmanifest" />
|
||||
<meta name="theme-color" content="#06090f" />
|
||||
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609191915" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/entwicklung.css?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/haus.css?v=202609191915" />
|
||||
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609191956" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609191956" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609191956" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609191956" />
|
||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609191956" />
|
||||
<link rel="stylesheet" href="assets/css/entwicklung.css?v=202609191956" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?v=202609191956" />
|
||||
<link rel="stylesheet" href="assets/css/haus.css?v=202609191956" />
|
||||
</head>
|
||||
|
||||
<body class="start">
|
||||
@@ -130,11 +130,11 @@
|
||||
|
||||
</main>
|
||||
|
||||
<script src="assets/js/meldung.js?v=202609191915" defer></script>
|
||||
<script src="assets/js/meldung.js?v=202609191956" defer></script>
|
||||
|
||||
<script src="assets/js/wahl.js?v=202609191915" defer></script>
|
||||
<script src="assets/js/bereiche.js?v=202609191915" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609191915" defer></script>
|
||||
<script src="assets/js/befinden.js?v=202609191915" defer></script>
|
||||
<script src="assets/js/wahl.js?v=202609191956" defer></script>
|
||||
<script src="assets/js/bereiche.js?v=202609191956" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609191956" defer></script>
|
||||
<script src="assets/js/befinden.js?v=202609191956" defer></script>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
+20
-19
@@ -12,24 +12,24 @@
|
||||
Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite
|
||||
eine Flaeche sind statt zweier. -->
|
||||
<meta name="theme-color" content="#06090f" />
|
||||
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609191915" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/bereich.css?v=202609191915" />
|
||||
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609191956" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609191956" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609191956" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609191956" />
|
||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609191956" />
|
||||
<link rel="stylesheet" href="assets/css/bereich.css?v=202609191956" />
|
||||
<!-- Wegen des Blocks „Willst du dazugehoeren?" auf dem Brett
|
||||
„Mitmachen". Eine eigene Kopie der Regel hier waere die zweite
|
||||
Stelle, an der dieselbe Sache anders aussieht. -->
|
||||
<link rel="stylesheet" href="assets/css/bewerbung.css?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/bewerbung.css?v=202609191956" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?v=202609191956" />
|
||||
<!-- haus.css MUSS die letzte Stilvorlage sein (10.09.2026).
|
||||
Auf der Agenturadresse ist sie leer -- das Haus hier IST der
|
||||
Grundzustand. Auf der Adresse von Team Dogi biegt der Server
|
||||
genau diesen Dateinamen auf crew-haus.css um, und die Seite
|
||||
kommt schon beim ERSTEN Abruf in Lila und Babyblau an --
|
||||
ohne Umfaerben im Browser, ohne Flackern. -->
|
||||
<link rel="stylesheet" href="assets/css/haus.css?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/haus.css?v=202609191956" />
|
||||
</head>
|
||||
|
||||
<body class="start">
|
||||
@@ -251,16 +251,17 @@
|
||||
|
||||
</main>
|
||||
|
||||
<script src="assets/js/meldung.js?v=202609191915" defer></script>
|
||||
<script src="assets/js/meldung.js?v=202609191956" defer></script>
|
||||
<script src="assets/js/nachfrage.js?v=202609191956" defer></script>
|
||||
|
||||
<script src="assets/js/wahl.js?v=202609191915" defer></script>
|
||||
<script src="assets/js/bereiche.js?v=202609191915" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609191915" defer></script>
|
||||
<script src="assets/js/glocke.js?v=202609191915" defer></script>
|
||||
<script src="assets/js/checkliste.js?v=202609191915" defer></script>
|
||||
<script src="assets/js/ampel.js?v=202609191915" defer></script>
|
||||
<script src="assets/js/schulung.js?v=202609191915" defer></script>
|
||||
<script src="assets/js/vorlagen.js?v=202609191915" defer></script>
|
||||
<script src="assets/js/bereich.js?v=202609191915" defer></script>
|
||||
<script src="assets/js/wahl.js?v=202609191956" defer></script>
|
||||
<script src="assets/js/bereiche.js?v=202609191956" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609191956" defer></script>
|
||||
<script src="assets/js/glocke.js?v=202609191956" defer></script>
|
||||
<script src="assets/js/checkliste.js?v=202609191956" defer></script>
|
||||
<script src="assets/js/ampel.js?v=202609191956" defer></script>
|
||||
<script src="assets/js/schulung.js?v=202609191956" defer></script>
|
||||
<script src="assets/js/vorlagen.js?v=202609191956" defer></script>
|
||||
<script src="assets/js/bereich.js?v=202609191956" defer></script>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
+16
-16
@@ -7,17 +7,17 @@
|
||||
<meta name="robots" content="noindex, nofollow" />
|
||||
<link rel="manifest" href="/workspace/app.webmanifest" />
|
||||
<meta name="theme-color" content="#06090f" />
|
||||
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609191915" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/bereich.css?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/treff.css?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/bewerbung.css?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?v=202609191915" />
|
||||
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609191956" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609191956" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609191956" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609191956" />
|
||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609191956" />
|
||||
<link rel="stylesheet" href="assets/css/bereich.css?v=202609191956" />
|
||||
<link rel="stylesheet" href="assets/css/treff.css?v=202609191956" />
|
||||
<link rel="stylesheet" href="assets/css/bewerbung.css?v=202609191956" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?v=202609191956" />
|
||||
<!-- haus.css MUSS die letzte Stilvorlage sein - siehe treff-regeln.html. -->
|
||||
<link rel="stylesheet" href="assets/css/haus.css?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/haus.css?v=202609191956" />
|
||||
</head>
|
||||
|
||||
<body class="start">
|
||||
@@ -108,11 +108,11 @@
|
||||
</main>
|
||||
|
||||
<!-- Der Fuß gehört zu jeder Seite - siehe pruef-css-klassen. -->
|
||||
<script src="assets/js/meldung.js?v=202609191915" defer></script>
|
||||
<script src="assets/js/wahl.js?v=202609191915" defer></script>
|
||||
<script src="assets/js/bereiche.js?v=202609191915" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609191915" defer></script>
|
||||
<script src="assets/js/auskunft.js?v=202609191915" defer></script>
|
||||
<script src="assets/js/bewerben.js?v=202609191915" defer></script>
|
||||
<script src="assets/js/meldung.js?v=202609191956" defer></script>
|
||||
<script src="assets/js/wahl.js?v=202609191956" defer></script>
|
||||
<script src="assets/js/bereiche.js?v=202609191956" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609191956" defer></script>
|
||||
<script src="assets/js/auskunft.js?v=202609191956" defer></script>
|
||||
<script src="assets/js/bewerben.js?v=202609191956" defer></script>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
+15
-15
@@ -7,16 +7,16 @@
|
||||
<meta name="robots" content="noindex, nofollow" />
|
||||
<link rel="manifest" href="/workspace/app.webmanifest" />
|
||||
<meta name="theme-color" content="#06090f" />
|
||||
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609191915" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/entwicklung.css?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/bewerbung.css?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?v=202609191915" />
|
||||
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609191956" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609191956" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609191956" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609191956" />
|
||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609191956" />
|
||||
<link rel="stylesheet" href="assets/css/entwicklung.css?v=202609191956" />
|
||||
<link rel="stylesheet" href="assets/css/bewerbung.css?v=202609191956" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?v=202609191956" />
|
||||
<!-- haus.css MUSS die letzte Stilvorlage sein - siehe treff-regeln.html. -->
|
||||
<link rel="stylesheet" href="assets/css/haus.css?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/haus.css?v=202609191956" />
|
||||
</head>
|
||||
|
||||
<body class="start">
|
||||
@@ -80,12 +80,12 @@
|
||||
|
||||
</main>
|
||||
|
||||
<script src="assets/js/meldung.js?v=202609191915" defer></script>
|
||||
<script src="assets/js/meldung.js?v=202609191956" defer></script>
|
||||
|
||||
<script src="assets/js/wahl.js?v=202609191915" defer></script>
|
||||
<script src="assets/js/bereiche.js?v=202609191915" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609191915" defer></script>
|
||||
<script src="assets/js/auskunft.js?v=202609191915" defer></script>
|
||||
<script src="assets/js/bewerbungen.js?v=202609191915" defer></script>
|
||||
<script src="assets/js/wahl.js?v=202609191956" defer></script>
|
||||
<script src="assets/js/bereiche.js?v=202609191956" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609191956" defer></script>
|
||||
<script src="assets/js/auskunft.js?v=202609191956" defer></script>
|
||||
<script src="assets/js/bewerbungen.js?v=202609191956" defer></script>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
+16
-15
@@ -12,20 +12,20 @@
|
||||
Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite
|
||||
eine Flaeche sind statt zweier. -->
|
||||
<meta name="theme-color" content="#06090f" />
|
||||
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609191915" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/calls.css?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?v=202609191915" />
|
||||
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609191956" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609191956" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609191956" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609191956" />
|
||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609191956" />
|
||||
<link rel="stylesheet" href="assets/css/calls.css?v=202609191956" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?v=202609191956" />
|
||||
<!-- haus.css MUSS die letzte Stilvorlage sein (10.09.2026).
|
||||
Auf der Agenturadresse ist sie leer -- das Haus hier IST der
|
||||
Grundzustand. Auf der Adresse von Team Dogi biegt der Server
|
||||
genau diesen Dateinamen auf crew-haus.css um, und die Seite
|
||||
kommt schon beim ERSTEN Abruf in Lila und Babyblau an --
|
||||
ohne Umfaerben im Browser, ohne Flackern. -->
|
||||
<link rel="stylesheet" href="assets/css/haus.css?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/haus.css?v=202609191956" />
|
||||
</head>
|
||||
|
||||
<body class="start">
|
||||
@@ -89,13 +89,14 @@
|
||||
|
||||
</main>
|
||||
|
||||
<script src="assets/js/meldung.js?v=202609191915" defer></script>
|
||||
<script src="assets/js/meldung.js?v=202609191956" defer></script>
|
||||
<script src="assets/js/nachfrage.js?v=202609191956" defer></script>
|
||||
|
||||
<script src="assets/js/ki.js?v=202609191915" defer></script>
|
||||
<script src="assets/js/wahl.js?v=202609191915" defer></script>
|
||||
<script src="assets/js/bereiche.js?v=202609191915" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609191915" defer></script>
|
||||
<script src="assets/js/glocke.js?v=202609191915" defer></script>
|
||||
<script src="assets/js/calls.js?v=202609191915" defer></script>
|
||||
<script src="assets/js/ki.js?v=202609191956" defer></script>
|
||||
<script src="assets/js/wahl.js?v=202609191956" defer></script>
|
||||
<script src="assets/js/bereiche.js?v=202609191956" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609191956" defer></script>
|
||||
<script src="assets/js/glocke.js?v=202609191956" defer></script>
|
||||
<script src="assets/js/calls.js?v=202609191956" defer></script>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
+16
-15
@@ -12,26 +12,26 @@
|
||||
Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite
|
||||
eine Flaeche sind statt zweier. -->
|
||||
<meta name="theme-color" content="#06090f" />
|
||||
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609191915" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609191915" />
|
||||
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609191956" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609191956" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609191956" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609191956" />
|
||||
<!-- aufgaben.css bringt die Dialog- und Formularstile mit (.dialog,
|
||||
.neu__zeile, .dialog__knoepfe). Sie stehen dort seit dem
|
||||
Aufgabenbrett; sie hierher zu kopieren hiesse, sie an zwei Stellen
|
||||
zu pflegen. Dieselbe Lösung nutzen kalender.html und content.html.
|
||||
Gemeldet von pruef-css-klassen.mjs, bevor jemand einen ungestylten
|
||||
Dialog zu sehen bekam. -->
|
||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/chat.css?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609191956" />
|
||||
<link rel="stylesheet" href="assets/css/chat.css?v=202609191956" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?v=202609191956" />
|
||||
<!-- haus.css MUSS die letzte Stilvorlage sein (10.09.2026).
|
||||
Auf der Agenturadresse ist sie leer -- das Haus hier IST der
|
||||
Grundzustand. Auf der Adresse von Team Dogi biegt der Server
|
||||
genau diesen Dateinamen auf crew-haus.css um, und die Seite
|
||||
kommt schon beim ERSTEN Abruf in Lila und Babyblau an --
|
||||
ohne Umfaerben im Browser, ohne Flackern. -->
|
||||
<link rel="stylesheet" href="assets/css/haus.css?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/haus.css?v=202609191956" />
|
||||
</head>
|
||||
|
||||
<body class="start">
|
||||
@@ -367,16 +367,17 @@
|
||||
</form>
|
||||
</dialog>
|
||||
|
||||
<script src="assets/js/bereiche.js?v=202609191915"></script>
|
||||
<script src="assets/js/meldung.js?v=202609191915" defer></script>
|
||||
<script src="assets/js/wahl.js?v=202609191915" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609191915"></script>
|
||||
<script src="assets/js/glocke.js?v=202609191915"></script>
|
||||
<script src="assets/js/bereiche.js?v=202609191956"></script>
|
||||
<script src="assets/js/meldung.js?v=202609191956" defer></script>
|
||||
<script src="assets/js/nachfrage.js?v=202609191956" defer></script>
|
||||
<script src="assets/js/wahl.js?v=202609191956" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609191956"></script>
|
||||
<script src="assets/js/glocke.js?v=202609191956"></script>
|
||||
<!-- ANRUF VOR CHAT (18.09.2026): anruf.js stellt `window.anrufStarten`
|
||||
bereit, und chat.js baut die Knoepfe nur, wenn es das gibt.
|
||||
Andersherum waere die Reihenfolge eine stille Abhaengigkeit --
|
||||
die Knoepfe fehlten, und niemand wuesste warum. -->
|
||||
<script src="assets/js/anruf.js?v=202609191915"></script>
|
||||
<script src="assets/js/chat.js?v=202609191915"></script>
|
||||
<script src="assets/js/anruf.js?v=202609191956"></script>
|
||||
<script src="assets/js/chat.js?v=202609191956"></script>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
+17
-16
@@ -12,20 +12,20 @@
|
||||
Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite
|
||||
eine Flaeche sind statt zweier. -->
|
||||
<meta name="theme-color" content="#06090f" />
|
||||
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609191915" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/content.css?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?v=202609191915" />
|
||||
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609191956" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609191956" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609191956" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609191956" />
|
||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609191956" />
|
||||
<link rel="stylesheet" href="assets/css/content.css?v=202609191956" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?v=202609191956" />
|
||||
<!-- haus.css MUSS die letzte Stilvorlage sein (10.09.2026).
|
||||
Auf der Agenturadresse ist sie leer -- das Haus hier IST der
|
||||
Grundzustand. Auf der Adresse von Team Dogi biegt der Server
|
||||
genau diesen Dateinamen auf crew-haus.css um, und die Seite
|
||||
kommt schon beim ERSTEN Abruf in Lila und Babyblau an --
|
||||
ohne Umfaerben im Browser, ohne Flackern. -->
|
||||
<link rel="stylesheet" href="assets/css/haus.css?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/haus.css?v=202609191956" />
|
||||
</head>
|
||||
|
||||
<body class="start">
|
||||
@@ -179,14 +179,15 @@
|
||||
|
||||
</main>
|
||||
|
||||
<script src="assets/js/meldung.js?v=202609191915" defer></script>
|
||||
<script src="assets/js/meldung.js?v=202609191956" defer></script>
|
||||
<script src="assets/js/nachfrage.js?v=202609191956" defer></script>
|
||||
|
||||
<script src="assets/js/wahl.js?v=202609191915" defer></script>
|
||||
<script src="assets/js/bereiche.js?v=202609191915" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609191915" defer></script>
|
||||
<script src="assets/js/glocke.js?v=202609191915" defer></script>
|
||||
<script src="assets/js/checkliste.js?v=202609191915" defer></script>
|
||||
<script src="assets/js/vorlagen.js?v=202609191915" defer></script>
|
||||
<script src="assets/js/content.js?v=202609191915" defer></script>
|
||||
<script src="assets/js/wahl.js?v=202609191956" defer></script>
|
||||
<script src="assets/js/bereiche.js?v=202609191956" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609191956" defer></script>
|
||||
<script src="assets/js/glocke.js?v=202609191956" defer></script>
|
||||
<script src="assets/js/checkliste.js?v=202609191956" defer></script>
|
||||
<script src="assets/js/vorlagen.js?v=202609191956" defer></script>
|
||||
<script src="assets/js/content.js?v=202609191956" defer></script>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
@@ -36,15 +36,15 @@
|
||||
<link rel="preload" as="image" href="assets/img/buehne/crew-gate-hoch-580.webp"
|
||||
type="image/webp" media="(max-width: 899px)" />
|
||||
|
||||
<link rel="icon" type="image/png" href="/assets/img/app-symbole/crew-32.png?v=202609191915" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/crew-180.png?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609191915" />
|
||||
<link rel="icon" type="image/png" href="/assets/img/app-symbole/crew-32.png?v=202609191956" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/crew-180.png?v=202609191956" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609191956" />
|
||||
<!-- Diese Wand steht NUR auf der Adresse von Team Dogi (ueberall sonst
|
||||
404, siehe crewWeiche). Sie darf das Haus deshalb direkt nennen
|
||||
statt ueber den Platzhalter haus.css zu gehen -- und sie MUSS es:
|
||||
Eine Zugangswand, die sich erst nach dem Umbiegen faerbt, waere
|
||||
die eine Seite, auf der man das Umfaerben sieht. -->
|
||||
<link rel="stylesheet" href="assets/css/crew-haus.css?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/crew-haus.css?v=202609191956" />
|
||||
</head>
|
||||
|
||||
<body class="gate gate--crew">
|
||||
@@ -348,8 +348,8 @@
|
||||
</main>
|
||||
</div>
|
||||
|
||||
<script src="assets/js/meldung.js?v=202609191915" defer></script>
|
||||
<script src="assets/js/meldung.js?v=202609191956" defer></script>
|
||||
|
||||
<script src="assets/js/gate.js?v=202609191915" defer></script>
|
||||
<script src="assets/js/gate.js?v=202609191956" defer></script>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
@@ -22,25 +22,25 @@
|
||||
},
|
||||
"icons": [
|
||||
{
|
||||
"src": "/assets/img/app-symbole/crew-192.png?v=202609191915",
|
||||
"src": "/assets/img/app-symbole/crew-192.png?v=202609191956",
|
||||
"sizes": "192x192",
|
||||
"type": "image/png",
|
||||
"purpose": "any"
|
||||
},
|
||||
{
|
||||
"src": "/assets/img/app-symbole/crew-512.png?v=202609191915",
|
||||
"src": "/assets/img/app-symbole/crew-512.png?v=202609191956",
|
||||
"sizes": "512x512",
|
||||
"type": "image/png",
|
||||
"purpose": "any"
|
||||
},
|
||||
{
|
||||
"src": "/assets/img/app-symbole/crew-192-maskable.png?v=202609191915",
|
||||
"src": "/assets/img/app-symbole/crew-192-maskable.png?v=202609191956",
|
||||
"sizes": "192x192",
|
||||
"type": "image/png",
|
||||
"purpose": "maskable"
|
||||
},
|
||||
{
|
||||
"src": "/assets/img/app-symbole/crew-512-maskable.png?v=202609191915",
|
||||
"src": "/assets/img/app-symbole/crew-512-maskable.png?v=202609191956",
|
||||
"sizes": "512x512",
|
||||
"type": "image/png",
|
||||
"purpose": "maskable"
|
||||
|
||||
+15
-14
@@ -12,20 +12,20 @@
|
||||
Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite
|
||||
eine Flaeche sind statt zweier. -->
|
||||
<meta name="theme-color" content="#06090f" />
|
||||
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609191915" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/dateien.css?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?v=202609191915" />
|
||||
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609191956" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609191956" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609191956" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609191956" />
|
||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609191956" />
|
||||
<link rel="stylesheet" href="assets/css/dateien.css?v=202609191956" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?v=202609191956" />
|
||||
<!-- haus.css MUSS die letzte Stilvorlage sein (10.09.2026).
|
||||
Auf der Agenturadresse ist sie leer -- das Haus hier IST der
|
||||
Grundzustand. Auf der Adresse von Team Dogi biegt der Server
|
||||
genau diesen Dateinamen auf crew-haus.css um, und die Seite
|
||||
kommt schon beim ERSTEN Abruf in Lila und Babyblau an --
|
||||
ohne Umfaerben im Browser, ohne Flackern. -->
|
||||
<link rel="stylesheet" href="assets/css/haus.css?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/haus.css?v=202609191956" />
|
||||
</head>
|
||||
|
||||
<body class="start">
|
||||
@@ -108,12 +108,13 @@
|
||||
|
||||
</main>
|
||||
|
||||
<script src="assets/js/meldung.js?v=202609191915" defer></script>
|
||||
<script src="assets/js/meldung.js?v=202609191956" defer></script>
|
||||
<script src="assets/js/nachfrage.js?v=202609191956" defer></script>
|
||||
|
||||
<script src="assets/js/wahl.js?v=202609191915" defer></script>
|
||||
<script src="assets/js/bereiche.js?v=202609191915" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609191915" defer></script>
|
||||
<script src="assets/js/glocke.js?v=202609191915" defer></script>
|
||||
<script src="assets/js/dateien.js?v=202609191915" defer></script>
|
||||
<script src="assets/js/wahl.js?v=202609191956" defer></script>
|
||||
<script src="assets/js/bereiche.js?v=202609191956" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609191956" defer></script>
|
||||
<script src="assets/js/glocke.js?v=202609191956" defer></script>
|
||||
<script src="assets/js/dateien.js?v=202609191956" defer></script>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
+13
-13
@@ -7,14 +7,14 @@
|
||||
<meta name="robots" content="noindex, nofollow" />
|
||||
<link rel="manifest" href="/workspace/app.webmanifest" />
|
||||
<meta name="theme-color" content="#06090f" />
|
||||
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609191915" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/entwicklung.css?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/haus.css?v=202609191915" />
|
||||
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609191956" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609191956" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609191956" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609191956" />
|
||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609191956" />
|
||||
<link rel="stylesheet" href="assets/css/entwicklung.css?v=202609191956" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?v=202609191956" />
|
||||
<link rel="stylesheet" href="assets/css/haus.css?v=202609191956" />
|
||||
</head>
|
||||
|
||||
<body class="start">
|
||||
@@ -106,11 +106,11 @@
|
||||
|
||||
</main>
|
||||
|
||||
<script src="assets/js/meldung.js?v=202609191915" defer></script>
|
||||
<script src="assets/js/meldung.js?v=202609191956" defer></script>
|
||||
|
||||
<script src="assets/js/wahl.js?v=202609191915" defer></script>
|
||||
<script src="assets/js/bereiche.js?v=202609191915" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609191915" defer></script>
|
||||
<script src="assets/js/entwicklung.js?v=202609191915" defer></script>
|
||||
<script src="assets/js/wahl.js?v=202609191956" defer></script>
|
||||
<script src="assets/js/bereiche.js?v=202609191956" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609191956" defer></script>
|
||||
<script src="assets/js/entwicklung.js?v=202609191956" defer></script>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
+13
-12
@@ -7,13 +7,13 @@
|
||||
<meta name="robots" content="noindex, nofollow" />
|
||||
<link rel="manifest" href="/workspace/app.webmanifest" />
|
||||
<meta name="theme-color" content="#06090f" />
|
||||
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609191915" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/hilfe.css?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/haus.css?v=202609191915" />
|
||||
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609191956" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609191956" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609191956" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609191956" />
|
||||
<link rel="stylesheet" href="assets/css/hilfe.css?v=202609191956" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?v=202609191956" />
|
||||
<link rel="stylesheet" href="assets/css/haus.css?v=202609191956" />
|
||||
</head>
|
||||
|
||||
<body class="start">
|
||||
@@ -141,11 +141,12 @@
|
||||
|
||||
</main>
|
||||
|
||||
<script src="assets/js/meldung.js?v=202609191915" defer></script>
|
||||
<script src="assets/js/meldung.js?v=202609191956" defer></script>
|
||||
<script src="assets/js/nachfrage.js?v=202609191956" defer></script>
|
||||
|
||||
<script src="assets/js/wahl.js?v=202609191915" defer></script>
|
||||
<script src="assets/js/bereiche.js?v=202609191915" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609191915" defer></script>
|
||||
<script src="assets/js/hilfe.js?v=202609191915" defer></script>
|
||||
<script src="assets/js/wahl.js?v=202609191956" defer></script>
|
||||
<script src="assets/js/bereiche.js?v=202609191956" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609191956" defer></script>
|
||||
<script src="assets/js/hilfe.js?v=202609191956" defer></script>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
@@ -30,9 +30,9 @@
|
||||
<link rel="preload" as="image" href="assets/img/buehne/gate-hoch-580.webp"
|
||||
type="image/webp" media="(max-width: 899px)" />
|
||||
|
||||
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609191915" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609191915" />
|
||||
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609191956" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609191956" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609191956" />
|
||||
</head>
|
||||
|
||||
<body class="gate">
|
||||
@@ -410,8 +410,8 @@
|
||||
</main>
|
||||
</div>
|
||||
|
||||
<script src="assets/js/meldung.js?v=202609191915" defer></script>
|
||||
<script src="assets/js/meldung.js?v=202609191956" defer></script>
|
||||
|
||||
<script src="assets/js/gate.js?v=202609191915" defer></script>
|
||||
<script src="assets/js/gate.js?v=202609191956" defer></script>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
+16
-15
@@ -12,20 +12,20 @@
|
||||
Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite
|
||||
eine Flaeche sind statt zweier. -->
|
||||
<meta name="theme-color" content="#06090f" />
|
||||
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609191915" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/kalender.css?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?v=202609191915" />
|
||||
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609191956" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609191956" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609191956" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609191956" />
|
||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609191956" />
|
||||
<link rel="stylesheet" href="assets/css/kalender.css?v=202609191956" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?v=202609191956" />
|
||||
<!-- haus.css MUSS die letzte Stilvorlage sein (10.09.2026).
|
||||
Auf der Agenturadresse ist sie leer -- das Haus hier IST der
|
||||
Grundzustand. Auf der Adresse von Team Dogi biegt der Server
|
||||
genau diesen Dateinamen auf crew-haus.css um, und die Seite
|
||||
kommt schon beim ERSTEN Abruf in Lila und Babyblau an --
|
||||
ohne Umfaerben im Browser, ohne Flackern. -->
|
||||
<link rel="stylesheet" href="assets/css/haus.css?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/haus.css?v=202609191956" />
|
||||
</head>
|
||||
|
||||
<body class="start">
|
||||
@@ -377,13 +377,14 @@
|
||||
|
||||
</main>
|
||||
|
||||
<script src="assets/js/meldung.js?v=202609191915" defer></script>
|
||||
<script src="assets/js/meldung.js?v=202609191956" defer></script>
|
||||
<script src="assets/js/nachfrage.js?v=202609191956" defer></script>
|
||||
|
||||
<script src="assets/js/wahl.js?v=202609191915" defer></script>
|
||||
<script src="assets/js/bereiche.js?v=202609191915" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609191915" defer></script>
|
||||
<script src="assets/js/glocke.js?v=202609191915" defer></script>
|
||||
<script src="assets/js/kalender.js?v=202609191915" defer></script>
|
||||
<script src="assets/js/kalender-abo.js?v=202609191915" defer></script>
|
||||
<script src="assets/js/wahl.js?v=202609191956" defer></script>
|
||||
<script src="assets/js/bereiche.js?v=202609191956" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609191956" defer></script>
|
||||
<script src="assets/js/glocke.js?v=202609191956" defer></script>
|
||||
<script src="assets/js/kalender.js?v=202609191956" defer></script>
|
||||
<script src="assets/js/kalender-abo.js?v=202609191956" defer></script>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
+15
-14
@@ -12,20 +12,20 @@
|
||||
Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite
|
||||
eine Flaeche sind statt zweier. -->
|
||||
<meta name="theme-color" content="#06090f" />
|
||||
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609191915" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/leistung.css?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?v=202609191915" />
|
||||
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609191956" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609191956" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609191956" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609191956" />
|
||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609191956" />
|
||||
<link rel="stylesheet" href="assets/css/leistung.css?v=202609191956" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?v=202609191956" />
|
||||
<!-- haus.css MUSS die letzte Stilvorlage sein (10.09.2026).
|
||||
Auf der Agenturadresse ist sie leer -- das Haus hier IST der
|
||||
Grundzustand. Auf der Adresse von Team Dogi biegt der Server
|
||||
genau diesen Dateinamen auf crew-haus.css um, und die Seite
|
||||
kommt schon beim ERSTEN Abruf in Lila und Babyblau an --
|
||||
ohne Umfaerben im Browser, ohne Flackern. -->
|
||||
<link rel="stylesheet" href="assets/css/haus.css?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/haus.css?v=202609191956" />
|
||||
</head>
|
||||
|
||||
<body class="start">
|
||||
@@ -444,11 +444,12 @@
|
||||
</form>
|
||||
</dialog>
|
||||
|
||||
<script src="assets/js/meldung.js?v=202609191915"></script>
|
||||
<script src="assets/js/wahl.js?v=202609191915"></script>
|
||||
<script src="assets/js/bereiche.js?v=202609191915"></script>
|
||||
<script src="assets/js/kopf.js?v=202609191915"></script>
|
||||
<script src="assets/js/glocke.js?v=202609191915"></script>
|
||||
<script src="assets/js/leistung.js?v=202609191915"></script>
|
||||
<script src="assets/js/meldung.js?v=202609191956"></script>
|
||||
<script src="assets/js/nachfrage.js?v=202609191956"></script>
|
||||
<script src="assets/js/wahl.js?v=202609191956"></script>
|
||||
<script src="assets/js/bereiche.js?v=202609191956"></script>
|
||||
<script src="assets/js/kopf.js?v=202609191956"></script>
|
||||
<script src="assets/js/glocke.js?v=202609191956"></script>
|
||||
<script src="assets/js/leistung.js?v=202609191956"></script>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
+15
-14
@@ -12,20 +12,20 @@
|
||||
Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite
|
||||
eine Flaeche sind statt zweier. -->
|
||||
<meta name="theme-color" content="#06090f" />
|
||||
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609191915" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/personen.css?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?v=202609191915" />
|
||||
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609191956" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609191956" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609191956" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609191956" />
|
||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609191956" />
|
||||
<link rel="stylesheet" href="assets/css/personen.css?v=202609191956" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?v=202609191956" />
|
||||
<!-- haus.css MUSS die letzte Stilvorlage sein (10.09.2026).
|
||||
Auf der Agenturadresse ist sie leer -- das Haus hier IST der
|
||||
Grundzustand. Auf der Adresse von Team Dogi biegt der Server
|
||||
genau diesen Dateinamen auf crew-haus.css um, und die Seite
|
||||
kommt schon beim ERSTEN Abruf in Lila und Babyblau an --
|
||||
ohne Umfaerben im Browser, ohne Flackern. -->
|
||||
<link rel="stylesheet" href="assets/css/haus.css?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/haus.css?v=202609191956" />
|
||||
</head>
|
||||
|
||||
<body class="start">
|
||||
@@ -449,12 +449,13 @@
|
||||
|
||||
</main>
|
||||
|
||||
<script src="assets/js/meldung.js?v=202609191915" defer></script>
|
||||
<script src="assets/js/meldung.js?v=202609191956" defer></script>
|
||||
<script src="assets/js/nachfrage.js?v=202609191956" defer></script>
|
||||
|
||||
<script src="assets/js/wahl.js?v=202609191915" defer></script>
|
||||
<script src="assets/js/bereiche.js?v=202609191915" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609191915" defer></script>
|
||||
<script src="assets/js/glocke.js?v=202609191915" defer></script>
|
||||
<script src="assets/js/personen.js?v=202609191915" defer></script>
|
||||
<script src="assets/js/wahl.js?v=202609191956" defer></script>
|
||||
<script src="assets/js/bereiche.js?v=202609191956" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609191956" defer></script>
|
||||
<script src="assets/js/glocke.js?v=202609191956" defer></script>
|
||||
<script src="assets/js/personen.js?v=202609191956" defer></script>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
+16
-15
@@ -12,20 +12,20 @@
|
||||
Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite
|
||||
eine Flaeche sind statt zweier. -->
|
||||
<meta name="theme-color" content="#06090f" />
|
||||
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609191915" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/profil.css?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?v=202609191915" />
|
||||
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609191956" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609191956" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609191956" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609191956" />
|
||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609191956" />
|
||||
<link rel="stylesheet" href="assets/css/profil.css?v=202609191956" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?v=202609191956" />
|
||||
<!-- haus.css MUSS die letzte Stilvorlage sein (10.09.2026).
|
||||
Auf der Agenturadresse ist sie leer -- das Haus hier IST der
|
||||
Grundzustand. Auf der Adresse von Team Dogi biegt der Server
|
||||
genau diesen Dateinamen auf crew-haus.css um, und die Seite
|
||||
kommt schon beim ERSTEN Abruf in Lila und Babyblau an --
|
||||
ohne Umfaerben im Browser, ohne Flackern. -->
|
||||
<link rel="stylesheet" href="assets/css/haus.css?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/haus.css?v=202609191956" />
|
||||
</head>
|
||||
|
||||
<body class="start">
|
||||
@@ -214,13 +214,14 @@
|
||||
|
||||
</main>
|
||||
|
||||
<script src="assets/js/meldung.js?v=202609191915" defer></script>
|
||||
<script src="assets/js/meldung.js?v=202609191956" defer></script>
|
||||
<script src="assets/js/nachfrage.js?v=202609191956" defer></script>
|
||||
|
||||
<script src="assets/js/wahl.js?v=202609191915" defer></script>
|
||||
<script src="assets/js/bereiche.js?v=202609191915" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609191915" defer></script>
|
||||
<script src="assets/js/glocke.js?v=202609191915" defer></script>
|
||||
<script src="assets/js/steckbrief.js?v=202609191915" defer></script>
|
||||
<script src="assets/js/profil.js?v=202609191915" defer></script>
|
||||
<script src="assets/js/wahl.js?v=202609191956" defer></script>
|
||||
<script src="assets/js/bereiche.js?v=202609191956" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609191956" defer></script>
|
||||
<script src="assets/js/glocke.js?v=202609191956" defer></script>
|
||||
<script src="assets/js/steckbrief.js?v=202609191956" defer></script>
|
||||
<script src="assets/js/profil.js?v=202609191956" defer></script>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
+14
-13
@@ -7,14 +7,14 @@
|
||||
<meta name="robots" content="noindex, nofollow" />
|
||||
<link rel="manifest" href="/workspace/app.webmanifest" />
|
||||
<meta name="theme-color" content="#06090f" />
|
||||
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609191915" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/treff.css?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/haus.css?v=202609191915" />
|
||||
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609191956" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609191956" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609191956" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609191956" />
|
||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609191956" />
|
||||
<link rel="stylesheet" href="assets/css/treff.css?v=202609191956" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?v=202609191956" />
|
||||
<link rel="stylesheet" href="assets/css/haus.css?v=202609191956" />
|
||||
</head>
|
||||
|
||||
<body class="start">
|
||||
@@ -134,10 +134,11 @@
|
||||
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. -->
|
||||
<script src="assets/js/meldung.js?v=202609191915" defer></script>
|
||||
<script src="assets/js/wahl.js?v=202609191915" defer></script>
|
||||
<script src="assets/js/bereiche.js?v=202609191915" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609191915" defer></script>
|
||||
<script src="assets/js/rechte.js?v=202609191915" defer></script>
|
||||
<script src="assets/js/meldung.js?v=202609191956" defer></script>
|
||||
<script src="assets/js/nachfrage.js?v=202609191956" defer></script>
|
||||
<script src="assets/js/wahl.js?v=202609191956" defer></script>
|
||||
<script src="assets/js/bereiche.js?v=202609191956" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609191956" defer></script>
|
||||
<script src="assets/js/rechte.js?v=202609191956" defer></script>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
+15
-15
@@ -12,20 +12,20 @@
|
||||
Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite
|
||||
eine Flaeche sind statt zweier. -->
|
||||
<meta name="theme-color" content="#06090f" />
|
||||
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609191915" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/report.css?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?v=202609191915" />
|
||||
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609191956" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609191956" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609191956" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609191956" />
|
||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609191956" />
|
||||
<link rel="stylesheet" href="assets/css/report.css?v=202609191956" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?v=202609191956" />
|
||||
<!-- haus.css MUSS die letzte Stilvorlage sein (10.09.2026).
|
||||
Auf der Agenturadresse ist sie leer -- das Haus hier IST der
|
||||
Grundzustand. Auf der Adresse von Team Dogi biegt der Server
|
||||
genau diesen Dateinamen auf crew-haus.css um, und die Seite
|
||||
kommt schon beim ERSTEN Abruf in Lila und Babyblau an --
|
||||
ohne Umfaerben im Browser, ohne Flackern. -->
|
||||
<link rel="stylesheet" href="assets/css/haus.css?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/haus.css?v=202609191956" />
|
||||
</head>
|
||||
|
||||
<body class="start">
|
||||
@@ -106,13 +106,13 @@
|
||||
|
||||
</main>
|
||||
|
||||
<script src="assets/js/meldung.js?v=202609191915" defer></script>
|
||||
<script src="assets/js/meldung.js?v=202609191956" defer></script>
|
||||
|
||||
<script src="assets/js/ki.js?v=202609191915" defer></script>
|
||||
<script src="assets/js/wahl.js?v=202609191915" defer></script>
|
||||
<script src="assets/js/bereiche.js?v=202609191915" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609191915" defer></script>
|
||||
<script src="assets/js/glocke.js?v=202609191915" defer></script>
|
||||
<script src="assets/js/report.js?v=202609191915" defer></script>
|
||||
<script src="assets/js/ki.js?v=202609191956" defer></script>
|
||||
<script src="assets/js/wahl.js?v=202609191956" defer></script>
|
||||
<script src="assets/js/bereiche.js?v=202609191956" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609191956" defer></script>
|
||||
<script src="assets/js/glocke.js?v=202609191956" defer></script>
|
||||
<script src="assets/js/report.js?v=202609191956" defer></script>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
+15
-14
@@ -12,20 +12,20 @@
|
||||
Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite
|
||||
eine Flaeche sind statt zweier. -->
|
||||
<meta name="theme-color" content="#06090f" />
|
||||
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609191915" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/scouting.css?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?v=202609191915" />
|
||||
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609191956" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609191956" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609191956" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609191956" />
|
||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609191956" />
|
||||
<link rel="stylesheet" href="assets/css/scouting.css?v=202609191956" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?v=202609191956" />
|
||||
<!-- haus.css MUSS die letzte Stilvorlage sein (10.09.2026).
|
||||
Auf der Agenturadresse ist sie leer -- das Haus hier IST der
|
||||
Grundzustand. Auf der Adresse von Team Dogi biegt der Server
|
||||
genau diesen Dateinamen auf crew-haus.css um, und die Seite
|
||||
kommt schon beim ERSTEN Abruf in Lila und Babyblau an --
|
||||
ohne Umfaerben im Browser, ohne Flackern. -->
|
||||
<link rel="stylesheet" href="assets/css/haus.css?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/haus.css?v=202609191956" />
|
||||
</head>
|
||||
|
||||
<body class="start">
|
||||
@@ -173,12 +173,13 @@
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<script src="assets/js/meldung.js?v=202609191915" defer></script>
|
||||
<script src="assets/js/meldung.js?v=202609191956" defer></script>
|
||||
<script src="assets/js/nachfrage.js?v=202609191956" defer></script>
|
||||
|
||||
<script src="assets/js/wahl.js?v=202609191915" defer></script>
|
||||
<script src="assets/js/bereiche.js?v=202609191915" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609191915" defer></script>
|
||||
<script src="assets/js/glocke.js?v=202609191915" defer></script>
|
||||
<script src="assets/js/scouting.js?v=202609191915" defer></script>
|
||||
<script src="assets/js/wahl.js?v=202609191956" defer></script>
|
||||
<script src="assets/js/bereiche.js?v=202609191956" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609191956" defer></script>
|
||||
<script src="assets/js/glocke.js?v=202609191956" defer></script>
|
||||
<script src="assets/js/scouting.js?v=202609191956" defer></script>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
+13
-13
@@ -12,21 +12,21 @@
|
||||
Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite
|
||||
eine Flaeche sind statt zweier. -->
|
||||
<meta name="theme-color" content="#06090f" />
|
||||
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609191915" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609191915" />
|
||||
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609191956" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609191956" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609191956" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609191956" />
|
||||
<!-- Nur die Startseite: Begrüßungskachel, Uhr, Glockenmulde. Siehe
|
||||
den Hinweis in start.css -- dort stand es bis zum 07.09.2026. -->
|
||||
<link rel="stylesheet" href="assets/css/heim.css?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/heim.css?v=202609191956" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?v=202609191956" />
|
||||
<!-- haus.css MUSS die letzte Stilvorlage sein (10.09.2026).
|
||||
Auf der Agenturadresse ist sie leer -- das Haus hier IST der
|
||||
Grundzustand. Auf der Adresse von Team Dogi biegt der Server
|
||||
genau diesen Dateinamen auf crew-haus.css um, und die Seite
|
||||
kommt schon beim ERSTEN Abruf in Lila und Babyblau an --
|
||||
ohne Umfaerben im Browser, ohne Flackern. -->
|
||||
<link rel="stylesheet" href="assets/css/haus.css?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/haus.css?v=202609191956" />
|
||||
</head>
|
||||
|
||||
<body class="start">
|
||||
@@ -678,12 +678,12 @@
|
||||
</p>
|
||||
</main>
|
||||
|
||||
<script src="assets/js/meldung.js?v=202609191915" defer></script>
|
||||
<script src="assets/js/meldung.js?v=202609191956" defer></script>
|
||||
|
||||
<script src="assets/js/wahl.js?v=202609191915" defer></script>
|
||||
<script src="assets/js/bereiche.js?v=202609191915" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609191915" defer></script>
|
||||
<script src="assets/js/glocke.js?v=202609191915" defer></script>
|
||||
<script src="assets/js/start.js?v=202609191915" defer></script>
|
||||
<script src="assets/js/wahl.js?v=202609191956" defer></script>
|
||||
<script src="assets/js/bereiche.js?v=202609191956" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609191956" defer></script>
|
||||
<script src="assets/js/glocke.js?v=202609191956" defer></script>
|
||||
<script src="assets/js/start.js?v=202609191956" defer></script>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
+15
-15
@@ -12,20 +12,20 @@
|
||||
Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite
|
||||
eine Flaeche sind statt zweier. -->
|
||||
<meta name="theme-color" content="#06090f" />
|
||||
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609191915" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/startcheck.css?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?v=202609191915" />
|
||||
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609191956" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609191956" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609191956" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609191956" />
|
||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609191956" />
|
||||
<link rel="stylesheet" href="assets/css/startcheck.css?v=202609191956" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?v=202609191956" />
|
||||
<!-- haus.css MUSS die letzte Stilvorlage sein (10.09.2026).
|
||||
Auf der Agenturadresse ist sie leer -- das Haus hier IST der
|
||||
Grundzustand. Auf der Adresse von Team Dogi biegt der Server
|
||||
genau diesen Dateinamen auf crew-haus.css um, und die Seite
|
||||
kommt schon beim ERSTEN Abruf in Lila und Babyblau an --
|
||||
ohne Umfaerben im Browser, ohne Flackern. -->
|
||||
<link rel="stylesheet" href="assets/css/haus.css?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/haus.css?v=202609191956" />
|
||||
</head>
|
||||
|
||||
<body class="start">
|
||||
@@ -85,13 +85,13 @@
|
||||
|
||||
</main>
|
||||
|
||||
<script src="assets/js/meldung.js?v=202609191915" defer></script>
|
||||
<script src="assets/js/meldung.js?v=202609191956" defer></script>
|
||||
|
||||
<script src="assets/js/ki.js?v=202609191915" defer></script>
|
||||
<script src="assets/js/wahl.js?v=202609191915" defer></script>
|
||||
<script src="assets/js/bereiche.js?v=202609191915" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609191915" defer></script>
|
||||
<script src="assets/js/glocke.js?v=202609191915" defer></script>
|
||||
<script src="assets/js/startcheck.js?v=202609191915" defer></script>
|
||||
<script src="assets/js/ki.js?v=202609191956" defer></script>
|
||||
<script src="assets/js/wahl.js?v=202609191956" defer></script>
|
||||
<script src="assets/js/bereiche.js?v=202609191956" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609191956" defer></script>
|
||||
<script src="assets/js/glocke.js?v=202609191956" defer></script>
|
||||
<script src="assets/js/startcheck.js?v=202609191956" defer></script>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
+16
-15
@@ -12,20 +12,20 @@
|
||||
Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite
|
||||
eine Flaeche sind statt zweier. -->
|
||||
<meta name="theme-color" content="#06090f" />
|
||||
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609191915" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/profil.css?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?v=202609191915" />
|
||||
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609191956" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609191956" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609191956" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609191956" />
|
||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609191956" />
|
||||
<link rel="stylesheet" href="assets/css/profil.css?v=202609191956" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?v=202609191956" />
|
||||
<!-- haus.css MUSS die letzte Stilvorlage sein (10.09.2026).
|
||||
Auf der Agenturadresse ist sie leer -- das Haus hier IST der
|
||||
Grundzustand. Auf der Adresse von Team Dogi biegt der Server
|
||||
genau diesen Dateinamen auf crew-haus.css um, und die Seite
|
||||
kommt schon beim ERSTEN Abruf in Lila und Babyblau an --
|
||||
ohne Umfaerben im Browser, ohne Flackern. -->
|
||||
<link rel="stylesheet" href="assets/css/haus.css?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/haus.css?v=202609191956" />
|
||||
</head>
|
||||
|
||||
<body class="start">
|
||||
@@ -150,13 +150,14 @@
|
||||
|
||||
</main>
|
||||
|
||||
<script src="assets/js/meldung.js?v=202609191915" defer></script>
|
||||
<script src="assets/js/meldung.js?v=202609191956" defer></script>
|
||||
<script src="assets/js/nachfrage.js?v=202609191956" defer></script>
|
||||
|
||||
<script src="assets/js/wahl.js?v=202609191915" defer></script>
|
||||
<script src="assets/js/bereiche.js?v=202609191915" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609191915" defer></script>
|
||||
<script src="assets/js/auskunft.js?v=202609191915" defer></script>
|
||||
<script src="assets/js/glocke.js?v=202609191915" defer></script>
|
||||
<script src="assets/js/steckbrief.js?v=202609191915" defer></script>
|
||||
<script src="assets/js/wahl.js?v=202609191956" defer></script>
|
||||
<script src="assets/js/bereiche.js?v=202609191956" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609191956" defer></script>
|
||||
<script src="assets/js/auskunft.js?v=202609191956" defer></script>
|
||||
<script src="assets/js/glocke.js?v=202609191956" defer></script>
|
||||
<script src="assets/js/steckbrief.js?v=202609191956" defer></script>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
+15
-14
@@ -7,18 +7,18 @@
|
||||
<meta name="robots" content="noindex, nofollow" />
|
||||
<link rel="manifest" href="/workspace/app.webmanifest" />
|
||||
<meta name="theme-color" content="#06090f" />
|
||||
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609191915" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/entwicklung.css?v=202609191915" />
|
||||
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609191956" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609191956" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609191956" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609191956" />
|
||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609191956" />
|
||||
<link rel="stylesheet" href="assets/css/entwicklung.css?v=202609191956" />
|
||||
<!-- Wegen des Kastens „Anfragen“ ueber der Liste. Eine eigene Kopie
|
||||
der Regel hier waere die zweite Stelle, an der dieselbe Sache
|
||||
anders aussieht. -->
|
||||
<link rel="stylesheet" href="assets/css/bewerbung.css?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/haus.css?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/bewerbung.css?v=202609191956" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?v=202609191956" />
|
||||
<link rel="stylesheet" href="assets/css/haus.css?v=202609191956" />
|
||||
</head>
|
||||
|
||||
<body class="start">
|
||||
@@ -111,11 +111,12 @@
|
||||
|
||||
</main>
|
||||
|
||||
<script src="assets/js/meldung.js?v=202609191915" defer></script>
|
||||
<script src="assets/js/meldung.js?v=202609191956" defer></script>
|
||||
<script src="assets/js/nachfrage.js?v=202609191956" defer></script>
|
||||
|
||||
<script src="assets/js/wahl.js?v=202609191915" defer></script>
|
||||
<script src="assets/js/bereiche.js?v=202609191915" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609191915" defer></script>
|
||||
<script src="assets/js/talente.js?v=202609191915" defer></script>
|
||||
<script src="assets/js/wahl.js?v=202609191956" defer></script>
|
||||
<script src="assets/js/bereiche.js?v=202609191956" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609191956" defer></script>
|
||||
<script src="assets/js/talente.js?v=202609191956" defer></script>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
+14
-14
@@ -7,20 +7,20 @@
|
||||
<meta name="robots" content="noindex, nofollow" />
|
||||
<link rel="manifest" href="/workspace/app.webmanifest" />
|
||||
<meta name="theme-color" content="#06090f" />
|
||||
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609191915" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/team.css?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?v=202609191915" />
|
||||
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609191956" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609191956" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609191956" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609191956" />
|
||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609191956" />
|
||||
<link rel="stylesheet" href="assets/css/team.css?v=202609191956" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?v=202609191956" />
|
||||
<!-- haus.css MUSS die letzte Stilvorlage sein (10.09.2026).
|
||||
Auf der Agenturadresse ist sie leer -- das Haus hier IST der
|
||||
Grundzustand. Auf der Adresse von Team Dogi biegt der Server
|
||||
genau diesen Dateinamen auf crew-haus.css um, und die Seite
|
||||
kommt schon beim ERSTEN Abruf in Lila und Babyblau an --
|
||||
ohne Umfaerben im Browser, ohne Flackern. -->
|
||||
<link rel="stylesheet" href="assets/css/haus.css?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/haus.css?v=202609191956" />
|
||||
</head>
|
||||
|
||||
<body class="start">
|
||||
@@ -110,12 +110,12 @@
|
||||
|
||||
</main>
|
||||
|
||||
<script src="assets/js/meldung.js?v=202609191915" defer></script>
|
||||
<script src="assets/js/meldung.js?v=202609191956" defer></script>
|
||||
|
||||
<script src="assets/js/wahl.js?v=202609191915" defer></script>
|
||||
<script src="assets/js/bereiche.js?v=202609191915" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609191915" defer></script>
|
||||
<script src="assets/js/glocke.js?v=202609191915" defer></script>
|
||||
<script src="assets/js/team.js?v=202609191915" defer></script>
|
||||
<script src="assets/js/wahl.js?v=202609191956" defer></script>
|
||||
<script src="assets/js/bereiche.js?v=202609191956" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609191956" defer></script>
|
||||
<script src="assets/js/glocke.js?v=202609191956" defer></script>
|
||||
<script src="assets/js/team.js?v=202609191956" defer></script>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
+13
-13
@@ -7,20 +7,20 @@
|
||||
<meta name="robots" content="noindex, nofollow" />
|
||||
<link rel="manifest" href="/workspace/app.webmanifest" />
|
||||
<meta name="theme-color" content="#06090f" />
|
||||
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609191915" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/team.css?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?v=202609191915" />
|
||||
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609191956" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609191956" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609191956" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609191956" />
|
||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609191956" />
|
||||
<link rel="stylesheet" href="assets/css/team.css?v=202609191956" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?v=202609191956" />
|
||||
<!-- haus.css MUSS die letzte Stilvorlage sein (10.09.2026).
|
||||
Auf der Agenturadresse ist sie leer -- das Haus hier IST der
|
||||
Grundzustand. Auf der Adresse von Team Dogi biegt der Server
|
||||
genau diesen Dateinamen auf crew-haus.css um, und die Seite
|
||||
kommt schon beim ERSTEN Abruf in Lila und Babyblau an --
|
||||
ohne Umfaerben im Browser, ohne Flackern. -->
|
||||
<link rel="stylesheet" href="assets/css/haus.css?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/haus.css?v=202609191956" />
|
||||
</head>
|
||||
|
||||
<!-- `data-buehne` steht hier fest und nicht im Skript: Die Kachel zu
|
||||
@@ -84,10 +84,10 @@
|
||||
Kaputt ist dabei nichts -- er funktioniert. Genau deshalb faellt
|
||||
es niemandem auf, und deshalb prueft pruef-css-klassen die
|
||||
ABHAENGIGKEIT statt der Optik. Hier hat sie angeschlagen. -->
|
||||
<script src="assets/js/meldung.js?v=202609191915" defer></script>
|
||||
<script src="assets/js/wahl.js?v=202609191915" defer></script>
|
||||
<script src="assets/js/bereiche.js?v=202609191915" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609191915" defer></script>
|
||||
<script src="assets/js/teamlage.js?v=202609191915" defer></script>
|
||||
<script src="assets/js/meldung.js?v=202609191956" defer></script>
|
||||
<script src="assets/js/wahl.js?v=202609191956" defer></script>
|
||||
<script src="assets/js/bereiche.js?v=202609191956" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609191956" defer></script>
|
||||
<script src="assets/js/teamlage.js?v=202609191956" defer></script>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
+12
-12
@@ -7,13 +7,13 @@
|
||||
<meta name="robots" content="noindex, nofollow" />
|
||||
<link rel="manifest" href="/workspace/app.webmanifest" />
|
||||
<meta name="theme-color" content="#06090f" />
|
||||
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609191915" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/bereich.css?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/haus.css?v=202609191915" />
|
||||
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609191956" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609191956" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609191956" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609191956" />
|
||||
<link rel="stylesheet" href="assets/css/bereich.css?v=202609191956" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?v=202609191956" />
|
||||
<link rel="stylesheet" href="assets/css/haus.css?v=202609191956" />
|
||||
</head>
|
||||
|
||||
<body class="start">
|
||||
@@ -112,11 +112,11 @@
|
||||
|
||||
</main>
|
||||
|
||||
<script src="assets/js/meldung.js?v=202609191915" defer></script>
|
||||
<script src="assets/js/meldung.js?v=202609191956" defer></script>
|
||||
|
||||
<script src="assets/js/wahl.js?v=202609191915" defer></script>
|
||||
<script src="assets/js/bereiche.js?v=202609191915" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609191915" defer></script>
|
||||
<script src="assets/js/teilen.js?v=202609191915" defer></script>
|
||||
<script src="assets/js/wahl.js?v=202609191956" defer></script>
|
||||
<script src="assets/js/bereiche.js?v=202609191956" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609191956" defer></script>
|
||||
<script src="assets/js/teilen.js?v=202609191956" defer></script>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
@@ -7,14 +7,14 @@
|
||||
<meta name="robots" content="noindex, nofollow" />
|
||||
<link rel="manifest" href="/workspace/app.webmanifest" />
|
||||
<meta name="theme-color" content="#06090f" />
|
||||
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609191915" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/treff.css?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/haus.css?v=202609191915" />
|
||||
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609191956" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609191956" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609191956" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609191956" />
|
||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609191956" />
|
||||
<link rel="stylesheet" href="assets/css/treff.css?v=202609191956" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?v=202609191956" />
|
||||
<link rel="stylesheet" href="assets/css/haus.css?v=202609191956" />
|
||||
</head>
|
||||
|
||||
<body class="start">
|
||||
@@ -126,11 +126,12 @@
|
||||
|
||||
</main>
|
||||
|
||||
<script src="assets/js/meldung.js?v=202609191915" defer></script>
|
||||
<script src="assets/js/meldung.js?v=202609191956" defer></script>
|
||||
<script src="assets/js/nachfrage.js?v=202609191956" defer></script>
|
||||
|
||||
<script src="assets/js/wahl.js?v=202609191915" defer></script>
|
||||
<script src="assets/js/bereiche.js?v=202609191915" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609191915" defer></script>
|
||||
<script src="assets/js/treff-moderation.js?v=202609191915" defer></script>
|
||||
<script src="assets/js/wahl.js?v=202609191956" defer></script>
|
||||
<script src="assets/js/bereiche.js?v=202609191956" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609191956" defer></script>
|
||||
<script src="assets/js/treff-moderation.js?v=202609191956" defer></script>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
+14
-14
@@ -7,18 +7,18 @@
|
||||
<meta name="robots" content="noindex, nofollow" />
|
||||
<link rel="manifest" href="/workspace/app.webmanifest" />
|
||||
<meta name="theme-color" content="#06090f" />
|
||||
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609191915" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/treff.css?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?v=202609191915" />
|
||||
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609191956" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609191956" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609191956" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609191956" />
|
||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609191956" />
|
||||
<link rel="stylesheet" href="assets/css/treff.css?v=202609191956" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?v=202609191956" />
|
||||
<!-- haus.css MUSS die letzte Stilvorlage sein. Auf der Adresse des
|
||||
Treffs biegt der Server genau diesen Dateinamen auf crew-haus.css
|
||||
um, und die Seite kommt schon beim ERSTEN Abruf in Lila und
|
||||
Babyblau an -- ohne Umfaerben im Browser, ohne Flackern. -->
|
||||
<link rel="stylesheet" href="assets/css/haus.css?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/haus.css?v=202609191956" />
|
||||
</head>
|
||||
|
||||
<body class="start">
|
||||
@@ -221,11 +221,11 @@
|
||||
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. -->
|
||||
<script src="assets/js/meldung.js?v=202609191915" defer></script>
|
||||
<script src="assets/js/wahl.js?v=202609191915" defer></script>
|
||||
<script src="assets/js/bereiche.js?v=202609191915" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609191915" defer></script>
|
||||
<script src="assets/js/auskunft.js?v=202609191915" defer></script>
|
||||
<script src="assets/js/treff-regeln.js?v=202609191915" defer></script>
|
||||
<script src="assets/js/meldung.js?v=202609191956" defer></script>
|
||||
<script src="assets/js/wahl.js?v=202609191956" defer></script>
|
||||
<script src="assets/js/bereiche.js?v=202609191956" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609191956" defer></script>
|
||||
<script src="assets/js/auskunft.js?v=202609191956" defer></script>
|
||||
<script src="assets/js/treff-regeln.js?v=202609191956" defer></script>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
+14
-14
@@ -12,22 +12,22 @@
|
||||
Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite
|
||||
eine Flaeche sind statt zweier. -->
|
||||
<meta name="theme-color" content="#06090f" />
|
||||
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609191915" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609191915" />
|
||||
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609191956" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609191956" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609191956" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609191956" />
|
||||
<!-- Formular- und Dialogstile: seit dem 07.09.2026 steht hier der
|
||||
Dialog "Creator anlegen". -->
|
||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/uebersicht.css?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609191956" />
|
||||
<link rel="stylesheet" href="assets/css/uebersicht.css?v=202609191956" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?v=202609191956" />
|
||||
<!-- haus.css MUSS die letzte Stilvorlage sein (10.09.2026).
|
||||
Auf der Agenturadresse ist sie leer -- das Haus hier IST der
|
||||
Grundzustand. Auf der Adresse von Team Dogi biegt der Server
|
||||
genau diesen Dateinamen auf crew-haus.css um, und die Seite
|
||||
kommt schon beim ERSTEN Abruf in Lila und Babyblau an --
|
||||
ohne Umfaerben im Browser, ohne Flackern. -->
|
||||
<link rel="stylesheet" href="assets/css/haus.css?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/haus.css?v=202609191956" />
|
||||
</head>
|
||||
|
||||
<body class="start">
|
||||
@@ -149,13 +149,13 @@
|
||||
|
||||
</main>
|
||||
|
||||
<script src="assets/js/meldung.js?v=202609191915" defer></script>
|
||||
<script src="assets/js/meldung.js?v=202609191956" defer></script>
|
||||
|
||||
<script src="assets/js/bereiche.js?v=202609191915" defer></script>
|
||||
<script src="assets/js/bereiche.js?v=202609191956" defer></script>
|
||||
|
||||
<script src="assets/js/wahl.js?v=202609191915" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609191915" defer></script>
|
||||
<script src="assets/js/glocke.js?v=202609191915" defer></script>
|
||||
<script src="assets/js/uebersicht.js?v=202609191915" defer></script>
|
||||
<script src="assets/js/wahl.js?v=202609191956" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609191956" defer></script>
|
||||
<script src="assets/js/glocke.js?v=202609191956" defer></script>
|
||||
<script src="assets/js/uebersicht.js?v=202609191956" defer></script>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
@@ -7,13 +7,13 @@
|
||||
<meta name="robots" content="noindex, nofollow" />
|
||||
<link rel="manifest" href="/workspace/app.webmanifest" />
|
||||
<meta name="theme-color" content="#06090f" />
|
||||
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609191915" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/unsere-seiten.css?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/haus.css?v=202609191915" />
|
||||
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609191956" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609191956" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609191956" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609191956" />
|
||||
<link rel="stylesheet" href="assets/css/unsere-seiten.css?v=202609191956" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?v=202609191956" />
|
||||
<link rel="stylesheet" href="assets/css/haus.css?v=202609191956" />
|
||||
</head>
|
||||
|
||||
<body class="start">
|
||||
@@ -217,11 +217,11 @@
|
||||
|
||||
</main>
|
||||
|
||||
<script src="assets/js/meldung.js?v=202609191915" defer></script>
|
||||
<script src="assets/js/meldung.js?v=202609191956" defer></script>
|
||||
|
||||
<script src="assets/js/wahl.js?v=202609191915" defer></script>
|
||||
<script src="assets/js/bereiche.js?v=202609191915" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609191915" defer></script>
|
||||
<script src="assets/js/unsere-seiten.js?v=202609191915" defer></script>
|
||||
<script src="assets/js/wahl.js?v=202609191956" defer></script>
|
||||
<script src="assets/js/bereiche.js?v=202609191956" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609191956" defer></script>
|
||||
<script src="assets/js/unsere-seiten.js?v=202609191956" defer></script>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
+14
-14
@@ -7,15 +7,15 @@
|
||||
<meta name="robots" content="noindex, nofollow" />
|
||||
<link rel="manifest" href="/workspace/app.webmanifest" />
|
||||
<meta name="theme-color" content="#06090f" />
|
||||
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609191915" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/entwicklung.css?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/werdegang.css?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/haus.css?v=202609191915" />
|
||||
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609191956" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609191956" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609191956" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609191956" />
|
||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609191956" />
|
||||
<link rel="stylesheet" href="assets/css/entwicklung.css?v=202609191956" />
|
||||
<link rel="stylesheet" href="assets/css/werdegang.css?v=202609191956" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?v=202609191956" />
|
||||
<link rel="stylesheet" href="assets/css/haus.css?v=202609191956" />
|
||||
</head>
|
||||
|
||||
<body class="start">
|
||||
@@ -144,11 +144,11 @@
|
||||
|
||||
</main>
|
||||
|
||||
<script src="assets/js/meldung.js?v=202609191915" defer></script>
|
||||
<script src="assets/js/meldung.js?v=202609191956" defer></script>
|
||||
|
||||
<script src="assets/js/wahl.js?v=202609191915" defer></script>
|
||||
<script src="assets/js/bereiche.js?v=202609191915" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609191915" defer></script>
|
||||
<script src="assets/js/werdegang.js?v=202609191915" defer></script>
|
||||
<script src="assets/js/wahl.js?v=202609191956" defer></script>
|
||||
<script src="assets/js/bereiche.js?v=202609191956" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609191956" defer></script>
|
||||
<script src="assets/js/werdegang.js?v=202609191956" defer></script>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
+15
-14
@@ -12,20 +12,20 @@
|
||||
Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite
|
||||
eine Flaeche sind statt zweier. -->
|
||||
<meta name="theme-color" content="#06090f" />
|
||||
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609191915" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/wissen.css?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?v=202609191915" />
|
||||
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609191956" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609191956" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609191956" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609191956" />
|
||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609191956" />
|
||||
<link rel="stylesheet" href="assets/css/wissen.css?v=202609191956" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?v=202609191956" />
|
||||
<!-- haus.css MUSS die letzte Stilvorlage sein (10.09.2026).
|
||||
Auf der Agenturadresse ist sie leer -- das Haus hier IST der
|
||||
Grundzustand. Auf der Adresse von Team Dogi biegt der Server
|
||||
genau diesen Dateinamen auf crew-haus.css um, und die Seite
|
||||
kommt schon beim ERSTEN Abruf in Lila und Babyblau an --
|
||||
ohne Umfaerben im Browser, ohne Flackern. -->
|
||||
<link rel="stylesheet" href="assets/css/haus.css?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/haus.css?v=202609191956" />
|
||||
</head>
|
||||
|
||||
<body class="start">
|
||||
@@ -190,12 +190,13 @@
|
||||
|
||||
</main>
|
||||
|
||||
<script src="assets/js/meldung.js?v=202609191915" defer></script>
|
||||
<script src="assets/js/meldung.js?v=202609191956" defer></script>
|
||||
<script src="assets/js/nachfrage.js?v=202609191956" defer></script>
|
||||
|
||||
<script src="assets/js/wahl.js?v=202609191915" defer></script>
|
||||
<script src="assets/js/bereiche.js?v=202609191915" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609191915" defer></script>
|
||||
<script src="assets/js/glocke.js?v=202609191915" defer></script>
|
||||
<script src="assets/js/wissen.js?v=202609191915" defer></script>
|
||||
<script src="assets/js/wahl.js?v=202609191956" defer></script>
|
||||
<script src="assets/js/bereiche.js?v=202609191956" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609191956" defer></script>
|
||||
<script src="assets/js/glocke.js?v=202609191956" defer></script>
|
||||
<script src="assets/js/wissen.js?v=202609191956" defer></script>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
Reference in New Issue
Block a user