Fix: Benachrichtigungen anklickbar (button statt div, data-Parsing repariert)

- _parseData() flacht verschachteltes {data:{conversation_id:…}} auf
  → d.conversation_id war immer undefined wegen doppelter Verschachtelung aus push.py
- .notif-item als <button> statt <div> — iOS feuert clicks auf divs unzuverlässig
- closest() im Löschen-Handler auf button.notif-item angepasst
This commit is contained in:
rene 2026-04-19 10:13:11 +02:00
parent b6d2606a23
commit bb0250a8b5
3 changed files with 19 additions and 11 deletions

View file

@ -3,7 +3,7 @@
Router, State-Management, Navigation, Initialisierung. Router, State-Management, Navigation, Initialisierung.
============================================================ */ ============================================================ */
const APP_VER = '209'; // ← bei jedem Deploy mit Frontend-Änderungen erhöhen const APP_VER = '210'; // ← bei jedem Deploy mit Frontend-Änderungen erhöhen
const App = (() => { const App = (() => {

View file

@ -33,11 +33,18 @@ window.Page_notifications = (() => {
} }
} }
/** Parst n.data sicher — egal ob String oder Objekt */ /** Parst n.data sicher und flacht verschachteltes {data:{…}} auf */
function _parseData(raw) { function _parseData(raw) {
if (!raw) return {}; if (!raw) return {};
if (typeof raw === 'object') return raw; let obj = (typeof raw === 'object') ? raw : (() => {
try { return JSON.parse(raw); } catch (_) { return {}; } try { return JSON.parse(raw); } catch (_) { return {}; }
})();
// push.py speichert payload-Felder direkt: {data: {conversation_id:…}, tag:…}
// Das innere 'data' nach oben holen damit d.conversation_id etc. direkt verfügbar sind
if (obj.data && typeof obj.data === 'object') {
obj = { ...obj, ...obj.data };
}
return obj;
} }
/** /**
@ -108,18 +115,19 @@ window.Page_notifications = (() => {
data: _parseData(n.data) }); data: _parseData(n.data) });
return ` return `
<div class="${cls}" data-id="${n.id}" data-nav="${UI.escape(navData)}"> <button class="${cls}" data-id="${n.id}" data-nav="${UI.escape(navData)}"
type="button" style="width:100%;text-align:left;border:none;font:inherit;background:none">
<span class="notif-icon">${UI.icon(iconName)}</span> <span class="notif-icon">${UI.icon(iconName)}</span>
<div class="notif-content"> <div class="notif-content">
<div class="notif-title">${UI.escape(n.title)}</div> <div class="notif-title">${UI.escape(n.title)}</div>
${n.body ? `<div class="notif-body">${UI.escape(n.body)}</div>` : ''} ${n.body ? `<div class="notif-body">${UI.escape(n.body)}</div>` : ''}
<div class="notif-time">${_relTime(n.created_at)}</div> <div class="notif-time">${_relTime(n.created_at)}</div>
</div> </div>
<button class="notif-del-btn icon-btn" data-del="${n.id}" title="Löschen" <span class="notif-del-btn" data-del="${n.id}" title="Löschen"
aria-label="Benachrichtigung löschen"> aria-label="Benachrichtigung löschen" role="button">
${UI.icon('x')} ${UI.icon('x')}
</button> </span>
</div>`; </button>`;
} }
/** Führt die kontextspezifische Navigation aus */ /** Führt die kontextspezifische Navigation aus */
@ -228,7 +236,7 @@ window.Page_notifications = (() => {
btn.addEventListener('click', async (e) => { btn.addEventListener('click', async (e) => {
e.stopPropagation(); e.stopPropagation();
const id = parseInt(btn.dataset.del, 10); const id = parseInt(btn.dataset.del, 10);
const item = btn.closest('.notif-item'); const item = btn.closest('button.notif-item') || btn.closest('.notif-item');
// Sofortiges visuelles Feedback // Sofortiges visuelles Feedback
if (item) { if (item) {

View file

@ -3,7 +3,7 @@
Offline-Cache + Push Notifications + Tile-Cache Offline-Cache + Push Notifications + Tile-Cache
============================================================ */ ============================================================ */
const CACHE_VERSION = 'by-v232'; const CACHE_VERSION = 'by-v233';
const CACHE_STATIC = `${CACHE_VERSION}-static`; const CACHE_STATIC = `${CACHE_VERSION}-static`;
const CACHE_TILES = 'ban-yaro-tiles-v1'; // bleibt über SW-Updates erhalten const CACHE_TILES = 'ban-yaro-tiles-v1'; // bleibt über SW-Updates erhalten