Verwaltung: Ausweis vorsorglich erneuern statt erst nach dem Fehlschlag

"wenn ich von postfach auf projekte oder so gehe da werd ich immer wieder
mien zugangscode gefragt ... ich will nur den zugangscode anfrage wenn
ich auf die seite will und fertig"

Die Wiederholung bei 401 (v12) rettet zwar jeden Fall, greift aber erst,
NACHDEM eine Anfrage abgewiesen wurde: ein unnoetiger Umlauf, und
solange steht ein Ladehinweis auf dem Schirm.

Jetzt laeuft der Ausweis gar nicht erst ab. Er gilt 15 Minuten, erneuert
wird alle 10 -- mit Abstand, damit ein langsamer Netzzugang nicht ins
Zeitfenster hineinlaeuft. Im Hintergrund pausiert die Erneuerung, das
waere Verschwendung.

Dazu beim Zurueckkommen ins Fenster: War der Rechner zwischendurch zu,
ist der Ausweis mit Sicherheit abgelaufen. Dann soll der erste Klick
sofort sitzen statt ueber einen Fehlschlag zu gehen. Beim schnellen Hin-
und Herwechseln zwischen zwei Fenstern passiert nichts -- unter einer
Minute wird nicht erneuert.

Die Codeeingabe erscheint jetzt nur noch in genau zwei Faellen: beim
ersten Betreten der Seite und wenn die Zugangssitzung wirklich abgelaufen
ist (8 Stunden oder Seite geschlossen). Genau so war es gewuenscht.

GEPRUEFT: sieben Reiterwechsel hintereinander -- postfach, projekte,
kunden, zahlungen, anfragen, postfach, zahlungen -- und vor JEDEM wurde
der Ausweis kuenstlich fuer ungueltig erklaert. Null Codeabfragen, die
Verwaltung blieb offen, der Inhalt erschien. Verwaltung weiterhin
69 von 69.

Versionsstempel und Cache-Name auf v13.

Co-Authored-By: Claude Opus 5 <[email protected]>
This commit is contained in:
2026-08-23 17:28:35 +02:00
co-authored by Claude Opus 5
parent bd9051bfb7
commit 2ec935ccc6
14 changed files with 93 additions and 55 deletions
+4 -4
View File
@@ -13,8 +13,8 @@
<meta name="apple-mobile-web-app-capable" content="yes" />
<meta name="apple-mobile-web-app-status-bar-style" content="black-translucent" />
<meta name="apple-mobile-web-app-title" content="Dogfather Webdesign" />
<link rel="stylesheet" href="/assets/css/main.css?v=20260823wd12" />
<link rel="stylesheet" href="/assets/css/webdesign.css?v=20260823wd12" />
<link rel="stylesheet" href="/assets/css/main.css?v=20260823wd13" />
<link rel="stylesheet" href="/assets/css/webdesign.css?v=20260823wd13" />
<style>
/* Zeitstrahl: die Linie verbindet die Nummernkreise. Sie liegt hinter
den Kreisen (z-index) und endet beim letzten Schritt, damit sie nicht
@@ -183,7 +183,7 @@
<div id="wd-fuss"></div>
<script src="/assets/js/i18n-wd-ablauf.js?v=20260823wd12"></script>
<script src="/assets/js/wd-core.js?v=20260823wd12"></script>
<script src="/assets/js/i18n-wd-ablauf.js?v=20260823wd13"></script>
<script src="/assets/js/wd-core.js?v=20260823wd13"></script>
</body>
</html>
+5 -5
View File
@@ -13,8 +13,8 @@
<meta name="apple-mobile-web-app-capable" content="yes" />
<meta name="apple-mobile-web-app-status-bar-style" content="black-translucent" />
<meta name="apple-mobile-web-app-title" content="Dogfather Webdesign" />
<link rel="stylesheet" href="/assets/css/main.css?v=20260823wd12" />
<link rel="stylesheet" href="/assets/css/webdesign.css?v=20260823wd12" />
<link rel="stylesheet" href="/assets/css/main.css?v=20260823wd13" />
<link rel="stylesheet" href="/assets/css/webdesign.css?v=20260823wd13" />
<style>
/* ---------- Schrittanzeige ----------
Zeigt alle vier Schritte gleichzeitig statt nur "3 von 4". Man sieht
@@ -418,8 +418,8 @@
<div id="wd-fuss"></div>
<script src="/assets/js/i18n-wd-anfrage.js?v=20260823wd12"></script>
<script src="/assets/js/wd-core.js?v=20260823wd12"></script>
<script src="/assets/js/wd-anfrage.js?v=20260823wd12"></script>
<script src="/assets/js/i18n-wd-anfrage.js?v=20260823wd13"></script>
<script src="/assets/js/wd-core.js?v=20260823wd13"></script>
<script src="/assets/js/wd-anfrage.js?v=20260823wd13"></script>
</body>
</html>
+4 -4
View File
@@ -13,8 +13,8 @@
<meta name="apple-mobile-web-app-capable" content="yes" />
<meta name="apple-mobile-web-app-status-bar-style" content="black-translucent" />
<meta name="apple-mobile-web-app-title" content="Dogfather Webdesign" />
<link rel="stylesheet" href="/assets/css/main.css?v=20260823wd12" />
<link rel="stylesheet" href="/assets/css/webdesign.css?v=20260823wd12" />
<link rel="stylesheet" href="/assets/css/main.css?v=20260823wd13" />
<link rel="stylesheet" href="/assets/css/webdesign.css?v=20260823wd13" />
<style>
.fq-thema { scroll-margin-top: 90px; }
.fq-thema + .fq-thema { margin-top: clamp(2rem, 4vw, 3rem); }
@@ -195,7 +195,7 @@
<div id="wd-fuss"></div>
<script src="/assets/js/i18n-wd-faq.js?v=20260823wd12"></script>
<script src="/assets/js/wd-core.js?v=20260823wd12"></script>
<script src="/assets/js/i18n-wd-faq.js?v=20260823wd13"></script>
<script src="/assets/js/wd-core.js?v=20260823wd13"></script>
</body>
</html>
+4 -4
View File
@@ -16,8 +16,8 @@
<meta name="apple-mobile-web-app-capable" content="yes" />
<meta name="apple-mobile-web-app-status-bar-style" content="black-translucent" />
<meta name="apple-mobile-web-app-title" content="Dogfather Webdesign" />
<link rel="stylesheet" href="/assets/css/main.css?v=20260823wd12" />
<link rel="stylesheet" href="/assets/css/webdesign.css?v=20260823wd12" />
<link rel="stylesheet" href="/assets/css/main.css?v=20260823wd13" />
<link rel="stylesheet" href="/assets/css/webdesign.css?v=20260823wd13" />
<style>
/* ---------- Nur auf der Startseite gebraucht ---------- */
@@ -407,8 +407,8 @@
<div id="wd-fuss"></div>
<script src="/assets/js/i18n-wd-index.js?v=20260823wd12"></script>
<script src="/assets/js/wd-core.js?v=20260823wd12"></script>
<script src="/assets/js/i18n-wd-index.js?v=20260823wd13"></script>
<script src="/assets/js/wd-core.js?v=20260823wd13"></script>
<script>
/* ---------------------------------------------------------------------
Marken-Intro (Masterplan S.3, Schritt 02: "Nach erfolgreichem Code
+4 -4
View File
@@ -13,8 +13,8 @@
<meta name="apple-mobile-web-app-capable" content="yes" />
<meta name="apple-mobile-web-app-status-bar-style" content="black-translucent" />
<meta name="apple-mobile-web-app-title" content="Dogfather Webdesign" />
<link rel="stylesheet" href="/assets/css/main.css?v=20260823wd12" />
<link rel="stylesheet" href="/assets/css/webdesign.css?v=20260823wd12" />
<link rel="stylesheet" href="/assets/css/main.css?v=20260823wd13" />
<link rel="stylesheet" href="/assets/css/webdesign.css?v=20260823wd13" />
<style>
/* Sprungmarken.
Frueher eine waagerecht wischbare Leiste. Rueckmeldung 22.08.2026:
@@ -331,7 +331,7 @@
<div id="wd-fuss"></div>
<script src="/assets/js/i18n-wd-leistungen.js?v=20260823wd12"></script>
<script src="/assets/js/wd-core.js?v=20260823wd12"></script>
<script src="/assets/js/i18n-wd-leistungen.js?v=20260823wd13"></script>
<script src="/assets/js/wd-core.js?v=20260823wd13"></script>
</body>
</html>
+5 -5
View File
@@ -12,8 +12,8 @@
<meta name="apple-mobile-web-app-capable" content="yes" />
<meta name="apple-mobile-web-app-status-bar-style" content="black-translucent" />
<meta name="apple-mobile-web-app-title" content="Dogfather Webdesign" />
<link rel="stylesheet" href="/assets/css/main.css?v=20260823wd12" />
<link rel="stylesheet" href="/assets/css/webdesign.css?v=20260823wd12" />
<link rel="stylesheet" href="/assets/css/main.css?v=20260823wd13" />
<link rel="stylesheet" href="/assets/css/webdesign.css?v=20260823wd13" />
<style>
.po-login { max-width: 440px; margin: clamp(1.5rem,6vh,4rem) auto; }
@@ -134,8 +134,8 @@
<div id="wd-fuss"></div>
<script src="/assets/js/i18n-wd-portal.js?v=20260823wd12"></script>
<script src="/assets/js/wd-core.js?v=20260823wd12"></script>
<script src="/assets/js/wd-portal.js?v=20260823wd12"></script>
<script src="/assets/js/i18n-wd-portal.js?v=20260823wd13"></script>
<script src="/assets/js/wd-core.js?v=20260823wd13"></script>
<script src="/assets/js/wd-portal.js?v=20260823wd13"></script>
</body>
</html>
+4 -4
View File
@@ -13,8 +13,8 @@
<meta name="apple-mobile-web-app-capable" content="yes" />
<meta name="apple-mobile-web-app-status-bar-style" content="black-translucent" />
<meta name="apple-mobile-web-app-title" content="Dogfather Webdesign" />
<link rel="stylesheet" href="/assets/css/main.css?v=20260823wd12" />
<link rel="stylesheet" href="/assets/css/webdesign.css?v=20260823wd12" />
<link rel="stylesheet" href="/assets/css/main.css?v=20260823wd13" />
<link rel="stylesheet" href="/assets/css/webdesign.css?v=20260823wd13" />
<style>
.pfo-projekt { overflow: hidden; padding: 0; margin-bottom: clamp(1.4rem, 3vw, 2.2rem); }
.pfo-bild {
@@ -192,7 +192,7 @@
<div id="wd-fuss"></div>
<script src="/assets/js/i18n-wd-portfolio.js?v=20260823wd12"></script>
<script src="/assets/js/wd-core.js?v=20260823wd12"></script>
<script src="/assets/js/i18n-wd-portfolio.js?v=20260823wd13"></script>
<script src="/assets/js/wd-core.js?v=20260823wd13"></script>
</body>
</html>
+4 -4
View File
@@ -13,8 +13,8 @@
<meta name="apple-mobile-web-app-capable" content="yes" />
<meta name="apple-mobile-web-app-status-bar-style" content="black-translucent" />
<meta name="apple-mobile-web-app-title" content="Dogfather Webdesign" />
<link rel="stylesheet" href="/assets/css/main.css?v=20260823wd12" />
<link rel="stylesheet" href="/assets/css/webdesign.css?v=20260823wd12" />
<link rel="stylesheet" href="/assets/css/main.css?v=20260823wd13" />
<link rel="stylesheet" href="/assets/css/webdesign.css?v=20260823wd13" />
<style>
.pr-preis-gross { font-family: var(--font-head); font-weight: 800; color: var(--wd-blau); white-space: nowrap; }
@@ -196,7 +196,7 @@
<div id="wd-fuss"></div>
<script src="/assets/js/i18n-wd-preise.js?v=20260823wd12"></script>
<script src="/assets/js/wd-core.js?v=20260823wd12"></script>
<script src="/assets/js/i18n-wd-preise.js?v=20260823wd13"></script>
<script src="/assets/js/wd-core.js?v=20260823wd13"></script>
</body>
</html>
+3 -3
View File
@@ -8,8 +8,8 @@
<link rel="icon" type="image/png" href="/assets/img/favicon.png" />
<link rel="manifest" href="/webdesign/app.webmanifest" />
<meta name="theme-color" content="#05070b" />
<link rel="stylesheet" href="/assets/css/main.css?v=20260823wd12" />
<link rel="stylesheet" href="/assets/css/webdesign.css?v=20260823wd12" />
<link rel="stylesheet" href="/assets/css/main.css?v=20260823wd13" />
<link rel="stylesheet" href="/assets/css/webdesign.css?v=20260823wd13" />
</head>
<body class="wd">
<div id="wd-kopf"></div>
@@ -400,6 +400,6 @@
<div id="wd-fuss"></div>
<script src="/assets/js/wd-core.js?v=20260823wd12"></script>
<script src="/assets/js/wd-core.js?v=20260823wd13"></script>
</body>
</html>
+1 -1
View File
@@ -34,7 +34,7 @@
Start alle alten Zwischenspeicher weg. Muss bei jeder Änderung an den
Dateien unten hochgezählt werden, sonst hängen Nutzer auf einem alten
Stand fest. */
const CACHE_NAME = "dogfather-webdesign-v12";
const CACHE_NAME = "dogfather-webdesign-v13";
/* Bausteine, die die Oberfläche zum Anzeigen braucht. Bewusst KEINE
HTML-Datei in dieser Liste. */
+4 -4
View File
@@ -13,8 +13,8 @@
<meta name="apple-mobile-web-app-capable" content="yes" />
<meta name="apple-mobile-web-app-status-bar-style" content="black-translucent" />
<meta name="apple-mobile-web-app-title" content="Dogfather Webdesign" />
<link rel="stylesheet" href="/assets/css/main.css?v=20260823wd12" />
<link rel="stylesheet" href="/assets/css/webdesign.css?v=20260823wd12" />
<link rel="stylesheet" href="/assets/css/main.css?v=20260823wd13" />
<link rel="stylesheet" href="/assets/css/webdesign.css?v=20260823wd13" />
<style>
.ue-kopf { display: grid; grid-template-columns: minmax(0, .85fr) minmax(0, 1.15fr); gap: clamp(1.5rem, 4vw, 3rem); align-items: center; }
/* Auf dem Handy zuerst der Text, dann das Bild: sonst schiebt ein
@@ -127,7 +127,7 @@
<div id="wd-fuss"></div>
<script src="/assets/js/i18n-wd-ueber.js?v=20260823wd12"></script>
<script src="/assets/js/wd-core.js?v=20260823wd12"></script>
<script src="/assets/js/i18n-wd-ueber.js?v=20260823wd13"></script>
<script src="/assets/js/wd-core.js?v=20260823wd13"></script>
</body>
</html>
+42 -4
View File
@@ -11,8 +11,8 @@
<link rel="apple-touch-icon" href="/assets/img/wd-app-180.png" />
<meta name="apple-mobile-web-app-capable" content="yes" />
<meta name="apple-mobile-web-app-title" content="DF Verwaltung" />
<link rel="stylesheet" href="/assets/css/main.css?v=20260823wd12" />
<link rel="stylesheet" href="/assets/css/webdesign.css?v=20260823wd12" />
<link rel="stylesheet" href="/assets/css/main.css?v=20260823wd13" />
<link rel="stylesheet" href="/assets/css/webdesign.css?v=20260823wd13" />
<style>
/* =====================================================================
Verwaltungsbereich — bewusst NUR AUF DEUTSCH.
@@ -761,7 +761,7 @@
<div class="vw-detail-blatt" id="vw-detail-blatt"></div>
</div>
<script src="/assets/js/wd-core.js?v=20260823wd12"></script>
<script src="/assets/js/wd-core.js?v=20260823wd13"></script>
<script>
/* =====================================================================
Verwaltung: Anfragen ansehen, Status ändern, Notizen, Archivieren.
@@ -865,6 +865,42 @@
}
}
/* ---------------------------------------------------------------------
VORSORGLICHE ERNEUERUNG
Die Wiederholung oben rettet jeden Fall — aber sie tritt erst ein,
NACHDEM eine Anfrage abgewiesen wurde. Das kostet einen unnötigen
Umlauf, und in der Zwischenzeit steht ein Ladehinweis auf dem Schirm.
Besser ist, gar nicht erst ablaufen zu lassen. Der Ausweis gilt
15 Minuten, erneuert wird alle 10 — mit Abstand, damit ein langsamer
Netzzugang nicht ins Zeitfenster hineinläuft.
Und beim Zurückkommen: War der Rechner zwischendurch zu, ist der
Ausweis mit Sicherheit abgelaufen. Dann soll der erste Klick sofort
funktionieren und nicht erst über einen Fehlschlag gehen. */
var ERNEUERN_MS = 10 * 60 * 1000;
var letzteErneuerung = Date.now();
function erneuerungPlanen() {
setInterval(function () {
if (!token) return;
if (document.hidden) return; // im Hintergrund unnötig
letzteErneuerung = Date.now();
ausweisErneuern();
}, ERNEUERN_MS);
document.addEventListener("visibilitychange", function () {
if (document.hidden || !token) return;
/* Nur wenn wirklich Zeit vergangen ist — beim schnellen Hin- und
Herwechseln zwischen zwei Fenstern wäre jedes Mal ein neuer
Ausweis reine Verschwendung. */
if (Date.now() - letzteErneuerung < 60 * 1000) return;
letzteErneuerung = Date.now();
ausweisErneuern();
});
}
/* ---------------- Anmeldung ---------------- */
function zeigeAnmeldung() {
document.getElementById("vw-anmeldung").hidden = false;
@@ -903,6 +939,7 @@
neue Nachrichten erst, wenn man den Reiter zufaellig anklickt --
also womoeglich tagelang nicht. */
zaehlerHolen();
erneuerungPlanen();
} catch (fehler) {
feld.classList.add("wd-feld--fehler");
feld.querySelector(".wd-feld-fehler").textContent = fehler.message || "Anmeldung fehlgeschlagen.";
@@ -2703,7 +2740,7 @@
async function start() {
token = tokenLesen();
if (token) { zeigeBereich(); ladeAnfragen(); zaehlerHolen(); return; }
if (token) { zeigeBereich(); ladeAnfragen(); zaehlerHolen(); erneuerungPlanen(); return; }
var ausweis = await ausweisHolen();
if (ausweis) {
@@ -2717,6 +2754,7 @@
kommt von der Zugangswand und ist sofort drin) -- ohne diese
Zeile bliebe der Zähler ausgerechnet im Normalfall leer. */
zaehlerHolen();
erneuerungPlanen();
return;
}
zeigeAnmeldung();
+5 -5
View File
@@ -9,8 +9,8 @@
<link rel="icon" type="image/png" href="/assets/img/favicon.png" />
<link rel="manifest" href="/webdesign/app.webmanifest" />
<meta name="theme-color" content="#05070b" />
<link rel="stylesheet" href="/assets/css/main.css?v=20260823wd12" />
<link rel="stylesheet" href="/assets/css/webdesign.css?v=20260823wd12" />
<link rel="stylesheet" href="/assets/css/main.css?v=20260823wd13" />
<link rel="stylesheet" href="/assets/css/webdesign.css?v=20260823wd13" />
</head>
<body class="wd">
<div id="wd-kopf"></div>
@@ -137,8 +137,8 @@
<div id="wd-fuss"></div>
<script src="/assets/js/i18n-wd-widerruf.js?v=20260823wd12"></script>
<script src="/assets/js/wd-core.js?v=20260823wd12"></script>
<script src="/assets/js/wd-widerruf.js?v=20260823wd12"></script>
<script src="/assets/js/i18n-wd-widerruf.js?v=20260823wd13"></script>
<script src="/assets/js/wd-core.js?v=20260823wd13"></script>
<script src="/assets/js/wd-widerruf.js?v=20260823wd13"></script>
</body>
</html>
+4 -4
View File
@@ -21,8 +21,8 @@
<meta name="apple-mobile-web-app-capable" content="yes" />
<meta name="apple-mobile-web-app-status-bar-style" content="black-translucent" />
<meta name="apple-mobile-web-app-title" content="Dogfather Webdesign" />
<link rel="stylesheet" href="/assets/css/main.css?v=20260823wd12" />
<link rel="stylesheet" href="/assets/css/webdesign.css?v=20260823wd12" />
<link rel="stylesheet" href="/assets/css/main.css?v=20260823wd13" />
<link rel="stylesheet" href="/assets/css/webdesign.css?v=20260823wd13" />
<style>
/* =====================================================================
Zugangswand — nur hier gebraucht, deshalb bewusst NICHT in
@@ -177,8 +177,8 @@
</div>
</main>
<script src="/assets/js/i18n-wd-zugang.js?v=20260823wd12"></script>
<script src="/assets/js/wd-core.js?v=20260823wd12"></script>
<script src="/assets/js/i18n-wd-zugang.js?v=20260823wd13"></script>
<script src="/assets/js/wd-core.js?v=20260823wd13"></script>
<script>
(function () {
"use strict";