diff --git a/IDEES.md b/IDEES.md index e60d3fc..3193966 100644 --- a/IDEES.md +++ b/IDEES.md @@ -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 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. + +--- + +# 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 +`` 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.