A4: Bewerben statt selbst nehmen
Filipe, 22.09.2026: „die modis und linke hand sollen da nichts
uebernehmen koennen von aufgaben, ueberhaupt ueberall sollen die keine
aufgaben selber uebernehmen die ihnen nicht zugetragen sind. ich will
dass die sich fuer aufgaben bewerben koennen aber die rechte hand oder
dogfather muessen annehmen oder ablehnen koennen und das mit einem
kommentar als moeglichkeit sogar noch zum hinzufuegen."
ZWEI FRAGEN, DIE MAN AUSEINANDERHALTEN MUSS -- und das war der Schluessel:
verteilen eine Aufgabe an ANDERE geben
entscheiden bestimmen, wer sie am Ende macht
Sein Satz vom selben Tag („rechte hand linke hand und dogfather ...
koennen alle verteilen") widerspricht dem nicht, er beantwortet die
erste Frage. Die linke Hand verteilt, entscheidet aber nicht -- sie
bewirbt sich wie ein Modi. `entscheidetUeberAufgaben` steht neben
`darfAufgabenVerteilen`, und drei Stellen fragen ab jetzt dieselbe
Funktion.
DAS VERBOT HATTE DREI TUEREN, und die zweite und dritte waren beim
Planen nicht zu sehen:
1. aus dem Pool „uebernehmen" -- die offensichtliche
2. beim Pool „annehmen" -- dasselbe unter anderem Namen: Wer
zusagt, nimmt sie den anderen weg.
Bei „einzeln"/„mehrere" bleibt es
erlaubt -- dort wurde sie ihm
ZUGETRAGEN, und genau das Wort
steht in seinem Satz.
3. beim Verteilen sich selbst eintragen -- die linke Hand darf
verteilen, haette sich also selbst
nehmen koennen. Abgelehnt statt
still gefiltert: Wer sich eintraegt
und sich danach nicht findet, sucht
den Fehler bei sich.
EIN FUND, OHNE DEN A4 GAR NICHT FUNKTIONIERT HAETTE
Die rechte Hand soll entscheiden -- und sah die Aufgabe nicht, um die
es ging. Gemessen an einer Pool-Aufgabe, die DogFather fuer zwei Modis
angelegt hat:
DogFather sieht sie 1 Bewerbung
Modi sieht sie 1 Bewerbung
rechte Hand SIEHT SIE NICHT (Liste leer)
Ihre Sichtregel sammelte Menschen mit einer TEAM_DOGI_ROLLE und fragte,
ob einer als Creator, Verantwortlicher oder Ersteller eingetragen ist.
Bei einer Pool-Aufgabe bleibt `verantwortlich_id` leer (das ist ihr
Sinn), und der Ersteller war DogFather -- der in dieser Liste nicht
steht. Alle drei Bedingungen liefen ins Leere.
Auf der Adresse von Team Dogi sehen die Haende jetzt alles. Das ist
zugleich sein Satz „sehen alle aufgaben". Die Haustrennung bleibt:
`sichtbar()` haengt fuer crew weiterhin `AND ohneAgentur(...)` davor.
WIE DIE BEWERBUNG GEBAUT IST
Kein zweiter Tisch, sondern ein weiterer Zustand derselben Zeile
(`beworben`). Die Frage „wie steht diese Aufgabe bei DIESEM Menschen"
wird dort schon beantwortet; eine zweite Tabelle haette zwei Wahrheiten
ueber dieselbe Beziehung.
Die Worte der Person (`grund`) und der Kommentar der Leitung
(`entscheid_text`) stehen in ZWEI Feldern. In dasselbe waere bequemer
und wuerde die Frage mit der Antwort ueberschreiben -- danach wuesste
niemand mehr, worum jemand gebeten hat. Dasselbe gilt, wenn eine
Bewerbung wegfaellt, weil jemand anders die Aufgabe bekommt: Der
Hinweis kommt in das Feld der Leitung, ihre Worte bleiben stehen.
Der Kommentar ist FREIWILLIG. Die Begruendung beim Ablehnen einer
zugeteilten Aufgabe bleibt Pflicht -- dort sagt jemand ab, der gefragt
wurde. Hier bittet jemand; ein „bitte" braucht keine Begruendung.
Filipes Wort ist „als moeglichkeit".
Die CHECK-Regel wurde ueber `checkListeErweitern` erweitert -- den Weg,
der seit dem 09.09. an einer Stelle steht, mit Sicherung vorher,
Spaltenliste aus PRAGMA und Indizes, die mitgehen.
UND EIN SATZ, DER NICHT MEHR STIMMTE
„Frei fuer 3 Leute — wer zuerst Zeit hat" war die Beschreibung des
Pools, solange sich jeder selbst bedienen durfte. Er sagt jetzt jedem,
was FUER IHN gilt.
GEPRUEFT
Neu: server/pruef-bewerbung-aufgaben.mjs, 66/0 -- die Regel selbst,
alle drei Tueren, der erlaubte Weg, die zwei Felder, das Zurueckziehen,
und ein Abschnitt am echten Bildschirm (ein Modi sieht „Ich bewerbe
mich" statt „Ich uebernehme das"; die rechte Hand sieht die Bewerbung
mit Annehmen und Ablehnen; die Bewerberin sieht KEINEN Block zum
Entscheiden -- sonst waere das Verbot einen Knopf weiter offen).
pruef-zuteilung auf die neue Regel umgestellt (sie hielt „Bea
uebernimmt sie" fest und wurde zu Recht rot) -- misst jetzt denselben
Effekt ueber den neuen Weg. Dazu gruen: pruef-aufgabenbrett,
pruef-meldungen, pruef-sicht, pruef-css-klassen.
ALTLAST, nicht von hier: pruef-rollen meldet einen Fehler an der
Kachel „Zu Team Dogi" (absolute Adresse). Mit `git stash` nachgemessen
-- vorher und nachher identisch.
Co-Authored-By: Claude Opus 5 <[email protected]>
This commit is contained in:
@@ -0,0 +1,566 @@
|
||||
/* =====================================================================
|
||||
pruef-bewerbung-aufgaben.mjs — sich bewerben statt selbst nehmen
|
||||
=====================================================================
|
||||
|
||||
Filipe, 22.09.2026: „die modis und linke hand sollen da nichts
|
||||
uebernehmen koennen von aufgaben, ueberhaupt ueberall sollen die
|
||||
keine aufgaben selber uebernehmen die ihnen nicht zugetragen sind.
|
||||
ich will dass die sich fuer aufgaben bewerben koennen aber die rechte
|
||||
hand oder dogfather muessen annehmen oder ablehnen koennen und das
|
||||
mit einem kommentar als moeglichkeit sogar noch zum hinzufuegen."
|
||||
|
||||
Dazu sein Satz vom selben Tag, der NICHT widerspricht, sondern eine
|
||||
andere Frage beantwortet: „rechte hand linke hand und dogfather sehen
|
||||
alle aufgaben und koennen alle verteilen."
|
||||
|
||||
ZWEI FRAGEN, DIE MAN AUSEINANDERHALTEN MUSS:
|
||||
|
||||
verteilen eine Aufgabe an ANDERE geben
|
||||
entscheiden bestimmen, wer sie am Ende macht
|
||||
|
||||
Die linke Hand darf das erste und nicht das zweite. Sie bewirbt sich
|
||||
wie ein Modi.
|
||||
|
||||
WAS HIER GEMESSEN WIRD — und warum gerade das:
|
||||
|
||||
(1) DASS DAS VERBOT KEINEN UMWEG HAT. Drei Wege fuehren zu „ich habe
|
||||
jetzt diese Aufgabe": aus dem Pool uebernehmen, sich beim
|
||||
Verteilen selbst eintragen, und (neu) eine Bewerbung annehmen.
|
||||
Alle drei werden geprueft. Ein Verbot mit einem offenen Umweg
|
||||
ist keins.
|
||||
|
||||
(2) DASS DER ERLAUBTE WEG WIRKLICH OFFEN IST. Ein Test, der nur
|
||||
Verbote misst, ist auch dann gruen, wenn gar nichts mehr geht.
|
||||
|
||||
(3) DASS DIE WORTE DER PERSON UND DER KOMMENTAR DER LEITUNG IN ZWEI
|
||||
FELDERN LANDEN. In dasselbe Feld waere bequemer und wuerde die
|
||||
Frage mit der Antwort ueberschreiben.
|
||||
|
||||
AUFRUF: node server/pruef-bewerbung-aufgaben.mjs
|
||||
===================================================================== */
|
||||
|
||||
import { mkdtempSync, rmSync } from "node:fs";
|
||||
import { tmpdir } from "node:os";
|
||||
import { join } from "node:path";
|
||||
import { request as httpAnfrage } from "node:http";
|
||||
import { eigenerPort } from "./helfer-port.mjs";
|
||||
import { notbremse } from "./helfer-notbremse.mjs";
|
||||
|
||||
const PORT = await eigenerPort(import.meta, "pruef-bewerbung-aufgaben");
|
||||
const ordner = mkdtempSync(join(tmpdir(), "ws-bew-"));
|
||||
process.env.WORKSPACE_DB = join(ordner, "workspace.db");
|
||||
process.env.PORT = String(PORT);
|
||||
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 }); };
|
||||
await import("./index.js");
|
||||
notbremse(240_000, "pruef-bewerbung-aufgaben");
|
||||
await new Promise((r) => setTimeout(r, 900));
|
||||
|
||||
process.on("uncaughtException", (f) => { console.error("ABSTURZ:", f); process.exit(7); });
|
||||
process.on("unhandledRejection", (f) => { console.error("ABSTURZ (Versprechen):", f); process.exit(7); });
|
||||
|
||||
let fehler = 0, geprueft = 0;
|
||||
const melde = (t) => console.log(t);
|
||||
const ok = (b, t) => { geprueft++; console.log((b ? " ok " : " FEHL ") + t); if (!b) fehler++; };
|
||||
|
||||
const CREW = "crew.dogfather-universe.com";
|
||||
|
||||
/* =====================================================================
|
||||
1. WER ENTSCHEIDET — die Regel selbst
|
||||
===================================================================== */
|
||||
melde("\n=== 1. Wer entscheidet, wer eine Aufgabe macht ===");
|
||||
const w = await import("./workspace.js");
|
||||
{
|
||||
const soll = { admin: true, hand: true, linke: false, modi: false, gast: false };
|
||||
for (const [rolle, erwartet] of Object.entries(soll)) {
|
||||
const ist = w.entscheidetUeberAufgaben({ rolle, haus: "crew", id: 1 });
|
||||
ok(ist === erwartet,
|
||||
`${rolle}: entscheidet = ${ist} (erwartet ${erwartet})`);
|
||||
}
|
||||
/* DIE ZWEITE FRAGE BLEIBT, WIE SIE WAR. Sein Satz „rechte hand linke
|
||||
hand und dogfather koennen alle verteilen" darf durch diese
|
||||
Aenderung nicht mit weggehen. */
|
||||
for (const [rolle, erwartet] of Object.entries(
|
||||
{ admin: true, hand: true, linke: true, modi: false, gast: false })) {
|
||||
const ist = w.darfAufgabenVerteilen({ rolle, haus: "crew", id: 1 });
|
||||
ok(ist === erwartet,
|
||||
`${rolle}: darf verteilen = ${ist} (erwartet ${erwartet}) — unveraendert`);
|
||||
}
|
||||
/* GEGENPROBE: Die zwei Fragen sind wirklich verschieden. Waeren sie
|
||||
dasselbe, haette die ganze Unterscheidung keinen Sinn. */
|
||||
const p = { rolle: "linke", haus: "crew", id: 1 };
|
||||
ok(w.darfAufgabenVerteilen(p) && !w.entscheidetUeberAufgaben(p),
|
||||
"die linke Hand verteilt, entscheidet aber nicht — genau der Unterschied");
|
||||
}
|
||||
|
||||
/* =====================================================================
|
||||
2. AM LAUFENDEN SERVER
|
||||
===================================================================== */
|
||||
const { DatabaseSync } = await import("node:sqlite");
|
||||
const { scryptSync, randomBytes, createHmac } = await import("node:crypto");
|
||||
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;
|
||||
}
|
||||
const idChef = anlegen("Filipe", "admin", "CODE-DOGI-0001");
|
||||
const idHand = anlegen("Rieke", "hand", "CODE-HAND-0001");
|
||||
const idLinke = anlegen("Lino", "linke", "CODE-LINK-0001");
|
||||
const idModi = anlegen("Frida", "modi", "CODE-MODI-0001");
|
||||
const idModi2 = anlegen("Nele", "modi", "CODE-MODI-0002");
|
||||
d.close();
|
||||
|
||||
function roh(pfad, wie = {}) {
|
||||
return new Promise((fertig, schief) => {
|
||||
const daten = wie.body === undefined ? null : Buffer.from(JSON.stringify(wie.body));
|
||||
const a = httpAnfrage({
|
||||
host: "127.0.0.1", port: PORT, path: pfad,
|
||||
method: wie.methode || (daten ? "POST" : "GET"),
|
||||
headers: {
|
||||
Host: CREW,
|
||||
...(daten ? { "Content-Type": "application/json", "Content-Length": daten.length } : {}),
|
||||
...(wie.keks ? { Cookie: wie.keks } : {}),
|
||||
Origin: `https://${CREW}`, Referer: `https://${CREW}/workspace/`,
|
||||
},
|
||||
}, (antwort) => {
|
||||
const st = [];
|
||||
antwort.on("data", (x) => st.push(x));
|
||||
antwort.on("end", () => {
|
||||
const text = Buffer.concat(st).toString("utf8");
|
||||
fertig({ code: antwort.statusCode, text,
|
||||
json: (() => { try { return JSON.parse(text); } catch { return null; } })() });
|
||||
});
|
||||
});
|
||||
a.on("error", schief);
|
||||
if (daten) a.write(daten);
|
||||
a.end();
|
||||
});
|
||||
}
|
||||
async function anmelden(rolle, code) {
|
||||
const r = await roh("/workspace/api/anmelden", { body: { rolle, code } });
|
||||
return { keks: [].concat(r.kopfSet || []).join("; "), code: r.code, roh: r };
|
||||
}
|
||||
/* Die Kekse kommen aus dem Antwortkopf -- dafuer braucht es ihn. */
|
||||
function anmeldenMitKeks(rolle, code) {
|
||||
return new Promise((fertig, schief) => {
|
||||
const daten = Buffer.from(JSON.stringify({ rolle, code }));
|
||||
const a = httpAnfrage({
|
||||
host: "127.0.0.1", port: PORT, path: "/workspace/api/anmelden", method: "POST",
|
||||
headers: { Host: CREW, "Content-Type": "application/json", "Content-Length": daten.length,
|
||||
Origin: `https://${CREW}`, Referer: `https://${CREW}/workspace/` },
|
||||
}, (antwort) => {
|
||||
const st = [];
|
||||
antwort.on("data", (x) => st.push(x));
|
||||
antwort.on("end", () => {
|
||||
const kekse = [].concat(antwort.headers["set-cookie"] || []);
|
||||
fertig({ code: antwort.statusCode, keks: kekse.map((c) => c.split(";")[0]).join("; ") });
|
||||
});
|
||||
});
|
||||
a.on("error", schief);
|
||||
a.write(daten); a.end();
|
||||
});
|
||||
}
|
||||
|
||||
const chef = await anmeldenMitKeks("admin", "CODE-DOGI-0001");
|
||||
const hand = await anmeldenMitKeks("hand", "CODE-HAND-0001");
|
||||
const linke = await anmeldenMitKeks("linke", "CODE-LINK-0001");
|
||||
const modi = await anmeldenMitKeks("modi", "CODE-MODI-0001");
|
||||
const modi2 = await anmeldenMitKeks("modi", "CODE-MODI-0002");
|
||||
|
||||
melde("");
|
||||
melde("=== 2. Alle fuenf kommen herein ===");
|
||||
for (const [wer, s] of [["DogFather", chef], ["rechte Hand", hand],
|
||||
["linke Hand", linke], ["Frida (Modi)", modi], ["Nele (Modi)", modi2]]) {
|
||||
ok(s.code === 200 && s.keks.length > 0, `${wer} ist angemeldet (${s.code})`);
|
||||
}
|
||||
|
||||
const aufgabeAnlegen = (keks, titel, zuteilung, verteilart) =>
|
||||
roh("/workspace/api/aufgaben", {
|
||||
keks, body: { titel, ...(zuteilung ? { zuteilung, verteilart } : {}) },
|
||||
});
|
||||
const liste = (keks) => roh("/workspace/api/aufgaben", { keks });
|
||||
const finde = async (keks, titel) => {
|
||||
const r = await liste(keks);
|
||||
const alle = Array.isArray(r.json) ? r.json : (r.json?.aufgaben || []);
|
||||
return alle.find((a) => a.titel === titel) || null;
|
||||
};
|
||||
|
||||
/* =====================================================================
|
||||
3. DER VERBOTENE WEG: selbst nehmen
|
||||
===================================================================== */
|
||||
melde("");
|
||||
melde("=== 3. Aus dem Pool nimmt sich niemand mehr selbst etwas ===");
|
||||
let poolId = null;
|
||||
{
|
||||
const r = await aufgabeAnlegen(chef.keks, "Pool fuer alle",
|
||||
[idModi, idModi2, idLinke], "pool");
|
||||
poolId = r.json?.id;
|
||||
ok(r.code === 201 && Number.isInteger(poolId),
|
||||
`DogFather legt eine Pool-Aufgabe fuer drei an (${r.code})`);
|
||||
|
||||
for (const [wer, s] of [["Frida (Modi)", modi], ["die linke Hand", linke]]) {
|
||||
const u = await roh(`/workspace/api/aufgaben/${poolId}/uebernehmen`, { methode: "POST", keks: s.keks });
|
||||
ok(u.code === 403 && u.json?.fehler === "erst_bewerben",
|
||||
`${wer} kann sie nicht uebernehmen (${u.code}/${u.json?.fehler})`);
|
||||
/* UND AUCH NICHT DURCH DIE ZWEITE TUER. Beim Pool heisst
|
||||
„annehmen" dasselbe wie „uebernehmen": Wer zusagt, nimmt sie
|
||||
den anderen weg. Diese Zeile fehlte im ersten Entwurf, und
|
||||
genau daran haette das Verbot vorbeigegriffen. */
|
||||
const an = await roh(`/workspace/api/aufgaben/${poolId}/annehmen`, { methode: "POST", keks: s.keks });
|
||||
ok(an.code === 403 && an.json?.fehler === "erst_bewerben",
|
||||
`${wer} kann sie auch nicht einfach annehmen (${an.code}/${an.json?.fehler})`);
|
||||
}
|
||||
}
|
||||
|
||||
melde("");
|
||||
melde("=== 3b. Und niemand traegt sich beim Verteilen selbst ein ===");
|
||||
{
|
||||
const r = await aufgabeAnlegen(linke.keks, "Die linke Hand fuer sich selbst", [idLinke], "einzeln");
|
||||
const zu = r.json?.zuteilung;
|
||||
ok(r.code === 201 && zu?.fehler === "nicht_an_dich_selbst",
|
||||
`die linke Hand kann sich nicht selbst eintragen (${zu?.fehler})`);
|
||||
|
||||
/* GEGENPROBE: An JEMAND ANDEREN darf sie weiterhin verteilen. Sein
|
||||
Satz „rechte hand linke hand und dogfather koennen alle verteilen"
|
||||
bleibt damit gueltig. */
|
||||
const r2 = await aufgabeAnlegen(linke.keks, "Die linke Hand verteilt an Frida", [idModi], "einzeln");
|
||||
ok(r2.code === 201 && Array.isArray(r2.json?.zuteilung?.gesetzt)
|
||||
&& r2.json.zuteilung.gesetzt.includes(idModi),
|
||||
`aber an jemand anderen schon (${JSON.stringify(r2.json?.zuteilung?.gesetzt)})`);
|
||||
|
||||
/* Und DogFather darf sich selbst eintragen -- er entscheidet ja. */
|
||||
const r3 = await aufgabeAnlegen(chef.keks, "DogFather fuer sich selbst", [idChef], "einzeln");
|
||||
ok(r3.code === 201 && r3.json?.zuteilung?.gesetzt?.includes(idChef),
|
||||
"DogFather darf sich selbst eintragen — er entscheidet");
|
||||
}
|
||||
|
||||
/* =====================================================================
|
||||
4. DER ERLAUBTE WEG: sich bewerben
|
||||
===================================================================== */
|
||||
melde("");
|
||||
melde("=== 4. Bewerben ===");
|
||||
{
|
||||
const b = await roh(`/workspace/api/aufgaben/${poolId}/bewerben`, {
|
||||
methode: "POST", keks: modi.keks, body: { text: "Ich habe Freitag Zeit." },
|
||||
});
|
||||
ok(b.code === 200 && b.json?.zustand === "beworben",
|
||||
`Frida bewirbt sich (${b.code}/${b.json?.zustand})`);
|
||||
|
||||
const nochmal = await roh(`/workspace/api/aufgaben/${poolId}/bewerben`, {
|
||||
methode: "POST", keks: modi.keks, body: {} });
|
||||
ok(nochmal.code === 409 && nochmal.json?.fehler === "schon_beworben",
|
||||
`ein zweites Mal geht nicht (${nochmal.code}/${nochmal.json?.fehler})`);
|
||||
|
||||
const bLinke = await roh(`/workspace/api/aufgaben/${poolId}/bewerben`, {
|
||||
methode: "POST", keks: linke.keks, body: { text: "Kann ich uebernehmen." } });
|
||||
ok(bLinke.code === 200, `die linke Hand bewirbt sich auch (${bLinke.code})`);
|
||||
|
||||
/* WER ENTSCHEIDET, BEWIRBT SICH NICHT -- er teilt sich zu. Eine
|
||||
Bewerbung an sich selbst waere ein Umweg mit demselben Ergebnis. */
|
||||
const bChef = await roh(`/workspace/api/aufgaben/${poolId}/bewerben`, {
|
||||
methode: "POST", keks: chef.keks, body: {} });
|
||||
ok(bChef.code === 409 && bChef.json?.fehler === "du_entscheidest_selbst",
|
||||
`DogFather bewirbt sich nicht (${bChef.code}/${bChef.json?.fehler})`);
|
||||
|
||||
const a = await finde(chef.keks, "Pool fuer alle");
|
||||
ok((a?.bewerbungen || []).length === 2,
|
||||
`die Aufgabe zeigt ${a?.bewerbungen?.length} Bewerbungen`);
|
||||
ok((a?.bewerbungen || []).some((z) => z.grund === "Ich habe Freitag Zeit."),
|
||||
"und Fridas Worte stehen dabei");
|
||||
}
|
||||
|
||||
/* =====================================================================
|
||||
5. ENTSCHEIDEN — nur die rechte Hand und DogFather
|
||||
===================================================================== */
|
||||
melde("");
|
||||
melde("=== 5. Entscheiden ===");
|
||||
{
|
||||
/* Die linke Hand darf nicht -- sie hat sich ja selbst beworben. */
|
||||
const versuch = await roh(`/workspace/api/aufgaben/${poolId}/bewerbung/annehmen`, {
|
||||
methode: "POST", keks: linke.keks, body: { person_id: idModi } });
|
||||
ok(versuch.code === 403,
|
||||
`die linke Hand entscheidet nicht (${versuch.code}/${versuch.json?.fehler})`);
|
||||
|
||||
const modiVersuch = await roh(`/workspace/api/aufgaben/${poolId}/bewerbung/annehmen`, {
|
||||
methode: "POST", keks: modi.keks, body: { person_id: idModi } });
|
||||
ok(modiVersuch.code === 403,
|
||||
`ein Modi auch nicht (${modiVersuch.code})`);
|
||||
|
||||
/* Die rechte Hand nimmt Frida an, mit Kommentar. */
|
||||
const ja = await roh(`/workspace/api/aufgaben/${poolId}/bewerbung/annehmen`, {
|
||||
methode: "POST", keks: hand.keks,
|
||||
body: { person_id: idModi, kommentar: "Danke dir, mach das gern." } });
|
||||
ok(ja.code === 200 && ja.json?.zustand === "angenommen",
|
||||
`die rechte Hand nimmt Frida an (${ja.code}/${ja.json?.zustand})`);
|
||||
|
||||
const a = await finde(chef.keks, "Pool fuer alle");
|
||||
const fridas = (a?.zuteilung || []).find((z) => z.person_id === idModi);
|
||||
ok(fridas?.zustand === "angenommen", `Fridas Stand ist "${fridas?.zustand}"`);
|
||||
/* ZWEI FELDER, NICHT EINS. Der Kommentar der Leitung darf die Worte
|
||||
der Person nicht ueberschreiben -- sonst weiss hinterher niemand
|
||||
mehr, worum jemand gebeten hat. */
|
||||
ok(fridas?.grund === "Ich habe Freitag Zeit.",
|
||||
`ihre eigenen Worte stehen noch da ("${fridas?.grund}")`);
|
||||
ok(fridas?.entscheid_text === "Danke dir, mach das gern.",
|
||||
`und der Kommentar daneben ("${fridas?.entscheid_text}")`);
|
||||
ok(fridas?.entschieden_von_name === "Rieke",
|
||||
`mit Namen, wer entschieden hat (${fridas?.entschieden_von_name})`);
|
||||
|
||||
/* Die Bewerbung der linken Hand ist damit erledigt -- Pool. */
|
||||
const linkes = (a?.zuteilung || []).find((z) => z.person_id === idLinke);
|
||||
ok(linkes?.zustand === "abgelehnt",
|
||||
`die andere Bewerbung faellt weg, weil Pool (${linkes?.zustand})`);
|
||||
/* UND IHRE WORTE BLEIBEN STEHEN. Der Hinweis „von jemand anderem
|
||||
uebernommen" gehoert in das Feld der Leitung, nicht in ihres --
|
||||
sonst loescht die Antwort die Frage. */
|
||||
ok(linkes?.grund === "Kann ich uebernehmen.",
|
||||
`ihre eigenen Worte bleiben ("${linkes?.grund}")`);
|
||||
ok(/jemand anderem/i.test(linkes?.entscheid_text || ""),
|
||||
`und der Grund steht daneben ("${linkes?.entscheid_text}")`);
|
||||
}
|
||||
|
||||
melde("");
|
||||
melde("=== 5b. Ablehnen, auch mit Kommentar ===");
|
||||
{
|
||||
const r = await aufgabeAnlegen(chef.keks, "Etwas fuer Nele", [idModi2], "einzeln");
|
||||
const id = r.json?.id;
|
||||
/* Nele ist zugeteilt -- sie bewirbt sich nicht, sie hat sie schon. */
|
||||
const b = await roh(`/workspace/api/aufgaben/${id}/bewerben`, {
|
||||
methode: "POST", keks: modi2.keks, body: {} });
|
||||
ok(b.code === 409 && b.json?.fehler === "schon_zugeteilt",
|
||||
`wer sie schon hat, bewirbt sich nicht (${b.code}/${b.json?.fehler})`);
|
||||
|
||||
/* Frida ist nicht zugeteilt und kann sich bewerben. */
|
||||
const b2 = await roh(`/workspace/api/aufgaben/${id}/bewerben`, {
|
||||
methode: "POST", keks: modi.keks, body: { text: "Ich kenne mich da aus." } });
|
||||
ok(b2.code === 200, `Frida bewirbt sich darauf (${b2.code})`);
|
||||
|
||||
const nein = await roh(`/workspace/api/aufgaben/${id}/bewerbung/ablehnen`, {
|
||||
methode: "POST", keks: chef.keks,
|
||||
body: { person_id: idModi, kommentar: "Nele macht das schon." } });
|
||||
ok(nein.code === 200 && nein.json?.zustand === "abgelehnt",
|
||||
`DogFather lehnt ab (${nein.code}/${nein.json?.zustand})`);
|
||||
|
||||
const a = await finde(chef.keks, "Etwas fuer Nele");
|
||||
const fridas = (a?.zuteilung || []).find((z) => z.person_id === idModi);
|
||||
ok(fridas?.entscheid_text === "Nele macht das schon.",
|
||||
`mit Kommentar ("${fridas?.entscheid_text}")`);
|
||||
|
||||
/* OHNE KOMMENTAR GEHT AUCH -- „als moeglichkeit", nicht als Pflicht. */
|
||||
const b3 = await roh(`/workspace/api/aufgaben/${id}/bewerben`, {
|
||||
methode: "POST", keks: modi.keks, body: {} });
|
||||
ok(b3.code === 200, "Frida bewirbt sich erneut, diesmal ohne Text");
|
||||
const nein2 = await roh(`/workspace/api/aufgaben/${id}/bewerbung/ablehnen`, {
|
||||
methode: "POST", keks: chef.keks, body: { person_id: idModi } });
|
||||
ok(nein2.code === 200, "und wird ohne Kommentar abgelehnt — der ist freiwillig");
|
||||
}
|
||||
|
||||
melde("");
|
||||
melde("=== 5c. Eine Bewerbung laesst sich zurueckziehen ===");
|
||||
{
|
||||
const r = await aufgabeAnlegen(chef.keks, "Noch etwas", null, null);
|
||||
const id = r.json?.id;
|
||||
const b = await roh(`/workspace/api/aufgaben/${id}/bewerben`, {
|
||||
methode: "POST", keks: modi.keks, body: { text: "Mache ich." } });
|
||||
ok(b.code === 200, `Frida bewirbt sich (${b.code})`);
|
||||
|
||||
const zurueck = await roh(`/workspace/api/aufgaben/${id}/bewerbung-zurueck`, {
|
||||
methode: "POST", keks: modi.keks });
|
||||
ok(zurueck.code === 200, `und zieht sie zurueck (${zurueck.code})`);
|
||||
|
||||
const a = await finde(chef.keks, "Noch etwas");
|
||||
ok((a?.bewerbungen || []).length === 0,
|
||||
`danach steht keine mehr da (${a?.bewerbungen?.length})`);
|
||||
/* GANZ WEG, nicht „zurueckgezogen": keine Zeile, die nur noch sagt,
|
||||
dass hier mal eine war. */
|
||||
ok((a?.zuteilung || []).every((z) => z.person_id !== idModi),
|
||||
"und auch keine Zeile mehr, die davon uebrig ist");
|
||||
|
||||
const nochmal = await roh(`/workspace/api/aufgaben/${id}/bewerbung-zurueck`, {
|
||||
methode: "POST", keks: modi.keks });
|
||||
ok(nochmal.code === 409, `ein zweites Zurueckziehen geht nicht (${nochmal.code})`);
|
||||
}
|
||||
|
||||
/* =====================================================================
|
||||
6. AM ECHTEN BILDSCHIRM
|
||||
=====================================================================
|
||||
Die Abschnitte davor messen die Wege. Keiner von ihnen haette
|
||||
gemerkt, wenn der Knopf „Ich bewerbe mich" gar nicht erscheint oder
|
||||
wenn ein Modi weiterhin „Ich uebernehme das" sieht.
|
||||
|
||||
Genau diese Luecke ist heute frueh beim Aufgaben-Formular
|
||||
aufgefallen: Die Pruefung war gruen und hat den Zustand, in dem der
|
||||
Fehler steckt, nie hergestellt.
|
||||
|
||||
WARUM EIN HTTPS-VORBAU: Team Dogi wohnt auf
|
||||
crew.dogfather-universe.com, und welche Wand gilt, entscheidet der
|
||||
Host-Kopf. Chromium setzt den selbst und hebt diese Domain
|
||||
ausserdem von sich aus auf https.
|
||||
===================================================================== */
|
||||
melde("");
|
||||
melde("=== 6. Am echten Bildschirm ===");
|
||||
{
|
||||
const { execFileSync } = await import("node:child_process");
|
||||
const { createServer: httpsServer } = await import("node:https");
|
||||
const { readFileSync } = await import("node:fs");
|
||||
|
||||
const schluessel = join(ordner, "pruef.key");
|
||||
const zertifikat = join(ordner, "pruef.crt");
|
||||
execFileSync("openssl", ["req", "-x509", "-newkey", "rsa:2048", "-nodes",
|
||||
"-keyout", schluessel, "-out", zertifikat, "-days", "2",
|
||||
"-subj", `/CN=${CREW}`, "-addext", `subjectAltName=DNS:${CREW}`],
|
||||
{ stdio: "ignore" });
|
||||
|
||||
const HTTPS_PORT = PORT + 1;
|
||||
const vorbau = httpsServer({
|
||||
key: readFileSync(schluessel), cert: readFileSync(zertifikat),
|
||||
}, (von, nach) => {
|
||||
const weiter = httpAnfrage({
|
||||
host: "127.0.0.1", port: PORT, path: von.url, method: von.method,
|
||||
headers: { ...von.headers, host: `${CREW}:${HTTPS_PORT}` },
|
||||
}, (antwort) => {
|
||||
nach.writeHead(antwort.statusCode || 502, antwort.headers);
|
||||
antwort.pipe(nach);
|
||||
});
|
||||
weiter.on("error", () => { try { nach.writeHead(502); nach.end(); } catch { /* egal */ } });
|
||||
von.pipe(weiter);
|
||||
});
|
||||
await new Promise((r) => vorbau.listen(HTTPS_PORT, "127.0.0.1", r));
|
||||
const SEITE = `https://${CREW}:${HTTPS_PORT}`;
|
||||
|
||||
const pw = await import("file:///C:/Users/qciga/Documents/Obelix/Analyse/node_modules/playwright/index.mjs");
|
||||
const browser = await pw.chromium.launch({
|
||||
args: [`--host-resolver-rules=MAP ${CREW} 127.0.0.1`, "--ignore-certificate-errors"],
|
||||
});
|
||||
|
||||
/* Eine frische Aufgabe fuer den Bildschirm -- die aus den
|
||||
Abschnitten davor sind schon entschieden. */
|
||||
const frisch = await aufgabeAnlegen(chef.keks, "Fuer den Bildschirm",
|
||||
[idModi, idLinke], "pool");
|
||||
const frischId = frisch.json?.id;
|
||||
ok(Number.isInteger(frischId), `eine frische Pool-Aufgabe liegt (${frisch.code})`);
|
||||
|
||||
const meckern = [];
|
||||
async function seiteAls(rolle, code, breite = 1280) {
|
||||
const ctx = await browser.newContext({ viewport: { width: breite, height: 1000 } });
|
||||
const s2 = await ctx.newPage();
|
||||
s2.on("pageerror", (e) => meckern.push(`${rolle}: ${String(e).slice(0, 110)}`));
|
||||
s2.on("console", (m) => {
|
||||
if (m.type() === "error" && !/favicon|ERR_CERT|net::ERR/i.test(m.text())) {
|
||||
meckern.push(`${rolle}: ${m.text().slice(0, 110)}`);
|
||||
}
|
||||
});
|
||||
await s2.goto(`${SEITE}/workspace/`, { waitUntil: "networkidle" });
|
||||
await s2.click(`.rolle[data-rolle="${rolle}"]`);
|
||||
await s2.fill("#code", code);
|
||||
await s2.click("button[type=submit]");
|
||||
await s2.waitForTimeout(900);
|
||||
await s2.goto(`${SEITE}/workspace/aufgaben.html`, { waitUntil: "networkidle" });
|
||||
await s2.waitForTimeout(1600);
|
||||
return { ctx, s: s2 };
|
||||
}
|
||||
const knoepfeAn = (s2, titel) => s2.evaluate((t) => {
|
||||
const karten = [...document.querySelectorAll(".karte, .aufgabe, li, article")];
|
||||
const k = karten.find((x) => (x.textContent || "").includes(t)
|
||||
&& x.querySelector(".z-karte"));
|
||||
if (!k) return null;
|
||||
return {
|
||||
knoepfe: [...k.querySelectorAll(".z-karte button")].map((b) => b.textContent.trim()),
|
||||
bewerbungen: k.querySelectorAll(".z-bewerbung").length,
|
||||
text: (k.querySelector(".z-karte")?.textContent || "").replace(/\s+/g, " ").trim().slice(0, 200),
|
||||
};
|
||||
}, titel);
|
||||
|
||||
try {
|
||||
/* ---- Ein Modi ------------------------------------------------- */
|
||||
const m = await seiteAls("modi", "CODE-MODI-0001", 390);
|
||||
try {
|
||||
const b = await knoepfeAn(m.s, "Fuer den Bildschirm");
|
||||
ok(!!b, "der Modi sieht die Aufgabe mit ihrem Zuteilungsblock");
|
||||
ok(!!b && b.knoepfe.some((t) => /bewerbe mich/i.test(t)),
|
||||
`und den Knopf „Ich bewerbe mich" (${b?.knoepfe.join(" | ")})`);
|
||||
ok(!!b && !b.knoepfe.some((t) => /übernehme/i.test(t)),
|
||||
"und NICHT mehr „Ich übernehme das“");
|
||||
ok(!!b && !b.knoepfe.some((t) => /^Ablehnen$/i.test(t)),
|
||||
"und kein „Ablehnen“ — eine Absage auf eine Frage, die niemand gestellt hat");
|
||||
} finally { await m.ctx.close(); }
|
||||
|
||||
/* ---- Die linke Hand: darf verteilen, aber nicht entscheiden --- */
|
||||
const l = await seiteAls("linke", "CODE-LINK-0001", 1280);
|
||||
try {
|
||||
const b = await knoepfeAn(l.s, "Fuer den Bildschirm");
|
||||
ok(!!b && b.knoepfe.some((t) => /bewerbe mich/i.test(t)),
|
||||
`die linke Hand sieht denselben Knopf (${b?.knoepfe.join(" | ")})`);
|
||||
ok(!!b && !b.knoepfe.some((t) => /übernehme/i.test(t)),
|
||||
"und auch sie nicht „Ich übernehme das“");
|
||||
} finally { await l.ctx.close(); }
|
||||
|
||||
/* ---- Jetzt bewirbt sich der Modi wirklich --------------------- */
|
||||
const bew = await roh(`/workspace/api/aufgaben/${frischId}/bewerben`, {
|
||||
methode: "POST", keks: modi.keks, body: { text: "Kann ich machen." } });
|
||||
ok(bew.code === 200, `Frida bewirbt sich (${bew.code})`);
|
||||
|
||||
/* ---- Die rechte Hand sieht die Bewerbung ---------------------- */
|
||||
const h = await seiteAls("hand", "CODE-HAND-0001", 1280);
|
||||
try {
|
||||
const b = await knoepfeAn(h.s, "Fuer den Bildschirm");
|
||||
ok(!!b && b.bewerbungen === 1,
|
||||
`die rechte Hand sieht 1 Bewerbung (${b?.bewerbungen})`);
|
||||
ok(!!b && b.knoepfe.some((t) => /^Annehmen$/i.test(t))
|
||||
&& b.knoepfe.some((t) => /^Ablehnen$/i.test(t)),
|
||||
`mit Annehmen und Ablehnen (${b?.knoepfe.join(" | ")})`);
|
||||
ok(!!b && /Kann ich machen/.test(b.text),
|
||||
"und Fridas Worte stehen dabei");
|
||||
} finally { await h.ctx.close(); }
|
||||
|
||||
/* ---- Der Modi sieht seinen eigenen Stand ---------------------- */
|
||||
const m2 = await seiteAls("modi", "CODE-MODI-0001", 390);
|
||||
try {
|
||||
const b = await knoepfeAn(m2.s, "Fuer den Bildschirm");
|
||||
ok(!!b && /beworben/i.test(b.text),
|
||||
`Frida sieht, dass sie sich beworben hat ("${(b?.text || "").slice(0, 70)}…")`);
|
||||
ok(!!b && b.knoepfe.some((t) => /zurückziehen/i.test(t)),
|
||||
`und kann sie zurueckziehen (${b?.knoepfe.join(" | ")})`);
|
||||
/* GEGENPROBE: Sie sieht KEINE Entscheidungsknoepfe an ihrer
|
||||
eigenen Bewerbung -- sonst haette sie sich selbst annehmen
|
||||
koennen, und das ganze Verbot waere ein Knopf weiter offen. */
|
||||
ok(!!b && b.bewerbungen === 0,
|
||||
`und keinen Block zum Entscheiden (${b?.bewerbungen})`);
|
||||
} finally { await m2.ctx.close(); }
|
||||
|
||||
ok(meckern.length === 0, meckern.length
|
||||
? `der Browser meldet: ${meckern.slice(0, 3).join(" | ")}`
|
||||
: "kein Absturz und keine Fehlermeldung im Browser");
|
||||
} finally {
|
||||
await browser.close();
|
||||
await new Promise((r) => vorbau.close(r));
|
||||
}
|
||||
}
|
||||
|
||||
/* =====================================================================
|
||||
ERGEBNIS
|
||||
===================================================================== */
|
||||
melde("");
|
||||
if (geprueft < 55) {
|
||||
console.log(` FEHL nur ${geprueft} Pruefungen gelaufen -- erwartet waren 55+`);
|
||||
fehler++;
|
||||
}
|
||||
melde(fehler === 0
|
||||
? `Alles in Ordnung. ${geprueft} Pruefungen, 0 Fehler.`
|
||||
: `${fehler} FEHLER bei ${geprueft} Pruefungen.`);
|
||||
melde("");
|
||||
try { rmSync(ordner, { recursive: true, force: true }); } catch { /* egal */ }
|
||||
process.exit(fehler ? 1 : 0);
|
||||
@@ -233,10 +233,41 @@ let idPool = null;
|
||||
ok(vorher?.uebernommen_von === null,
|
||||
"vorher hat sie niemand");
|
||||
|
||||
const nimm = await rufe(`/workspace/api/aufgaben/${idPool}/uebernehmen`, { method: "POST", keks: bea, body: {} });
|
||||
ok(nimm.code === 200, `Bea uebernimmt sie (HTTP ${nimm.code})`);
|
||||
/* ===================================================================
|
||||
HIER STAND BIS ZUM 22.09.2026 „Bea uebernimmt sie" -- und genau
|
||||
das geht seitdem nicht mehr.
|
||||
|
||||
/* DER EIGENTLICHE PUNKT: Die anderen muessen es SEHEN. */
|
||||
Filipe: „die modis und linke hand sollen da nichts uebernehmen
|
||||
koennen von aufgaben, ueberhaupt ueberall sollen die keine
|
||||
aufgaben selber uebernehmen die ihnen nicht zugetragen sind. ich
|
||||
will dass die sich fuer aufgaben bewerben koennen aber die rechte
|
||||
hand oder dogfather muessen annehmen oder ablehnen koennen."
|
||||
|
||||
Der Pool bleibt, sein Sinn bleibt („einer macht es, die anderen
|
||||
sehen es"). Nur der Weg dahin geht jetzt ueber eine Bewerbung.
|
||||
Die Pruefung darunter misst denselben EFFEKT wie vorher -- die
|
||||
anderen sehen, dass sie weg ist -- nur ueber den neuen Weg.
|
||||
=================================================================== */
|
||||
const nimmAlt = await rufe(`/workspace/api/aufgaben/${idPool}/uebernehmen`, { method: "POST", keks: bea, body: {} });
|
||||
ok(nimmAlt.code === 403 && nimmAlt.json?.fehler === "erst_bewerben",
|
||||
`Bea kann sie sich nicht mehr selbst nehmen (HTTP ${nimmAlt.code}, ${nimmAlt.json?.fehler})`);
|
||||
|
||||
const bewerb = await rufe(`/workspace/api/aufgaben/${idPool}/bewerben`, { method: "POST", keks: bea,
|
||||
body: { text: "Ich mache das." } });
|
||||
ok(bewerb.code === 200, `sie bewirbt sich (HTTP ${bewerb.code})`);
|
||||
|
||||
/* DIE LINKE HAND HAT SIE VERTEILT -- entscheiden darf sie trotzdem
|
||||
nicht. Das ist der Unterschied zwischen den zwei Fragen. */
|
||||
const linksVersuch = await rufe(`/workspace/api/aufgaben/${idPool}/bewerbung/annehmen`,
|
||||
{ method: "POST", keks: links, body: { person_id: idBea } });
|
||||
ok(linksVersuch.code === 403,
|
||||
`die linke Hand entscheidet nicht darueber (HTTP ${linksVersuch.code})`);
|
||||
|
||||
const ja = await rufe(`/workspace/api/aufgaben/${idPool}/bewerbung/annehmen`,
|
||||
{ method: "POST", keks: chef, body: { person_id: idBea, kommentar: "Passt." } });
|
||||
ok(ja.code === 200, `DogFather nimmt ihre Bewerbung an (HTTP ${ja.code})`);
|
||||
|
||||
/* DER EIGENTLICHE PUNKT, UNVERAENDERT: Die anderen muessen es SEHEN. */
|
||||
const beiCem = await aufgabeBei(cem, idPool);
|
||||
ok(beiCem?.uebernommen_von === "Bea",
|
||||
`Cem sieht, dass Bea sie hat (${beiCem?.uebernommen_von})`);
|
||||
@@ -245,9 +276,11 @@ let idPool = null;
|
||||
ok(beiCem?.meine_zuteilung?.grund === "Von jemand anderem übernommen",
|
||||
`mit dem Grund im Klartext ("${beiCem?.meine_zuteilung?.grund}")`);
|
||||
|
||||
/* ZWEI KOENNEN SIE NICHT GLEICHZEITIG NEHMEN. */
|
||||
const zweite = await rufe(`/workspace/api/aufgaben/${idPool}/uebernehmen`, { method: "POST", keks: cem, body: {} });
|
||||
ok(zweite.code === 409, `ein zweiter Zugriff wird abgelehnt (HTTP ${zweite.code}, ${zweite.json?.fehler})`);
|
||||
/* ZWEI KOENNEN SIE NICHT GLEICHZEITIG BEKOMMEN. Cem bewirbt sich
|
||||
jetzt noch -- und laeuft in dieselbe Wand wie frueher beim
|
||||
Uebernehmen. */
|
||||
const zweite = await rufe(`/workspace/api/aufgaben/${idPool}/bewerben`, { method: "POST", keks: cem, body: {} });
|
||||
ok(zweite.code === 409, `eine zweite Bewerbung wird abgelehnt (HTTP ${zweite.code}, ${zweite.json?.fehler})`);
|
||||
ok(zweite.json?.wer === "Bea", `und sagt, wer sie hat (${zweite.json?.wer})`);
|
||||
|
||||
/* GEGENPROBE: Bei einer "mehrere"-Aufgabe gibt es kein Uebernehmen. */
|
||||
|
||||
@@ -235,6 +235,44 @@ function sichtbarRoh(person) {
|
||||
case "hand":
|
||||
/* Die linke Hand sieht dasselbe wie die rechte (21.09.2026). */
|
||||
case "linke": {
|
||||
/* =================================================================
|
||||
AUF DER ADRESSE VON TEAM DOGI SEHEN SIE ALLES (22.09.2026)
|
||||
|
||||
Filipe: „rechte hand linke hand und dogfather sehen alle
|
||||
aufgaben und koennen alle verteilen."
|
||||
|
||||
GEFUNDEN BEIM BAUEN DER BEWERBUNG, nicht beim Lesen: Die
|
||||
rechte Hand soll ueber Bewerbungen entscheiden -- und sah die
|
||||
Aufgabe nicht, um die es ging. Gemessen an einer Pool-Aufgabe,
|
||||
die DogFather fuer zwei Modis angelegt hat:
|
||||
|
||||
DogFather sieht sie 1 Bewerbung
|
||||
Modi sieht sie 1 Bewerbung
|
||||
rechte Hand SIEHT SIE NICHT (Liste leer)
|
||||
|
||||
Die Regel darunter sammelt die Menschen mit einer
|
||||
TEAM_DOGI_ROLLE und fragt, ob einer von ihnen als Creator,
|
||||
Verantwortlicher oder Ersteller eingetragen ist. Bei einer
|
||||
Pool-Aufgabe bleibt `verantwortlich_id` aber leer (das ist ihr
|
||||
Sinn), `creator_id` war leer, und der Ersteller ist DogFather
|
||||
-- der in dieser Liste nicht steht. Alle drei Bedingungen
|
||||
gingen also ins Leere.
|
||||
|
||||
Eine Entscheiderin, die das zu Entscheidende nicht sieht,
|
||||
waere ein Knopf ohne Gegenstand. Und es ist ohnehin das, was
|
||||
Filipe gesagt hat.
|
||||
|
||||
`1=1` HEISST HIER NICHT „ALLES IM HAUS": `sichtbar()` haengt
|
||||
fuer `haus === "crew"` ein `AND ohneAgentur(...)` davor. Die
|
||||
Trennung der zwei Haeuser bleibt damit unberuehrt -- es ist
|
||||
„alles von Team Dogi", nicht „alles".
|
||||
|
||||
DIE ALTE REGEL BLEIBT ALS RUECKFALL stehen, fuer den Fall,
|
||||
dass eine Hand je auf einer anderen Adresse auftaucht. Sie
|
||||
dort auf `1=1` zu setzen waere eine Tuer in das andere Haus.
|
||||
================================================================= */
|
||||
if (person.haus === "crew") return { wo: "1=1", werte: [] };
|
||||
|
||||
const liste = [...TEAM_DOGI_ROLLEN].map((r) => `'${r}'`).join(", ");
|
||||
const modis = db().prepare(
|
||||
`SELECT id FROM personen WHERE rolle IN (${liste})`).all().map((z) => z.id);
|
||||
|
||||
@@ -53,7 +53,8 @@
|
||||
|
||||
import express from "express";
|
||||
import {
|
||||
db, protokolliere, echteIp, darfAufgabenVerteilen, istDogFather, istHand,
|
||||
db, protokolliere, echteIp, darfAufgabenVerteilen, entscheidetUeberAufgaben,
|
||||
istDogFather, istHand,
|
||||
sitzungLesen,
|
||||
} from "./workspace.js";
|
||||
import { TEAM_DOGI_ROLLEN } from "./crew-adresse.js";
|
||||
@@ -100,6 +101,10 @@ export const BEWERTUNGEN = new Set(["gut", "nicht_gut", "verbessern"]);
|
||||
* erfinden — sonst heißt derselbe Zustand an zwei Stellen anders. */
|
||||
export const ZUSTAND_TEXT = {
|
||||
offen: "Noch nicht beantwortet",
|
||||
/* „Beworben" ist kein halbes „Angenommen", sondern ein eigener
|
||||
Zustand: Es liegt an jemand anderem, nicht mehr an der Person
|
||||
selbst. Der Satz sagt das, statt es offen zu lassen. */
|
||||
beworben: "Beworben – wartet auf Antwort",
|
||||
angenommen: "Angenommen",
|
||||
arbeit: "In Bearbeitung",
|
||||
erledigt: "Erledigt",
|
||||
@@ -129,11 +134,14 @@ export function zuteilungenZu(aufgabeIds) {
|
||||
SELECT z.id, z.aufgabe_id, z.person_id, z.zustand, z.grund,
|
||||
z.zugeteilt_am, z.geantwortet_am, z.erledigt_am,
|
||||
z.bewertung, z.bewertung_text, z.bewertet_am,
|
||||
z.entscheid_text, z.entschieden_am,
|
||||
p.name AS person_name, p.rolle AS person_rolle,
|
||||
pb.name AS bewertet_von_name
|
||||
pb.name AS bewertet_von_name,
|
||||
pe.name AS entschieden_von_name
|
||||
FROM aufgaben_zuteilung z
|
||||
LEFT JOIN personen p ON p.id = z.person_id
|
||||
LEFT JOIN personen pb ON pb.id = z.bewertet_von
|
||||
LEFT JOIN personen pe ON pe.id = z.entschieden_von
|
||||
WHERE z.aufgabe_id IN (${platz})
|
||||
ORDER BY p.name COLLATE NOCASE`).all(...ids);
|
||||
|
||||
@@ -168,8 +176,18 @@ export function mitZuteilung(reihen, ich) {
|
||||
verlangt ausdrücklich, dass die anderen das erkennen, "damit
|
||||
keine doppelte Bearbeitung entsteht". */
|
||||
r.uebernommen_von = r.verteilart === "pool"
|
||||
? (zu.find((z) => z.zustand !== "offen" && z.zustand !== "abgelehnt")?.person_name || null)
|
||||
? (zu.find((z) => z.zustand !== "offen" && z.zustand !== "abgelehnt"
|
||||
&& z.zustand !== "beworben")?.person_name || null)
|
||||
: null;
|
||||
|
||||
/* DIE OFFENEN BEWERBUNGEN, abgeleitet statt danebengefuehrt.
|
||||
Die Oberflaeche soll nicht dieselbe Rechnung noch einmal machen
|
||||
-- zwei Rechnungen fuer dieselbe Frage laufen auseinander. */
|
||||
r.bewerbungen = zu.filter((z) => z.zustand === "beworben");
|
||||
/* UND OB ICH MICH UEBERHAUPT NOCH BEWERBEN KANN. Ein Knopf, der
|
||||
beim Druecken eine Absage bringt, ist schlimmer als keiner. */
|
||||
r.ich_beworben = !!(r.meine_zuteilung
|
||||
&& r.meine_zuteilung.zustand === "beworben");
|
||||
}
|
||||
return liste;
|
||||
}
|
||||
@@ -196,6 +214,31 @@ export function zuteilen(aufgabeId, personIds, art, vonId) {
|
||||
`SELECT id FROM personen WHERE id IN (${platz}) AND aktiv = 1`).all(...roh).map((z) => z.id);
|
||||
if (!echt.length) return { fehler: "keine_person" };
|
||||
|
||||
/* NIEMAND TRAEGT SICH SELBST EIN, DER NICHT ENTSCHEIDEN DARF
|
||||
(22.09.2026).
|
||||
|
||||
Ohne diese Zeile waere das Verbot von oben ein Umweg mit einem
|
||||
Klick mehr: Die linke Hand darf verteilen -- sie haette sich die
|
||||
Aufgabe also einfach selbst zugeteilt und damit genau das getan,
|
||||
was Filipe ausgeschlossen hat („keine aufgaben selber uebernehmen
|
||||
die ihnen nicht zugetragen sind").
|
||||
|
||||
DIE ROLLE WIRD NACHGESCHLAGEN statt durchgereicht: `zuteilen`
|
||||
bekommt nur eine Nummer, und eine zusaetzliche Angabe im Aufruf
|
||||
waere die, die beim dritten Aufrufer fehlt. Eine Abfrage mehr
|
||||
kostet nichts und kann nicht vergessen werden.
|
||||
|
||||
ES WIRD ABGELEHNT UND NICHT STILL HERAUSGEFILTERT: Wer sich
|
||||
einträgt und sich danach nicht in der Liste findet, sucht den
|
||||
Fehler bei sich. */
|
||||
const verteiler = vonId
|
||||
? db().prepare("SELECT id, rolle FROM personen WHERE id = ?").get(vonId)
|
||||
: null;
|
||||
if (verteiler && echt.includes(verteiler.id)
|
||||
&& !entscheidetUeberAufgaben(verteiler)) {
|
||||
return { fehler: "nicht_an_dich_selbst" };
|
||||
}
|
||||
|
||||
/* DIE ART WIRD ABGELEITET, WO SIE SICH ABLEITEN LÄSST. Eine Person
|
||||
kann kein Pool sein — "der erste, der Zeit hat" braucht mindestens
|
||||
zwei, die es sehen. Wer trotzdem "pool" schickt, bekommt
|
||||
@@ -269,6 +312,23 @@ zuteilungRouter.post("/workspace/api/aufgaben/:id/annehmen", (req, res) => {
|
||||
if (!z) return res.status(403).json({ fehler: "nicht_zugeteilt" });
|
||||
if (z.zustand === "erledigt") return res.status(409).json({ fehler: "schon_erledigt" });
|
||||
|
||||
/* BEIM POOL IST „ANNEHMEN" DASSELBE WIE „UEBERNEHMEN" (22.09.2026).
|
||||
|
||||
Das ist beim Bauen aufgefallen, nicht beim Planen: Der Weg
|
||||
`uebernehmen` wurde fuer Modis und die linke Hand geschlossen --
|
||||
und `annehmen` stand daneben weit offen. Bei einer Pool-Aufgabe
|
||||
heisst annehmen aber genau, sie den anderen wegzunehmen
|
||||
(`uebernahmeAbschliessen` weiter unten in dieser Funktion). Ein
|
||||
Verbot mit einer zweiten, offenen Tuer ist keins.
|
||||
|
||||
BEI „einzeln" UND „mehrere" BLEIBT ES, WIE ES WAR. Dort wurde
|
||||
die Aufgabe jemandem ZUGETRAGEN -- und genau die darf er
|
||||
annehmen. Filipes Satz nennt den Unterschied selbst: „keine
|
||||
aufgaben selber uebernehmen DIE IHNEN NICHT ZUGETRAGEN SIND." */
|
||||
if (a.verteilart === "pool" && !entscheidetUeberAufgaben(req.person)) {
|
||||
return res.status(403).json({ fehler: "erst_bewerben" });
|
||||
}
|
||||
|
||||
db().prepare(`UPDATE aufgaben_zuteilung
|
||||
SET zustand = 'angenommen', grund = NULL, geantwortet_am = ?
|
||||
WHERE id = ?`).run(jetzt(), z.id);
|
||||
@@ -331,6 +391,27 @@ function uebernahmeAbschliessen(aufgabeId, personId) {
|
||||
geantwortet_am = ?
|
||||
WHERE aufgabe_id = ? AND person_id <> ? AND zustand = 'offen'`)
|
||||
.run(jetzt(), aufgabeId, personId);
|
||||
|
||||
/* DIE OFFENEN BEWERBUNGEN FALLEN AUCH WEG (22.09.2026).
|
||||
|
||||
Ohne diese Zeile blieb eine Bewerbung auf „beworben" stehen,
|
||||
nachdem jemand anders die Aufgabe bekommen hat -- die Person
|
||||
haette weiter gewartet, und in der Liste der Leitung staende eine
|
||||
Entscheidung an, die es nicht mehr gibt. Gefunden hat es die
|
||||
Pruefung.
|
||||
|
||||
EIGENE ANWEISUNG UND NICHT DIESELBE, und der Grund ist das Feld
|
||||
`grund`: Dort stehen bei einer Bewerbung die WORTE DER PERSON
|
||||
(„Ich habe Freitag Zeit."). Sie mit „Von jemand anderem
|
||||
uebernommen" zu ueberschreiben hiesse, die Frage mit der Antwort
|
||||
zu loeschen -- genau das, was die Trennung der zwei Felder
|
||||
verhindern soll. Der Hinweis kommt deshalb in `entscheid_text`. */
|
||||
db().prepare(`UPDATE aufgaben_zuteilung
|
||||
SET zustand = 'abgelehnt',
|
||||
entscheid_text = 'Von jemand anderem übernommen',
|
||||
entschieden_am = ?, geantwortet_am = ?
|
||||
WHERE aufgabe_id = ? AND person_id <> ? AND zustand = 'beworben'`)
|
||||
.run(jetzt(), jetzt(), aufgabeId, personId);
|
||||
db().prepare("UPDATE aufgaben SET verantwortlich_id = ? WHERE id = ?")
|
||||
.run(personId, aufgabeId);
|
||||
}
|
||||
@@ -340,6 +421,14 @@ zuteilungRouter.post("/workspace/api/aufgaben/:id/uebernehmen", (req, res) => {
|
||||
try {
|
||||
const a = holen(req, res); if (!a) return;
|
||||
if (a.verteilart !== "pool") return res.status(409).json({ fehler: "kein_pool" });
|
||||
/* WER NICHT ENTSCHEIDET, NIMMT SICH AUCH NICHTS (22.09.2026).
|
||||
Filipe: „ueberhaupt ueberall sollen die keine aufgaben selber
|
||||
uebernehmen die ihnen nicht zugetragen sind."
|
||||
Fuer Modis und die linke Hand fuehrt der Weg jetzt ueber eine
|
||||
Bewerbung -- der Fehlercode sagt das, statt nur nein. */
|
||||
if (!entscheidetUeberAufgaben(req.person)) {
|
||||
return res.status(403).json({ fehler: "erst_bewerben" });
|
||||
}
|
||||
const z = meine(a.id, req.person.id);
|
||||
if (!z) return res.status(403).json({ fehler: "nicht_zugeteilt" });
|
||||
|
||||
@@ -368,6 +457,202 @@ zuteilungRouter.post("/workspace/api/aufgaben/:id/uebernehmen", (req, res) => {
|
||||
}
|
||||
});
|
||||
|
||||
/* =====================================================================
|
||||
SICH BEWERBEN — und wer darueber entscheidet (22.09.2026)
|
||||
=====================================================================
|
||||
Filipe: „ich will dass die sich fuer aufgaben bewerben koennen aber
|
||||
die rechte hand oder dogfather muessen annehmen oder ablehnen koennen
|
||||
und das mit einem kommentar als moeglichkeit sogar noch zum
|
||||
hinzufuegen."
|
||||
|
||||
DREI ENTSCHEIDUNGEN, die nicht auf der Hand lagen:
|
||||
|
||||
(1) DER KOMMENTAR IST FREIWILLIG, die Begruendung beim ABLEHNEN einer
|
||||
zugeteilten Aufgabe bleibt Pflicht. Das ist kein Widerspruch:
|
||||
Dort sagt jemand ab, der gefragt wurde -- der Fragende muss
|
||||
wissen, warum, sonst fragt er nach. Hier entscheidet die
|
||||
Leitung ueber eine Bitte; ein „ja" braucht keine Begruendung.
|
||||
Filipes Wort ist „als moeglichkeit", nicht „als pflicht".
|
||||
|
||||
(2) DER TEXT DER BEWERBUNG UND DER KOMMENTAR DER LEITUNG STEHEN IN
|
||||
ZWEI FELDERN. `grund` traegt die Worte der Person selbst, der
|
||||
Kommentar kommt in `entscheid_text`. In dasselbe Feld waere
|
||||
bequemer und wuerde die Frage mit der Antwort ueberschreiben --
|
||||
danach weiss niemand mehr, worum jemand gebeten hat.
|
||||
|
||||
(3) WER SICH BEWIRBT, IST NICHT ZUGETEILT. Es entsteht eine Zeile
|
||||
mit `zustand = 'beworben'` und ohne `zugeteilt_von` -- sonst
|
||||
staende in der Liste, jemand haette ihm die Aufgabe gegeben.
|
||||
===================================================================== */
|
||||
|
||||
const BEWERBUNG_TEXT_MAX = 500;
|
||||
|
||||
/* ---- Sich bewerben --------------------------------------------------- */
|
||||
zuteilungRouter.post("/workspace/api/aufgaben/:id/bewerben", (req, res) => {
|
||||
try {
|
||||
const a = holen(req, res); if (!a) return;
|
||||
|
||||
/* WER SELBST ENTSCHEIDET, BEWIRBT SICH NICHT. Er teilt sich die
|
||||
Aufgabe zu -- eine Bewerbung an sich selbst waere ein Umweg mit
|
||||
zwei Klicks und demselben Ergebnis. */
|
||||
if (entscheidetUeberAufgaben(req.person)) {
|
||||
return res.status(409).json({ fehler: "du_entscheidest_selbst" });
|
||||
}
|
||||
if (a.status === "erledigt" || a.status === "abgebrochen") {
|
||||
return res.status(409).json({ fehler: "schon_erledigt" });
|
||||
}
|
||||
|
||||
const z = meine(a.id, req.person.id);
|
||||
if (z && z.zustand === "beworben") {
|
||||
return res.status(409).json({ fehler: "schon_beworben" });
|
||||
}
|
||||
/* WER SIE SCHON HAT, BEWIRBT SICH NICHT -- mit einer Ausnahme,
|
||||
und die ist der Kern der Sache:
|
||||
|
||||
einzeln/mehrere, Zustand „offen" -> sie wurde IHM zugetragen.
|
||||
Er nimmt sie an oder lehnt
|
||||
sie ab. Keine Bewerbung.
|
||||
pool, Zustand „offen" -> sie wurde ANGEBOTEN, nicht
|
||||
zugetragen. Frueher hiess
|
||||
die Antwort darauf „ich
|
||||
nehme sie mir"; seit heute
|
||||
heisst sie „ich bewerbe
|
||||
mich".
|
||||
|
||||
Ohne diese Unterscheidung haette der erlaubte Weg fuer genau die
|
||||
Aufgaben nicht funktioniert, fuer die er gedacht ist. Gefunden
|
||||
hat es die Pruefung, nicht das Nachdenken. */
|
||||
const angeboten = z && z.zustand === "offen" && a.verteilart === "pool";
|
||||
if (z && !angeboten && z.zustand !== "abgelehnt") {
|
||||
return res.status(409).json({ fehler: "schon_zugeteilt" });
|
||||
}
|
||||
|
||||
/* HAT SIE SCHON JEMAND? Dann ist eine Bewerbung eine Enttaeuschung
|
||||
mit Anlauf. Dieselbe Frage wie beim Uebernehmen, damit beide
|
||||
Wege dasselbe sagen. */
|
||||
const schon = db().prepare(`SELECT p.name FROM aufgaben_zuteilung z
|
||||
LEFT JOIN personen p ON p.id = z.person_id
|
||||
WHERE z.aufgabe_id = ? AND z.person_id <> ?
|
||||
AND z.zustand IN ('angenommen','arbeit','erledigt')`).get(a.id, req.person.id);
|
||||
if (schon && a.verteilart === "pool") {
|
||||
return res.status(409).json({ fehler: "schon_vergeben", wer: schon.name });
|
||||
}
|
||||
|
||||
const text = String(req.body?.text ?? "").trim().slice(0, BEWERBUNG_TEXT_MAX);
|
||||
const nun = jetzt();
|
||||
|
||||
if (z) {
|
||||
db().prepare(`UPDATE aufgaben_zuteilung
|
||||
SET zustand = 'beworben', grund = ?, geantwortet_am = ?,
|
||||
entscheid_text = NULL, entschieden_von = NULL, entschieden_am = NULL
|
||||
WHERE id = ?`).run(text || null, nun, z.id);
|
||||
} else {
|
||||
/* `zugeteilt_von` bleibt leer: Niemand hat sie ihm gegeben. */
|
||||
db().prepare(`INSERT INTO aufgaben_zuteilung
|
||||
(aufgabe_id, person_id, zustand, grund, zugeteilt_am, geantwortet_am)
|
||||
VALUES (?,?,'beworben',?,?,?)`)
|
||||
.run(a.id, req.person.id, text || null, nun, nun);
|
||||
}
|
||||
|
||||
protokolliere("aufgabe_beworben", {
|
||||
personId: req.person.id, rolle: req.person.rolle, ip: echteIp(req),
|
||||
detail: `#${a.id} ${a.titel}`.slice(0, 120),
|
||||
});
|
||||
res.json({ ok: true, zustand: "beworben" });
|
||||
} catch (f) {
|
||||
console.error("[zuteilung] bewerben:", f?.message);
|
||||
res.status(503).json({ fehler: "nicht_verfuegbar" });
|
||||
}
|
||||
});
|
||||
|
||||
/* ---- Eine Bewerbung zuruecknehmen ------------------------------------ */
|
||||
zuteilungRouter.post("/workspace/api/aufgaben/:id/bewerbung-zurueck", (req, res) => {
|
||||
try {
|
||||
const a = holen(req, res); if (!a) return;
|
||||
const z = meine(a.id, req.person.id);
|
||||
if (!z || z.zustand !== "beworben") {
|
||||
return res.status(409).json({ fehler: "keine_bewerbung" });
|
||||
}
|
||||
/* GANZ WEG, nicht „zurueckgezogen". Wer es sich anders ueberlegt,
|
||||
hat nichts getan, was jemand nachlesen muesste -- und eine Zeile,
|
||||
die nur noch sagt „hier stand mal eine Bewerbung", waere in der
|
||||
Liste der Leitung Laerm. */
|
||||
db().prepare("DELETE FROM aufgaben_zuteilung WHERE id = ?").run(z.id);
|
||||
protokolliere("bewerbung_zurueckgezogen", {
|
||||
personId: req.person.id, rolle: req.person.rolle, ip: echteIp(req),
|
||||
detail: `#${a.id} ${a.titel}`.slice(0, 120),
|
||||
});
|
||||
res.json({ ok: true });
|
||||
} catch (f) {
|
||||
console.error("[zuteilung] bewerbung-zurueck:", f?.message);
|
||||
res.status(503).json({ fehler: "nicht_verfuegbar" });
|
||||
}
|
||||
});
|
||||
|
||||
/* ---- Ueber eine Bewerbung entscheiden -------------------------------- */
|
||||
for (const [weg, entscheidung] of [["annehmen", "ja"], ["ablehnen", "nein"]]) {
|
||||
zuteilungRouter.post(`/workspace/api/aufgaben/:id/bewerbung/${weg}`, (req, res) => {
|
||||
try {
|
||||
const a = holen(req, res); if (!a) return;
|
||||
/* NUR DIE RECHTE HAND UND DOGFATHER. Die linke Hand darf
|
||||
verteilen, aber nicht ueber Bewerbungen entscheiden -- sie
|
||||
bewirbt sich ja selbst. */
|
||||
if (!entscheidetUeberAufgaben(req.person)) {
|
||||
return res.status(403).json({ fehler: "nicht_erlaubt" });
|
||||
}
|
||||
|
||||
const wer = Number(req.body?.person_id);
|
||||
if (!Number.isInteger(wer)) return res.status(400).json({ fehler: "ungueltig" });
|
||||
|
||||
const z = db().prepare(`SELECT * FROM aufgaben_zuteilung
|
||||
WHERE aufgabe_id = ? AND person_id = ?`).get(a.id, wer);
|
||||
if (!z || z.zustand !== "beworben") {
|
||||
return res.status(409).json({ fehler: "keine_bewerbung" });
|
||||
}
|
||||
|
||||
const kommentar = String(req.body?.kommentar ?? "").trim()
|
||||
.slice(0, BEWERBUNG_TEXT_MAX) || null;
|
||||
const nun = jetzt();
|
||||
|
||||
if (entscheidung === "ja") {
|
||||
/* HAT INZWISCHEN JEMAND ANDERES? Die Frage muss VOR dem
|
||||
Schreiben stehen -- sonst sagen zwei Zusagen im selben
|
||||
Moment beide „hat geklappt". */
|
||||
const schon = db().prepare(`SELECT p.name FROM aufgaben_zuteilung z
|
||||
LEFT JOIN personen p ON p.id = z.person_id
|
||||
WHERE z.aufgabe_id = ? AND z.person_id <> ?
|
||||
AND z.zustand IN ('angenommen','arbeit','erledigt')`).get(a.id, wer);
|
||||
if (schon && a.verteilart === "pool") {
|
||||
return res.status(409).json({ fehler: "schon_vergeben", wer: schon.name });
|
||||
}
|
||||
db().prepare(`UPDATE aufgaben_zuteilung
|
||||
SET zustand = 'angenommen', geantwortet_am = ?,
|
||||
entscheid_text = ?, entschieden_von = ?, entschieden_am = ?
|
||||
WHERE id = ?`).run(nun, kommentar, req.person.id, nun, z.id);
|
||||
if (a.verteilart === "pool") uebernahmeAbschliessen(a.id, wer);
|
||||
else {
|
||||
db().prepare("UPDATE aufgaben SET verantwortlich_id = ? WHERE id = ?")
|
||||
.run(wer, a.id);
|
||||
}
|
||||
} else {
|
||||
db().prepare(`UPDATE aufgaben_zuteilung
|
||||
SET zustand = 'abgelehnt', geantwortet_am = ?,
|
||||
entscheid_text = ?, entschieden_von = ?, entschieden_am = ?
|
||||
WHERE id = ?`).run(nun, kommentar, req.person.id, nun, z.id);
|
||||
}
|
||||
|
||||
protokolliere(entscheidung === "ja" ? "bewerbung_angenommen" : "bewerbung_abgelehnt", {
|
||||
personId: req.person.id, rolle: req.person.rolle, ip: echteIp(req),
|
||||
detail: `#${a.id} fuer ${wer}`.slice(0, 120),
|
||||
});
|
||||
res.json({ ok: true, zustand: entscheidung === "ja" ? "angenommen" : "abgelehnt" });
|
||||
} catch (f) {
|
||||
console.error(`[zuteilung] bewerbung/${weg}:`, f?.message);
|
||||
res.status(503).json({ fehler: "nicht_verfuegbar" });
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
/* ---- Meinen eigenen Stand setzen ------------------------------------ */
|
||||
zuteilungRouter.post("/workspace/api/aufgaben/:id/mein-stand", (req, res) => {
|
||||
try {
|
||||
|
||||
@@ -289,6 +289,48 @@ export const darfAufgabenAnlegen = (person) => {
|
||||
export const darfAufgabenVerteilen = (person) =>
|
||||
istLeitung(person) || istHand(person);
|
||||
|
||||
/* =====================================================================
|
||||
WER ENTSCHEIDET, WER EINE AUFGABE MACHT (22.09.2026)
|
||||
=====================================================================
|
||||
Filipe: „die modis und linke hand sollen da nichts uebernehmen
|
||||
koennen von aufgaben, ueberhaupt ueberall sollen die keine aufgaben
|
||||
selber uebernehmen die ihnen nicht zugetragen sind. ich will dass die
|
||||
sich fuer aufgaben bewerben koennen aber die rechte hand oder
|
||||
dogfather muessen annehmen oder ablehnen koennen und das mit einem
|
||||
kommentar als moeglichkeit sogar noch zum hinzufuegen."
|
||||
|
||||
DAS IST EINE ANDERE FRAGE ALS `darfAufgabenVerteilen`, und die zwei
|
||||
auseinanderzuhalten ist der ganze Punkt:
|
||||
|
||||
verteilen -> eine Aufgabe an ANDERE geben
|
||||
entscheiden -> bestimmen, wer sie am Ende macht
|
||||
|
||||
Die linke Hand darf verteilen (sein Wort vom selben Tag: „rechte hand
|
||||
linke hand und dogfather ... koennen alle verteilen"), aber NICHT
|
||||
entscheiden, ob sie selbst eine bekommt. Sie bewirbt sich wie ein
|
||||
Modi, und die rechte Hand oder DogFather sagen ja oder nein.
|
||||
|
||||
GEMESSEN, WARUM ES NOETIG WAR: `istHand()` fasst die rechte UND die
|
||||
linke Hand -- die linke konnte sich damit bisher Aufgaben aus dem
|
||||
Pool selbst nehmen und sich beim Verteilen selbst eintragen.
|
||||
|
||||
Rolle istHand darfVerteilen (vorher)
|
||||
admin false true
|
||||
hand true true
|
||||
linke true true <-- genau das soll weg
|
||||
modi false false
|
||||
|
||||
DREI STELLEN HAENGEN DARAN, und alle drei fragen ab hier dieselbe
|
||||
Funktion:
|
||||
1. aus dem Pool uebernehmen
|
||||
2. sich beim Verteilen selbst eintragen
|
||||
3. ueber eine Bewerbung entscheiden
|
||||
|
||||
Eine Aufzaehlung der Rollen an drei Stellen waere die, bei der die
|
||||
dritte beim naechsten Umbau vergessen wird. */
|
||||
export const entscheidetUeberAufgaben = (person) =>
|
||||
istLeitung(person) || person?.rolle === "hand";
|
||||
|
||||
/* ===== WER DARF EINE ROLLE AENDERN -- UND ZU WELCHER? (20.09.2026) ==
|
||||
|
||||
Filipe: "ich will dass ich da auch die rollen der leute wechseln kann
|
||||
@@ -3510,6 +3552,49 @@ function umstellungen(d) {
|
||||
checkListeErweitern(d, "aufgaben", "status", "abgebrochen",
|
||||
["offen", "arbeit", "review", "erledigt", "abgebrochen"], jetztStempel);
|
||||
|
||||
/* DER ZUSTAND „beworben" (22.09.2026).
|
||||
|
||||
Eine Bewerbung ist keine neue Tabelle, sondern ein weiterer
|
||||
Zustand derselben Zeile. Das ist nicht Sparsamkeit, sondern die
|
||||
richtige Form: Die Frage „wie steht diese Aufgabe bei DIESEM
|
||||
Menschen" wird schon hier beantwortet, und eine Bewerbung ist
|
||||
genau eine Antwort darauf. Eine zweite Tabelle daneben haette
|
||||
zwei Wahrheiten ueber dieselbe Beziehung -- und jede Liste,
|
||||
jede Ansicht und jede Rueckmeldung muesste beide lesen.
|
||||
|
||||
Der Ablauf: beworben -> angenommen (die rechte Hand oder
|
||||
DogFather sagt ja) oder -> abgelehnt (mit Kommentar).
|
||||
|
||||
`checkListeErweitern` baut die Tabelle dafuer neu -- der einzige
|
||||
Weg, eine CHECK-Regel in SQLite zu aendern. Die Spaltenliste
|
||||
kommt aus PRAGMA, die Indizes gehen mit, und vorher wird
|
||||
gesichert. Steht seit dem 09.09. an einer Stelle, genau damit
|
||||
diese Umstellung hier keine vierte Abschrift wird. */
|
||||
checkListeErweitern(d, "aufgaben_zuteilung", "zustand", "beworben",
|
||||
["offen", "angenommen", "arbeit", "erledigt", "abgelehnt", "beworben"],
|
||||
jetztStempel);
|
||||
|
||||
/* WER ENTSCHIEDEN HAT, UND WAS ER DAZU GESAGT HAT.
|
||||
`grund` traegt weiterhin die Worte der Person selbst (beim
|
||||
Ablehnen ihre Begruendung, beim Bewerben ihr Anliegen). Der
|
||||
Kommentar der Leitung ist etwas anderes und gehoert nicht in
|
||||
dasselbe Feld -- sonst ueberschreibt die Antwort die Frage. */
|
||||
for (const [spalte, form] of [
|
||||
["entscheid_text", "TEXT"],
|
||||
["entschieden_von", "INTEGER REFERENCES personen(id) ON DELETE SET NULL"],
|
||||
["entschieden_am", "TEXT"],
|
||||
]) {
|
||||
const da = d.prepare("PRAGMA table_info(aufgaben_zuteilung)").all()
|
||||
.map((z) => z.name);
|
||||
if (da.includes(spalte)) continue;
|
||||
try {
|
||||
d.exec(`ALTER TABLE aufgaben_zuteilung ADD COLUMN ${spalte} ${form}`);
|
||||
console.log(`[workspace] Spalte '${spalte}' an der Zuteilung ergaenzt.`);
|
||||
} catch (f) {
|
||||
console.error(`[workspace] Spalte '${spalte}':`, f?.message);
|
||||
}
|
||||
}
|
||||
|
||||
/* ---- Der sechste Bereich: "agentur" (06.09.2026) ----
|
||||
|
||||
Kernprinzip 04 des Konzepts lautet woertlich "Die Agentur bleibt
|
||||
@@ -5841,6 +5926,18 @@ workspaceRouter.get("/workspace/api/ich", (req, res) => {
|
||||
|
||||
Aus DERSELBEN Funktion, die auch die Route benutzt. */
|
||||
darf_verteilen: darfAufgabenVerteilen(person),
|
||||
/* UND OB SIE ENTSCHEIDET, WER EINE AUFGABE MACHT (22.09.2026).
|
||||
|
||||
Das ist eine ANDERE Frage als `darf_verteilen`, und die
|
||||
Oberflaeche braucht beide: Die linke Hand verteilt (also zeigt
|
||||
ihr die Seite den Verteilen-Kasten), entscheidet aber nicht
|
||||
(also sieht sie keine Annehmen/Ablehnen-Knoepfe an fremden
|
||||
Bewerbungen, sondern einen Bewerben-Knopf fuer sich selbst).
|
||||
|
||||
Aus DERSELBEN Funktion, die auch die Wege absichern -- eine
|
||||
Rollenliste im Browser waere die zweite Wahrheit, die beim
|
||||
naechsten Umbau auseinanderlaeuft. */
|
||||
darf_entscheiden: entscheidetUeberAufgaben(person),
|
||||
/* Damit die Oberflaeche den Knopf gar nicht erst anbietet -- ein
|
||||
Knopf, der mit 403 antwortet, ist schlimmer als keiner. */
|
||||
darf_aufgaben_anlegen: darfAufgabenAnlegen(person),
|
||||
|
||||
@@ -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=202609221515" />
|
||||
<link rel="stylesheet" href="assets/css/haus.css?v=202609221515" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609221855" />
|
||||
<link rel="stylesheet" href="assets/css/haus.css?v=202609221855" />
|
||||
<!-- 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" />
|
||||
<meta name="theme-color" content="#06090f" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609221515" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609221855" />
|
||||
<style>
|
||||
/* Bewusst in der Seite und nicht in einer eigenen Datei: Diese Seite
|
||||
soll auch dann noch etwas anzeigen, wenn genau das schiefgeht,
|
||||
@@ -126,7 +126,7 @@
|
||||
|
||||
|
||||
|
||||
<script src="assets/js/anruf-probe.js?v=202609221515" defer></script>
|
||||
<script src="assets/js/installieren.js?v=202609221515" defer></script>
|
||||
<script src="assets/js/anruf-probe.js?v=202609221855" defer></script>
|
||||
<script src="assets/js/installieren.js?v=202609221855" defer></script>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
@@ -23,25 +23,25 @@
|
||||
},
|
||||
"icons": [
|
||||
{
|
||||
"src": "/assets/img/app-symbole/workspace-192.png?v=202609221515",
|
||||
"src": "/assets/img/app-symbole/workspace-192.png?v=202609221855",
|
||||
"sizes": "192x192",
|
||||
"type": "image/png",
|
||||
"purpose": "any"
|
||||
},
|
||||
{
|
||||
"src": "/assets/img/app-symbole/workspace-512.png?v=202609221515",
|
||||
"src": "/assets/img/app-symbole/workspace-512.png?v=202609221855",
|
||||
"sizes": "512x512",
|
||||
"type": "image/png",
|
||||
"purpose": "any"
|
||||
},
|
||||
{
|
||||
"src": "/assets/img/app-symbole/workspace-192-maskable.png?v=202609221515",
|
||||
"src": "/assets/img/app-symbole/workspace-192-maskable.png?v=202609221855",
|
||||
"sizes": "192x192",
|
||||
"type": "image/png",
|
||||
"purpose": "maskable"
|
||||
},
|
||||
{
|
||||
"src": "/assets/img/app-symbole/workspace-512-maskable.png?v=202609221515",
|
||||
"src": "/assets/img/app-symbole/workspace-512-maskable.png?v=202609221855",
|
||||
"sizes": "512x512",
|
||||
"type": "image/png",
|
||||
"purpose": "maskable"
|
||||
|
||||
@@ -1225,6 +1225,55 @@
|
||||
.z-bewerten__schild { font-size: .8rem; color: var(--text-leise); width: 100%; }
|
||||
.z-bewerten__knopf { font-size: .8rem; }
|
||||
|
||||
/* ---- Die Bewerbungen (22.09.2026) -----------------------------------
|
||||
Filipe: „ich will dass die sich fuer aufgaben bewerben koennen aber
|
||||
die rechte hand oder dogfather muessen annehmen oder ablehnen
|
||||
koennen und das mit einem kommentar als moeglichkeit."
|
||||
|
||||
EIGENE FLAECHE, ABGESETZT VOM REST DER KARTE. Eine Bewerbung ist
|
||||
etwas, das auf eine ANTWORT wartet -- sie in die Namensliste zu
|
||||
mischen hieße, sie sähe aus wie ein Stand, den man zur Kenntnis
|
||||
nimmt. Hier ist etwas zu tun, und das soll man sehen. */
|
||||
.z-bewerbungen {
|
||||
margin-top: 10px;
|
||||
padding: 10px 12px;
|
||||
border: 1px solid color-mix(in srgb, var(--akzent) 34%, var(--rand));
|
||||
border-radius: var(--radius-klein, 10px);
|
||||
background: color-mix(in srgb, var(--akzent) 7%, transparent);
|
||||
}
|
||||
.z-bewerbungen__schild {
|
||||
margin: 0 0 8px;
|
||||
font-size: .82rem; font-weight: 600;
|
||||
color: var(--text);
|
||||
}
|
||||
/* Name, Worte, zwei Knoepfe. Auf dem Handy bricht es um -- die Worte
|
||||
nehmen dann die ganze Breite, die Knoepfe stehen darunter
|
||||
nebeneinander. Kein Umbruchpunkt, `flex-wrap` misst selbst. */
|
||||
.z-bewerbung {
|
||||
display: flex; flex-wrap: wrap; align-items: center; gap: 8px;
|
||||
padding: 6px 0;
|
||||
}
|
||||
.z-bewerbung + .z-bewerbung {
|
||||
border-top: 1px solid color-mix(in srgb, var(--rand) 70%, transparent);
|
||||
}
|
||||
.z-bewerbung__name { font-weight: 600; font-size: .88rem; }
|
||||
/* Die Worte der Person duerfen die Knoepfe verdraengen, nicht
|
||||
umgekehrt: `flex: 1 1 100%` auf schmalen Schirmen kaeme zu frueh,
|
||||
`min-width` laesst sie erst umbrechen, wenn es eng wird. */
|
||||
.z-bewerbung__wort {
|
||||
flex: 1 1 12rem; min-width: 0;
|
||||
font-size: .82rem; color: var(--text-leise);
|
||||
}
|
||||
|
||||
/* Wer sich beworben hat, sieht seinen eigenen Stand -- ohne ihn bleibt
|
||||
der Knopf weg und nichts erklaert, warum. */
|
||||
.z-karte__zeile--warte { color: var(--text); }
|
||||
|
||||
@media (forced-colors: active) {
|
||||
.z-bewerbungen { border: 1px solid CanvasText; }
|
||||
.z-bewerbung + .z-bewerbung { border-top: 1px solid CanvasText; }
|
||||
}
|
||||
|
||||
.z-meldung { margin: 8px 0 0; font-size: .82rem; }
|
||||
.z-meldung[data-gut="nein"] { color: color-mix(in srgb, #ffb4a2 80%, var(--text)); }
|
||||
.z-meldung[data-gut="ja"] { color: color-mix(in srgb, #7fd8a0 80%, var(--text)); }
|
||||
|
||||
@@ -236,6 +236,35 @@
|
||||
+ 'der Hände Bescheid — sie können jedes Stück bearbeiten und '
|
||||
+ 'entfernen.',
|
||||
|
||||
/* ---- SICH BEWERBEN STATT SELBST NEHMEN (22.09.2026) ---------
|
||||
Filipe: „die modis und linke hand sollen da nichts uebernehmen
|
||||
koennen von aufgaben ... ich will dass die sich fuer aufgaben
|
||||
bewerben koennen."
|
||||
|
||||
DER WICHTIGSTE SATZ IST „erst_bewerben" — und er ist keine
|
||||
Absage, sondern ein Wegweiser. Wer dort „Das darfst du nicht"
|
||||
läse, hielte sich für ausgeschlossen; tatsächlich gibt es einen
|
||||
Weg, er führt nur über jemanden. */
|
||||
erst_bewerben:
|
||||
'Diese Aufgabe kannst du dir nicht selbst nehmen – aber du kannst '
|
||||
+ 'dich dafür bewerben. DogFather oder die rechte Hand sagen dir '
|
||||
+ 'dann Bescheid.',
|
||||
du_entscheidest_selbst:
|
||||
'Du entscheidest hier selbst, wer was macht – trag dich einfach ein, '
|
||||
+ 'statt dich zu bewerben.',
|
||||
schon_beworben:
|
||||
'Du hast dich schon beworben. Sobald jemand darüber entschieden hat, '
|
||||
+ 'siehst du es hier.',
|
||||
schon_zugeteilt:
|
||||
'Die Aufgabe hast du schon – du musst dich nicht bewerben. Nimm sie '
|
||||
+ 'an oder sag ab, wenn es gerade nicht passt.',
|
||||
keine_bewerbung:
|
||||
'Dazu liegt gerade keine Bewerbung vor. Vielleicht hat sie jemand '
|
||||
+ 'zurückgezogen – lade die Seite neu.',
|
||||
nicht_an_dich_selbst:
|
||||
'Dich selbst kannst du hier nicht eintragen. Bewirb dich dafür, dann '
|
||||
+ 'entscheiden DogFather oder die rechte Hand.',
|
||||
|
||||
/* ---- Zeitraum und vergebene Stücke (22.09.2026) ------------- */
|
||||
schon_im_umlauf:
|
||||
'Das hat sich schon jemand genommen und postet es vielleicht '
|
||||
|
||||
@@ -146,7 +146,16 @@
|
||||
* wenn es nichts zu zeigen gibt. */
|
||||
function karteBlock(a, ich, nachLaden) {
|
||||
var zu = a.zuteilung || [];
|
||||
if (!zu.length) return null;
|
||||
/* BIS ZUM 22.09.2026 STAND HIER `if (!zu.length) return null;`.
|
||||
Das war richtig, solange es an einer Aufgabe ohne Zuteilung
|
||||
nichts zu tun gab. Seit es das Bewerben gibt, ist genau die
|
||||
unverteilte Aufgabe die interessanteste -- und sie haette
|
||||
keinen Platz fuer den Knopf gehabt.
|
||||
|
||||
Leer bleibt der Block trotzdem, wenn wirklich nichts drinsteht:
|
||||
Am Ende wird geprueft, ob ueberhaupt etwas angehaengt wurde. */
|
||||
var darfEntscheiden = !!(ich && ich.darf_entscheiden);
|
||||
var bewerbungen = a.bewerbungen || [];
|
||||
|
||||
var kasten = el('div', 'z-karte');
|
||||
|
||||
@@ -156,12 +165,24 @@
|
||||
kasten.append(el('p', 'z-karte__zeile',
|
||||
a.uebernommen_von + ' hat sie übernommen'));
|
||||
} else if (a.verteilart === 'pool') {
|
||||
kasten.append(el('p', 'z-karte__zeile',
|
||||
'Frei für ' + zu.length + ' Leute — wer zuerst Zeit hat'));
|
||||
/* DER SATZ HING AN EINER REGEL, DIE ES NICHT MEHR GIBT
|
||||
(22.09.2026). „Wer zuerst Zeit hat" war die Beschreibung des
|
||||
Pools, solange sich jeder selbst bedienen durfte. Seit Modis
|
||||
und die linke Hand sich bewerben, stimmt er fuer genau die
|
||||
Leute nicht mehr, die ihn lesen -- und ein Satz, der etwas
|
||||
Falsches verspricht, ist schlimmer als keiner.
|
||||
|
||||
Er sagt deshalb jedem, was FUER IHN gilt. */
|
||||
var angeboten = zu.filter(function (z) { return z.zustand !== 'abgelehnt'; }).length;
|
||||
kasten.append(el('p', 'z-karte__zeile', darfEntscheiden
|
||||
? 'Frei für ' + angeboten + ' Leute — wer zuerst Zeit hat'
|
||||
: 'Frei für ' + angeboten + ' Leute — bewirb dich, wenn du Zeit hast'));
|
||||
}
|
||||
|
||||
var wer = el('ul', 'z-wer');
|
||||
zu.forEach(function (z) {
|
||||
/* Bewerbungen stehen weiter unten in ihrem eigenen Block -- hier
|
||||
noch einmal waeren sie dieselbe Sache zweimal. */
|
||||
zu.filter(function (z) { return z.zustand !== 'beworben'; }).forEach(function (z) {
|
||||
var zeile = el('li', 'z-wer__zeile');
|
||||
zeile.dataset.zustand = z.zustand;
|
||||
zeile.append(el('span', 'z-wer__name', z.person_name || 'Jemand'));
|
||||
@@ -177,9 +198,17 @@
|
||||
zeile.append(b);
|
||||
if (z.bewertung_text) zeile.append(el('span', 'z-wer__grund', z.bewertung_text));
|
||||
}
|
||||
/* WAS DIE LEITUNG DAZU GESAGT HAT. Bei einer angenommenen oder
|
||||
abgelehnten Bewerbung ist das die Antwort auf die Bitte --
|
||||
sie gehoert daneben, nicht hinter einen zweiten Klick. */
|
||||
if (z.entscheid_text) {
|
||||
zeile.append(el('span', 'z-wer__grund',
|
||||
'„' + z.entscheid_text + '"'
|
||||
+ (z.entschieden_von_name ? ' – ' + z.entschieden_von_name : '')));
|
||||
}
|
||||
wer.append(zeile);
|
||||
});
|
||||
kasten.append(wer);
|
||||
if (wer.childElementCount) kasten.append(wer);
|
||||
|
||||
var meldung = el('p', 'z-meldung');
|
||||
meldung.hidden = true;
|
||||
@@ -196,17 +225,80 @@
|
||||
return b;
|
||||
}
|
||||
|
||||
/* SICH BEWERBEN (22.09.2026).
|
||||
|
||||
Filipe: „ich will dass die sich fuer aufgaben bewerben koennen
|
||||
aber die rechte hand oder dogfather muessen annehmen oder
|
||||
ablehnen koennen."
|
||||
|
||||
DER KNOPF STEHT NUR DA, WO ER AUCH ETWAS BEWIRKT. Drei
|
||||
Bedingungen, und jede hat einen Grund:
|
||||
* ich entscheide nicht selbst -- wer entscheidet, traegt
|
||||
sich ein statt zu bitten
|
||||
* ich habe sie noch nicht -- sonst nehme ich an oder ab
|
||||
* sie ist noch frei -- eine Bewerbung auf etwas
|
||||
Vergebenes ist eine
|
||||
Enttaeuschung mit Anlauf
|
||||
|
||||
Der Text ist freiwillig. Beim ABLEHNEN einer zugeteilten
|
||||
Aufgabe ist die Begruendung Pflicht -- dort sagt jemand ab, der
|
||||
gefragt wurde. Hier bittet jemand; ein „bitte" braucht keine
|
||||
Begruendung. */
|
||||
var schonWer = a.uebernommen_von
|
||||
|| zu.some(function (z) {
|
||||
return z.zustand === 'angenommen' || z.zustand === 'arbeit' || z.zustand === 'erledigt';
|
||||
});
|
||||
var kannBewerben = !darfEntscheiden && !a.ich_beworben
|
||||
&& (!mein || mein.zustand === 'abgelehnt'
|
||||
|| (mein.zustand === 'offen' && a.verteilart === 'pool'))
|
||||
&& !(a.verteilart === 'pool' && schonWer);
|
||||
|
||||
if (a.ich_beworben) {
|
||||
kasten.append(el('p', 'z-karte__zeile z-karte__zeile--warte',
|
||||
'Du hast dich beworben — DogFather oder die rechte Hand melden sich.'));
|
||||
knopf('Bewerbung zurückziehen', '', async function (b) {
|
||||
b.disabled = true;
|
||||
var r = await schicken('/workspace/api/aufgaben/' + a.id + '/bewerbung-zurueck');
|
||||
if (r.ok) { nachLaden(); return; }
|
||||
b.disabled = false;
|
||||
sagen(meldung, window.sagWas ? window.sagWas(r.json.fehler) : 'Hat nicht geklappt.', false);
|
||||
});
|
||||
} else if (kannBewerben) {
|
||||
knopf('Ich bewerbe mich', 'knopf--klar', async function () {
|
||||
var antwort = await window.frageNach({
|
||||
titel: 'Für diese Aufgabe bewerben?',
|
||||
was: 'DogFather oder die rechte Hand entscheiden, ob du sie bekommst.',
|
||||
bleibt: 'Du kannst deine Bewerbung jederzeit wieder zurückziehen.',
|
||||
grund: 'Willst du etwas dazuschreiben? (freiwillig)',
|
||||
grundPflicht: false,
|
||||
platzhalter: 'z. B. ich habe Freitag Zeit dafür',
|
||||
ja: 'Bewerben', nein: 'Doch nicht',
|
||||
});
|
||||
if (!antwort) return;
|
||||
var r = await schicken('/workspace/api/aufgaben/' + a.id + '/bewerben',
|
||||
{ text: (antwort && antwort.grund) || '' });
|
||||
if (r.ok) { nachLaden(); return; }
|
||||
sagen(meldung, r.code === 409 && r.json.wer
|
||||
? (r.json.wer + ' war schneller — die Aufgabe ist schon vergeben.')
|
||||
: (window.sagWas ? window.sagWas(r.json.fehler) : 'Hat nicht geklappt.'), false);
|
||||
});
|
||||
}
|
||||
|
||||
if (mein && mein.zustand === 'offen') {
|
||||
if (a.verteilart === 'pool') {
|
||||
knopf('Ich übernehme das', 'knopf--klar', async function (b) {
|
||||
b.disabled = true;
|
||||
var r = await schicken('/workspace/api/aufgaben/' + a.id + '/uebernehmen');
|
||||
if (r.ok) { nachLaden(); return; }
|
||||
b.disabled = false;
|
||||
sagen(meldung, r.code === 409 && r.json.wer
|
||||
? (r.json.wer + ' war schneller — die Aufgabe ist schon vergeben.')
|
||||
: (window.sagWas ? window.sagWas(r.json.fehler) : 'Hat nicht geklappt.'), false);
|
||||
});
|
||||
/* NUR WER ENTSCHEIDET, NIMMT SICH SELBST ETWAS. Fuer alle
|
||||
anderen steht oben der Bewerben-Knopf. */
|
||||
if (darfEntscheiden) {
|
||||
knopf('Ich übernehme das', 'knopf--klar', async function (b) {
|
||||
b.disabled = true;
|
||||
var r = await schicken('/workspace/api/aufgaben/' + a.id + '/uebernehmen');
|
||||
if (r.ok) { nachLaden(); return; }
|
||||
b.disabled = false;
|
||||
sagen(meldung, r.code === 409 && r.json.wer
|
||||
? (r.json.wer + ' war schneller — die Aufgabe ist schon vergeben.')
|
||||
: (window.sagWas ? window.sagWas(r.json.fehler) : 'Hat nicht geklappt.'), false);
|
||||
});
|
||||
}
|
||||
} else {
|
||||
knopf('Annehmen', 'knopf--klar', async function (b) {
|
||||
b.disabled = true;
|
||||
@@ -216,6 +308,10 @@
|
||||
sagen(meldung, window.sagWas ? window.sagWas(r.json.fehler) : 'Hat nicht geklappt.', false);
|
||||
});
|
||||
}
|
||||
/* ABLEHNEN GIBT ES NUR, WO ETWAS ZUGETRAGEN WURDE. Bei einer
|
||||
Pool-Aufgabe, fuer die man sich bewerben soll, waere „Ablehnen"
|
||||
eine Absage auf eine Frage, die niemand gestellt hat. */
|
||||
if (!(a.verteilart === 'pool' && !darfEntscheiden))
|
||||
knopf('Ablehnen', '', async function () {
|
||||
/* MIT BEGRÜNDUNG, und sie ist Pflicht -- der Server lehnt
|
||||
sonst ab. Der Dialog sagt das VOR dem Tippen, statt es
|
||||
@@ -258,6 +354,66 @@
|
||||
});
|
||||
}
|
||||
|
||||
/* (2b) DIE BEWERBUNGEN — nur fuer die, die entscheiden duerfen.
|
||||
|
||||
JEDE BEWERBUNG BEKOMMT IHRE EIGENE ZEILE mit zwei Knoepfen.
|
||||
Eine Auswahlliste mit einem Absenden-Knopf waere kuerzer und
|
||||
falsch: Man entscheidet ueber einen Menschen, nicht ueber einen
|
||||
Listeneintrag -- und wer drei Bewerbungen hat, will jede
|
||||
einzeln beantworten koennen.
|
||||
|
||||
DER KOMMENTAR IST FREIWILLIG, bei beiden Knoepfen. Filipes Wort
|
||||
ist „als moeglichkeit". */
|
||||
if (darfEntscheiden && bewerbungen.length) {
|
||||
var bBlock = el('div', 'z-bewerbungen');
|
||||
bBlock.append(el('p', 'z-bewerbungen__schild',
|
||||
bewerbungen.length === 1
|
||||
? 'Eine Bewerbung wartet auf deine Antwort:'
|
||||
: bewerbungen.length + ' Bewerbungen warten auf deine Antwort:'));
|
||||
|
||||
bewerbungen.forEach(function (z) {
|
||||
var wem = z.person_name || 'Jemand';
|
||||
var reihe = el('div', 'z-bewerbung');
|
||||
reihe.append(el('span', 'z-bewerbung__name', wem));
|
||||
if (z.grund) reihe.append(el('span', 'z-bewerbung__wort', '„' + z.grund + '"'));
|
||||
|
||||
[['annehmen', 'Annehmen', 'knopf--klar'],
|
||||
['ablehnen', 'Ablehnen', ''],
|
||||
].forEach(function (w) {
|
||||
var weg = w[0], schild = w[1], klasse = w[2];
|
||||
var b = el('button', 'knopf knopf--klein ' + klasse, schild);
|
||||
b.type = 'button';
|
||||
b.addEventListener('click', async function () {
|
||||
var antwort = await window.frageNach({
|
||||
titel: schild + ' — ' + wem,
|
||||
was: weg === 'annehmen'
|
||||
? wem + ' bekommt die Aufgabe und wird benachrichtigt.'
|
||||
: wem + ' bekommt sie nicht. Die Aufgabe bleibt frei.',
|
||||
bleibt: 'Dein Kommentar bleibt an der Aufgabe stehen und '
|
||||
+ wem + ' kann ihn lesen.',
|
||||
grund: 'Willst du etwas dazuschreiben? (freiwillig)',
|
||||
grundPflicht: false,
|
||||
platzhalter: weg === 'annehmen'
|
||||
? 'z. B. danke dir, mach das gern'
|
||||
: 'z. B. das macht diesmal jemand anders',
|
||||
ja: schild, nein: 'Abbrechen',
|
||||
});
|
||||
if (!antwort) return;
|
||||
var r = await schicken(
|
||||
'/workspace/api/aufgaben/' + a.id + '/bewerbung/' + weg,
|
||||
{ person_id: z.person_id, kommentar: (antwort && antwort.grund) || '' });
|
||||
if (r.ok) { nachLaden(); return; }
|
||||
sagen(meldung, r.code === 409 && r.json.wer
|
||||
? (r.json.wer + ' hat sie inzwischen — die Bewerbung ist hinfällig.')
|
||||
: (window.sagWas ? window.sagWas(r.json.fehler) : 'Hat nicht geklappt.'), false);
|
||||
});
|
||||
reihe.append(b);
|
||||
});
|
||||
bBlock.append(reihe);
|
||||
});
|
||||
kasten.append(bBlock);
|
||||
}
|
||||
|
||||
/* (3) BEWERTEN -- nur wer verteilen darf, und nur bei Menschen,
|
||||
die wirklich fertig sind. */
|
||||
if (ich && ich.darf_verteilen) {
|
||||
@@ -315,6 +471,10 @@
|
||||
}
|
||||
|
||||
if (knoepfe.childElementCount) kasten.append(knoepfe);
|
||||
/* NICHTS ZU ZEIGEN HEISST NICHTS ZEIGEN. Seit der Block auch bei
|
||||
Aufgaben ohne Zuteilung gebaut wird, kann er leer bleiben -- ein
|
||||
leerer Kasten unter jeder Karte waere Rauschen. */
|
||||
if (!kasten.childElementCount) return null;
|
||||
kasten.append(meldung);
|
||||
return kasten;
|
||||
}
|
||||
|
||||
+18
-18
@@ -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=202609221515" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609221515" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609221515" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609221515" />
|
||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609221515" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?v=202609221515" />
|
||||
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609221855" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609221855" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609221855" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609221855" />
|
||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609221855" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?v=202609221855" />
|
||||
<!-- 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=202609221515" />
|
||||
<link rel="stylesheet" href="assets/css/haus.css?v=202609221855" />
|
||||
</head>
|
||||
|
||||
<body class="start">
|
||||
@@ -367,17 +367,17 @@
|
||||
<!-- TEXTFORM ZUERST (21.09.2026): Die Seite fragt beim Zeichnen nach
|
||||
`window.Textform`. Kaeme sie spaeter, waere der erste Eintrag ohne
|
||||
Gestaltung. Kein `defer`, damit sie wirklich vorher dasteht. -->
|
||||
<script src="assets/js/textform.js?v=202609221515"></script>
|
||||
<script src="assets/js/meldung.js?v=202609221515" defer></script>
|
||||
<script src="assets/js/hochladen.js?v=202609221515" defer></script>
|
||||
<script src="assets/js/nachfrage.js?v=202609221515" defer></script>
|
||||
<script src="assets/js/textform.js?v=202609221855"></script>
|
||||
<script src="assets/js/meldung.js?v=202609221855" defer></script>
|
||||
<script src="assets/js/hochladen.js?v=202609221855" defer></script>
|
||||
<script src="assets/js/nachfrage.js?v=202609221855" defer></script>
|
||||
|
||||
<script src="assets/js/wahl.js?v=202609221515" defer></script>
|
||||
<script src="assets/js/bereiche.js?v=202609221515" defer></script>
|
||||
<script src="assets/js/installieren.js?v=202609221515" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609221515" defer></script>
|
||||
<script src="assets/js/glocke.js?v=202609221515" defer></script>
|
||||
<script src="assets/js/zuteilung.js?v=202609221515" defer></script>
|
||||
<script src="assets/js/aufgaben.js?v=202609221515" defer></script>
|
||||
<script src="assets/js/wahl.js?v=202609221855" defer></script>
|
||||
<script src="assets/js/bereiche.js?v=202609221855" defer></script>
|
||||
<script src="assets/js/installieren.js?v=202609221855" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609221855" defer></script>
|
||||
<script src="assets/js/glocke.js?v=202609221855" defer></script>
|
||||
<script src="assets/js/zuteilung.js?v=202609221855" defer></script>
|
||||
<script src="assets/js/aufgaben.js?v=202609221855" defer></script>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
+16
-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=202609221515" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609221515" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609221515" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609221515" />
|
||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609221515" />
|
||||
<link rel="stylesheet" href="assets/css/automation.css?v=202609221515" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?v=202609221515" />
|
||||
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609221855" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609221855" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609221855" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609221855" />
|
||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609221855" />
|
||||
<link rel="stylesheet" href="assets/css/automation.css?v=202609221855" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?v=202609221855" />
|
||||
<!-- 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=202609221515" />
|
||||
<link rel="stylesheet" href="assets/css/haus.css?v=202609221855" />
|
||||
</head>
|
||||
|
||||
<body class="start">
|
||||
@@ -168,15 +168,15 @@
|
||||
|
||||
</main>
|
||||
|
||||
<script src="assets/js/meldung.js?v=202609221515" defer></script>
|
||||
<script src="assets/js/nachfrage.js?v=202609221515" defer></script>
|
||||
<script src="assets/js/meldung.js?v=202609221855" defer></script>
|
||||
<script src="assets/js/nachfrage.js?v=202609221855" defer></script>
|
||||
|
||||
|
||||
<script src="assets/js/wahl.js?v=202609221515" defer></script>
|
||||
<script src="assets/js/bereiche.js?v=202609221515" defer></script>
|
||||
<script src="assets/js/installieren.js?v=202609221515" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609221515" defer></script>
|
||||
<script src="assets/js/glocke.js?v=202609221515" defer></script>
|
||||
<script src="assets/js/automation.js?v=202609221515" defer></script>
|
||||
<script src="assets/js/wahl.js?v=202609221855" defer></script>
|
||||
<script src="assets/js/bereiche.js?v=202609221855" defer></script>
|
||||
<script src="assets/js/installieren.js?v=202609221855" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609221855" defer></script>
|
||||
<script src="assets/js/glocke.js?v=202609221855" defer></script>
|
||||
<script src="assets/js/automation.js?v=202609221855" defer></script>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
+15
-15
@@ -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=202609221515" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609221515" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609221515" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609221515" />
|
||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609221515" />
|
||||
<link rel="stylesheet" href="assets/css/entwicklung.css?v=202609221515" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?v=202609221515" />
|
||||
<link rel="stylesheet" href="assets/css/haus.css?v=202609221515" />
|
||||
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609221855" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609221855" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609221855" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609221855" />
|
||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609221855" />
|
||||
<link rel="stylesheet" href="assets/css/entwicklung.css?v=202609221855" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?v=202609221855" />
|
||||
<link rel="stylesheet" href="assets/css/haus.css?v=202609221855" />
|
||||
</head>
|
||||
|
||||
<body class="start">
|
||||
@@ -180,14 +180,14 @@
|
||||
|
||||
</main>
|
||||
|
||||
<script src="assets/js/meldung.js?v=202609221515" defer></script>
|
||||
<script src="assets/js/nachfrage.js?v=202609221515" defer></script>
|
||||
<script src="assets/js/meldung.js?v=202609221855" defer></script>
|
||||
<script src="assets/js/nachfrage.js?v=202609221855" defer></script>
|
||||
|
||||
|
||||
<script src="assets/js/wahl.js?v=202609221515" defer></script>
|
||||
<script src="assets/js/bereiche.js?v=202609221515" defer></script>
|
||||
<script src="assets/js/installieren.js?v=202609221515" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609221515" defer></script>
|
||||
<script src="assets/js/befinden.js?v=202609221515" defer></script>
|
||||
<script src="assets/js/wahl.js?v=202609221855" defer></script>
|
||||
<script src="assets/js/bereiche.js?v=202609221855" defer></script>
|
||||
<script src="assets/js/installieren.js?v=202609221855" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609221855" defer></script>
|
||||
<script src="assets/js/befinden.js?v=202609221855" defer></script>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
+21
-21
@@ -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=202609221515" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609221515" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609221515" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609221515" />
|
||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609221515" />
|
||||
<link rel="stylesheet" href="assets/css/bereich.css?v=202609221515" />
|
||||
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609221855" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609221855" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609221855" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609221855" />
|
||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609221855" />
|
||||
<link rel="stylesheet" href="assets/css/bereich.css?v=202609221855" />
|
||||
<!-- 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=202609221515" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?v=202609221515" />
|
||||
<link rel="stylesheet" href="assets/css/bewerbung.css?v=202609221855" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?v=202609221855" />
|
||||
<!-- 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=202609221515" />
|
||||
<link rel="stylesheet" href="assets/css/haus.css?v=202609221855" />
|
||||
</head>
|
||||
|
||||
<body class="start">
|
||||
@@ -304,18 +304,18 @@
|
||||
<!-- TEXTFORM ZUERST (21.09.2026): Die Seite fragt beim Zeichnen nach
|
||||
`window.Textform`. Kaeme sie spaeter, waere der erste Eintrag ohne
|
||||
Gestaltung. Kein `defer`, damit sie wirklich vorher dasteht. -->
|
||||
<script src="assets/js/textform.js?v=202609221515"></script>
|
||||
<script src="assets/js/meldung.js?v=202609221515" defer></script>
|
||||
<script src="assets/js/nachfrage.js?v=202609221515" defer></script>
|
||||
<script src="assets/js/textform.js?v=202609221855"></script>
|
||||
<script src="assets/js/meldung.js?v=202609221855" defer></script>
|
||||
<script src="assets/js/nachfrage.js?v=202609221855" defer></script>
|
||||
|
||||
<script src="assets/js/wahl.js?v=202609221515" defer></script>
|
||||
<script src="assets/js/bereiche.js?v=202609221515" defer></script>
|
||||
<script src="assets/js/installieren.js?v=202609221515" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609221515" defer></script>
|
||||
<script src="assets/js/glocke.js?v=202609221515" defer></script>
|
||||
<script src="assets/js/checkliste.js?v=202609221515" defer></script>
|
||||
<script src="assets/js/ampel.js?v=202609221515" defer></script>
|
||||
<script src="assets/js/schulung.js?v=202609221515" defer></script>
|
||||
<script src="assets/js/bereich.js?v=202609221515" defer></script>
|
||||
<script src="assets/js/wahl.js?v=202609221855" defer></script>
|
||||
<script src="assets/js/bereiche.js?v=202609221855" defer></script>
|
||||
<script src="assets/js/installieren.js?v=202609221855" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609221855" defer></script>
|
||||
<script src="assets/js/glocke.js?v=202609221855" defer></script>
|
||||
<script src="assets/js/checkliste.js?v=202609221855" defer></script>
|
||||
<script src="assets/js/ampel.js?v=202609221855" defer></script>
|
||||
<script src="assets/js/schulung.js?v=202609221855" defer></script>
|
||||
<script src="assets/js/bereich.js?v=202609221855" defer></script>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
+18
-18
@@ -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=202609221515" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609221515" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609221515" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609221515" />
|
||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609221515" />
|
||||
<link rel="stylesheet" href="assets/css/bereich.css?v=202609221515" />
|
||||
<link rel="stylesheet" href="assets/css/treff.css?v=202609221515" />
|
||||
<link rel="stylesheet" href="assets/css/bewerbung.css?v=202609221515" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?v=202609221515" />
|
||||
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609221855" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609221855" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609221855" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609221855" />
|
||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609221855" />
|
||||
<link rel="stylesheet" href="assets/css/bereich.css?v=202609221855" />
|
||||
<link rel="stylesheet" href="assets/css/treff.css?v=202609221855" />
|
||||
<link rel="stylesheet" href="assets/css/bewerbung.css?v=202609221855" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?v=202609221855" />
|
||||
<!-- haus.css MUSS die letzte Stilvorlage sein - siehe treff-regeln.html. -->
|
||||
<link rel="stylesheet" href="assets/css/haus.css?v=202609221515" />
|
||||
<link rel="stylesheet" href="assets/css/haus.css?v=202609221855" />
|
||||
</head>
|
||||
|
||||
<body class="start">
|
||||
@@ -108,14 +108,14 @@
|
||||
</main>
|
||||
|
||||
<!-- Der Fuß gehört zu jeder Seite - siehe pruef-css-klassen. -->
|
||||
<script src="assets/js/meldung.js?v=202609221515" defer></script>
|
||||
<script src="assets/js/nachfrage.js?v=202609221515" defer></script>
|
||||
<script src="assets/js/meldung.js?v=202609221855" defer></script>
|
||||
<script src="assets/js/nachfrage.js?v=202609221855" defer></script>
|
||||
|
||||
<script src="assets/js/wahl.js?v=202609221515" defer></script>
|
||||
<script src="assets/js/bereiche.js?v=202609221515" defer></script>
|
||||
<script src="assets/js/installieren.js?v=202609221515" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609221515" defer></script>
|
||||
<script src="assets/js/auskunft.js?v=202609221515" defer></script>
|
||||
<script src="assets/js/bewerben.js?v=202609221515" defer></script>
|
||||
<script src="assets/js/wahl.js?v=202609221855" defer></script>
|
||||
<script src="assets/js/bereiche.js?v=202609221855" defer></script>
|
||||
<script src="assets/js/installieren.js?v=202609221855" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609221855" defer></script>
|
||||
<script src="assets/js/auskunft.js?v=202609221855" defer></script>
|
||||
<script src="assets/js/bewerben.js?v=202609221855" defer></script>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
+17
-17
@@ -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=202609221515" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609221515" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609221515" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609221515" />
|
||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609221515" />
|
||||
<link rel="stylesheet" href="assets/css/entwicklung.css?v=202609221515" />
|
||||
<link rel="stylesheet" href="assets/css/bewerbung.css?v=202609221515" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?v=202609221515" />
|
||||
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609221855" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609221855" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609221855" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609221855" />
|
||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609221855" />
|
||||
<link rel="stylesheet" href="assets/css/entwicklung.css?v=202609221855" />
|
||||
<link rel="stylesheet" href="assets/css/bewerbung.css?v=202609221855" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?v=202609221855" />
|
||||
<!-- haus.css MUSS die letzte Stilvorlage sein - siehe treff-regeln.html. -->
|
||||
<link rel="stylesheet" href="assets/css/haus.css?v=202609221515" />
|
||||
<link rel="stylesheet" href="assets/css/haus.css?v=202609221855" />
|
||||
</head>
|
||||
|
||||
<body class="start">
|
||||
@@ -80,15 +80,15 @@
|
||||
|
||||
</main>
|
||||
|
||||
<script src="assets/js/meldung.js?v=202609221515" defer></script>
|
||||
<script src="assets/js/nachfrage.js?v=202609221515" defer></script>
|
||||
<script src="assets/js/meldung.js?v=202609221855" defer></script>
|
||||
<script src="assets/js/nachfrage.js?v=202609221855" defer></script>
|
||||
|
||||
|
||||
<script src="assets/js/wahl.js?v=202609221515" defer></script>
|
||||
<script src="assets/js/bereiche.js?v=202609221515" defer></script>
|
||||
<script src="assets/js/installieren.js?v=202609221515" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609221515" defer></script>
|
||||
<script src="assets/js/auskunft.js?v=202609221515" defer></script>
|
||||
<script src="assets/js/bewerbungen.js?v=202609221515" defer></script>
|
||||
<script src="assets/js/wahl.js?v=202609221855" defer></script>
|
||||
<script src="assets/js/bereiche.js?v=202609221855" defer></script>
|
||||
<script src="assets/js/installieren.js?v=202609221855" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609221855" defer></script>
|
||||
<script src="assets/js/auskunft.js?v=202609221855" defer></script>
|
||||
<script src="assets/js/bewerbungen.js?v=202609221855" defer></script>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
+17
-17
@@ -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=202609221515" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609221515" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609221515" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609221515" />
|
||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609221515" />
|
||||
<link rel="stylesheet" href="assets/css/calls.css?v=202609221515" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?v=202609221515" />
|
||||
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609221855" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609221855" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609221855" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609221855" />
|
||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609221855" />
|
||||
<link rel="stylesheet" href="assets/css/calls.css?v=202609221855" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?v=202609221855" />
|
||||
<!-- 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=202609221515" />
|
||||
<link rel="stylesheet" href="assets/css/haus.css?v=202609221855" />
|
||||
</head>
|
||||
|
||||
<body class="start">
|
||||
@@ -89,15 +89,15 @@
|
||||
|
||||
</main>
|
||||
|
||||
<script src="assets/js/meldung.js?v=202609221515" defer></script>
|
||||
<script src="assets/js/nachfrage.js?v=202609221515" defer></script>
|
||||
<script src="assets/js/meldung.js?v=202609221855" defer></script>
|
||||
<script src="assets/js/nachfrage.js?v=202609221855" defer></script>
|
||||
|
||||
<script src="assets/js/ki.js?v=202609221515" defer></script>
|
||||
<script src="assets/js/wahl.js?v=202609221515" defer></script>
|
||||
<script src="assets/js/bereiche.js?v=202609221515" defer></script>
|
||||
<script src="assets/js/installieren.js?v=202609221515" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609221515" defer></script>
|
||||
<script src="assets/js/glocke.js?v=202609221515" defer></script>
|
||||
<script src="assets/js/calls.js?v=202609221515" defer></script>
|
||||
<script src="assets/js/ki.js?v=202609221855" defer></script>
|
||||
<script src="assets/js/wahl.js?v=202609221855" defer></script>
|
||||
<script src="assets/js/bereiche.js?v=202609221855" defer></script>
|
||||
<script src="assets/js/installieren.js?v=202609221855" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609221855" defer></script>
|
||||
<script src="assets/js/glocke.js?v=202609221855" defer></script>
|
||||
<script src="assets/js/calls.js?v=202609221855" defer></script>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
+19
-19
@@ -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=202609221515" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609221515" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609221515" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609221515" />
|
||||
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609221855" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609221855" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609221855" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609221855" />
|
||||
<!-- 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=202609221515" />
|
||||
<link rel="stylesheet" href="assets/css/chat.css?v=202609221515" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?v=202609221515" />
|
||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609221855" />
|
||||
<link rel="stylesheet" href="assets/css/chat.css?v=202609221855" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?v=202609221855" />
|
||||
<!-- 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=202609221515" />
|
||||
<link rel="stylesheet" href="assets/css/haus.css?v=202609221855" />
|
||||
</head>
|
||||
|
||||
<body class="start">
|
||||
@@ -415,25 +415,25 @@
|
||||
</form>
|
||||
</dialog>
|
||||
|
||||
<script src="assets/js/bereiche.js?v=202609221515"></script>
|
||||
<script src="assets/js/bereiche.js?v=202609221855"></script>
|
||||
<!-- TEXTFORM VOR ALLEM ANDEREN (21.09.2026): chat.js und bereich.js
|
||||
fragen beim Zeichnen nach `window.Textform`. Kaeme sie spaeter,
|
||||
waere die erste gezeichnete Nachricht ohne Gestaltung -- und das
|
||||
faellt nur dem auf, der genau hinsieht. KEIN `defer`, damit sie
|
||||
wirklich vor den anderen dasteht. -->
|
||||
<script src="assets/js/textform.js?v=202609221515"></script>
|
||||
<script src="assets/js/meldung.js?v=202609221515" defer></script>
|
||||
<script src="assets/js/hochladen.js?v=202609221515" defer></script>
|
||||
<script src="assets/js/nachfrage.js?v=202609221515" defer></script>
|
||||
<script src="assets/js/wahl.js?v=202609221515" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609221515"></script>
|
||||
<script src="assets/js/glocke.js?v=202609221515"></script>
|
||||
<script src="assets/js/textform.js?v=202609221855"></script>
|
||||
<script src="assets/js/meldung.js?v=202609221855" defer></script>
|
||||
<script src="assets/js/hochladen.js?v=202609221855" defer></script>
|
||||
<script src="assets/js/nachfrage.js?v=202609221855" defer></script>
|
||||
<script src="assets/js/wahl.js?v=202609221855" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609221855"></script>
|
||||
<script src="assets/js/glocke.js?v=202609221855"></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=202609221515"></script>
|
||||
<script src="assets/js/chat.js?v=202609221515"></script>
|
||||
<script src="assets/js/installieren.js?v=202609221515" defer></script>
|
||||
<script src="assets/js/anruf.js?v=202609221855"></script>
|
||||
<script src="assets/js/chat.js?v=202609221855"></script>
|
||||
<script src="assets/js/installieren.js?v=202609221855" defer></script>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
+17
-17
@@ -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=202609221515" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609221515" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609221515" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609221515" />
|
||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609221515" />
|
||||
<link rel="stylesheet" href="assets/css/content.css?v=202609221515" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?v=202609221515" />
|
||||
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609221855" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609221855" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609221855" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609221855" />
|
||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609221855" />
|
||||
<link rel="stylesheet" href="assets/css/content.css?v=202609221855" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?v=202609221855" />
|
||||
<!-- 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=202609221515" />
|
||||
<link rel="stylesheet" href="assets/css/haus.css?v=202609221855" />
|
||||
</head>
|
||||
|
||||
<body class="start">
|
||||
@@ -179,15 +179,15 @@
|
||||
|
||||
</main>
|
||||
|
||||
<script src="assets/js/meldung.js?v=202609221515" defer></script>
|
||||
<script src="assets/js/nachfrage.js?v=202609221515" defer></script>
|
||||
<script src="assets/js/meldung.js?v=202609221855" defer></script>
|
||||
<script src="assets/js/nachfrage.js?v=202609221855" defer></script>
|
||||
|
||||
<script src="assets/js/wahl.js?v=202609221515" defer></script>
|
||||
<script src="assets/js/bereiche.js?v=202609221515" defer></script>
|
||||
<script src="assets/js/installieren.js?v=202609221515" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609221515" defer></script>
|
||||
<script src="assets/js/glocke.js?v=202609221515" defer></script>
|
||||
<script src="assets/js/checkliste.js?v=202609221515" defer></script>
|
||||
<script src="assets/js/content.js?v=202609221515" defer></script>
|
||||
<script src="assets/js/wahl.js?v=202609221855" defer></script>
|
||||
<script src="assets/js/bereiche.js?v=202609221855" defer></script>
|
||||
<script src="assets/js/installieren.js?v=202609221855" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609221855" defer></script>
|
||||
<script src="assets/js/glocke.js?v=202609221855" defer></script>
|
||||
<script src="assets/js/checkliste.js?v=202609221855" defer></script>
|
||||
<script src="assets/js/content.js?v=202609221855" 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=202609221515" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/crew-180.png?v=202609221515" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609221515" />
|
||||
<link rel="icon" type="image/png" href="/assets/img/app-symbole/crew-32.png?v=202609221855" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/crew-180.png?v=202609221855" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609221855" />
|
||||
<!-- 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=202609221515" />
|
||||
<link rel="stylesheet" href="assets/css/crew-haus.css?v=202609221855" />
|
||||
</head>
|
||||
|
||||
<body class="gate gate--crew">
|
||||
@@ -459,7 +459,7 @@
|
||||
|
||||
|
||||
|
||||
<script src="assets/js/gate.js?v=202609221515" defer></script>
|
||||
<script src="assets/js/installieren.js?v=202609221515" defer></script>
|
||||
<script src="assets/js/gate.js?v=202609221855" defer></script>
|
||||
<script src="assets/js/installieren.js?v=202609221855" defer></script>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
@@ -23,25 +23,25 @@
|
||||
},
|
||||
"icons": [
|
||||
{
|
||||
"src": "/assets/img/app-symbole/crew-192.png?v=202609221515",
|
||||
"src": "/assets/img/app-symbole/crew-192.png?v=202609221855",
|
||||
"sizes": "192x192",
|
||||
"type": "image/png",
|
||||
"purpose": "any"
|
||||
},
|
||||
{
|
||||
"src": "/assets/img/app-symbole/crew-512.png?v=202609221515",
|
||||
"src": "/assets/img/app-symbole/crew-512.png?v=202609221855",
|
||||
"sizes": "512x512",
|
||||
"type": "image/png",
|
||||
"purpose": "any"
|
||||
},
|
||||
{
|
||||
"src": "/assets/img/app-symbole/crew-192-maskable.png?v=202609221515",
|
||||
"src": "/assets/img/app-symbole/crew-192-maskable.png?v=202609221855",
|
||||
"sizes": "192x192",
|
||||
"type": "image/png",
|
||||
"purpose": "maskable"
|
||||
},
|
||||
{
|
||||
"src": "/assets/img/app-symbole/crew-512-maskable.png?v=202609221515",
|
||||
"src": "/assets/img/app-symbole/crew-512-maskable.png?v=202609221855",
|
||||
"sizes": "512x512",
|
||||
"type": "image/png",
|
||||
"purpose": "maskable"
|
||||
|
||||
+17
-17
@@ -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=202609221515" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609221515" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609221515" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609221515" />
|
||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609221515" />
|
||||
<link rel="stylesheet" href="assets/css/dateien.css?v=202609221515" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?v=202609221515" />
|
||||
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609221855" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609221855" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609221855" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609221855" />
|
||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609221855" />
|
||||
<link rel="stylesheet" href="assets/css/dateien.css?v=202609221855" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?v=202609221855" />
|
||||
<!-- 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=202609221515" />
|
||||
<link rel="stylesheet" href="assets/css/haus.css?v=202609221855" />
|
||||
</head>
|
||||
|
||||
<body class="start">
|
||||
@@ -108,15 +108,15 @@
|
||||
|
||||
</main>
|
||||
|
||||
<script src="assets/js/meldung.js?v=202609221515" defer></script>
|
||||
<script src="assets/js/hochladen.js?v=202609221515" defer></script>
|
||||
<script src="assets/js/nachfrage.js?v=202609221515" defer></script>
|
||||
<script src="assets/js/meldung.js?v=202609221855" defer></script>
|
||||
<script src="assets/js/hochladen.js?v=202609221855" defer></script>
|
||||
<script src="assets/js/nachfrage.js?v=202609221855" defer></script>
|
||||
|
||||
<script src="assets/js/wahl.js?v=202609221515" defer></script>
|
||||
<script src="assets/js/bereiche.js?v=202609221515" defer></script>
|
||||
<script src="assets/js/installieren.js?v=202609221515" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609221515" defer></script>
|
||||
<script src="assets/js/glocke.js?v=202609221515" defer></script>
|
||||
<script src="assets/js/dateien.js?v=202609221515" defer></script>
|
||||
<script src="assets/js/wahl.js?v=202609221855" defer></script>
|
||||
<script src="assets/js/bereiche.js?v=202609221855" defer></script>
|
||||
<script src="assets/js/installieren.js?v=202609221855" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609221855" defer></script>
|
||||
<script src="assets/js/glocke.js?v=202609221855" defer></script>
|
||||
<script src="assets/js/dateien.js?v=202609221855" defer></script>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
+15
-15
@@ -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=202609221515" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609221515" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609221515" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609221515" />
|
||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609221515" />
|
||||
<link rel="stylesheet" href="assets/css/entwicklung.css?v=202609221515" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?v=202609221515" />
|
||||
<link rel="stylesheet" href="assets/css/haus.css?v=202609221515" />
|
||||
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609221855" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609221855" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609221855" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609221855" />
|
||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609221855" />
|
||||
<link rel="stylesheet" href="assets/css/entwicklung.css?v=202609221855" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?v=202609221855" />
|
||||
<link rel="stylesheet" href="assets/css/haus.css?v=202609221855" />
|
||||
</head>
|
||||
|
||||
<body class="start">
|
||||
@@ -132,14 +132,14 @@
|
||||
|
||||
</main>
|
||||
|
||||
<script src="assets/js/meldung.js?v=202609221515" defer></script>
|
||||
<script src="assets/js/nachfrage.js?v=202609221515" defer></script>
|
||||
<script src="assets/js/meldung.js?v=202609221855" defer></script>
|
||||
<script src="assets/js/nachfrage.js?v=202609221855" defer></script>
|
||||
|
||||
|
||||
<script src="assets/js/wahl.js?v=202609221515" defer></script>
|
||||
<script src="assets/js/bereiche.js?v=202609221515" defer></script>
|
||||
<script src="assets/js/installieren.js?v=202609221515" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609221515" defer></script>
|
||||
<script src="assets/js/entwicklung.js?v=202609221515" defer></script>
|
||||
<script src="assets/js/wahl.js?v=202609221855" defer></script>
|
||||
<script src="assets/js/bereiche.js?v=202609221855" defer></script>
|
||||
<script src="assets/js/installieren.js?v=202609221855" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609221855" defer></script>
|
||||
<script src="assets/js/entwicklung.js?v=202609221855" defer></script>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
+14
-14
@@ -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=202609221515" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609221515" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609221515" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609221515" />
|
||||
<link rel="stylesheet" href="assets/css/hilfe.css?v=202609221515" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?v=202609221515" />
|
||||
<link rel="stylesheet" href="assets/css/haus.css?v=202609221515" />
|
||||
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609221855" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609221855" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609221855" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609221855" />
|
||||
<link rel="stylesheet" href="assets/css/hilfe.css?v=202609221855" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?v=202609221855" />
|
||||
<link rel="stylesheet" href="assets/css/haus.css?v=202609221855" />
|
||||
</head>
|
||||
|
||||
<body class="start">
|
||||
@@ -146,13 +146,13 @@
|
||||
|
||||
</main>
|
||||
|
||||
<script src="assets/js/meldung.js?v=202609221515" defer></script>
|
||||
<script src="assets/js/nachfrage.js?v=202609221515" defer></script>
|
||||
<script src="assets/js/meldung.js?v=202609221855" defer></script>
|
||||
<script src="assets/js/nachfrage.js?v=202609221855" defer></script>
|
||||
|
||||
<script src="assets/js/wahl.js?v=202609221515" defer></script>
|
||||
<script src="assets/js/bereiche.js?v=202609221515" defer></script>
|
||||
<script src="assets/js/installieren.js?v=202609221515" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609221515" defer></script>
|
||||
<script src="assets/js/hilfe.js?v=202609221515" defer></script>
|
||||
<script src="assets/js/wahl.js?v=202609221855" defer></script>
|
||||
<script src="assets/js/bereiche.js?v=202609221855" defer></script>
|
||||
<script src="assets/js/installieren.js?v=202609221855" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609221855" defer></script>
|
||||
<script src="assets/js/hilfe.js?v=202609221855" 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=202609221515" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609221515" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609221515" />
|
||||
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609221855" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609221855" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609221855" />
|
||||
</head>
|
||||
|
||||
<body class="gate">
|
||||
@@ -427,7 +427,7 @@
|
||||
|
||||
|
||||
|
||||
<script src="assets/js/gate.js?v=202609221515" defer></script>
|
||||
<script src="assets/js/installieren.js?v=202609221515" defer></script>
|
||||
<script src="assets/js/gate.js?v=202609221855" defer></script>
|
||||
<script src="assets/js/installieren.js?v=202609221855" defer></script>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
+17
-17
@@ -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=202609221515" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609221515" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609221515" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609221515" />
|
||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609221515" />
|
||||
<link rel="stylesheet" href="assets/css/kalender.css?v=202609221515" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?v=202609221515" />
|
||||
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609221855" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609221855" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609221855" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609221855" />
|
||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609221855" />
|
||||
<link rel="stylesheet" href="assets/css/kalender.css?v=202609221855" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?v=202609221855" />
|
||||
<!-- 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=202609221515" />
|
||||
<link rel="stylesheet" href="assets/css/haus.css?v=202609221855" />
|
||||
</head>
|
||||
|
||||
<body class="start">
|
||||
@@ -383,15 +383,15 @@
|
||||
|
||||
</main>
|
||||
|
||||
<script src="assets/js/meldung.js?v=202609221515" defer></script>
|
||||
<script src="assets/js/nachfrage.js?v=202609221515" defer></script>
|
||||
<script src="assets/js/meldung.js?v=202609221855" defer></script>
|
||||
<script src="assets/js/nachfrage.js?v=202609221855" defer></script>
|
||||
|
||||
<script src="assets/js/wahl.js?v=202609221515" defer></script>
|
||||
<script src="assets/js/bereiche.js?v=202609221515" defer></script>
|
||||
<script src="assets/js/installieren.js?v=202609221515" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609221515" defer></script>
|
||||
<script src="assets/js/glocke.js?v=202609221515" defer></script>
|
||||
<script src="assets/js/kalender.js?v=202609221515" defer></script>
|
||||
<script src="assets/js/kalender-abo.js?v=202609221515" defer></script>
|
||||
<script src="assets/js/wahl.js?v=202609221855" defer></script>
|
||||
<script src="assets/js/bereiche.js?v=202609221855" defer></script>
|
||||
<script src="assets/js/installieren.js?v=202609221855" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609221855" defer></script>
|
||||
<script src="assets/js/glocke.js?v=202609221855" defer></script>
|
||||
<script src="assets/js/kalender.js?v=202609221855" defer></script>
|
||||
<script src="assets/js/kalender-abo.js?v=202609221855" defer></script>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
+16
-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=202609221515" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609221515" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609221515" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609221515" />
|
||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609221515" />
|
||||
<link rel="stylesheet" href="assets/css/leistung.css?v=202609221515" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?v=202609221515" />
|
||||
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609221855" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609221855" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609221855" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609221855" />
|
||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609221855" />
|
||||
<link rel="stylesheet" href="assets/css/leistung.css?v=202609221855" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?v=202609221855" />
|
||||
<!-- 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=202609221515" />
|
||||
<link rel="stylesheet" href="assets/css/haus.css?v=202609221855" />
|
||||
</head>
|
||||
|
||||
<body class="start">
|
||||
@@ -444,13 +444,13 @@
|
||||
</form>
|
||||
</dialog>
|
||||
|
||||
<script src="assets/js/meldung.js?v=202609221515"></script>
|
||||
<script src="assets/js/nachfrage.js?v=202609221515"></script>
|
||||
<script src="assets/js/wahl.js?v=202609221515"></script>
|
||||
<script src="assets/js/bereiche.js?v=202609221515"></script>
|
||||
<script src="assets/js/kopf.js?v=202609221515"></script>
|
||||
<script src="assets/js/glocke.js?v=202609221515"></script>
|
||||
<script src="assets/js/leistung.js?v=202609221515"></script>
|
||||
<script src="assets/js/installieren.js?v=202609221515" defer></script>
|
||||
<script src="assets/js/meldung.js?v=202609221855"></script>
|
||||
<script src="assets/js/nachfrage.js?v=202609221855"></script>
|
||||
<script src="assets/js/wahl.js?v=202609221855"></script>
|
||||
<script src="assets/js/bereiche.js?v=202609221855"></script>
|
||||
<script src="assets/js/kopf.js?v=202609221855"></script>
|
||||
<script src="assets/js/glocke.js?v=202609221855"></script>
|
||||
<script src="assets/js/leistung.js?v=202609221855"></script>
|
||||
<script src="assets/js/installieren.js?v=202609221855" defer></script>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
+16
-16
@@ -12,13 +12,13 @@
|
||||
vergessen wird. -->
|
||||
<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=202609221515" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609221515" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609221515" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609221515" />
|
||||
<link rel="stylesheet" href="assets/css/material.css?v=202609221515" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?v=202609221515" />
|
||||
<link rel="stylesheet" href="assets/css/haus.css?v=202609221515" />
|
||||
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609221855" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609221855" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609221855" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609221855" />
|
||||
<link rel="stylesheet" href="assets/css/material.css?v=202609221855" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?v=202609221855" />
|
||||
<link rel="stylesheet" href="assets/css/haus.css?v=202609221855" />
|
||||
</head>
|
||||
<body class="start" data-ton="42" data-buehne="studio">
|
||||
|
||||
@@ -138,14 +138,14 @@
|
||||
<p class="m-laedt" id="laedt">Einen Moment …</p>
|
||||
</main>
|
||||
|
||||
<script src="assets/js/meldung.js?v=202609221515" defer></script>
|
||||
<script src="assets/js/nachfrage.js?v=202609221515" defer></script>
|
||||
<script src="assets/js/hochladen.js?v=202609221515" defer></script>
|
||||
<script src="assets/js/wahl.js?v=202609221515" defer></script>
|
||||
<script src="assets/js/bereiche.js?v=202609221515" defer></script>
|
||||
<script src="assets/js/installieren.js?v=202609221515" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609221515" defer></script>
|
||||
<script src="assets/js/glocke.js?v=202609221515" defer></script>
|
||||
<script src="assets/js/material.js?v=202609221515" defer></script>
|
||||
<script src="assets/js/meldung.js?v=202609221855" defer></script>
|
||||
<script src="assets/js/nachfrage.js?v=202609221855" defer></script>
|
||||
<script src="assets/js/hochladen.js?v=202609221855" defer></script>
|
||||
<script src="assets/js/wahl.js?v=202609221855" defer></script>
|
||||
<script src="assets/js/bereiche.js?v=202609221855" defer></script>
|
||||
<script src="assets/js/installieren.js?v=202609221855" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609221855" defer></script>
|
||||
<script src="assets/js/glocke.js?v=202609221855" defer></script>
|
||||
<script src="assets/js/material.js?v=202609221855" defer></script>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
+16
-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=202609221515" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609221515" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609221515" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609221515" />
|
||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609221515" />
|
||||
<link rel="stylesheet" href="assets/css/personen.css?v=202609221515" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?v=202609221515" />
|
||||
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609221855" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609221855" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609221855" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609221855" />
|
||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609221855" />
|
||||
<link rel="stylesheet" href="assets/css/personen.css?v=202609221855" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?v=202609221855" />
|
||||
<!-- 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=202609221515" />
|
||||
<link rel="stylesheet" href="assets/css/haus.css?v=202609221855" />
|
||||
</head>
|
||||
|
||||
<body class="start">
|
||||
@@ -453,14 +453,14 @@
|
||||
|
||||
</main>
|
||||
|
||||
<script src="assets/js/meldung.js?v=202609221515" defer></script>
|
||||
<script src="assets/js/nachfrage.js?v=202609221515" defer></script>
|
||||
<script src="assets/js/meldung.js?v=202609221855" defer></script>
|
||||
<script src="assets/js/nachfrage.js?v=202609221855" defer></script>
|
||||
|
||||
<script src="assets/js/wahl.js?v=202609221515" defer></script>
|
||||
<script src="assets/js/bereiche.js?v=202609221515" defer></script>
|
||||
<script src="assets/js/installieren.js?v=202609221515" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609221515" defer></script>
|
||||
<script src="assets/js/glocke.js?v=202609221515" defer></script>
|
||||
<script src="assets/js/personen.js?v=202609221515" defer></script>
|
||||
<script src="assets/js/wahl.js?v=202609221855" defer></script>
|
||||
<script src="assets/js/bereiche.js?v=202609221855" defer></script>
|
||||
<script src="assets/js/installieren.js?v=202609221855" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609221855" defer></script>
|
||||
<script src="assets/js/glocke.js?v=202609221855" defer></script>
|
||||
<script src="assets/js/personen.js?v=202609221855" defer></script>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
+18
-18
@@ -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=202609221515" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609221515" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609221515" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609221515" />
|
||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609221515" />
|
||||
<link rel="stylesheet" href="assets/css/profil.css?v=202609221515" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?v=202609221515" />
|
||||
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609221855" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609221855" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609221855" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609221855" />
|
||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609221855" />
|
||||
<link rel="stylesheet" href="assets/css/profil.css?v=202609221855" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?v=202609221855" />
|
||||
<!-- 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=202609221515" />
|
||||
<link rel="stylesheet" href="assets/css/haus.css?v=202609221855" />
|
||||
</head>
|
||||
|
||||
<body class="start">
|
||||
@@ -214,16 +214,16 @@
|
||||
|
||||
</main>
|
||||
|
||||
<script src="assets/js/meldung.js?v=202609221515" defer></script>
|
||||
<script src="assets/js/hochladen.js?v=202609221515" defer></script>
|
||||
<script src="assets/js/nachfrage.js?v=202609221515" defer></script>
|
||||
<script src="assets/js/meldung.js?v=202609221855" defer></script>
|
||||
<script src="assets/js/hochladen.js?v=202609221855" defer></script>
|
||||
<script src="assets/js/nachfrage.js?v=202609221855" defer></script>
|
||||
|
||||
<script src="assets/js/wahl.js?v=202609221515" defer></script>
|
||||
<script src="assets/js/bereiche.js?v=202609221515" defer></script>
|
||||
<script src="assets/js/installieren.js?v=202609221515" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609221515" defer></script>
|
||||
<script src="assets/js/glocke.js?v=202609221515" defer></script>
|
||||
<script src="assets/js/steckbrief.js?v=202609221515" defer></script>
|
||||
<script src="assets/js/profil.js?v=202609221515" defer></script>
|
||||
<script src="assets/js/wahl.js?v=202609221855" defer></script>
|
||||
<script src="assets/js/bereiche.js?v=202609221855" defer></script>
|
||||
<script src="assets/js/installieren.js?v=202609221855" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609221855" defer></script>
|
||||
<script src="assets/js/glocke.js?v=202609221855" defer></script>
|
||||
<script src="assets/js/steckbrief.js?v=202609221855" defer></script>
|
||||
<script src="assets/js/profil.js?v=202609221855" defer></script>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
+15
-15
@@ -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=202609221515" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609221515" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609221515" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609221515" />
|
||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609221515" />
|
||||
<link rel="stylesheet" href="assets/css/treff.css?v=202609221515" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?v=202609221515" />
|
||||
<link rel="stylesheet" href="assets/css/haus.css?v=202609221515" />
|
||||
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609221855" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609221855" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609221855" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609221855" />
|
||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609221855" />
|
||||
<link rel="stylesheet" href="assets/css/treff.css?v=202609221855" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?v=202609221855" />
|
||||
<link rel="stylesheet" href="assets/css/haus.css?v=202609221855" />
|
||||
</head>
|
||||
|
||||
<body class="start">
|
||||
@@ -134,12 +134,12 @@
|
||||
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=202609221515" defer></script>
|
||||
<script src="assets/js/nachfrage.js?v=202609221515" defer></script>
|
||||
<script src="assets/js/wahl.js?v=202609221515" defer></script>
|
||||
<script src="assets/js/bereiche.js?v=202609221515" defer></script>
|
||||
<script src="assets/js/installieren.js?v=202609221515" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609221515" defer></script>
|
||||
<script src="assets/js/rechte.js?v=202609221515" defer></script>
|
||||
<script src="assets/js/meldung.js?v=202609221855" defer></script>
|
||||
<script src="assets/js/nachfrage.js?v=202609221855" defer></script>
|
||||
<script src="assets/js/wahl.js?v=202609221855" defer></script>
|
||||
<script src="assets/js/bereiche.js?v=202609221855" defer></script>
|
||||
<script src="assets/js/installieren.js?v=202609221855" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609221855" defer></script>
|
||||
<script src="assets/js/rechte.js?v=202609221855" defer></script>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
+17
-17
@@ -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=202609221515" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609221515" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609221515" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609221515" />
|
||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609221515" />
|
||||
<link rel="stylesheet" href="assets/css/report.css?v=202609221515" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?v=202609221515" />
|
||||
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609221855" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609221855" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609221855" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609221855" />
|
||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609221855" />
|
||||
<link rel="stylesheet" href="assets/css/report.css?v=202609221855" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?v=202609221855" />
|
||||
<!-- 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=202609221515" />
|
||||
<link rel="stylesheet" href="assets/css/haus.css?v=202609221855" />
|
||||
</head>
|
||||
|
||||
<body class="start">
|
||||
@@ -106,16 +106,16 @@
|
||||
|
||||
</main>
|
||||
|
||||
<script src="assets/js/meldung.js?v=202609221515" defer></script>
|
||||
<script src="assets/js/nachfrage.js?v=202609221515" defer></script>
|
||||
<script src="assets/js/meldung.js?v=202609221855" defer></script>
|
||||
<script src="assets/js/nachfrage.js?v=202609221855" defer></script>
|
||||
|
||||
|
||||
<script src="assets/js/ki.js?v=202609221515" defer></script>
|
||||
<script src="assets/js/wahl.js?v=202609221515" defer></script>
|
||||
<script src="assets/js/bereiche.js?v=202609221515" defer></script>
|
||||
<script src="assets/js/installieren.js?v=202609221515" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609221515" defer></script>
|
||||
<script src="assets/js/glocke.js?v=202609221515" defer></script>
|
||||
<script src="assets/js/report.js?v=202609221515" defer></script>
|
||||
<script src="assets/js/ki.js?v=202609221855" defer></script>
|
||||
<script src="assets/js/wahl.js?v=202609221855" defer></script>
|
||||
<script src="assets/js/bereiche.js?v=202609221855" defer></script>
|
||||
<script src="assets/js/installieren.js?v=202609221855" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609221855" defer></script>
|
||||
<script src="assets/js/glocke.js?v=202609221855" defer></script>
|
||||
<script src="assets/js/report.js?v=202609221855" defer></script>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
+16
-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=202609221515" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609221515" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609221515" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609221515" />
|
||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609221515" />
|
||||
<link rel="stylesheet" href="assets/css/scouting.css?v=202609221515" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?v=202609221515" />
|
||||
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609221855" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609221855" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609221855" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609221855" />
|
||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609221855" />
|
||||
<link rel="stylesheet" href="assets/css/scouting.css?v=202609221855" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?v=202609221855" />
|
||||
<!-- 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=202609221515" />
|
||||
<link rel="stylesheet" href="assets/css/haus.css?v=202609221855" />
|
||||
</head>
|
||||
|
||||
<body class="start">
|
||||
@@ -173,14 +173,14 @@
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<script src="assets/js/meldung.js?v=202609221515" defer></script>
|
||||
<script src="assets/js/nachfrage.js?v=202609221515" defer></script>
|
||||
<script src="assets/js/meldung.js?v=202609221855" defer></script>
|
||||
<script src="assets/js/nachfrage.js?v=202609221855" defer></script>
|
||||
|
||||
<script src="assets/js/wahl.js?v=202609221515" defer></script>
|
||||
<script src="assets/js/bereiche.js?v=202609221515" defer></script>
|
||||
<script src="assets/js/installieren.js?v=202609221515" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609221515" defer></script>
|
||||
<script src="assets/js/glocke.js?v=202609221515" defer></script>
|
||||
<script src="assets/js/scouting.js?v=202609221515" defer></script>
|
||||
<script src="assets/js/wahl.js?v=202609221855" defer></script>
|
||||
<script src="assets/js/bereiche.js?v=202609221855" defer></script>
|
||||
<script src="assets/js/installieren.js?v=202609221855" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609221855" defer></script>
|
||||
<script src="assets/js/glocke.js?v=202609221855" defer></script>
|
||||
<script src="assets/js/scouting.js?v=202609221855" defer></script>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
+16
-16
@@ -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=202609221515" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609221515" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609221515" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609221515" />
|
||||
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609221855" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609221855" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609221855" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609221855" />
|
||||
<!-- 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=202609221515" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?v=202609221515" />
|
||||
<link rel="stylesheet" href="assets/css/heim.css?v=202609221855" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?v=202609221855" />
|
||||
<!-- 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=202609221515" />
|
||||
<link rel="stylesheet" href="assets/css/haus.css?v=202609221855" />
|
||||
</head>
|
||||
|
||||
<body class="start">
|
||||
@@ -684,16 +684,16 @@
|
||||
</p>
|
||||
</main>
|
||||
|
||||
<script src="assets/js/meldung.js?v=202609221515" defer></script>
|
||||
<script src="assets/js/nachfrage.js?v=202609221515" defer></script>
|
||||
<script src="assets/js/meldung.js?v=202609221855" defer></script>
|
||||
<script src="assets/js/nachfrage.js?v=202609221855" defer></script>
|
||||
|
||||
|
||||
<script src="assets/js/wahl.js?v=202609221515" defer></script>
|
||||
<script src="assets/js/bereiche.js?v=202609221515" defer></script>
|
||||
<script src="assets/js/installieren.js?v=202609221515" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609221515" defer></script>
|
||||
<script src="assets/js/glocke.js?v=202609221515" defer></script>
|
||||
<script src="assets/js/live.js?v=202609221515" defer></script>
|
||||
<script src="assets/js/start.js?v=202609221515" defer></script>
|
||||
<script src="assets/js/wahl.js?v=202609221855" defer></script>
|
||||
<script src="assets/js/bereiche.js?v=202609221855" defer></script>
|
||||
<script src="assets/js/installieren.js?v=202609221855" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609221855" defer></script>
|
||||
<script src="assets/js/glocke.js?v=202609221855" defer></script>
|
||||
<script src="assets/js/live.js?v=202609221855" defer></script>
|
||||
<script src="assets/js/start.js?v=202609221855" defer></script>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
+17
-17
@@ -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=202609221515" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609221515" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609221515" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609221515" />
|
||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609221515" />
|
||||
<link rel="stylesheet" href="assets/css/startcheck.css?v=202609221515" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?v=202609221515" />
|
||||
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609221855" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609221855" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609221855" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609221855" />
|
||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609221855" />
|
||||
<link rel="stylesheet" href="assets/css/startcheck.css?v=202609221855" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?v=202609221855" />
|
||||
<!-- 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=202609221515" />
|
||||
<link rel="stylesheet" href="assets/css/haus.css?v=202609221855" />
|
||||
</head>
|
||||
|
||||
<body class="start">
|
||||
@@ -85,16 +85,16 @@
|
||||
|
||||
</main>
|
||||
|
||||
<script src="assets/js/meldung.js?v=202609221515" defer></script>
|
||||
<script src="assets/js/nachfrage.js?v=202609221515" defer></script>
|
||||
<script src="assets/js/meldung.js?v=202609221855" defer></script>
|
||||
<script src="assets/js/nachfrage.js?v=202609221855" defer></script>
|
||||
|
||||
|
||||
<script src="assets/js/ki.js?v=202609221515" defer></script>
|
||||
<script src="assets/js/wahl.js?v=202609221515" defer></script>
|
||||
<script src="assets/js/bereiche.js?v=202609221515" defer></script>
|
||||
<script src="assets/js/installieren.js?v=202609221515" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609221515" defer></script>
|
||||
<script src="assets/js/glocke.js?v=202609221515" defer></script>
|
||||
<script src="assets/js/startcheck.js?v=202609221515" defer></script>
|
||||
<script src="assets/js/ki.js?v=202609221855" defer></script>
|
||||
<script src="assets/js/wahl.js?v=202609221855" defer></script>
|
||||
<script src="assets/js/bereiche.js?v=202609221855" defer></script>
|
||||
<script src="assets/js/installieren.js?v=202609221855" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609221855" defer></script>
|
||||
<script src="assets/js/glocke.js?v=202609221855" defer></script>
|
||||
<script src="assets/js/startcheck.js?v=202609221855" defer></script>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
+18
-18
@@ -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=202609221515" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609221515" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609221515" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609221515" />
|
||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609221515" />
|
||||
<link rel="stylesheet" href="assets/css/profil.css?v=202609221515" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?v=202609221515" />
|
||||
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609221855" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609221855" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609221855" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609221855" />
|
||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609221855" />
|
||||
<link rel="stylesheet" href="assets/css/profil.css?v=202609221855" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?v=202609221855" />
|
||||
<!-- 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=202609221515" />
|
||||
<link rel="stylesheet" href="assets/css/haus.css?v=202609221855" />
|
||||
</head>
|
||||
|
||||
<body class="start">
|
||||
@@ -150,16 +150,16 @@
|
||||
|
||||
</main>
|
||||
|
||||
<script src="assets/js/meldung.js?v=202609221515" defer></script>
|
||||
<script src="assets/js/hochladen.js?v=202609221515" defer></script>
|
||||
<script src="assets/js/nachfrage.js?v=202609221515" defer></script>
|
||||
<script src="assets/js/meldung.js?v=202609221855" defer></script>
|
||||
<script src="assets/js/hochladen.js?v=202609221855" defer></script>
|
||||
<script src="assets/js/nachfrage.js?v=202609221855" defer></script>
|
||||
|
||||
<script src="assets/js/wahl.js?v=202609221515" defer></script>
|
||||
<script src="assets/js/bereiche.js?v=202609221515" defer></script>
|
||||
<script src="assets/js/installieren.js?v=202609221515" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609221515" defer></script>
|
||||
<script src="assets/js/auskunft.js?v=202609221515" defer></script>
|
||||
<script src="assets/js/glocke.js?v=202609221515" defer></script>
|
||||
<script src="assets/js/steckbrief.js?v=202609221515" defer></script>
|
||||
<script src="assets/js/wahl.js?v=202609221855" defer></script>
|
||||
<script src="assets/js/bereiche.js?v=202609221855" defer></script>
|
||||
<script src="assets/js/installieren.js?v=202609221855" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609221855" defer></script>
|
||||
<script src="assets/js/auskunft.js?v=202609221855" defer></script>
|
||||
<script src="assets/js/glocke.js?v=202609221855" defer></script>
|
||||
<script src="assets/js/steckbrief.js?v=202609221855" defer></script>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
+16
-16
@@ -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=202609221515" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609221515" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609221515" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609221515" />
|
||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609221515" />
|
||||
<link rel="stylesheet" href="assets/css/entwicklung.css?v=202609221515" />
|
||||
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609221855" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609221855" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609221855" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609221855" />
|
||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609221855" />
|
||||
<link rel="stylesheet" href="assets/css/entwicklung.css?v=202609221855" />
|
||||
<!-- 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=202609221515" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?v=202609221515" />
|
||||
<link rel="stylesheet" href="assets/css/haus.css?v=202609221515" />
|
||||
<link rel="stylesheet" href="assets/css/bewerbung.css?v=202609221855" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?v=202609221855" />
|
||||
<link rel="stylesheet" href="assets/css/haus.css?v=202609221855" />
|
||||
</head>
|
||||
|
||||
<body class="start">
|
||||
@@ -111,13 +111,13 @@
|
||||
|
||||
</main>
|
||||
|
||||
<script src="assets/js/meldung.js?v=202609221515" defer></script>
|
||||
<script src="assets/js/nachfrage.js?v=202609221515" defer></script>
|
||||
<script src="assets/js/meldung.js?v=202609221855" defer></script>
|
||||
<script src="assets/js/nachfrage.js?v=202609221855" defer></script>
|
||||
|
||||
<script src="assets/js/wahl.js?v=202609221515" defer></script>
|
||||
<script src="assets/js/bereiche.js?v=202609221515" defer></script>
|
||||
<script src="assets/js/installieren.js?v=202609221515" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609221515" defer></script>
|
||||
<script src="assets/js/talente.js?v=202609221515" defer></script>
|
||||
<script src="assets/js/wahl.js?v=202609221855" defer></script>
|
||||
<script src="assets/js/bereiche.js?v=202609221855" defer></script>
|
||||
<script src="assets/js/installieren.js?v=202609221855" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609221855" defer></script>
|
||||
<script src="assets/js/talente.js?v=202609221855" defer></script>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
+15
-15
@@ -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=202609221515" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609221515" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609221515" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609221515" />
|
||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609221515" />
|
||||
<link rel="stylesheet" href="assets/css/team.css?v=202609221515" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?v=202609221515" />
|
||||
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609221855" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609221855" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609221855" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609221855" />
|
||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609221855" />
|
||||
<link rel="stylesheet" href="assets/css/team.css?v=202609221855" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?v=202609221855" />
|
||||
<!-- 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=202609221515" />
|
||||
<link rel="stylesheet" href="assets/css/haus.css?v=202609221855" />
|
||||
</head>
|
||||
|
||||
<body class="start">
|
||||
@@ -110,14 +110,14 @@
|
||||
|
||||
</main>
|
||||
|
||||
<script src="assets/js/nachfrage.js?v=202609221515" defer></script>
|
||||
<script src="assets/js/nachfrage.js?v=202609221855" defer></script>
|
||||
|
||||
|
||||
<script src="assets/js/wahl.js?v=202609221515" defer></script>
|
||||
<script src="assets/js/bereiche.js?v=202609221515" defer></script>
|
||||
<script src="assets/js/installieren.js?v=202609221515" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609221515" defer></script>
|
||||
<script src="assets/js/glocke.js?v=202609221515" defer></script>
|
||||
<script src="assets/js/team.js?v=202609221515" defer></script>
|
||||
<script src="assets/js/wahl.js?v=202609221855" defer></script>
|
||||
<script src="assets/js/bereiche.js?v=202609221855" defer></script>
|
||||
<script src="assets/js/installieren.js?v=202609221855" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609221855" defer></script>
|
||||
<script src="assets/js/glocke.js?v=202609221855" defer></script>
|
||||
<script src="assets/js/team.js?v=202609221855" defer></script>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
+15
-15
@@ -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=202609221515" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609221515" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609221515" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609221515" />
|
||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609221515" />
|
||||
<link rel="stylesheet" href="assets/css/team.css?v=202609221515" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?v=202609221515" />
|
||||
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609221855" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609221855" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609221855" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609221855" />
|
||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609221855" />
|
||||
<link rel="stylesheet" href="assets/css/team.css?v=202609221855" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?v=202609221855" />
|
||||
<!-- 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=202609221515" />
|
||||
<link rel="stylesheet" href="assets/css/haus.css?v=202609221855" />
|
||||
</head>
|
||||
|
||||
<!-- `data-buehne` steht hier fest und nicht im Skript: Die Kachel zu
|
||||
@@ -84,13 +84,13 @@
|
||||
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=202609221515" defer></script>
|
||||
<script src="assets/js/nachfrage.js?v=202609221515" defer></script>
|
||||
<script src="assets/js/meldung.js?v=202609221855" defer></script>
|
||||
<script src="assets/js/nachfrage.js?v=202609221855" defer></script>
|
||||
|
||||
<script src="assets/js/wahl.js?v=202609221515" defer></script>
|
||||
<script src="assets/js/bereiche.js?v=202609221515" defer></script>
|
||||
<script src="assets/js/installieren.js?v=202609221515" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609221515" defer></script>
|
||||
<script src="assets/js/teamlage.js?v=202609221515" defer></script>
|
||||
<script src="assets/js/wahl.js?v=202609221855" defer></script>
|
||||
<script src="assets/js/bereiche.js?v=202609221855" defer></script>
|
||||
<script src="assets/js/installieren.js?v=202609221855" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609221855" defer></script>
|
||||
<script src="assets/js/teamlage.js?v=202609221855" defer></script>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
+14
-14
@@ -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=202609221515" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609221515" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609221515" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609221515" />
|
||||
<link rel="stylesheet" href="assets/css/bereich.css?v=202609221515" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?v=202609221515" />
|
||||
<link rel="stylesheet" href="assets/css/haus.css?v=202609221515" />
|
||||
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609221855" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609221855" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609221855" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609221855" />
|
||||
<link rel="stylesheet" href="assets/css/bereich.css?v=202609221855" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?v=202609221855" />
|
||||
<link rel="stylesheet" href="assets/css/haus.css?v=202609221855" />
|
||||
</head>
|
||||
|
||||
<body class="start">
|
||||
@@ -112,14 +112,14 @@
|
||||
|
||||
</main>
|
||||
|
||||
<script src="assets/js/meldung.js?v=202609221515" defer></script>
|
||||
<script src="assets/js/nachfrage.js?v=202609221515" defer></script>
|
||||
<script src="assets/js/meldung.js?v=202609221855" defer></script>
|
||||
<script src="assets/js/nachfrage.js?v=202609221855" defer></script>
|
||||
|
||||
|
||||
<script src="assets/js/wahl.js?v=202609221515" defer></script>
|
||||
<script src="assets/js/bereiche.js?v=202609221515" defer></script>
|
||||
<script src="assets/js/installieren.js?v=202609221515" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609221515" defer></script>
|
||||
<script src="assets/js/teilen.js?v=202609221515" defer></script>
|
||||
<script src="assets/js/wahl.js?v=202609221855" defer></script>
|
||||
<script src="assets/js/bereiche.js?v=202609221855" defer></script>
|
||||
<script src="assets/js/installieren.js?v=202609221855" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609221855" defer></script>
|
||||
<script src="assets/js/teilen.js?v=202609221855" 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=202609221515" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609221515" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609221515" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609221515" />
|
||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609221515" />
|
||||
<link rel="stylesheet" href="assets/css/treff.css?v=202609221515" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?v=202609221515" />
|
||||
<link rel="stylesheet" href="assets/css/haus.css?v=202609221515" />
|
||||
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609221855" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609221855" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609221855" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609221855" />
|
||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609221855" />
|
||||
<link rel="stylesheet" href="assets/css/treff.css?v=202609221855" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?v=202609221855" />
|
||||
<link rel="stylesheet" href="assets/css/haus.css?v=202609221855" />
|
||||
</head>
|
||||
|
||||
<body class="start">
|
||||
@@ -126,13 +126,13 @@
|
||||
|
||||
</main>
|
||||
|
||||
<script src="assets/js/meldung.js?v=202609221515" defer></script>
|
||||
<script src="assets/js/nachfrage.js?v=202609221515" defer></script>
|
||||
<script src="assets/js/meldung.js?v=202609221855" defer></script>
|
||||
<script src="assets/js/nachfrage.js?v=202609221855" defer></script>
|
||||
|
||||
<script src="assets/js/wahl.js?v=202609221515" defer></script>
|
||||
<script src="assets/js/bereiche.js?v=202609221515" defer></script>
|
||||
<script src="assets/js/installieren.js?v=202609221515" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609221515" defer></script>
|
||||
<script src="assets/js/treff-moderation.js?v=202609221515" defer></script>
|
||||
<script src="assets/js/wahl.js?v=202609221855" defer></script>
|
||||
<script src="assets/js/bereiche.js?v=202609221855" defer></script>
|
||||
<script src="assets/js/installieren.js?v=202609221855" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609221855" defer></script>
|
||||
<script src="assets/js/treff-moderation.js?v=202609221855" defer></script>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
+15
-15
@@ -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=202609221515" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609221515" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609221515" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609221515" />
|
||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609221515" />
|
||||
<link rel="stylesheet" href="assets/css/treff.css?v=202609221515" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?v=202609221515" />
|
||||
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609221855" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609221855" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609221855" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609221855" />
|
||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609221855" />
|
||||
<link rel="stylesheet" href="assets/css/treff.css?v=202609221855" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?v=202609221855" />
|
||||
<!-- haus.css MUSS die letzte Stilvorlage sein. Auf der Adresse des
|
||||
Rudels 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=202609221515" />
|
||||
<link rel="stylesheet" href="assets/css/haus.css?v=202609221855" />
|
||||
</head>
|
||||
|
||||
<body class="start">
|
||||
@@ -221,13 +221,13 @@
|
||||
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/nachfrage.js?v=202609221515" defer></script>
|
||||
<script src="assets/js/nachfrage.js?v=202609221855" defer></script>
|
||||
|
||||
<script src="assets/js/wahl.js?v=202609221515" defer></script>
|
||||
<script src="assets/js/bereiche.js?v=202609221515" defer></script>
|
||||
<script src="assets/js/installieren.js?v=202609221515" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609221515" defer></script>
|
||||
<script src="assets/js/auskunft.js?v=202609221515" defer></script>
|
||||
<script src="assets/js/treff-regeln.js?v=202609221515" defer></script>
|
||||
<script src="assets/js/wahl.js?v=202609221855" defer></script>
|
||||
<script src="assets/js/bereiche.js?v=202609221855" defer></script>
|
||||
<script src="assets/js/installieren.js?v=202609221855" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609221855" defer></script>
|
||||
<script src="assets/js/auskunft.js?v=202609221855" defer></script>
|
||||
<script src="assets/js/treff-regeln.js?v=202609221855" defer></script>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
+16
-16
@@ -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=202609221515" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609221515" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609221515" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609221515" />
|
||||
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609221855" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609221855" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609221855" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609221855" />
|
||||
<!-- Formular- und Dialogstile: seit dem 07.09.2026 steht hier der
|
||||
Dialog "Creator anlegen". -->
|
||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609221515" />
|
||||
<link rel="stylesheet" href="assets/css/uebersicht.css?v=202609221515" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?v=202609221515" />
|
||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609221855" />
|
||||
<link rel="stylesheet" href="assets/css/uebersicht.css?v=202609221855" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?v=202609221855" />
|
||||
<!-- 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=202609221515" />
|
||||
<link rel="stylesheet" href="assets/css/haus.css?v=202609221855" />
|
||||
</head>
|
||||
|
||||
<body class="start">
|
||||
@@ -149,16 +149,16 @@
|
||||
|
||||
</main>
|
||||
|
||||
<script src="assets/js/meldung.js?v=202609221515" defer></script>
|
||||
<script src="assets/js/nachfrage.js?v=202609221515" defer></script>
|
||||
<script src="assets/js/meldung.js?v=202609221855" defer></script>
|
||||
<script src="assets/js/nachfrage.js?v=202609221855" defer></script>
|
||||
|
||||
|
||||
<script src="assets/js/bereiche.js?v=202609221515" defer></script>
|
||||
<script src="assets/js/bereiche.js?v=202609221855" defer></script>
|
||||
|
||||
<script src="assets/js/wahl.js?v=202609221515" defer></script>
|
||||
<script src="assets/js/installieren.js?v=202609221515" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609221515" defer></script>
|
||||
<script src="assets/js/glocke.js?v=202609221515" defer></script>
|
||||
<script src="assets/js/uebersicht.js?v=202609221515" defer></script>
|
||||
<script src="assets/js/wahl.js?v=202609221855" defer></script>
|
||||
<script src="assets/js/installieren.js?v=202609221855" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609221855" defer></script>
|
||||
<script src="assets/js/glocke.js?v=202609221855" defer></script>
|
||||
<script src="assets/js/uebersicht.js?v=202609221855" 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=202609221515" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609221515" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609221515" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609221515" />
|
||||
<link rel="stylesheet" href="assets/css/unsere-seiten.css?v=202609221515" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?v=202609221515" />
|
||||
<link rel="stylesheet" href="assets/css/haus.css?v=202609221515" />
|
||||
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609221855" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609221855" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609221855" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609221855" />
|
||||
<link rel="stylesheet" href="assets/css/unsere-seiten.css?v=202609221855" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?v=202609221855" />
|
||||
<link rel="stylesheet" href="assets/css/haus.css?v=202609221855" />
|
||||
</head>
|
||||
|
||||
<body class="start">
|
||||
@@ -335,13 +335,13 @@
|
||||
|
||||
</main>
|
||||
|
||||
<script src="assets/js/nachfrage.js?v=202609221515" defer></script>
|
||||
<script src="assets/js/nachfrage.js?v=202609221855" defer></script>
|
||||
|
||||
<script src="assets/js/wahl.js?v=202609221515" defer></script>
|
||||
<script src="assets/js/bereiche.js?v=202609221515" defer></script>
|
||||
<script src="assets/js/installieren.js?v=202609221515" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609221515" defer></script>
|
||||
<script src="assets/js/live.js?v=202609221515" defer></script>
|
||||
<script src="assets/js/unsere-seiten.js?v=202609221515" defer></script>
|
||||
<script src="assets/js/wahl.js?v=202609221855" defer></script>
|
||||
<script src="assets/js/bereiche.js?v=202609221855" defer></script>
|
||||
<script src="assets/js/installieren.js?v=202609221855" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609221855" defer></script>
|
||||
<script src="assets/js/live.js?v=202609221855" defer></script>
|
||||
<script src="assets/js/unsere-seiten.js?v=202609221855" defer></script>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
+15
-15
@@ -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=202609221515" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609221515" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609221515" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609221515" />
|
||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609221515" />
|
||||
<link rel="stylesheet" href="assets/css/entwicklung.css?v=202609221515" />
|
||||
<link rel="stylesheet" href="assets/css/werdegang.css?v=202609221515" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?v=202609221515" />
|
||||
<link rel="stylesheet" href="assets/css/haus.css?v=202609221515" />
|
||||
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609221855" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609221855" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609221855" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609221855" />
|
||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609221855" />
|
||||
<link rel="stylesheet" href="assets/css/entwicklung.css?v=202609221855" />
|
||||
<link rel="stylesheet" href="assets/css/werdegang.css?v=202609221855" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?v=202609221855" />
|
||||
<link rel="stylesheet" href="assets/css/haus.css?v=202609221855" />
|
||||
</head>
|
||||
|
||||
<body class="start">
|
||||
@@ -144,13 +144,13 @@
|
||||
|
||||
</main>
|
||||
|
||||
<script src="assets/js/nachfrage.js?v=202609221515" defer></script>
|
||||
<script src="assets/js/nachfrage.js?v=202609221855" defer></script>
|
||||
|
||||
|
||||
<script src="assets/js/wahl.js?v=202609221515" defer></script>
|
||||
<script src="assets/js/bereiche.js?v=202609221515" defer></script>
|
||||
<script src="assets/js/installieren.js?v=202609221515" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609221515" defer></script>
|
||||
<script src="assets/js/werdegang.js?v=202609221515" defer></script>
|
||||
<script src="assets/js/wahl.js?v=202609221855" defer></script>
|
||||
<script src="assets/js/bereiche.js?v=202609221855" defer></script>
|
||||
<script src="assets/js/installieren.js?v=202609221855" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609221855" defer></script>
|
||||
<script src="assets/js/werdegang.js?v=202609221855" defer></script>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
+15
-15
@@ -12,13 +12,13 @@
|
||||
vergessen wird. -->
|
||||
<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=202609221515" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609221515" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609221515" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609221515" />
|
||||
<link rel="stylesheet" href="assets/css/willkommen.css?v=202609221515" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?v=202609221515" />
|
||||
<link rel="stylesheet" href="assets/css/haus.css?v=202609221515" />
|
||||
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609221855" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609221855" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609221855" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609221855" />
|
||||
<link rel="stylesheet" href="assets/css/willkommen.css?v=202609221855" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?v=202609221855" />
|
||||
<link rel="stylesheet" href="assets/css/haus.css?v=202609221855" />
|
||||
</head>
|
||||
<!-- KOERPERKLASSE "start", NICHT "gate" (berichtigt 21.09.2026).
|
||||
`body.gate` ist die Anmeldewand: `display:flex; align-items:center`,
|
||||
@@ -75,13 +75,13 @@
|
||||
<p class="fehler" id="fehler" hidden></p>
|
||||
</main>
|
||||
|
||||
<script src="assets/js/meldung.js?v=202609221515" defer></script>
|
||||
<script src="assets/js/bereiche.js?v=202609221515" defer></script>
|
||||
<script src="assets/js/wahl.js?v=202609221515" defer></script>
|
||||
<script src="assets/js/nachfrage.js?v=202609221515" defer></script>
|
||||
<script src="assets/js/installieren.js?v=202609221515" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609221515" defer></script>
|
||||
<script src="assets/js/glocke.js?v=202609221515" defer></script>
|
||||
<script src="assets/js/willkommen.js?v=202609221515" defer></script>
|
||||
<script src="assets/js/meldung.js?v=202609221855" defer></script>
|
||||
<script src="assets/js/bereiche.js?v=202609221855" defer></script>
|
||||
<script src="assets/js/wahl.js?v=202609221855" defer></script>
|
||||
<script src="assets/js/nachfrage.js?v=202609221855" defer></script>
|
||||
<script src="assets/js/installieren.js?v=202609221855" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609221855" defer></script>
|
||||
<script src="assets/js/glocke.js?v=202609221855" defer></script>
|
||||
<script src="assets/js/willkommen.js?v=202609221855" defer></script>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
+17
-17
@@ -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=202609221515" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609221515" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609221515" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609221515" />
|
||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609221515" />
|
||||
<link rel="stylesheet" href="assets/css/wissen.css?v=202609221515" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?v=202609221515" />
|
||||
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609221855" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609221855" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609221855" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609221855" />
|
||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609221855" />
|
||||
<link rel="stylesheet" href="assets/css/wissen.css?v=202609221855" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?v=202609221855" />
|
||||
<!-- 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=202609221515" />
|
||||
<link rel="stylesheet" href="assets/css/haus.css?v=202609221855" />
|
||||
</head>
|
||||
|
||||
<body class="start">
|
||||
@@ -190,15 +190,15 @@
|
||||
|
||||
</main>
|
||||
|
||||
<script src="assets/js/meldung.js?v=202609221515" defer></script>
|
||||
<script src="assets/js/hochladen.js?v=202609221515" defer></script>
|
||||
<script src="assets/js/nachfrage.js?v=202609221515" defer></script>
|
||||
<script src="assets/js/meldung.js?v=202609221855" defer></script>
|
||||
<script src="assets/js/hochladen.js?v=202609221855" defer></script>
|
||||
<script src="assets/js/nachfrage.js?v=202609221855" defer></script>
|
||||
|
||||
<script src="assets/js/wahl.js?v=202609221515" defer></script>
|
||||
<script src="assets/js/bereiche.js?v=202609221515" defer></script>
|
||||
<script src="assets/js/installieren.js?v=202609221515" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609221515" defer></script>
|
||||
<script src="assets/js/glocke.js?v=202609221515" defer></script>
|
||||
<script src="assets/js/wissen.js?v=202609221515" defer></script>
|
||||
<script src="assets/js/wahl.js?v=202609221855" defer></script>
|
||||
<script src="assets/js/bereiche.js?v=202609221855" defer></script>
|
||||
<script src="assets/js/installieren.js?v=202609221855" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609221855" defer></script>
|
||||
<script src="assets/js/glocke.js?v=202609221855" defer></script>
|
||||
<script src="assets/js/wissen.js?v=202609221855" defer></script>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
Reference in New Issue
Block a user