Une seule entrée d'ajout : « Ajouter un ouvrage »

Le geste réel est « j'ai un truc avec un code-barres », pas « je vais cataloguer un
livre » : obliger à savoir d'avance ce qu'on tient était un détour, d'autant que le
décodage distingue déjà un 978/979 d'un 977. Le même écran est atteint depuis le
catalogue et depuis les revues.

⚠️ Le MODÈLE ne bouge pas : une revue reste une Revue, jamais un Livre. Fondre les deux
tables aurait obligé à répéter « et qui n'est pas une revue » à chaque lecture du
catalogue, des compteurs, des doublons, des séries et des bibliographies.

- /ajout (alias /ajout/isbn) : « Ajouter un ouvrage », deux saisies manuelles distinctes
  puisque, sans code à lire, il faut bien trancher soi-même.
- Nouvelle page /revues/ajout : titre, ISSN et éditeur, puis la fiche de la revue. Elle
  remplace le champ posé au milieu de la liste des revues.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
mathieu
2026-08-20 21:13:01 +02:00
co-authored by Claude Opus 5
parent bd4fea2638
commit 0c4babd7b9
4 changed files with 152 additions and 60 deletions
+22 -53
View File
@@ -12,26 +12,6 @@
douze fiches. Les revues ne sont pas au catalogue : ce ne sont pas des livres.
</p>
@if (_erreur is not null)
{
<p class="message-erreur" role="alert">@_erreur</p>
}
<div class="barre-recherche">
<input class="champ-saisie" type="text" placeholder="Nom d'une revue…"
@bind="_nouvelle" @bind:event="oninput" @onkeydown="SurTouche"
aria-label="Nom de la nouvelle revue" autocomplete="off" />
</div>
<div class="actions-formulaire">
<button type="button" class="bouton bouton-principal"
disabled="@(_enCours || !Reseau.EnLigne || string.IsNullOrWhiteSpace(_nouvelle))"
title="@MotifBlocage"
@onclick="CreerAsync">
Ajouter la revue
</button>
</div>
@if (_revues is null)
{
<p class="message-discret" role="status">Chargement…</p>
@@ -39,8 +19,9 @@
else if (_revues.Count == 0)
{
<p class="message-discret">
Aucune revue. Scannez le code-barres d'un magazine, ou saisissez son nom ci-dessus :
le code d'une revue commence par 977 et porte un ISSN, pas un ISBN.
Aucune revue. Scannez le code-barres d'un magazine depuis « Ajouter un ouvrage » :
le code d'une revue commence par 977 et porte un ISSN, pas un ISBN. Sans code à lire,
<a href="revues/ajout">saisissez-la à la main</a>.
</p>
}
else
@@ -80,13 +61,27 @@ else
</ul>
}
@*
⚠️ Le champ « nom d'une nouvelle revue » a quitté cet écran : l'ajout passe par la MÊME
entrée que celle du catalogue, « Ajouter un ouvrage », qui scanne et reconnaît seule un
code 977. Deux points de départ selon ce qu'on croit tenir obligeaient à trancher avant
de regarder le code-barres.
*@
<nav class="actions-flottantes">
@if (Reseau.EnLigne)
{
<a class="bouton bouton-principal" href="ajout">Ajouter un ouvrage</a>
<a class="bouton bouton-discret" href="revues/ajout">Saisir une revue</a>
}
else
{
<button type="button" class="bouton bouton-principal" disabled
title="@EtatReseau.MotifHorsLigne">Ajouter un ouvrage</button>
}
</nav>
@code {
private IReadOnlyList<RevueDto>? _revues;
private string _nouvelle = string.Empty;
private bool _enCours;
private string? _erreur;
private string? MotifBlocage => Reseau.EnLigne ? null : EtatReseau.MotifHorsLigne;
private static string Quand(NumeroRevueDto numero) =>
numero.DateParution is { } date ? $"({date.ToLocalTime():MM/yyyy})" : string.Empty;
@@ -105,30 +100,4 @@ else
private async Task ChargerAsync() => _revues = await Api.ListerRevuesAsync();
private async Task SurTouche(KeyboardEventArgs e)
{
if (e.Key == "Enter" && !string.IsNullOrWhiteSpace(_nouvelle) && Reseau.EnLigne)
{
await CreerAsync();
}
}
private async Task CreerAsync()
{
_enCours = true;
_erreur = null;
var resultat = await Api.CreerRevueAsync(new EnregistrementRevue { Titre = _nouvelle });
_enCours = false;
if (!resultat.EstOk)
{
_erreur = resultat.Erreur;
return;
}
_nouvelle = string.Empty;
await ChargerAsync();
}
}