Files
mabibli/MaBibli.Client/Pages/AjoutRevue.razor
T
mathieuandClaude Opus 5 0c4babd7b9 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>
2026-08-20 21:13:01 +02:00

110 lines
3.7 KiB
Plaintext

@page "/revues/ajout"
@inject ServiceLivresApi Api
@inject NavigationManager Navigation
@inject EtatReseau Reseau
<PageTitle>MaBibli — saisir une revue</PageTitle>
<h1 class="titre-page">Saisir une revue</h1>
@*
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.
*@
<p class="message-discret">
L'entrée habituelle est <a href="ajout">Ajouter un ouvrage</a> : le code-barres d'un
magazine commence par <span class="code-isbn">977</span> et l'application le reconnaît
seule. Ce formulaire sert quand il n'y a pas de code à lire.
</p>
@if (!Reseau.EnLigne)
{
<p class="message-avertissement" role="status">
Hors ligne : l'enregistrement passe par le serveur. Il redeviendra possible au retour
du réseau.
</p>
}
@if (_erreur is not null)
{
<p class="message-erreur" role="alert">@_erreur</p>
}
<label class="champ">
<span class="champ-libelle">Titre<span class="obligatoire"> *</span></span>
<input class="champ-saisie" type="text" @bind="_titre" @bind:event="oninput"
placeholder="Médor" autocomplete="off" />
</label>
<label class="champ">
<span class="champ-libelle">
ISSN<span class="champ-aide"> (facultatif — huit chiffres, imprimé près du code-barres)</span>
</span>
<input class="champ-saisie" type="text" @bind="_issn" @bind:event="oninput"
placeholder="2466-6718" autocomplete="off" />
</label>
<label class="champ">
<span class="champ-libelle">Éditeur<span class="champ-aide"> (facultatif)</span></span>
<input class="champ-saisie" type="text" @bind="_editeur" @bind:event="oninput"
autocomplete="off" />
</label>
<p class="champ-aide">
Les numéros s'ajoutent ensuite sur la fiche de la revue : une fiche par revue, les numéros
à l'intérieur.
</p>
<nav class="actions-flottantes">
<button type="button" class="bouton bouton-principal"
disabled="@(_enCours || !Reseau.EnLigne || string.IsNullOrWhiteSpace(_titre))"
title="@(Reseau.EnLigne ? null : EtatReseau.MotifHorsLigne)"
@onclick="EnregistrerAsync">
@(_enCours ? "Enregistrement…" : "Créer la revue")
</button>
</nav>
@code {
private string _titre = string.Empty;
private string _issn = string.Empty;
private string _editeur = string.Empty;
private bool _enCours;
private string? _erreur;
/// <summary>
/// Crée la revue — ou retrouve celle qui existe déjà — puis ouvre sa fiche.
/// </summary>
/// <remarks>
/// Le serveur fait « créer ou retrouver » sur l'ISSN <b>ou</b> 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.
/// <para>
/// 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 ».
/// </para>
/// </remarks>
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}");
}
}