diff --git a/CHANGELOG.md b/CHANGELOG.md index b5c598c..e1089ed 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,11 @@ Notable changes to Parenthèse. Dates are in YYYY-MM-DD format. +## Unreleased + +- "Someone elsewhere": relatives can add a person found in public records too. It goes into their changes and the tree manager reviews it, like any other proposal. Places, the "needs checking" mark and the source link now travel with a proposed new person. +- The "needs checking" mark sits on the corner of the portrait, half outside, so it no longer covers the face. + ## 1.5.0 (2026-10-25) ### Several managers for one tree diff --git a/frontend/src/App.jsx b/frontend/src/App.jsx index 32f39b7..f51e9ff 100644 --- a/frontend/src/App.jsx +++ b/frontend/src/App.jsx @@ -254,6 +254,11 @@ function buildContributionChangesFromDraft(draft = {}) { birthDate: person.birthDate || null, deathDate: person.deathDate || null, isDeceased: !person.deathDate && Boolean(person.isDeceased), + // Personne venue d'une source publique (panneau « Chercher quelqu'un ») : lieux, « à vérifier » et source + ...(person.birthPlace ? { birthPlace: person.birthPlace } : {}), + ...(person.deathPlace ? { deathPlace: person.deathPlace } : {}), + ...(person.toVerify ? { toVerify: true } : {}), + ...(person.notes ? { notes: person.notes } : {}), }, }) @@ -1194,6 +1199,10 @@ function App() { birthDate: formData.birthDate || null, deathDate: formData.deathDate || null, isDeceased: Boolean(formData.isDeceased), + birthPlace: formData.birthPlace || null, + deathPlace: formData.deathPlace || null, + toVerify: Boolean(formData.toVerify), + notes: formData.notes || null, relations: (formData.relations || []).map((rel) => ({ type: rel.type, personId: rel.personId, adopted: Boolean(rel.adopted) })), siblingParentLinks, }, @@ -1206,7 +1215,7 @@ function App() { setContribSubmitError('') setContribChanges(buildContribChangesList(editMode.restoreDraft())) setShowContribModal(true) - return + return { proposed: true } } if (!auth.userAuth.token) return @@ -3376,8 +3385,16 @@ function App() { treeId={tree.treeContext.treeId} token={tree.treeContext.accessToken || auth.userAuth.token} persons={persons} - canApply={tree.canEditCurrentTree} - onApply={handlePersonSave} + // La famille ajoute aussi, en proposition que le propriétaire valide (même envoi qu'« Ajouter quelqu'un ») + canApply={tree.canEditCurrentTree || tree.canSubmitContribution} + proposes={!tree.canEditCurrentTree} + onApply={async (personId, changes) => { + await handlePersonSave(personId, changes) + if (tree.canEditCurrentTree) return + setContribSubmitError('') + setContribChanges(buildContribChangesList(editMode.restoreDraft())) + setShowContribModal(true) + }} onCreate={handleAddPersonSubmit} createError={addPersonError} onClose={() => setSearchPanelVisible(false)} diff --git a/frontend/src/components/SearchSourcesPanel.jsx b/frontend/src/components/SearchSourcesPanel.jsx index 2ace036..e26b84b 100644 --- a/frontend/src/components/SearchSourcesPanel.jsx +++ b/frontend/src/components/SearchSourcesPanel.jsx @@ -106,7 +106,8 @@ const RELATION_LABELS = { const plain = (value) => String(value || '').normalize('NFD').replace(/\p{Diacritic}/gu, '').toLowerCase().trim() -function SearchSourcesPanel({ visible, treeId, token, persons = [], canApply = false, onApply, onCreate, createError = '', onClose }) { +// proposes : la famille ajoute en proposition, le propriétaire de l'arbre valide ensuite +function SearchSourcesPanel({ visible, treeId, token, persons = [], canApply = false, proposes = false, onApply, onCreate, createError = '', onClose }) { const [lastName, setLastName] = useState('') const [firstName, setFirstName] = useState('') const [birthYear, setBirthYear] = useState('') @@ -353,7 +354,9 @@ function SearchSourcesPanel({ visible, treeId, token, persons = [], canApply = f {applied[key] && (

- {applied[key].created ? t("{name} est dans l'arbre, à vérifier", { name: applied[key].name }) : t('Ajouté à {name}, à vérifier', { name: applied[key].name })} + {proposes + ? t('Proposé, le propriétaire de l’arbre validera') + : applied[key].created ? t("{name} est dans l'arbre, à vérifier", { name: applied[key].name }) : t('Ajouté à {name}, à vérifier', { name: applied[key].name })}

)} {isPicking && ( diff --git a/frontend/src/components/galaxy/renderers.js b/frontend/src/components/galaxy/renderers.js index e9488b5..fbaa15f 100644 --- a/frontend/src/components/galaxy/renderers.js +++ b/frontend/src/components/galaxy/renderers.js @@ -941,7 +941,8 @@ export function drawPortrait(ctx, frameType, person, img, withMark) { function drawToVerifyMark(ctx) { const r = 9 - const x = PERSON_R * 0.74, y = -PERSON_R * 0.74 + // À cheval sur le coin, à moitié dehors : la marque ne cache plus le visage (Patch, 25/10) + const x = PERSON_R * 0.92, y = -PERSON_R * 0.92 ctx.shadowColor = 'transparent' ctx.fillStyle = '#FFFFFF' ctx.beginPath() diff --git a/frontend/src/i18n/en/recherche.js b/frontend/src/i18n/en/recherche.js index b8654ac..dc3f77f 100644 --- a/frontend/src/i18n/en/recherche.js +++ b/frontend/src/i18n/en/recherche.js @@ -44,6 +44,7 @@ export default { 'né(e) vers {year}': 'born around {year}', 'Modifier': 'Edit', 'Nouvelle personne': 'New person', + 'Proposé, le propriétaire de l’arbre validera': 'Proposed, the tree owner will review it', "Déjà dans l'arbre": 'Already in the tree', "{name} est dans l'arbre, à vérifier": '{name} is in the tree, needs checking', 'Créer {name}': 'Create {name}',