feat: Wetter zum gewählten Datum und zur Endzeit übernehmen — Version 1.15.0
Bisher stand im Formular immer der aktuelle Messwert, auch bei nachträglich erfassten Einträgen. Ändert der Benutzer nun Datum oder Endzeit, werden Temperatur, Feuchte und Luftdruck auf die Messung zu diesem Zeitpunkt umgestellt. /api/wetter nimmt dafür optional ?zeit=YYYY-MM-DDTHH:MM, holt über /range das Fenster ±20 Minuten und liefert die nächstgelegene Messung. Wichtig: die Wetter-API deutet Parameter ohne Zeitzone als UTC — die Route rechnet deshalb Europe/Berlin um, sonst läge das Ergebnis im Sommer zwei Stunden daneben. Gibt es keine Messung (Zukunft, Ausfall der Station), bleiben die bisherigen Werte stehen und es erscheint ein Hinweis unter den Feldern. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -54,11 +54,13 @@ export default function LogbuchForm({ kuppel, currentUserBeo, editEntry, onSaved
|
||||
const [saving, setSaving] = useState(false);
|
||||
const [error, setError] = useState('');
|
||||
const [success, setSuccess] = useState(false);
|
||||
const [wetterHinweis, setWetterHinweis] = useState('');
|
||||
|
||||
const editEntryRef = useRef(editEntry);
|
||||
editEntryRef.current = editEntry;
|
||||
const formRef = useRef<HTMLFormElement>(null);
|
||||
const prevArtRef = useRef<ArtFuehrung | null>(null);
|
||||
const prevEndeRef = useRef<string | null>(null);
|
||||
|
||||
function focusNext(current: HTMLElement) {
|
||||
if (!formRef.current) return;
|
||||
@@ -87,6 +89,45 @@ export default function LogbuchForm({ kuppel, currentUserBeo, editEntry, onSaved
|
||||
.catch(() => {});
|
||||
}, []);
|
||||
|
||||
// Ändert der Benutzer Datum oder Endzeit, wird das Wetter zu diesem Zeitpunkt
|
||||
// nachgeladen. Der erste Lauf wird übersprungen: beim Anlegen liefert bereits der
|
||||
// Effekt oben den aktuellen Wert, beim Bearbeiten stehen die gespeicherten Werte drin.
|
||||
useEffect(() => {
|
||||
if (prevEndeRef.current === null) {
|
||||
prevEndeRef.current = ende;
|
||||
return;
|
||||
}
|
||||
if (prevEndeRef.current === ende) return;
|
||||
prevEndeRef.current = ende;
|
||||
|
||||
if (!/^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}$/.test(ende)) return;
|
||||
|
||||
let verworfen = false;
|
||||
fetch(`/api/wetter?zeit=${encodeURIComponent(ende)}`)
|
||||
.then(async (r) => {
|
||||
if (r.status === 404) throw new Error('keine');
|
||||
if (!r.ok) throw new Error('fehler');
|
||||
return r.json() as Promise<Wetter>;
|
||||
})
|
||||
.then((w) => {
|
||||
if (verworfen) return;
|
||||
setWetter({ temp: w.temp, feuchte: Math.round(w.feuchte), druck: Math.round(w.druck) });
|
||||
setTempRaw(String(w.temp));
|
||||
setWetterHinweis('');
|
||||
})
|
||||
.catch((e: Error) => {
|
||||
// Bestehende Werte stehen lassen — ein leeres Formular wäre schlechter als alte Zahlen.
|
||||
if (!verworfen) {
|
||||
setWetterHinweis(
|
||||
e.message === 'keine'
|
||||
? 'Keine Wetterdaten zu diesem Zeitpunkt — Werte bitte selbst eintragen.'
|
||||
: 'Wetterdaten konnten nicht geladen werden.'
|
||||
);
|
||||
}
|
||||
});
|
||||
return () => { verworfen = true; };
|
||||
}, [ende]);
|
||||
|
||||
useEffect(() => {
|
||||
if (editEntry) {
|
||||
setArtFuehrung(editEntry.ArtFuehrung);
|
||||
@@ -419,6 +460,9 @@ export default function LogbuchForm({ kuppel, currentUserBeo, editEntry, onSaved
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
{wetterHinweis && (
|
||||
<div className="mt-1 text-xs text-amber-700">{wetterHinweis}</div>
|
||||
)}
|
||||
</div>
|
||||
|
||||
{error && (
|
||||
|
||||
Reference in New Issue
Block a user