Menu en haut, retour explicite, et bibliographie qui ne rappelle plus la BnF
Navigation - La barre d'onglets du bas devient un menu en haut, sur le repli du gabarit Blazor : bascule sur téléphone, rangée sur PC. Cela renverse la décision du 2026-08-18 (le pouce atteint le bas de l'écran) : le raisonnement reste juste, mais il ne vaut rien face à une barre qui s'affiche mal. Le point tenu est qu'il existe désormais un état de repli — sans feuille de style, il reste une liste de liens lisible. - Bouton « retour » dans le bandeau, sur tous les écrans, appuyé sur l'historique du navigateur, avec repli sur le catalogue quand la pile est vide (PWA ouverte depuis l'écran d'accueil). - Le pictogramme de la marque passe en SVG en ligne : le fichier logo-bandeau.svg pouvait manquer sur un appareil dont le cache précédait son ajout, d'où l'icône cassée. Bibliographie - Case à cocher à gauche du titre, ligne centrée verticalement, boutons groupés à droite. - Barre de sélection collante EN HAUT, avec masquage groupé et « tout décocher ». - « Nouveautés » et « Ses livres chez vous » remontent à côté du filtre. - ⚠️ « Je le veux » et « Masquer » ne rechargent plus rien : ils basculent un drapeau personnel que le client connaît déjà. Auparavant chaque clic vidait le cache des bibliographies et relançait la BnF (une seconde par page, jusqu'à dix pages pour les nouveautés, qui ne sont pas mises en cache) puis relisait tout le catalogue. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
@@ -4,6 +4,7 @@ using System.Text.Json;
|
||||
using MaBibli.Shared.Catalogue;
|
||||
using MaBibli.Shared.Dtos;
|
||||
using MaBibli.Shared.Entites;
|
||||
using MaBibli.Shared.Textes;
|
||||
|
||||
namespace MaBibli.Client.Services;
|
||||
|
||||
@@ -657,7 +658,13 @@ public sealed class ServiceLivresApi(HttpClient http, CacheHorsLigne cache, Etat
|
||||
() => http.PostAsJsonAsync("api/souhaits", saisie, Json, ct), ct);
|
||||
if (resultat.EstOk)
|
||||
{
|
||||
_bibliographies.Clear();
|
||||
// ⚠️ Surtout PAS _bibliographies.Clear() : la bibliographie suivante repartirait
|
||||
// interroger la BnF (~1 s par page, jusqu'à dix pages pour les nouveautés). C'est
|
||||
// exactement ce qui rendait « Je le veux » interminable — l'écran attendait une
|
||||
// source distante pour apprendre une chose qu'il savait déjà.
|
||||
PatcherOeuvres(
|
||||
o => CleOeuvre.Cle(o.Titre) == CleOeuvre.Cle(saisie.Titre),
|
||||
o => o with { Souhaite = true, SouhaitId = resultat.Valeur?.Id });
|
||||
}
|
||||
|
||||
return resultat;
|
||||
@@ -825,16 +832,17 @@ public sealed class ServiceLivresApi(HttpClient http, CacheHorsLigne cache, Etat
|
||||
await ModifierBibliographieAsync(
|
||||
() => http.PostAsJsonAsync(
|
||||
$"api/auteurs/{auteurId}/bibliographie/masque",
|
||||
new MasquageBibliographie { Titre = titre }, Json, ct), ct);
|
||||
new MasquageBibliographie { Titre = titre }, Json, ct), titre, true, ct);
|
||||
|
||||
public async Task<string?> DemasquerOeuvreBibliographieAsync(
|
||||
int auteurId, string titre, CancellationToken ct = default) =>
|
||||
await ModifierBibliographieAsync(
|
||||
() => http.DeleteAsync(
|
||||
$"api/auteurs/{auteurId}/bibliographie/masque?titre={Uri.EscapeDataString(titre)}"), ct);
|
||||
$"api/auteurs/{auteurId}/bibliographie/masque?titre={Uri.EscapeDataString(titre)}"),
|
||||
titre, false, ct);
|
||||
|
||||
private async Task<string?> ModifierBibliographieAsync(
|
||||
Func<Task<HttpResponseMessage>> appel, CancellationToken ct)
|
||||
Func<Task<HttpResponseMessage>> appel, string titre, bool masquee, CancellationToken ct)
|
||||
{
|
||||
var (reponse, motif) = await EnvoyerAsync(appel);
|
||||
if (reponse is null)
|
||||
@@ -842,8 +850,44 @@ public sealed class ServiceLivresApi(HttpClient http, CacheHorsLigne cache, Etat
|
||||
return motif;
|
||||
}
|
||||
|
||||
_bibliographies.Clear();
|
||||
return reponse.IsSuccessStatusCode ? null : await MessageErreurAsync(reponse, ct);
|
||||
if (!reponse.IsSuccessStatusCode)
|
||||
{
|
||||
return await MessageErreurAsync(reponse, ct);
|
||||
}
|
||||
|
||||
PatcherOeuvres(o => o.Titre == titre, o => o with { Masquee = masquee });
|
||||
return null;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Corrige en place les œuvres des bibliographies déjà en mémoire.
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// ⚠️ C'est ce qui remplace l'ancien <c>_bibliographies.Clear()</c>, et la différence est
|
||||
/// une seconde d'attente contre plusieurs. Masquer une œuvre ou l'ajouter à ses envies ne
|
||||
/// change <b>rien</b> à ce que la BnF connaît de l'auteur : seuls des drapeaux
|
||||
/// <i>personnels</i> basculent, et le client sait lesquels sans redemander quoi que ce soit.
|
||||
/// <para>
|
||||
/// Ce cache reste, comme depuis le lot D, en mémoire et pour la seule session : rien n'est
|
||||
/// écrit dans l'instantané hors-ligne, une bibliographie n'étant pas une donnée à nous.
|
||||
/// </para>
|
||||
/// </remarks>
|
||||
private void PatcherOeuvres(
|
||||
Func<OeuvreBibliographie, bool> cible,
|
||||
Func<OeuvreBibliographie, OeuvreBibliographie> correction)
|
||||
{
|
||||
foreach (var (auteurId, biblio) in _bibliographies.ToList())
|
||||
{
|
||||
if (!biblio.Oeuvres.Any(cible))
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
_bibliographies[auteurId] = biblio with
|
||||
{
|
||||
Oeuvres = biblio.Oeuvres.Select(o => cible(o) ? correction(o) : o).ToList(),
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
// ─────────────────────────────────────────────────────────────────────────
|
||||
|
||||
Reference in New Issue
Block a user