Rueckfrage vor loeschenden Aktionen: eigenes Blatt statt window.confirm
Gemeldet als "Verbindung trennen tut nichts". Kein Fehler der App: in eingebetteten Ansichten sind Dialoge abgeschaltet, window.confirm kehrt sofort mit false zurueck (gemessen: 1 ms), und abmelden() beginnt damit. Die Suche danach brachte den eigentlichen Befund: elf Stellen hingen an window.confirm - acht direkt, drei im Zeilenmenue (Wischgeste in Fahrten, Tankvorgaengen, Messwerten). Jede davon eine loeschende Aktion, jede in eingebetteten Ansichten still wirkungslos. Das Panel zeigt an denselben Stellen seit jeher sein eigenes Blatt. screens/bestaetigung.tsx: ein kleiner Speicher plus ein ActionSheet, das einmal in App.tsx haengt. Kein Hook je Aufrufstelle - der haette jede der elf Stellen gezwungen, das Blatt auch selbst zu rendern, elf Gelegenheiten es zu vergessen, ohne dass etwas auffaellt. Ohne gehaengtes Blatt (Testlauf, Fremdeinbettung) gilt weiter window.confirm. LOESCH_TEXT und LOESCH_HINWEIS wortgleich aus dem Panel, samt der Trennung in Frage, erklaerenden Satz und Knopfbeschriftung. 225 Tests (vier neue), live an der gemeldeten Stelle geprueft: das Blatt erscheint, Abbrechen schliesst es, die Sitzung bleibt. Bestaetigt wurde bewusst nicht - das haette den Token vom Geraet geloescht. Co-Authored-By: Claude Opus 5 <[email protected]>
This commit is contained in:
@@ -12,8 +12,9 @@ und ohne Netz rendert; dazu der QR-Code aus einem gespeicherten Bild, ein stille
|
||||
Debug-Knopf und der HA-Zugang bei den Zugaengen; der Cache-Brecher der Bilder haengt
|
||||
jetzt am Foto statt am App-Start; dazu ein Audit mit zwei Befunden in der
|
||||
Wisch-Zeile und der Auswahlliste der App; der Leerzustand der Karte ist deckend,
|
||||
`2026.9.4.16`,
|
||||
Abschnitte CC bis CJ. Davor: Geraetezeit statt Ankunftszeit - die Wurzel hinter der 3-km-Fahrt:
|
||||
dazu die Rueckfrage vor loeschenden Aktionen als eigenes Blatt statt als
|
||||
Browserdialog, `2026.9.4.17`,
|
||||
Abschnitte CC bis CK. Davor: Geraetezeit statt Ankunftszeit - die Wurzel hinter der 3-km-Fahrt:
|
||||
das Fahrtfenster stand in Geraetezeit, der Verlauf war nach Ankunftszeit sortiert. Dazu die neun
|
||||
Paritaetsbefunde und die verunreinigte Batteriehistorie, `2026.9.4.1`, Abschnitt CB. Davor: Der Regler stellt den Schlaf-Timeout des Dongles, flespi lesend und
|
||||
schreibend, die eigene Warteschlange wieder entfallen, `2026.9.3.10`, Abschnitt BZ. Davor: Zugaenge: die Dienste-Token aus App und Panel bedienbar, der Wert kommt nie
|
||||
@@ -10312,3 +10313,53 @@ Verbesserung (eigene Gestaltung statt Systemdialog, funktioniert in jedem
|
||||
Kontext, Gleichlauf mit dem Panel), kostet aber acht Aufrufstellen den Umbau
|
||||
von synchron auf einen Zustand je Stelle - deshalb hier vermerkt statt
|
||||
nebenbei gemacht.
|
||||
|
||||
## CK. Die Rueckfrage ist ein eigenes Blatt, kein Browserdialog mehr (2026.9.4.17)
|
||||
|
||||
Ausloeser war ein Fehlerbericht, der keiner war: „Verbindung trennen tut
|
||||
nichts" (App unter `:5173`). Gemessen: `window.confirm` kehrt im
|
||||
Browser-Bereich sofort mit `false` zurueck (1 ms) - und `abmelden()` beginnt
|
||||
mit genau dieser Rueckfrage. Auf dem Telefon zeigt Capacitor dafuer einen
|
||||
Systemdialog, dort greift der Knopf.
|
||||
|
||||
Die Suche danach brachte den eigentlichen Befund: **elf** Stellen der App
|
||||
hingen an `window.confirm` - acht direkt, drei weitere im `Zeilenmenue`, das
|
||||
die Wischgeste in Fahrten, Tankvorgaengen und Messwerten traegt. Jede davon
|
||||
ist eine loeschende Aktion, und jede lief in eingebetteten Ansichten still ins
|
||||
Leere. Das Panel zeigt an denselben Stellen seit jeher sein eigenes Blatt.
|
||||
|
||||
### `screens/bestaetigung.tsx`
|
||||
|
||||
Ein winziger Speicher plus ein `ActionSheet`, das **einmal** in `App.tsx`
|
||||
haengt (und in der Musterseite). `bestaetigen()` bleibt fuer die Aufrufstellen
|
||||
fast unveraendert - nur mit `await` davor.
|
||||
|
||||
**Warum kein Hook je Aufrufstelle:** ein Hook haette jede der elf Stellen
|
||||
gezwungen, das Blatt auch selbst zu rendern - elf Gelegenheiten, es zu
|
||||
vergessen, ohne dass etwas auffaellt (der Aufruf wuerde einfach nie
|
||||
antworten). Dasselbe Muster wie `theme.ts`: Zustand ausserhalb des
|
||||
Komponentenbaums, gelesen ueber `useSyncExternalStore`.
|
||||
|
||||
**Der Rueckfall ist Absicht:** ist das Blatt nirgends gehaengt (Testlauf,
|
||||
Fremdeinbettung), gilt wieder `window.confirm`. Eine Rueckfrage, die niemand
|
||||
beantworten kann, waere schlechter als der Systemdialog.
|
||||
|
||||
**Wortgleich mit dem Panel:** `LOESCH_TEXT` und `LOESCH_HINWEIS` sind von dort
|
||||
uebernommen, samt der Trennung in Frage, erklaerenden Satz und
|
||||
Knopfbeschriftung - `window.confirm` kannte nur einen Text. „Neue Raeder
|
||||
anlegen?" ist die einzige Rueckfrage, die **nicht** rot ist: sie loescht
|
||||
nichts, sie archiviert.
|
||||
|
||||
### Verifiziert
|
||||
|
||||
`tsc --noEmit` sauber, **225 Tests** (vier neue in `bestaetigung.test.tsx`:
|
||||
Ja-Antwort, Abbrechen samt Schliessen, eigene Knopfbeschriftung ohne roten
|
||||
Knopf, und der Rueckfall auf den Systemdialog).
|
||||
|
||||
**Live in der App**, an der Stelle des Fehlerberichts: der Knopf zeigt jetzt
|
||||
das Blatt mit „Zugang von diesem Geraet entfernen?", dem erklaerenden Satz,
|
||||
rotem „Trennen" und abgesetztem „Abbrechen". **Bestaetigt wurde bewusst
|
||||
nicht** - das haette den eingefuegten Token des Eigentuemers geloescht;
|
||||
Abbrechen schliesst das Blatt, die Sitzung bleibt.
|
||||
|
||||
Kein `window.confirm` mehr im Quelltext ausser dem dokumentierten Rueckfall.
|
||||
|
||||
Reference in New Issue
Block a user