Audit: Wisch-Zeile und Auswahlliste der App nachgezogen

Gleichlauf, Funktion und Fehler geprueft. Sauber: 28/28 Dienste ueber
const/Registrierung/services.yaml/Klarnamen, 27/27 Sensorrollen, Routen
deckungsgleich, 47 Panel-Seiten live ohne einen Konsolenfehler, App
ebenso, Fahrzeugstatus textgleich, Bestand ohne Befund ausser den drei
bekannten Altbelegen mit odometer_km als Zeichenkette.

Zwei echte Befunde, beide in der App und beide dort, wo ein juengerer
Zwilling die Korrekturen des aelteren nie bekommen hat:

WischLoeschen (Raeder-Archiv) liess den roten Loeschknopf dauerhaft
sichtbar unter der Zeile stehen - genau der Haarlinien-Fehler, den das
Panel am 16.08.2026 mit visibility:hidden behoben hat - und malte den
Zeileninhalt mit dem durchscheinenden --tile auf eine Kachel, wodurch im
Nachtmodus der Streifen heller wird und das Rot durchscheint (Regel aus
Abschnitt AP). Beides behoben und im Nachtmodus nachgemessen.

.dm-auswahl option stand auf --tile; die aufgeklappte Liste eines <select>
malt der Browser ausserhalb der Seite, ein durchscheinender Wert laesst
dort den hellen Systemgrund durch. Im Panel steht dafuer seit dem
16.08.2026 --canvas.

Zur ausgelieferten .ipa: entpackt und gelesen - Erweiterung mit echtem
Programm, beide Plugins samt Methoden im App-Programm, App-Gruppe in
beiden Profilen, Kalender- und Standortschluessel da. Fehlt nur die
CFBundleVersion der Erweiterung (der Grund fuer die abgelehnte
Installation) und der Kamera-Schluessel - beides im Skript behoben und
wirksam beim naechsten Xcode-Lauf.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
2026-09-04 13:49:40 +02:00
parent 68732aa10f
commit 9e9ca9ca28
6 changed files with 136 additions and 7 deletions
+108 -2
View File
@@ -10,8 +10,9 @@ fuer den Zugangs-Token; dazu Debug-Mode, eine Version-Kachel, das Knopfpaar nach
HIG und Bilder ohne Verzoegerung; dazu eine Musterseite, die die App ohne Token
und ohne Netz rendert; dazu der QR-Code aus einem gespeicherten Bild, ein stiller
Debug-Knopf und der HA-Zugang bei den Zugaengen; der Cache-Brecher der Bilder haengt
jetzt am Foto statt am App-Start, `2026.9.4.14`,
Abschnitte CC bis CI. Davor: Geraetezeit statt Ankunftszeit - die Wurzel hinter der 3-km-Fahrt:
jetzt am Foto statt am App-Start; dazu ein Audit mit zwei Befunden in der
Wisch-Zeile und der Auswahlliste der App, `2026.9.4.15`,
Abschnitte CC bis CJ. 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
@@ -10166,3 +10167,108 @@ Dazu 6 Regressionstests (`src/screens/bilder.test.ts`): Zeitstempel statt
Startzeit, gleich bleibend ohne Aenderung, wechselnd bei Aenderung, `0` fuer
ein fehlendes Foto, Rueckfall ohne Staende, und der gemerkte Stand ueber einen
Neustart.
## CJ. Audit vom 04.09.2026: zwei echte Befunde, beide in der App (2026.9.4.15)
Auftrag des Eigentuemers: Gleichlauf pruefen, Zwischenablage und
Teilen-Erweiterung beurteilen, App und Panel auf Funktion und Fehler abklopfen.
### Was sauber ist
29 Backend-Dateien `py_compile`, beide Frontend-Dateien als **Modul** geparst
(Abschnitt AQ), `tsc --noEmit`, 221 Tests, `vite build`. Tabellen in beide
Richtungen abgeglichen, ohne Abweichung:
| | |
|---|---|
| Dienste | 28 in `const.py`, 28 registriert, 28 in `services.yaml`, 28 Klarnamen |
| Sensorrollen | 27 im Katalog, 27 in der Dataclass, jede mit Beispielnamen, beide Listenfelder mit vier |
| Routen | Panel-Unterseiten und App-Titel decken sich; nur in der App: die fuenf Reiterwurzeln und `live` (LiveFahrt, ohne Panel-Gegenstueck, dokumentiert) |
**Panel live durchgelaufen**, 47 Seitenaufrufe (fuenf Reiter, alle 17
Einzelfahrten, alle 16 Einzelbelege, jede Unterseite): **kein einziger
Konsolenfehler**, keine unbehandelte Ablehnung. In der App dasselbe ueber die
angemeldete Sitzung, ebenfalls fehlerfrei.
**Textgleich zwischen Panel und App** (Vergleich am gerenderten Text): der
Fahrzeugstatus Zeichen fuer Zeichen, die Raeder-Seite bis auf den
Loeschknopf - und genau der war der Befund (unten). Die Einstellungen fuehren
in beiden dieselben acht Abschnitte in derselben Reihenfolge.
**Bestandspruefung** (18 Fahrten, 16 Tankvorgaenge, 17 Batterietage): keine
0-km-Fahrt, keine negative Strecke, keine doppelte Kennung, keine
Ueberschneidung, kein Ende vor dem Beginn, alle Spannungen in 8-16 V, der
Verlauf sortiert. Einziger Befund sind die drei bekannten Altbelege mit
`odometer_km` als Zeichenkette (`"50250"`, Abschnitt CA) - der Lesepfad faengt
sie ueber `als_kilometerstand()` ab.
### Befund 1: die Wisch-Zeile der App hatte zwei Absicherungen nicht
`WischLoeschen` (Raeder-Archiv, gebaut am 02.09.2026) ist der juengere
Zwilling von `SwipeRow` im Design-System - und hat dessen beide Korrekturen
nie bekommen:
* **Der rote Loeschknopf lag dauerhaft sichtbar unter der Zeile.** Genau daran
hatte das Panel am 16.08.2026 den Haarlinien-Fehler: Zeilenhoehen sind
gebrochen, die Kante faellt nicht auf das Pixelraster, und das Rot blitzt als
duenner Rahmen um jede Zeile durch. Panel und Design-System halten ihn
deshalb `visibility: hidden`, bis wirklich gewischt wird.
* **Der Zeileninhalt war mit `var(--tile)` gemalt** - dem durchscheinenden
Kachelton. Die Zeile liegt aber auf einer Kachel: zweimal derselbe Schleier
ergibt im Nachtmodus einen sichtbar helleren Streifen, und das Rot darunter
scheint durch. Das ist die Regel aus Abschnitt AP, wortgleich schon einmal
aufgetreten.
Beides behoben (`.dm-wisch--zeigt`, `--tile-deckend`), live im Nachtmodus
nachgemessen: Knopf `hidden`, Zeile `rgb(23,27,33)` (deckend), und „Loeschen"
steht nicht mehr im Text der Seite - wie im Panel.
### Befund 2: die aufgeklappte Auswahlliste konnte durchscheinen
`.dm-auswahl option` stand auf `var(--tile)`. Die Liste eines `<select>` malt
der Browser selbst, ausserhalb der Seite - ein durchscheinender Wert laesst
dort den hellen Untergrund des Systems durch. Im Panel steht aus genau diesem
Grund seit dem 16.08.2026 `--canvas` (`.feld select option`, mit
ausdruecklichem Kommentar). Jetzt auch in der App.
**Geprueft und NICHT geaendert:** `.dm-standort-leer` malt ebenfalls `--tile`,
aber `.standort-leer` im Panel tut dasselbe - beide gleich, also kein
Gleichlauf-Befund. Eine Aenderung waere hier eine Gestaltungsfrage fuer beide
Seiten, keine Korrektur einer Abweichung.
### Zwischenablage und Teilen-Erweiterung: der Stand vor dem naechsten Xcode-Lauf
Die **ausgelieferte** `App.ipa` (Stand `2026.9.4.5`, Commit `d819f2e`)
entpackt und gelesen. Alles daran ist richtig - bis auf den einen Punkt, der
sie unbrauchbar macht:
| | |
|---|---|
| Erweiterung `DataMetric360Share.appex` | echtes Programm, 110.320 Bytes |
| `BelegZwischenablagePlugin` / `KalenderTerminPlugin` | beide im App-Programm, samt `pdfHolen` und `terminAnlegen` |
| App-Gruppe `group.app.datametric360` | in **beiden** Bereitstellungsprofilen |
| Standort- und beide Kalender-Schluessel | vorhanden |
| URL-Schema `datametric360` | vorhanden |
| Aktivierungsregel | Anhang oder Datei, je einer - das Teilen-Blatt zeigt die App also an |
| **`CFBundleVersion` der Erweiterung** | **fehlt** - genau der Grund, aus dem iOS die Installation ablehnt (Abschnitt CD) |
| `NSCameraUsageDescription` | fehlt - der Scanner kam erst danach |
Beides ist im Skript laengst behoben und wirkt beim naechsten Lauf:
`ios-signieren.sh` schreibt eine echte Build-Nummer in **beide** Buendel,
**bricht ab**, wenn einem davon eine brauchbare fehlt, und setzt den
Kamera-Schluessel.
Der Rest der Verdrahtung ist stimmig gelesen: beide Swift-Erweiterungen
erfuellen `CAPBridgedPlugin` mit `identifier`/`jsName`/`pluginMethods`, die
Namen decken sich mit `registerPlugin("BelegZwischenablage")` bzw.
`("KalenderTermin")` und den Methodennamen auf der TS-Seite, und
`ios-teilen-einrichten.mjs` kopiert beide Dateien und haengt sie an die
Sources-Phase des App-Ziels (mit Idempotenz-Pruefung), setzt die Entitlements
auf beiden Zielen.
**Was das nicht heisst:** dass es auf dem Geraet laeuft. Swift wird hier nicht
uebersetzt, und die Lehre aus Abschnitt AK gilt unveraendert - vier von fuenf
Fehlern der nativen Huelle haben einen erfolgreichen Archivlauf erzeugt und
sind erst am fertigen `.ipa` aufgefallen. Nach dem naechsten Lauf gehoert
deshalb geprueft: `CFBundleVersion` in beiden Buendeln, `NSCameraUsageDescription`
in der App, beide Plugin-Namen im Programm.
+8 -1
View File
@@ -399,8 +399,15 @@ export function WischLoeschen({
setzeZug(null)
}
// Sichtbar erst, wenn wirklich gewischt wird. Ohne das liegt der rote
// Knopf dauerhaft unter der Zeile - und weil Zeilenhoehen gebrochen sind,
// blitzt er als Haarlinie um jede Zeile durch. Genau dieser Fehler war im
// Panel schon einmal da (16.08.2026) und ist dort mit derselben
// visibility-Regel behoben; SwipeRow im Design-System fuehrt sie ebenfalls.
const zeigt = offen || zug !== null
return (
<div className="dm-wisch">
<div className={"dm-wisch" + (zeigt ? " dm-wisch--zeigt" : "")}>
<button
type="button"
className="dm-wisch__loeschen"
+18 -2
View File
@@ -101,9 +101,13 @@ input[type="date"].dm-eingabe {
cursor: pointer;
}
/* Deckend, NICHT --tile: die aufgeklappte Liste eines <select> malt der
Browser selbst, ausserhalb der Seite. Ein durchscheinender Wert laesst
dort den hellen Untergrund des Systems durch - im Panel steht aus genau
diesem Grund --canvas (.feld select option). */
.dm-auswahl option {
color: var(--fg);
background: var(--tile);
background: var(--canvas);
}
/* `.notiz` im Panel: --ios-fill statt --tile-2, 12px Radius, 14px Abstand
@@ -382,12 +386,15 @@ input[type="date"].dm-eingabe {
overflow: hidden;
}
/* Unsichtbar, solange nicht gewischt wird - siehe WischLoeschen und
.ads-swipe-delete im Design-System. */
.dm-wisch__loeschen {
position: absolute;
top: 0;
right: 0;
bottom: 0;
width: 88px;
visibility: hidden;
border: 0;
padding: 0;
background: var(--bad);
@@ -397,9 +404,18 @@ input[type="date"].dm-eingabe {
cursor: pointer;
}
.dm-wisch--zeigt .dm-wisch__loeschen {
visibility: visible;
}
.dm-wisch__inhalt {
position: relative;
background: var(--tile);
/* Deckend, NICHT --tile: die Zeile liegt auf einer Kachel, und die ist
im Nachtmodus selbst nur ein durchscheinender Schleier - zweimal
gemalt wird der Streifen heller als die Kachel um ihn herum, und der
rote Knopf darunter scheint durch. Dieselbe Regel wie bei
.ads-swipe-content und .swipe-content im Panel (Abschnitt AP). */
background: var(--tile-deckend, var(--canvas));
touch-action: pan-y;
}
@@ -1 +1 @@
{"version":"2026.9.4.14","sha256":"38298c65ce8557c805efd30f56e6978ea60857321ae008efd647cddd7b1b50d5","bytes":321436,"gebaut":"2026-09-04T11:28:44Z"}
{"version":"2026.9.4.15","sha256":"383f37e9e04d9514c4b254a3848368e3e5f46daab1434ab05b7551696c9d6c1f","bytes":321463,"gebaut":"2026-09-04T11:48:21Z"}
@@ -1,7 +1,7 @@
{
"domain": "audi_dashboard",
"name": "Audi Dashboard",
"version": "2026.9.4.14",
"version": "2026.9.4.15",
"documentation": "https://gitea.nothaft.cloud/paul/audi-app/src/branch/main/README.md",
"issue_tracker": "https://gitea.nothaft.cloud/paul/audi-app/issues",
"codeowners": [