Fichiers joints aux specs et raffinages (interface) #6

Merged
Gilles merged 1 commit from feature/attachments into main 2026-10-25 09:19:00 +00:00
Owner

Closes #5 — interface de thierryade/backend#9.

À merger avant le backend : le job e2e du backend (sur master) teste l'interface à partir de la dernière SPA publiée par ce dépôt. Merger ce dépôt seul ne déploie rien : la SPA n'arrive en prod qu'avec la prochaine image backend, donc il faut merger thierryade/backend#9 juste après.

Contenu

  • AttachmentList.vue, intégré dans SpecDetailPanel : section « Fichiers joints » de la version courante, et sous chaque raffinage.
    • Badge de statut calculé par le backend : hérité / remplacé / nouveau / supprimé (barré), « renommé de … ».
    • « aussi en v1, v2 » (exists_in_versions) et « Utilisé dans… » (specs et raffinages qui utilisent le fichier).
    • Téléchargement via l'API (droits vérifiés côté serveur).
  • Envoi avec détection de doublon : SHA-256 calculé dans le navigateur (Web Crypto) → si le fichier existe déjà dans le projet, proposition « Réutiliser » (aucun renvoi du fichier) ; si le nom est déjà joint, proposition « Remplacer ». Les 409 du serveur aboutissent aux mêmes propositions. Sans Web Crypto (contexte non sécurisé), le serveur déduplique quand même.
  • Actions sur une ligne (brouillon + droit d'écriture uniquement) : Remplacer, Supprimer, Restaurer un fichier supprimé.
  • apiFetch ne force plus Content-Type: application/json sur un corps FormData.
  • Mocks MSW avec le même calcul de statut que le backend.

Tests

8 nouveaux tests (AttachmentList.spec.ts) : supprimé puis restauré, envoi, réutilisation d'un doublon, remplacement par nom, remplacer/supprimer depuis une ligne, usages, lecture seule, héritage après « Nouvelle version » dans la fiche. 52 tests au total, vue-tsc et build OK.

🤖 Generated with Claude Code

https://claude.ai/code/session_014BSmBtGWeFBD9z4mYm9SjA

Closes #5 — interface de thierryade/backend#9. **À merger avant le backend** : le job e2e du backend (sur `master`) teste l'interface à partir de la dernière SPA publiée par ce dépôt. Merger ce dépôt seul ne déploie rien : la SPA n'arrive en prod qu'avec la prochaine image backend, donc il faut merger thierryade/backend#9 juste après. ## Contenu - **`AttachmentList.vue`**, intégré dans `SpecDetailPanel` : section « Fichiers joints » de la version courante, et sous chaque raffinage. - Badge de statut calculé par le backend : hérité / remplacé / nouveau / supprimé (barré), « renommé de … ». - « aussi en v1, v2 » (`exists_in_versions`) et « Utilisé dans… » (specs et raffinages qui utilisent le fichier). - Téléchargement via l'API (droits vérifiés côté serveur). - **Envoi avec détection de doublon** : SHA-256 calculé dans le navigateur (Web Crypto) → si le fichier existe déjà dans le projet, proposition « Réutiliser » (aucun renvoi du fichier) ; si le nom est déjà joint, proposition « Remplacer ». Les `409` du serveur aboutissent aux mêmes propositions. Sans Web Crypto (contexte non sécurisé), le serveur déduplique quand même. - **Actions sur une ligne** (brouillon + droit d'écriture uniquement) : Remplacer, Supprimer, Restaurer un fichier supprimé. - `apiFetch` ne force plus `Content-Type: application/json` sur un corps `FormData`. - Mocks MSW avec le même calcul de statut que le backend. ## Tests 8 nouveaux tests (`AttachmentList.spec.ts`) : supprimé puis restauré, envoi, réutilisation d'un doublon, remplacement par nom, remplacer/supprimer depuis une ligne, usages, lecture seule, héritage après « Nouvelle version » dans la fiche. 52 tests au total, `vue-tsc` et `build` OK. 🤖 Generated with [Claude Code](https://claude.com/claude-code) https://claude.ai/code/session_014BSmBtGWeFBD9z4mYm9SjA
Add attachments to the spec detail (spec versions and refinements)
All checks were successful
ci / unit (pull_request) Successful in 55s
ci / publish (pull_request) Has been skipped
bf0a63de77
- AttachmentList: files of a spec version or a refinement, with the
  status computed server-side against the previous version (inherited,
  replaced, new, deleted, renamed), "aussi en vN" and "Utilisé dans…".
- Upload with duplicate detection: SHA-256 computed in the browser,
  existing project file -> offer to reuse it; name already attached ->
  offer to replace. Row actions: replace, delete, restore a deleted one.
- Read-only on a validated version or without write access.
- apiFetch keeps the multipart Content-Type for FormData bodies.
- MSW handlers/fixtures mirroring the backend's status computation.

Closes #5

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014BSmBtGWeFBD9z4mYm9SjA
Author
Owner
<!-- argus-link-bot:thierryade/frontend --> 📊 [Rapports Argus pour cette PR](https://reports.stationmyr.net/thierryade/frontend/pr/6)
Gilles merged commit 3ad9b41828 into main 2026-10-25 09:19:00 +00:00
Gilles deleted branch feature/attachments 2026-10-25 09:19:00 +00:00
Sign in to join this conversation.
No description provided.