Ajout de l'url des envies directement dans la modification des ouvrages.

This commit is contained in:
mathieu
2026-09-09 21:47:03 +02:00
parent d76fb10ee0
commit c5b4e117ba
3 changed files with 59 additions and 10 deletions
@@ -214,13 +214,17 @@ public sealed class ServiceSouhaits(MaBibliDbContext db) : IServiceSouhaits
souhait.Isbn = isbn;
souhait.Note = Vide(saisie.Note);
// ⚠️ La couverture n'est écrite QUE si la charge utile en porte une, contrairement aux
// autres champs. Raison : aucun écran n'offre de champ « URL de couverture » pour une
// envie — décision actée, un tel champ inviterait à coller des liens morts. Un
// remplacement inconditionnel effacerait donc, à chaque correction de titre, l'image
// que la bibliographie avait fournie. Il n'y a rien à « vider » puisqu'il n'y a rien à
// saisir, et la lecture retombe de toute façon sur la formule OpenLibrary à ISBN connu.
souhait.CoverUrl = Vide(saisie.CoverUrl) ?? souhait.CoverUrl;
// ⚠️ Écrite SEULEMENT quand le geste de correction a été utilisé (CoverUrlModifiee) :
// « Modifier une envie » enregistre aussi le titre, l'ISBN, etc. sans qu'on ait touché à
// la couverture, et cette valeur affichée peut être une DÉDUCTION à la lecture (formule
// OpenLibrary à ISBN connu, voir Projeter) plutôt que ce qu'il y a réellement en base.
// La matérialiser à chaque enregistrement figerait cette déduction, et une correction
// d'ISBN qui suit ne la referait plus jouer. Le drapeau distingue « je n'y ai pas
// touché » de « je viens de vider le champ », ce qu'un simple null ne pourrait pas dire.
if (saisie.CoverUrlModifiee)
{
souhait.CoverUrl = Vide(saisie.CoverUrl);
}
// ⚠️ Indispensable : TitreNormalise est la CLÉ D'ŒUVRE, celle qui sert au rapprochement
// « déjà au catalogue ». Sans ce recalcul, corriger un titre laisserait le rapprochement
+36 -3
View File
@@ -41,6 +41,16 @@ else if (_saisie is null)
else
{
<div class="formulaire">
@* Même ligne que dans le formulaire d'un ouvrage (FormulaireLivre) : un aperçu quand il y
a quelque chose à montrer, puis un champ d'adresse ordinaire, au même titre que les
autres. *@
@if (!string.IsNullOrEmpty(_saisie.CoverUrl) || !string.IsNullOrWhiteSpace(_saisie.Titre))
{
<div class="formulaire-apercu">
<Couverture Url="@_saisie.CoverUrl" Titre="@_saisie.Titre" Classe="couverture-moyenne" />
</div>
}
<label class="champ">
<span class="champ-libelle">Titre <span class="obligatoire" aria-hidden="true">*</span></span>
<input class="champ-saisie" type="text" @bind="_saisie.Titre" @bind:event="oninput"
@@ -73,6 +83,12 @@ else
@bind="_saisie.Isbn" @bind:event="oninput" placeholder="978…" autocomplete="off" />
</label>
<label class="champ">
<span class="champ-libelle">URL de couverture</span>
<input class="champ-saisie" type="url" @bind="_saisie.CoverUrl" @bind:event="oninput"
placeholder="https://…" autocomplete="off" />
</label>
<label class="champ">
<span class="champ-libelle">Note</span>
<input class="champ-saisie" type="text" @bind="_saisie.Note" @bind:event="oninput"
@@ -104,6 +120,13 @@ else
private bool _enCours;
private string? _erreur;
/// <summary>
/// La couverture telle que chargée — éventuellement déduite de l'ISBN (voir <c>Projeter</c>
/// côté serveur), pas forcément ce qu'il y a réellement en base. Sert uniquement à détecter,
/// à l'enregistrement, si l'utilisateur a touché au champ.
/// </summary>
private string? _couvertureChargee;
protected override async Task OnInitializedAsync()
{
Reseau.Change += SurChangementReseau;
@@ -135,9 +158,8 @@ else
return;
}
// ⚠️ La couverture n'est PAS reprise ici : elle n'a pas de champ de saisie, et le
// service la conserve donc telle qu'elle est en base. La valeur portée par le DTO peut
// en outre être déduite de l'ISBN — la figer serait écrire en base ce qui se calcule.
_couvertureChargee = souhait.CoverUrl;
_saisie = new EnregistrementSouhait
{
Titre = souhait.Titre,
@@ -145,6 +167,7 @@ else
Editeur = souhait.Editeur,
Annee = souhait.Annee,
Isbn = souhait.Isbn,
CoverUrl = souhait.CoverUrl,
Note = souhait.Note,
};
}
@@ -156,6 +179,16 @@ else
return;
}
// ⚠️ Envoyée seulement si elle a changé depuis le chargement, et non à chaque
// enregistrement : la valeur affichée peut être une DÉDUCTION à la lecture (formule
// OpenLibrary à ISBN connu, voir `Projeter`) plutôt que ce qu'il y a réellement en base.
// La renvoyer telle quelle à chaque correction de titre la figerait en base, et une
// correction d'ISBN qui suit ne la referait plus jouer.
_saisie.CoverUrlModifiee = !string.Equals(
_saisie.CoverUrl?.Trim() ?? string.Empty,
_couvertureChargee?.Trim() ?? string.Empty,
StringComparison.Ordinal);
_enCours = true;
_erreur = null;
+12
View File
@@ -65,6 +65,18 @@ public record EnregistrementSouhait
public string? CoverUrl { get; set; }
/// <summary>
/// Vrai seulement si l'utilisateur vient d'utiliser le geste de correction de la couverture.
/// </summary>
/// <remarks>
/// ⚠️ Sans ce signal, <see cref="CoverUrl"/> à <c>null</c> serait ambigu entre « je n'y ai
/// pas touché » (garder ce qu'il y a en base, y compris rien du tout, et laisser jouer la
/// formule OpenLibrary à ISBN connu) et « je viens de vider le champ » (retirer la
/// couverture pour de bon). Modifier le titre ou l'ISBN d'une envie ne doit jamais
/// matérialiser en base la couverture déduite qu'elle ne fait qu'afficher à la lecture.
/// </remarks>
public bool CoverUrlModifiee { get; set; }
public string? Note { get; set; }
}