From 6ed61a6b3d76d4be5c618616f1e9f14f322a013f Mon Sep 17 00:00:00 2001 From: Dogfather Date: Mon, 14 Sep 2026 12:01:49 +0200 Subject: [PATCH] Die Zeitraum-Regel galt nur an einer Stelle -- Filipe fand die andere "jetzt hab ich eine hochgeladen ber sehe sie nicht." WAS PASSIERT IST, aus der Datenbank gelesen und nicht vermutet: Seine Backstage-Ausgabe lief durch den EINZEL-Import ("Aus Datei einlesen") und schrieb genau eine Zeile -- creator_id 2, Tag 2026-09-01, alle Werte 0, Quelle "import", erfasst 11:52. Unsichtbar war sie aus zwei Gruenden: Der 1. September liegt 13 Tage zurueck (die Liste zeigt sieben), und es stand nichts darin. DREI FEHLER AUF EINMAL, und alle drei waren meine: 1. DER ZEITRAUM-SCHUTZ STAND NUR IM BACKSTAGE-WEG. Ich hatte ihn heute frueh gebaut, gemessen, geprueft -- und an genau einer von drei Stellen eingesetzt. "2026-09-01 ~ 2026-09-11" wurde im Einzel-Import weiterhin zum 1. September. Das ist an diesem Tag das DRITTE Mal dieselbe Sache: eine Regel, zweimal aufgeschrieben, und die zweite Abschrift ist die unvollstaendige. Jetzt steht sie EINMAL in `tagAusZelle()` und wird dreimal benutzt. Sie liefert immer genau eines von beidem: Tag oder Grund -- nie beides, nie keines. 2. DIE DAUER-EINHEIT FEHLTE DORT EBENFALLS. Auch das hatte ich nur im Backstage-Weg eingesetzt. 3. DIE DATEI GEHOERTE GAR NICHT DORTHIN. Sie enthaelt ALLE Creator:innen; der Einzel-Import schreibt auf EINE Person. Es gab keine Fehlermeldung -- es passierte nur nichts Sichtbares, und das ist die schlechteste aller Antworten. Jetzt erkennt der Weg eine Namensspalte mit mehreren verschiedenen Eintraegen und sagt: "In dieser Datei stehen 3 verschiedene Creator (Spalte ...). Dieser Weg schreibt auf EINE Person. Nimm 'Backstage-Tabelle einfuegen'." Mit Gegenprobe, dass eine Datei mit EINEM Creator weiterhin durchgeht. pruef-xlsx 60 -> 67, pruef-backstage-import 82 -> 86. NEBENBEFUND AUS DER EIGENEN PRUEFUNG: Mein Testfile fuer den Einzel-Import hatte selbst zwei verschiedene Creator -- die neue Sperre hat es sofort abgewiesen. Das war ihr erster echter Treffer, und es zeigt, dass ich den Weg beim Schreiben der Pruefung selbst falsch verstanden hatte. Jetzt steht dort, wofuer er da ist: eine Person, mehrere Tage. Die Zeile vom 1. September steht noch in der Datenbank. Sie zu entfernen ist Filipes Entscheidung, nicht meine. Co-Authored-By: Claude Opus 5 --- server/pruef-backstage-import.mjs | 57 ++++++++++++++++- server/pruef-xlsx.mjs | 41 ++++++++++++ server/workspace-leistung.js | 102 ++++++++++++++++++++++-------- workspace/app.webmanifest | 8 +-- workspace/aufgaben.html | 24 +++---- workspace/automation.html | 26 ++++---- workspace/bereich.html | 34 +++++----- workspace/calls.html | 28 ++++---- workspace/chat.html | 26 ++++---- workspace/content.html | 30 ++++----- workspace/crew-index.html | 10 +-- workspace/crew.webmanifest | 8 +-- workspace/dateien.html | 26 ++++---- workspace/entwicklung.html | 24 +++---- workspace/index.html | 8 +-- workspace/kalender.html | 28 ++++---- workspace/leistung.html | 26 ++++---- workspace/personen.html | 26 ++++---- workspace/profil.html | 28 ++++---- workspace/rechte.html | 24 +++---- workspace/report.html | 28 ++++---- workspace/scouting.html | 26 ++++---- workspace/start.html | 24 +++---- workspace/startcheck.html | 28 ++++---- workspace/steckbrief.html | 26 ++++---- workspace/talente.html | 24 +++---- workspace/team.html | 26 ++++---- workspace/teamlage.html | 24 +++---- workspace/treff-moderation.html | 24 +++---- workspace/treff-regeln.html | 24 +++---- workspace/uebersicht.html | 26 ++++---- workspace/wissen.html | 26 ++++---- 32 files changed, 518 insertions(+), 372 deletions(-) diff --git a/server/pruef-backstage-import.mjs b/server/pruef-backstage-import.mjs index 1175b8d2..89c8a049 100644 --- a/server/pruef-backstage-import.mjs +++ b/server/pruef-backstage-import.mjs @@ -537,10 +537,14 @@ console.log("\n=== Die Seite ==="); erste Entwurf schickte zehn Bytes "PK…" und war gruen, weil der Server "ZIP-Ende fehlt" meldete -- das haette auch bei kaputtem Leser gestimmt. */ + /* EINE Person, ZWEI Tage -- dafuer ist dieser Weg da. Der erste + Entwurf hatte hier zwei verschiedene Creator; dass die neue Sperre + ihn abgewiesen hat, war ihr erster echter Treffer. */ + const vortag = new Date(Date.now() - 2 * 86400000).toISOString().slice(0, 10); const xlsxDatei = xlsxBauen([ ["Datum", "Creator", "Diamanten", "LIVE-Dauer"], [gestern, "@Nova_Live", "12.480", "3Std. 4Min."], - [gestern, "Kiro", "3.900", "1Std. 35Min."], + [vortag, "@Nova_Live", "3.900", "1Std. 35Min."], ]); await seite.click("#import-oeffnen"); await seite.waitForTimeout(300); @@ -561,6 +565,57 @@ console.log("\n=== Die Seite ==="); ok(xlsx.text.includes("Diamanten") && xlsx.text.includes("LIVE-Dauer"), `die Vorschau nennt die erkannten Spalten ("${xlsx.text.slice(0, 55)}…")`); + /* ---- EINE DATEI MIT ALLEN CREATORN GEHOERT WOANDERS HIN --------- + (14.09.2026) Genau das ist Filipe passiert: Er hat seine + Backstage-Ausgabe -- eine Tabelle mit allen Creator:innen -- hier + hochgeladen. Dieser Weg schreibt auf EINEN Creator. Herausgekommen + ist eine Zeile mit lauter Nullen auf einem Tag, den er nicht mehr + sah; eine Fehlermeldung gab es nicht. + + "Es passiert nichts Sichtbares" ist die schlechteste aller + Antworten. Jetzt sagt der Weg, WAS los ist und WOHIN die Datei + gehoert. */ + const vieleLeute = xlsxBauen([ + ["Datenzeitraum", "Creator*innen-Anmeldename", "Diamanten"], + [gestern, "nova_live", "12.480"], + [gestern, "kiro_on", "3.900"], + [gestern, "lumistreamt", "22.010"], + ]); + await seite.setInputFiles("#datei", { + name: "alle.xlsx", + mimeType: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", + buffer: vieleLeute, + }); + await seite.waitForTimeout(1400); + const viele = await seite.evaluate(() => ({ + fehler: document.getElementById("import-fehler")?.textContent || "", + vorschau: document.getElementById("vorschau")?.hidden, + })); + ok(viele.fehler.includes("3 verschiedene Creator"), + `die Datei mit drei Creatorn wird erkannt ("${viele.fehler.slice(0, 55)}…")`); + ok(viele.fehler.includes("Backstage-Tabelle"), + "und der richtige Knopf wird genannt"); + ok(viele.vorschau === true, "es entsteht KEINE Vorschau -- geschrieben wird nichts"); + + /* GEGENPROBE: EIN Creator in der Datei geht weiterhin durch. Sonst + hiesse das oben nur, dass jede Datei mit Namensspalte abgewiesen + wird. */ + await seite.setInputFiles("#datei", { + name: "einer.xlsx", + mimeType: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", + buffer: xlsxBauen([ + ["Datenzeitraum", "Creator*innen-Anmeldename", "Diamanten"], + [gestern, "nova_live", "12.480"], + ]), + }); + await seite.waitForTimeout(1400); + const einer = await seite.evaluate(() => ({ + fehler: document.getElementById("import-fehler")?.textContent || "", + vorschau: document.getElementById("vorschau")?.hidden, + })); + ok(einer.vorschau === false && einer.fehler === "", + `eine Datei mit EINEM Creator kommt durch ("${einer.fehler.slice(0, 40)}")`); + /* DIE ALTE .xls IST ETWAS ANDERES -- kein ZIP, sondern BIFF. Sie bekommt weiterhin eine Absage, und die muss WEITERHELFEN. */ await seite.setInputFiles("#datei", { diff --git a/server/pruef-xlsx.mjs b/server/pruef-xlsx.mjs index f78b11a5..7a37585f 100644 --- a/server/pruef-xlsx.mjs +++ b/server/pruef-xlsx.mjs @@ -303,6 +303,47 @@ console.log("\n=== Der dritte Ausgang ==="); zwei Werte, die jeder nachschlagen kann. Verrutscht die Basis um einen Tag, faellt es hier auf und nicht erst in einer Tabelle. ======================================================================= */ +console.log(""); +console.log("=== Die eine Regel fuer den Tag ==="); +{ + /* DIE LUECKE, DIE FILIPE GEFUNDEN HAT (14.09.2026). + + Der Zeitraum-Schutz stand am Vormittag nur im Backstage-Weg. Er + schickte seine echte Datei durch den EINZEL-Import -- dort fehlte + er, und es entstand eine Zeile mit lauter Nullen auf dem + 1. September. Sichtbar war davon nichts: Der Tag lag 13 Tage + zurueck, und die Liste zeigt sieben. + + Dieselbe Regel, zweimal aufgeschrieben, und die zweite Abschrift + war die unvollstaendige -- zum dritten Mal an einem Tag. Jetzt + steht sie EINMAL in tagAusZelle(), und diese Pruefung haelt fest, + dass sie beides kann: ablehnen UND durchlassen. */ + const { tagAusZelle } = await import("./workspace-leistung.js"); + const faelle = [ + ["2026-09-01 ~ 2026-09-11", null, "mehrere Tage"], + ["2026-09-06 ~ 2026-09-06", "2026-09-06", null], + ["2026-09-06", "2026-09-06", null], + ["06.09.2026", "2026-09-06", null], + ["65", null, "unlesbar"], + ["", null, "unlesbar"], + ]; + for (const [text, sollTag, sollFehler] of faelle) { + const r = tagAusZelle(text); + if (sollTag) { + ok(r.tag === sollTag && !r.fehler, + `"${text}" wird zum Tag ${sollTag} (${r.tag || r.fehler})`); + } else { + ok(!r.tag && typeof r.fehler === "string" && r.fehler.includes(sollFehler), + `"${text}" wird abgelehnt und begruendet ("${(r.fehler || "").slice(0, 42)}…")`); + } + } + /* Und die Regel gibt NIE beides und nie keines zurueck -- sonst + entscheidet jeder Aufrufer selbst, was Vorrang hat. */ + const alle = faelle.map(([t]) => tagAusZelle(t)); + ok(alle.every((r) => (!!r.tag) !== (!!r.fehler)), + "sie liefert immer genau eines von beidem: Tag oder Grund"); +} + console.log(""); console.log("=== Der Nullpunkt der Excel-Zeitrechnung ==="); { diff --git a/server/workspace-leistung.js b/server/workspace-leistung.js index 7532b32d..34fca48e 100644 --- a/server/workspace-leistung.js +++ b/server/workspace-leistung.js @@ -666,6 +666,32 @@ export function zeitraumLesen(roh) { return { von, bis }; } +/** Der Tag aus einer Zelle -- MIT dem Zeitraum-Schutz. + * + * (14.09.2026, nachgetragen.) Den Schutz gab es seit heute frueh nur + * im Backstage-Weg. Filipe hat daraufhin seine echte Datei durch den + * EINZEL-Import geschickt, und genau das ist passiert, wovor der + * Schutz bewahren sollte: eine Zeile auf den 1. September, aus einem + * Zeitraum vom 1. bis 11. + * + * Dass es an zwei Stellen stand und an einer fehlte, ist derselbe + * Fehler wie an diesem Tag schon zweimal: eine Regel, zweimal + * aufgeschrieben, und die zweite Abschrift ist die unvollstaendige. + * Deshalb steht sie jetzt EINMAL hier und wird dreimal benutzt. + * + * Rueckgabe: { tag } oder { fehler } -- nie beides, nie keines. + */ +export function tagAusZelle(roh) { + const zeitraum = zeitraumLesen(roh); + if (zeitraum && zeitraum.von !== zeitraum.bis) { + return { fehler: `Zeitraum ${zeitraum.von} bis ${zeitraum.bis} – das sind mehrere ` + + "Tage auf einmal. Stell in Backstage den Zeitraum auf EINEN Tag." }; + } + const tag = zeitraum ? zeitraum.von : datumLesen(roh); + if (!tag) return { fehler: `Datum unlesbar: "${String(roh ?? "").slice(0, 40)}"` }; + return { tag }; +} + /** Macht aus einem Textwert ein Datum "JJJJ-MM-TT". * Erkennt 2026-09-06, 06.09.2026 und 09/06/2026. */ export function datumLesen(roh) { @@ -860,29 +886,17 @@ function netzwerkLesen(text, person, tagVorgabe) { const rohWer = String(rohHandle).trim() || String(rohName).trim(); if (!rohWer) { schlecht.push({ zeile: i + 1, grund: "Keine Person in der Zeile." }); continue; } - /* EIN ZEITRAUM IST KEIN TAG (14.09.2026). - - Backstage schreibt in "Datenzeitraum" `2026-09-01 ~ 2026-09-11`. - `datumLesen` griff sich davon den ersten Tag -- elf Tage - Diamanten waeren auf den 1. September geschrieben worden. Die - Zahl steht da, sie ist gross, sie sieht richtig aus, und niemand - kann spaeter sagen, dass elf Tage darin stecken. - - Gemessen am echten Export vom 12.09.2026, nicht vermutet. - - Ein Zeitraum von EINEM Tag geht durch -- dann ist die Datei - genau das, was hier gebraucht wird. */ - const zeitraum = ausTabelle ? zeitraumLesen(z[zu.tag]) : null; - if (zeitraum && zeitraum.von !== zeitraum.bis) { - schlecht.push({ zeile: i + 1, - grund: `Zeitraum ${zeitraum.von} bis ${zeitraum.bis} – das sind mehrere Tage ` - + "auf einmal. Stell in Backstage den Zeitraum auf EINEN Tag." }); - continue; + /* EIN ZEITRAUM IST KEIN TAG -- die Regel steht in tagAusZelle(). + Sie stand am 14.09. frueh nur hier; Filipe schickte seine Datei + daraufhin durch den Einzel-Import, und dort fehlte sie. Jetzt + benutzen alle drei Stellen dieselbe. */ + let tag = tagVorgabe; + if (ausTabelle) { + const gelesen = tagAusZelle(z[zu.tag]); + if (gelesen.fehler) { schlecht.push({ zeile: i + 1, grund: gelesen.fehler }); continue; } + tag = gelesen.tag; } - const tag = ausTabelle - ? (zeitraum ? zeitraum.von : datumLesen(z[zu.tag])) - : tagVorgabe; - if (!tag) { schlecht.push({ zeile: i + 1, grund: `Datum unlesbar: "${z[zu.tag]}"` }); continue; } + if (!tag) { schlecht.push({ zeile: i + 1, grund: "Kein Tag angegeben." }); continue; } if (tag > heuteLokal()) { schlecht.push({ zeile: i + 1, grund: `${tag} liegt in der Zukunft` }); continue; } /* Vier Versuche, in dieser Reihenfolge: Handle gegen Handle, Handle @@ -1111,13 +1125,43 @@ leistungRouter.post("/workspace/api/leistung/:creatorId/import/vorschau", gleich }); } + /* DIESE DATEI GEHOERT WOANDERS HIN (14.09.2026). + + Filipe hat seine Backstage-Ausgabe hier hochgeladen -- eine + Tabelle mit ALLEN Creator:innen. Dieser Weg schreibt aber auf + EINEN Creator; herausgekommen ist eine Zeile mit lauter Nullen + auf einem Tag, den er nicht mehr sah. + + "Es passiert nichts Sichtbares" ist die schlechteste aller + Antworten. Erkannt wird es an einer Namensspalte mit MEHREREN + verschiedenen Eintraegen -- das ist keine Tagesliste, das ist + eine Personenliste. */ + const werSpalte = kopf.findIndex((n) => + /creator|nickname|anmeldename|benutzer|username|handle|tiktok/i.test(String(n))); + if (werSpalte >= 0) { + const leute = new Set(); + for (let i = 1; i < zeilen.length; i++) { + const w = String(zeilen[i][werSpalte] ?? "").trim().toLowerCase(); + if (w) leute.add(w); + } + if (leute.size > 1) { + return res.status(409).json({ + fehler: `In dieser Datei stehen ${leute.size} verschiedene Creator ` + + `(Spalte „${kopf[werSpalte]}“). Dieser Weg schreibt auf EINE Person. ` + + "Nimm „Backstage-Tabelle einfügen“ – der ordnet jede Zeile selbst zu.", + kopf, spalten: zu, mehrere: leute.size, + }); + } + } + const neu = []; const ersetzt = []; const fehlerhaft = []; for (let i = 1; i < zeilen.length; i++) { const z = zeilen[i]; - const tag = datumLesen(z[zu.tag]); - if (!tag) { fehlerhaft.push({ zeile: i + 1, grund: `Datum unlesbar: "${z[zu.tag]}"` }); continue; } + const gelesen = tagAusZelle(z[zu.tag]); + if (gelesen.fehler) { fehlerhaft.push({ zeile: i + 1, grund: gelesen.fehler }); continue; } + const tag = gelesen.tag; if (tag > tagVor(0)) { fehlerhaft.push({ zeile: i + 1, grund: `${tag} liegt in der Zukunft` }); continue; } const werte = { tag }; @@ -1177,10 +1221,16 @@ leistungRouter.post("/workspace/api/leistung/:creatorId/import", gleicheHerkunft try { for (let i = 1; i < zeilen.length; i++) { const z = zeilen[i]; - const tag = datumLesen(z[zu.tag]); + /* Dieselbe Regel wie in der Vorschau -- sonst zeigt die + Vorschau etwas anderes an, als geschrieben wird. Genau das + ist der Unterschied, den niemand bemerkt. */ + const gelesen = tagAusZelle(z[zu.tag]); + const tag = gelesen.tag; if (!tag || tag > tagVor(0)) { uebersprungen++; continue; } const w = (feld) => (zu[feld] === undefined ? null : zahlLesen(z[zu[feld]])); - const dauer = w("dauer_min"); + /* Die Dauer hat eine EINHEIT ("86Std. 10Min. 52Sek."), die + uebrigen Felder nicht. */ + const dauer = zu.dauer_min === undefined ? null : dauerLesen(z[zu.dauer_min]); schreiben.run( creatorId, tag, w("diamanten"), dauer, /* Ein gültiger Tag ist ein Tag mit LIVE-Zeit. Steht im diff --git a/workspace/app.webmanifest b/workspace/app.webmanifest index d2b4e034..f336b67a 100644 --- a/workspace/app.webmanifest +++ b/workspace/app.webmanifest @@ -13,25 +13,25 @@ "theme_color": "#06090f", "icons": [ { - "src": "/assets/img/app-symbole/workspace-192.png?v=202609141135", + "src": "/assets/img/app-symbole/workspace-192.png?v=202609141201", "sizes": "192x192", "type": "image/png", "purpose": "any" }, { - "src": "/assets/img/app-symbole/workspace-512.png?v=202609141135", + "src": "/assets/img/app-symbole/workspace-512.png?v=202609141201", "sizes": "512x512", "type": "image/png", "purpose": "any" }, { - "src": "/assets/img/app-symbole/workspace-192-maskable.png?v=202609141135", + "src": "/assets/img/app-symbole/workspace-192-maskable.png?v=202609141201", "sizes": "192x192", "type": "image/png", "purpose": "maskable" }, { - "src": "/assets/img/app-symbole/workspace-512-maskable.png?v=202609141135", + "src": "/assets/img/app-symbole/workspace-512-maskable.png?v=202609141201", "sizes": "512x512", "type": "image/png", "purpose": "maskable" diff --git a/workspace/aufgaben.html b/workspace/aufgaben.html index 14d7df1a..e083d0bc 100644 --- a/workspace/aufgaben.html +++ b/workspace/aufgaben.html @@ -12,19 +12,19 @@ Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite eine Flaeche sind statt zweier. --> - - - - - - + + + + + + - + @@ -252,10 +252,10 @@ - - - - - + + + + + diff --git a/workspace/automation.html b/workspace/automation.html index 56cb1ed0..b851a851 100644 --- a/workspace/automation.html +++ b/workspace/automation.html @@ -12,20 +12,20 @@ Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite eine Flaeche sind statt zweier. --> - - - - - - - + + + + + + + - + @@ -147,10 +147,10 @@ - - - - - + + + + + diff --git a/workspace/bereich.html b/workspace/bereich.html index 56f60377..dd9748e2 100644 --- a/workspace/bereich.html +++ b/workspace/bereich.html @@ -12,20 +12,20 @@ Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite eine Flaeche sind statt zweier. --> - - - - - - - + + + + + + + - + @@ -181,14 +181,14 @@ - - - - - - - - - + + + + + + + + + diff --git a/workspace/calls.html b/workspace/calls.html index 9c117ed6..a36a2361 100644 --- a/workspace/calls.html +++ b/workspace/calls.html @@ -12,20 +12,20 @@ Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite eine Flaeche sind statt zweier. --> - - - - - - - + + + + + + + - + @@ -89,11 +89,11 @@ - - - - - - + + + + + + diff --git a/workspace/chat.html b/workspace/chat.html index d7758729..66642183 100644 --- a/workspace/chat.html +++ b/workspace/chat.html @@ -12,26 +12,26 @@ Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite eine Flaeche sind statt zweier. --> - - - - + + + + - - - + + + - + @@ -341,10 +341,10 @@ - - - - - + + + + + diff --git a/workspace/content.html b/workspace/content.html index c03cc946..0fb60cff 100644 --- a/workspace/content.html +++ b/workspace/content.html @@ -12,20 +12,20 @@ Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite eine Flaeche sind statt zweier. --> - - - - - - - + + + + + + + - + @@ -179,12 +179,12 @@ - - - - - - - + + + + + + + diff --git a/workspace/crew-index.html b/workspace/crew-index.html index e9c1e200..9f1be1a4 100644 --- a/workspace/crew-index.html +++ b/workspace/crew-index.html @@ -36,15 +36,15 @@ - - - + + + - + @@ -319,6 +319,6 @@ - + diff --git a/workspace/crew.webmanifest b/workspace/crew.webmanifest index 4e0fad29..c39b13fd 100644 --- a/workspace/crew.webmanifest +++ b/workspace/crew.webmanifest @@ -13,25 +13,25 @@ "theme_color": "#06090f", "icons": [ { - "src": "/assets/img/app-symbole/crew-192.png?v=202609141135", + "src": "/assets/img/app-symbole/crew-192.png?v=202609141201", "sizes": "192x192", "type": "image/png", "purpose": "any" }, { - "src": "/assets/img/app-symbole/crew-512.png?v=202609141135", + "src": "/assets/img/app-symbole/crew-512.png?v=202609141201", "sizes": "512x512", "type": "image/png", "purpose": "any" }, { - "src": "/assets/img/app-symbole/crew-192-maskable.png?v=202609141135", + "src": "/assets/img/app-symbole/crew-192-maskable.png?v=202609141201", "sizes": "192x192", "type": "image/png", "purpose": "maskable" }, { - "src": "/assets/img/app-symbole/crew-512-maskable.png?v=202609141135", + "src": "/assets/img/app-symbole/crew-512-maskable.png?v=202609141201", "sizes": "512x512", "type": "image/png", "purpose": "maskable" diff --git a/workspace/dateien.html b/workspace/dateien.html index 9576ae24..c9e730db 100644 --- a/workspace/dateien.html +++ b/workspace/dateien.html @@ -12,20 +12,20 @@ Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite eine Flaeche sind statt zweier. --> - - - - - - - + + + + + + + - + @@ -108,10 +108,10 @@ - - - - - + + + + + diff --git a/workspace/entwicklung.html b/workspace/entwicklung.html index 7d9149db..1b5a9156 100644 --- a/workspace/entwicklung.html +++ b/workspace/entwicklung.html @@ -7,14 +7,14 @@ - - - - - - - - + + + + + + + + @@ -94,9 +94,9 @@ - - - - + + + + diff --git a/workspace/index.html b/workspace/index.html index 01e9ff99..dc9c998f 100644 --- a/workspace/index.html +++ b/workspace/index.html @@ -30,9 +30,9 @@ - - - + + + @@ -401,6 +401,6 @@ - + diff --git a/workspace/kalender.html b/workspace/kalender.html index 68514a22..765479bb 100644 --- a/workspace/kalender.html +++ b/workspace/kalender.html @@ -12,20 +12,20 @@ Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite eine Flaeche sind statt zweier. --> - - - - - - - + + + + + + + - + @@ -377,11 +377,11 @@ - - - - - - + + + + + + diff --git a/workspace/leistung.html b/workspace/leistung.html index 6ad16ccf..d21e0dbf 100644 --- a/workspace/leistung.html +++ b/workspace/leistung.html @@ -12,20 +12,20 @@ Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite eine Flaeche sind statt zweier. --> - - - - - - - + + + + + + + - + @@ -393,10 +393,10 @@ - - - - - + + + + + diff --git a/workspace/personen.html b/workspace/personen.html index aa3a1d5a..9ef50a89 100644 --- a/workspace/personen.html +++ b/workspace/personen.html @@ -12,20 +12,20 @@ Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite eine Flaeche sind statt zweier. --> - - - - - - - + + + + + + + - + @@ -423,10 +423,10 @@ - - - - - + + + + + diff --git a/workspace/profil.html b/workspace/profil.html index e2279e40..75f7dfaf 100644 --- a/workspace/profil.html +++ b/workspace/profil.html @@ -12,20 +12,20 @@ Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite eine Flaeche sind statt zweier. --> - - - - - - - + + + + + + + - + @@ -214,11 +214,11 @@ - - - - - - + + + + + + diff --git a/workspace/rechte.html b/workspace/rechte.html index defb771e..5e98c93e 100644 --- a/workspace/rechte.html +++ b/workspace/rechte.html @@ -7,14 +7,14 @@ - - - - - - - - + + + + + + + + @@ -134,9 +134,9 @@ 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. --> - - - - + + + + diff --git a/workspace/report.html b/workspace/report.html index 2efe9703..607756f4 100644 --- a/workspace/report.html +++ b/workspace/report.html @@ -12,20 +12,20 @@ Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite eine Flaeche sind statt zweier. --> - - - - - - - + + + + + + + - + @@ -106,11 +106,11 @@ - - - - - - + + + + + + diff --git a/workspace/scouting.html b/workspace/scouting.html index 201ab3d9..3e7faa05 100644 --- a/workspace/scouting.html +++ b/workspace/scouting.html @@ -12,20 +12,20 @@ Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite eine Flaeche sind statt zweier. --> - - - - - - - + + + + + + + - + @@ -173,10 +173,10 @@ - - - - - + + + + + diff --git a/workspace/start.html b/workspace/start.html index f8ef0fdc..78f51d46 100644 --- a/workspace/start.html +++ b/workspace/start.html @@ -12,21 +12,21 @@ Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite eine Flaeche sind statt zweier. --> - - - - + + + + - - + + - + @@ -674,10 +674,10 @@

- - - - - + + + + + diff --git a/workspace/startcheck.html b/workspace/startcheck.html index 258e5177..c6b5f555 100644 --- a/workspace/startcheck.html +++ b/workspace/startcheck.html @@ -12,20 +12,20 @@ Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite eine Flaeche sind statt zweier. --> - - - - - - - + + + + + + + - + @@ -85,11 +85,11 @@ - - - - - - + + + + + + diff --git a/workspace/steckbrief.html b/workspace/steckbrief.html index 885b8ddd..0aa711b1 100644 --- a/workspace/steckbrief.html +++ b/workspace/steckbrief.html @@ -12,20 +12,20 @@ Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite eine Flaeche sind statt zweier. --> - - - - - - - + + + + + + + - + @@ -126,10 +126,10 @@ - - - - - + + + + + diff --git a/workspace/talente.html b/workspace/talente.html index 220e68f4..0eaa18b5 100644 --- a/workspace/talente.html +++ b/workspace/talente.html @@ -7,14 +7,14 @@ - - - - - - - - + + + + + + + + @@ -94,9 +94,9 @@ - - - - + + + + diff --git a/workspace/team.html b/workspace/team.html index b8999df7..93e35582 100644 --- a/workspace/team.html +++ b/workspace/team.html @@ -7,20 +7,20 @@ - - - - - - - + + + + + + + - + @@ -110,10 +110,10 @@ - - - - - + + + + + diff --git a/workspace/teamlage.html b/workspace/teamlage.html index a84e75db..11b9c6cc 100644 --- a/workspace/teamlage.html +++ b/workspace/teamlage.html @@ -7,20 +7,20 @@ - - - - - - - + + + + + + + - + - - - - + + + + diff --git a/workspace/treff-moderation.html b/workspace/treff-moderation.html index c32ce1b7..f13eb55b 100644 --- a/workspace/treff-moderation.html +++ b/workspace/treff-moderation.html @@ -7,14 +7,14 @@ - - - - - - - - + + + + + + + + @@ -110,9 +110,9 @@ - - - - + + + + diff --git a/workspace/treff-regeln.html b/workspace/treff-regeln.html index f6975416..016490a7 100644 --- a/workspace/treff-regeln.html +++ b/workspace/treff-regeln.html @@ -7,18 +7,18 @@ - - - - - - - + + + + + + + - + @@ -190,9 +190,9 @@ 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. --> - - - - + + + + diff --git a/workspace/uebersicht.html b/workspace/uebersicht.html index e860d14a..982f55ea 100644 --- a/workspace/uebersicht.html +++ b/workspace/uebersicht.html @@ -12,22 +12,22 @@ Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite eine Flaeche sind statt zweier. --> - - - - + + + + - - - + + + - + @@ -149,11 +149,11 @@ - + - - - - + + + + diff --git a/workspace/wissen.html b/workspace/wissen.html index 980442da..e00f32e2 100644 --- a/workspace/wissen.html +++ b/workspace/wissen.html @@ -12,20 +12,20 @@ Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite eine Flaeche sind statt zweier. --> - - - - - - - + + + + + + + - + @@ -190,10 +190,10 @@ - - - - - + + + + +