Files
mabibli/MaBibli.Client/Pages/Revues.razor
T
mathieuandClaude Opus 5 0c4babd7b9 Une seule entrée d'ajout : « Ajouter un ouvrage »
Le geste réel est « j'ai un truc avec un code-barres », pas « je vais cataloguer un
livre » : obliger à savoir d'avance ce qu'on tient était un détour, d'autant que le
décodage distingue déjà un 978/979 d'un 977. Le même écran est atteint depuis le
catalogue et depuis les revues.

⚠️ Le MODÈLE ne bouge pas : une revue reste une Revue, jamais un Livre. Fondre les deux
tables aurait obligé à répéter « et qui n'est pas une revue » à chaque lecture du
catalogue, des compteurs, des doublons, des séries et des bibliographies.

- /ajout (alias /ajout/isbn) : « Ajouter un ouvrage », deux saisies manuelles distinctes
  puisque, sans code à lire, il faut bien trancher soi-même.
- Nouvelle page /revues/ajout : titre, ISSN et éditeur, puis la fiche de la revue. Elle
  remplace le champ posé au milieu de la liste des revues.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-20 21:13:01 +02:00

104 lines
3.4 KiB
Plaintext

@page "/revues"
@inject ServiceLivresApi Api
@inject EtatReseau Reseau
@implements IDisposable
<PageTitle>MaBibli — revues</PageTitle>
<h1 class="titre-page">Revues</h1>
<p class="message-discret">
Une fiche par revue, les numéros à l'intérieur — douze numéros d'un magazine ne font pas
douze fiches. Les revues ne sont pas au catalogue : ce ne sont pas des livres.
</p>
@if (_revues is null)
{
<p class="message-discret" role="status">Chargement…</p>
}
else if (_revues.Count == 0)
{
<p class="message-discret">
Aucune revue. Scannez le code-barres d'un magazine depuis « Ajouter un ouvrage » :
le code d'une revue commence par 977 et porte un ISSN, pas un ISBN. Sans code à lire,
<a href="revues/ajout">saisissez-la à la main</a>.
</p>
}
else
{
<ul class="liste-series">
@foreach (var revue in _revues)
{
<li class="carte-serie" @key="revue.Id">
<a class="carte-titre" href="@($"revues/{revue.Id}")">@revue.Titre</a>
<p class="carte-details">
<span>
@(revue.Numeros.Count == 0
? "Aucun numéro"
: $"{revue.Numeros.Count} numéro{(revue.Numeros.Count > 1 ? "s" : "")}")
</span>
@if (!string.IsNullOrWhiteSpace(revue.Issn))
{
<span class="code-isbn">ISSN @revue.Issn</span>
}
@if (!string.IsNullOrWhiteSpace(revue.Editeur))
{
<span>@revue.Editeur</span>
}
</p>
@* Le dernier numéro reçu répond seul à « est-ce que je l'ai déjà ? », qui est la
question qu'on se pose devant un kiosque. *@
@if (revue.Numeros.FirstOrDefault() is { } dernier)
{
<p class="carte-details">Dernier : n° @dernier.Numero @Quand(dernier)</p>
}
</li>
}
</ul>
}
@*
⚠️ Le champ « nom d'une nouvelle revue » a quitté cet écran : l'ajout passe par la MÊME
entrée que celle du catalogue, « Ajouter un ouvrage », qui scanne et reconnaît seule un
code 977. Deux points de départ selon ce qu'on croit tenir obligeaient à trancher avant
de regarder le code-barres.
*@
<nav class="actions-flottantes">
@if (Reseau.EnLigne)
{
<a class="bouton bouton-principal" href="ajout">Ajouter un ouvrage</a>
<a class="bouton bouton-discret" href="revues/ajout">Saisir une revue</a>
}
else
{
<button type="button" class="bouton bouton-principal" disabled
title="@EtatReseau.MotifHorsLigne">Ajouter un ouvrage</button>
}
</nav>
@code {
private IReadOnlyList<RevueDto>? _revues;
private static string Quand(NumeroRevueDto numero) =>
numero.DateParution is { } date ? $"({date.ToLocalTime():MM/yyyy})" : string.Empty;
protected override void OnInitialized() => Reseau.Change += SurChangementReseau;
private void SurChangementReseau() => _ = InvokeAsync(async () =>
{
await ChargerAsync();
StateHasChanged();
});
public void Dispose() => Reseau.Change -= SurChangementReseau;
protected override Task OnInitializedAsync() => ChargerAsync();
private async Task ChargerAsync() => _revues = await Api.ListerRevuesAsync();
}