461151cfec
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 <noreply@anthropic.com>
80 lines
3.0 KiB
TypeScript
80 lines
3.0 KiB
TypeScript
/**
|
|
* Musterseite: die Oberflaeche der App mit Beispieldaten, ohne Server.
|
|
*
|
|
* WOFUER
|
|
* ------
|
|
* Die App braucht sonst einen gespeicherten Zugang, um ueberhaupt etwas
|
|
* anzuzeigen - und damit war jede OPTISCHE Pruefung an ein Zugangstoken
|
|
* gebunden. Genau daran ist in diesem Projekt wiederholt die Verifikation
|
|
* haengengeblieben, obwohl fast jeder gefundene Fehler (CSS-Spezifitaet,
|
|
* Flex-Basis in Spalten, unsichtbare Rahmen) nur am gerenderten Bild
|
|
* sichtbar war und von tsc und den Tests nicht gefunden werden konnte.
|
|
*
|
|
* Diese Seite mountet dieselben Bildschirme mit demselben Stylesheet, aber
|
|
* mit `beispielApi()` aus den Tests. Kein Netz, kein Token, keine echten
|
|
* Daten - und trotzdem echtes CSS.
|
|
*
|
|
* NICHT TEIL DER APP
|
|
* ------------------
|
|
* Gebaut wird sie ueber `vite.muster.config.ts` nach `dist-muster/`. Der
|
|
* normale `npm run build` fasst sie nicht an, sie liegt also auch nicht in
|
|
* der .ipa.
|
|
*
|
|
* Aufruf: `?seite=einst` (Vorgabe), jeder Name aus navigation.ts TITEL.
|
|
* Dazu `?seite=einrichtung` fuer den Willkommensbildschirm - der ist keine
|
|
* Route (er steht VOR der Anmeldung) und braucht deshalb einen eigenen Zweig.
|
|
*/
|
|
|
|
import { StrictMode, useState } from "react"
|
|
import { createRoot } from "react-dom/client"
|
|
|
|
import "@audi-dash/ui/styles.css"
|
|
import "../src/stile/grundlage.css"
|
|
import "../src/stile/audi-schrift.css"
|
|
import "../src/stile/rahmen.css"
|
|
import "../src/stile/screens.css"
|
|
|
|
import { DatenAnbieter } from "../src/daten/DatenKontext"
|
|
import { Shell } from "../src/Shell"
|
|
import type { SeitenName } from "../src/navigation"
|
|
import { TITEL } from "../src/navigation"
|
|
import { Bestaetigungsblatt } from "../src/screens/bestaetigung"
|
|
import { Einrichtung } from "../src/screens/Einrichtung"
|
|
import { SeiteFuer } from "../src/screens/register"
|
|
import { beispielApi } from "../src/tests/beispieldaten"
|
|
|
|
function Muster() {
|
|
const gewaehlt = new URLSearchParams(location.search).get("seite") || "einst"
|
|
const start = gewaehlt as SeitenName
|
|
const [route, setzeRoute] = useState<{ name: SeitenName; id?: string }>({ name: start })
|
|
const geheZu = (name: SeitenName, id?: string) =>
|
|
setzeRoute(id === undefined ? { name } : { name, id })
|
|
// Der Willkommensbildschirm haengt an keinem Zugang und an keiner Route.
|
|
if (gewaehlt === "einrichtung") return <Einrichtung fertig={() => {}} />
|
|
return (
|
|
<DatenAnbieter api={beispielApi()}>
|
|
<Bestaetigungsblatt />
|
|
<Shell route={route} geheZu={geheZu} tabBeschriftung>
|
|
<SeiteFuer
|
|
route={route}
|
|
geheZu={geheZu}
|
|
tabBeschriftung
|
|
setzeTabBeschriftung={() => {}}
|
|
beiAbmeldung={() => {}}
|
|
/>
|
|
</Shell>
|
|
</DatenAnbieter>
|
|
)
|
|
}
|
|
|
|
// Zum schnellen Springen zwischen den Seiten, ohne die Adresse zu tippen.
|
|
;(window as unknown as { SEITEN: string[] }).SEITEN = Object.keys(TITEL)
|
|
|
|
const wurzel = document.getElementById("wurzel")
|
|
if (!wurzel) throw new Error("Wurzelelement #wurzel fehlt")
|
|
createRoot(wurzel).render(
|
|
<StrictMode>
|
|
<Muster />
|
|
</StrictMode>,
|
|
)
|