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.
|
||||
============================================================ */
|
||||
|
||||
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 = (() => {
|
||||
|
||||
|
|
|
|||
|
|
@ -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) {
|
||||
if (!raw) return {};
|
||||
if (typeof raw === 'object') return raw;
|
||||
try { return JSON.parse(raw); } catch (_) { return {}; }
|
||||
let obj = (typeof raw === 'object') ? raw : (() => {
|
||||
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) });
|
||||
|
||||
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>
|
||||
<div class="notif-content">
|
||||
<div class="notif-title">${UI.escape(n.title)}</div>
|
||||
${n.body ? `<div class="notif-body">${UI.escape(n.body)}</div>` : ''}
|
||||
<div class="notif-time">${_relTime(n.created_at)}</div>
|
||||
</div>
|
||||
<button class="notif-del-btn icon-btn" data-del="${n.id}" title="Löschen"
|
||||
aria-label="Benachrichtigung löschen">
|
||||
<span class="notif-del-btn" data-del="${n.id}" title="Löschen"
|
||||
aria-label="Benachrichtigung löschen" role="button">
|
||||
${UI.icon('x')}
|
||||
</button>
|
||||
</div>`;
|
||||
</span>
|
||||
</button>`;
|
||||
}
|
||||
|
||||
/** Führt die kontextspezifische Navigation aus */
|
||||
|
|
@ -228,7 +236,7 @@ window.Page_notifications = (() => {
|
|||
btn.addEventListener('click', async (e) => {
|
||||
e.stopPropagation();
|
||||
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
|
||||
if (item) {
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue