From ad988db25e83fef07b0d3dc878cc326e05851170 Mon Sep 17 00:00:00 2001 From: rene Date: Thu, 30 Apr 2026 11:32:41 +0200 Subject: [PATCH 01/10] Fix: APP_VERSION 1.1.1 in app.js + Makefile aktualisiert APP_VERSION bei release, SW by-v546 --- Makefile | 3 ++- backend/static/js/app.js | 4 ++-- backend/static/sw.js | 2 +- 3 files changed, 5 insertions(+), 4 deletions(-) diff --git a/Makefile b/Makefile index 8bc1dc6..2427674 100644 --- a/Makefile +++ b/Makefile @@ -138,7 +138,8 @@ release: check-ssh @git checkout main @git merge develop --no-ff -m "Release v$(VERSION)" @sed -i '' 's/"version": "[^"]*"/"version": "$(VERSION)"/' backend/static/manifest.json - @git add backend/static/manifest.json + @sed -i '' "s/const APP_VERSION = '[^']*'/const APP_VERSION = '$(VERSION)'/" backend/static/js/app.js + @git add backend/static/manifest.json backend/static/js/app.js @git commit --amend --no-edit @git tag "v$(VERSION)" @git push $(GIT_REMOTE) main --tags diff --git a/backend/static/js/app.js b/backend/static/js/app.js index c05a7a5..81928c7 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 = '522'; // ← bei jedem Deploy mit Frontend-Änderungen erhöhen -const APP_VERSION = '1.0.0'; // ← semantische Version, wird bei make release gesetzt +const APP_VER = '523'; // ← bei jedem Deploy mit Frontend-Änderungen erhöhen +const APP_VERSION = '1.1.1'; // ← semantische Version, wird bei make release gesetzt const IS_STAGING = location.hostname === 'staging.banyaro.app'; const App = (() => { diff --git a/backend/static/sw.js b/backend/static/sw.js index 88448fe..b1e2b40 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-v545'; +const CACHE_VERSION = 'by-v546'; 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 From 6f63a98a301a1a069bd307e21df04e47a1610775 Mon Sep 17 00:00:00 2001 From: rene Date: Thu, 30 Apr 2026 13:41:37 +0200 Subject: [PATCH 02/10] =?UTF-8?q?Fix:=20Admin=20Partner-Tab=20=E2=80=94=20?= =?UTF-8?q?null-Guard=20f=C3=BCr=20codes,=20Tab-Label=20auf=20'Partner'=20?= =?UTF-8?q?gek=C3=BCrzt,=20SW=20by-v547?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- backend/static/js/app.js | 2 +- backend/static/js/pages/admin.js | 6 ++---- backend/static/sw.js | 2 +- 3 files changed, 4 insertions(+), 6 deletions(-) diff --git a/backend/static/js/app.js b/backend/static/js/app.js index 81928c7..a9f3358 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 = '523'; // ← bei jedem Deploy mit Frontend-Änderungen erhöhen +const APP_VER = '524'; // ← bei jedem Deploy mit Frontend-Änderungen erhöhen const APP_VERSION = '1.1.1'; // ← semantische Version, wird bei make release gesetzt const IS_STAGING = location.hostname === 'staging.banyaro.app'; diff --git a/backend/static/js/pages/admin.js b/backend/static/js/pages/admin.js index 4706cee..b799f37 100644 --- a/backend/static/js/pages/admin.js +++ b/backend/static/js/pages/admin.js @@ -19,7 +19,7 @@ window.Page_admin = (() => { { id: 'analytics', label: 'Analytics', icon: 'target' }, { id: 'system', label: 'System', icon: 'gear' }, { id: 'jobs', label: 'Jobs', icon: 'clock' }, - { id: 'partner', label: 'Partner & Codes', icon: 'handshake' }, + { id: 'partner', label: 'Partner', icon: 'handshake' }, { id: 'audit', label: 'Audit-Log', icon: 'clipboard-text' }, ]; @@ -1792,9 +1792,7 @@ window.Page_admin = (() => { // TAB: AUDIT-LOG // ------------------------------------------------------------------ async function _renderPartner(el) { - const [codes] = await Promise.all([ - API.get('/api/admin/partner/codes'), - ]); + const codes = (await API.get('/api/admin/partner/codes')) || []; el.innerHTML = `
diff --git a/backend/static/sw.js b/backend/static/sw.js index b1e2b40..1e8a508 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-v546'; +const CACHE_VERSION = 'by-v547'; 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 From 558fdaa49e6c0dc16d7246ccdc596819a9933695 Mon Sep 17 00:00:00 2001 From: rene Date: Thu, 30 Apr 2026 13:46:55 +0200 Subject: [PATCH 03/10] =?UTF-8?q?UX:=20Admin=20Partner-Tab=20=E2=80=94=20A?= =?UTF-8?q?nleitungsbox=20mit=20Schritt-f=C3=BCr-Schritt-Erkl=C3=A4rung,?= =?UTF-8?q?=20SW=20by-v548?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- backend/static/js/app.js | 2 +- backend/static/js/pages/admin.js | 12 ++++++++++++ backend/static/sw.js | 2 +- 3 files changed, 14 insertions(+), 2 deletions(-) diff --git a/backend/static/js/app.js b/backend/static/js/app.js index a9f3358..7e74666 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 = '524'; // ← bei jedem Deploy mit Frontend-Änderungen erhöhen +const APP_VER = '525'; // ← bei jedem Deploy mit Frontend-Änderungen erhöhen const APP_VERSION = '1.1.1'; // ← semantische Version, wird bei make release gesetzt const IS_STAGING = location.hostname === 'staging.banyaro.app'; diff --git a/backend/static/js/pages/admin.js b/backend/static/js/pages/admin.js index b799f37..77c8d47 100644 --- a/backend/static/js/pages/admin.js +++ b/backend/static/js/pages/admin.js @@ -1797,6 +1797,18 @@ window.Page_admin = (() => { el.innerHTML = `
+ +
+

So funktioniert das Partner-System

+
+

1. Partner-Code erstellen — Erstelle einen Code (z. B. HUNDEBLOG) für einen Influencer oder Partner. Der Code wird an die Person weitergegeben.

+

2. Registrierung mit Code — Wenn sich ein neuer User mit diesem Code registriert, wird er automatisch als Gründer markiert (Platz #1–100, lebenslang kostenlos). Du siehst in der Tabelle wie viele Einlösungen jeder Code hat.

+

3. Partner-Status vergeben — Den Influencer selbst suchst du unten bei «Nutzer-Status» und setzt Partner-Badge (blaues Badge im Profil) und Gründer-Lizenz. So ist auch er als Gründer #X sichtbar.

+

Max. 100 Gründer — Ist die Zahl bei einem Code leer, ist sie unbegrenzt. Die globale Grenze über alle Codes hinweg sind 100 Gründer-Plätze.

+

Freunde werben — Jeder eingeloggte User hat einen persönlichen Einladungslink (Einstellungen → Freunde werben). Bei 10 geworbenen Usern gibt es 20 % Rabatt, bei 20 → 30 %, bei 50 → 50 % — lebenslang, sobald Bezahlfunktionen aktiv sind.

+
+
+

Neuen Partner-Code erstellen

diff --git a/backend/static/sw.js b/backend/static/sw.js index 1e8a508..468b430 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-v547'; +const CACHE_VERSION = 'by-v548'; 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 From df104c2c5715db8f7d1221e36b4e64668ccaf5c5 Mon Sep 17 00:00:00 2001 From: rene Date: Thu, 30 Apr 2026 13:53:51 +0200 Subject: [PATCH 04/10] =?UTF-8?q?Fix:=20Partner-Tab=20Usersuche=20?= =?UTF-8?q?=E2=80=94=20null-Guard=20+=20Mindestzeichen=202=E2=86=921=20f?= =?UTF-8?q?=C3=BCr=20kurze=20Namen,=20SW=20by-v549?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- backend/static/js/app.js | 2 +- backend/static/js/pages/admin.js | 4 ++-- backend/static/sw.js | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/backend/static/js/app.js b/backend/static/js/app.js index 7e74666..9f3c06c 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 = '525'; // ← bei jedem Deploy mit Frontend-Änderungen erhöhen +const APP_VER = '526'; // ← bei jedem Deploy mit Frontend-Änderungen erhöhen const APP_VERSION = '1.1.1'; // ← semantische Version, wird bei make release gesetzt const IS_STAGING = location.hostname === 'staging.banyaro.app'; diff --git a/backend/static/js/pages/admin.js b/backend/static/js/pages/admin.js index 77c8d47..1ca20a0 100644 --- a/backend/static/js/pages/admin.js +++ b/backend/static/js/pages/admin.js @@ -1958,11 +1958,11 @@ window.Page_admin = (() => { clearTimeout(_searchTimeout); _grantUserId = null; const q = searchInput.value.trim(); - if (q.length < 2) { grantResult.innerHTML = ''; return; } + if (q.length < 1) { grantResult.innerHTML = ''; return; } _searchTimeout = setTimeout(async () => { try { const users = await API.get(`/api/admin/users/search?q=${encodeURIComponent(q)}`); - if (!users.length) { + if (!users || !users.length) { grantResult.innerHTML = `

Kein User gefunden.

`; return; } diff --git a/backend/static/sw.js b/backend/static/sw.js index 468b430..5c299ca 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-v548'; +const CACHE_VERSION = 'by-v549'; 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 From 62b3138c4101deefd6159127db606b6708ea2afb Mon Sep 17 00:00:00 2001 From: rene Date: Thu, 30 Apr 2026 13:58:56 +0200 Subject: [PATCH 05/10] Fix: Partner-Tab Usersuche nutzt /api/admin/users?q= (bestehende Route), SW by-v550 --- backend/static/js/app.js | 2 +- backend/static/js/pages/admin.js | 11 ++++++----- backend/static/sw.js | 2 +- 3 files changed, 8 insertions(+), 7 deletions(-) diff --git a/backend/static/js/app.js b/backend/static/js/app.js index 9f3c06c..b23c131 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 = '526'; // ← bei jedem Deploy mit Frontend-Änderungen erhöhen +const APP_VER = '527'; // ← bei jedem Deploy mit Frontend-Änderungen erhöhen const APP_VERSION = '1.1.1'; // ← semantische Version, wird bei make release gesetzt const IS_STAGING = location.hostname === 'staging.banyaro.app'; diff --git a/backend/static/js/pages/admin.js b/backend/static/js/pages/admin.js index 1ca20a0..4948c9b 100644 --- a/backend/static/js/pages/admin.js +++ b/backend/static/js/pages/admin.js @@ -1961,7 +1961,8 @@ window.Page_admin = (() => { if (q.length < 1) { grantResult.innerHTML = ''; return; } _searchTimeout = setTimeout(async () => { try { - const users = await API.get(`/api/admin/users/search?q=${encodeURIComponent(q)}`); + const res = await API.get(`/api/admin/users?q=${encodeURIComponent(q)}&limit=10`); + const users = res?.users || res || []; if (!users || !users.length) { grantResult.innerHTML = `

Kein User gefunden.

`; return; @@ -1972,9 +1973,7 @@ window.Page_admin = (() => { cursor:pointer;background:var(--c-surface-2);margin-bottom:2px; font-size:var(--text-sm);display:flex;justify-content:space-between"> ${u.name} - - ${u.is_founder ? '⭐ Gründer ' : ''}${u.is_partner ? '🤝 Partner' : ''} - + ${u.rolle}
`).join(''); grantResult.querySelectorAll('.adm-grant-user').forEach(div => { @@ -1984,7 +1983,9 @@ window.Page_admin = (() => { grantResult.innerHTML = `

✓ ${div.dataset.name} ausgewählt

`; }); }); - } catch { grantResult.innerHTML = ''; } + } catch(e) { + grantResult.innerHTML = `

${e.message || 'Suchfehler'}

`; + } }, 400); }); diff --git a/backend/static/sw.js b/backend/static/sw.js index 5c299ca..731f304 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-v549'; +const CACHE_VERSION = 'by-v550'; 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 From 2f1dfd481c48ec91ddfabb9af2f6b696519daa3e Mon Sep 17 00:00:00 2001 From: rene Date: Thu, 30 Apr 2026 14:37:25 +0200 Subject: [PATCH 06/10] =?UTF-8?q?Fix:=20Partner-Tab=20=E2=80=94=20/api/-Pr?= =?UTF-8?q?efix=20entfernt=20(API.get=20f=C3=BCgt=20es=20auto=20hinzu),=20?= =?UTF-8?q?SW=20by-v551?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- backend/static/js/app.js | 2 +- backend/static/js/pages/admin.js | 10 +++++----- backend/static/sw.js | 2 +- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/backend/static/js/app.js b/backend/static/js/app.js index b23c131..95630a0 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 = '527'; // ← bei jedem Deploy mit Frontend-Änderungen erhöhen +const APP_VER = '528'; // ← bei jedem Deploy mit Frontend-Änderungen erhöhen const APP_VERSION = '1.1.1'; // ← semantische Version, wird bei make release gesetzt const IS_STAGING = location.hostname === 'staging.banyaro.app'; diff --git a/backend/static/js/pages/admin.js b/backend/static/js/pages/admin.js index 4948c9b..106b7c5 100644 --- a/backend/static/js/pages/admin.js +++ b/backend/static/js/pages/admin.js @@ -1792,7 +1792,7 @@ window.Page_admin = (() => { // TAB: AUDIT-LOG // ------------------------------------------------------------------ async function _renderPartner(el) { - const codes = (await API.get('/api/admin/partner/codes')) || []; + const codes = (await API.get('/admin/partner/codes')) || []; el.innerHTML = `
@@ -1925,7 +1925,7 @@ window.Page_admin = (() => { const code = (fd.code || '').trim().toUpperCase(); if (!code) return; await UI.asyncButton(btn, async () => { - await API.post('/api/admin/partner/codes', { + await API.post('/admin/partner/codes', { code, label: fd.label || code, grants_founder: e.target.querySelector('[name="grants_founder"]').checked ? 1 : 0, @@ -1942,7 +1942,7 @@ window.Page_admin = (() => { if (!window.confirm(`Code wirklich löschen?`)) return; const id = btn.dataset.id; await UI.asyncButton(btn, async () => { - await API.del(`/api/admin/partner/codes/${id}`); + await API.del(`/admin/partner/codes/${id}`); UI.toast.success('Code gelöscht.'); await _renderPartner(el); }); @@ -1961,7 +1961,7 @@ window.Page_admin = (() => { if (q.length < 1) { grantResult.innerHTML = ''; return; } _searchTimeout = setTimeout(async () => { try { - const res = await API.get(`/api/admin/users?q=${encodeURIComponent(q)}&limit=10`); + const res = await API.get(`/admin/users?q=${encodeURIComponent(q)}&limit=10`); const users = res?.users || res || []; if (!users || !users.length) { grantResult.innerHTML = `

Kein User gefunden.

`; @@ -1996,7 +1996,7 @@ window.Page_admin = (() => { const isFounder = e.target.querySelector('[name="is_founder"]').checked ? 1 : 0; const isPartner = e.target.querySelector('[name="is_partner"]').checked ? 1 : 0; await UI.asyncButton(btn, async () => { - const result = await API.post(`/api/admin/partner/users/${_grantUserId}/grant`, { + const result = await API.post(`/admin/partner/users/${_grantUserId}/grant`, { is_founder: isFounder, is_partner: isPartner, }); diff --git a/backend/static/sw.js b/backend/static/sw.js index 731f304..fe10589 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-v550'; +const CACHE_VERSION = 'by-v551'; 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 From c2a5fbba7d945832b0f913d6d7cc9d27e2ee3cf1 Mon Sep 17 00:00:00 2001 From: rene Date: Thu, 30 Apr 2026 14:45:16 +0200 Subject: [PATCH 07/10] Fix: /api/-Prefix in gruender.js+settings.js entfernt; Grant-Fehler sichtbar, SW by-v553 --- backend/static/js/app.js | 2 +- backend/static/js/pages/admin.js | 3 ++- backend/static/js/pages/gruender.js | 2 +- backend/static/js/pages/settings.js | 2 +- backend/static/sw.js | 2 +- 5 files changed, 6 insertions(+), 5 deletions(-) diff --git a/backend/static/js/app.js b/backend/static/js/app.js index 95630a0..bfb29f3 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 = '528'; // ← bei jedem Deploy mit Frontend-Änderungen erhöhen +const APP_VER = '530'; // ← bei jedem Deploy mit Frontend-Änderungen erhöhen const APP_VERSION = '1.1.1'; // ← semantische Version, wird bei make release gesetzt const IS_STAGING = location.hostname === 'staging.banyaro.app'; diff --git a/backend/static/js/pages/admin.js b/backend/static/js/pages/admin.js index 106b7c5..61ba198 100644 --- a/backend/static/js/pages/admin.js +++ b/backend/static/js/pages/admin.js @@ -2000,9 +2000,10 @@ window.Page_admin = (() => { is_founder: isFounder, is_partner: isPartner, }); + if (!result) throw new Error('Keine Antwort vom Server.'); UI.toast.success(`Status für ${result.name} gesetzt.`); grantResult.innerHTML = `

✓ Gründer: ${result.is_founder ? 'Ja' : 'Nein'} | Partner: ${result.is_partner ? 'Ja' : 'Nein'}

`; - }); + }).catch(e => UI.toast.error(e.message || 'Fehler beim Speichern.')); }); } diff --git a/backend/static/js/pages/gruender.js b/backend/static/js/pages/gruender.js index e82fc3e..100891e 100644 --- a/backend/static/js/pages/gruender.js +++ b/backend/static/js/pages/gruender.js @@ -39,7 +39,7 @@ window.Page_gruender = (() => { async function _load() { const el = _container.querySelector('#grnd-content'); try { - const d = await API.get('/api/partner/founders/stats'); + const d = await API.get('/partner/founders/stats'); if (!d || typeof d.total === 'undefined') throw new Error('Ungültige Antwort vom Server.'); el.innerHTML = _renderStats(d); } catch (e) { diff --git a/backend/static/js/pages/settings.js b/backend/static/js/pages/settings.js index 7c5c80e..941cf3f 100644 --- a/backend/static/js/pages/settings.js +++ b/backend/static/js/pages/settings.js @@ -1450,7 +1450,7 @@ window.Page_settings = (() => { if (code.length < 3) return; _debounce = setTimeout(async () => { try { - const info = await API.get(`/api/partner/codes/${encodeURIComponent(code)}/info`); + const info = await API.get(`/partner/codes/${encodeURIComponent(code)}/info`); if (info.redeemable) { partnerHint.textContent = info.grants_founder ? `✓ Gültiger Code von "${info.label}" — du erhältst eine lebenslange Gründer-Lizenz!` diff --git a/backend/static/sw.js b/backend/static/sw.js index fe10589..97d2020 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-v551'; +const CACHE_VERSION = 'by-v553'; 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 From 47c059036427419ffc440188b02ed725df545090 Mon Sep 17 00:00:00 2001 From: rene Date: Thu, 30 Apr 2026 14:59:04 +0200 Subject: [PATCH 08/10] =?UTF-8?q?Fix:=20Partner-Tab=20=E2=80=94=20is=5Ffou?= =?UTF-8?q?nder/is=5Fpartner=20in=20Admin-Users-Liste=20+=20Checkboxen=20v?= =?UTF-8?q?orausf=C3=BCllen=20+=20founder=5Fnumber=20in=20/me,=20SW=20by-v?= =?UTF-8?q?554?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- backend/auth.py | 2 +- backend/routes/admin.py | 1 + backend/static/js/app.js | 2 +- backend/static/js/pages/admin.js | 13 +++++++++++-- backend/static/sw.js | 2 +- 5 files changed, 15 insertions(+), 5 deletions(-) diff --git a/backend/auth.py b/backend/auth.py index d923c70..942a3f1 100644 --- a/backend/auth.py +++ b/backend/auth.py @@ -87,7 +87,7 @@ def get_current_user( user_id = int(payload["sub"]) with db() as conn: row = conn.execute( - "SELECT id, email, name, rolle, is_premium, is_moderator, is_banned, ban_reason, is_social_media, notes_ki_enabled, breeder_status, is_founder, is_partner FROM users WHERE id=?", + "SELECT id, email, name, rolle, is_premium, is_moderator, is_banned, ban_reason, is_social_media, notes_ki_enabled, breeder_status, is_founder, is_partner, founder_number FROM users WHERE id=?", (user_id,) ).fetchone() diff --git a/backend/routes/admin.py b/backend/routes/admin.py index 8be436c..09a4127 100644 --- a/backend/routes/admin.py +++ b/backend/routes/admin.py @@ -296,6 +296,7 @@ async def list_users( rows = conn.execute(f""" SELECT u.id, u.name, {_email_col}, u.rolle, u.is_premium, u.is_moderator, u.is_banned, u.ban_reason, + u.is_founder, u.is_partner, u.founder_number, u.created_at, u.last_login, (SELECT COUNT(*) FROM dogs d WHERE d.user_id=u.id) AS dog_count, (SELECT COUNT(*) FROM forum_threads t WHERE t.user_id=u.id AND t.is_deleted=0) AS thread_count, diff --git a/backend/static/js/app.js b/backend/static/js/app.js index bfb29f3..a9732a2 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 = '530'; // ← bei jedem Deploy mit Frontend-Änderungen erhöhen +const APP_VER = '531'; // ← bei jedem Deploy mit Frontend-Änderungen erhöhen const APP_VERSION = '1.1.1'; // ← semantische Version, wird bei make release gesetzt const IS_STAGING = location.hostname === 'staging.banyaro.app'; diff --git a/backend/static/js/pages/admin.js b/backend/static/js/pages/admin.js index 61ba198..69ed773 100644 --- a/backend/static/js/pages/admin.js +++ b/backend/static/js/pages/admin.js @@ -1969,18 +1969,27 @@ window.Page_admin = (() => { } grantResult.innerHTML = users.map(u => `
${u.name} - ${u.rolle} + + ${u.rolle}${u.is_founder ? ' · ⭐' : ''}${u.is_partner ? ' · 🤝' : ''} +
`).join(''); grantResult.querySelectorAll('.adm-grant-user').forEach(div => { div.addEventListener('click', () => { _grantUserId = parseInt(div.dataset.id); searchInput.value = div.dataset.name; - grantResult.innerHTML = `

✓ ${div.dataset.name} ausgewählt

`; + // Aktuellen Status in Checkboxen setzen + const form = el.querySelector('#adm-partner-grant'); + if (form) { + form.querySelector('[name="is_founder"]').checked = div.dataset.founder === '1'; + form.querySelector('[name="is_partner"]').checked = div.dataset.partner === '1'; + } + grantResult.innerHTML = `

✓ ${div.dataset.name} ausgewählt${div.dataset.founder==='1' ? ' · ⭐ Gründer' : ''}${div.dataset.partner==='1' ? ' · 🤝 Partner' : ''}

`; }); }); } catch(e) { diff --git a/backend/static/sw.js b/backend/static/sw.js index 97d2020..f9233a2 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-v553'; +const CACHE_VERSION = 'by-v554'; 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 From 125fb3c7e79e3d5eb876d93827268fab8f74aff5 Mon Sep 17 00:00:00 2001 From: rene Date: Thu, 30 Apr 2026 15:08:59 +0200 Subject: [PATCH 09/10] =?UTF-8?q?Feature:=20Gr=C3=BCnder/Partner-Badge=20i?= =?UTF-8?q?m=20User-Profil-Modal=20+=20Freunde-Suche,=20SW=20by-v555?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- backend/routes/friends.py | 2 ++ backend/static/js/app.js | 2 +- backend/static/js/pages/friends.js | 17 ++++++++++++++++- backend/static/sw.js | 2 +- 4 files changed, 20 insertions(+), 3 deletions(-) diff --git a/backend/routes/friends.py b/backend/routes/friends.py index df7c96a..cac5f4b 100644 --- a/backend/routes/friends.py +++ b/backend/routes/friends.py @@ -32,6 +32,7 @@ async def list_friends(user=Depends(get_current_user)): u.name AS friend_name, u.bio, u.wohnort, u.erfahrung, u.social_link, u.profil_sichtbarkeit, u.avatar_url, + u.is_founder, u.is_partner, u.founder_number, {dogs_sq} AS dogs_json FROM friendships f JOIN users u ON u.id = CASE WHEN f.requester_id=? THEN f.addressee_id ELSE f.requester_id END @@ -92,6 +93,7 @@ async def search_users(q: str = "", user=Depends(get_current_user)): SELECT u.id, u.name, u.bio, u.wohnort, u.erfahrung, u.social_link, u.profil_sichtbarkeit, u.avatar_url, + u.is_founder, u.is_partner, u.founder_number, (SELECT json_group_array(json_object('name', d.name, 'rasse', d.rasse)) FROM dogs d WHERE d.user_id=u.id AND d.is_public=1) AS dogs_json FROM users u diff --git a/backend/static/js/app.js b/backend/static/js/app.js index a9732a2..668140f 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 = '531'; // ← bei jedem Deploy mit Frontend-Änderungen erhöhen +const APP_VER = '532'; // ← bei jedem Deploy mit Frontend-Änderungen erhöhen const APP_VERSION = '1.1.1'; // ← semantische Version, wird bei make release gesetzt const IS_STAGING = location.hostname === 'staging.banyaro.app'; diff --git a/backend/static/js/pages/friends.js b/backend/static/js/pages/friends.js index 837474c..3f2e690 100644 --- a/backend/static/js/pages/friends.js +++ b/backend/static/js/pages/friends.js @@ -610,10 +610,23 @@ window.Page_friends = (() => { margin-bottom:var(--space-4)">${parts.join('')}
`; })(); + const badgesHTML = (profile.is_founder || profile.is_partner) ? ` +
+ ${profile.is_founder ? ` + + ${profile.founder_number ? `Gründer #${profile.founder_number}` : 'Gründer'} + ` : ''} + ${profile.is_partner ? ` + + Partner + ` : ''} +
` : ''; + UI.modal.open({ title: _esc(friendName), body: `
+ ${badgesHTML} ${profileInfoHTML} ${dogsHTML} @@ -667,10 +680,12 @@ window.Page_friends = (() => { ${i < results.length - 1 ? 'border-bottom:1px solid var(--c-border)' : ''}"> ${_userAvatar(u.name, null, u.avatar_url)}
-
${_esc(u.name)} + ${u.is_founder ? `${u.founder_number ? `Gründer #${u.founder_number}` : 'Gründer'}` : ''} + ${u.is_partner ? `Partner` : ''} ${_erfahrungSpan(u.erfahrung)}
${_wohnortLine(u.wohnort)} diff --git a/backend/static/sw.js b/backend/static/sw.js index f9233a2..0b1e344 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-v554'; +const CACHE_VERSION = 'by-v555'; 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 From f31f219ad691a33cac008fb36c25eed7203bb665 Mon Sep 17 00:00:00 2001 From: rene Date: Thu, 30 Apr 2026 15:18:02 +0200 Subject: [PATCH 10/10] =?UTF-8?q?Fix:=20Settings=20l=C3=A4dt=20frischen=20?= =?UTF-8?q?/me-State=20beim=20Init=20=E2=80=94=20Badges=20immer=20aktuell?= =?UTF-8?q?=20ohne=20Re-Login,=20SW=20by-v556?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- backend/static/js/app.js | 2 +- backend/static/js/pages/settings.js | 8 ++++++++ backend/static/sw.js | 2 +- 3 files changed, 10 insertions(+), 2 deletions(-) diff --git a/backend/static/js/app.js b/backend/static/js/app.js index 668140f..cd2025d 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 = '532'; // ← bei jedem Deploy mit Frontend-Änderungen erhöhen +const APP_VER = '533'; // ← bei jedem Deploy mit Frontend-Änderungen erhöhen const APP_VERSION = '1.1.1'; // ← semantische Version, wird bei make release gesetzt const IS_STAGING = location.hostname === 'staging.banyaro.app'; diff --git a/backend/static/js/pages/settings.js b/backend/static/js/pages/settings.js index 941cf3f..da7b4a7 100644 --- a/backend/static/js/pages/settings.js +++ b/backend/static/js/pages/settings.js @@ -54,6 +54,14 @@ window.Page_settings = (() => { _container = container; _appState = appState; _render(); + // Frischen User-State laden damit Badges (is_founder, is_partner) aktuell sind + if (_appState.user) { + try { + const fresh = await API.auth.me(); + Object.assign(_appState.user, fresh); + _render(); + } catch {} + } } function refresh() { diff --git a/backend/static/sw.js b/backend/static/sw.js index 0b1e344..fb662ef 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-v555'; +const CACHE_VERSION = 'by-v556'; 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