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 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 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 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`, jetzt am Foto statt am App-Start; dazu ein Audit mit zwei Befunden in der
Abschnitte CC bis CI. Davor: Geraetezeit statt Ankunftszeit - die Wurzel hinter der 3-km-Fahrt: 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 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 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 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 Startzeit, gleich bleibend ohne Aenderung, wechselnd bei Aenderung, `0` fuer
ein fehlendes Foto, Rueckfall ohne Staende, und der gemerkte Stand ueber einen ein fehlendes Foto, Rueckfall ohne Staende, und der gemerkte Stand ueber einen
Neustart. 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) 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 ( return (
<div className="dm-wisch"> <div className={"dm-wisch" + (zeigt ? " dm-wisch--zeigt" : "")}>
<button <button
type="button" type="button"
className="dm-wisch__loeschen" className="dm-wisch__loeschen"
+18 -2
View File
@@ -101,9 +101,13 @@ input[type="date"].dm-eingabe {
cursor: pointer; 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 { .dm-auswahl option {
color: var(--fg); color: var(--fg);
background: var(--tile); background: var(--canvas);
} }
/* `.notiz` im Panel: --ios-fill statt --tile-2, 12px Radius, 14px Abstand /* `.notiz` im Panel: --ios-fill statt --tile-2, 12px Radius, 14px Abstand
@@ -382,12 +386,15 @@ input[type="date"].dm-eingabe {
overflow: hidden; overflow: hidden;
} }
/* Unsichtbar, solange nicht gewischt wird - siehe WischLoeschen und
.ads-swipe-delete im Design-System. */
.dm-wisch__loeschen { .dm-wisch__loeschen {
position: absolute; position: absolute;
top: 0; top: 0;
right: 0; right: 0;
bottom: 0; bottom: 0;
width: 88px; width: 88px;
visibility: hidden;
border: 0; border: 0;
padding: 0; padding: 0;
background: var(--bad); background: var(--bad);
@@ -397,9 +404,18 @@ input[type="date"].dm-eingabe {
cursor: pointer; cursor: pointer;
} }
.dm-wisch--zeigt .dm-wisch__loeschen {
visibility: visible;
}
.dm-wisch__inhalt { .dm-wisch__inhalt {
position: relative; 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; 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", "domain": "audi_dashboard",
"name": "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", "documentation": "https://gitea.nothaft.cloud/paul/audi-app/src/branch/main/README.md",
"issue_tracker": "https://gitea.nothaft.cloud/paul/audi-app/issues", "issue_tracker": "https://gitea.nothaft.cloud/paul/audi-app/issues",
"codeowners": [ "codeowners": [