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:
parent
b6d2606a23
commit
bb0250a8b5
3 changed files with 19 additions and 11 deletions
|
|
@ -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 = (() => {
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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) {
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue