diff --git a/MaBibli.Client/Pages/AjoutIsbn.razor b/MaBibli.Client/Pages/AjoutIsbn.razor index 3903da2..9fab010 100644 --- a/MaBibli.Client/Pages/AjoutIsbn.razor +++ b/MaBibli.Client/Pages/AjoutIsbn.razor @@ -1,18 +1,28 @@ +@page "/ajout" @page "/ajout/isbn" @inject ServiceLivresApi Api @inject NavigationManager Navigation @inject EtatReseau Reseau @implements IDisposable -MaBibli — ajouter par ISBN +MaBibli — ajouter un ouvrage -

Ajouter par ISBN

+@* + Entrée UNIQUE d'ajout, atteinte depuis le catalogue comme depuis les revues. + + 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 sait + déjà distinguer un 978/979 (livre) d'un 977 (publication en série). Le modèle, lui, ne + bouge pas : une revue reste une Revue, jamais un Livre — voir CLAUDE.md. +*@ +

Ajouter un ouvrage

@if (_etape == Etape.Saisie) {

- Scannez le code-barres, ou saisissez l'ISBN imprimé sur le livre. - Une douchette USB fonctionne telle quelle : le champ est déjà actif. + Scannez le code-barres, ou saisissez le code imprimé sur l'ouvrage — livre ou + magazine, l'application reconnaît lequel. Une douchette USB fonctionne telle quelle : + le champ est déjà actif.

@* @@ -57,7 +67,11 @@ @onclick="OuvrirScanner"> Scanner - Saisir à la main + @* Deux saisies manuelles, parce qu'il faut bien trancher soi-même quand aucun code + n'est là pour le faire : c'est le seul endroit où l'entrée unique doit poser la + question. *@ + Saisir un livre + Saisir une revue } diff --git a/MaBibli.Client/Pages/AjoutRevue.razor b/MaBibli.Client/Pages/AjoutRevue.razor new file mode 100644 index 0000000..f1b9599 --- /dev/null +++ b/MaBibli.Client/Pages/AjoutRevue.razor @@ -0,0 +1,109 @@ +@page "/revues/ajout" +@inject ServiceLivresApi Api +@inject NavigationManager Navigation +@inject EtatReseau Reseau + +MaBibli — saisir une revue + +

Saisir une revue

+ +@* + Le pendant de « Saisir un livre à la main » : ce qu'on fait quand le code-barres est absent, + abîmé, ou que la BnF ne connaît pas le titre. L'entrée normale reste « Ajouter un ouvrage », + qui scanne et reconnaît un code 977 tout seul. +*@ +

+ L'entrée habituelle est Ajouter un ouvrage : le code-barres d'un + magazine commence par 977 et l'application le reconnaît + seule. Ce formulaire sert quand il n'y a pas de code à lire. +

+ +@if (!Reseau.EnLigne) +{ +

+ Hors ligne : l'enregistrement passe par le serveur. Il redeviendra possible au retour + du réseau. +

+} + +@if (_erreur is not null) +{ + +} + + + + + + + +

+ Les numéros s'ajoutent ensuite sur la fiche de la revue : une fiche par revue, les numéros + à l'intérieur. +

+ + + +@code { + private string _titre = string.Empty; + private string _issn = string.Empty; + private string _editeur = string.Empty; + private bool _enCours; + private string? _erreur; + + /// + /// Crée la revue — ou retrouve celle qui existe déjà — puis ouvre sa fiche. + /// + /// + /// Le serveur fait « créer ou retrouver » sur l'ISSN ou le titre : saisir deux fois + /// la même revue mène à la même fiche au lieu d'un refus. C'est aussi ce qui permet à une + /// revue saisie ici d'apprendre son ISSN au premier scan. + /// + /// On enchaîne sur la fiche plutôt que de revenir à la liste : le geste n'est jamais + /// « créer une revue », c'est toujours « ranger un numéro ». + /// + /// + private async Task EnregistrerAsync() + { + _enCours = true; + _erreur = null; + + var resultat = await Api.CreerRevueAsync(new EnregistrementRevue + { + Titre = _titre, + Issn = string.IsNullOrWhiteSpace(_issn) ? null : _issn, + Editeur = string.IsNullOrWhiteSpace(_editeur) ? null : _editeur, + }); + + _enCours = false; + + if (!resultat.EstOk || resultat.Valeur is not { } revue) + { + _erreur = resultat.Erreur ?? "La revue n'a pas pu être créée."; + return; + } + + Navigation.NavigateTo($"revues/{revue.Id}"); + } +} diff --git a/MaBibli.Client/Pages/Catalogue.razor b/MaBibli.Client/Pages/Catalogue.razor index 77a70e2..a0157d2 100644 --- a/MaBibli.Client/Pages/Catalogue.razor +++ b/MaBibli.Client/Pages/Catalogue.razor @@ -160,12 +160,12 @@ else if (_livres is not null) diff --git a/MaBibli.Client/Pages/Revues.razor b/MaBibli.Client/Pages/Revues.razor index 80a73b7..f26068d 100644 --- a/MaBibli.Client/Pages/Revues.razor +++ b/MaBibli.Client/Pages/Revues.razor @@ -12,26 +12,6 @@ douze fiches. Les revues ne sont pas au catalogue : ce ne sont pas des livres.

-@if (_erreur is not null) -{ - -} - -
- -
- -
- -
- @if (_revues is null) {

Chargement…

@@ -39,8 +19,9 @@ else if (_revues.Count == 0) {

- 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, + saisissez-la à la main.

} else @@ -80,13 +61,27 @@ else } +@* + ⚠️ 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. +*@ + + @code { private IReadOnlyList? _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(); - } }