Mobile PWA für Baustellen-Doku — Foto-Upload, Sprachnotizen, Skizzen, offline-fähig. SvelteKit + Workbox.
Find a file
Eduard Wisch d19e4eb41e
All checks were successful
Deploy baustelle-pwa / deploy (push) Successful in 1s
feat: 📲 Install-Button in Topbar — umgeht Chrome Engagement-Heuristik
Chrome zeigt 'App installieren' im Menü erst nach mehrmaligem Besuch
mit User-Interaktion. Das ist die sog. Site-Engagement-Heuristik —
keine technische Voraussetzung, sondern UX-Gate.

Workaround: beforeinstallprompt-Event abfangen und manuell auslösen.

- 📲 Install-Button in Topbar (standardmäßig versteckt)
- Bei beforeinstallprompt: Event speichern, Button anzeigen
- Klick → prompt() aufrufen → Install-Dialog öffnet sich
- appinstalled-Event: Button wieder verstecken
- iOS-Fallback: Hinweis zum manuellen 'Zum Home-Bildschirm'

Damit ist die Install-Funktion jederzeit sichtbar und nutzbar,
unabhängig davon wie oft der User die Seite vorher besucht hat.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
[deploy]
2026-04-09 01:31:16 +02:00
.forgejo/workflows fix: Deploy nach modules/baustelle/ statt baustelle/ 2026-04-08 22:56:42 +02:00
icons feat: Neues PWA-Logo — Klemmbrett mit Schraubenschlüssel (SVG + PNG) 2026-04-09 01:12:47 +02:00
lib feat: Phase 4 Block 1 — Seite bearbeiten, PDF-Vorschau, Unterschrift, Share Target 2026-04-09 01:00:24 +02:00
.gitignore feat: Initiales Release Baustelle PWA v1.0.0 [deploy] 2026-04-08 22:50:01 +02:00
app.css feat: Phase 4 Block 1 — Seite bearbeiten, PDF-Vorschau, Unterschrift, Share Target 2026-04-09 01:00:24 +02:00
app.js feat: Phase 4 Block 1 — Seite bearbeiten, PDF-Vorschau, Unterschrift, Share Target 2026-04-09 01:00:24 +02:00
index.php feat: 📲 Install-Button in Topbar — umgeht Chrome Engagement-Heuristik 2026-04-09 01:31:16 +02:00
manifest.webmanifest feat: PWA Cache-Busting via filemtime (claude-db #201) — kein manuelles Hochzählen mehr 2026-04-09 01:26:26 +02:00
README.md feat: Initiales Release Baustelle PWA v1.0.0 [deploy] 2026-04-08 22:50:01 +02:00
share.html feat: Phase 4 Block 1 — Seite bearbeiten, PDF-Vorschau, Unterschrift, Share Target 2026-04-09 01:00:24 +02:00
sw.js feat: PWA Cache-Busting via filemtime (claude-db #201) — kein manuelles Hochzählen mehr 2026-04-09 01:26:26 +02:00

Baustelle PWA

Mobile Progressive Web App für die Baustellen-Doku — Foto-Upload, Sprachnotizen, Skizzen, offline-fähig. Spricht die REST-API des Dolibarr-Bericht-Moduls.

Stack

  • Vanilla JavaScript — kein Build, keine Framework-Abhängigkeit
  • Service Worker für App-Shell-Cache (Workbox-frei, eigene Implementierung)
  • IndexedDB für JWT-Storage und Offline-Upload-Queue
  • REST API des bericht-Dolibarr-Moduls unter /custom/bericht/api/

Features (MVP)

  • Login mit Dolibarr-Credentials → JWT (7 Tage gültig)
  • Auftragsliste mit Suche, gefiltert auf eigene Aufträge (Multi-User)
  • Auftragsdetail mit Kunde, Adresse, Telefon (Click-to-Call)
  • Foto-Aufnahme direkt aus der Kamera oder aus Galerie
  • Clientseitige Bild-Verkleinerung auf 2000px (JPEG q=0.85)
  • Offline-Queue: bei fehlgeschlagenem Upload landet das Foto in IndexedDB
  • Auto-Sync wenn wieder online (mit Status-Badge)
  • Service Worker für Offline-Start
  • Installierbar als PWA (Home-Screen-Icon)

Geplant (Phase 4)

  • Sprachnotizen via MediaRecorder
  • Touch-Skizzen-Editor für Bilder
  • Schnell-Bericht direkt in der PWA erstellen
  • Touch-Unterschrift abnehmen
  • PIN-Schutz / WebAuthn
  • Push-Notifications für neue Aufträge
  • Web Share Target API

Hosting

Wird bei jedem Push nach /srv/http/baustelle/ (lokal) bzw. /mnt/appdata/firma/dolibarr-202509/baustelle/ (prod) deployt. Apache-Alias unter https://awl.data-it-solution.de/baustelle/.

Verzeichnis-Struktur

baustelle-pwa/
├── index.html              App-Shell
├── manifest.webmanifest    PWA Manifest
├── sw.js                   Service Worker
├── app.js                  Hauptlogik (Routes, Views)
├── app.css                 Mobile-first Styling
├── lib/
│   ├── idb.js              IndexedDB-Wrapper
│   ├── api.js              REST-API-Client (JWT)
│   ├── offline.js          Offline-Queue + Sync
│   └── router.js           Hash-Router
└── icons/
    ├── icon-192.png
    └── icon-512.png

API

Die App spricht ausschließlich die Bericht-API:

  • POST /api/auth.php — Login mit Dolibarr-Credentials
  • GET /api/orders.php — Aufträge des Users
  • GET /api/orders.php?id=X — Auftrag-Detail
  • GET /api/orders.php?id=X&action=photos — Anhang-Liste
  • POST /api/orders.php?id=X&action=upload_photo — Foto-Upload
  • GET /api/reports.php?id=X — Bericht-Detail

Lizenz

GPL v3+