Einzelfahrt: Orte aus den Koordinaten, "Min." statt "min" (2026.9.1.20)
START UND ZIEL STANDEN AUF "UNBEKANNT"
start_address/end_address stehen in HANDFELDER - das Backend fuellt sie nie von
selbst, sie kommen nur aus einer von Hand angelegten oder bearbeiteten Fahrt.
Die Koordinaten dagegen traegt das Screening ein: 12 von 14 Fahrten im
Testbestand hatten Start- und Zielposition, aber genau eine hatte eine Adresse.
Beide Oberflaechen loesen sie jetzt beim Oeffnen der Einzelfahrt auf, ueber
denselben Cache wie die Standortansicht - ein Abruf je Ort, danach nie wieder.
Bewusst NICHT in der Liste: ein Vorratsabruf fuer alle Fahrten waere genau das,
worum Nominatim in seinen Nutzungsbedingungen bittet, es nicht zu tun.
Bis zur Antwort steht "wird ermittelt ...", ohne Koordinaten oder ohne Treffer
"unbekannt". Das Panel prueft vor dem Eintragen, ob noch dieselbe Fahrt offen
ist - wer waehrend des Abrufs weiterblaettert, soll nicht die Adresse der
vorigen Fahrt in der neuen sehen.
Live: Start "Schottenau, 85072 Eichstaett", Ziel "Am Anger 7a, 85111
Adelschlag".
"MIN." STATT "MIN"
Deutsche Abkuerzung, wie die Oberflaeche sie an anderer Stelle laengst
verwendet ("Geparkt seit 2 Tg. 16 Std. 12 Min."). In dauerText() bzw. dauer(),
also ueberall wo eine Dauer erscheint. Zwei Testerwartungen mitgezogen.
Verifiziert: Panel als Modul, tsc --noEmit und vite build sauber, 165/165
Tests gruen, im Browser nachgesehen.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
@@ -947,6 +947,42 @@ function standortVerfolgungBeenden() {
|
||||
USER_WATCH = null;
|
||||
}
|
||||
|
||||
/* Der Ort einer Fahrtgrenze, solange er noch nicht aufgelöst ist.
|
||||
|
||||
Der Backend füllt start_address/end_address NIE von selbst - sie stehen in
|
||||
HANDFELDER und kommen nur aus einer von Hand angelegten oder bearbeiteten
|
||||
Fahrt. Die Koordinaten dagegen trägt das Screening ein. Deshalb stand auf
|
||||
der Einzelfahrt bisher "unbekannt", obwohl die Position bekannt war
|
||||
(vom Eigentümer gemeldet, 01.09.2026).
|
||||
|
||||
Aufgelöst wird erst beim Öffnen der Fahrt und über denselben Cache wie die
|
||||
Standortansicht - ein Abruf je Ort, danach nie wieder. Ein Vorratsabruf für
|
||||
alle Fahrten der Liste wäre genau das, worum Nominatim in seinen
|
||||
Nutzungsbedingungen bittet, es nicht zu tun. */
|
||||
function fahrtOrtText(adresse, lat, lon) {
|
||||
if (adresse) return esc(adresse);
|
||||
if (lat == null || lon == null) return "unbekannt";
|
||||
return "wird ermittelt …";
|
||||
}
|
||||
|
||||
/* Trägt die aufgelösten Orte nach dem Zeichnen ein. Die Fahrt-Kennung wird
|
||||
mitgeführt: wer während des Abrufs weiterblättert, soll nicht die Adresse
|
||||
der vorigen Fahrt in der neuen sehen. */
|
||||
async function fahrtOrteNachtragen(t) {
|
||||
const id = t.trip_id;
|
||||
const paare = [
|
||||
["start", t.start_address, t.start_lat, t.start_lon],
|
||||
["ziel", t.end_address, t.end_lat, t.end_lon],
|
||||
];
|
||||
for (const [feld, adresse, lat, lon] of paare) {
|
||||
if (adresse || lat == null || lon == null) continue;
|
||||
const ort = await standortAdresseAufloesen(lat, lon);
|
||||
const ziel = ROOT.querySelector(`[data-fahrtort="${feld}"]`);
|
||||
if (!ziel || route.name !== "trip" || route.id !== id) return;
|
||||
ziel.textContent = ort || "unbekannt";
|
||||
}
|
||||
}
|
||||
|
||||
/* Reverse-Geocoding über die öffentliche Nominatim-API (OpenStreetMap) -
|
||||
wie die Kartenkacheln oben (TILE_URL) ohne eigenen Schlüssel; bei diesem
|
||||
Aufrufvolumen (ein Fahrzeug, nur bei geöffneter Standortansicht) im Rahmen
|
||||
@@ -3469,7 +3505,9 @@ function dauerText(sekunden) {
|
||||
if (sekunden == null || !isFinite(sekunden)) return "–";
|
||||
const min = Math.max(0, Math.round(sekunden / 60));
|
||||
const std = Math.floor(min / 60);
|
||||
return std ? `${std} h ${String(min % 60).padStart(2, "0")} min` : `${min} min`;
|
||||
// "Min." statt "min": deutsche Abkuerzung, wie sie die Oberflaeche sonst
|
||||
// auch verwendet ("Geparkt seit 2 Tg. 16 Std. 12 Min.").
|
||||
return std ? `${std} h ${String(min % 60).padStart(2, "0")} Min.` : `${min} Min.`;
|
||||
}
|
||||
|
||||
/* Start und Ankunft eines Formulars als echte Zeitpunkte. Liegt die Ankunft
|
||||
@@ -3626,8 +3664,8 @@ function vTrip(id) {
|
||||
style="cursor:pointer;font-family:inherit">${artText(t.art)}</button></div>
|
||||
</div>
|
||||
<div class="tile"><dl class="rows">
|
||||
<div class="row"><dt>Start</dt><dd>${dezeitpunkt(new Date(t.ts_start))}<small>${esc(t.start_address || "unbekannt")}</small></dd></div>
|
||||
<div class="row"><dt>Ziel</dt><dd>${dezeitpunkt(new Date(t.ts_end))}<small>${esc(t.end_address || "unbekannt")}</small></dd></div>
|
||||
<div class="row"><dt>Start</dt><dd>${dezeitpunkt(new Date(t.ts_start))}<small data-fahrtort="start">${fahrtOrtText(t.start_address, t.start_lat, t.start_lon)}</small></dd></div>
|
||||
<div class="row"><dt>Ziel</dt><dd>${dezeitpunkt(new Date(t.ts_end))}<small data-fahrtort="ziel">${fahrtOrtText(t.end_address, t.end_lat, t.end_lon)}</small></dd></div>
|
||||
<div class="row"><dt>Startkilometer</dt><dd>${t.odo_start != null ? de(t.odo_start) + " km" : "noch offen"}</dd></div>
|
||||
<div class="row"><dt>Endkilometer</dt><dd>${t.odo_end != null ? de(t.odo_end) + " km" : "noch offen"}</dd></div>
|
||||
<div class="row"><dt>Dauer</dt><dd>${dauerText(t.duration_s)}</dd></div>
|
||||
@@ -4717,7 +4755,11 @@ function render() {
|
||||
const gleicheAnsicht = letzteAnsicht === route.name + "|" + (route.id || "");
|
||||
let head;
|
||||
if (route.name === "home") { head = ["", "Übersicht"]; v.innerHTML = vHome(); }
|
||||
else if (route.name === "trip") { head = ["Fahrt", "Einzelfahrt"]; v.innerHTML = vTrip(route.id); }
|
||||
else if (route.name === "trip") {
|
||||
head = ["Fahrt", "Einzelfahrt"]; v.innerHTML = vTrip(route.id);
|
||||
const t = TRIPS.find((x) => x.trip_id === route.id);
|
||||
if (t) fahrtOrteNachtragen(t);
|
||||
}
|
||||
else if (route.name === "fill") { head = ["Tankvorgang", "Einzelbeleg"]; v.innerHTML = vFill(route.id); }
|
||||
else if (route.name === "service") { head = ["Wartung", "Service"]; v.innerHTML = vService(); }
|
||||
else if (route.name === "reifen") { head = ["Fahrzeug", "Reifen"]; v.innerHTML = vReifen(); }
|
||||
|
||||
Reference in New Issue
Block a user