Sprint 16: Chat-Fotos/Online/Read-Receipts, Gesundheit-Dokumente löschen, Bugfixes
- Chat: Foto-Versand (POST /api/chat/conversations/{id}/upload, media_url/media_type)
- Chat: Online-Indikator (last_seen Heartbeat, grüner Dot, 3min-Fenster)
- Chat: Read Receipts (read_at, Einzel-/Doppelhaken-Icons)
- Gesundheit: Dokument löschen (DELETE .../dokument, Datei + DB-Eintrag)
- Bug: events.user_id NOT NULL → nullable (Table-Recreation-Migration)
- Bug: scheduler INSERT user_id 0 → NULL
- Bug: Wikidata Rate-Limit: sleep 0.3s→1.0s, retries 2→4, exponentielles Backoff
- SW: by-v146, APP_VER 119
This commit is contained in:
parent
34f29f9d0a
commit
a7753c9cf5
15 changed files with 375 additions and 43 deletions
|
|
@ -741,11 +741,17 @@ window.Page_health = (() => {
|
|||
<div class="health-card-meta">${UI.time.format(e.datum + 'T00:00:00')}</div>
|
||||
${e.notiz ? `<div class="health-card-note">${_esc(e.notiz)}</div>` : ''}
|
||||
${hasFile
|
||||
? `<a href="${e.datei_url}" target="_blank" rel="noopener"
|
||||
class="btn btn-secondary btn-sm" style="margin-top:var(--space-2);display:inline-flex"
|
||||
onclick="event.stopPropagation()">
|
||||
${isPdf ? '<svg class="ph-icon" aria-hidden="true"><use href="/icons/phosphor.svg#file-text"></use></svg> PDF öffnen' : '<svg class="ph-icon" aria-hidden="true"><use href="/icons/phosphor.svg#image"></use></svg> Bild öffnen'}
|
||||
</a>`
|
||||
? `<div style="display:flex;gap:var(--space-2);margin-top:var(--space-2);align-items:center;flex-wrap:wrap">
|
||||
<a href="${e.datei_url}" target="_blank" rel="noopener"
|
||||
class="btn btn-secondary btn-sm" style="display:inline-flex"
|
||||
onclick="event.stopPropagation()">
|
||||
${isPdf ? '<svg class="ph-icon" aria-hidden="true"><use href="/icons/phosphor.svg#file-text"></use></svg> PDF öffnen' : '<svg class="ph-icon" aria-hidden="true"><use href="/icons/phosphor.svg#image"></use></svg> Bild öffnen'}
|
||||
</a>
|
||||
<button class="btn btn-danger btn-sm" data-action="delete-dok" data-id="${e.id}"
|
||||
onclick="event.stopPropagation()" aria-label="Dokument löschen">
|
||||
<svg class="ph-icon" aria-hidden="true"><use href="/icons/phosphor.svg#trash"></use></svg>
|
||||
</button>
|
||||
</div>`
|
||||
: `<span style="font-size:var(--text-xs);color:var(--c-text-muted)">Noch keine Datei hochgeladen</span>`}
|
||||
</div>
|
||||
</div>
|
||||
|
|
@ -776,6 +782,28 @@ window.Page_health = (() => {
|
|||
if (p) _showPraxForm(p);
|
||||
});
|
||||
});
|
||||
// Dokument löschen
|
||||
content.querySelectorAll('[data-action="delete-dok"]').forEach(btn => {
|
||||
btn.addEventListener('click', async () => {
|
||||
const id = parseInt(btn.dataset.id);
|
||||
const dogId = _appState.activeDog.id;
|
||||
const ok = await UI.modal.confirm({
|
||||
title: 'Dokument löschen',
|
||||
text: 'Die Datei wird unwiderruflich gelöscht.',
|
||||
confirmText: 'Löschen',
|
||||
danger: true,
|
||||
});
|
||||
if (!ok) return;
|
||||
await UI.asyncButton(btn, async () => {
|
||||
await API.health.deleteDocument(dogId, id);
|
||||
const list = _data[_activeTab] || [];
|
||||
const entry = list.find(e => e.id === id);
|
||||
if (entry) { entry.datei_url = null; entry.datei_typ = null; }
|
||||
_renderTab();
|
||||
UI.toast.success('Dokument gelöscht.');
|
||||
});
|
||||
});
|
||||
});
|
||||
// Praxis hinzufügen
|
||||
content.querySelector('[data-action="add-praxis"]')
|
||||
?.addEventListener('click', () => _showPraxForm(null));
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue