Commit Graph
181 Commits
Author SHA1 Message Date
IliesAllali 4e900f1c30 Merge pull request #74 from IliesAllali/import-fiable
Import GEDCOM : encodage, vraies dates, toutes les notes
2026-10-16 22:14:06 +02:00
IliesAllaliandClaude Opus 5.5 dd738c483a Import GEDCOM : vraies dates, toutes les notes
Dates : « vers », « avant », « après », « entre … et … », dates juliennes,
calendrier républicain converti en grégorien, doubles années (1700/01).
« BET 1794 AND 1796 » ou « @#DFRENCH R@ 18 BRUM 8 » étaient perdues, « ABT
1900 » devient au moins 1900. La précision est déjà lue pour la suite.

Notes : notes partagées (« 1 NOTE @N1@ »), plusieurs notes, RTF nettoyé. Le
lecteur garde la valeur brute de chaque ligne : une note coupée en CONC se
recolle avec ses espaces (« pendant trente-cinq ans », plus « pendanttrente »).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-16 22:12:16 +02:00
IliesAllaliandClaude Opus 5.5 2d35bddf27 Import GEDCOM : le fichier est lu avec son vrai encodage
Le navigateur lisait tout en UTF-8. Les fichiers de Heredis PC (ANSI,
Windows-1252), des anciens logiciels (ANSEL) ou de Heredis Mac (MACINTOSH)
arrivaient avec des accents cassés (« é »). L'encodage est maintenant
détecté : marque d'octets, UTF-8 valide, puis la ligne « 1 CHAR », sinon
Windows-1252. Décodeur ANSEL inclus (diacritiques placés avant la lettre).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-16 22:08:10 +02:00
IliesAllali 7e7641dc19 Merge pull request #73 from IliesAllali/dependabot/npm_and_yarn/frontend/frontend-minor-patch-c705a229c1
Bump the frontend-minor-patch group across 1 directory with 6 updates
2026-10-16 20:38:08 +02:00
IliesAllali 6d78aa5d10 Merge pull request #72 from IliesAllali/dependabot/npm_and_yarn/backend/backend-minor-patch-e930112c77
Bump the backend-minor-patch group across 1 directory with 5 updates
2026-10-16 20:37:56 +02:00
IliesAllali 7488254cc9 Merge pull request #71 from IliesAllali/dependabot/npm_and_yarn/landing/landing-minor-patch-90bd4e03b8
Bump the landing-minor-patch group across 1 directory with 2 updates
2026-10-16 20:37:44 +02:00
IliesAllali 2db048aad6 Merge pull request #64 from IliesAllali/dependabot/github_actions/actions/upload-artifact-7.0.2
Bump actions/upload-artifact from 4.6.2 to 7.0.2
2026-10-16 20:36:18 +02:00
IliesAllali 69598ce116 Merge pull request #66 from IliesAllali/dependabot/github_actions/actions/setup-node-7.1.0
Bump actions/setup-node from 5.0.0 to 7.1.0
2026-10-16 20:34:09 +02:00
dependabot[bot] f36d59fcee Bump the frontend-minor-patch group across 1 directory with 6 updates
Bumps the frontend-minor-patch group with 6 updates in the /frontend directory:

| Package | From | To |
| --- | --- | --- |
| [@lucide/icons](https://github.com/lucide-icons/lucide/tree/HEAD/packages/lucide) | `1.52.0` | `1.56.0` |
| [lucide-react](https://github.com/lucide-icons/lucide/tree/HEAD/packages/lucide-react) | `1.52.0` | `1.56.0` |
| [posthog-js](https://github.com/PostHog/posthog-js) | `1.438.0` | `1.438.9` |
| [postcss](https://github.com/postcss/postcss) | `8.5.29` | `8.5.30` |
| [vite](https://github.com/vitejs/vite/tree/HEAD/packages/vite) | `8.3.3` | `8.3.4` |
| [vitest](https://github.com/vitest-dev/vitest/tree/HEAD/packages/vitest) | `5.0.3` | `5.0.4` |



Updates `@lucide/icons` from 1.52.0 to 1.56.0
- [Release notes](https://github.com/lucide-icons/lucide/releases)
- [Commits](https://github.com/lucide-icons/lucide/commits/1.56.0/packages/lucide)

Updates `lucide-react` from 1.52.0 to 1.56.0
- [Release notes](https://github.com/lucide-icons/lucide/releases)
- [Commits](https://github.com/lucide-icons/lucide/commits/1.56.0/packages/lucide-react)

Updates `posthog-js` from 1.438.0 to 1.438.9
- [Release notes](https://github.com/PostHog/posthog-js/releases)
- [Changelog](https://github.com/PostHog/posthog-js/blob/main/CHANGELOG.md)
- [Commits](https://github.com/PostHog/posthog-js/compare/posthog-js@1.438.0...posthog-js@1.438.9)

Updates `postcss` from 8.5.29 to 8.5.30
- [Release notes](https://github.com/postcss/postcss/releases)
- [Changelog](https://github.com/postcss/postcss/blob/main/CHANGELOG.md)
- [Commits](https://github.com/postcss/postcss/compare/8.5.29...8.5.30)

Updates `vite` from 8.3.3 to 8.3.4
- [Release notes](https://github.com/vitejs/vite/releases)
- [Changelog](https://github.com/vitejs/vite/blob/main/packages/vite/CHANGELOG.md)
- [Commits](https://github.com/vitejs/vite/commits/v8.3.4/packages/vite)

Updates `vitest` from 5.0.3 to 5.0.4
- [Release notes](https://github.com/vitest-dev/vitest/releases)
- [Changelog](https://github.com/vitest-dev/vitest/blob/main/docs/releases.md)
- [Commits](https://github.com/vitest-dev/vitest/commits/v5.0.4/packages/vitest)

---
updated-dependencies:
- dependency-name: "@lucide/icons"
  dependency-version: 1.56.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: frontend-minor-patch
- dependency-name: lucide-react
  dependency-version: 1.56.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: frontend-minor-patch
- dependency-name: posthog-js
  dependency-version: 1.438.9
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: frontend-minor-patch
- dependency-name: postcss
  dependency-version: 8.5.30
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: frontend-minor-patch
- dependency-name: vite
  dependency-version: 8.3.4
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: frontend-minor-patch
- dependency-name: vitest
  dependency-version: 5.0.4
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: frontend-minor-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-10-16 18:32:55 +00:00
dependabot[bot] bd8ba8ffaa Bump the backend-minor-patch group across 1 directory with 5 updates
Bumps the backend-minor-patch group with 5 updates in the /backend directory:

| Package | From | To |
| --- | --- | --- |
| [dotenv](https://github.com/motdotla/dotenv) | `18.0.6` | `18.0.7` |
| [fastify](https://github.com/fastify/fastify) | `5.12.5` | `5.12.7` |
| [zod](https://github.com/colinhacks/zod) | `4.6.5` | `4.6.7` |
| [@types/node](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node) | `24.19.1` | `24.19.2` |
| [vitest](https://github.com/vitest-dev/vitest/tree/HEAD/packages/vitest) | `5.0.3` | `5.0.4` |



Updates `dotenv` from 18.0.6 to 18.0.7
- [Changelog](https://github.com/motdotla/dotenv/blob/master/CHANGELOG.md)
- [Commits](https://github.com/motdotla/dotenv/compare/v18.0.6...v18.0.7)

Updates `fastify` from 5.12.5 to 5.12.7
- [Release notes](https://github.com/fastify/fastify/releases)
- [Commits](https://github.com/fastify/fastify/compare/v5.12.5...v5.12.7)

Updates `zod` from 4.6.5 to 4.6.7
- [Release notes](https://github.com/colinhacks/zod/releases)
- [Commits](https://github.com/colinhacks/zod/compare/v4.6.5...v4.6.7)

Updates `@types/node` from 24.19.1 to 24.19.2
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/node)

Updates `vitest` from 5.0.3 to 5.0.4
- [Release notes](https://github.com/vitest-dev/vitest/releases)
- [Changelog](https://github.com/vitest-dev/vitest/blob/main/docs/releases.md)
- [Commits](https://github.com/vitest-dev/vitest/commits/v5.0.4/packages/vitest)

---
updated-dependencies:
- dependency-name: dotenv
  dependency-version: 18.0.7
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: backend-minor-patch
- dependency-name: fastify
  dependency-version: 5.12.7
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: backend-minor-patch
- dependency-name: zod
  dependency-version: 4.6.7
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: backend-minor-patch
- dependency-name: "@types/node"
  dependency-version: 24.19.2
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: backend-minor-patch
- dependency-name: vitest
  dependency-version: 5.0.4
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: backend-minor-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-10-16 18:32:50 +00:00
dependabot[bot] 265ae1d9f3 Bump the landing-minor-patch group across 1 directory with 2 updates
Bumps the landing-minor-patch group with 2 updates in the /landing directory: [posthog-js](https://github.com/PostHog/posthog-js) and [postcss](https://github.com/postcss/postcss).


Updates `posthog-js` from 1.438.0 to 1.438.9
- [Release notes](https://github.com/PostHog/posthog-js/releases)
- [Changelog](https://github.com/PostHog/posthog-js/blob/main/CHANGELOG.md)
- [Commits](https://github.com/PostHog/posthog-js/compare/posthog-js@1.438.0...posthog-js@1.438.9)

Updates `postcss` from 8.5.29 to 8.5.30
- [Release notes](https://github.com/postcss/postcss/releases)
- [Changelog](https://github.com/postcss/postcss/blob/main/CHANGELOG.md)
- [Commits](https://github.com/postcss/postcss/compare/8.5.29...8.5.30)

---
updated-dependencies:
- dependency-name: posthog-js
  dependency-version: 1.438.9
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: landing-minor-patch
- dependency-name: postcss
  dependency-version: 8.5.30
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: landing-minor-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-10-16 18:32:24 +00:00
dependabot[bot] 6a366416ef Bump actions/upload-artifact from 4.6.2 to 7.0.2
Bumps [actions/upload-artifact](https://github.com/actions/upload-artifact) from 4.6.2 to 7.0.2.
- [Release notes](https://github.com/actions/upload-artifact/releases)
- [Commits](https://github.com/actions/upload-artifact/compare/ea165f8d65b6e75b540449e92b4886f43607fa02...cf430e030ddbb5b0abf93d22962f4752f3646cd9)

---
updated-dependencies:
- dependency-name: actions/upload-artifact
  dependency-version: 7.0.2
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-10-16 18:31:54 +00:00
dependabot[bot] 62727658dc Bump actions/setup-node from 5.0.0 to 7.1.0
Bumps [actions/setup-node](https://github.com/actions/setup-node) from 5.0.0 to 7.1.0.
- [Release notes](https://github.com/actions/setup-node/releases)
- [Commits](https://github.com/actions/setup-node/compare/a0853c24544627f65ddf259abe73b1d18a591444...949feb2413d6458794dcd2491c4babbbce0c15c1)

---
updated-dependencies:
- dependency-name: actions/setup-node
  dependency-version: 7.1.0
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-10-16 18:31:51 +00:00
IliesAllali 1c065a8db4 Merge pull request #70 from IliesAllali/lieux-affichage
Fiche : lieu lisible pour les arbres déjà importés
2026-10-16 20:31:45 +02:00
IliesAllaliandClaude Opus 5.5 63d997b8cf Fiche : lieu lisible à l'affichage pour les arbres déjà importés
Les arbres importés de Heredis avant le nettoyage à l'import gardent des
lieux bruts (« Ville,code INSEE,département,… »). La fiche les affiche avec
la même règle qu'à l'import, sans toucher à la valeur enregistrée ni au
champ d'édition.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-16 20:29:58 +02:00
IliesAllali 5454549ab0 Merge pull request #69 from IliesAllali/gedcom-lieux
Import GEDCOM : lieu lisible, sans colonnes vides ni codes
2026-10-16 20:22:04 +02:00
IliesAllaliandClaude Opus 5.5 bca0543803 Import GEDCOM : lieu lisible, sans colonnes vides ni codes
Heredis remplit toutes les colonnes de son format de lieu, même vides, avec
le code INSEE (« La Roche-sur-Yon,85191,Vendée,Pays de la Loire,France, »).
Le lieu de naissance importé garde les noms seulement, séparés par « , »,
sans case vide, code INSEE ou postal, ni répétition. Un lieu déjà propre
ne change pas.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-16 20:20:17 +02:00
IliesAllali 0e96ffc020 Merge pull request #68 from IliesAllali/gedcom-souvenirs
Import GEDCOM : les fichiers cités deviennent des souvenirs (#59)
2026-10-16 20:13:39 +02:00
IliesAllaliandClaude Opus 5.5 2fccf287b3 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>
2026-10-16 20:06:03 +02:00
IliesAllaliandClaude Opus 5.5 3097768af5 Premières photos : les autres fichiers cités deviennent des souvenirs
À l'étape du dossier de photos, les fichiers cités par le logiciel en plus
des portraits (actes, registres, photos de famille) sont retrouvés dans le
même dossier et ajoutés aux souvenirs de chaque personne, avec le titre et
la source venus du GEDCOM. Un seul bouton « Tout ajouter » ; les fichiers
restants sont gardés pour rouvrir l'étape depuis les paramètres. Pour #59.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-16 20:00:40 +02:00
IliesAllaliandClaude Opus 5.5 897ada2665 Import GEDCOM : tous les fichiers cités deviennent des souvenirs
En plus du portrait, l'import renvoie mediaRefs : les fichiers cités pour
chaque personne créée, où qu'ils soient accrochés (sous la personne, un
événement, une source citée, la fiche de la source, ou la famille pour les
actes de mariage), avec leur titre et leur source. Comme Gramps : adresses
web écartées, un fichier cité deux fois gardé une fois. Particularités
gérées : titre dans la note (Heredis, RTF compris), _PHOTO pour le portrait
(Family Tree Maker), chemins file:// (GEDCOM 7). Pour #59.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-16 19:55:56 +02:00
IliesAllali c556e84610 Merge pull request #60 from py5932/py5932-drag-and-drop
Permettre le réagencement des personnes dans l’arbre
2026-10-16 19:31:32 +02:00
IliesAllali 12ccb520f5 Merge remote-tracking branch 'origin/main' into pr60-fix
# Conflicts:
#	frontend/src/components/PersonCard.jsx
#	frontend/src/i18n/en/fiche.js
2026-10-16 19:27:11 +02:00
IliesAllali 768fdf1b0b Merge pull request #58 from coutadeurf/feat/immich-face-integration-clean
Integrates Immich face recognition with Parenthèse to associate Immich people with family-tree members and synchronize their portraits.
2026-10-16 19:24:51 +02:00
IliesAllaliandClaude Opus 5.5 e3bfe9c2a6 Fiche : place dans la fratrie compacte, sur la ligne de « Édition »
‹ 2/4 › à côté de la pastille Édition au lieu d'une ligne à part ; la
place complète reste annoncée aux lecteurs d'écran.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-16 19:13:10 +02:00
e327cc223d Arbre : réordonner une fratrie au glisser ou aux flèches de la fiche
En mode édition, un administrateur glisse une personne à l'horizontale
parmi ses frères et soeurs pour changer leur ordre. Pour chaque place visée,
le vrai placement est recalculé : la personne soulevée suit le pointeur,
les autres branches glissent vers leur place avec un ressort, et rien ne
saute au lâcher. Appui long au doigt, Échap ou un deuxième doigt pour
annuler, mouvement réduit respecté. La fiche propose aussi deux flèches
(Déplacer à gauche, Déplacer à droite) avec la même animation. L'ordre est
appliqué tout de suite puis enregistré ; en cas d'échec l'arbre revient
en arrière et un message le dit.

Idée de départ : PR #60 de py5932 (glisser-déposer des personnes).

Co-Authored-By: py5932 <py.dequidt@gmail.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-16 19:08:15 +02:00
IliesAllaliandClaude Opus 5.5 8556d32bce API : l'ordre d'une fratrie s'applique aux deux liens de l'union
L'arbre ne montre qu'un lien par enfant et par union ; le lien vers l'autre
parent de la même union reçoit le même ordre, pour que les deux restent
d'accord.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-16 19:08:05 +02:00
IliesAllaliandClaude Opus 5.5 5f968a9f22 Placement : la fratrie suit l'ordre choisi (displayOrder)
Le placement par blocs rangeait les enfants dans l'ordre des identifiants,
displayOrder n'avait donc aucun effet. Les enfants d'une union sont
maintenant triés sur displayOrder, avec un tri stable : un arbre jamais
réordonné garde exactement son placement. Dans l'arbre de démo, Sophie
(ordre 1) repasse devant Thomas (ordre 2).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-16 18:55:01 +02:00
IliesAllaliandClaude Opus 5.5 588ac0c4e9 API : un nouvel enfant se place après ses frères et soeurs
Sans ordre fourni, un lien parent-enfant créé (route, contribution, import
GEDCOM) prend l'ordre suivant celui de la fratrie, pour qu'un enfant ajouté
après un réordonnancement ne passe pas devant les autres.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-16 18:53:23 +02:00
IliesAllaliandClaude Opus 5.5 1caa090efd API : réordonner une fratrie en une transaction
PUT /trees/:id/links/order réécrit le displayOrder des liens parent-enfant
d'une fratrie, dans l'ordre reçu. Administrateurs seulement ; chaque lien
doit appartenir à l'arbre et à son enfant, et les enfants partager au moins
un parent. Journalisé (children_reordered).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-16 18:51:37 +02:00
IliesAllaliandClaude Opus 5.5 8574dfed9e Retour au placement automatique : abandon du placement libre
Le mainteneur préfère un réordonnancement des frères et soeurs au placement
libre (coordonnées enregistrées). Ce commit annule le glisser libre, ses
corrections, la migration des coordonnées et le bouton de remise à zéro ;
le réordonnancement arrive dans les commits suivants.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-16 18:46:28 +02:00
IliesAllaliandClaude Opus 5.5 c819027f9b Immich : connexion déplacée dans l'onglet Avancé, affichée seulement si une instance est autorisée
L'onglet Immich des paramètres de l'arbre est supprimé. Sa section passe dans
l'onglet Avancé, au-dessus de la zone de suppression, et n'apparaît que si le
serveur déclare au moins une instance. La config Immich n'est lue que pour les
administrateurs, et le panneau attend cette réponse avant de s'afficher pour
que la zone de suppression ne bouge pas.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-16 18:44:45 +02:00
IliesAllaliandClaude Opus 5.5 d93710a00d Tests Immich : la suppression d'une personne efface aussi son lien Immich
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-16 18:16:16 +02:00
IliesAllaliandClaude Opus 5.5 6b1f4c067e Immich : vraies miniatures dans le sélecteur, aperçu seulement après un choix
- Les visages affichent leur miniature ronde au lieu de l'icône. Chargées
  quand elles entrent dans la liste (IntersectionObserver), trois requêtes
  au plus en parallèle, une requête par visage, cache le temps du panneau.
  Les URL blob sont révoquées au démontage. En attente ou sans vignette : un
  rond neutre.
- La personne déjà associée à la fiche est marquée « Associée » (lecture
  réservée aux administrateurs, via la nouvelle route de lien).
- Le cadre pointillé vide disparaît : l'aperçu n'apparaît qu'une fois un
  visage choisi, avec la photo carrée arrondie des fiches. Le bouton principal
  reste désactivé tant que rien n'est choisi.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-16 18:16:16 +02:00
IliesAllaliandClaude Opus 5.5 8fa2808b5d fix(galaxy): un deuxième doigt annule le glisser d'une personne
Au passage à deux doigts (ou en cas d'interruption tactile), le glisser en
cours est annulé et la personne revient à sa place : plus d'enregistrement
pendant un pincement. Un doigt qui reste après un pincement ne saisit plus
de personne, il ne fait que déplacer l'arbre.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-16 18:13:52 +02:00
IliesAllaliandClaude Opus 5.5 b27b5e9737 feat(arbre): rétablir la disposition automatique depuis les paramètres
Onglet Avancé des paramètres de l'arbre (admin) : une action « Rétablir la
disposition automatique », visible seulement s'il existe des positions
manuelles, avec confirmation. Elle appelle la route admin
/trees/:id/layout/reset puis recharge le graphe.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-16 18:13:52 +02:00
IliesAllaliandClaude Opus 5.5 6ff99337d2 fix(arbre): place envoyée visible jusqu'à la relecture, erreurs d'enregistrement affichées
- Contributeur : après l'envoi, la place proposée reste à l'écran comme un
  nom modifié, au lieu de revenir à l'ancienne place jusqu'à l'approbation.
- Admin : un échec d'enregistrement d'une personne est signalé par un toast
  d'erreur, et le brouillon est conservé au lieu d'être vidé.
- Gestionnaire handleResetTreeLayout (le bouton arrive dans le commit suivant).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-16 18:13:46 +02:00
IliesAllaliandClaude Opus 5.5 7f159d5111 Immich : route admin pour lire le lien d'une fiche
Le sélecteur doit marquer la personne Immich déjà associée. L'identifiant ne
figure pas dans le graphe public : GET /trees/:id/immich/links/:personId le
renvoie aux seuls administrateurs de l'arbre.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-16 18:13:26 +02:00
IliesAllaliandClaude Opus 5.5 697c0e3897 feat(arbre): « Position dans l'arbre » en relecture des contributions
Une contribution qui déplace une personne affiche désormais la ligne
« Position dans l'arbre » (Déplacée, Replacée automatiquement), sans
coordonnées brutes.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-16 18:13:23 +02:00
IliesAllaliandClaude Opus 5.5 de897070db fix(arbre): les positions du brouillon restent toutes à l'écran
La liste des positions manuelles était mise en cache sur un hasDraft et
une fonction qui ne changent plus après le premier glisser : une seule
personne (la première) restait placée. Le brouillon expose maintenant un
draftRevision incrémenté à chaque écriture, et le calcul des positions
passe par buildManualPositionOverrides (testé).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-16 18:13:18 +02:00
IliesAllaliandClaude Opus 5.5 ca23dfa318 Immich : la pastille d'état garde la largeur de son texte
Dans la grille de la ligne, la pastille « Configurée » s'étirait sur toute la
largeur. Elle s'aligne désormais au début, comme les autres pastilles.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-16 18:12:55 +02:00
IliesAllaliandClaude Opus 5.5 f2ca980950 Immich : le choix « Depuis Immich » n'est proposé qu'aux administrateurs de l'arbre
Un contributeur qui modifiait une fiche avec un portrait venu d'Immich voyait
le menu de source, alors que l'association et le retrait sont réservés aux
administrateurs côté serveur. La connexion Immich n'est aussi interrogée que
pour un administrateur.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-16 18:12:49 +02:00
IliesAllaliandClaude Opus 5.5 f37fc329ba Immich : lectures bornées, erreurs de corps en 503, lien retiré avec le portrait
- Vignette lue en flux : au-delà de 5 Mo (ou sans taille annoncée), la lecture
  s'arrête sans charger le reste.
- Vignette servie seulement si les octets sont une image, avec
  X-Content-Type-Options: nosniff (plus de repli sur image/jpeg).
- Liste des personnes : délai global de 30 s sur toutes les pages.
- Corps JSON illisible ou flux interrompu : 503 immich_unreachable, au lieu
  d'une erreur serveur.
- Retirer le portrait à la main (DELETE avatar) ou supprimer une personne
  efface aussi son identifiant Immich, sinon l'association reste invisible.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-16 18:12:21 +02:00
IliesAllaliandClaude Opus 5.5 c8df8df937 Immich : une clé illisible n'est plus signalée comme configurée
Le résumé ne lisait que l'adresse : après un changement de JWT_SECRET, l'onglet
affichait « Configurée » alors que chaque appel échouait. Le résumé déchiffre
désormais la clé (configured: false, keyNeedsReentry: true, instance gardée pour
préremplir le menu). L'onglet Immich affiche « Clé à ressaisir », garde le
bouton de suppression, et un PUT sans clé est refusé tant que la clé en place
ne se lit pas. Tests : résumé avec clé illisible, refus de conserver la clé.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-16 18:11:17 +02:00
IliesAllaliandClaude Opus 5.5 d17cee20df feat(arbre): rétablir la disposition automatique
Route admin POST /trees/:id/layout/reset : remet layoutX/layoutY à null
pour toutes les personnes de l'arbre, dans une transaction, avec une
entrée de journal (tree_layout_reset). Documentée dans l'OpenAPI.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-16 18:09:11 +02:00
IliesAllaliandClaude Opus 5.5 265b3b30a0 Immich : les instances se choisissent par leur nom, jamais par leur adresse
L'API ne renvoie plus les adresses brutes d'Immich à un administrateur
d'arbre : la liste IMMICH_ALLOWED_API_URLS devient des instances nommées
(« Libellé=https://adresse », libellé facultatif, nom d'hôte par défaut).
Chaque instance a un identifiant opaque dérivé de son adresse, donc stable
même si l'opérateur réordonne la liste. Le PUT accepte cet identifiant et
stocke l'adresse canonique de la liste. Deux instances au même nom d'hôte
sans libellé sont refusées au démarrage avec un avertissement.

Les variables d'exemple documentent le format, la liste reste compatible
avec les adresses seules.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-16 18:08:54 +02:00
IliesAllaliandClaude Opus 5.5 420bda5e38 fix(arbre): bornes des positions et conflit de relecture
- Les coordonnées de disposition sont bornées à ±1 000 000 (PATCH personne,
  modification en session de contribution, OpenAPI).
- Un déplacement par le propriétaire ne met plus en conflit les
  contributions en attente sur la même personne : layoutX/layoutY sont
  exclus de la comparaison de conflit.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-16 18:08:50 +02:00
IliesAllaliandClaude Opus 5.5 fbcac3afd4 Tests Immich : liste d'instances vide explicite, indépendante du .env local
Le test « aucune instance autorisée » héritait de IMMICH_ALLOWED_API_URLS du
backend/.env de développement et échouait sur une machine qui le renseigne.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-16 18:05:51 +02:00
IliesAllaliandClaude Opus 5.5 63b9761ec4 Immich : garder le chemin de l'instance, comparer origine et chemin
new URL(chemin, base) effaçait le sous-chemin d'une instance derrière un
proxy (https://hote/immich devenait https://hote/api/...). L'adresse se
concatène désormais. Une adresse avec identifiants, requête ou fragment est
refusée, et le client reçoit l'adresse autorisée normalisée, jamais la
valeur brute de la base. Tests : sous-chemin, domaine préfixe, userinfo.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-16 18:05:50 +02:00
IliesAllaliandClaude Opus 5.5 44dd203069 Immich : ne jamais suivre une redirection avec la clé d'API
fetch suivait les redirections par défaut : une instance autorisée qui
répond 3xx pouvait recevoir x-api-key sur une autre adresse. Les appels
passent en redirect: 'error' (remontée en immich_unreachable), avec un test
qui le prouve.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-16 18:04:50 +02:00