Sépare consultation et édition pour les lots B1 B2 B3

Réutilise la carte livre du catalogue, sépare les modes des séries et des envies, et déplie les œuvres bibliographiques non possédées.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
This commit is contained in:
LIMONIER Mathieu
2026-08-20 13:11:43 +02:00
co-authored by Copilot
parent 5d45eb492e
commit 3d5e73838e
8 changed files with 238 additions and 87 deletions
+60 -12
View File
@@ -1,4 +1,5 @@
@page "/series/{Id:int}"
@page "/series/{Id:int}/edition"
@inject ServiceLivresApi Api
@inject NavigationManager Navigation
@inject EtatReseau Reseau
@@ -14,11 +15,14 @@
}
else
{
@if (_parente is { } parente)
@if (!ModeEdition && _parente is { } parente)
{
@if (!ModeEdition)
{
<p class="message-discret">
Fait partie de <a href="@($"series/{parente.Id}")">@parente.Titre</a>.
</p>
}
}
<h1 class="titre-page">@_serie.Titre</h1>
@@ -47,7 +51,7 @@ else
}
@* Les sous-séries d'un cycle : on les liste, on ne les déplie pas — chacune a son écran. *@
@if (_filles.Count > 0)
@if (!ModeEdition && _filles.Count > 0)
{
<h2 class="titre-section">Séries de ce cycle</h2>
<ul class="liste-sous-series">
@@ -63,7 +67,7 @@ else
</ul>
}
@if (_serie.Elements.Count > 0)
@if (!ModeEdition && _serie.Elements.Count > 0)
{
<h2 class="titre-section">Ordre de lecture</h2>
@@ -94,20 +98,27 @@ else
</div>
<div class="carte-corps">
@if (element.LivreId is { } livreId)
@if (element.LivreId is { } livreId && _livresCatalogue.FirstOrDefault(l => l.Id == livreId) is { } livre)
{
<a class="carte-titre" href="@($"livres/{livreId}")">@element.Titre</a>
<CarteLivre Livre="livre" />
}
else if (element.LivreId is { } idRattache)
{
<a class="carte-titre" href="@($"livres/{idRattache}")">@element.Titre</a>
}
else
{
<p class="carte-titre">@element.Titre</p>
}
@if (!string.IsNullOrWhiteSpace(element.Auteurs))
@if ((element.LivreId is null || !_livresCatalogue.Any(l => l.Id == element.LivreId))
&& !string.IsNullOrWhiteSpace(element.Auteurs))
{
<p class="carte-auteur">@element.Auteurs</p>
}
@if (element.LivreId is null || !_livresCatalogue.Any(l => l.Id == element.LivreId))
{
<p class="carte-details">
@if (!element.Possede)
{
@@ -120,6 +131,7 @@ else
<span class="etiquette etiquette-prete">Prêté à @emprunteur</span>
}
</p>
}
<div class="actions-tome">
@if (!element.Possede)
@@ -161,12 +173,12 @@ else
value="@_recherche" @oninput="ChercherAsync"
aria-label="Chercher un livre à rattacher" />
@foreach (var livre in _resultats)
@foreach (var resultat in _resultats)
{
<button type="button" class="bouton bouton-discret"
@key="livre.Id"
@onclick="() => RattacherAsync(element.Id, livre.Id)">
@livre.Titre@(livre.AuteursAffiches is { } a ? $" — {a}" : "")
@key="resultat.Id"
@onclick="() => RattacherAsync(element.Id, resultat.Id)">
@resultat.Titre@(resultat.AuteursAffiches is { } a ? $" — {a}" : "")
</button>
}
</div>
@@ -177,6 +189,8 @@ else
</ul>
}
@if (!ModeEdition)
{
<h2 class="titre-section">Ajouter un tome</h2>
@*
@@ -221,7 +235,10 @@ else
}
</div>
}
}
@if (ModeEdition)
{
<h2 class="titre-section">La série</h2>
<label class="champ">
@@ -267,6 +284,21 @@ else
}
</p>
}
}
@if (!ModeEdition)
{
<nav class="actions-flottantes">
@if (Reseau.EnLigne)
{
<a class="bouton bouton-principal" href="@($"series/{Id}/edition")">Modifier</a>
}
else
{
<button type="button" class="bouton bouton-principal" disabled
title="@EtatReseau.MotifHorsLigne">Modifier</button>
}
</nav>
}
}
@code {
@@ -276,6 +308,7 @@ else
[Parameter] public int Id { get; set; }
private IReadOnlyList<SerieDto> _toutes = [];
private IReadOnlyList<LivreDto> _livresCatalogue = [];
private SerieDto? _serie;
private SerieDto? _parente;
private List<SerieDto> _filles = [];
@@ -296,6 +329,10 @@ else
private string? MotifBlocage => Reseau.EnLigne ? null : EtatReseau.MotifHorsLigne;
private bool ModeEdition =>
Navigation.ToAbsoluteUri(Navigation.Uri).AbsolutePath.TrimEnd('/')
.EndsWith("/edition", StringComparison.OrdinalIgnoreCase);
/// <summary>
/// Séries dans lesquelles celle-ci peut être rangée.
/// </summary>
@@ -326,7 +363,13 @@ else
return false;
}
protected override void OnInitialized() => Reseau.Change += SurChangementReseau;
protected override void OnInitialized()
{
Reseau.Change += SurChangementReseau;
Navigation.LocationChanged += SurNavigation;
}
private void SurNavigation(object? _, LocationChangedEventArgs __) => InvokeAsync(StateHasChanged);
private void SurChangementReseau() => _ = InvokeAsync(async () =>
{
@@ -334,7 +377,11 @@ else
StateHasChanged();
});
public void Dispose() => Reseau.Change -= SurChangementReseau;
public void Dispose()
{
Reseau.Change -= SurChangementReseau;
Navigation.LocationChanged -= SurNavigation;
}
protected override Task OnParametersSetAsync() => ChargerAsync();
@@ -342,6 +389,7 @@ else
{
_chargement = true;
_toutes = await Api.ListerSeriesAsync();
_livresCatalogue = await Api.ListerAsync(new CritereLivres());
_chargement = false;
Rattacher();