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:
@@ -0,0 +1,118 @@
|
||||
@page "/revues"
|
||||
@inject ServiceLivresApi Api
|
||||
@inject EtatReseau Reseau
|
||||
@inject NavigationManager Navigation
|
||||
@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)
|
||||
{
|
||||
@*
|
||||
⚠️ Toute la LIGNE ouvre la fiche (lot V), et pas seulement le titre : c'est ce que
|
||||
le projet tient déjà au catalogue, où la carte entière y mène. Viser un titre de
|
||||
trois mots au pouce était le seul point d'entrée.
|
||||
|
||||
Le lien reste un vrai lien : il porte l'adresse, le clavier et le clic-milieu.
|
||||
Son clic ne remonte donc PAS jusqu'à la ligne, qui navigerait une seconde fois.
|
||||
Toute action posée un jour sur cette ligne doit faire de même
|
||||
(@@onclick:stopPropagation), sans quoi elle ouvrirait la fiche en s'exécutant.
|
||||
*@
|
||||
<li class="carte-serie carte-cliquable" @key="revue.Id"
|
||||
@onclick="() => Ouvrir(revue.Id)">
|
||||
<a class="carte-titre" href="@($"revues/{revue.Id}")"
|
||||
@onclick:stopPropagation="true">@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 @FormatageIssn.Afficher(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 void Ouvrir(int id) => Navigation.NavigateTo($"revues/{id}");
|
||||
|
||||
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();
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user