From 6162b1b644a7d2895ce45beaaa2749b4165d8b7f Mon Sep 17 00:00:00 2001 From: "Randy.Fischer" Date: Thu, 16 Apr 2026 08:09:09 +0200 Subject: [PATCH] Add session summary and switch inspection diagram docs --- _docs/session-summary-2026-04-16.md | 236 ++++++++++++++++++++++++++++ _docs/switch-inspection-diagram.md | 41 +++++ 2 files changed, 277 insertions(+) create mode 100644 _docs/session-summary-2026-04-16.md create mode 100644 _docs/switch-inspection-diagram.md diff --git a/_docs/session-summary-2026-04-16.md b/_docs/session-summary-2026-04-16.md new file mode 100644 index 0000000..79990b2 --- /dev/null +++ b/_docs/session-summary-2026-04-16.md @@ -0,0 +1,236 @@ +# Session Summary: Duimstok PWA MVP Build + +**Date:** 2026-04-16 +**Project:** ProRail Duimstok-inspecties Bovenbouw +**Repo:** https://git.en-masse.nl/randy/duimstok.prorail.nl.git + +--- + +## Phase 1: Monolithic HTML Refactor + +**Goal:** Split a single-file app (`duimstok-wissel-gw-sw.html`, 1566 lines) into a layered DDD structure. + +**What was done:** +- Created `src/Domain/`, `src/Application/`, `src/Infrastructure/` layers +- Converted ES modules to classic IIFE scripts attaching to `window.App.*` namespace +- Embedded CSV seed data as a string constant in `seedOrders.js` (no `fetch()` needed) +- Removed all inline styles (`style=""`) and inline event handlers (`onclick`, `oninput`, etc.) +- Replaced inline styles with CSS classes (`.flex-spacer`, `.cap-arrow.lg`, `.section-sub.sm`, `.fotonummers-cell`) +- Wired all event listeners via `addEventListener` in `main.js` and service modules + +**Result:** 30 files, ~2163 lines. Runs by double-clicking `public/index.html` -- no server needed. + +**File structure:** + +``` +01_Applicatie/ +├── public/ +│ ├── index.html +│ ├── css/ base.css, overview.css, form.css, modals.css, responsive.css +│ └── js/ namespace.js, main.js +└── src/ + ├── Domain/ sectionMap.js, scoring.js, orderParser.js + ├── Application/ state.js, persistence.js, screens.js, photoService.js, + │ inspectionForm.js, orderOverview.js, xmlImport.js, exportService.js + └── Infrastructure/ utils.js, geolocation.js, db.js, seedOrders.js, csvLoader.js +``` + +--- + +## Phase 2: PWA Research & Planning + +**Prompt used:** "what are the next steps create a PWA version of this MVP, ideally with offline photo upload functionality which sync when back online. Whats the current supported state of PWA regarding these offline functionalities atm" + +**Key findings:** +- Service Worker, Cache API, IndexedDB, Manifest, installability all work cross-browser (Chromium, Firefox, Safari/iOS 16.4+) +- Background Sync (`sync` event) only works on Chromium -- not Firefox, not Safari/iOS +- Periodic Background Sync: Chromium only (engagement-gated) +- Background Fetch: Chromium only +- Push notifications: universal for installed PWAs (iOS 16.4+) +- Persistent storage: universal, but Safari historically aggressive on eviction + +**Key constraint:** iOS has no true background sync. Design around draining the queue when the user reopens the app and when the `online` event fires. + +**6-step incremental plan identified:** +1. Installable shell (manifest + service worker cache) +2. Switch photo storage from data URLs to Blobs +3. Sync queue in IndexedDB +4. Trigger drain on every available signal (online event, app open, SW sync, manual button) +5. Persistent storage + install hint +6. Backend stub (Symfony controller for POST /api/inspections) + +--- + +## Phase 3: PWA Scaffold Implementation + +**Prompt used:** "Goal is still conversion later on to Symfony, but for now we do want the PWA functionality (add an additional installation and instruction screen for the PWA installation)" + +**Constraint flagged:** PWA features require HTTPS or localhost -- they cannot work from `file://`. + +**Resolution:** Dual-mode codebase: +- `file://` mode: app works exactly as before; PWA init gated by `location.protocol !== 'file:'` and quietly skipped +- `http://localhost` or deployed mode: service worker registers, app becomes installable, install screen shows platform-specific instructions + +**Files created:** +- `public/manifest.webmanifest` -- app manifest with icons, standalone display, ProRail blue theme +- `public/sw.js` -- service worker with app shell precaching (cache-first for statics, network-first for API) +- `public/icons/icon.svg` -- SVG app icon (ProRail blue with white ruler lines) +- `public/css/install.css` -- styles for the install instruction screen +- `src/Application/pwa.js` -- service worker registration, `beforeinstallprompt` capture, standalone detection +- `src/Application/installScreen.js` -- platform-specific install instructions (Chrome/Edge, iOS Safari, Firefox, generic) + +**HTML changes:** +- Added PWA meta tags (`theme-color`, `apple-mobile-web-app-capable`, manifest link, apple-touch-icon) +- Added "Installeren" button to overview toolbar +- Added `screen-install` section with back button and dynamic body +- Added `` for `install.css` +- Added `