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
@@ -0,0 +1,74 @@
@*
Le catalogue contient déjà quelque chose de semblable.
⚠️ C'est un AVERTISSEMENT, jamais un refus : posséder deux exemplaires est légitime — on
garde le sien et on prête l'autre — et le rapprochement se trompe dans les deux sens (il
confond le poche et le grand format, il rate une réédition retitrée). L'écran montre donc
les fiches en cause plutôt que de les décrire, et laisse la décision à l'utilisateur.
Les fiches sont des LIENS : la question qui se pose vraiment est « est-ce bien le même
livre ? », et on n'y répond qu'en regardant celui qui est déjà là.
*@
<div class="message-avertissement" role="alert">@Doublons.Message</div>
<ul class="liste-livres">
@foreach (var livre in Doublons.Livres)
{
<li class="carte-livre" @key="livre.Id">
<Couverture Url="@livre.CoverUrl" Titre="@livre.Titre" Classe="couverture-petite" />
<div class="carte-corps">
<a class="carte-titre" href="@($"livres/{livre.Id}")">@livre.Titre</a>
@if (livre.Auteurs.Count > 0)
{
<p class="carte-auteur">@string.Join(", ", livre.Auteurs.Select(a => a.Nom))</p>
}
<p class="carte-details">
@if (livre.Format == Format.Numerique)
{
<span class="etiquette">@Libelles.Format(livre.Format)</span>
}
@* Un exemplaire dehors est justement une raison d'en vouloir un second. *@
@if (livre.PreteA is { } emprunteur)
{
<span class="etiquette etiquette-prete">Prêté à @emprunteur</span>
}
@if (!string.IsNullOrWhiteSpace(livre.Editeur))
{
<span>@livre.Editeur</span>
}
@if (!string.IsNullOrWhiteSpace(livre.Isbn))
{
<span class="code-isbn">@FormatageIsbn.Afficher(livre.Isbn)</span>
}
</p>
</div>
</li>
}
</ul>
<div class="actions-formulaire">
<button type="button" class="bouton bouton-principal" disabled="@EnCours" @onclick="OnConfirmer">
@(EnCours ? "Ajout…" : "Ajouter quand même")
</button>
<button type="button" class="bouton bouton-discret" disabled="@EnCours" @onclick="OnRenoncer">
Ne pas ajouter
</button>
</div>
@code {
[Parameter, EditorRequired] public DoublonsLivre Doublons { get; set; } = default!;
/// <summary>Ajout confirmé : second exemplaire, autre édition, ou rapprochement à côté.</summary>
[Parameter] public EventCallback OnConfirmer { get; set; }
/// <summary>Retour en arrière : le livre était bien déjà là.</summary>
[Parameter] public EventCallback OnRenoncer { get; set; }
[Parameter] public bool EnCours { get; set; }
}