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:
Mathieu Limonier
2026-08-22 22:36:16 +02:00
co-authored by Claude Opus 5
commit 6a6d745af4
207 changed files with 35543 additions and 0 deletions
+85
View File
@@ -0,0 +1,85 @@
@page "/ajout/manuel"
@inject ServiceLivresApi Api
@inject NavigationManager Navigation
@inject EtatReseau Reseau
@implements IDisposable
<PageTitle>MaBibli — saisie manuelle</PageTitle>
<h1 class="titre-page">Saisie manuelle</h1>
<p class="message-discret">
Pour les livres sans ISBN, ou dont aucune notice ne convient. L'ISBN reste facultatif.
</p>
@*
Le formulaire s'efface pendant qu'on tranche le doublon : la saisie n'est pas perdue pour
autant, elle attend dans « _saisie » et revient telle quelle si l'on renonce. Laisser les
deux à l'écran donnerait deux boutons d'ajout, dont un seul confirme.
*@
@if (_doublons is { } doublons)
{
<AvertissementDoublon Doublons="doublons"
EnCours="_enregistrement"
OnConfirmer="ConfirmerAsync"
OnRenoncer="() => _doublons = null" />
}
else
{
<FormulaireLivre Saisie="_saisie"
LibelleValidation="Ajouter au catalogue"
Erreur="@_erreur"
EnCours="_enregistrement"
MessageBlocage="@(Reseau.EnLigne ? null : EtatReseau.MotifHorsLigne)"
OnValider="EnregistrerAsync"
OnAnnuler="Retour" />
}
@code {
private readonly EnregistrementLivre _saisie = new();
protected override void OnInitialized() => Reseau.Change += SurChangementReseau;
private void SurChangementReseau() => _ = InvokeAsync(StateHasChanged);
public void Dispose() => Reseau.Change -= SurChangementReseau;
private bool _enregistrement;
private string? _erreur;
private DoublonsLivre? _doublons;
private Task EnregistrerAsync() => AjouterAsync(false);
/// <summary>Ajout maintenu après avoir vu ce que le catalogue contenait déjà.</summary>
private Task ConfirmerAsync() => AjouterAsync(true);
private async Task AjouterAsync(bool confirmerDoublon)
{
_enregistrement = true;
_erreur = null;
var resultat = await Api.CreerAsync(_saisie, confirmerDoublon);
_enregistrement = false;
// Un doublon signalé n'est pas un échec : rien n'a été écrit, et la même saisie
// confirmée s'enregistrera telle quelle.
if (resultat.Doublons is { } doublons)
{
_doublons = doublons;
return;
}
_doublons = null;
if (!resultat.EstOk)
{
_erreur = resultat.Erreur;
return;
}
Navigation.NavigateTo("/");
}
private void Retour() => Navigation.NavigateTo("/");
}