From 06cdb351ecd62b48bc2b4fe3fafe3092e47ae70d Mon Sep 17 00:00:00 2001 From: "josephine.vetu" Date: Thu, 2 Apr 2026 16:24:17 +0200 Subject: [PATCH 1/3] =?UTF-8?q?#124=20Pagination=20faite=20pour=20la=20pag?= =?UTF-8?q?e=20d'accueil,=20ordonn=C3=A9e=20par=20date=20de=20cr=C3=A9atio?= =?UTF-8?q?n=20puis=20du=20libelle.=20D=C3=A9but=20de=20pagination=20pour?= =?UTF-8?q?=20les=20artistes.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../IArtisteRepository.cs | 8 ++++++ Webzine.Repository/DbArtisteRepository.cs | 26 +++++++++++++++++++ Webzine.Repository/DbTitreRepository.cs | 7 +++-- Webzine.Repository/LocalArtisteRepository.cs | 12 +++++++++ Webzine.Repository/LocalTitreRepository.cs | 1 + .../Controllers/AccueilController.cs | 18 +++++++------ .../Accueil/AccueilIndexViewModel.cs | 4 +-- .../Views/Accueil/Index.cshtml | 8 +++--- 8 files changed, 67 insertions(+), 17 deletions(-) diff --git a/Webzine.Repository.Contracts/IArtisteRepository.cs b/Webzine.Repository.Contracts/IArtisteRepository.cs index 1985ddc..b480816 100644 --- a/Webzine.Repository.Contracts/IArtisteRepository.cs +++ b/Webzine.Repository.Contracts/IArtisteRepository.cs @@ -39,6 +39,14 @@ namespace Webzine.Repository.Contracts /// Retourne une collection d'artistes. IEnumerable FindAll(); + /// + /// Récupère une liste d'artistes pour une page spécifique, en fonction du numéro de page et de la taille de la page. + /// + /// Le numéro de la page à récupérer. + /// La taille de chaque page. + /// Une liste d'artistes pour la page demandée. + IEnumerable FindArtistes(int pageNumber, int pageSize); + /// /// Met à jour les informations d'un artiste existant dans la collection. /// diff --git a/Webzine.Repository/DbArtisteRepository.cs b/Webzine.Repository/DbArtisteRepository.cs index 2c50cdc..18068bc 100644 --- a/Webzine.Repository/DbArtisteRepository.cs +++ b/Webzine.Repository/DbArtisteRepository.cs @@ -200,5 +200,31 @@ namespace Webzine.Repository throw; } } + + /// + /// Permet de paginer les artistes en fonction du numéro de page et de la taille de page spécifiés. + /// + /// Le numéro de la page à récupérer. + /// La taille de chaque page. + /// Une liste d'artistes pour la page demandée. + public IEnumerable FindArtistes(int pageNumber, int pageSize) + { + try + { + var artistes = this.context.Artistes + .AsNoTracking() + .Include(t => t.Titres) + .Skip((pageNumber - 1) * pageSize) + .Take(pageSize) + .ToList(); + this.logger.LogDebug("Page {PageNumber} d'artistes récupérée avec {PageSize} artistes par page.", pageNumber, pageSize); + return artistes; + } + catch (Exception ex) + { + this.logger.LogError(ex, "Erreur lors de la pagination des artistes. Page: {PageNumber}, Taille: {PageSize}", pageNumber, pageSize); + throw; + } + } } } \ No newline at end of file diff --git a/Webzine.Repository/DbTitreRepository.cs b/Webzine.Repository/DbTitreRepository.cs index 5ae3c9a..d75cb16 100644 --- a/Webzine.Repository/DbTitreRepository.cs +++ b/Webzine.Repository/DbTitreRepository.cs @@ -99,15 +99,14 @@ public class DbTitreRepository : ITitreRepository this.logger.LogDebug("Recherche des titres avec offset: {Offset}, limit: {Limit}", offset, limit); var titres = this.context.Titres + .OrderByDescending(t => t.DateCreation) + .ThenBy(t => t.Libelle) .Include(t => t.Artiste) .Include(t => t.Styles) - .OrderBy(t => t.Libelle) .Skip(offset) .Take(limit) - .AsNoTracking() - .ToList(); + .AsNoTracking(); - this.logger.LogDebug("{Count} titres trouvés", titres.Count); return titres; } catch (Exception ex) diff --git a/Webzine.Repository/LocalArtisteRepository.cs b/Webzine.Repository/LocalArtisteRepository.cs index 1aa7137..cc6f25d 100644 --- a/Webzine.Repository/LocalArtisteRepository.cs +++ b/Webzine.Repository/LocalArtisteRepository.cs @@ -106,5 +106,17 @@ namespace Webzine.Repository { return this.dataStore.Artistes.Count(predicate); } + + /// + /// Le numéro de la page à récupérer. + /// La taille de chaque page. + /// Une liste d'artistes pour la page demandée. + public IEnumerable FindArtistes(int pageNumber, int pageSize) + { + return this.dataStore.Artistes + .Skip((pageNumber - 1) * pageSize) + .Take(pageSize) + .ToList(); + } } } \ No newline at end of file diff --git a/Webzine.Repository/LocalTitreRepository.cs b/Webzine.Repository/LocalTitreRepository.cs index b414a62..291e196 100644 --- a/Webzine.Repository/LocalTitreRepository.cs +++ b/Webzine.Repository/LocalTitreRepository.cs @@ -49,6 +49,7 @@ public class LocalTitreRepository : ITitreRepository { return this.dataStore.Titres .OrderByDescending(t => t.DateCreation) + .ThenBy(t => t.Libelle) .Skip(offset) .Take(limit); } diff --git a/Webzine.WebApplication/Controllers/AccueilController.cs b/Webzine.WebApplication/Controllers/AccueilController.cs index 4d15d99..86ee384 100644 --- a/Webzine.WebApplication/Controllers/AccueilController.cs +++ b/Webzine.WebApplication/Controllers/AccueilController.cs @@ -21,6 +21,7 @@ /// /// Service de journalisation injecté pour enregistrer les événements et les erreurs. /// Service d'injection de configuration pour accéder aux paramètres de l'application. + /// Service d'injection du dépôt de titres pour accéder aux données des titres. public AccueilController( ILogger logger, IConfiguration configuration, @@ -36,24 +37,25 @@ /// /// Affiche la page d'accueil du webzine, présentant les derniers titres et les titres les plus populaires. /// + /// Le numéro de page pour la pagination des titres (par défaut à 0). /// La vue Index avec le ViewModel contenant les listes de titres à afficher. - public IActionResult Index() + public IActionResult Index(int page = 0) { this.logger.LogInformation("Arrivée sur la page d'accueil"); var derniereChronique = this.configuration.GetValue("Webzine:NombreDerniereChronique"); var nbTopTitres = this.configuration.GetValue("Webzine:NombreDeTopTitres"); - var titres = this.titreRepository.FindAll(); + var titres_paginé = this.titreRepository.FindTitres(page * derniereChronique, derniereChronique); + var top_titres = this.titreRepository.FindAll() + .OrderByDescending(t => t.NbLikes) + .Take(nbTopTitres); var vm = new AccueilIndexViewModel { - DerniersTitres = titres.Take(derniereChronique).ToList(), - - TopTitres = titres - .OrderByDescending(t => t.NbLikes) - .Take(nbTopTitres) - .ToList(), + DerniersTitres = titres_paginé.ToList(), + TopTitres = top_titres.ToList(), + Page = page, }; return this.View(vm); diff --git a/Webzine.WebApplication/ViewModels/Accueil/AccueilIndexViewModel.cs b/Webzine.WebApplication/ViewModels/Accueil/AccueilIndexViewModel.cs index 3803f4a..dbf66ff 100644 --- a/Webzine.WebApplication/ViewModels/Accueil/AccueilIndexViewModel.cs +++ b/Webzine.WebApplication/ViewModels/Accueil/AccueilIndexViewModel.cs @@ -23,8 +23,8 @@ // public int NombreDeTitre { get; set; } = 0; /// - /// Obtient ou définit le nombre de titre paginé. + /// Obtient ou définit le numéro de page pour la pagination des titres affichés sur la page d'accueil. /// - // public int Pagination { get; set; } = 0; + public int Page { get; set; } = 0; } } \ No newline at end of file diff --git a/Webzine.WebApplication/Views/Accueil/Index.cshtml b/Webzine.WebApplication/Views/Accueil/Index.cshtml index defe1e8..7160add 100644 --- a/Webzine.WebApplication/Views/Accueil/Index.cshtml +++ b/Webzine.WebApplication/Views/Accueil/Index.cshtml @@ -74,9 +74,11 @@ }
- + + Titres plus anciens >> + +
From 279fd7545952a7010ae786012d4d89272eb3e885 Mon Sep 17 00:00:00 2001 From: "josephine.vetu" Date: Fri, 3 Apr 2026 15:22:24 +0200 Subject: [PATCH 2/3] =?UTF-8?q?#192=20Pagination=20des=20pages=20admin.=20?= =?UTF-8?q?On=20peut=20passer=20=C3=A0=20la=20page=20pr=C3=A9c=C3=A9dente?= =?UTF-8?q?=20seulement=20si=20le=20num=C3=A9ro=20de=20page=20est=20>0=20e?= =?UTF-8?q?t=20la=20derni=C3=A8re=20page=20n'affiche=20pas=20de=20bouton?= =?UTF-8?q?=20pour=20la=20page=20suivante.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Webzine.Business/TitreAdminService.cs | 2 ++ Webzine.Business/Webzine.Business.csproj | 1 + .../ICommentaireRepository.cs | 6 ++++ .../IStyleRepository.cs | 8 +++++ Webzine.Repository/DbArtisteRepository.cs | 19 +++++------- Webzine.Repository/DbCommentaireRepository.cs | 15 +++++++++ Webzine.Repository/DbStyleRepository.cs | 23 ++++++++++++++ Webzine.Repository/DbTitreRepository.cs | 15 ++++----- Webzine.Repository/LocalArtisteRepository.cs | 10 +++--- .../LocalCommentaireRepository.cs | 6 ++++ Webzine.Repository/LocalStyleRepository.cs | 10 ++++++ .../Controllers/ArtisteController.cs | 28 ++++++++++++----- .../Controllers/CommentaireController.cs | 21 ++++++++++--- .../Controllers/StyleController.cs | 22 ++++++++++--- .../Controllers/TitreController.cs | 31 +++++++++++++++---- .../Artiste/ArtisteIndexViewModel.cs | 25 +++++++++++++++ .../Commentaire/CommentaireIndexViewModel.cs | 25 +++++++++++++++ .../Commentaire/CommentaireViewModel.cs | 17 ---------- .../ViewModels/Styles/StyleIndexViewModel.cs | 25 +++++++++++++++ .../ViewModels/Titre/TitreIndexViewModel.cs | 23 ++++++++++++++ .../Administration/Views/Artiste/Index.cshtml | 20 ++++++++++-- .../Views/Commentaire/Index.cshtml | 18 ++++++++++- .../Administration/Views/Style/Index.cshtml | 21 +++++++++++-- .../Administration/Views/Titre/Index.cshtml | 22 +++++++++++-- .../Controllers/AccueilController.cs | 4 +-- .../ViewModels/Titre/TitreStyleItem.cs | 3 ++ Webzine.WebApplication/appsettings.json | 3 +- 27 files changed, 346 insertions(+), 77 deletions(-) create mode 100644 Webzine.WebApplication/Areas/Administration/ViewModels/Artiste/ArtisteIndexViewModel.cs create mode 100644 Webzine.WebApplication/Areas/Administration/ViewModels/Commentaire/CommentaireIndexViewModel.cs delete mode 100644 Webzine.WebApplication/Areas/Administration/ViewModels/Commentaire/CommentaireViewModel.cs create mode 100644 Webzine.WebApplication/Areas/Administration/ViewModels/Styles/StyleIndexViewModel.cs create mode 100644 Webzine.WebApplication/Areas/Administration/ViewModels/Titre/TitreIndexViewModel.cs diff --git a/Webzine.Business/TitreAdminService.cs b/Webzine.Business/TitreAdminService.cs index fba8309..e23af11 100644 --- a/Webzine.Business/TitreAdminService.cs +++ b/Webzine.Business/TitreAdminService.cs @@ -1,5 +1,7 @@ namespace Webzine.Business; +using Microsoft.Extensions.Logging; + using Webzine.Business.Contracts; using Webzine.Business.Contracts.Dto; using Webzine.Entity; diff --git a/Webzine.Business/Webzine.Business.csproj b/Webzine.Business/Webzine.Business.csproj index ee626b0..8328d31 100644 --- a/Webzine.Business/Webzine.Business.csproj +++ b/Webzine.Business/Webzine.Business.csproj @@ -8,6 +8,7 @@ + all diff --git a/Webzine.Repository.Contracts/ICommentaireRepository.cs b/Webzine.Repository.Contracts/ICommentaireRepository.cs index c87fb9e..add20ef 100644 --- a/Webzine.Repository.Contracts/ICommentaireRepository.cs +++ b/Webzine.Repository.Contracts/ICommentaireRepository.cs @@ -40,5 +40,11 @@ namespace Webzine.Repository.Contracts /// Le nombre maximum de commentaires à récupérer. /// Une collection de commentaires paginée. IEnumerable FindCommentaires(int offset, int limit); + + /// + /// Retourne le nombre total de commentaires dans la source de données. + /// + /// Le nombre total de commentaires. + int Count(); } } \ No newline at end of file diff --git a/Webzine.Repository.Contracts/IStyleRepository.cs b/Webzine.Repository.Contracts/IStyleRepository.cs index 0ea9ba3..56a2f28 100644 --- a/Webzine.Repository.Contracts/IStyleRepository.cs +++ b/Webzine.Repository.Contracts/IStyleRepository.cs @@ -43,5 +43,13 @@ namespace Webzine.Repository.Contracts /// /// Le nombre total de styles présents dans la liste. int Count(); + + /// + /// Recherche les styles dans la liste des styles en fonction de l'offset et de la limite spécifiés, permettant ainsi une pagination des résultats. + /// + /// Le nombre de styles à ignorer avant de commencer à retourner les résultats. + /// Le nombre maximum de styles à retourner. + /// Une collection de styles correspondant au critère de pagination, triée par libellé. + IEnumerable