Knopf „Geteiltes ablegen" blieb dauerhaft stehen: leere Pakete wegräumen, Verwerfen [deploy]
All checks were successful
Deploy baustelle-pwa / deploy (push) Successful in 13s

Ein leeres Teilen-Paket in IndexedDB hielt den Knopf für immer stehen
(share.html meldete „Es kam nichts an" und ließ den Rest liegen). Die
App räumt leere Pakete jetzt selbst weg, share.html ebenso; der Knopf
nennt „(Notiz)" bei reinem Text; share.html bietet „Verwerfen" mit
Rückfrage in der Seite.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
Eduard Wisch 2026-10-19 21:49:01 +02:00
parent 76592435a3
commit c7cd2fa461
3 changed files with 49 additions and 8 deletions

View file

@ -1,6 +1,6 @@
# ROADMAP — Baustelle PWA
Stand: 2026-10-15 · Gegenstück: `data/bericht` (Modul-Version 1.7.1)
Stand: 2026-10-19 · Gegenstück: `data/bericht` (Modul-Version 1.7.1)
Die PWA hat kein eigenes Backend — alles läuft über `custom/bericht/api/`. Punkte, die eine
API-Änderung brauchen, sind mit **[API]** markiert und stehen zusätzlich in der ROADMAP des
@ -31,6 +31,23 @@ Bericht-Moduls.
---
## 8. Knopf „Geteiltes ablegen" bleibt dauerhaft stehen (gemeldet 2026-10-19)
Eddy: *„bei der App Baustelle ist permanent ein Button relativ weit unten angezeigt über den aufgelisteten
Aufträgen: Geteiltes ablegen"*.
- Ursache: `checkPendingShare()` zeigte den Knopf, sobald IRGENDEIN `shared_payload` in IndexedDB lag — auch ein
leeres (Teilen abgebrochen, nichts mitgekommen). `share.html` meldete dann „Es kam nichts an" und ließ den Rest
liegen → Knopf für immer. Wer etwas Geteiltes nicht ablegen wollte, kam ebenfalls nicht davon los.
- [x] ✅ 19.10.2026: Leere Pakete räumt die App selbst weg (kein Knopf); „Es kam nichts an" löscht den Rest;
Knopf zeigt „(Notiz)", wenn nur Text geteilt wurde; `share.html` hat „Verwerfen" mit Rückfrage in der Seite.
Auf der Testinstanz durchgespielt (leer → kein Knopf; Notiz → Knopf → Verwerfen → weg).
- [ ] Am Handy gegenprüfen: Knopf ist nach dem Update weg (beim ersten Laden räumt die App den leeren Rest ab).
### Befunde aus der AVIF-Prüfung in Bericht (19.10.2026, nicht geändert)
- [ ] Ist eine Maximalgröße für Fotos gesetzt (`photo_maxside` > 0), behält das im Browser verkleinerte JPEG in
`app.js` `uploadPhoto` seinen Originalnamen — ein `.avif`/`.webp` wird dann vom Server abgelehnt.
- [ ] Beim Verkleinern im Browser (Canvas → JPEG) wird Transparenz schwarz.
## 7. Galerie-Auswahl: „permission"-Fehler ab dem 3. Foto (gemeldet 2026-09-30)
Befund (Prod-Zugriffslog 30.09., Auftrag 114 / SO2609-0088, JHB Bio): erster Anlauf 19:40:21 —

20
app.js
View file

@ -1843,21 +1843,29 @@ router.on('/settings', async () => {
* bleiben in IndexedDB liegen; ohne diesen Hinweis wuerde sie niemand je wiederfinden. */
async function checkPendingShare() {
if (document.getElementById('shared-banner')) return;
let n = 0, vorhanden = false;
let n = 0, notiz = false;
try {
const p = await idb.get('shared_payload');
if (p) { vorhanden = true; n = (p.files || []).length; }
else {
if (p) {
n = (p.files || []).length;
notiz = !!((p.title || '').trim() || (p.text || '').trim() || (p.url || '').trim());
} else {
const alt = await idb.get('shared_files'); // altes Format
if (alt && alt.length) { vorhanden = true; n = alt.length; }
if (alt && alt.length) n = alt.length;
}
// Ein Paket OHNE Inhalt (Teilen abgebrochen, nichts mitgekommen) hielt den Knopf für immer
// stehen: share.html meldete „Es kam nichts an" und ließ den Rest liegen (Eddy 19.10.2026).
if (!n && !notiz) {
await idb.del('shared_payload').catch(() => {});
await idb.del('shared_files').catch(() => {});
return;
}
} catch (_) { return; }
if (!vorhanden) return;
const b = document.createElement('button');
b.id = 'shared-banner';
b.className = 'shared-banner';
b.textContent = '📤 Geteiltes ablegen' + (n ? ' (' + n + ' Bild' + (n > 1 ? 'er' : '') + ')' : '');
b.textContent = '📤 Geteiltes ablegen' + (n ? ' (' + n + ' Bild' + (n > 1 ? 'er' : '') + ')' : ' (Notiz)');
b.addEventListener('click', () => { location.href = 'share.html'; });
document.body.appendChild(b);
}

View file

@ -284,8 +284,9 @@ async function renderPicker() {
</div>
<div id="share-orders"><div class="loader">Lade Aufträge…</div></div>
<div class="share-actions">
<div class="share-actions" id="share-actions">
<button class="btn btn-large" id="btn-store" disabled>Ablegen</button>
<button class="btn btn-secondary" id="btn-discard" style="margin-top:10px;width:100%;">Verwerfen</button>
</div>
`;
@ -310,6 +311,19 @@ async function renderPicker() {
});
document.getElementById('btn-store').addEventListener('click', store);
// Verwerfen (Eddy 19.10.2026): wer etwas Geteiltes nicht ablegen will, kam bisher nicht mehr
// davon los — der Knopf in der App blieb stehen. Rückfrage in der Seite, kein Browser-Dialog.
document.getElementById('btn-discard').addEventListener('click', () => {
const box = document.getElementById('share-actions');
box.innerHTML = `<p class="label" style="margin-bottom:10px;">Geteilte Inhalte wirklich verwerfen? Sie werden nicht abgelegt.</p>
<button class="btn btn-large" id="btn-discard-yes">Ja, verwerfen</button>
<button class="btn btn-secondary" id="btn-discard-no" style="margin-top:10px;width:100%;">Zurück</button>`;
document.getElementById('btn-discard-yes').addEventListener('click', async () => {
await clearPayload();
location.href = './';
});
document.getElementById('btn-discard-no').addEventListener('click', () => renderPicker());
});
bindeKarten(main()); // Schnellzugriff klickbar machen
if (vorwahl) waehleAuftrag(vorwahl.id, vorwahl.ref, vorwahl.name, vorwahl.ort);
loadOrders('');
@ -387,6 +401,8 @@ async function store() {
(async function boot() {
payload = await readPayload();
if (!payload || (!payload.files.length && !payload.text && !payload.title && !payload.url)) {
// Leeren Rest wegräumen — sonst bleibt der Knopf „Geteiltes ablegen" in der App für immer stehen
await clearPayload();
main().innerHTML = `<div class="empty-state"><div class="icon">📭</div>
Es kam nichts an.<br>Teile Bilder oder Text aus WhatsApp erneut mit „Baustelle".
<br><button class="btn" style="margin-top:16px;" onclick="location.href='./'">Zur App</button></div>`;