Strecken gestaffelt anzeigen (2026.9.1.18)
Die gewonnene Genauigkeit kam nicht an: de() formatiert ohne Nachkommastelle,
aus 6,896 km wurde in beiden Oberflaechen "7 km". Den ganzen Tag auf zehn Meter
genau gemessen und im letzten Schritt weggerundet.
Staffelung, vom Eigentuemer festgelegt: unter 1 km Meter ("400 m"), bis
99,9 km eine Nachkommastelle ("6,9 km"), ab 100 km ganze Kilometer ("104 km").
streckeTeile()/streckeText() in beiden Codebasen, wortgleich.
Gestaffelt wird nach dem GERUNDETEN Wert: 0,9996 km sind gerundet 1000 m und
gehoeren in die km-Stufe, sonst stuende dort "1.000 m". streckeTeile() gibt
Wert und Einheit getrennt zurueck, weil die Detailansicht beide in getrennten
Elementen setzt - ohne das stuende unter "400" weiterhin "km".
Im Panel heisst die Funktion streckeText, nicht strecke: den Namen gibt es dort
schon fuer die Ortsangaben einer Fahrt. node --check hat die Kollision gefunden.
Angewandt auf Einzelfahrt und Jahres-/Monatssummen. Nicht auf Kilometerstaende,
Serviceintervalle oder Reichweite - das sind Zaehlerstaende und Prognosen.
VERIFIZIERT: 12 Faelle gegen die Staffelung samt beider Grenzen, 165/165 Tests
gruen, Panel als Modul, tsc --noEmit und vite build sauber, im Browser
nachgesehen: die Fahrt vom 01.09. steht jetzt mit 6,9 km statt "7 km".
Die angepasste Testerwartung ist selbst ein Beleg: sie verlangte "43 km" fuer
eine Summe von 42,5 km - die alte Anzeige rundete schon dort, wo es etwas zu
zeigen gab.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
@@ -1,7 +1,7 @@
|
|||||||
# AGENTS.md — Project state, review findings, open items, and working rules
|
# AGENTS.md — Project state, review findings, open items, and working rules
|
||||||
|
|
||||||
**Last updated: 2026-09-01** (Audit ueber Panel, App und Backend: vier Befunde, zwei behoben,
|
**Last updated: 2026-09-01** (Strecken gestaffelt: Meter, Nachkommastelle, ganze Kilometer,
|
||||||
`2026.9.1.17`, Abschnitt BH. Davor: Setup mit gruener Bestaetigung und Erwartungswert je
|
`2026.9.1.18`, Abschnitt BI. Davor: Audit ueber Panel, App und Backend, Abschnitt BH. Davor: Setup mit gruener Bestaetigung und Erwartungswert je
|
||||||
Listenposition, Abschnitt BG. Davor: Rueckblick ohne Nullfahrten, Streckenwahl gemeinsam in `verlauf.py`,
|
Listenposition, Abschnitt BG. Davor: Rueckblick ohne Nullfahrten, Streckenwahl gemeinsam in `verlauf.py`,
|
||||||
`2026.9.1.14`, Abschnitt BF. Davor: Fahrtstrecke auf 100 m: CAN als Anker, GNSS als Nachkommastelle,
|
`2026.9.1.14`, Abschnitt BF. Davor: Fahrtstrecke auf 100 m: CAN als Anker, GNSS als Nachkommastelle,
|
||||||
`2026.9.1.10`, Abschnitt BE. Davor: Nachlauf-Abzug nur mit zugeordnetem `TRIP_SENSOR`, `2026.9.1.9`;
|
`2026.9.1.10`, Abschnitt BE. Davor: Nachlauf-Abzug nur mit zugeordnetem `TRIP_SENSOR`, `2026.9.1.9`;
|
||||||
@@ -6994,6 +6994,39 @@ nachträglich. Die Fahrt dann zu verwerfen hieße, einen bereits gespeicherten D
|
|||||||
zu löschen. Das ist eine Entscheidung über die Daten des Eigentümers, keine über den Code — dieselbe
|
zu löschen. Das ist eine Entscheidung über die Daten des Eigentümers, keine über den Code — dieselbe
|
||||||
Linie wie in Abschnitt W.
|
Linie wie in Abschnitt W.
|
||||||
|
|
||||||
|
## BI. Strecken gestaffelt anzeigen: Meter, Nachkommastelle, ganze Kilometer (2026.9.1.18)
|
||||||
|
|
||||||
|
Beim Audit fiel auf, dass die gewonnene Genauigkeit gar nicht ankam: `de()` formatiert ohne
|
||||||
|
Nachkommastelle, aus `6,896 km` wurde in beiden Oberflächen schlicht **„7 km"**. Wir haben den
|
||||||
|
ganzen Tag auf zehn Meter genau gemessen und es im letzten Schritt weggerundet.
|
||||||
|
|
||||||
|
| Strecke | Anzeige |
|
||||||
|
|---|---|
|
||||||
|
| unter 1 km | Meter, ganzzahlig — `400 m`, `999 m` |
|
||||||
|
| bis 99,9 km | eine Nachkommastelle — `1,0 km`, `6,9 km` |
|
||||||
|
| ab 100 km | ganze Kilometer — `104 km` |
|
||||||
|
|
||||||
|
`streckeTeile()`/`streckeText()` in beiden Codebasen, wortgleich. Zwei Feinheiten:
|
||||||
|
|
||||||
|
- **Gestaffelt wird nach dem GERUNDETEN Wert**, nicht nach dem rohen. 0,9996 km sind gerundet
|
||||||
|
1000 m und gehören damit in die km-Stufe — sonst stünde dort „1.000 m". Dasselbe an der Grenze zu 100.
|
||||||
|
- **`streckeTeile()` gibt Wert und Einheit getrennt zurück**, weil die Detailansicht die große Zahl
|
||||||
|
und ihre Einheit in getrennten Elementen setzt. Ohne das stünde unter „400" weiterhin „km".
|
||||||
|
|
||||||
|
Im Panel heißt die Funktion `streckeText`, nicht `strecke`: den Namen gibt es dort schon für die
|
||||||
|
Ortsangaben einer Fahrt („Ingolstadt → München"). `node --check` hat die Kollision gefunden.
|
||||||
|
|
||||||
|
Angewandt auf Einzelfahrt (Liste, Detail) und die Jahres-/Monatssummen. **Nicht** auf
|
||||||
|
Kilometerstände, Serviceintervalle oder Reichweite — das sind Zählerstände und Prognosen, keine
|
||||||
|
gefahrenen Strecken.
|
||||||
|
|
||||||
|
Verifiziert: 12 Fälle gegen die Staffelung samt beider Grenzen, 165/165 Tests grün nach Anpassung
|
||||||
|
einer Erwartung, `node --check` als Modul, `tsc --noEmit` und `vite build` sauber, im Browser
|
||||||
|
nachgesehen: die Fahrt vom 01.09. steht jetzt mit **6,9 km** statt „7 km".
|
||||||
|
|
||||||
|
Die angepasste Erwartung ist selbst ein Beleg: der Test verlangte `„43 km"` für eine Summe von
|
||||||
|
**42,5 km** — die alte Anzeige rundete also schon dort, wo es etwas zu zeigen gab.
|
||||||
|
|
||||||
## Working conventions (observed — keep them)
|
## Working conventions (observed — keep them)
|
||||||
|
|
||||||
- German is the project language: identifiers, comments, commits, UI texts. Exceptions:
|
- German is the project language: identifiers, comments, commits, UI texts. Exceptions:
|
||||||
|
|||||||
@@ -20,6 +20,36 @@ export function eur(wert: number | null | undefined): string {
|
|||||||
liegen. */
|
liegen. */
|
||||||
|
|
||||||
/** Wie de(), aber „–" statt „0" wenn nichts bekannt ist. */
|
/** Wie de(), aber „–" statt „0" wenn nichts bekannt ist. */
|
||||||
|
/** Eine gefahrene Strecke in der Staffelung, die der Eigentümer am 01.09.2026
|
||||||
|
* festgelegt hat:
|
||||||
|
*
|
||||||
|
* unter 1 km -> Meter, ganzzahlig ("400 m", "999 m")
|
||||||
|
* bis 99,9 km -> eine Nachkommastelle ("1,0 km", "6,9 km")
|
||||||
|
* ab 100 km -> ganze Kilometer ("104 km")
|
||||||
|
*
|
||||||
|
* Seit der GNSS-Verfeinerung messen wir auf etwa zehn Meter genau; ohne
|
||||||
|
* Nachkommastelle wurde davon nichts sichtbar (aus 6,896 km wurde "7 km").
|
||||||
|
* Umgekehrt wäre eine Nachkommastelle bei dreistelligen Summen nur Unruhe.
|
||||||
|
*
|
||||||
|
* Gestaffelt wird nach dem GERUNDETEN Wert: 0,9996 km sind gerundet 1000 m
|
||||||
|
* und gehören damit schon in die km-Stufe, sonst stünde dort "1.000 m".
|
||||||
|
*
|
||||||
|
* Wortgleich mit streckeTeile()/streckeText() im Panel. */
|
||||||
|
export function streckeTeile(km: number | null | undefined): { wert: string; einheit: string } | null {
|
||||||
|
const n = Number(km)
|
||||||
|
if (km === null || km === undefined || !Number.isFinite(n)) return null
|
||||||
|
const meter = Math.round(n * 1000)
|
||||||
|
if (Math.abs(meter) < 1000) return { wert: de(meter), einheit: "m" }
|
||||||
|
const fein = Math.round(n * 10) / 10
|
||||||
|
if (Math.abs(fein) < 100) return { wert: de(fein, 1), einheit: "km" }
|
||||||
|
return { wert: de(Math.round(n)), einheit: "km" }
|
||||||
|
}
|
||||||
|
|
||||||
|
export function streckeText(km: number | null | undefined, ersatz = "–"): string {
|
||||||
|
const t = streckeTeile(km)
|
||||||
|
return t ? `${t.wert} ${t.einheit}` : ersatz
|
||||||
|
}
|
||||||
|
|
||||||
export function deOderStrich(wert: number | null | undefined, nachkomma = 0): string {
|
export function deOderStrich(wert: number | null | undefined, nachkomma = 0): string {
|
||||||
return wert === null || wert === undefined ? "–" : de(wert, nachkomma)
|
return wert === null || wert === undefined ? "–" : de(wert, nachkomma)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -15,7 +15,7 @@ import { ActionButton, Feld, Fig, Pill, Tile } from "@audi-dash/ui"
|
|||||||
|
|
||||||
import type { Fahrt } from "../api"
|
import type { Fahrt } from "../api"
|
||||||
import { useDaten } from "../daten/DatenKontext"
|
import { useDaten } from "../daten/DatenKontext"
|
||||||
import { datum, dauer, de, deOderStrich, uhrzeit } from "../format"
|
import { datum, dauer, de, streckeTeile, uhrzeit } from "../format"
|
||||||
import type { SeitenName } from "../navigation"
|
import type { SeitenName } from "../navigation"
|
||||||
import { Leerzustand, Wertzeile, Werteliste, bestaetigen } from "./bausteine"
|
import { Leerzustand, Wertzeile, Werteliste, bestaetigen } from "./bausteine"
|
||||||
import { FahrtFelderFormular, fahrtFelderAusFahrt, fahrtFelderAuswerten } from "./FahrtFelder"
|
import { FahrtFelderFormular, fahrtFelderAusFahrt, fahrtFelderAuswerten } from "./FahrtFelder"
|
||||||
@@ -109,7 +109,11 @@ export function FahrtDetail({ id, geheZu }: { id: string | undefined; geheZu: (n
|
|||||||
<Tile variant="flat" className="dm-distanzkachel">
|
<Tile variant="flat" className="dm-distanzkachel">
|
||||||
<span className="ads-eyebrow">Distanz</span>
|
<span className="ads-eyebrow">Distanz</span>
|
||||||
<div style={{ marginTop: "10px" }}>
|
<div style={{ marginTop: "10px" }}>
|
||||||
<Fig value={deOderStrich(fahrt.distance_km)} unit="km" size={52} />
|
<Fig
|
||||||
|
value={(streckeTeile(fahrt.distance_km) ?? { wert: "–" }).wert}
|
||||||
|
unit={(streckeTeile(fahrt.distance_km) ?? { einheit: "km" }).einheit}
|
||||||
|
size={52}
|
||||||
|
/>
|
||||||
</div>
|
</div>
|
||||||
<div style={{ marginTop: "15px" }}>
|
<div style={{ marginTop: "15px" }}>
|
||||||
{/* Knopf, nicht Anzeige: im Panel schaltet dieselbe Pille seit jeher
|
{/* Knopf, nicht Anzeige: im Panel schaltet dieselbe Pille seit jeher
|
||||||
|
|||||||
@@ -9,7 +9,7 @@ import { Accordion, ActionButton, Feld, Tile } from "@audi-dash/ui"
|
|||||||
|
|
||||||
import { useDaten } from "../daten/DatenKontext"
|
import { useDaten } from "../daten/DatenKontext"
|
||||||
import { nachJahrUndMonat } from "../daten/statistik"
|
import { nachJahrUndMonat } from "../daten/statistik"
|
||||||
import { datum, de, summe } from "../format"
|
import { datum, de, streckeText, summe } from "../format"
|
||||||
import type { SeitenName } from "../navigation"
|
import type { SeitenName } from "../navigation"
|
||||||
import { Blattzeile, Leerzustand } from "./bausteine"
|
import { Blattzeile, Leerzustand } from "./bausteine"
|
||||||
import { FahrtFelderFormular, LEERE_FAHRT_FELDER, fahrtFelderAuswerten } from "./FahrtFelder"
|
import { FahrtFelderFormular, LEERE_FAHRT_FELDER, fahrtFelderAuswerten } from "./FahrtFelder"
|
||||||
@@ -64,7 +64,7 @@ export function Fahrten({ geheZu }: { geheZu: (name: SeitenName, id?: string) =>
|
|||||||
title={String(jahr.jahr)}
|
title={String(jahr.jahr)}
|
||||||
summary={
|
summary={
|
||||||
<>
|
<>
|
||||||
{de(summe(jahr.eintraege, (f) => f.distance_km ?? 0))} km
|
{streckeText(summe(jahr.eintraege, (f) => f.distance_km ?? 0))}
|
||||||
<br />
|
<br />
|
||||||
{jahr.eintraege.length} Fahrt{jahr.eintraege.length === 1 ? "" : "en"}
|
{jahr.eintraege.length} Fahrt{jahr.eintraege.length === 1 ? "" : "en"}
|
||||||
</>
|
</>
|
||||||
@@ -76,7 +76,7 @@ export function Fahrten({ geheZu }: { geheZu: (name: SeitenName, id?: string) =>
|
|||||||
key={monat.schluessel}
|
key={monat.schluessel}
|
||||||
level={2}
|
level={2}
|
||||||
title={monatName(monat.jahr, monat.monat)}
|
title={monatName(monat.jahr, monat.monat)}
|
||||||
summary={`${de(summe(monat.eintraege, (f) => f.distance_km ?? 0))} km`}
|
summary={streckeText(summe(monat.eintraege, (f) => f.distance_km ?? 0))}
|
||||||
defaultOpen={monat === jahr.monate[0]}
|
defaultOpen={monat === jahr.monate[0]}
|
||||||
>
|
>
|
||||||
{monat.eintraege.map((fahrt, i) => (
|
{monat.eintraege.map((fahrt, i) => (
|
||||||
@@ -89,7 +89,7 @@ export function Fahrten({ geheZu }: { geheZu: (name: SeitenName, id?: string) =>
|
|||||||
label={strecke(fahrt)}
|
label={strecke(fahrt)}
|
||||||
labelZusatz={`${datum(fahrt.ts_start)} · ${artText(fahrt.art)}`}
|
labelZusatz={`${datum(fahrt.ts_start)} · ${artText(fahrt.art)}`}
|
||||||
wert={
|
wert={
|
||||||
fahrt.distance_km != null ? `${de(fahrt.distance_km)} km` : "offen"
|
streckeText(fahrt.distance_km, "offen")
|
||||||
}
|
}
|
||||||
wertZusatz={
|
wertZusatz={
|
||||||
fahrt.verbrauch_l_100km != null
|
fahrt.verbrauch_l_100km != null
|
||||||
|
|||||||
@@ -126,9 +126,10 @@ describe("Inhalte kommen wirklich aus den Daten", () => {
|
|||||||
it("gruppiert Fahrten nach Jahr", async () => {
|
it("gruppiert Fahrten nach Jahr", async () => {
|
||||||
zeige("trips")
|
zeige("trips")
|
||||||
await waitFor(() => expect(screen.getByText("2026")).toBeTruthy())
|
await waitFor(() => expect(screen.getByText("2026")).toBeTruthy())
|
||||||
// Ganze Kilometer in der Liste, wie vTrips() im Panel (`de(t.distance_km)`
|
// Gestaffelt nach streckeText(): unter 100 km mit einer Nachkommastelle.
|
||||||
// ohne Nachkommastelle) - die Nachkommastelle steht auf der Einzelfahrt.
|
// Die Regel gilt seit dem 01.09.2026 fuer Einzelfahrten UND Summen, damit
|
||||||
expect(screen.getByText("43 km")).toBeTruthy()
|
// die auf zehn Meter genaue GNSS-Messung ueberhaupt sichtbar wird.
|
||||||
|
expect(screen.getByText("42,5 km")).toBeTruthy()
|
||||||
})
|
})
|
||||||
|
|
||||||
it("zeigt bei einer Fahrt ohne Position keine erfundene Route", async () => {
|
it("zeigt bei einer Fahrt ohne Position keine erfundene Route", async () => {
|
||||||
|
|||||||
@@ -1 +1 @@
|
|||||||
{"version":"2026.9.1.17","sha256":"96fa9737a475fe862c2dd309490f687a3e3e4088a8f356acd3f5c718cc919306","bytes":265731,"gebaut":"2026-09-01T17:08:45Z"}
|
{"version":"2026.9.1.18","sha256":"9dcad77b962e5ef55446d70031249261f850df3e12077bce31656bdf247dd6fe","bytes":265893,"gebaut":"2026-09-01T17:27:43Z"}
|
||||||
Binary file not shown.
@@ -124,6 +124,38 @@ const $ = (s) => ROOT.querySelector(s);
|
|||||||
|
|
||||||
/* ---------------------------------------------------------------- Format */
|
/* ---------------------------------------------------------------- Format */
|
||||||
const de = (n, d = 0) => Number(n ?? 0).toLocaleString("de-DE", { minimumFractionDigits: d, maximumFractionDigits: d });
|
const de = (n, d = 0) => Number(n ?? 0).toLocaleString("de-DE", { minimumFractionDigits: d, maximumFractionDigits: d });
|
||||||
|
/* Eine gefahrene Strecke in der Staffelung, die der Eigentuemer am 01.09.2026
|
||||||
|
festgelegt hat:
|
||||||
|
|
||||||
|
unter 1 km -> Meter, ganzzahlig ("400 m", "999 m")
|
||||||
|
bis 99,9 km -> eine Nachkommastelle ("1,0 km", "6,9 km")
|
||||||
|
ab 100 km -> ganze Kilometer ("104 km")
|
||||||
|
|
||||||
|
Der Grund fuer die Staffelung: seit der GNSS-Verfeinerung messen wir auf
|
||||||
|
etwa zehn Meter genau (Fahrt vom 01.09.: 5,015 km GNSS gegen 5,000 km am
|
||||||
|
Tacho, 0,3 %). Ohne Nachkommastelle wurde davon nichts sichtbar - aus
|
||||||
|
6,896 km wurde in der Anzeige schlicht "7 km". Umgekehrt waere eine
|
||||||
|
Nachkommastelle bei dreistelligen Summen nur Unruhe.
|
||||||
|
|
||||||
|
Gestaffelt wird nach dem GERUNDETEN Wert, nicht nach dem rohen: 0,9996 km
|
||||||
|
sind gerundet 1000 m und gehoeren damit schon in die km-Stufe, sonst stuende
|
||||||
|
dort "1.000 m". Dasselbe an der Grenze zu 100. */
|
||||||
|
function streckeTeile(km) {
|
||||||
|
const n = Number(km);
|
||||||
|
if (km == null || !Number.isFinite(n)) return null;
|
||||||
|
const meter = Math.round(n * 1000);
|
||||||
|
if (Math.abs(meter) < 1000) return { wert: de(meter), einheit: "m" };
|
||||||
|
const fein = Math.round(n * 10) / 10;
|
||||||
|
if (Math.abs(fein) < 100) return { wert: de(fein, 1), einheit: "km" };
|
||||||
|
return { wert: de(Math.round(n)), einheit: "km" };
|
||||||
|
}
|
||||||
|
// Der Name streckeText, nicht strecke: strecke(t) gibt es bereits fuer die
|
||||||
|
// Ortsangaben einer Fahrt ("Ingolstadt -> Muenchen").
|
||||||
|
const streckeText = (km, ersatz = "–") => {
|
||||||
|
const t = streckeTeile(km);
|
||||||
|
return t ? `${t.wert} ${t.einheit}` : ersatz;
|
||||||
|
};
|
||||||
|
|
||||||
/* Preis je Liter, oder null.
|
/* Preis je Liter, oder null.
|
||||||
|
|
||||||
Die Kosten muessen ausdruecklich geprueft werden, nicht nur die Liter: bei
|
Die Kosten muessen ausdruecklich geprueft werden, nicht nur die Liter: bei
|
||||||
@@ -1430,7 +1462,7 @@ function teaser() {
|
|||||||
return `<div class="tile teaser"><span class="label">Zuletzt</span>
|
return `<div class="tile teaser"><span class="label">Zuletzt</span>
|
||||||
${t ? `<button class="leaf" style="padding-left:0" data-go="trip:${t.trip_id}">
|
${t ? `<button class="leaf" style="padding-left:0" data-go="trip:${t.trip_id}">
|
||||||
<span class="k">Letzte Fahrt<small>${esc(t.start_address || "")} → ${esc(t.end_address || "")}</small></span>
|
<span class="k">Letzte Fahrt<small>${esc(t.start_address || "")} → ${esc(t.end_address || "")}</small></span>
|
||||||
<span class="v">${t.distance_km != null ? de(t.distance_km) + " km" : "offen"}<small>${t.status}</small></span>
|
<span class="v">${streckeText(t.distance_km, "offen")}<small>${t.status}</small></span>
|
||||||
<svg class="chev" viewBox="0 0 6 10"><polyline points="1,1 5,5 1,9"/></svg></button>` : ""}
|
<svg class="chev" viewBox="0 0 6 10"><polyline points="1,1 5,5 1,9"/></svg></button>` : ""}
|
||||||
${f ? `<button class="leaf" style="padding-left:0;border-bottom:0" data-go="fill:${f.tank_id}">
|
${f ? `<button class="leaf" style="padding-left:0;border-bottom:0" data-go="fill:${f.tank_id}">
|
||||||
<span class="k">Letzter Tankvorgang<small>${esc(f.station_name || "")}</small></span>
|
<span class="k">Letzter Tankvorgang<small>${esc(f.station_name || "")}</small></span>
|
||||||
@@ -3549,19 +3581,19 @@ function vTrips() {
|
|||||||
jahre.forEach((j, ji) => {
|
jahre.forEach((j, ji) => {
|
||||||
const tj = neuesteZuerst(TRIPS.filter((t) => new Date(t.ts_start).getFullYear() === j), "ts_start");
|
const tj = neuesteZuerst(TRIPS.filter((t) => new Date(t.ts_start).getFullYear() === j), "ts_start");
|
||||||
h += `<button class="acc-h" aria-expanded="${ji === 0}" data-acc="y${j}"><span class="mark"></span>
|
h += `<button class="acc-h" aria-expanded="${ji === 0}" data-acc="y${j}"><span class="mark"></span>
|
||||||
<span class="k">${j}</span><span class="v">${de(sum(tj, (t) => t.distance_km || 0))} km<br>${tj.length} Fahrten</span></button>
|
<span class="k">${j}</span><span class="v">${streckeText(sum(tj, (t) => t.distance_km || 0))}<br>${tj.length} Fahrten</span></button>
|
||||||
<div class="acc-b ${ji === 0 ? "on" : ""}" id="y${j}">`;
|
<div class="acc-b ${ji === 0 ? "on" : ""}" id="y${j}">`;
|
||||||
const monate = [...new Set(tj.map((t) => new Date(t.ts_start).toLocaleDateString("de-DE", { month: "long" })))];
|
const monate = [...new Set(tj.map((t) => new Date(t.ts_start).toLocaleDateString("de-DE", { month: "long" })))];
|
||||||
monate.forEach((m, mi) => {
|
monate.forEach((m, mi) => {
|
||||||
const tm = tj.filter((t) => new Date(t.ts_start).toLocaleDateString("de-DE", { month: "long" }) === m);
|
const tm = tj.filter((t) => new Date(t.ts_start).toLocaleDateString("de-DE", { month: "long" }) === m);
|
||||||
h += `<div class="lvl2"><button class="acc-h" aria-expanded="${mi === 0}" data-acc="m${j}${m}">
|
h += `<div class="lvl2"><button class="acc-h" aria-expanded="${mi === 0}" data-acc="m${j}${m}">
|
||||||
<span class="mark"></span><span class="k">${m}</span>
|
<span class="mark"></span><span class="k">${m}</span>
|
||||||
<span class="v">${de(sum(tm, (t) => t.distance_km || 0))} km</span></button>
|
<span class="v">${streckeText(sum(tm, (t) => t.distance_km || 0))}</span></button>
|
||||||
<div class="acc-b ${mi === 0 ? "on" : ""}" id="m${j}${m}">`;
|
<div class="acc-b ${mi === 0 ? "on" : ""}" id="m${j}${m}">`;
|
||||||
tm.forEach((t) => { h += swipeZeile(`trip:${t.trip_id}`, `<button class="leaf" data-go="trip:${t.trip_id}">
|
tm.forEach((t) => { h += swipeZeile(`trip:${t.trip_id}`, `<button class="leaf" data-go="trip:${t.trip_id}">
|
||||||
<span class="k">${strecke(t)}
|
<span class="k">${strecke(t)}
|
||||||
<small>${dedat(new Date(t.ts_start))} · ${artText(t.art)}</small></span>
|
<small>${dedat(new Date(t.ts_start))} · ${artText(t.art)}</small></span>
|
||||||
<span class="v">${t.distance_km != null ? de(t.distance_km) + " km" : "offen"}<small>${fahrtVerbrauch(t) != null ? de(fahrtVerbrauch(t), 1) + " l/100 km" : t.status}</small></span>
|
<span class="v">${streckeText(t.distance_km, "offen")}<small>${fahrtVerbrauch(t) != null ? de(fahrtVerbrauch(t), 1) + " l/100 km" : t.status}</small></span>
|
||||||
<svg class="chev" viewBox="0 0 6 10"><polyline points="1,1 5,5 1,9"/></svg></button>`); });
|
<svg class="chev" viewBox="0 0 6 10"><polyline points="1,1 5,5 1,9"/></svg></button>`); });
|
||||||
h += `</div></div>`;
|
h += `</div></div>`;
|
||||||
});
|
});
|
||||||
@@ -3588,7 +3620,7 @@ function vTrip(id) {
|
|||||||
${mapBox()}
|
${mapBox()}
|
||||||
<div class="tile flat" style="margin:18px 0 14px">
|
<div class="tile flat" style="margin:18px 0 14px">
|
||||||
<span class="label">Distanz</span>
|
<span class="label">Distanz</span>
|
||||||
<div class="fig" style="font-size:52px;margin-top:10px">${t.distance_km != null ? de(t.distance_km) : "–"}<span class="unit">km</span></div>
|
<div class="fig" style="font-size:52px;margin-top:10px">${(streckeTeile(t.distance_km) || { wert: "–", einheit: "km" }).wert}<span class="unit">${(streckeTeile(t.distance_km) || { einheit: "km" }).einheit}</span></div>
|
||||||
<div style="margin-top:15px">
|
<div style="margin-top:15px">
|
||||||
<button class="pill" data-art="${t.trip_id}"
|
<button class="pill" data-art="${t.trip_id}"
|
||||||
style="cursor:pointer;font-family:inherit">${artText(t.art)}</button></div>
|
style="cursor:pointer;font-family:inherit">${artText(t.art)}</button></div>
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"domain": "audi_dashboard",
|
"domain": "audi_dashboard",
|
||||||
"name": "Audi Dashboard",
|
"name": "Audi Dashboard",
|
||||||
"version": "2026.9.1.17",
|
"version": "2026.9.1.18",
|
||||||
"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": ["@paul"],
|
"codeowners": ["@paul"],
|
||||||
|
|||||||
Reference in New Issue
Block a user