fix: BEOs und Objekte bleiben beim Wechsel der Art erhalten — Version 1.16.1

Zwei getrennte Ursachen dafür, dass ausgefüllte Felder beim nachträglichen
Wählen der Art der Führung verschwanden:

- Objekte wurden bei jedem Wechsel der Art unbedingt geleert. Jetzt nur noch,
  wenn die Objektkategorie tatsächlich umschlägt (SonF ↔ Rest).
- currentUserBeo wurde in MainClient bei jedem Rendern neu erzeugt und steht in
  den Abhängigkeiten des Vorbelegungs-Effekts in LogbuchForm. Dadurch setzte
  jedes Neurendern der Elternkomponente das ganze Formular zurück — BEOs auf den
  eigenen Namen, dazu Objekte, Zeiten und Bemerkungen. Ein konkreter Auslöser
  ist die Backup-Schaltfläche auf demselben Bildschirm. Das Objekt ist jetzt
  useMemo-stabil.

Nebeneffekt: beim Bearbeiten lief das bisherige setObjekte([]) gegen das
asynchrone Nachladen der gespeicherten Objekte — dieser Wettlauf entfällt.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-08-09 10:38:46 +02:00
parent 74885a987a
commit 38e403bd39
4 changed files with 22 additions and 9 deletions
+13 -5
View File
@@ -175,6 +175,8 @@ export default function LogbuchForm({ kuppel, currentUserBeo, editEntry, onSaved
return () => { verworfen = true; };
}, [ende]);
// Vorbelegen beim Bearbeiten, sonst leeres Formular. currentUserBeo muss vom
// Aufrufer stabil gehalten werden, sonst setzt jedes Rendern die Eingaben zurück.
useEffect(() => {
if (editEntry) {
setArtFuehrung(editEntry.ArtFuehrung);
@@ -233,17 +235,23 @@ export default function LogbuchForm({ kuppel, currentUserBeo, editEntry, onSaved
}
}, [editEntry]);
// Objekte, Besucher und Spende zurücksetzen beim Wechsel der Art der Führung
// Beim Wechsel der Art der Führung nur das zurücksetzen, was zur neuen Art nicht
// mehr passt. Der erste Lauf bleibt außen vor: dort steht noch der Startwert 'RF',
// während die Vorbelegung aus editEntry gerade erst gesetzt wird.
useEffect(() => {
const vorherigeArt = prevArtRef.current;
prevArtRef.current = artFuehrung;
setObjekte([]);
if (vorherigeArt === null) return;
// Objekte nur leeren, wenn die Kategorie wechselt (Sonne ↔ Sterne) — sonst gingen
// bereits eingetragene Objekte verloren, wenn die Art erst danach gewählt wird.
if ((vorherigeArt === SONNE_ART) !== (artFuehrung === SONNE_ART)) {
setObjekte([]);
}
if (NO_OBJEKTE_ARTEN.includes(artFuehrung)) {
setBesucher('');
}
// Nicht beim ersten Lauf leeren — sonst überschreibt der Start-Wert 'RF'
// die aus editEntry vorbelegte Spende.
if (vorherigeArt !== null && artFuehrung !== 'SF') {
if (artFuehrung !== 'SF') {
setSpende('');
setSpendeBetragRaw('');
}