diff --git a/backend/main.py b/backend/main.py index b8c033f..c31cc3e 100644 --- a/backend/main.py +++ b/backend/main.py @@ -410,7 +410,7 @@ async def serve_media(path: str, request: _Request): raise _HE(404, "Nicht gefunden.") return _media_response(filepath) -APP_VER = "1092" # muss mit APP_VER in app.js übereinstimmen +APP_VER = "1093" # muss mit APP_VER in app.js übereinstimmen @app.get("/.well-known/assetlinks.json") async def assetlinks(): diff --git a/backend/static/index.html b/backend/static/index.html index 5644915..237f8b5 100644 --- a/backend/static/index.html +++ b/backend/static/index.html @@ -101,9 +101,9 @@ - - - + + +
@@ -625,11 +625,11 @@ - - - - - + + + + + diff --git a/backend/static/js/app.js b/backend/static/js/app.js index d99f484..a1106aa 100644 --- a/backend/static/js/app.js +++ b/backend/static/js/app.js @@ -3,7 +3,7 @@ Router, State-Management, Navigation, Initialisierung. ============================================================ */ -const APP_VER = '1092'; // ← bei jedem Deploy mit Frontend-Änderungen erhöhen +const APP_VER = '1093'; // ← bei jedem Deploy mit Frontend-Änderungen erhöhen const APP_VERSION = '1.6.0'; // ← semantische Version, wird bei make release gesetzt window.APP_VER = APP_VER; // global verfügbar für andere Module (z.B. offline-indicator) window.APP_VERSION = APP_VERSION; diff --git a/backend/static/js/offline-indicator.js b/backend/static/js/offline-indicator.js index 1168673..9fde179 100644 --- a/backend/static/js/offline-indicator.js +++ b/backend/static/js/offline-indicator.js @@ -63,12 +63,9 @@ window.OfflineIndicator = (() => { const c = await caches.open(CACHE_API).catch(() => null); if (!c) return false; const urls = (await c.keys()).map(r => r.url); - const found = [ - urls.some(u => u.includes('/api/expenses')), - urls.some(u => u.includes('/api/routes')), - urls.some(u => u.includes('/api/notes')), - ].filter(Boolean).length; - return found >= 2; // 2 von 3 — toleriert wenn z.B. notes 401 lieferte + return urls.some(u => u.includes('/api/expenses')) + && urls.some(u => u.includes('/api/routes')) + && urls.some(u => u.includes('/api/notes')); } }, { step: 5, title: 'Karten-Kacheln', @@ -257,16 +254,44 @@ window.OfflineIndicator = (() => { } } + // Long-Press auf #worlds-fab → Status-Modal (normaler Click bleibt = FAB-Aktion) + function _bindLongPress() { + const fab = document.getElementById('worlds-fab'); + if (!fab || fab.dataset.lpBound) return; + fab.dataset.lpBound = '1'; + + let timer = null; + let fired = false; + const start = () => { + fired = false; + clearTimeout(timer); + timer = setTimeout(() => { fired = true; openStatus(); }, 600); + }; + const cancel = () => clearTimeout(timer); + fab.addEventListener('touchstart', start, { passive: true }); + fab.addEventListener('touchend', cancel); + fab.addEventListener('touchmove', cancel); + fab.addEventListener('touchcancel',cancel); + fab.addEventListener('mousedown', start); + fab.addEventListener('mouseup', cancel); + fab.addEventListener('mouseleave', cancel); + // Wenn Long-Press gefeuert hat, normalen Click verhindern + fab.addEventListener('click', e => { + if (fired) { e.stopImmediatePropagation(); e.preventDefault(); fired = false; } + }, true); + } + function init() { refresh(); _prefetchPages(); _prefetchTiles(); _prefetchData(); + _bindLongPress(); // Mehrere Retries für hund-spezifische Daten — _appState.activeDog wird oft // erst nach Login/Hunde-Load gesetzt, manchmal mehrere Sekunden nach Init [2_000, 5_000, 10_000, 20_000].forEach(delay => { - setTimeout(() => { _prefetchData(); refresh(); }, delay); + setTimeout(() => { _prefetchData(); refresh(); _bindLongPress(); }, delay); }); if (navigator.serviceWorker) { diff --git a/backend/static/sw.js b/backend/static/sw.js index 74c9aa7..342f211 100644 --- a/backend/static/sw.js +++ b/backend/static/sw.js @@ -4,7 +4,7 @@ ============================================================ */ // ← EINZIGE Stelle für die Version — STATIC_ASSETS und CACHE_VERSION leiten sich ab -const VER = '1092'; +const VER = '1093'; const CACHE_VERSION = `by-v${VER}`; const CACHE_STATIC = `${CACHE_VERSION}-static`; const CACHE_TILES = 'ban-yaro-tiles-v1'; // bleibt über SW-Updates erhalten