f115af50ab
Mein-Audi-Kachel "Versicherung/Steuer" (vAudi()) und Kfz-Steuer-Detail (vSteuer()): "Zusammen" heisst jetzt "Summe", die Fusszeile "feste Kosten im Jahr" darunter entfaellt ersatzlos. Die Kfz-Steuer-Zeile zeigt "im Jahr" statt des rohen Datenwerts "jaehrlich", deckungsgleich mit der Versicherungs-Zeile darueber - nur wenn steuer.zeitraum tatsaechlich "jaehrlich" ist. Der gespeicherte Wert und die "jaehrlich"/"halbjaehrlich"-Auswahl in vSteuerBearbeiten() bleiben unveraendert, das war ein reiner Anzeige-Fix, keine Datenmodell- Aenderung. companion-app hatte an keiner der beiden Stellen ein Gegenstueck (kein "Zusammen"-Tile, keine Nur-Lese-Anzeige des Zeitraums) - dokumentiert als vorbestehende strukturelle Luecke statt kommentarlos uebersprungen. Vertrag-Kachel: war komplett nur lesbar (Gesellschaft, Umfang, Vertragsnummer, Selbstbeteiligung, Schadenfreiheitsklasse). Neue vVertragBearbeiten()-Ansicht (Panel, Route "vertrag") ueber ein neues Zahnrad auf der Vertrag-Kachel - alle Felder editierbar, Selbstbeteiligung zusaetzlich mit Hinzufuegen/Loeschen pro Zeile (neue .zeile-loeschen-Klasse, 44x44pt-Tippflaeche wie .km-edit). Die aktuelle Schadenfreiheitsklasse bleibt bewusst nur ueber "Beitrag anpassen" editierbar (Querverweis statt Duplikat), nur "zuvor" (sfAlt) ist neu in der Vertrag-Ansicht. companion-app: neue Vertrag()-Seite (Route "vertrag", eigene NaviKachel auf der Versicherungs-Seite) nach dem dortigen etablierten Muster (lokaler Entwurf-State + expliziter Speichern-Knopf statt Panel-Autosave pro Feld - gleiches Verhalten, eigenes Idiom). Die bisherige Nur-Lese-Selbstbeteiligung in Vertragsdetails() entfaellt, da sie jetzt (editierbar) in Vertrag() lebt. Schadenfreiheitsklasse wird in companion-app bewusst nicht ergaenzt: das Feld war dort noch nie sichtbar, auch nicht lesend - eine komplette neue UI-Sektion dafuer waere kein "Zeile editierbar machen" mehr, sondern ein neues Feature; als Luecke dokumentiert statt still uebergangen. tsc --noEmit sauber, companion-app-Tests 100/100 (inkl. dem Alle-Seiten-Rendertest, der jetzt auch "vertrag" abdeckt), vite build erfolgreich. Panel live im Docker-Testcontainer geprueft: Zeile hinzufuegen/bearbeiten/loeschen, Daten bleiben nach Re-Render erhalten. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
116 lines
2.9 KiB
TypeScript
116 lines
2.9 KiB
TypeScript
/**
|
|
* Flacher Navigationszustand — kein Router-Paket.
|
|
*
|
|
* Übernommen aus dem alten HA-Panel (`route` + `ZURUECK`): Die App hat keinen
|
|
* Verlaufsstapel, sondern genau eine aktuelle Seite und eine feste Tabelle,
|
|
* welche Seite der Zurück-Pfeil ansteuert. Das ist bewusst so geblieben —
|
|
* die Verschachtelung ist flach genug (höchstens drei Ebenen), und ein Router
|
|
* würde nur Gewicht ohne Nutzen bringen.
|
|
*/
|
|
|
|
export const HAUPTBEREICHE = ["home", "audi", "trips", "stat", "fuel"] as const
|
|
|
|
export type Hauptbereich = (typeof HAUPTBEREICHE)[number]
|
|
|
|
export type SeitenName =
|
|
| Hauptbereich
|
|
// Unterseiten von "Mein Audi"
|
|
| "ident"
|
|
| "battverlauf"
|
|
| "service"
|
|
| "werkstatt"
|
|
| "sbuch"
|
|
| "reifen"
|
|
| "vers"
|
|
| "beitrag"
|
|
| "vertrag"
|
|
| "vertragsdetails"
|
|
| "schutz"
|
|
| "notruf"
|
|
| "steuer"
|
|
// Detailseiten der Listen
|
|
| "trip"
|
|
| "fill"
|
|
// Sonstige
|
|
| "sicherheit"
|
|
| "live"
|
|
| "einst"
|
|
|
|
export interface Route {
|
|
name: SeitenName
|
|
/** Datensatz-Kennung bei Detailseiten (Fahrt, Tankvorgang, Servicebuch). */
|
|
id?: string
|
|
}
|
|
|
|
/**
|
|
* Ziel des Zurück-Pfeils je Unterseite. Seiten, die hier fehlen, sind
|
|
* Hauptbereiche und zeigen keinen Zurück-Pfeil.
|
|
*/
|
|
export const ZURUECK: Partial<Record<SeitenName, SeitenName>> = {
|
|
trip: "trips",
|
|
fill: "fuel",
|
|
service: "audi",
|
|
reifen: "audi",
|
|
ident: "audi",
|
|
battverlauf: "audi",
|
|
vers: "audi",
|
|
beitrag: "vers",
|
|
vertrag: "vers",
|
|
vertragsdetails: "vers",
|
|
schutz: "vertragsdetails",
|
|
steuer: "vers",
|
|
notruf: "vers",
|
|
werkstatt: "service",
|
|
sbuch: "service",
|
|
einst: "home",
|
|
sicherheit: "home",
|
|
live: "home",
|
|
}
|
|
|
|
/** Überschrift je Seite. Leer bedeutet: die Seite bringt ihre eigene mit. */
|
|
export const TITEL: Record<SeitenName, string> = {
|
|
home: "Übersicht",
|
|
audi: "Mein Audi",
|
|
trips: "Fahrten",
|
|
stat: "Statistik",
|
|
fuel: "Tanken",
|
|
ident: "Fahrzeugdaten",
|
|
battverlauf: "Batterie",
|
|
service: "Service",
|
|
werkstatt: "Werkstatt",
|
|
sbuch: "Servicebuch",
|
|
reifen: "Reifen",
|
|
vers: "Versicherung & Steuer",
|
|
beitrag: "Beitrag",
|
|
vertrag: "Vertrag",
|
|
vertragsdetails: "Vertragsdetails",
|
|
schutz: "Schutzbrief",
|
|
notruf: "Notruf",
|
|
steuer: "Kfz-Steuer",
|
|
trip: "Fahrt",
|
|
fill: "Tankvorgang",
|
|
sicherheit: "Fahrzeugstatus",
|
|
live: "Fahrt läuft",
|
|
einst: "Einstellungen",
|
|
}
|
|
|
|
export function istHauptbereich(name: SeitenName): name is Hauptbereich {
|
|
return (HAUPTBEREICHE as readonly string[]).includes(name)
|
|
}
|
|
|
|
/**
|
|
* Der Hauptbereich, zu dem eine Seite gehört — bestimmt, welcher Eintrag in
|
|
* Tab-Leiste bzw. Seitenleiste hervorgehoben wird. Folgt der ZURUECK-Kette
|
|
* nach oben.
|
|
*/
|
|
export function bereichVon(name: SeitenName): Hauptbereich {
|
|
let aktuell: SeitenName = name
|
|
for (let tiefe = 0; tiefe < 5; tiefe++) {
|
|
if (istHauptbereich(aktuell)) return aktuell
|
|
const eltern = ZURUECK[aktuell]
|
|
if (!eltern) return "home"
|
|
aktuell = eltern
|
|
}
|
|
return "home"
|
|
}
|