Files
mabibli/MaBibli.Client/Composants/AvertissementDoublon.razor
T
mathieuandClaude Opus 5 383ed43227 Signaler les doublons à l'ajout d'un livre, sans jamais les refuser
Rien n'empêchait de rescanner un livre déjà catalogué. Plutôt qu'un index
unique — qui interdirait le second exemplaire, cas parfaitement légitime —
la création répond 409 avec les fiches semblables, et « confirmerDoublon »
enregistre la même saisie.

Deux critères, dont aucun n'est une clé : ISBN identique, ou clé d'œuvre
et auteur communs. La clé d'œuvre étant un préfixe de TitreNormalise, SQL
dégrossit sur la colonne indexée et l'égalité exacte se vérifie ensuite en
mémoire.

Vérifié en exécution : avertissement, retour au formulaire intact, et ajout
confirmé créant bien un second exemplaire.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-19 21:11:39 +02:00

75 lines
2.9 KiB
Plaintext

@*
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; }
}