Premières photos : compter chaque souvenir par son chemin d'origine

Les correspondances gardent le chemin cité par le logiciel (sourcePath) :
plusieurs fichiers d'une même personne ne se confondent plus, le décompte
des fichiers ajoutés et restants est juste, et le pied du panneau parle de
fichiers quand des documents ont été ajoutés.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
IliesAllaliandClaude Opus 5.5 committed 2026-10-16 20:06:03 +02:00
1 parent 3097768af5
commit 2fccf287b3
4 files changed
+20 -4

No files matched your search

+9 -3
View File
@@ -33,7 +33,8 @@ function folderOf(filePath) {
// Après un import GEDCOM (ou depuis les paramètres) : retrouver les photos que le logiciel connaissait,
// et demander les premiers visages un par un.
const refKey = (ref) => `${ref.personId}|${ref.file}`
// Une référence et sa correspondance retrouvée partagent le chemin cité par le logiciel
const refKey = (ref) => `${ref.personId}|${ref.sourcePath ?? ref.file}`
export default function PhotoStartPanel({
visible,
@@ -58,6 +59,7 @@ export default function PhotoStartPanel({
const [faceState, setFaceState] = useState({})
const [shownFaces, setShownFaces] = useState(faces)
const [placedTotal, setPlacedTotal] = useState(0)
const [memoriesTotal, setMemoriesTotal] = useState(0)
// La liste des visages et les chemins sont figés à l'ouverture : une ligne ne disparaît pas sous le doigt
useEffect(() => {
@@ -69,6 +71,7 @@ export default function PhotoStartPanel({
setFaceState({})
setShownFaces(faces)
setPlacedTotal(0)
setMemoriesTotal(0)
}, [visible]) // eslint-disable-line react-hooks/exhaustive-deps
useEffect(() => {
@@ -132,7 +135,8 @@ export default function PhotoStartPanel({
setRemaining(nextRemaining)
onRefsChange?.(nextRemaining)
setFound(null)
setPlacedTotal((n) => n + placedIds.size + addedKeys.size)
setPlacedTotal((n) => n + placedIds.size)
setMemoriesTotal((n) => n + addedKeys.size)
setBulk({ running: false, done: total, total, placed: placedIds.size, added: addedKeys.size, failed: total - placedIds.size - addedKeys.size })
}
@@ -318,7 +322,9 @@ export default function PhotoStartPanel({
<div className="pz-modal-actions pz-modal-actions--split">
<p className="pz-small">
{addedCount > 0 ? plural(addedCount, '1 photo ajoutée.', '{n} photos ajoutées.') : t('Vous pourrez en ajouter plus tard depuis chaque fiche.')}
{memoriesTotal > 0
? plural(addedCount + memoriesTotal, '1 fichier ajouté.', '{n} fichiers ajoutés.')
: addedCount > 0 ? plural(addedCount, '1 photo ajoutée.', '{n} photos ajoutées.') : t('Vous pourrez en ajouter plus tard depuis chaque fiche.')}
</p>
<button type="button" className="pz-btn pz-btn--primary" onClick={onClose} disabled={bulk.running}>
{t("Voir l'arbre")}
+2
View File
@@ -37,6 +37,8 @@ export default {
"1 autre fichier": "1 other file",
"{n} autres fichiers": "{n} other files",
"Ajouter ce fichier": "Add this file",
"1 fichier ajouté.": "1 file added.",
"{n} fichiers ajoutés.": "{n} files added.",
"Tout ajouter ({n})": "Add everything ({n})",
"1 fichier ajouté aux souvenirs.": "1 file added to the memories.",
"{n} fichiers ajoutés aux souvenirs.": "{n} files added to the memories.",
+1 -1
View File
@@ -57,7 +57,7 @@ export function matchPhotoFiles(photoRefs, files) {
}
}
// Les autres champs de la référence (légende, source d'un souvenir) suivent le fichier retrouvé
matches.push({ ...ref, file: best })
matches.push({ ...ref, file: best, sourcePath: ref.file })
}
return { matches, missing }
}
+8
View File
@@ -85,3 +85,11 @@ describe('souvenirs cités par le logiciel', () => {
expect(matches[0].file.name).toBe('Naissance Ragot.jpg')
})
})
describe('chemin d’origine', () => {
it('chaque correspondance garde le chemin cité, même pour trois fichiers de la même personne', () => {
const refs = ['a.jpg', 'b.pdf', 'c.jpg'].map((name) => ({ personId: 'p', file: `Medias/${name}` }))
const { matches } = matchPhotoFiles(refs, ['a.jpg', 'b.pdf', 'c.jpg'].map((name) => file(name, `Medias/${name}`)))
expect(matches.map((m) => m.sourcePath)).toEqual(['Medias/a.jpg', 'Medias/b.pdf', 'Medias/c.jpg'])
})
})