Knopf „Geteiltes ablegen" blieb dauerhaft stehen: leere Pakete wegräumen, Verwerfen [deploy]
All checks were successful
Deploy baustelle-pwa / deploy (push) Successful in 13s
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:
parent
76592435a3
commit
c7cd2fa461
3 changed files with 49 additions and 8 deletions
19
ROADMAP.md
19
ROADMAP.md
|
|
@ -1,6 +1,6 @@
|
||||||
# ROADMAP — Baustelle PWA
|
# 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
|
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
|
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)
|
## 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 —
|
Befund (Prod-Zugriffslog 30.09., Auftrag 114 / SO2609-0088, JHB Bio): erster Anlauf 19:40:21 —
|
||||||
|
|
|
||||||
20
app.js
20
app.js
|
|
@ -1843,21 +1843,29 @@ router.on('/settings', async () => {
|
||||||
* bleiben in IndexedDB liegen; ohne diesen Hinweis wuerde sie niemand je wiederfinden. */
|
* bleiben in IndexedDB liegen; ohne diesen Hinweis wuerde sie niemand je wiederfinden. */
|
||||||
async function checkPendingShare() {
|
async function checkPendingShare() {
|
||||||
if (document.getElementById('shared-banner')) return;
|
if (document.getElementById('shared-banner')) return;
|
||||||
let n = 0, vorhanden = false;
|
let n = 0, notiz = false;
|
||||||
try {
|
try {
|
||||||
const p = await idb.get('shared_payload');
|
const p = await idb.get('shared_payload');
|
||||||
if (p) { vorhanden = true; n = (p.files || []).length; }
|
if (p) {
|
||||||
else {
|
n = (p.files || []).length;
|
||||||
|
notiz = !!((p.title || '').trim() || (p.text || '').trim() || (p.url || '').trim());
|
||||||
|
} else {
|
||||||
const alt = await idb.get('shared_files'); // altes Format
|
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; }
|
} catch (_) { return; }
|
||||||
if (!vorhanden) return;
|
|
||||||
|
|
||||||
const b = document.createElement('button');
|
const b = document.createElement('button');
|
||||||
b.id = 'shared-banner';
|
b.id = 'shared-banner';
|
||||||
b.className = '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'; });
|
b.addEventListener('click', () => { location.href = 'share.html'; });
|
||||||
document.body.appendChild(b);
|
document.body.appendChild(b);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
18
share.html
18
share.html
|
|
@ -284,8 +284,9 @@ async function renderPicker() {
|
||||||
</div>
|
</div>
|
||||||
<div id="share-orders"><div class="loader">Lade Aufträge…</div></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-large" id="btn-store" disabled>Ablegen</button>
|
||||||
|
<button class="btn btn-secondary" id="btn-discard" style="margin-top:10px;width:100%;">Verwerfen</button>
|
||||||
</div>
|
</div>
|
||||||
`;
|
`;
|
||||||
|
|
||||||
|
|
@ -310,6 +311,19 @@ async function renderPicker() {
|
||||||
});
|
});
|
||||||
|
|
||||||
document.getElementById('btn-store').addEventListener('click', store);
|
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
|
bindeKarten(main()); // Schnellzugriff klickbar machen
|
||||||
if (vorwahl) waehleAuftrag(vorwahl.id, vorwahl.ref, vorwahl.name, vorwahl.ort);
|
if (vorwahl) waehleAuftrag(vorwahl.id, vorwahl.ref, vorwahl.name, vorwahl.ort);
|
||||||
loadOrders('');
|
loadOrders('');
|
||||||
|
|
@ -387,6 +401,8 @@ async function store() {
|
||||||
(async function boot() {
|
(async function boot() {
|
||||||
payload = await readPayload();
|
payload = await readPayload();
|
||||||
if (!payload || (!payload.files.length && !payload.text && !payload.title && !payload.url)) {
|
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>
|
main().innerHTML = `<div class="empty-state"><div class="icon">📭</div>
|
||||||
Es kam nichts an.<br>Teile Bilder oder Text aus WhatsApp erneut mit „Baustelle".
|
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>`;
|
<br><button class="btn" style="margin-top:16px;" onclick="location.href='./'">Zur App</button></div>`;
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue