Recueille les retours d'usage du 2026-08-21, et ce qu'ils supposent
Dix demandes remontées en usage, rangées en lots Q à Y dans IDEES.md.
Rien n'est acté : le fichier garde la matière brute et ce que la
relecture du code a déjà établi.
Trois demandes changent de nature une fois le code relu : éditer une
envie suppose un PUT /api/souhaits/{id} qui n'existe pas, souhaiter une
revue ou un numéro n'a aucun modèle, et la version à afficher dans une
page « À propos » ne vit nulle part dans le binaire. À l'inverse,
modifier un numéro de revue ne demande qu'un écran, l'API sachant déjà
le faire depuis le lot O.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
@@ -461,3 +461,205 @@ Deux points à trancher avant de coder :
|
|||||||
- **Où se fait le geste ?** Depuis l'envie (« Ranger dans une série », avec choix de la série et
|
- **Où se fait le geste ?** Depuis l'envie (« Ranger dans une série », avec choix de la série et
|
||||||
de la position), ou depuis la série (« Ajouter un tome depuis mes envies »). Le second a un
|
de la position), ou depuis la série (« Ajouter un tome depuis mes envies »). Le second a un
|
||||||
mérite : c'est là qu'on voit l'ordre de lecture, donc où l'on sait quelle position donner.
|
mérite : c'est là qu'on voit l'ordre de lecture, donc où l'on sait quelle position donner.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
# Retours d'usage du 2026-08-21 (7ᵉ série)
|
||||||
|
|
||||||
|
Dix demandes remontées en usage. **Rien n'est acté** : ce qui suit est la matière brute, classée
|
||||||
|
en lots, avec ce que la relecture du code a déjà établi. Deux items portent sur le même sujet
|
||||||
|
(la flèche de retour) et sont réunis dans le lot S.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Lot Q — L'ordre des champs du formulaire d'ajout
|
||||||
|
|
||||||
|
Demande : dans « Ajouter un ouvrage », placer le **type de document juste après le titre**, puis
|
||||||
|
les **thèmes**, puis les **auteurs**, puis — **si c'est une BD** — les rôles, le reste ensuite.
|
||||||
|
|
||||||
|
Ce n'est pas un caprice de mise en page : l'ordre actuel fait descendre jusqu'en bas pour dire
|
||||||
|
« c'est une BD », alors que **cette réponse commande la suite de la saisie** — les rôles n'ont
|
||||||
|
de sens que là. Le formulaire suivrait enfin l'ordre dans lequel on regarde un livre qu'on tient
|
||||||
|
en main.
|
||||||
|
|
||||||
|
⚠️ **La règle des rôles reste celle actée** (`CLAUDE.md`, « Rôles des auteurs ») : ils
|
||||||
|
n'apparaissent **qu'à partir de deux auteurs**. Le déclencheur deviendrait donc « BD **et** au
|
||||||
|
moins deux auteurs » — à trancher : afficher les rôles sur une BD signée d'une seule personne
|
||||||
|
serait un revirement, pas un détail de rendu.
|
||||||
|
|
||||||
|
⚠️ Ne pas en profiter pour présélectionner « Bande dessinée » ou « Roman » : le défaut est
|
||||||
|
`NonPrecise`, et il ne prétend rien (décision actée). Remonter le champ le rend visible, ce qui
|
||||||
|
est exactement le but ; le préremplir écrirait quelque chose de faux.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Lot R — Le menu ne doit pas fuir au défilement
|
||||||
|
|
||||||
|
Deux comportements demandés, un par famille d'appareil :
|
||||||
|
|
||||||
|
| Appareil | Aujourd'hui | Demandé |
|
||||||
|
|---|---|---|
|
||||||
|
| PC (≥ 40 rem) | rangée sous le bandeau, elle **défile avec la page** | rester **collée en haut** au défilement |
|
||||||
|
| Téléphone (< 40 rem) | se déploie sous le bandeau, poussant le contenu | **plein écran**, pour choisir d'un coup d'œil |
|
||||||
|
|
||||||
|
Le plein écran sur téléphone est ce qui justifie le lot : le menu déployé partage l'écran avec la
|
||||||
|
liste qu'on quittait, et l'on choisit sa destination au milieu d'autre chose.
|
||||||
|
|
||||||
|
⚠️ **Le point de rupture de 40 rem est écrit à DEUX endroits** — `wwwroot/css/app.css` (le menu
|
||||||
|
passe en rangée) et `MainLayout.razor.css` (la bascule se masque). Les deux doivent rester
|
||||||
|
identiques : c'est déjà noté dans `CLAUDE.md`, et un lot qui touche au menu est précisément
|
||||||
|
l'occasion de les faire diverger.
|
||||||
|
|
||||||
|
⚠️ **Et surtout** : les règles des liens du menu vivent en feuille **globale**, jamais en feuille
|
||||||
|
scopée — l'attribut de portée de Blazor n'atteint pas ce que rend un `NavLink`. Toute règle
|
||||||
|
ajoutée ici doit suivre le même chemin, sous peine d'être morte-née (défaut déjà rencontré, voir
|
||||||
|
`CLAUDE.md`).
|
||||||
|
|
||||||
|
Le menu **se referme déjà sur `LocationChanged`** : le plein écran hérite de ce comportement,
|
||||||
|
mais il faudra aussi une fermeture explicite (croix, Échap, clic hors du menu) — un calque plein
|
||||||
|
écran sans porte de sortie est un piège.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Lot S — La flèche de retour
|
||||||
|
|
||||||
|
Deux items remontés ensemble, qui ne demandent pas la même chose.
|
||||||
|
|
||||||
|
- **S1. Elle ne doit pas faire sortir de l'application.** ⚠️ **C'est censé être déjà tenu** :
|
||||||
|
`js/navigation.js` teste `history.length` et retombe sur le catalogue quand la pile n'a qu'un
|
||||||
|
cran (voir `CLAUDE.md`, lot H). Que le défaut soit encore constaté veut dire l'une de deux
|
||||||
|
choses, et il faut trancher **avant** de coder : soit l'appareil tourne encore une version
|
||||||
|
antérieure (le cas du cache dépareillé, déjà rencontré), soit `history.length` ne dit pas ce
|
||||||
|
qu'on croit dans une PWA `standalone` — il compte l'historique de la session, y compris ce qui
|
||||||
|
précède l'application. **À mesurer sur l'appareil**, pas à déduire.
|
||||||
|
|
||||||
|
- **S2. Le retour devrait ramener sur « le menu précédent ».** ⚠️ Cela **renverse** une décision
|
||||||
|
actée : « le retour passe par l'historique du navigateur, jamais par une destination calculée »,
|
||||||
|
au motif qu'un même écran s'atteint par plusieurs chemins (une fiche livre s'ouvre depuis le
|
||||||
|
catalogue, une bibliographie, une série ou une recherche). Le motif reste vrai — mais
|
||||||
|
l'historique remonte aussi les **allers-retours** (filtre, ordre, édition), et l'on peut cliquer
|
||||||
|
cinq fois sans quitter le même écran.
|
||||||
|
|
||||||
|
Piste à instruire : un retour **hiérarchique** (`/livres/{id}/edition` → `/livres/{id}` →
|
||||||
|
écran d'origine), c'est-à-dire une remontée d'un cran de route plutôt qu'une destination fixe.
|
||||||
|
Reste à décider ce que fait la racine d'une branche atteinte de biais. Ne pas coder avant d'avoir
|
||||||
|
écrit les cas : c'est une décision de navigation, pas un correctif.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Lot T — La fiche d'une série : les actions à droite du titre
|
||||||
|
|
||||||
|
Demande : sur `/series/{id}`, grouper **« Modifier »** et **« Changer l'ordre »** tout à droite,
|
||||||
|
sur la ligne du titre et du compteur « x sur n tomes ».
|
||||||
|
|
||||||
|
C'est la disposition déjà retenue ailleurs (lot H : la bibliographie a ses actions groupées à
|
||||||
|
droite, la liste des auteurs ses trois colonnes dont une seule élastique). Rien de neuf sur le
|
||||||
|
fond : les deux routes existent (`/series/{id}/edition`, `/series/{id}/ordre`), c'est leur
|
||||||
|
**place** qui change.
|
||||||
|
|
||||||
|
⚠️ Garder la règle actée : « Changer l'ordre » n'apparaît qu'à partir de **deux** tomes ou deux
|
||||||
|
sous-séries. Un bouton toujours présent mais inerte serait un recul.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Lot U — Le nombre de pages sur la fiche d'un livre
|
||||||
|
|
||||||
|
Nouvelle colonne sur `Livre`, donc **migration**. Deux points à trancher avant de coder :
|
||||||
|
|
||||||
|
- **Nullable, obligatoirement.** Aucun livre déjà catalogué n'a cette information, et `0` page se
|
||||||
|
lirait comme une donnée, pas comme une absence. Même famille de piège que le `TypeDocument`
|
||||||
|
dont le défaut ne prétend rien, et que le `GetValueOrDefault` qui rendait `0` au lieu de `null`.
|
||||||
|
- **Prérempli depuis la BnF ?** Le Dublin Core expose `dc:format`, qui porte des mentions du genre
|
||||||
|
« 1 vol. (349 p.) ». ⚠️ **Non vérifié**, et le projet n'en lit rien aujourd'hui : aucun service
|
||||||
|
ne parse ce champ. À mesurer sur un échantillon avant de promettre quoi que ce soit — et de
|
||||||
|
toute façon la saisie manuelle reste la voie sûre, comme pour les thèmes.
|
||||||
|
|
||||||
|
Question ouverte : le nombre de pages a-t-il un sens pour un **ebook** ? Il varie avec la police.
|
||||||
|
S'il est saisi, il l'est comme une indication, pas comme une propriété du fichier.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Lot V — Dans la liste des revues, toute la ligne s'ouvre
|
||||||
|
|
||||||
|
Aujourd'hui seul le **titre** est cliquable. C'est le motif inverse de ce que le projet tient
|
||||||
|
ailleurs : sur une carte du catalogue, c'est la carte entière qui mène à la fiche.
|
||||||
|
|
||||||
|
⚠️ Le seul vrai risque est d'avaler des actions : si la ligne porte un jour un bouton (retirer,
|
||||||
|
ajouter un numéro), il faudra que son clic **n'atteigne pas** la ligne. À traiter en même temps
|
||||||
|
que le lot W, qui ajoute précisément des boutons sur ces écrans.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Lot W — La fiche d'une revue : mêmes actions à droite, et l'édition d'un numéro
|
||||||
|
|
||||||
|
Symétrique du lot T, en trois demandes :
|
||||||
|
|
||||||
|
1. **« Ajouter un numéro » et « Modifier la revue » groupés à droite** du titre.
|
||||||
|
2. **Modifier un numéro déjà possédé.** ⚠️ L'API sait déjà le faire : `PUT
|
||||||
|
/api/revues/numeros/{id}` existe depuis le lot O — sans quoi couverture, une et note
|
||||||
|
n'auraient existé qu'à la création. Il manque **l'écran**, pas le point d'entrée.
|
||||||
|
3. **Retirer un numéro.** `DELETE /api/revues/numeros/{id}` existe aussi.
|
||||||
|
|
||||||
|
Reste à décider **où** : la demande dit « si modification de la revue », donc dans l'écran
|
||||||
|
d'édition. À peser contre la règle du lot B (« consulter d'abord, modifier ensuite ») : éditer un
|
||||||
|
numéro depuis la consultation de la revue serait un geste courant — c'est déjà l'exception
|
||||||
|
accordée au statut de lecture et au prêt. Ne pas trancher au clavier : c'est une question d'usage.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Lot X — Éditer une envie, et savoir ce qu'on peut souhaiter
|
||||||
|
|
||||||
|
Demande : dans `/souhaits`, un bouton **« Éditer »** au-dessus de « Retirer », pour corriger le
|
||||||
|
livre souhaité.
|
||||||
|
|
||||||
|
⚠️ **Le point d'entrée n'existe pas.** Vérifié : `SouhaitsEndpoints` expose `POST`, `PUT
|
||||||
|
/ordre` et `DELETE /{id}` — **aucun `PUT /{id}`**. Ce lot est donc une vraie fonctionnalité,
|
||||||
|
pas un bouton à poser.
|
||||||
|
|
||||||
|
Trois contraintes que l'API devra tenir, toutes déjà écrites dans `CLAUDE.md` :
|
||||||
|
|
||||||
|
- **la liste d'envies est personnelle** : éditer l'envie d'un autre répond **404**, jamais 403 ;
|
||||||
|
- **`TitreNormalise` (clé d'œuvre) et `AuteurNormalise` se recalculent** à l'écriture, sinon le
|
||||||
|
rapprochement « déjà au catalogue » se fait sur l'ancienne forme ;
|
||||||
|
- **l'unicité `(Utilisateur, TitreNormalise, AuteurNormalise)`** peut être violée par une
|
||||||
|
édition, contrairement à un simple renommage : renommer une envie en une autre qu'on a déjà
|
||||||
|
doit répondre proprement, pas planter sur une contrainte.
|
||||||
|
|
||||||
|
**Second volet de la demande, à instruire** : peut-on souhaiter **une revue, un numéro de revue,
|
||||||
|
une BD** ? Réponses, telles que le modèle les donne aujourd'hui :
|
||||||
|
|
||||||
|
| Souhait | Possible ? | Pourquoi |
|
||||||
|
|---|---|---|
|
||||||
|
| Une **BD** | **oui**, sans rien changer | une envie n'a ni format ni type ; c'est un titre et un auteur |
|
||||||
|
| Une **revue** ou un **numéro** | **non** | `LivreSouhaite` n'a aucun lien vers `Revue` ni `NumeroRevue`, et l'unicité porte sur (titre, auteur) — un numéro n'a pas d'auteur |
|
||||||
|
|
||||||
|
⚠️ Rien n'**interdit** d'y taper « Médor n° 43 » comme titre libre : ça marcherait, et ne serait
|
||||||
|
rapproché de rien. À trancher : est-ce suffisant (une envie est une note qu'on emporte en
|
||||||
|
librairie), ou faut-il une notion d'envie de périodique ? Le premier a le mérite de ne rien
|
||||||
|
casser ; le second rouvre la question d'une table de plus.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Lot Y — Une page « À propos »
|
||||||
|
|
||||||
|
Contenu demandé : **manuel** (à venir), **e-mail** `mailto:info@limonier.be`, **site**
|
||||||
|
`www.limonier.be` dans une autre fenêtre, **version publiée**, et la **licence du dépôt**.
|
||||||
|
|
||||||
|
Deux points sont plus qu'un remplissage de page :
|
||||||
|
|
||||||
|
- ⚠️ **L'application ne connaît pas sa version.** Vérifié : la version vit dans le
|
||||||
|
`manifest.toml` du dépôt `mabibli_ynh` et dans les tags git — **rien n'est injecté dans le
|
||||||
|
binaire**. Afficher une version demande que `build/publier-release.sh` la pose dans l'assembly
|
||||||
|
(`InformationalVersion`), puis que l'API la rende. Sans cela, la page afficherait un numéro
|
||||||
|
faux ou figé, ce qui est **pire que pas de version du tout** — c'est exactement la valeur qu'on
|
||||||
|
lira pour diagnostiquer un appareil dépareillé.
|
||||||
|
- **La licence est l'AGPL v3** (fichier `LICENSE`). ⚠️ L'AGPL demande que les utilisateurs d'un
|
||||||
|
service en réseau puissent obtenir la **source** : un lien vers le dépôt à côté de la mention
|
||||||
|
n'est pas un ornement, c'est ce que la licence attend.
|
||||||
|
|
||||||
|
⚠️ Un lien externe en `target="_blank"` porte `rel="noopener"`. Et il ne doit **pas** être un
|
||||||
|
`<a>` inerte hors-ligne : c'est la même famille que les liens d'export, qui basculent en boutons
|
||||||
|
désactivés faute de pouvoir aboutir.
|
||||||
|
|
||||||
|
Où la ranger : une septième destination dans le menu déséquilibrerait une navigation qu'on vient
|
||||||
|
justement de reprendre (lot R). À peser — pied de page, ou entrée à part visuellement.
|
||||||
|
|||||||
Reference in New Issue
Block a user