Verwaltung ist jetzt eine eigene App

Wunsch: "ich will die verwaltungsseite auch getrennt runter laden
koennen und installieren koenne."

Bisher gab es ein Manifest fuer den ganzen Webdesign-Bereich; die
Verwaltung war darin nur eine Verknuepfung. Jetzt hat sie ein eigenes
mit eigener "id" -- der Wert, an dem alles haengt: Ohne ihn halten
Browser beide fuer dieselbe App, und die zweite Installation
ueberschreibt die erste, statt danebenzustehen.

EIGENES SYMBOL

Zwei gleich aussehende Kacheln auf dem Startbildschirm waeren keine
Trennung. Das neue Symbol ist ein Ausschnitt des Eiskristall-Wappens --
dasselbe Motiv, das die Verwaltung ohnehin traegt, und klar
unterscheidbar vom schwarzen Husky der oeffentlichen App. Erzeugt aus
cryo-wappen.webp in drei Groessen, die beschneidbare Fassung weiter
herausgezoomt, damit Android die Spitzen des Wappens nicht abschneidet.

Als JPEG statt PNG: 76 statt 385 KB bei 512 Punkten. Bei einem
fotografischen Motiv hat PNG nichts zu gewinnen, und 385 KB fuer ein
Symbol waeren unverhaeltnismaessig.

⚠️ DER GELTUNGSBEREICH IST ABSICHTLICH WEIT

Naheliegend waere "/webdesign/verwaltung" gewesen. Das haette die App
unbrauchbar gemacht: Ohne gueltigen Ausweis leitet der Server auf
/webdesign/zugang.html um -- ausserhalb des Bereichs, und was
ausserhalb liegt, oeffnet der Browser in einem eigenen Fenster. Weil
der Zugang beim Schliessen endet, waere das bei fast jedem Start
passiert: Man tippt auf die App und landet im Browser. Nachgemessen:
verwaltung.html antwortet ohne Ausweis mit 302.

EIN STILLES VERSPRECHEN EINGELOEST

Die Verknuepfungen zeigen auf "?bereich=anfragen" und dergleichen --
und derselbe Parameter steht in den Push-Meldungen. Ausgewertet hat ihn
bisher NIEMAND. Man landete immer auf der Uebersicht, ohne dass etwas
kaputt aussah. Jetzt oeffnet die Seite den gewuenschten Reiter, ueber
einen ausgeloesten Klick auf den vorhandenen Reiter statt ueber
nachgebaute Logik: Daran haengen Signatur, Leuchtbalken, Nachladen und
der Wischstreifen auf dem Handy.

Auch hier hat erst der Test den Fehler gezeigt -- und danach einen in
der Pruefung selbst: Sie erreichte die Funktion gar nicht, weil diese
im gekapselten Bereich liegt. Jetzt nach aussen gegeben, wie schon
window.vwBalkenSetzen.

23 Pruefungen gruen.

Co-Authored-By: Claude Opus 5 <[email protected]>
This commit is contained in:
2026-08-26 16:12:35 +02:00
co-authored by Claude Opus 5
parent 92d2b568de
commit 1608521854
8 changed files with 297 additions and 4 deletions
+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-v58";
const CACHE_NAME = "dogfather-webdesign-v59";
/* Bausteine, die die Oberfläche zum Anzeigen braucht. Bewusst KEINE
HTML-Datei in dieser Liste. */
+66 -2
View File
@@ -12,8 +12,29 @@
<meta name="robots" content="noindex, nofollow, noarchive" />
<link rel="icon" type="image/png" href="/assets/img/favicon.png" />
<meta name="theme-color" content="#05070b" />
<link rel="manifest" href="/webdesign/app.webmanifest" />
<link rel="apple-touch-icon" href="/assets/img/wd-app-180.png" />
<!-- EIGENES Manifest, nicht das des Webdesign-Bereichs (26.08.2026).
Damit erscheint die Verwaltung als eigenstaendige App neben
"Dogfather Webdesign", mit eigenem Namen und eigenem Symbol. Der
Unterschied macht die Datei "id": Ohne sie waeren beide fuer den
Browser dieselbe App, und die zweite Installation wuerde die erste
ueberschreiben.
⚠️ Der Geltungsbereich ("scope") umfasst bewusst den GANZEN
Webdesign-Bereich und nicht nur die Verwaltungsseite.
Naheliegender waere "/webdesign/verwaltung" gewesen -- sauber
abgegrenzt. Es haette die App aber unbrauchbar gemacht: Ohne
gueltigen Ausweis leitet der Server auf /webdesign/zugang.html um,
und alles ausserhalb des Geltungsbereichs oeffnet der Browser in
einem eigenen Fenster. Weil der Zugang beim Schliessen der Seite
endet (Wunsch vom 22.08.2026), waere das bei fast jedem Start
passiert: Man tippt auf die App und landet im Browser.
Nachgemessen, nicht vermutet: verwaltung.html antwortet ohne
Ausweis mit 302 auf zugang.html. -->
<link rel="manifest" href="/webdesign/verwaltung.webmanifest" />
<link rel="apple-touch-icon" href="/assets/img/wd-admin-192.jpg" />
<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=20260823wd20" />
@@ -2469,8 +2490,51 @@
function zeigeBereich() {
document.getElementById("vw-anmeldung").hidden = true;
document.getElementById("vw-bereich").hidden = false;
bereichAusAdresse();
}
/* ---------------------------------------------------------------------
?bereich=... AUS DER ADRESSE ÖFFNEN
Gebraucht an zwei Stellen, die das bisher nur VERSPROCHEN haben:
- die Verknüpfungen der installierten App ("Anfragen", "Projekte",
"Postfach" beim langen Antippen des Symbols)
- der Verweis in einer Push-Meldung, der zur betreffenden Anfrage
führen soll
Beide zeigten auf "?bereich=anfragen" — ausgewertet hat den Parameter
bisher niemand. Man landete immer auf der Übersicht, ohne dass etwas
kaputt aussah. Genau die Sorte stiller Wirkungslosigkeit, gegen die
hier an anderer Stelle schon einiges gebaut wurde.
Umgesetzt über einen ausgelösten Klick auf den vorhandenen Reiter,
nicht über nachgebaute Logik: Am Reiter hängen Signatur, Leuchtbalken,
das Nachladen der Daten und das Verschieben des Wischstreifens auf dem
Handy. Ein zweiter Weg dorthin wäre ein zweiter Weg, der irgendwann
nicht mehr mitgepflegt wird.
Läuft NACH der Anmeldung, denn vorher gibt es die Reiter nicht.
--------------------------------------------------------------------- */
function bereichAusAdresse() {
try {
var wunsch = new URLSearchParams(window.location.search).get("bereich");
if (!wunsch) return;
var knopf = document.querySelector('[data-tab="' + wunsch.replace(/[^a-z]/gi, "") + '"]');
if (knopf && !knopf.classList.contains("vw-an")) knopf.click();
} catch (e) { /* alter Browser: dann eben die Übersicht */ }
}
/* Nach aussen verfuegbar machen — gleiches Vorgehen wie bei
window.vwBalkenSetzen weiter unten.
Grund ist hier die Prüfbarkeit: Der Aufruf sitzt hinter der
Anmeldung, und ein Test, der sich erst anmelden müsste, prüft am
Ende die Anmeldung statt die Sache. Ohne diesen Zugang war meine
eigene Prüfung wirkungslos und meldete "geöffnet wurde: uebersicht"
— sie hatte die Funktion schlicht nie erreicht. */
window.vwBereichAusAdresse = bereichAusAdresse;
document.getElementById("vw-login-form").addEventListener("submit", async function (e) {
e.preventDefault();
var feld = document.getElementById("vw-feld-code");
+47
View File
@@ -0,0 +1,47 @@
{
"name": "Dogfather Verwaltung",
"short_name": "Verwaltung",
"description": "Anfragen, Projekte, Kunden und Zahlungen an einer Stelle. Meldet sich, sobald eine neue Anfrage eingeht.",
"lang": "de",
"dir": "ltr",
"start_url": "/webdesign/verwaltung.html?start=app",
"id": "/webdesign/verwaltung",
"scope": "/webdesign/",
"display": "standalone",
"display_override": ["window-controls-overlay", "standalone", "minimal-ui"],
"orientation": "any",
"background_color": "#05070b",
"theme_color": "#05070b",
"categories": ["business", "productivity"],
"icons": [
{ "src": "/assets/img/wd-admin-192.jpg", "sizes": "192x192", "type": "image/jpeg", "purpose": "any" },
{ "src": "/assets/img/wd-admin-512.jpg", "sizes": "512x512", "type": "image/jpeg", "purpose": "any" },
{ "src": "/assets/img/wd-admin-512-maskable.jpg", "sizes": "512x512", "type": "image/jpeg", "purpose": "maskable" }
],
"shortcuts": [
{
"name": "Anfragen",
"short_name": "Anfragen",
"url": "/webdesign/verwaltung.html?bereich=anfragen",
"icons": [{ "src": "/assets/img/wd-admin-192.jpg", "sizes": "192x192" }]
},
{
"name": "Projekte",
"short_name": "Projekte",
"url": "/webdesign/verwaltung.html?bereich=projekte",
"icons": [{ "src": "/assets/img/wd-admin-192.jpg", "sizes": "192x192" }]
},
{
"name": "Postfach",
"short_name": "Postfach",
"url": "/webdesign/verwaltung.html?bereich=postfach",
"icons": [{ "src": "/assets/img/wd-admin-192.jpg", "sizes": "192x192" }]
}
]
}