MaBibli 1.0.0
Gestion de bibliothèque personnelle auto-hébergée : catalogue, prêts, scan de code-barres, consultation hors-ligne. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,109 @@
|
||||
@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 ; le tiret est posé à l'enregistrement)</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}");
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user