fix(fiche): une date en cours de saisie ne passe plus sur la personne suivante

En changeant de fiche sans enregistrer, le premier rendu de la nouvelle fiche voyait encore les
modifications de l'ancienne. DateField initialise son texte à ce moment-là et le gardait : la date
tapée pour une personne s'affichait sur l'autre, et partait avec elle si on enregistrait.
Les modifications en cours sont maintenant rattachées à la personne qu'elles concernent.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
IliesAllaliandClaude Opus 5.5 committed 2026-10-18 21:26:48 +02:00
1 parent f0196eec54
commit c2ad11df2e
1 file changed
+20 -9
+20 -9
View File
@@ -16,6 +16,9 @@ import { firstNameLabel, fullNameLabel, isFirstNameUnknown } from '../utils/pers
import { isYearOnly } from '../utils/dateInput.js'
import DateField from './DateField.jsx'
// Aucune modification en cours (référence stable)
const NO_EDITS = Object.freeze({})
const TYPE_LABELS = {
photo: t('Photo'),
video: t('Vidéo'),
@@ -93,12 +96,16 @@ const PersonCard = ({
}
}, [tab, person.id, treeId, immichToken, lifeRevision])
// État local pour les modifications en mode édition
const [edits, setEdits] = useState({})
// Modifications en cours, rattachées à la personne qu'elles concernent. Au changement de fiche,
// le premier rendu ne doit pas voir celles de la personne d'avant : un champ qui s'initialise à
// ce moment-là (DateField) les garderait, et la date d'une personne passait sur une autre.
const [editState, setEditState] = useState(() => ({ personId: person.id, values: {}, changed: false }))
const ownEdits = editState.personId === person.id
const edits = ownEdits ? editState.values : NO_EDITS
const hasChanges = ownEdits && editState.changed
// Prénom inconnu (case cochée) et saisie de prénom vide sans case : le prénom est demandé avant l'enregistrement
const [unknownFirstName, setUnknownFirstName] = useState(() => isFirstNameUnknown(person))
const [firstNameMissing, setFirstNameMissing] = useState(false)
const [hasChanges, setHasChanges] = useState(false)
const [saving, setSaving] = useState(false)
const [saveSuccess, setSaveSuccess] = useState(false)
const [showDeleteConfirm, setShowDeleteConfirm] = useState(false)
@@ -119,10 +126,9 @@ const PersonCard = ({
// Reset edits quand la personne change
useEffect(() => {
setEdits({})
setEditState({ personId: person.id, values: {}, changed: false })
setUnknownFirstName(isFirstNameUnknown(person))
setFirstNameMissing(false)
setHasChanges(false)
setShowDeleteConfirm(false)
setActiveRelationSearch(null)
setRelationSearchQuery('')
@@ -199,8 +205,12 @@ const PersonCard = ({
}
const handleFieldChange = (field, value) => {
setEdits(prev => ({ ...prev, [field]: value }))
setHasChanges(true)
const personId = person.id
setEditState(prev => ({
personId,
values: { ...(prev.personId === personId ? prev.values : {}), [field]: value },
changed: true,
}))
}
const handleSave = async () => {
@@ -211,8 +221,9 @@ const PersonCard = ({
}
setSaving(true)
try {
await onSave(person.id, edits)
setHasChanges(false)
const savedFor = person.id
await onSave(savedFor, edits)
setEditState(prev => (prev.personId === savedFor ? { ...prev, changed: false } : prev))
setSaveSuccess(true)
setTimeout(() => setSaveSuccess(false), 2000)
} finally {