diff --git a/backend/static/js/app.js b/backend/static/js/app.js
index cb4b4a9..581a260 100644
--- a/backend/static/js/app.js
+++ b/backend/static/js/app.js
@@ -3,8 +3,8 @@
Router, State-Management, Navigation, Initialisierung.
============================================================ */
-const APP_VER = '539'; // ← bei jedem Deploy mit Frontend-Änderungen erhöhen
-const APP_VERSION = '1.1.4'; // ← semantische Version, wird bei make release gesetzt
+const APP_VER = '536'; // ← bei jedem Deploy mit Frontend-Änderungen erhöhen
+const APP_VERSION = '1.1.3'; // ← semantische Version, wird bei make release gesetzt
const IS_STAGING = location.hostname === 'staging.banyaro.app';
const App = (() => {
diff --git a/backend/static/js/pages/notes.js b/backend/static/js/pages/notes.js
index d78797d..d9ce75d 100644
--- a/backend/static/js/pages/notes.js
+++ b/backend/static/js/pages/notes.js
@@ -136,13 +136,7 @@ window.Page_notes = (() => {
@@ -367,11 +361,6 @@ window.Page_notes = (() => {
_container.querySelector('#notes-privacy-notice')?.remove();
});
- // Neue Notiz
- _container.querySelector('#notes-new-btn')?.addEventListener('click', () => {
- _openCreateModal(_filterType || '');
- });
-
// Filter-Chips
_container.querySelectorAll('.notes-chip').forEach(btn => {
btn.addEventListener('click', () => {
@@ -475,101 +464,6 @@ window.Page_notes = (() => {
_render();
}
- // ----------------------------------------------------------
- // Create-Modal — neue Notiz mit vorausgewählter Kategorie
- // ----------------------------------------------------------
- function _openCreateModal(preselectedType = '') {
- const ERSTELL_RUBRIKEN = RUBRIKEN.filter(r => r.type !== ''); // ohne "Alle"
- let _selType = preselectedType || ERSTELL_RUBRIKEN[0].type;
-
- const modalId = 'notes-create-modal';
- document.getElementById(modalId)?.remove();
-
- const overlay = document.createElement('div');
- overlay.id = modalId;
- overlay.style.cssText = `position:fixed;inset:0;z-index:9999;display:flex;align-items:flex-end;justify-content:center;background:rgba(0,0,0,0.45)`;
-
- const _buildContent = () => {
- const rb = _rubrik(_selType);
- return `
-
-
-
Neue Notiz
-
-
-
-
-
- ${ERSTELL_RUBRIKEN.map(r => `
- `).join('')}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
`;
- };
-
- overlay.innerHTML = _buildContent();
- document.body.appendChild(overlay);
-
- const _rebind = () => {
- overlay.querySelectorAll('.nc-cat').forEach(btn => {
- btn.addEventListener('click', () => {
- _selType = btn.dataset.type;
- overlay.innerHTML = _buildContent();
- _rebind();
- overlay.querySelector('#nc-text')?.focus();
- });
- });
-
- overlay.querySelector('#nc-cancel')?.addEventListener('click', () => overlay.remove());
- overlay.addEventListener('click', e => { if (e.target === overlay) overlay.remove(); });
-
- overlay.querySelector('#nc-save')?.addEventListener('click', async () => {
- const text = overlay.querySelector('#nc-text')?.value?.trim();
- if (!text) { UI.toast.warning('Bitte einen Text eingeben.'); return; }
- const btn = overlay.querySelector('#nc-save');
- await UI.asyncButton(btn, async () => {
- const rb = _rubrik(_selType);
- await API.notes.create(_selType, 'standalone', {
- text,
- parent_label: rb.label,
- });
- overlay.remove();
- _filterType = _selType;
- await _reload();
- UI.toast.success('Notiz gespeichert.');
- });
- });
-
- setTimeout(() => overlay.querySelector('#nc-text')?.focus(), 100);
- };
-
- _rebind();
- }
-
// ----------------------------------------------------------
// Edit-Modal (Bottom-Sheet Stil)
// ----------------------------------------------------------
diff --git a/backend/static/js/pages/settings.js b/backend/static/js/pages/settings.js
index 9a6b596..37f67b5 100644
--- a/backend/static/js/pages/settings.js
+++ b/backend/static/js/pages/settings.js
@@ -604,27 +604,14 @@ window.Page_settings = (() => {
}
if (btn) btn.textContent = 'Prüfe…';
try {
- // Aktuelle Version vom Server holen (no-cache)
- const serverResp = await fetch('/js/app.js', { cache: 'no-store' });
- const serverText = await serverResp.text();
- const match = serverText.match(/APP_VERSION\s*=\s*'([^']+)'/);
- const serverVersion = match?.[1] || null;
- const localVersion = typeof APP_VERSION !== 'undefined' ? APP_VERSION : '0';
-
- // SW update anstoßen
const reg = await navigator.serviceWorker.getRegistration();
await reg?.update();
-
- if (serverVersion && serverVersion !== localVersion) {
- // Neuere Version verfügbar — Seite neu laden
- if (reg?.waiting) reg.waiting.postMessage({ type: 'SKIP_WAITING' });
- UI.toast.info(`Update auf v${serverVersion} verfügbar — Seite wird neu geladen…`);
- setTimeout(() => location.reload(), 1500);
- } else if (reg?.waiting) {
+ if (reg?.waiting) {
+ // Neuer SW wartet — sofort aktivieren
reg.waiting.postMessage({ type: 'SKIP_WAITING' });
UI.toast.success('Update wird installiert…');
} else {
- UI.toast.success(`Ban Yaro ist aktuell — v${localVersion}`);
+ UI.toast.success('Ban Yaro ist aktuell — v' + (typeof APP_VERSION !== 'undefined' ? APP_VERSION : '1.0.0') + '.');
}
} catch {
UI.toast.error('Update-Prüfung fehlgeschlagen.');
diff --git a/backend/static/manifest.json b/backend/static/manifest.json
index fd71b5d..d61feb7 100644
--- a/backend/static/manifest.json
+++ b/backend/static/manifest.json
@@ -1,6 +1,6 @@
{
"id": "/",
- "version": "1.1.4",
+ "version": "1.1.3",
"name": "Ban Yaro — Die Hunde-Plattform",
"short_name": "Ban Yaro",
"description": "Alles rund um deinen Hund. Von Welpe bis Opa.",
diff --git a/backend/static/sw.js b/backend/static/sw.js
index b443693..ecb2350 100644
--- a/backend/static/sw.js
+++ b/backend/static/sw.js
@@ -3,7 +3,7 @@
Offline-Cache + Push Notifications + Tile-Cache
============================================================ */
-const CACHE_VERSION = 'by-v562';
+const CACHE_VERSION = 'by-v559';
const CACHE_STATIC = `${CACHE_VERSION}-static`;
const CACHE_TILES = 'ban-yaro-tiles-v1'; // bleibt über SW-Updates erhalten
const CACHE_API = 'ban-yaro-api-v1'; // API-Response-Cache
@@ -134,13 +134,13 @@ function _isCacheableGet(pathname) {
// INSTALL — App Shell cachen
// ----------------------------------------------------------
self.addEventListener('install', event => {
- self.skipWaiting(); // Sofort übernehmen — kein Warten auf Cache-Aufbau
event.waitUntil(
caches.open(CACHE_STATIC)
.then(cache => cache.addAll(STATIC_ASSETS))
.then(() => caches.open(CACHE_API).then(c =>
fetch('/api/training/exercises').then(r => { if (r.ok) c.put('/api/training/exercises', r); }).catch(() => {})
))
+ .then(() => self.skipWaiting())
);
});