feat(pc-mirror) : l'explorateur devient une vue du front Svelte #13

Merged
hermes-fusion merged 4 commits from feat/explorateur-api-json into main 2026-10-17 16:00:02 +02:00
Collaborator

Ce que fait cette branche

L'explorateur du miroir passe au front Svelte. Le serveur ne compose plus de
page HTML pour un dossier : il en rend les données, et la mise en page
appartient au front.

Côté serveur

  • GET /api/fichiers?p=<chemin> : contenu d'un dossier en JSON (mêmes règles
    que la page écrite à la main — dossiers protégés de premier niveau jamais
    exclus, fichiers internes masqués à la racine). Une panne rend son code et un
    message, en JSON : un appel d'API ne doit pas recevoir du HTML.
  • Entree porte un champ excluable, calculé au listage : le front n'a pas à
    connaître la liste des dossiers protégés.
  • La page écrite à la main reste servie sur /files. Sa suppression emporte la
    référence de parité (12 sondes) et les bancs de page : ce sera un lot à part,
    annoncé comme tel.

Côté front

  • Nouvelle vue /fichiers : fil d'Ariane, navigation sans rechargement mais
    qui laisse de vraies adresses (un clic modifié ouvre toujours un onglet, le
    bouton « Précédent » fonctionne), téléchargement par /dl, exclusion
    confirmée par un dialogue Skeleton.
  • lib/explorateur.ts : lecture et validation de l'API, avec les pannes
    simulées en test (code d'erreur, corps illisible, forme inattendue, délai,
    serveur injoignable).
  • lib/theme.ts : le mode clair/sombre sort de App.svelte et devient partagé.

Correction au passage : le mode clair

Sur un élément animé (transition-colors), une paire « couleur +
dark:couleur » ne se rafraîchit pas quand data-mode change : les
boutons d'en-tête restaient figés sur les teintes sombres — texte gris sur
fond gris, illisible. Mesuré, puis corrigé par les jetons appariés de Skeleton
(bg-surface-100-900, text-surface-700-300), qui basculent correctement.
Cela répare aussi le tableau de bord déjà livré.

Vérifications

  • cargo test : 194 tests, 0 échec ; cargo clippy -D warnings propre.
  • Front : npm run check, npm run lint, npm run format propres ;
    106 tests (couverture 98,5 % des lignes, seuils à 80 %).
  • Bout en bout : 28 parcours sur bureau et téléphone, dont axe WCAG AA
    sans violation
    — les parcours de l'explorateur couvrent la navigation,
    l'adresse partagée, le dossier protégé, l'exclusion confirmée, le dossier
    absent et l'absence de débordement.
## Ce que fait cette branche L'explorateur du miroir passe au front Svelte. Le serveur ne compose plus de page HTML pour un dossier : il en rend les **données**, et la mise en page appartient au front. ### Côté serveur - `GET /api/fichiers?p=<chemin>` : contenu d'un dossier en JSON (mêmes règles que la page écrite à la main — dossiers protégés de premier niveau jamais exclus, fichiers internes masqués à la racine). Une panne rend son code et un message, **en JSON** : un appel d'API ne doit pas recevoir du HTML. - `Entree` porte un champ `excluable`, calculé au listage : le front n'a pas à connaître la liste des dossiers protégés. - La page écrite à la main reste servie sur `/files`. Sa suppression emporte la référence de parité (12 sondes) et les bancs de page : ce sera un lot à part, annoncé comme tel. ### Côté front - Nouvelle vue `/fichiers` : fil d'Ariane, navigation **sans rechargement** mais qui laisse de vraies adresses (un clic modifié ouvre toujours un onglet, le bouton « Précédent » fonctionne), téléchargement par `/dl`, exclusion confirmée par un dialogue Skeleton. - `lib/explorateur.ts` : lecture et validation de l'API, avec les pannes simulées en test (code d'erreur, corps illisible, forme inattendue, délai, serveur injoignable). - `lib/theme.ts` : le mode clair/sombre sort de `App.svelte` et devient partagé. ### Correction au passage : le mode clair Sur un élément animé (`transition-colors`), une paire « couleur + `dark:couleur` » **ne se rafraîchit pas** quand `data-mode` change : les boutons d'en-tête restaient figés sur les teintes sombres — texte gris sur fond gris, illisible. Mesuré, puis corrigé par les jetons appariés de Skeleton (`bg-surface-100-900`, `text-surface-700-300`), qui basculent correctement. Cela répare aussi le tableau de bord déjà livré. ## Vérifications - `cargo test` : **194 tests**, 0 échec ; `cargo clippy -D warnings` propre. - Front : `npm run check`, `npm run lint`, `npm run format` propres ; **106 tests** (couverture 98,5 % des lignes, seuils à 80 %). - Bout en bout : **28 parcours** sur bureau et téléphone, dont axe **WCAG AA sans violation** — les parcours de l'explorateur couvrent la navigation, l'adresse partagée, le dossier protégé, l'exclusion confirmée, le dossier absent et l'absence de débordement.
feat(pc-mirror) : l'explorateur devient une vue du front Svelte
Some checks failed
Contrôles des références / Références du comportement (pull_request) Successful in 3s
Contrôles des références / Crate pcmirror (formatage, Clippy, tests) (pull_request) Failing after 42s
Contrôles des références / Livraison (style des scripts, essai à blanc) (pull_request) Failing after 1s
Contrôles des références / Front d'état (types, lint, format, tests, build, bout en bout) (pull_request) Successful in 36s
7c97840cf8
Le serveur rend désormais les données d'un dossier sur `/api/fichiers`
(mêmes règles que la page écrite à la main : dossiers protégés de premier
niveau jamais exclus, fichiers internes masqués à la racine, erreurs en
JSON pour que l'appel d'API ne reçoive jamais du HTML). `Entree` porte un
champ `excluable`, calculé au listage : le front ne connaît pas la liste
des dossiers protégés.

Le front affiche ces données sous `/fichiers` : fil d'Ariane, navigation
sans rechargement qui laisse de vraies adresses (un clic modifié ouvre
toujours un onglet, le bouton « Précédent » fonctionne), téléchargement
par `/dl`, exclusion confirmée par un dialogue Skeleton.

Le mode clair est réparé au passage : sur un élément animé
(`transition-colors`), une paire « couleur + dark:couleur » ne se
rafraîchit pas quand `data-mode` change — les boutons d'en-tête
restaient figés sur les teintes sombres, texte invisible sur fond gris.
Les jetons appariés de Skeleton (`bg-surface-100-900`,
`text-surface-700-300`) basculent correctement, et le mode d'affichage
vit maintenant dans `lib/theme.ts`, partagé par les deux vues.

La page écrite à la main reste servie sur `/files` : sa suppression
emporte la référence de parité (12 sondes) et les bancs de page, ce sera
un lot à part.

Vérifié : 194 tests Rust, 106 tests front (couverture 98,5 % des lignes),
28 parcours de bout en bout (dont axe WCAG AA) sur bureau et téléphone.
Collaborator

fusion-auto : pas de fusion, la CI est rouge (Livraison, Crate pcmirror). Le chef de l'atelier renvoie la carte à l'agent ; l'étiquette tombera d'elle-même une fois corrigé.

`fusion-auto` : pas de fusion, la CI est rouge (Livraison, Crate pcmirror). Le chef de l'atelier renvoie la carte à l'agent ; l'étiquette tombera d'elle-même une fois corrigé.
fix(pc-mirror) : le banc des routes ne dépend plus de la page construite
Some checks failed
Contrôles des références / Références du comportement (pull_request) Successful in 3s
Contrôles des références / Crate pcmirror (formatage, Clippy, tests) (pull_request) Failing after 42s
Contrôles des références / Livraison (style des scripts, essai à blanc) (pull_request) Failing after 1s
Contrôles des références / Front d'état (types, lint, format, tests, build, bout en bout) (pull_request) Successful in 36s
1eeb4705c3
Le job « Crate pcmirror » de la CI échouait depuis que la page Svelte est la
page par défaut : il ne construit pas le front (`npm run build` vit dans le job
du front), donc le binaire ne porte pas la page embarquée et `/` rend 503 — quand
le banc attendait 200. En local il passait, `frontend/dist` étant là : le banc
mesurait la présence d'un dossier, pas le contrat du routeur.

Il juge maintenant les deux cas tels quels : la page quand le binaire la porte,
le 503 quand il ne la porte pas. La branche 503 se trouve ainsi couverte, et le
banc ne peut plus dépendre de ce que le poste a construit avant.

Vérifié : le banc passe avec et sans `frontend/dist` ; 194 tests verts, Clippy
muet, formatage propre.
fix(pc-mirror) : le banc de parité ne dépend plus de la page construite
Some checks failed
Contrôles des références / Références du comportement (pull_request) Successful in 3s
Contrôles des références / Crate pcmirror (formatage, Clippy, tests) (pull_request) Successful in 1m18s
Contrôles des références / Livraison (style des scripts, essai à blanc) (pull_request) Failing after 1s
Contrôles des références / Front d'état (types, lint, format, tests, build, bout en bout) (pull_request) Successful in 37s
81dce372cd
Même piège que dans le banc des routes, une assertion plus loin : les tests de
parité appelaient `GET /` et attendaient 200, alors que le job Rust de la CI ne
construit pas le front. Le service rend 503 dans ce cas — il dit qu'il n'a pas
de page au lieu d'en rendre une muette — et le banc jugeait un dossier, pas le
contrat.

Un `code_page()` dit ce qu'une page doit rendre selon que le binaire la porte ou
non, et le banc s'y réfère.

Vérifié : la suite entière tourne **sans** `frontend/dist` (194 tests, Clippy
muet, formatage propre, couverture 91,25 %) et **avec** (194 tests). C'est la
condition de la CI que je n'avais pas reproduite la première fois ; les deux
sont maintenant passées au crible.
Merge remote-tracking branch 'origin/main' into feat/explorateur-api-json
All checks were successful
Contrôles des références / Références du comportement (pull_request) Successful in 3s
Contrôles des références / Crate pcmirror (formatage, Clippy, tests) (pull_request) Successful in 1m17s
Contrôles des références / Livraison (style des scripts, essai à blanc) (pull_request) Successful in 1s
Contrôles des références / Front d'état (types, lint, format, tests, build, bout en bout) (pull_request) Successful in 36s
549a25f844
hermes-fusion deleted branch feat/explorateur-api-json 2026-10-17 16:00:03 +02:00
Collaborator

Fusionnée automatiquement par fusion-auto (forge) : CI verte, sans conflit.

Fusionnée automatiquement par `fusion-auto` (forge) : CI verte, sans conflit.
Sign in to join this conversation.
No reviewers
No milestone
No project
No assignees
2 participants
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
foXaCe/pc-mirror!13
No description provided.