Merge branch 'j3/feat/pagination' into dev.
This commit is contained in:
@@ -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>
|
||||||
|
|||||||
@@ -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()
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -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)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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; }
|
||||||
}
|
}
|
||||||
@@ -29,7 +29,7 @@
|
|||||||
<a asp-action="Index"
|
<a asp-action="Index"
|
||||||
asp-route-id="@titre.IdTitre"
|
asp-route-id="@titre.IdTitre"
|
||||||
class="me-3 text-black">
|
class="me-3 text-black">
|
||||||
<img src="@titre.UrlJaquette" alt="@titre.Libelle" width="70px" height="70px" class="object-fit-cover" loading="lazy"/>
|
<img src="@titre.UrlJaquette" alt="@titre.Libelle" width="70px" height="70px" class="object-fit-cover" loading="lazy" />
|
||||||
</a>
|
</a>
|
||||||
|
|
||||||
<!-- Infos -->
|
<!-- Infos -->
|
||||||
@@ -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">
|
||||||
|
<< 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 >>
|
||||||
|
</a>
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
<div></div>
|
||||||
|
}
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
Reference in New Issue
Block a user