Reifen/Version/Wartungsplan: erste Runde des Sammel-Feedbacks behoben

- Archiv-Knopf jetzt in Zeile mit "Montiert" (stale margin-top entfernt),
  bekommt einen sichtbaren Hintergrund
- companion-app: Wechseltermin-Datumsfeld (appearance-Reset gegen
  natives Safari-Chrome, Breite auf Inhalt geschrumpft)
- Mein Audi/Reifen-Box: "montiert: Sommerräder" links statt Marke/Modell,
  "offen" durch "-" ersetzt
- "Servicebuch" ueberall in "Wartungsplan" umbenannt (nur Anzeigetext,
  beide Codebasen)
- Version-Kachel: tote Fahrzeugdaten-/Position-/Dashboard-Zeilen entfernt
  (inkl. der nie aktualisierten CONFIG.version-Konstante)

Version 2026.8.28.1, live im Testcontainer verifiziert.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
2026-08-28 09:43:40 +02:00
parent bdd8cb89a3
commit edefdd66d8
9 changed files with 129 additions and 31 deletions
+80
View File
@@ -3939,6 +3939,86 @@ reading source): the battery list's `<div class="leaf">` now computes `cursor: a
a genuinely navigable trip row (`<button class="leaf">`) still correctly computes `cursor: pointer` -
confirming the fix is properly scoped, not a blanket removal.
## AB. First round of a large owner batch: Reifen/Version/Wartungsplan fixes (2026.8.28.1)
Owner sent 12 items in one message. Worked through the quick, well-specified ones first; the two larger
ones (combined export/import popup, Setup-menu sensor field redesign) are being scoped with the owner before
implementation - see the open items this creates below.
- **Archiv-Knopf nicht in Zeile mit "Montiert"** (Reifen-Seite, panel only - no companion-app equivalent):
root cause was `.montiert`'s own `margin-top:var(--sp-4)` (added 2026-08-16 round eight, when the pill sat
alone under the headline block) - once the archive icon button joined it on the same flex row (section R),
that leftover margin threw off `align-items:center`'s vertical centering between the two children, even
though both were genuinely siblings in the same row. Moved the spacing to the wrapping row div instead of
one child. Verified live: both centers compute to the identical `584.08px` Y-coordinate.
- **Archiv-Icon soll ein Knopf mit Hintergrund sein**: new `.archivbtn` class (panel), permanent
`background: var(--tile-2)` instead of the generic `.iconbtn`'s hover/active-only background.
- **companion-app: Wechseltermin-Datumsfeld sah aus wie ein gestreckter Kreis statt einer Box**: root cause
is the standard cross-browser gap - `input[type="date"]` needs an explicit `appearance:none` reset or
Safari/WKWebView (this app's iOS shell) keeps its own heavily-rounded native chrome regardless of author
CSS on `background`/`border`/`border-radius`. Neither `.dm-eingabe` nor the shared `@audi-dash/ui` `Feld`
component reset it. Fixed locally in `companion-app/src/stile/screens.css` (not in the shared design-system
package - no other field type shows this, scoped to `input[type="date"].dm-eingabe` only) with
`-webkit-appearance:none`/`appearance:none` plus `width:fit-content` (owner's explicit ask: shrink to the
actual date text instead of the shared `Feld`'s `min-width:132px`). **Not live-verified** - no running
companion-app session with backend auth this round; verified via `tsc --noEmit` and the full suite only,
same limitation as several other companion-app-only changes this session.
- **Mein Audi/Reifen-Box restructured**: was `Reifen · Sommer montiert` as the tile header, then
`<dt>Continental SportContact</dt><dd>275/30 R20 97Y XL</dd>` as the first row. Header simplified to just
"Reifen"; the row's left side now reads `montiert: Sommerräder` (owner's exact wording, `${r.aktiv}räder`)
instead of the brand/model, keeping the size (`275/30 R20 97Y XL`) as the right-hand value, per the owner's
explicit "montiert... shall be on the left side". companion-app's equivalent "Mein Audi" tile
(`MeinAudi.tsx`) is structurally a single-line `NaviKachel` (`${aktiv} · ${km} km`), not the panel's
multi-row `.rows` list - it never had "Sommer montiert" or brand/model text to begin with, so nothing to
port here (documented structural difference, not a skipped fix).
- **"offen" caption removed from the Wechseltermin row**: `vereinbart ? "vereinbart" : "offen"``... : ""`
- owner: "the '-' is sufficient". Same structural note as above - companion-app's tile has no equivalent
caption to change.
- **"Servicebuch" renamed to "Wartungsplan" everywhere it's user-visible**, both codebases - tile/page
headings, empty-state text, confirm-delete dialogs, CSV export button label, the "Mein Audi" Service
NaviKachel's summary text. Deliberately NOT renamed: the `ServicebuchEintrag` TS type, the `Servicebuch()`
component/function names (panel and companion-app), the `sbuch` route key, and every code comment - same
precedent as the 2026-08-19 "Zusammen"→"Summe" rename (display-label fix, not a data-model rename).
- **"Version" tile cleaned up**: removed the "Fahrzeugdaten"/"Position" rows (both hardcoded to the literal
string "FMM003", carried no live information) and the "Dashboard" row, whose value came from `CONFIG.version`
- a frontend constant hardcoded to `"1.0"` at `profilZuConfig()` (confirmed via grep: no other reader),
never updated since. Removed that dead constant along with its row rather than leaving an orphan. Only
"Installiert" (the real `APP_VERSION` from the backend) remains.
Verified: `node --check` clean on the panel, `tsc --noEmit` clean and full suite green (146/146) on
companion-app. Manifest bumped to `2026.8.28.1` (new day, per this project's `YYYY.M.D.N` scheme - the prior
session's work had reached `.27.22`). `audi_ha_test` restarted, confirmed clean via log
(`Audi Dashboard 2026.8.28.1 eingerichtet`). Live-verified via the panel's own shadow DOM: Reifen tile shows
`montiert: Sommerräder | 275/30 R20 97Y XL` and `15.10.2026 | `; Version tile shows only "Installiert"; the
Archiv button and "Montiert" share one Y-center exactly, with a visible background disc behind the icon
(screenshot taken).
**Open, not yet started - scoped with the owner before implementation:**
- **Item 8 (informational, answered in chat, not yet acted on)**: both the live path
(`tankerkennung.py``ablage.distanz_seit_letzter_tankung()`) and the import path
(`historienimport.py`'s `_distanz_zum_vorherigen()`) compute "distance since last refuel" as an odometer
delta (current/refuel `KM_SENSOR` reading minus the previous refuel's own recorded `odometer_km`) - a
derived calculation, not read from any vehicle sensor. Owner pointed out a real FMM003 sensor,
`sensor.testzone_fmm003_calculated_distance_covered_after_the_latest_refueling` (device-side, presumably
more accurate/authoritative than our own subtraction), that reports this directly and "can be used instead
of the calculation" - not yet wired in, would mirror the `TANK_LITER_SENSOR` precedent (section Q): new
optional sensor role, preferred over the calculation when mapped, calculation stays as the fallback when
unmapped. Owner to confirm before this is built.
- **Item 9**: combine the "Fahrzeugprofil" tile (`data-profil="export"`/`"import"`, JSON) and "Daten ausgeben"
tile (`data-csv="fahrten"`/`"tanken"`/`"service"`, CSV export only, no import) into one area with two
buttons - "Datensatz sichern" opening a popup with 4 individual export actions (Fahrzeugprofil,
Fahrten/Tankvorgänge/Wartungsplan as CSV), "Datensatz laden" the same 4 in reverse. The pre-existing,
separate "Backup" tile (`data-backup="jetzt"`/`"export"`/`"import"`, a combined profil+fahrten+tank JSON
bundle plus the scheduled-backup mechanism) was NOT named by the owner and stays untouched. Three of the
four export actions and one of the four import actions already exist and just need moving into the new
popup; CSV **import** for Fahrten/Tankvorgänge/Wartungsplan does not exist anywhere yet and needs new
backend parsing (inverse of the existing CSV export format: `;`-delimited, de-DE number format).
- **Item 11**: Setup-Menü sensor role fields - replace the current description text under each field's
headline (e.g. "on = Fahrt läuft", "Optional, vom CAN...") with the live sensor's current output value and
unit inline next to the headline (`[on/off]`, `[%]`, `[l]`, `[km]`...), and show the matched entity's ID
suffix (the part after `fmm003_...`) as "the expected sensor" - not yet investigated in the code
(`entitaeten.py`'s `FELDER` catalog / the Setup popup's row-rendering in the panel).
---
## Working conventions (observed — keep them)