#216 : Ajout de la pagination sur la page style.

This commit is contained in:
Loic Masi
2026-04-09 11:38:25 +02:00
parent 37a14a7a50
commit 645cd19909
6 changed files with 99 additions and 4 deletions

View File

@@ -72,6 +72,22 @@
/// <returns>Une collection de titres correspondant au critère de recherche, triée par libellé.</returns> /// <returns>Une collection de titres correspondant au critère de recherche, triée par libellé.</returns>
IEnumerable<Titre> SearchByStyle(string libelle); IEnumerable<Titre> SearchByStyle(string libelle);
/// <summary>
/// Retourne une liste de titre filtré par nom et paginé.
/// </summary>
/// <param name="offset">Nombre de titres a passer.</param>
/// <param name="limit">Nombre de titre récupéré.</param>
/// <param name="libelle">Nom du style.</param>
/// <returns>Une liste de titre.</returns>
IEnumerable<Titre> SearchByStylePaginate(int offset, int limit, string libelle);
/// <summary>
/// Compter le nombre de titres au sein d'un style.
/// </summary>
/// <param name="libelle">Style de la musique.</param>
/// <returns>Un entier.</returns>
int CountByStyle(string libelle);
/// <summary> /// <summary>
/// Met à jour un titre dans la liste des titres en fonction de son identifiant. Si aucun titre correspondant à l'identifiant du titre fourni n'est trouvé, un message d'avertissement est enregistré dans les logs et aucune mise à jour n'est effectuée. /// Met à jour un titre dans la liste des titres en fonction de son identifiant. Si aucun titre correspondant à l'identifiant du titre fourni n'est trouvé, un message d'avertissement est enregistré dans les logs et aucune mise à jour n'est effectuée.
/// </summary> /// </summary>

View File

@@ -314,6 +314,20 @@ public class DbTitreRepository : ITitreRepository
} }
} }
/// <inheritdoc/>
public IEnumerable<Titre> SearchByStylePaginate(int offset, int limit, string libelle)
{
return this.SearchByStyle(libelle).Paginate(offset, limit);
}
/// <inheritdoc/>
public int CountByStyle(string libelle)
{
return this.context.Titres
.Where(t => t.Styles.Any(s => s.Libelle.ToLower() == libelle.ToLower()))
.Count();
}
/// <inheritdoc/> /// <inheritdoc/>
public int CountLike() public int CountLike()
{ {

View File

@@ -112,6 +112,20 @@ public class LocalTitreRepository : ITitreRepository
.Where(t => t.Styles.Any(s => s.Libelle == libelle)); .Where(t => t.Styles.Any(s => s.Libelle == libelle));
} }
/// <inheritdoc/>
public IEnumerable<Titre> SearchByStylePaginate(int offset, int limit, string libelle)
{
return this.SearchByStyle(libelle).Paginate(offset, limit);
}
/// <inheritdoc/>
public int CountByStyle(string libelle)
{
return this.dataStore.Titres
.Where(t => t.Styles.Any(s => s.Libelle == libelle))
.Count();
}
/// <inheritdoc/> /// <inheritdoc/>
public void Update(Titre titre) public void Update(Titre titre)
{ {

View File

@@ -67,17 +67,25 @@ namespace Webzine.WebApplication.Controllers
/// Affiche les titres correspondant a un style musical donne. /// Affiche les titres correspondant a un style musical donne.
/// </summary> /// </summary>
/// <param name="style">Nom du style musical.</param> /// <param name="style">Nom du style musical.</param>
/// <param name="page">Numéro de la page.</param>
/// <returns>Vue contenant la liste filtree.</returns> /// <returns>Vue contenant la liste filtree.</returns>
public IActionResult Style(string style) [Route("/titres/styles/{style}", Name = "TitresParStyle")]
public IActionResult Style(string style, int page = 0)
{ {
this.logger.LogInformation("Recherche des titres pour le style : {Style}.", style); var offset = page * 10;
var limit = 10;
var titresFiltres = this.titreRepository.SearchByStylePaginate(offset, limit, style).ToList();
var totalTitres = this.titreRepository.CountByStyle(style);
var totalPages = (int)Math.Ceiling((double)totalTitres / limit);
var titresFiltres = this.titreRepository.SearchByStyle(style).ToList(); this.logger.LogInformation("Recherche des titres pour le style : {Style}.", style);
var vm = new TitreStyle var vm = new TitreStyle
{ {
StyleName = style, StyleName = style,
Titres = titresFiltres.Select(MapTitreItem).ToList(), Titres = titresFiltres.Select(MapTitreItem).ToList(),
Page = page,
TotalPages = totalPages,
}; };
return this.View(vm); return this.View(vm);

View File

@@ -14,4 +14,14 @@ public class TitreStyle
/// Définit la liste des items de titre associés au style musical. /// Définit la liste des items de titre associés au style musical.
/// </summary> /// </summary>
public List<TitreStyleItem> Titres { get; set; } = new (); public List<TitreStyleItem> Titres { get; set; } = new ();
/// <summary>
/// Obtient ou définit le numéro de page pour la pagination des titres affichés sur la page d'accueil.
/// </summary>
public int Page { get; set; }
/// <summary>
/// Nombre total de page.
/// </summary>
public int TotalPages { get; set; }
} }

View File

@@ -55,6 +55,39 @@
</div> </div>
} }
} }
<div class="d-flex align-items-center justify-content-between mt-3">
@if (Model.Page > 0)
{
<a asp-route="TitresParStyle"
asp-route-style="@Model.StyleName"
asp-route-page="@(Model.Page - 1)"
class="btn btn-secondary">
&lt;&lt; Titre plus récent
</a>
}
else
{
<div></div>
}
<p class="mb-0">
Page : @(Model.Page + 1) sur @Model.TotalPages
</p>
@if (Model.Page < Model.TotalPages - 1)
{
<a asp-route="TitresParStyle"
asp-route-style="@Model.StyleName"
asp-route-page="@(Model.Page + 1)"
class="btn btn-secondary">
Titre plus anciens &gt;&gt;
</a>
}
else
{
<div></div>
}
</div>
</div> </div>
</div> </div>
</div> </div>