Verfuegbarkeits-Ampel im Eingang -- und eine eigene Gruppe fuer Team Dogi
Filipe: "ich will dass die kacheln von den modis bei der rolle dogfather eine eigene kategorie haben. damit ich nicht zwischen den kacheln suchen muss." DIE AMPEL (Blueprint 7.1). Der Eingang zeigt je Person sieben Tage: gruen frei, gelb belegt, rot voll ab 180 Minuten. Die Abfrage sammelt Termine ueber VIER Wege (creator_id, teilnehmer_id, erstellt_von und die Tabelle termin_teilnehmer) -- ueber nur einen davon waeren die meisten Termine unsichtbar geblieben und die Ampel dauerhaft gruen. Sie waehlt NIE titel, beschreibung oder ort: Filipe soll sehen, WANN jemand kann, nicht WAS die Person vorhat. Belegung ist Arbeitslage, Inhalt ist privat. DIE GRUPPE. Die zwei Team-Kacheln standen zwischen einundzwanzig anderen. Jetzt tragen sie `gruppe: "Team Dogi"` und `gruppeNach: "Täglich"`; start.js setzt eine so markierte Gruppe direkt HINTER die genannte statt ans Ende. Ohne das waere sie unten gelandet -- richtig gruppiert und trotzdem zum Suchen. Das Ideen-Board ist dabei aus workspace/assets/js/bereiche.js ausgezogen. Es stand dort mit `rollen: ['admin']` in einer Datei, die jeder Modi herunterlaedt: die Kachel war unsichtbar, ihr Name nicht. Jetzt liefert der Server sie, wie den Eingang auch. DREI FEHLER, DIE DER BILDSCHIRM GEZEIGT HAT, NICHT DER CODE: Das Profilbild sprengte die Karte. teamlage.js baute ein blankes <img> in `.tperson__zeichen` -- ohne die Klasse `tperson__bild`, die es auf 44 px begrenzt. Gemeldet hat es Filipe mit einem Bildschirm- foto, nicht eine Pruefung. Der Eingang hatte ueberhaupt keine Buehne. `zuSeite()` sucht nur in bereiche.js, und die Eingangs-Kachel kommt vom Server -- der Rueck- fall war ausgerechnet der Spicy-Wasserfall. Jetzt haengt das Bild an `data-buehne="eingang"` im CSS, wo kein Skript daran vorbeikommt. Pausierte Mitglieder verschwanden. `WHERE aktiv = 1` versteckte sie samt ihrer offenen Meldungen. Jetzt stehen sie hinten, sichtbar gekennzeichnet. DIE ERWARTUNG IN pruef-start-ansicht steht auf FUENF Gruppen, in ihrer Reihenfolge -- die Position ist hier die eigentliche Aussage. Eine Gruppe, die ans Ende rutscht, faellt auf dem Bildschirm kaum auf. Die Kachelzahl blieb bei 24: umgezogen, nichts hinzugefuegt. pruef-team-ampel 28, pruef-team-stufen 24, pruef-rollen 274, pruef-crew-adresse 123, pruef-modi-ideen 30, pruef-modi-wortleck 5, pruef-zwischenspeicher 21, pruef-start-ansicht gruen. Co-Authored-By: Claude Opus 5 <[email protected]>
This commit is contained in:
@@ -191,10 +191,23 @@ for (const [breite, wie] of [[1440, "Computer"], [390, "Handy"]]) {
|
||||
GEPRUEFT WERDEN JETZT DIE NAMEN, nicht nur die Anzahl. Vier Gruppen
|
||||
koennten auch drei richtige und eine doppelte sein, und dann stuende
|
||||
hier wieder eine gruene Zahl ueber einem falschen Bildschirm. */
|
||||
const ERWARTETE_GRUPPEN = ["Täglich", "Rund um den Creator",
|
||||
/* NACHTRAG 10.09.2026: FUENF -- "Team Dogi" an zweiter Stelle.
|
||||
|
||||
Filipe musste die Kacheln seines Teams zwischen den uebrigen suchen.
|
||||
Sie haben jetzt eine eigene Gruppe, und die steht bewusst NICHT am
|
||||
Ende: `gruppeNach` in server/workspace.js schiebt sie direkt hinter
|
||||
die taegliche Arbeit. Die REIHENFOLGE ist hier deshalb die eigentliche
|
||||
Aussage -- eine Gruppe, die ans Ende rutscht, ist genau der Fehler,
|
||||
den diese Zeile finden soll, und auf dem Bildschirm faellt er kaum auf.
|
||||
|
||||
Die Gruppe kommt vom Server (`bereiche_zusatz`), nicht aus
|
||||
bereiche.js -- sie steht in keiner Datei, die jeder herunterladen kann.
|
||||
Die Kachelzahl blieb bei 24: der Eingang ist umgezogen, das Ideen-Board
|
||||
aus bereiche.js hierher gewandert, keine Kachel ist neu. */
|
||||
const ERWARTETE_GRUPPEN = ["Täglich", "Team Dogi", "Rund um den Creator",
|
||||
"Rund um das Team", "Team & System"];
|
||||
ok(JSON.stringify(r.gruppen.map((g) => g.name)) === JSON.stringify(ERWARTETE_GRUPPEN),
|
||||
`vier Gruppen in dieser Reihenfolge (${r.gruppen.map((g) => g.name).join(" · ")})`);
|
||||
`fünf Gruppen in dieser Reihenfolge (${r.gruppen.map((g) => g.name).join(" · ")})`);
|
||||
/* WIE VIELE KACHELN? Nicht abgeschrieben, sondern aus bereiche.js
|
||||
gezaehlt (06.09.2026).
|
||||
|
||||
|
||||
@@ -0,0 +1,263 @@
|
||||
/* =====================================================================
|
||||
DIE VERFUEGBARKEITS-AMPEL (Blueprint Kapitel 7.1)
|
||||
|
||||
"Persoenlicher Kalender (privat): Inhalt ausschliesslich fuer die
|
||||
jeweilige Person sichtbar; Owner/rechte Hand sehen nur die
|
||||
Verfuegbarkeits-Ampel, nicht den Klartext."
|
||||
|
||||
Zwei Fragen, und die ERSTE ist die wichtigere:
|
||||
|
||||
1. KOMMT WIRKLICH KEIN KLARTEXT DURCH? Die Termine bekommen hier
|
||||
Titel, Beschreibungen und Orte, die es sonst nirgends gibt
|
||||
("ZAHNARZT-GEHEIM-4711"). Danach wird die GANZE Antwort nach
|
||||
ihnen durchsucht -- nicht einzelne Felder, sondern der ganze
|
||||
Text. Wer ein Feld durchreicht, das er nicht bedacht hat,
|
||||
faellt damit auf; eine Pruefung, die nur die erwarteten Felder
|
||||
ansieht, faende genau das nicht.
|
||||
2. STIMMT DIE AMPEL? Drei Stufen, drei Faelle -- und die Grenze
|
||||
bei drei Stunden von beiden Seiten.
|
||||
|
||||
DAZU DER ABGLEICH MIT DER OFFIZIELLEN REGEL. Die Ampel zaehlt die
|
||||
Termine ueber eine eigene Mengenvereinigung, weil eine Abfrage je
|
||||
Person bei zehn Leuten zehn Abfragen waeren. Zwei Wege zu derselben
|
||||
Frage laufen irgendwann auseinander -- hier werden sie
|
||||
nebeneinandergelegt. Ohne das waere die Ampel eines Tages leise
|
||||
falsch, und niemand haette einen Anhaltspunkt: Sie zeigt ja nur eine
|
||||
Farbe.
|
||||
===================================================================== */
|
||||
import { mkdtempSync, rmSync } from "node:fs";
|
||||
import { tmpdir } from "node:os";
|
||||
import { join } from "node:path";
|
||||
|
||||
const ordner = mkdtempSync(join(tmpdir(), "ws-ampel-"));
|
||||
process.env.WORKSPACE_DB = join(ordner, "workspace.db");
|
||||
process.env.PORT = "4385";
|
||||
process.env.SITE_ACCESS_SECRET = "lokaler-test";
|
||||
process.env.SITE_PUBLIC_LAUNCH_AT = "2020-01-01T00:00:00+01:00";
|
||||
|
||||
const express = (await import("express")).default;
|
||||
const ec = express.response.cookie;
|
||||
express.response.cookie = function (n, w, o) { return ec.call(this, n, w, { ...(o || {}), secure: false }); };
|
||||
import { notbremse } from "./helfer-notbremse.mjs";
|
||||
await import("./index.js");
|
||||
notbremse(180_000, "pruef-team-ampel");
|
||||
await new Promise((r) => setTimeout(r, 700));
|
||||
const BASIS = "http://127.0.0.1:4385";
|
||||
|
||||
let fehler = 0, geprueft = 0, offen = 0;
|
||||
const ok = (b, t) => { geprueft++; console.log((b ? " ok " : " FEHL ") + t); if (!b) fehler++; };
|
||||
const unklar = (t) => { offen++; console.log(" -- " + t); };
|
||||
|
||||
const { DatabaseSync } = await import("node:sqlite");
|
||||
const { scryptSync, randomBytes, createHmac } = await import("node:crypto");
|
||||
const w = await import("./workspace.js");
|
||||
const d = new DatabaseSync(process.env.WORKSPACE_DB);
|
||||
const jetzt = new Date().toISOString();
|
||||
|
||||
const schluessel = randomBytes(32).toString("hex");
|
||||
d.prepare("INSERT INTO einstellungen (schluessel, wert, geaendert, von)"
|
||||
+ " VALUES (?,?,?,NULL) ON CONFLICT(schluessel) DO NOTHING")
|
||||
.run("code_kennung_schluessel", schluessel, jetzt);
|
||||
|
||||
function anlegen(name, rolle, code) {
|
||||
const salt = randomBytes(16).toString("hex");
|
||||
const hash = scryptSync(code, salt, 64,
|
||||
{ N: 32768, r: 8, p: 1, maxmem: 96 * 1024 * 1024 }).toString("hex");
|
||||
d.prepare("INSERT INTO personen"
|
||||
+ " (name, rolle, code_hash, code_salt, code_n, code_kennung, aktiv, erstellt)"
|
||||
+ " VALUES (?,?,?,?,?,?,1,?)")
|
||||
.run(name, rolle, hash, salt, 32768,
|
||||
createHmac("sha256", schluessel).update(code).digest("hex"), jetzt);
|
||||
return d.prepare("SELECT last_insert_rowid() AS id").get().id;
|
||||
}
|
||||
|
||||
anlegen("Filipe", "admin", "CODE-DOGI-0001");
|
||||
anlegen("Rieke", "hand", "CODE-HAND-0001");
|
||||
const idFrei = anlegen("Frida", "modi", "CODE-MODI-0001"); // nichts eingetragen
|
||||
const idTeils = anlegen("Tomma", "modi", "CODE-MODI-0002"); // knapp unter der Grenze
|
||||
const idVoll = anlegen("Vito", "modi", "CODE-MODI-0003"); // darueber
|
||||
|
||||
/* HEUTE, wie der Server ihn versteht -- nicht wie ich ihn ausrechne.
|
||||
Sonst misst die Pruefung um Mitternacht etwas anderes als der
|
||||
Server, und der Fehlalarm kommt genau dann, wenn niemand hinsieht. */
|
||||
const heute = w.heuteLokal();
|
||||
|
||||
/* DIE GEHEIMWOERTER. Sie stehen in Titel, Beschreibung und Ort -- also
|
||||
in jedem Feld, das ein Termin traegt. Kaeme eines davon durch, waere
|
||||
die Grenze aus dem Blueprint gebrochen. */
|
||||
const GEHEIM = ["ZAHNARZT-GEHEIM-4711", "PRIVATSACHE-BESCHREIBUNG-8899", "ORT-NUR-FUER-MICH-2233"];
|
||||
|
||||
function termin(personId, minuten, stunde) {
|
||||
d.prepare(`INSERT INTO termine
|
||||
(titel, beschreibung, art, beginn, dauer_min, ort, creator_id, teilnehmer_id,
|
||||
erledigt, erstellt, erstellt_von)
|
||||
VALUES (?,?,'termin',?,?,?,?,NULL,0,?,?)`)
|
||||
.run(GEHEIM[0], GEHEIM[1], `${heute}T${String(stunde).padStart(2, "0")}:00:00`,
|
||||
minuten, GEHEIM[2], personId, jetzt, personId);
|
||||
}
|
||||
|
||||
/* Tomma: 150 Minuten -- unter der Grenze von 180. */
|
||||
termin(idTeils, 90, 14);
|
||||
termin(idTeils, 60, 18);
|
||||
/* Vito: 240 Minuten -- darueber. */
|
||||
termin(idVoll, 240, 16);
|
||||
|
||||
async function anmelden(rolle, code) {
|
||||
const a = await fetch(`${BASIS}/workspace/api/anmelden`, {
|
||||
method: "POST", headers: { "Content-Type": "application/json" },
|
||||
body: JSON.stringify({ rolle, code }),
|
||||
});
|
||||
return (a.headers.getSetCookie?.() || []).map((z) => z.split(";")[0]).join("; ");
|
||||
}
|
||||
const holeLage = (keks) => fetch(`${BASIS}/workspace/api/teamlage`, { headers: { Cookie: keks } });
|
||||
|
||||
const keksDogi = await anmelden("admin", "CODE-DOGI-0001");
|
||||
const keksHand = await anmelden("creator", "CODE-HAND-0001");
|
||||
if (!keksDogi || !keksHand) {
|
||||
console.error("FEHLER: Anmeldung misslang -- ohne sie misst diese Datei nichts.");
|
||||
process.exit(1);
|
||||
}
|
||||
|
||||
const antwort = await holeLage(keksDogi);
|
||||
ok(antwort.status === 200, `die Lage kommt (${antwort.status})`);
|
||||
const roh = await antwort.text();
|
||||
const lage = JSON.parse(roh);
|
||||
const leute = lage.modis || [];
|
||||
|
||||
/* =====================================================================
|
||||
1. KOMMT KLARTEXT DURCH?
|
||||
===================================================================== */
|
||||
console.log("");
|
||||
console.log("--- Was NICHT in der Antwort stehen darf ---");
|
||||
|
||||
/* DIE VORAUSSETZUNG ZUERST: Gibt es die Termine ueberhaupt? Ohne sie
|
||||
waere "kein Geheimwort gefunden" trivial wahr -- der gruene Haken,
|
||||
der nichts bestaetigt. */
|
||||
const termineDa = d.prepare("SELECT COUNT(*) AS n FROM termine").get()?.n || 0;
|
||||
ok(termineDa === 3, `es gibt ${termineDa} Termine mit Klartext zum Finden (3 erwartet)`);
|
||||
|
||||
for (const wort of GEHEIM) {
|
||||
ok(!roh.includes(wort), `"${wort.slice(0, 22)}…" steht nicht in der Antwort`);
|
||||
}
|
||||
/* UND DIE GEGENPROBE ZUR SUCHE SELBST: Findet sie ein Wort, das
|
||||
wirklich dasteht? Sonst waere die Zeile darueber auch dann gruen,
|
||||
wenn `roh` leer waere. */
|
||||
ok(roh.includes("Frida"), "die Suche funktioniert (der Name steht sehr wohl darin)");
|
||||
|
||||
/* =====================================================================
|
||||
2. STIMMT DIE AMPEL?
|
||||
===================================================================== */
|
||||
console.log("");
|
||||
console.log("--- Die drei Stufen ---");
|
||||
|
||||
const von = (id) => leute.find((m) => m.id === id);
|
||||
for (const [name, id, erwartet, minuten] of [
|
||||
["Frida", idFrei, "frei", 0],
|
||||
["Tomma", idTeils, "teils", 150],
|
||||
["Vito", idVoll, "voll", 240],
|
||||
]) {
|
||||
const m = von(id);
|
||||
const heuteWert = m?.verfuegbar?.[0];
|
||||
ok(!!heuteWert, `${name}: die Ampel ist da`);
|
||||
ok(heuteWert?.ampel === erwartet,
|
||||
`${name}: heute "${heuteWert?.ampel}" (erwartet "${erwartet}")`);
|
||||
ok(heuteWert?.minuten === minuten,
|
||||
`${name}: ${heuteWert?.minuten} belegte Minuten (erwartet ${minuten})`);
|
||||
}
|
||||
|
||||
ok(von(idFrei)?.verfuegbar?.length === 7,
|
||||
`sieben Tage kommen mit (${von(idFrei)?.verfuegbar?.length})`);
|
||||
ok(von(idFrei)?.verfuegbar?.[0]?.tag === heute,
|
||||
`und der erste ist heute (${von(idFrei)?.verfuegbar?.[0]?.tag})`);
|
||||
|
||||
/* Die Tage müssen aufeinanderfolgen -- eine Lücke faellt sonst
|
||||
niemandem auf, die Farben sehen ja gleich aus. */
|
||||
const tage = von(idFrei)?.verfuegbar?.map((t) => t.tag) || [];
|
||||
const luecken = tage.filter((t, i) => i > 0
|
||||
&& Date.parse(`${t}T12:00:00Z`) - Date.parse(`${tage[i - 1]}T12:00:00Z`) !== 86400000);
|
||||
ok(tage.length === 7 && luecken.length === 0,
|
||||
`die sieben Tage folgen ohne Luecke aufeinander (${luecken.length} Sprünge)`);
|
||||
|
||||
/* =====================================================================
|
||||
3. DIE GRENZE VON BEIDEN SEITEN
|
||||
|
||||
Drei Stunden trennen "teils" von "voll". Nur EINE Seite zu pruefen
|
||||
hiesse, eine Grenze zu bestaetigen, ohne zu wissen, wo sie liegt.
|
||||
===================================================================== */
|
||||
console.log("");
|
||||
console.log("--- Die Grenze bei drei Stunden ---");
|
||||
|
||||
const idGrenze = anlegen("Grete", "modi", "CODE-MODI-0004");
|
||||
termin(idGrenze, 179, 10);
|
||||
const g1 = ((await (await holeLage(keksDogi)).json()).modis || []).find((m) => m.id === idGrenze);
|
||||
ok(g1?.verfuegbar?.[0]?.ampel === "teils", `179 Minuten sind "teils" (${g1?.verfuegbar?.[0]?.ampel})`);
|
||||
|
||||
d.prepare("UPDATE termine SET dauer_min = 180 WHERE creator_id = ?").run(idGrenze);
|
||||
const g2 = ((await (await holeLage(keksDogi)).json()).modis || []).find((m) => m.id === idGrenze);
|
||||
ok(g2?.verfuegbar?.[0]?.ampel === "voll", `180 Minuten sind "voll" (${g2?.verfuegbar?.[0]?.ampel})`);
|
||||
|
||||
/* =====================================================================
|
||||
4. ZWEI WEGE, EINE ANTWORT
|
||||
|
||||
Die Ampel zaehlt ueber eine eigene Mengenvereinigung; die offizielle
|
||||
Regel heisst termineSichtbar(). Beide muessen dasselbe sagen.
|
||||
===================================================================== */
|
||||
console.log("");
|
||||
console.log("--- Abgleich mit der offiziellen Regel ---");
|
||||
|
||||
let gleich = 0, ungleich = 0;
|
||||
for (const id of [idFrei, idTeils, idVoll, idGrenze]) {
|
||||
const regel = w.termineSichtbar({ id }, "t");
|
||||
const nachRegel = d.prepare(
|
||||
`SELECT COUNT(*) AS n FROM termine t WHERE (${regel.wo}) AND date(t.beginn) = ?`)
|
||||
.get(...regel.werte, heute)?.n || 0;
|
||||
const lage2 = ((await (await holeLage(keksDogi)).json()).modis || []).find((m) => m.id === id);
|
||||
const nachAmpel = lage2?.verfuegbar?.[0]?.termine ?? -1;
|
||||
if (nachRegel === nachAmpel) gleich++; else ungleich++;
|
||||
}
|
||||
ok(gleich === 4 && ungleich === 0,
|
||||
`beide Wege zaehlen bei allen ${gleich} Personen dasselbe`);
|
||||
|
||||
/* =====================================================================
|
||||
5. WER SIE SEHEN DARF
|
||||
===================================================================== */
|
||||
console.log("");
|
||||
console.log("--- Wer die Ampel sieht ---");
|
||||
|
||||
const handLage = await holeLage(keksHand);
|
||||
ok(handLage.status === 200, `die rechte Hand sieht die Lage (${handLage.status})`);
|
||||
const handRoh = await handLage.text();
|
||||
ok(JSON.parse(handRoh).modis?.[0]?.verfuegbar?.length === 7,
|
||||
"und die Ampel gehoert dazu -- sie koordiniert das Team");
|
||||
for (const wort of GEHEIM) {
|
||||
ok(!handRoh.includes(wort), `auch bei ihr steht "${wort.slice(0, 18)}…" nicht drin`);
|
||||
}
|
||||
|
||||
/* =====================================================================
|
||||
DIE GEGENPROBE
|
||||
|
||||
Bis hierhin koennte die Ampel auch einfach immer "frei" sagen -- bei
|
||||
Frida stimmt das ja. Also bekommt sie jetzt einen Termin, und die
|
||||
Farbe MUSS sich aendern.
|
||||
===================================================================== */
|
||||
console.log("");
|
||||
console.log("--- Gegenprobe: ein Termin veraendert die Farbe ---");
|
||||
|
||||
termin(idFrei, 300, 9);
|
||||
const nachher = ((await (await holeLage(keksDogi)).json()).modis || []).find((m) => m.id === idFrei);
|
||||
ok(nachher?.verfuegbar?.[0]?.ampel === "voll",
|
||||
`aus "frei" wird "voll" (${nachher?.verfuegbar?.[0]?.ampel})`);
|
||||
|
||||
d.prepare("DELETE FROM termine WHERE creator_id = ?").run(idFrei);
|
||||
const zurueck = ((await (await holeLage(keksDogi)).json()).modis || []).find((m) => m.id === idFrei);
|
||||
ok(zurueck?.verfuegbar?.[0]?.ampel === "frei",
|
||||
`und zurueckgenommen wieder "frei" (${zurueck?.verfuegbar?.[0]?.ampel})`);
|
||||
|
||||
/* ---------- Ende ------------------------------------------------------ */
|
||||
d.close();
|
||||
try { rmSync(ordner, { recursive: true, force: true }); } catch { /* Windows haelt manchmal */ }
|
||||
|
||||
console.log("");
|
||||
console.log(`${fehler === 0 ? "BESTANDEN" : "FEHLGESCHLAGEN"}`
|
||||
+ ` -- ${geprueft} geprueft, ${fehler} Fehler, ${offen} nicht nachsehbar`);
|
||||
process.exit(fehler === 0 ? 0 : 1);
|
||||
@@ -232,6 +232,87 @@ teamlageRouter.get("/workspace/api/teamlage", (req, res) => {
|
||||
WHERE e.bereich = 'angebote' AND e.status = 'offen'
|
||||
ORDER BY e.bewertung DESC, e.datum DESC`).all();
|
||||
|
||||
/* =================================================================
|
||||
DIE VERFUEGBARKEITS-AMPEL (Blueprint Kapitel 7.1, 10.09.2026)
|
||||
|
||||
"Persoenlicher Kalender (privat): Inhalt ausschliesslich fuer die
|
||||
jeweilige Person sichtbar; Owner/rechte Hand sehen nur die
|
||||
Verfuegbarkeits-Ampel, nicht den Klartext."
|
||||
|
||||
DIE ERSTE HAELFTE STAND SCHON: termineSichtbar() gibt jedem nur
|
||||
seine eigenen Termine -- ausdruecklich auch DogFather. Es fehlte
|
||||
genau die zweite: zu sehen, OB jemand kann, ohne zu sehen, WAS er
|
||||
vorhat.
|
||||
|
||||
DIESE ABFRAGE HOLT NIEMALS titel, beschreibung ODER ort. Nicht
|
||||
"sie zeigt sie nicht an" -- sie liest sie gar nicht erst. Was
|
||||
nicht abgefragt wird, kann auch nicht versehentlich in einer
|
||||
Antwort landen, wenn jemand spaeter ein Feld durchreicht.
|
||||
|
||||
WARUM DIE ZUGEHOERIGKEIT HIER NOCH EINMAL STEHT statt ueber
|
||||
termineSichtbar(): Jene Funktion beantwortet die Frage fuer EINE
|
||||
Person. Bei zehn Modis waeren das zehn Abfragen -- der Fehler,
|
||||
den diese Datei zwei Bildschirme weiter oben ausdruecklich
|
||||
vermeidet. Die Aufzaehlung unten ist dieselbe Regel als
|
||||
Mengenvereinigung: angelegt von mir, mir zugeordnet, ich bin das
|
||||
Gegenueber, oder ich stehe in der Teilnehmerliste.
|
||||
|
||||
DASS BEIDE DASSELBE SAGEN, IST GEMESSEN und nicht behauptet:
|
||||
pruef-team-ampel.mjs stellt beide Wege nebeneinander. Ohne diese
|
||||
Probe waere die Ampel eines Tages leise falsch -- und niemand
|
||||
haette einen Anhaltspunkt, denn sie zeigt ja nur eine Farbe. */
|
||||
const ampelTage = 7;
|
||||
const bisTag = new Date(Date.parse(`${heute}T12:00:00Z`) + (ampelTage - 1) * 86400000)
|
||||
.toISOString().slice(0, 10);
|
||||
|
||||
const belegt = new Map(); // person -> tag -> { termine, minuten }
|
||||
{
|
||||
const platzhalter = platz;
|
||||
const zeilen = db().prepare(`
|
||||
WITH meins AS (
|
||||
SELECT creator_id AS pid, id FROM termine WHERE creator_id IN (${platzhalter})
|
||||
UNION
|
||||
SELECT teilnehmer_id AS pid, id FROM termine WHERE teilnehmer_id IN (${platzhalter})
|
||||
UNION
|
||||
SELECT erstellt_von AS pid, id FROM termine WHERE erstellt_von IN (${platzhalter})
|
||||
UNION
|
||||
SELECT tn.person_id AS pid, tn.termin_id FROM termin_teilnehmer tn
|
||||
WHERE tn.person_id IN (${platzhalter})
|
||||
)
|
||||
SELECT m.pid AS p, date(t.beginn) AS tag,
|
||||
COUNT(*) AS termine, SUM(t.dauer_min) AS minuten
|
||||
FROM meins m JOIN termine t ON t.id = m.id
|
||||
WHERE date(t.beginn) BETWEEN ? AND ?
|
||||
GROUP BY m.pid, date(t.beginn)`)
|
||||
.all(...nummern, ...nummern, ...nummern, ...nummern, heute, bisTag);
|
||||
for (const z of zeilen) {
|
||||
if (!belegt.has(z.p)) belegt.set(z.p, {});
|
||||
belegt.get(z.p)[z.tag] = { termine: z.termine, minuten: z.minuten || 0 };
|
||||
}
|
||||
}
|
||||
|
||||
/* DIE DREI STUFEN.
|
||||
|
||||
Drei Stunden sind die Grenze zwischen "geht noch was" und "der
|
||||
Tag ist verplant" -- ein Sendeabend dauert etwa so lang. Der Wert
|
||||
ist ein Anfangswert und steht hier als Zahl mit Namen, damit man
|
||||
ihn an EINER Stelle aendern kann, wenn sich das im Alltag anders
|
||||
anfuehlt.
|
||||
|
||||
NULL MINUTEN HEISST "frei", nicht "unbekannt": Ein leerer
|
||||
Kalender ist eine Aussage. Wer nichts eingetragen hat, ist
|
||||
ansprechbar -- genau das will man wissen. */
|
||||
const VOLL_AB_MIN = 180;
|
||||
const ampelFuer = (eintrag) => {
|
||||
if (!eintrag || !eintrag.minuten) return "frei";
|
||||
return eintrag.minuten >= VOLL_AB_MIN ? "voll" : "teils";
|
||||
};
|
||||
const tagesliste = [];
|
||||
for (let i = 0; i < ampelTage; i++) {
|
||||
tagesliste.push(new Date(Date.parse(`${heute}T12:00:00Z`) + i * 86400000)
|
||||
.toISOString().slice(0, 10));
|
||||
}
|
||||
|
||||
/* Wie viele Rueckmeldungen an seinen Punkten haengen -- das ist
|
||||
das Gespraech, nicht die Note. */
|
||||
const nachrichten = new Map();
|
||||
@@ -271,6 +352,14 @@ teamlageRouter.get("/workspace/api/teamlage", (req, res) => {
|
||||
aktiv: !!m.aktiv,
|
||||
seit: m.erstellt || null,
|
||||
stufe: stufeVon(m.stufe),
|
||||
/* NUR DIE AMPEL. Kein Titel, kein Ort, keine Beschreibung --
|
||||
die stehen nicht einmal in der Abfrage. Die Zahl der
|
||||
Termine und die belegten Minuten sagen, wie voll es ist,
|
||||
ohne zu sagen, womit. */
|
||||
verfuegbar: tagesliste.map((tag) => {
|
||||
const e = (belegt.get(m.id) || {})[tag];
|
||||
return { tag, ampel: ampelFuer(e), termine: e?.termine || 0, minuten: e?.minuten || 0 };
|
||||
}),
|
||||
aufgaben: aufgaben.get(m.id) || { offen: 0, ueberfaellig: 0 },
|
||||
ideen: ideen.get(m.id) || 0,
|
||||
nachrichten: nachrichten.get(m.id) || 0,
|
||||
|
||||
+45
-1
@@ -580,7 +580,51 @@ export function markeFuer(person) {
|
||||
taeglichen Dingen, weil dort etwas WARTET -- Vorschlaege, ueber die
|
||||
entschieden werden will. Das ist eine Aufgabe fuer heute, keine
|
||||
Uebersicht fuer zwischendurch. */
|
||||
const ZUSATZ_BEREICHE = { admin: [EINGANG_KACHEL] };
|
||||
/* =====================================================================
|
||||
DIE EIGENE GRUPPE FUER DAS TEAM (10.09.2026)
|
||||
|
||||
Filipe zum Bildschirmfoto seiner Startseite: "ich will dass die
|
||||
kacheln von den modis bei der rolle dogfather eine eigene kategorie
|
||||
haben. damit ich nicht zwischen den kacheln suchen muss."
|
||||
|
||||
Er hatte recht, und es war schlimmer als unuebersichtlich: Der
|
||||
Eingang stand unter "Taeglich" zwischen Chat und Kalender, das
|
||||
Ideen-Board ebenfalls -- zwei Kacheln derselben Welt, verteilt auf
|
||||
eine Reihe mit sieben anderen. Wer sie sucht, liest jedes Mal alle.
|
||||
|
||||
`gruppeNach` setzt die Gruppe direkt hinter "Taeglich" statt ans
|
||||
Ende. Ganz unten waere zwar auch eine eigene Kategorie -- und immer
|
||||
noch Scrollen.
|
||||
|
||||
DAS IDEEN-BOARD IST DABEI VON assets/js/bereiche.js HIERHER GEZOGEN.
|
||||
Zwei Gruende, und der zweite ist der wichtigere:
|
||||
1. Es gehoert in dieselbe Gruppe wie der Eingang, und die entsteht
|
||||
hier.
|
||||
2. Es stand mit `rollen: ['admin']` in einer Datei, die JEDER
|
||||
herunterlaedt. Eine Kachel, die nur eine Rolle sieht, wirft dort
|
||||
die Frage auf, wofuer sie ist -- genau die Frage, die niemand
|
||||
stellen soll. Jetzt kommt sie vom Server und nur an die, die sie
|
||||
bekommt.
|
||||
|
||||
Der Gruppenname "Team Dogi" ist unverfaenglich: Er steht so auf der
|
||||
oeffentlichen Seite. */
|
||||
const TEAM_GRUPPE = {
|
||||
gruppe: "Team Dogi",
|
||||
gruppeUnter: "Was dein Team macht – und was auf dich wartet",
|
||||
gruppeNach: "Täglich",
|
||||
};
|
||||
|
||||
const ZUSATZ_BEREICHE = {
|
||||
admin: [
|
||||
{ ...TEAM_GRUPPE, ...EINGANG_KACHEL, gruppe: TEAM_GRUPPE.gruppe,
|
||||
gruppeUnter: TEAM_GRUPPE.gruppeUnter },
|
||||
{
|
||||
...TEAM_GRUPPE,
|
||||
name: "Ideen-Board", unter: "Gesammelt und nach Dringlichkeit sortiert",
|
||||
zeichen: "content", ton: 23, ziel: "bereich.html?b=ideen", szene: "portal",
|
||||
},
|
||||
],
|
||||
};
|
||||
|
||||
export function zusatzBereicheFuer(person) {
|
||||
return ZUSATZ_BEREICHE[person?.rolle] || [];
|
||||
|
||||
@@ -13,25 +13,25 @@
|
||||
"theme_color": "#06090f",
|
||||
"icons": [
|
||||
{
|
||||
"src": "/assets/img/app-symbole/workspace-192.png?v=202609101702",
|
||||
"src": "/assets/img/app-symbole/workspace-192.png?v=202609101807",
|
||||
"sizes": "192x192",
|
||||
"type": "image/png",
|
||||
"purpose": "any"
|
||||
},
|
||||
{
|
||||
"src": "/assets/img/app-symbole/workspace-512.png?v=202609101702",
|
||||
"src": "/assets/img/app-symbole/workspace-512.png?v=202609101807",
|
||||
"sizes": "512x512",
|
||||
"type": "image/png",
|
||||
"purpose": "any"
|
||||
},
|
||||
{
|
||||
"src": "/assets/img/app-symbole/workspace-192-maskable.png?v=202609101702",
|
||||
"src": "/assets/img/app-symbole/workspace-192-maskable.png?v=202609101807",
|
||||
"sizes": "192x192",
|
||||
"type": "image/png",
|
||||
"purpose": "maskable"
|
||||
},
|
||||
{
|
||||
"src": "/assets/img/app-symbole/workspace-512-maskable.png?v=202609101702",
|
||||
"src": "/assets/img/app-symbole/workspace-512-maskable.png?v=202609101807",
|
||||
"sizes": "512x512",
|
||||
"type": "image/png",
|
||||
"purpose": "maskable"
|
||||
|
||||
@@ -189,7 +189,35 @@ body.start > .schleier {
|
||||
1700 px als Grenze, nicht 1600: Genau bei der eigenen Breite zu
|
||||
wechseln hiesse, dass ein 1600er Fenster staendig zwischen
|
||||
beiden Fassungen steht. */
|
||||
|
||||
/* ---------- DER EINGANG HAT SEINE EIGENE BUEHNE (10.09.2026) ------------
|
||||
|
||||
Filipe zum Bildschirmfoto: "das foto von mir husky hasen und logo
|
||||
kannst du in den hintergrund setzen aber nicht in die kachel.
|
||||
hintergrund von der seite bitte."
|
||||
|
||||
Die Seite hatte bis eben GAR KEINE Szene -- und das war kein
|
||||
Versehen im CSS, sondern eine Kette: `zuSeite()` sucht die Kachel
|
||||
zur Seite in bereiche.js, die Eingangs-Kachel kommt aber vom Server
|
||||
(damit sie nicht in einer Datei steht, die jeder bekommt). Also fand
|
||||
sie niemand, `data-buehne` blieb leer, und es griff der Rueckfall --
|
||||
ausgerechnet der Spicy-Wasserfall.
|
||||
|
||||
Deshalb steht `data-buehne="eingang"` fest im HTML der Seite: Sie hat
|
||||
genau eine Szene, sie wechselt nie, und sie braucht dafuer kein
|
||||
Skript.
|
||||
|
||||
UND ZWAR AUF BEIDEN ADRESSEN. Der Eingang wird von DogFather und
|
||||
seiner rechten Hand geoeffnet -- er von workspace., sie von crew.
|
||||
Deshalb steht hier gleich das Team-Dogi-Motiv, nicht der Umweg ueber
|
||||
die Weiche des Servers: Die greift nur auf crew., und er saehe sonst
|
||||
weiter das falsche Bild. */
|
||||
body.start[data-buehne="eingang"]::before {
|
||||
background-image: url("../img/crew-buehne-studio-breit.webp");
|
||||
}
|
||||
|
||||
@media (min-width: 1700px) {
|
||||
body.start[data-buehne="eingang"]::before { background-image: url("../img/crew-buehne-studio-uhd.webp"); }
|
||||
body.start[data-buehne="studio"]::before { background-image: url("../img/buehne-studio-uhd.webp"); }
|
||||
body.start[data-buehne="showbuehne"]::before { background-image: url("../img/buehne-showbuehne-uhd.webp"); }
|
||||
body.start[data-buehne="garage"]::before { background-image: url("../img/buehne-garage-uhd.webp"); }
|
||||
@@ -240,6 +268,7 @@ body.start > main { position: relative; z-index: 1; }
|
||||
background-size: cover;
|
||||
background-position: 50% 38%;
|
||||
}
|
||||
body.start[data-buehne="eingang"]::before { background-image: url("../img/crew-buehne-studio-schmal.webp"); }
|
||||
body.start[data-buehne="studio"]::before { background-image: url("../img/buehne-studio-schmal.webp"); }
|
||||
body.start[data-buehne="showbuehne"]::before { background-image: url("../img/buehne-showbuehne-schmal.webp"); }
|
||||
body.start[data-buehne="garage"]::before { background-image: url("../img/buehne-garage-schmal.webp"); }
|
||||
|
||||
@@ -231,6 +231,15 @@
|
||||
border: 1px solid color-mix(in srgb, var(--r) 40%, transparent);
|
||||
flex: none;
|
||||
}
|
||||
/* SICHERHEITSNETZ (10.09.2026). In der Blase steht ein BUCHSTABE --
|
||||
ein Bild gehoert in `.tperson__bild` daneben. Genau das ist einmal
|
||||
schiefgegangen: ein blankes <img> darin, ohne Groesse, ohne
|
||||
`overflow: hidden` am Elternteil -- das Foto lief ueber die ganze
|
||||
Kachel. Behoben ist es im Skript; diese zwei Zeilen sorgen dafuer,
|
||||
dass derselbe Fehler beim naechsten Mal nichts mehr anrichtet. */
|
||||
.tperson__zeichen { overflow: hidden; }
|
||||
.tperson__zeichen > img { width: 100%; height: 100%; object-fit: cover; }
|
||||
|
||||
.tperson__zeichen {
|
||||
width: 44px; height: 44px; border-radius: 50%;
|
||||
display: grid; place-items: center; flex: none;
|
||||
@@ -564,3 +573,59 @@
|
||||
color-mix(in srgb, #8fd6a6 76%, #5f8a9f));
|
||||
}
|
||||
@media (prefers-reduced-motion: reduce) { .tfort__zeile { transition: none; } }
|
||||
|
||||
/* =======================================================================
|
||||
DIE VERFUEGBARKEITS-AMPEL (Blueprint 7.1, 10.09.2026)
|
||||
|
||||
Sieben Tage, drei Farben. Sie sagt, OB jemand kann -- nie, was er
|
||||
vorhat. Diese Grenze steht im Blueprint und laeuft hier mitten durch
|
||||
eine Kachel; deshalb ist sie auch im Quelltext an beiden Enden
|
||||
vermerkt.
|
||||
|
||||
DREI FARBEN, DIE MAN AUCH OHNE FARBE UNTERSCHEIDET: Wer Rot und Gruen
|
||||
nicht auseinanderhaelt -- rund acht Prozent der Maenner --, sieht sonst
|
||||
drei gleiche Kaesten. Deshalb tragen die drei Stufen zusaetzlich
|
||||
verschieden viel FUELLUNG: frei ist nur umrandet, teils halb, voll
|
||||
ganz. Und der Titel beim Draufzeigen sagt es in Worten.
|
||||
==================================================================== */
|
||||
.tampel {
|
||||
display: grid; gap: 7px;
|
||||
margin-top: 12px; padding-top: 11px;
|
||||
border-top: 1px solid var(--rand);
|
||||
}
|
||||
.tampel__schild {
|
||||
font-size: .72rem; font-weight: 700; letter-spacing: .1em;
|
||||
text-transform: uppercase; color: var(--text-still);
|
||||
}
|
||||
.tampel__woche {
|
||||
display: grid; gap: 4px;
|
||||
grid-template-columns: repeat(7, 1fr);
|
||||
}
|
||||
.tampel__tag {
|
||||
display: grid; place-items: center;
|
||||
padding: 7px 0 6px; border-radius: 8px;
|
||||
font-size: .7rem; font-weight: 700; letter-spacing: .02em;
|
||||
cursor: default;
|
||||
border: 1px solid var(--rand);
|
||||
}
|
||||
/* FREI: nur ein Rahmen. Nichts eingetragen ist auch optisch nichts. */
|
||||
.tampel__tag--frei {
|
||||
color: var(--text-leise);
|
||||
background: transparent;
|
||||
}
|
||||
/* TEILS: halb gefuellt -- ein Verlauf, der unten aufhoert. Er ist der
|
||||
Unterschied, den man auch in Graustufen sieht. */
|
||||
.tampel__tag--teils {
|
||||
color: color-mix(in srgb, #ffc978 84%, #ffffff);
|
||||
border-color: color-mix(in srgb, #ffc978 38%, transparent);
|
||||
background: linear-gradient(180deg, transparent 48%, rgba(255, 201, 120, .18) 48%);
|
||||
}
|
||||
/* VOLL: ganz gefuellt. */
|
||||
.tampel__tag--voll {
|
||||
color: color-mix(in srgb, #ff9aa2 86%, #ffffff);
|
||||
border-color: color-mix(in srgb, #ff9aa2 42%, transparent);
|
||||
background: rgba(255, 154, 162, .17);
|
||||
}
|
||||
.tampel__satz {
|
||||
font-size: .76rem; color: var(--text-still); line-height: 1.5;
|
||||
}
|
||||
|
||||
@@ -346,13 +346,19 @@
|
||||
rollen: ['spicy', 'admin', 'manager', 'creator', 'scout'], ziel: 'calls.html', szene: 'lounge' },
|
||||
{ name: 'Dateien', unter: 'Ablage und Freigaben', zeichen: 'dateien', ton: 19,
|
||||
rollen: ['spicy', 'admin', 'manager', 'creator', 'scout'], ziel: 'dateien.html', szene: 'arena' },
|
||||
/* Das Ideen-Board (Kapitel 5.6 des Anforderungsdokuments).
|
||||
Nur DogFather -- es ist die Sammelstelle SEINES Teams. Wer
|
||||
sonst die Adresse aufruft, bekommt einen 404 wie bei einem
|
||||
Bereich, den es nicht gibt (siehe workspace-bereiche.js). */
|
||||
{ name: 'Ideen-Board', unter: 'Gesammelt und nach Dringlichkeit sortiert',
|
||||
zeichen: 'content', ton: 23, rollen: ['admin'],
|
||||
ziel: 'bereich.html?b=ideen', szene: 'portal' },
|
||||
/* HIER STAND DAS IDEEN-BOARD, und es ist am 10.09.2026 in den
|
||||
Server gezogen (workspace.js, ZUSATZ_BEREICHE).
|
||||
|
||||
Zwei Gruende, und der zweite wiegt schwerer:
|
||||
1. Es gehoert in dieselbe Gruppe wie der Eingang, und die
|
||||
entsteht dort.
|
||||
2. Es stand hier mit `rollen: ['admin']` -- in einer Datei,
|
||||
die JEDER herunterlaedt. Eine Kachel, die nur eine
|
||||
einzige Rolle sieht, wirft beim Lesen die Frage auf,
|
||||
wofuer sie ist. Genau die soll niemand stellen.
|
||||
|
||||
Die Kachel ist nicht weg; sie kommt jetzt nur an die, die
|
||||
sie auch bekommen. */
|
||||
],
|
||||
},
|
||||
{
|
||||
|
||||
@@ -190,8 +190,26 @@
|
||||
.filter((g) => g.bereiche.length);
|
||||
for (const b of zusatz) {
|
||||
const g = gruppen.find((x) => x.name === b.gruppe);
|
||||
if (g) g.bereiche = [...g.bereiche, b];
|
||||
else gruppen.push({ name: b.gruppe, unter: b.gruppeUnter || '', bereiche: [b] });
|
||||
if (g) { g.bereiche = [...g.bereiche, b]; continue; }
|
||||
|
||||
/* EINE NEUE GRUPPE DARF SAGEN, WO SIE HINGEHOERT (10.09.2026).
|
||||
|
||||
Bis hierhin wurde sie hinten angehaengt. Filipe: "ich will
|
||||
dass die kacheln ... eine eigene kategorie haben. damit ich
|
||||
nicht zwischen den kacheln suchen muss." Ganz unten waere
|
||||
zwar eine eigene Kategorie -- aber immer noch Scrollen.
|
||||
|
||||
`gruppeNach` nennt die Gruppe, HINTER der sie stehen soll.
|
||||
Findet sie sich nicht (umbenannt, fuer diese Rolle nicht
|
||||
dabei), bleibt es beim Anhaengen: Eine Kachel, die wegen
|
||||
einer Reihenfolge verschwindet, waere der schlechtere
|
||||
Tausch. */
|
||||
const neuGruppe = { name: b.gruppe, unter: b.gruppeUnter || '', bereiche: [b] };
|
||||
const nach = b.gruppeNach
|
||||
? gruppen.findIndex((x) => x.name === b.gruppeNach)
|
||||
: -1;
|
||||
if (nach >= 0) gruppen.splice(nach + 1, 0, neuGruppe);
|
||||
else gruppen.push(neuGruppe);
|
||||
}
|
||||
return gruppen;
|
||||
}
|
||||
|
||||
@@ -83,12 +83,27 @@
|
||||
if (!m.aktiv) k.dataset.pause = 'ja';
|
||||
|
||||
const kopf = el('div', 'tperson__kopf');
|
||||
const zeichen = el('span', 'tperson__zeichen');
|
||||
/* DAS BILD BEKOMMT SEINE KLASSE -- UND DAS WAR EIN ECHTER FEHLER.
|
||||
|
||||
Hier stand ein blankes <img> IN der Buchstaben-Blase. Ein Bild
|
||||
ohne Groessenangabe nimmt seine natuerliche -- und die Blase hat
|
||||
kein `overflow: hidden`. Ergebnis: Das Profilfoto lief ueber die
|
||||
ganze Kachel, quer ueber Zahlen und Balken. Filipe hat es im
|
||||
Bildschirmfoto gesehen, bevor ich es gemessen hatte.
|
||||
|
||||
`tperson__bild` gibt es laengst und traegt alles Noetige: 44 px,
|
||||
rund, `object-fit: cover`, Rand in der Rollenfarbe. Sie steht
|
||||
neben der Blase, nicht darin -- entweder ein Bild ODER ein
|
||||
Buchstabe, nie beides ineinander. */
|
||||
let zeichen;
|
||||
if (m.bild) {
|
||||
const b = document.createElement('img');
|
||||
b.src = m.bild; b.alt = ''; b.loading = 'lazy';
|
||||
zeichen.append(b);
|
||||
zeichen = document.createElement('img');
|
||||
zeichen.className = 'tperson__bild';
|
||||
zeichen.src = m.bild;
|
||||
zeichen.alt = '';
|
||||
zeichen.loading = 'lazy';
|
||||
} else {
|
||||
zeichen = el('span', 'tperson__zeichen');
|
||||
zeichen.textContent = (m.name || '?').trim().charAt(0).toUpperCase();
|
||||
}
|
||||
kopf.append(zeichen);
|
||||
@@ -134,6 +149,49 @@
|
||||
}
|
||||
k.append(merkmale);
|
||||
|
||||
/* ===================================================================
|
||||
DIE VERFUEGBARKEITS-AMPEL (Blueprint 7.1)
|
||||
|
||||
"Owner/rechte Hand sehen nur die Verfuegbarkeits-Ampel, nicht den
|
||||
Klartext." Sieben Tage, drei Farben, kein Wort darueber, was
|
||||
jemand vorhat -- der Server schickt auch gar nichts anderes.
|
||||
|
||||
WOCHENTAGSBUCHSTABE STATT DATUM: Sieben Datumsangaben
|
||||
nebeneinander liest niemand. Der Buchstabe reicht, um "Donnerstag
|
||||
ist dicht" zu erkennen; das genaue Datum steht im Titel, den man
|
||||
beim Draufzeigen bekommt.
|
||||
|
||||
DER TITEL SAGT NICHT, WAS ANLIEGT, sondern nur wie viel: "3
|
||||
Termine, 2 Std 30". Das ist die Grenze aus dem Blueprint, und sie
|
||||
laeuft hier mitten durch einen Satz -- deshalb steht sie hier
|
||||
noch einmal. */
|
||||
if (Array.isArray(m.verfuegbar) && m.verfuegbar.length) {
|
||||
const woche = el('div', 'tampel');
|
||||
woche.append(el('span', 'tampel__schild', 'Kann heute'));
|
||||
const streifen = el('div', 'tampel__woche');
|
||||
for (const t of m.verfuegbar) {
|
||||
const d = new Date(`${t.tag}T12:00:00Z`);
|
||||
const tag = el('span', `tampel__tag tampel__tag--${t.ampel}`,
|
||||
['So', 'Mo', 'Di', 'Mi', 'Do', 'Fr', 'Sa'][d.getUTCDay()]);
|
||||
const dauer = t.minuten
|
||||
? `${Math.floor(t.minuten / 60)} Std ${String(t.minuten % 60).padStart(2, '0')}`
|
||||
: null;
|
||||
tag.title = `${d.toLocaleDateString('de-DE', { weekday: 'long', day: 'numeric', month: 'long' })}`
|
||||
+ (t.termine ? ` · ${t.termine} ${t.termine === 1 ? 'Termin' : 'Termine'}, ${dauer}` : ' · nichts eingetragen');
|
||||
streifen.append(tag);
|
||||
}
|
||||
woche.append(streifen);
|
||||
/* Der Satz sagt, was die Farben bedeuten -- einmal je Karte, nicht
|
||||
als Legende irgendwo. Wer die Seite zum ersten Mal sieht, soll
|
||||
nicht raten. */
|
||||
const heuteWert = m.verfuegbar[0];
|
||||
woche.append(el('span', 'tampel__satz',
|
||||
heuteWert.ampel === 'frei' ? 'Heute nichts eingetragen – ansprechbar.'
|
||||
: heuteWert.ampel === 'teils' ? 'Heute teilweise verplant.'
|
||||
: 'Heute weitgehend verplant.'));
|
||||
k.append(woche);
|
||||
}
|
||||
|
||||
/* DIE STUFE SETZEN -- nur DogFather. Die rechte Hand sieht sie,
|
||||
aendert sie aber nicht: Wer im Team auf welcher Stufe steht, ist
|
||||
eine Personalentscheidung (Blueprint 4.1, "Rechte anpassen"
|
||||
|
||||
+11
-11
@@ -12,12 +12,12 @@
|
||||
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=202609101702" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609101702" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609101702" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609101702" />
|
||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609101702" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?v=202609101702" />
|
||||
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609101807" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609101807" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609101807" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609101807" />
|
||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609101807" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?v=202609101807" />
|
||||
</head>
|
||||
|
||||
<body class="start">
|
||||
@@ -245,10 +245,10 @@
|
||||
</form>
|
||||
</dialog>
|
||||
|
||||
<script src="assets/js/wahl.js?v=202609101702" defer></script>
|
||||
<script src="assets/js/bereiche.js?v=202609101702" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609101702" defer></script>
|
||||
<script src="assets/js/glocke.js?v=202609101702" defer></script>
|
||||
<script src="assets/js/aufgaben.js?v=202609101702" defer></script>
|
||||
<script src="assets/js/wahl.js?v=202609101807" defer></script>
|
||||
<script src="assets/js/bereiche.js?v=202609101807" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609101807" defer></script>
|
||||
<script src="assets/js/glocke.js?v=202609101807" defer></script>
|
||||
<script src="assets/js/aufgaben.js?v=202609101807" defer></script>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
+12
-12
@@ -12,13 +12,13 @@
|
||||
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=202609101702" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609101702" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609101702" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609101702" />
|
||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609101702" />
|
||||
<link rel="stylesheet" href="assets/css/automation.css?v=202609101702" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?v=202609101702" />
|
||||
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609101807" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609101807" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609101807" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609101807" />
|
||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609101807" />
|
||||
<link rel="stylesheet" href="assets/css/automation.css?v=202609101807" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?v=202609101807" />
|
||||
</head>
|
||||
|
||||
<body class="start">
|
||||
@@ -140,10 +140,10 @@
|
||||
|
||||
</main>
|
||||
|
||||
<script src="assets/js/wahl.js?v=202609101702" defer></script>
|
||||
<script src="assets/js/bereiche.js?v=202609101702" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609101702" defer></script>
|
||||
<script src="assets/js/glocke.js?v=202609101702" defer></script>
|
||||
<script src="assets/js/automation.js?v=202609101702" defer></script>
|
||||
<script src="assets/js/wahl.js?v=202609101807" defer></script>
|
||||
<script src="assets/js/bereiche.js?v=202609101807" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609101807" defer></script>
|
||||
<script src="assets/js/glocke.js?v=202609101807" defer></script>
|
||||
<script src="assets/js/automation.js?v=202609101807" defer></script>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
+16
-16
@@ -12,13 +12,13 @@
|
||||
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=202609101702" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609101702" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609101702" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609101702" />
|
||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609101702" />
|
||||
<link rel="stylesheet" href="assets/css/bereich.css?v=202609101702" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?v=202609101702" />
|
||||
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609101807" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609101807" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609101807" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609101807" />
|
||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609101807" />
|
||||
<link rel="stylesheet" href="assets/css/bereich.css?v=202609101807" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?v=202609101807" />
|
||||
</head>
|
||||
|
||||
<body class="start">
|
||||
@@ -157,14 +157,14 @@
|
||||
|
||||
</main>
|
||||
|
||||
<script src="assets/js/wahl.js?v=202609101702" defer></script>
|
||||
<script src="assets/js/bereiche.js?v=202609101702" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609101702" defer></script>
|
||||
<script src="assets/js/glocke.js?v=202609101702" defer></script>
|
||||
<script src="assets/js/checkliste.js?v=202609101702" defer></script>
|
||||
<script src="assets/js/ampel.js?v=202609101702" defer></script>
|
||||
<script src="assets/js/schulung.js?v=202609101702" defer></script>
|
||||
<script src="assets/js/vorlagen.js?v=202609101702" defer></script>
|
||||
<script src="assets/js/bereich.js?v=202609101702" defer></script>
|
||||
<script src="assets/js/wahl.js?v=202609101807" defer></script>
|
||||
<script src="assets/js/bereiche.js?v=202609101807" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609101807" defer></script>
|
||||
<script src="assets/js/glocke.js?v=202609101807" defer></script>
|
||||
<script src="assets/js/checkliste.js?v=202609101807" defer></script>
|
||||
<script src="assets/js/ampel.js?v=202609101807" defer></script>
|
||||
<script src="assets/js/schulung.js?v=202609101807" defer></script>
|
||||
<script src="assets/js/vorlagen.js?v=202609101807" defer></script>
|
||||
<script src="assets/js/bereich.js?v=202609101807" defer></script>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
+13
-13
@@ -12,13 +12,13 @@
|
||||
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=202609101702" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609101702" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609101702" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609101702" />
|
||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609101702" />
|
||||
<link rel="stylesheet" href="assets/css/calls.css?v=202609101702" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?v=202609101702" />
|
||||
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609101807" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609101807" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609101807" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609101807" />
|
||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609101807" />
|
||||
<link rel="stylesheet" href="assets/css/calls.css?v=202609101807" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?v=202609101807" />
|
||||
</head>
|
||||
|
||||
<body class="start">
|
||||
@@ -82,11 +82,11 @@
|
||||
|
||||
</main>
|
||||
|
||||
<script src="assets/js/ki.js?v=202609101702" defer></script>
|
||||
<script src="assets/js/wahl.js?v=202609101702" defer></script>
|
||||
<script src="assets/js/bereiche.js?v=202609101702" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609101702" defer></script>
|
||||
<script src="assets/js/glocke.js?v=202609101702" defer></script>
|
||||
<script src="assets/js/calls.js?v=202609101702" defer></script>
|
||||
<script src="assets/js/ki.js?v=202609101807" defer></script>
|
||||
<script src="assets/js/wahl.js?v=202609101807" defer></script>
|
||||
<script src="assets/js/bereiche.js?v=202609101807" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609101807" defer></script>
|
||||
<script src="assets/js/glocke.js?v=202609101807" defer></script>
|
||||
<script src="assets/js/calls.js?v=202609101807" defer></script>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
+12
-12
@@ -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=202609101702" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609101702" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609101702" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609101702" />
|
||||
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609101807" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609101807" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609101807" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609101807" />
|
||||
<!-- 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=202609101702" />
|
||||
<link rel="stylesheet" href="assets/css/chat.css?v=202609101702" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?v=202609101702" />
|
||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609101807" />
|
||||
<link rel="stylesheet" href="assets/css/chat.css?v=202609101807" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?v=202609101807" />
|
||||
</head>
|
||||
|
||||
<body class="start">
|
||||
@@ -247,10 +247,10 @@
|
||||
</form>
|
||||
</dialog>
|
||||
|
||||
<script src="assets/js/bereiche.js?v=202609101702"></script>
|
||||
<script src="assets/js/wahl.js?v=202609101702" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609101702"></script>
|
||||
<script src="assets/js/glocke.js?v=202609101702"></script>
|
||||
<script src="assets/js/chat.js?v=202609101702"></script>
|
||||
<script src="assets/js/bereiche.js?v=202609101807"></script>
|
||||
<script src="assets/js/wahl.js?v=202609101807" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609101807"></script>
|
||||
<script src="assets/js/glocke.js?v=202609101807"></script>
|
||||
<script src="assets/js/chat.js?v=202609101807"></script>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
+14
-14
@@ -12,13 +12,13 @@
|
||||
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=202609101702" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609101702" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609101702" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609101702" />
|
||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609101702" />
|
||||
<link rel="stylesheet" href="assets/css/content.css?v=202609101702" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?v=202609101702" />
|
||||
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609101807" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609101807" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609101807" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609101807" />
|
||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609101807" />
|
||||
<link rel="stylesheet" href="assets/css/content.css?v=202609101807" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?v=202609101807" />
|
||||
</head>
|
||||
|
||||
<body class="start">
|
||||
@@ -172,12 +172,12 @@
|
||||
|
||||
</main>
|
||||
|
||||
<script src="assets/js/wahl.js?v=202609101702" defer></script>
|
||||
<script src="assets/js/bereiche.js?v=202609101702" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609101702" defer></script>
|
||||
<script src="assets/js/glocke.js?v=202609101702" defer></script>
|
||||
<script src="assets/js/checkliste.js?v=202609101702" defer></script>
|
||||
<script src="assets/js/vorlagen.js?v=202609101702" defer></script>
|
||||
<script src="assets/js/content.js?v=202609101702" defer></script>
|
||||
<script src="assets/js/wahl.js?v=202609101807" defer></script>
|
||||
<script src="assets/js/bereiche.js?v=202609101807" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609101807" defer></script>
|
||||
<script src="assets/js/glocke.js?v=202609101807" defer></script>
|
||||
<script src="assets/js/checkliste.js?v=202609101807" defer></script>
|
||||
<script src="assets/js/vorlagen.js?v=202609101807" defer></script>
|
||||
<script src="assets/js/content.js?v=202609101807" defer></script>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
@@ -30,9 +30,9 @@
|
||||
<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=202609101702" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/crew-180.png?v=202609101702" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609101702" />
|
||||
<link rel="icon" type="image/png" href="/assets/img/app-symbole/crew-32.png?v=202609101807" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/crew-180.png?v=202609101807" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609101807" />
|
||||
</head>
|
||||
|
||||
<body class="gate gate--crew">
|
||||
@@ -246,6 +246,6 @@
|
||||
</main>
|
||||
</div>
|
||||
|
||||
<script src="assets/js/gate.js?v=202609101702" defer></script>
|
||||
<script src="assets/js/gate.js?v=202609101807" defer></script>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
@@ -13,25 +13,25 @@
|
||||
"theme_color": "#06090f",
|
||||
"icons": [
|
||||
{
|
||||
"src": "/assets/img/app-symbole/crew-192.png?v=202609101702",
|
||||
"src": "/assets/img/app-symbole/crew-192.png?v=202609101807",
|
||||
"sizes": "192x192",
|
||||
"type": "image/png",
|
||||
"purpose": "any"
|
||||
},
|
||||
{
|
||||
"src": "/assets/img/app-symbole/crew-512.png?v=202609101702",
|
||||
"src": "/assets/img/app-symbole/crew-512.png?v=202609101807",
|
||||
"sizes": "512x512",
|
||||
"type": "image/png",
|
||||
"purpose": "any"
|
||||
},
|
||||
{
|
||||
"src": "/assets/img/app-symbole/crew-192-maskable.png?v=202609101702",
|
||||
"src": "/assets/img/app-symbole/crew-192-maskable.png?v=202609101807",
|
||||
"sizes": "192x192",
|
||||
"type": "image/png",
|
||||
"purpose": "maskable"
|
||||
},
|
||||
{
|
||||
"src": "/assets/img/app-symbole/crew-512-maskable.png?v=202609101702",
|
||||
"src": "/assets/img/app-symbole/crew-512-maskable.png?v=202609101807",
|
||||
"sizes": "512x512",
|
||||
"type": "image/png",
|
||||
"purpose": "maskable"
|
||||
|
||||
+12
-12
@@ -12,13 +12,13 @@
|
||||
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=202609101702" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609101702" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609101702" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609101702" />
|
||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609101702" />
|
||||
<link rel="stylesheet" href="assets/css/dateien.css?v=202609101702" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?v=202609101702" />
|
||||
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609101807" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609101807" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609101807" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609101807" />
|
||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609101807" />
|
||||
<link rel="stylesheet" href="assets/css/dateien.css?v=202609101807" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?v=202609101807" />
|
||||
</head>
|
||||
|
||||
<body class="start">
|
||||
@@ -101,10 +101,10 @@
|
||||
|
||||
</main>
|
||||
|
||||
<script src="assets/js/wahl.js?v=202609101702" defer></script>
|
||||
<script src="assets/js/bereiche.js?v=202609101702" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609101702" defer></script>
|
||||
<script src="assets/js/glocke.js?v=202609101702" defer></script>
|
||||
<script src="assets/js/dateien.js?v=202609101702" defer></script>
|
||||
<script src="assets/js/wahl.js?v=202609101807" defer></script>
|
||||
<script src="assets/js/bereiche.js?v=202609101807" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609101807" defer></script>
|
||||
<script src="assets/js/glocke.js?v=202609101807" defer></script>
|
||||
<script src="assets/js/dateien.js?v=202609101807" 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=202609101702" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609101702" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609101702" />
|
||||
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609101807" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609101807" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609101807" />
|
||||
</head>
|
||||
|
||||
<body class="gate">
|
||||
@@ -401,6 +401,6 @@
|
||||
</main>
|
||||
</div>
|
||||
|
||||
<script src="assets/js/gate.js?v=202609101702" defer></script>
|
||||
<script src="assets/js/gate.js?v=202609101807" defer></script>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
+13
-13
@@ -12,13 +12,13 @@
|
||||
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=202609101702" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609101702" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609101702" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609101702" />
|
||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609101702" />
|
||||
<link rel="stylesheet" href="assets/css/kalender.css?v=202609101702" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?v=202609101702" />
|
||||
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609101807" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609101807" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609101807" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609101807" />
|
||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609101807" />
|
||||
<link rel="stylesheet" href="assets/css/kalender.css?v=202609101807" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?v=202609101807" />
|
||||
</head>
|
||||
|
||||
<body class="start">
|
||||
@@ -370,11 +370,11 @@
|
||||
|
||||
</main>
|
||||
|
||||
<script src="assets/js/wahl.js?v=202609101702" defer></script>
|
||||
<script src="assets/js/bereiche.js?v=202609101702" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609101702" defer></script>
|
||||
<script src="assets/js/glocke.js?v=202609101702" defer></script>
|
||||
<script src="assets/js/kalender.js?v=202609101702" defer></script>
|
||||
<script src="assets/js/kalender-abo.js?v=202609101702" defer></script>
|
||||
<script src="assets/js/wahl.js?v=202609101807" defer></script>
|
||||
<script src="assets/js/bereiche.js?v=202609101807" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609101807" defer></script>
|
||||
<script src="assets/js/glocke.js?v=202609101807" defer></script>
|
||||
<script src="assets/js/kalender.js?v=202609101807" defer></script>
|
||||
<script src="assets/js/kalender-abo.js?v=202609101807" defer></script>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
+12
-12
@@ -12,13 +12,13 @@
|
||||
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=202609101702" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609101702" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609101702" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609101702" />
|
||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609101702" />
|
||||
<link rel="stylesheet" href="assets/css/leistung.css?v=202609101702" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?v=202609101702" />
|
||||
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609101807" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609101807" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609101807" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609101807" />
|
||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609101807" />
|
||||
<link rel="stylesheet" href="assets/css/leistung.css?v=202609101807" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?v=202609101807" />
|
||||
</head>
|
||||
|
||||
<body class="start">
|
||||
@@ -217,10 +217,10 @@
|
||||
</form>
|
||||
</dialog>
|
||||
|
||||
<script src="assets/js/wahl.js?v=202609101702"></script>
|
||||
<script src="assets/js/bereiche.js?v=202609101702"></script>
|
||||
<script src="assets/js/kopf.js?v=202609101702"></script>
|
||||
<script src="assets/js/glocke.js?v=202609101702"></script>
|
||||
<script src="assets/js/leistung.js?v=202609101702"></script>
|
||||
<script src="assets/js/wahl.js?v=202609101807"></script>
|
||||
<script src="assets/js/bereiche.js?v=202609101807"></script>
|
||||
<script src="assets/js/kopf.js?v=202609101807"></script>
|
||||
<script src="assets/js/glocke.js?v=202609101807"></script>
|
||||
<script src="assets/js/leistung.js?v=202609101807"></script>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
+12
-12
@@ -12,13 +12,13 @@
|
||||
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=202609101702" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609101702" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609101702" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609101702" />
|
||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609101702" />
|
||||
<link rel="stylesheet" href="assets/css/personen.css?v=202609101702" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?v=202609101702" />
|
||||
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609101807" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609101807" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609101807" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609101807" />
|
||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609101807" />
|
||||
<link rel="stylesheet" href="assets/css/personen.css?v=202609101807" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?v=202609101807" />
|
||||
</head>
|
||||
|
||||
<body class="start">
|
||||
@@ -364,10 +364,10 @@
|
||||
|
||||
</main>
|
||||
|
||||
<script src="assets/js/wahl.js?v=202609101702" defer></script>
|
||||
<script src="assets/js/bereiche.js?v=202609101702" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609101702" defer></script>
|
||||
<script src="assets/js/glocke.js?v=202609101702" defer></script>
|
||||
<script src="assets/js/personen.js?v=202609101702" defer></script>
|
||||
<script src="assets/js/wahl.js?v=202609101807" defer></script>
|
||||
<script src="assets/js/bereiche.js?v=202609101807" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609101807" defer></script>
|
||||
<script src="assets/js/glocke.js?v=202609101807" defer></script>
|
||||
<script src="assets/js/personen.js?v=202609101807" defer></script>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
+13
-13
@@ -12,13 +12,13 @@
|
||||
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=202609101702" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609101702" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609101702" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609101702" />
|
||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609101702" />
|
||||
<link rel="stylesheet" href="assets/css/profil.css?v=202609101702" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?v=202609101702" />
|
||||
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609101807" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609101807" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609101807" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609101807" />
|
||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609101807" />
|
||||
<link rel="stylesheet" href="assets/css/profil.css?v=202609101807" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?v=202609101807" />
|
||||
</head>
|
||||
|
||||
<body class="start">
|
||||
@@ -207,11 +207,11 @@
|
||||
|
||||
</main>
|
||||
|
||||
<script src="assets/js/wahl.js?v=202609101702" defer></script>
|
||||
<script src="assets/js/bereiche.js?v=202609101702" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609101702" defer></script>
|
||||
<script src="assets/js/glocke.js?v=202609101702" defer></script>
|
||||
<script src="assets/js/steckbrief.js?v=202609101702" defer></script>
|
||||
<script src="assets/js/profil.js?v=202609101702" defer></script>
|
||||
<script src="assets/js/wahl.js?v=202609101807" defer></script>
|
||||
<script src="assets/js/bereiche.js?v=202609101807" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609101807" defer></script>
|
||||
<script src="assets/js/glocke.js?v=202609101807" defer></script>
|
||||
<script src="assets/js/steckbrief.js?v=202609101807" defer></script>
|
||||
<script src="assets/js/profil.js?v=202609101807" defer></script>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
+13
-13
@@ -12,13 +12,13 @@
|
||||
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=202609101702" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609101702" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609101702" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609101702" />
|
||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609101702" />
|
||||
<link rel="stylesheet" href="assets/css/report.css?v=202609101702" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?v=202609101702" />
|
||||
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609101807" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609101807" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609101807" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609101807" />
|
||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609101807" />
|
||||
<link rel="stylesheet" href="assets/css/report.css?v=202609101807" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?v=202609101807" />
|
||||
</head>
|
||||
|
||||
<body class="start">
|
||||
@@ -99,11 +99,11 @@
|
||||
|
||||
</main>
|
||||
|
||||
<script src="assets/js/ki.js?v=202609101702" defer></script>
|
||||
<script src="assets/js/wahl.js?v=202609101702" defer></script>
|
||||
<script src="assets/js/bereiche.js?v=202609101702" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609101702" defer></script>
|
||||
<script src="assets/js/glocke.js?v=202609101702" defer></script>
|
||||
<script src="assets/js/report.js?v=202609101702" defer></script>
|
||||
<script src="assets/js/ki.js?v=202609101807" defer></script>
|
||||
<script src="assets/js/wahl.js?v=202609101807" defer></script>
|
||||
<script src="assets/js/bereiche.js?v=202609101807" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609101807" defer></script>
|
||||
<script src="assets/js/glocke.js?v=202609101807" defer></script>
|
||||
<script src="assets/js/report.js?v=202609101807" defer></script>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
+12
-12
@@ -12,13 +12,13 @@
|
||||
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=202609101702" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609101702" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609101702" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609101702" />
|
||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609101702" />
|
||||
<link rel="stylesheet" href="assets/css/scouting.css?v=202609101702" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?v=202609101702" />
|
||||
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609101807" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609101807" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609101807" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609101807" />
|
||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609101807" />
|
||||
<link rel="stylesheet" href="assets/css/scouting.css?v=202609101807" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?v=202609101807" />
|
||||
</head>
|
||||
|
||||
<body class="start">
|
||||
@@ -132,10 +132,10 @@
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<script src="assets/js/wahl.js?v=202609101702" defer></script>
|
||||
<script src="assets/js/bereiche.js?v=202609101702" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609101702" defer></script>
|
||||
<script src="assets/js/glocke.js?v=202609101702" defer></script>
|
||||
<script src="assets/js/scouting.js?v=202609101702" defer></script>
|
||||
<script src="assets/js/wahl.js?v=202609101807" defer></script>
|
||||
<script src="assets/js/bereiche.js?v=202609101807" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609101807" defer></script>
|
||||
<script src="assets/js/glocke.js?v=202609101807" defer></script>
|
||||
<script src="assets/js/scouting.js?v=202609101807" defer></script>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
+11
-11
@@ -12,14 +12,14 @@
|
||||
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=202609101702" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609101702" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609101702" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609101702" />
|
||||
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609101807" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609101807" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609101807" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609101807" />
|
||||
<!-- 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=202609101702" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?v=202609101702" />
|
||||
<link rel="stylesheet" href="assets/css/heim.css?v=202609101807" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?v=202609101807" />
|
||||
</head>
|
||||
|
||||
<body class="start">
|
||||
@@ -667,10 +667,10 @@
|
||||
</p>
|
||||
</main>
|
||||
|
||||
<script src="assets/js/wahl.js?v=202609101702" defer></script>
|
||||
<script src="assets/js/bereiche.js?v=202609101702" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609101702" defer></script>
|
||||
<script src="assets/js/glocke.js?v=202609101702" defer></script>
|
||||
<script src="assets/js/start.js?v=202609101702" defer></script>
|
||||
<script src="assets/js/wahl.js?v=202609101807" defer></script>
|
||||
<script src="assets/js/bereiche.js?v=202609101807" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609101807" defer></script>
|
||||
<script src="assets/js/glocke.js?v=202609101807" defer></script>
|
||||
<script src="assets/js/start.js?v=202609101807" defer></script>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
+13
-13
@@ -12,13 +12,13 @@
|
||||
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=202609101702" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609101702" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609101702" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609101702" />
|
||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609101702" />
|
||||
<link rel="stylesheet" href="assets/css/startcheck.css?v=202609101702" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?v=202609101702" />
|
||||
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609101807" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609101807" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609101807" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609101807" />
|
||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609101807" />
|
||||
<link rel="stylesheet" href="assets/css/startcheck.css?v=202609101807" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?v=202609101807" />
|
||||
</head>
|
||||
|
||||
<body class="start">
|
||||
@@ -78,11 +78,11 @@
|
||||
|
||||
</main>
|
||||
|
||||
<script src="assets/js/ki.js?v=202609101702" defer></script>
|
||||
<script src="assets/js/wahl.js?v=202609101702" defer></script>
|
||||
<script src="assets/js/bereiche.js?v=202609101702" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609101702" defer></script>
|
||||
<script src="assets/js/glocke.js?v=202609101702" defer></script>
|
||||
<script src="assets/js/startcheck.js?v=202609101702" defer></script>
|
||||
<script src="assets/js/ki.js?v=202609101807" defer></script>
|
||||
<script src="assets/js/wahl.js?v=202609101807" defer></script>
|
||||
<script src="assets/js/bereiche.js?v=202609101807" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609101807" defer></script>
|
||||
<script src="assets/js/glocke.js?v=202609101807" defer></script>
|
||||
<script src="assets/js/startcheck.js?v=202609101807" defer></script>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
+12
-12
@@ -12,13 +12,13 @@
|
||||
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=202609101702" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609101702" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609101702" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609101702" />
|
||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609101702" />
|
||||
<link rel="stylesheet" href="assets/css/profil.css?v=202609101702" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?v=202609101702" />
|
||||
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609101807" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609101807" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609101807" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609101807" />
|
||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609101807" />
|
||||
<link rel="stylesheet" href="assets/css/profil.css?v=202609101807" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?v=202609101807" />
|
||||
</head>
|
||||
|
||||
<body class="start">
|
||||
@@ -119,10 +119,10 @@
|
||||
|
||||
</main>
|
||||
|
||||
<script src="assets/js/wahl.js?v=202609101702" defer></script>
|
||||
<script src="assets/js/bereiche.js?v=202609101702" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609101702" defer></script>
|
||||
<script src="assets/js/glocke.js?v=202609101702" defer></script>
|
||||
<script src="assets/js/steckbrief.js?v=202609101702" defer></script>
|
||||
<script src="assets/js/wahl.js?v=202609101807" defer></script>
|
||||
<script src="assets/js/bereiche.js?v=202609101807" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609101807" defer></script>
|
||||
<script src="assets/js/glocke.js?v=202609101807" defer></script>
|
||||
<script src="assets/js/steckbrief.js?v=202609101807" 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=202609101702" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609101702" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609101702" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609101702" />
|
||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609101702" />
|
||||
<link rel="stylesheet" href="assets/css/team.css?v=202609101702" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?v=202609101702" />
|
||||
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609101807" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609101807" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609101807" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609101807" />
|
||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609101807" />
|
||||
<link rel="stylesheet" href="assets/css/team.css?v=202609101807" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?v=202609101807" />
|
||||
</head>
|
||||
|
||||
<body class="start">
|
||||
@@ -103,10 +103,10 @@
|
||||
|
||||
</main>
|
||||
|
||||
<script src="assets/js/wahl.js?v=202609101702" defer></script>
|
||||
<script src="assets/js/bereiche.js?v=202609101702" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609101702" defer></script>
|
||||
<script src="assets/js/glocke.js?v=202609101702" defer></script>
|
||||
<script src="assets/js/team.js?v=202609101702" defer></script>
|
||||
<script src="assets/js/wahl.js?v=202609101807" defer></script>
|
||||
<script src="assets/js/bereiche.js?v=202609101807" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609101807" defer></script>
|
||||
<script src="assets/js/glocke.js?v=202609101807" defer></script>
|
||||
<script src="assets/js/team.js?v=202609101807" defer></script>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
+16
-11
@@ -7,16 +7,21 @@
|
||||
<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=202609101702" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609101702" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609101702" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609101702" />
|
||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609101702" />
|
||||
<link rel="stylesheet" href="assets/css/team.css?v=202609101702" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?v=202609101702" />
|
||||
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609101807" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609101807" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609101807" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609101807" />
|
||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609101807" />
|
||||
<link rel="stylesheet" href="assets/css/team.css?v=202609101807" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?v=202609101807" />
|
||||
</head>
|
||||
|
||||
<body class="start">
|
||||
<!-- `data-buehne` steht hier fest und nicht im Skript: Die Kachel zu
|
||||
dieser Seite kommt vom Server, `zuSeite()` in bereiche.js findet
|
||||
sie deshalb nicht -- und ohne Fund griff der Rueckfall, also die
|
||||
Szene der anderen Marke. Eine Seite mit genau einer Buehne
|
||||
braucht dafuer kein Skript. -->
|
||||
<body class="start" data-buehne="eingang">
|
||||
|
||||
<div class="schleier" aria-hidden="true"></div>
|
||||
|
||||
@@ -66,8 +71,8 @@
|
||||
|
||||
</main>
|
||||
|
||||
<script src="assets/js/bereiche.js?v=202609101702" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609101702" defer></script>
|
||||
<script src="assets/js/teamlage.js?v=202609101702" defer></script>
|
||||
<script src="assets/js/bereiche.js?v=202609101807" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609101807" defer></script>
|
||||
<script src="assets/js/teamlage.js?v=202609101807" defer></script>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
+12
-12
@@ -12,15 +12,15 @@
|
||||
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=202609101702" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609101702" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609101702" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609101702" />
|
||||
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609101807" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609101807" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609101807" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609101807" />
|
||||
<!-- Formular- und Dialogstile: seit dem 07.09.2026 steht hier der
|
||||
Dialog "Creator anlegen". -->
|
||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609101702" />
|
||||
<link rel="stylesheet" href="assets/css/uebersicht.css?v=202609101702" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?v=202609101702" />
|
||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609101807" />
|
||||
<link rel="stylesheet" href="assets/css/uebersicht.css?v=202609101807" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?v=202609101807" />
|
||||
</head>
|
||||
|
||||
<body class="start">
|
||||
@@ -142,11 +142,11 @@
|
||||
|
||||
</main>
|
||||
|
||||
<script src="assets/js/bereiche.js?v=202609101702" defer></script>
|
||||
<script src="assets/js/bereiche.js?v=202609101807" defer></script>
|
||||
|
||||
<script src="assets/js/wahl.js?v=202609101702" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609101702" defer></script>
|
||||
<script src="assets/js/glocke.js?v=202609101702" defer></script>
|
||||
<script src="assets/js/uebersicht.js?v=202609101702" defer></script>
|
||||
<script src="assets/js/wahl.js?v=202609101807" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609101807" defer></script>
|
||||
<script src="assets/js/glocke.js?v=202609101807" defer></script>
|
||||
<script src="assets/js/uebersicht.js?v=202609101807" defer></script>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
+12
-12
@@ -12,13 +12,13 @@
|
||||
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=202609101702" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609101702" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609101702" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609101702" />
|
||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609101702" />
|
||||
<link rel="stylesheet" href="assets/css/wissen.css?v=202609101702" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?v=202609101702" />
|
||||
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609101807" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609101807" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609101807" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609101807" />
|
||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609101807" />
|
||||
<link rel="stylesheet" href="assets/css/wissen.css?v=202609101807" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?v=202609101807" />
|
||||
</head>
|
||||
|
||||
<body class="start">
|
||||
@@ -183,10 +183,10 @@
|
||||
|
||||
</main>
|
||||
|
||||
<script src="assets/js/wahl.js?v=202609101702" defer></script>
|
||||
<script src="assets/js/bereiche.js?v=202609101702" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609101702" defer></script>
|
||||
<script src="assets/js/glocke.js?v=202609101702" defer></script>
|
||||
<script src="assets/js/wissen.js?v=202609101702" defer></script>
|
||||
<script src="assets/js/wahl.js?v=202609101807" defer></script>
|
||||
<script src="assets/js/bereiche.js?v=202609101807" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609101807" defer></script>
|
||||
<script src="assets/js/glocke.js?v=202609101807" defer></script>
|
||||
<script src="assets/js/wissen.js?v=202609101807" defer></script>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
Reference in New Issue
Block a user