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)
+{
+
@_erreur
+}
+
+
+
+
+
+
+
+
+ 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)
-{
-
@_erreur
-}
-
-
-
-
-
-
-
-
-
@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();
- }
}