Erstzulassung war in der App nicht speicherbar
Einstellungen.tsx fuehrt fuer die Erstzulassung einen eigenen Entwurf neben `entwurf`. Zwei Stellen kannten ihn nicht: speichern() stieg in der ersten Zeile aus, und die Speicherleiste haengt allein an `entwurf` - wer nur die Erstzulassung aenderte, bekam also gar keinen Speichern-Knopf zu sehen und verlor den Wert beim Verlassen der Seite. Damit blieb auch die Hauptuntersuchung leer, die daraus abgeleitet wird. Das Panel speichert an dieser Stelle sofort und war nie betroffen. Dazu: * Platzhalter beider Felder war MM/JJJJ, obwohl ein voller Tag gemeint ist - jetzt TT.MM.JJJJ. Die Monatsform bleibt lesbar, damit gespeicherte Werte wie "08/2026" gueltig bleiben. * Das Tagesmuster nimmt jetzt Punkt oder Bindestrich, in beiden Codebasen wortgleich. "01-03-2025" ergab vorher still nichts. Unmoegliche Daten werden weiterhin abgewiesen, die ISO-Form nicht verwechselt. Geprueft am laufenden System ueber die ganze Kette: eintragen, speichern, Profildatei, dann App-Service, Panel-Service und Panel-Mein-Audi mit uebereinstimmend 15.06.2027. 299 Tests gruen, 0 Tracebacks. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
@@ -11664,3 +11664,61 @@ zweiten Neustart keine Meldung und kein Schreibvorgang.
|
||||
|
||||
Weitere ausgemusterte Felder gehoeren in `AUSGEMUSTERTE_PROFILFELDER`, nicht in
|
||||
neuen Sondercode.
|
||||
|
||||
## CU. Die Erstzulassung war in der App gar nicht speicherbar (2026.9.5.12)
|
||||
|
||||
Gemeldet: *"Erstzulassung wird in den Einstellungen nicht richtig gespeichert
|
||||
und in das Service Menü übernommen... Trägt man ein datum mit Punkt oder Strich
|
||||
ein, wechselt zur Kontrolle ins Service Menü, so ist HU-Feld dort leer. Zurück
|
||||
in den Einstellungen ist Erstzulassung leer"*.
|
||||
|
||||
### Die Ursache: ein zweiter Entwurf, den die Speicherleiste nicht kannte
|
||||
|
||||
`Einstellungen.tsx` fuehrt zwei Entwuerfe nebeneinander. `entwurf` haelt die
|
||||
Einstellungen, `erstzulassung` einen eigenen fuer das Fahrzeugfeld - richtig
|
||||
so, es gehoert nicht zu den Einstellungen. Nur haben zwei Stellen den zweiten
|
||||
Entwurf vergessen:
|
||||
|
||||
if (!entwurf && !zusatz) return // speichern() stieg sofort aus
|
||||
{entwurf && ( <div className="dm-speicherleiste"> ... )} // Leiste fehlte
|
||||
|
||||
Wer **nur** die Erstzulassung aenderte, bekam damit gar keinen
|
||||
Speichern-Knopf zu sehen, und selbst ein Aufruf von `speichern()` haette in der
|
||||
ersten Zeile abgebrochen. Der eingetippte Wert war schlicht nicht speicherbar
|
||||
und beim Verlassen der Seite weg. Am laufenden System nachgewiesen: Feld nimmt
|
||||
"15.06.2024" an, `speicherleisteSichtbar: false`, kein Speichern-Knopf im DOM.
|
||||
|
||||
**Das Panel war nie betroffen** - dort schreibt der `data-einrichten`-Handler
|
||||
bei jeder Aenderung sofort ins Profil. Wieder eine Abweichung, die kein
|
||||
Quelltextvergleich zeigt, sondern nur das Bedienen beider Oberflaechen.
|
||||
|
||||
Behoben: beide Bedingungen kennen jetzt den zweiten Entwurf, und "Verwerfen"
|
||||
setzt ihn mit zurueck - sonst bliebe die Leiste danach stehen.
|
||||
|
||||
### Der Platzhalter log
|
||||
|
||||
Beide Felder schlugen `MM/JJJJ` vor, obwohl ein voller Tag gemeint ist und die
|
||||
Ableitung der Hauptuntersuchung mit einem Tag genauer rechnet. Jetzt
|
||||
`TT.MM.JJJJ`, in Panel und App. Die alte Monatsform bleibt lesbar - bereits
|
||||
gespeicherte Werte wie "08/2026" duerfen nicht ungueltig werden, und
|
||||
`genau: "monat"` traegt die Ungenauigkeit bis in die Anzeige (Abschnitt CR).
|
||||
|
||||
### Bindestrich statt Punkt
|
||||
|
||||
Der Eigentuemer hat "mit Punkt oder Strich" getippt. `01-03-2025` traf kein
|
||||
Muster und ergab still nichts. Das Tagesmuster nimmt jetzt beide Trenner:
|
||||
|
||||
/^(\d{1,2})[.\-](\d{1,2})[.\-](\d{4})$/
|
||||
|
||||
In beiden Codebasen wortgleich. Die Ablehnung unmoeglicher Daten bleibt
|
||||
(`31-02-2025` ergibt weiterhin nichts, `new Date(2025,1,31)` waere der 3. Maerz),
|
||||
und die ISO-Form wird nicht verwechselt: `2025-03-01` bleibt Jahr-Monat-Tag.
|
||||
Vier neue Tests in `format.test.ts`.
|
||||
|
||||
### Durchgehend geprueft
|
||||
|
||||
Am laufenden System, ganze Kette: App-Einstellungen, Platzhalter `TT.MM.JJJJ`,
|
||||
`15-06-2024` eingetragen, Speicherleiste erscheint, "Gespeichert.", in
|
||||
`fahrzeugprofil.json` steht `15-06-2024` - und danach zeigen App-Service,
|
||||
Panel-Service und Panel-Mein-Audi uebereinstimmend **15.06.2027** (plus 36
|
||||
Monate). Danach der urspruengliche Wert des Eigentuemers wiederhergestellt.
|
||||
|
||||
@@ -178,3 +178,29 @@ describe("Datumsangaben aus dem Bestand", () => {
|
||||
expect(monatJahr("08/2026")).toBe("August 2026")
|
||||
})
|
||||
})
|
||||
|
||||
/* Der Eigentümer hat die Erstzulassung am 05.09.2026 „mit Punkt oder Strich"
|
||||
eingetragen und danach ein leeres HU-Feld vorgefunden. Die eigentliche
|
||||
Ursache lag im Speicherweg (Einstellungen.tsx), aber eine still verworfene
|
||||
Eingabe soll auch dann nicht entstehen, wenn jemand Bindestriche tippt. */
|
||||
describe("Datum mit Bindestrich statt Punkt", () => {
|
||||
it("liest 15-06-2024 wie 15.06.2024", () => {
|
||||
expect(datum("15-06-2024")).toBe(datum("15.06.2024"))
|
||||
expect(datum("15-06-2024")).toBe("15.06.2024")
|
||||
})
|
||||
|
||||
it("nimmt auch die einstellige Schreibweise", () => {
|
||||
expect(datum("1-3-2025")).toBe("01.03.2025")
|
||||
})
|
||||
|
||||
it("weist ein unmögliches Datum weiterhin ab, egal mit welchem Trenner", () => {
|
||||
// new Date(2025, 1, 31) wäre der 3. März - das darf kein Datum ergeben.
|
||||
expect(datum("31-02-2025")).toBe("–")
|
||||
expect(datum("31.02.2025")).toBe("–")
|
||||
})
|
||||
|
||||
it("verwechselt die ISO-Schreibweise nicht damit", () => {
|
||||
// 2025-03-01 ist Jahr-Monat-Tag, nicht Tag-Monat-Jahr.
|
||||
expect(datum("2025-03-01")).toBe("01.03.2025")
|
||||
})
|
||||
})
|
||||
|
||||
@@ -132,7 +132,10 @@ interface Zeitpunkt {
|
||||
zwar nach Norm statt nach Gutduenken. */
|
||||
const ISO = /^\d{4}-\d{2}-\d{2}([T ]|$)/
|
||||
/* "1.3.2025" wie "01.03.2025". */
|
||||
const DE_TAG = /^(\d{1,2})\.(\d{1,2})\.(\d{4})$/
|
||||
// Bindestrich ist mitgemeint: der Eigentuemer hat am 05.09.2026 "mit Punkt
|
||||
// oder Strich" eingetragen. Eine still verworfene Eingabe ist der schlechtere
|
||||
// Ausgang - der Platzhalter nennt trotzdem TT.MM.JJJJ als die gemeinte Form.
|
||||
const DE_TAG = /^(\d{1,2})[.\-](\d{1,2})[.\-](\d{4})$/
|
||||
/* "08/2026" und "08.2026" - Monat und Jahr, ohne Tag. */
|
||||
const DE_MONAT = /^(\d{1,2})[./](\d{4})$/
|
||||
/* "2026-08" - dieselbe Genauigkeit, in ISO-Schreibweise. */
|
||||
|
||||
@@ -236,8 +236,16 @@ export function Einstellungen({
|
||||
eigenen Entwurf und uebergibt ihn erst beim Druck auf Speichern. Ohne den
|
||||
Umweg wuerde `entwurf` im selben Rendern noch den alten Wert tragen -
|
||||
setState wirkt erst beim naechsten Durchlauf. */
|
||||
/* `erstzulassung` fuehrt einen EIGENEN Entwurf, unabhaengig von
|
||||
`entwurf` - es gehoert zum Fahrzeug, nicht zu den Einstellungen. Diese
|
||||
Bedingung hat es dabei vergessen: wer nur die Erstzulassung aenderte,
|
||||
kam hier nie vorbei, und weiter unten erschien auch die Speicherleiste
|
||||
nicht (die haengt ebenfalls allein an `entwurf`). Der eingetippte Wert
|
||||
war damit gar nicht speicherbar und beim Verlassen der Seite weg -
|
||||
gemeldet vom Eigentuemer am 05.09.2026. Das Panel speichert an dieser
|
||||
Stelle sofort bei jeder Aenderung und war deshalb nie betroffen. */
|
||||
const speichern = async (zusatz?: Partial<EinstellungenWerte>) => {
|
||||
if (!entwurf && !zusatz) return
|
||||
if (!entwurf && !zusatz && erstzulassung === null) return
|
||||
setzeLaeuft(true)
|
||||
setzeGespeichert(false)
|
||||
try {
|
||||
@@ -398,7 +406,7 @@ export function Einstellungen({
|
||||
<Feld label="Erstzulassung">
|
||||
<input
|
||||
className="dm-eingabe"
|
||||
placeholder="MM/JJJJ"
|
||||
placeholder="TT.MM.JJJJ"
|
||||
value={erstzulassungWert}
|
||||
onChange={(e) => setzeErstzulassung(e.target.value)}
|
||||
/>
|
||||
@@ -1009,9 +1017,17 @@ export function Einstellungen({
|
||||
)}
|
||||
|
||||
{gespeichert && <p className="dm-erfolg">Gespeichert.</p>}
|
||||
{entwurf && (
|
||||
{(entwurf || erstzulassung !== null) && (
|
||||
<div className="dm-speicherleiste">
|
||||
<ActionButton onClick={() => setzeEntwurf(null)} disabled={laeuft}>
|
||||
<ActionButton
|
||||
onClick={() => {
|
||||
setzeEntwurf(null)
|
||||
// Sonst bliebe die Leiste nach "Verwerfen" stehen, weil der
|
||||
// Erstzulassungs-Entwurf sie weiter offen haelt.
|
||||
setzeErstzulassung(null)
|
||||
}}
|
||||
disabled={laeuft}
|
||||
>
|
||||
Verwerfen
|
||||
</ActionButton>
|
||||
<ActionButton variant="primary" onClick={() => void speichern()} disabled={laeuft}>
|
||||
|
||||
@@ -1 +1 @@
|
||||
{"version":"2026.9.5.11","sha256":"66b5170e70ed6879bea70b44bebef30a04b6f0a7ea3d072bd32b7cc0c1c9e412","bytes":324454,"gebaut":"2026-09-05T00:34:25Z"}
|
||||
{"version":"2026.9.5.12","sha256":"3c0199aa402d413145056a5d51be3ecadc038557ff3feb9af0da24df86702753","bytes":324476,"gebaut":"2026-09-05T08:29:16Z"}
|
||||
Binary file not shown.
@@ -710,7 +710,8 @@ function dat(s) {
|
||||
den Ersten des Monats zu ZEIGEN waere eine Erfindung - deshalb die
|
||||
Genauigkeit mitfuehren und in datumText() beruecksichtigen. */
|
||||
const DATUM_ISO = /^(\d{4})-(\d{1,2})-(\d{1,2})$/;
|
||||
const DATUM_TAG = /^(\d{1,2})\.(\d{1,2})\.(\d{4})$/;
|
||||
// Bindestrich ist mitgemeint - siehe DE_TAG in companion-app/src/format.ts.
|
||||
const DATUM_TAG = /^(\d{1,2})[.\-](\d{1,2})[.\-](\d{4})$/;
|
||||
const DATUM_MONAT = /^(\d{1,2})[./](\d{4})$/;
|
||||
const DATUM_ISO_MONAT = /^(\d{4})-(\d{1,2})$/;
|
||||
|
||||
@@ -3579,7 +3580,7 @@ function vEinst() {
|
||||
<div class="feld"><label for="einKennzeichen">Kennzeichen</label>
|
||||
<input id="einKennzeichen" value="${esc(CONFIG.kennzeichen || "")}" data-einrichten="kennzeichen"></div>
|
||||
<div class="feld"><label for="einErstzulassung">Erstzulassung</label>
|
||||
<input id="einErstzulassung" value="${esc(CAR.erstzulassung || "")}" data-einrichten="erstzulassung" placeholder="MM/JJJJ"></div>
|
||||
<input id="einErstzulassung" value="${esc(CAR.erstzulassung || "")}" data-einrichten="erstzulassung" placeholder="TT.MM.JJJJ"></div>
|
||||
<div class="feld" style="border-bottom:0"><label for="einAusfuehrung">Ausführung</label>
|
||||
<input id="einAusfuehrung" value="${esc(CONFIG.ausfuehrung || "")}" data-einrichten="ausfuehrung"></div>
|
||||
<span class="label" style="margin-top:20px">Ölwechsel-Intervall</span>
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"domain": "audi_dashboard",
|
||||
"name": "Audi Dashboard",
|
||||
"version": "2026.9.5.11",
|
||||
"version": "2026.9.5.12",
|
||||
"documentation": "https://gitea.nothaft.cloud/paul/audi-app/src/branch/main/README.md",
|
||||
"issue_tracker": "https://gitea.nothaft.cloud/paul/audi-app/issues",
|
||||
"codeowners": [
|
||||
|
||||
Reference in New Issue
Block a user