Skip to content

Commit eed808f

Browse files
committed
#272 - Paginação no MVC - feature/sp8/#272
1 parent cc2e2c7 commit eed808f

File tree

7 files changed

+70
-8
lines changed

7 files changed

+70
-8
lines changed

src/web/JSE.WebApp.MVC/Controllers/CatalogoController.cs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
using JSE.WebApp.MVC.Controllers;
22
using JSE.WebApp.MVC.Services;
33
using Microsoft.AspNetCore.Mvc;
4+
using Microsoft.AspNetCore.Routing.Constraints;
45

56

67
namespace JSE.WebApp.MVC.Controllers
@@ -17,9 +18,10 @@ public CatalogoController(ICatalogoService catalogoService)
1718
[HttpGet]
1819
[Route("")]
1920
[Route("vitrine")]
20-
public async Task<IActionResult> Index()
21+
public async Task<IActionResult> Index([FromQuery] int ps = 8, [FromQuery] int page = 1, [FromQuery] string q = null)
2122
{
22-
var produtos = await _catalogoService.ObterTodos();
23+
var produtos = await _catalogoService.ObterTodos(ps, page, q);
24+
ViewBag.Pesquisa = q;
2325

2426
return View(produtos);
2527
}
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
namespace JSE.WebApp.MVC.Models
2+
{
3+
public interface IPagedList
4+
{
5+
public string ReferenceAction { get; set; }
6+
public int PageIndex { get; set; }
7+
public int PageSize { get; set; }
8+
public string Query { get; set; }
9+
public int TotalResults { get; set; }
10+
public double TotalPages { get; }
11+
}
12+
}
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
namespace JSE.WebApp.MVC.Models
2+
{
3+
public class PagedViewModel<T> : IPagedList where T : class
4+
{
5+
public string ReferenceAction { get; set; }
6+
public IEnumerable<T> List { get; set; }
7+
public int PageIndex { get; set; }
8+
public int PageSize { get; set; }
9+
public string Query { get; set; }
10+
public int TotalResults { get; set; }
11+
public double TotalPages => Math.Ceiling((double)TotalResults / PageSize);
12+
}
13+
}

src/web/JSE.WebApp.MVC/Services/CatalogoService.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -25,13 +25,13 @@ public async Task<ProdutoViewModel> ObterPorId(Guid id)
2525
return await DeserializarObjetoResponse<ProdutoViewModel>(response);
2626
}
2727

28-
public async Task<IEnumerable<ProdutoViewModel>> ObterTodos()
28+
public async Task<PagedViewModel<ProdutoViewModel>> ObterTodos(int pageSize, int pageIndex, string query = null)
2929
{
30-
var response = await _httpClient.GetAsync("/catalogo/produtos/");
30+
var response = await _httpClient.GetAsync($"/catalogo/produtos?ps={pageSize}&page={pageIndex}&q={query}");
3131

3232
TratarErrosResponse(response);
3333

34-
return await DeserializarObjetoResponse<IEnumerable<ProdutoViewModel>>(response);
34+
return await DeserializarObjetoResponse<PagedViewModel<ProdutoViewModel>>(response);
3535
}
3636
}
3737
}

src/web/JSE.WebApp.MVC/Services/ICatalogoService.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ namespace JSE.WebApp.MVC.Services
44
{
55
public interface ICatalogoService
66
{
7-
Task<IEnumerable<ProdutoViewModel>> ObterTodos();
7+
Task<PagedViewModel<ProdutoViewModel>> ObterTodos(int pageSize, int pageIndex, string query = null);
88
Task<ProdutoViewModel> ObterPorId(Guid id);
99
}
1010
}

src/web/JSE.WebApp.MVC/Views/Catalogo/Index.cshtml

Lines changed: 24 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
@using JSE.WebApp.MVC.Extensions
2-
@model IEnumerable<JSE.WebApp.MVC.Models.ProdutoViewModel>
2+
@model PagedViewModel<ProdutoViewModel>
33

44
@{
55
ViewData["Title"] = "Todos os produtos";
@@ -10,7 +10,7 @@
1010

1111
<div class="row row-cols-1 row-cols-sm-2 row-cols-md-3 g-3">
1212
@{
13-
foreach (var produto in Model.Where(p => p.Ativo).OrderBy(p => p.Nome))
13+
foreach (var produto in Model.List.Where(p => p.Ativo).OrderBy(p => p.Nome))
1414
{
1515

1616
<div class="col">
@@ -43,5 +43,27 @@
4343
}
4444

4545
</div>
46+
47+
<nav aria-label="...">
48+
<ul class="pagination">
49+
@{
50+
for (var i = 1; i < Model.TotalPages + 1; i++)
51+
{
52+
if (i == Model.PageIndex)
53+
{
54+
<li class="page-item active">
55+
<a class="page-link" asp-action="Index" asp-route-ps="@Model.PageSize" asp-route-page="@i" asp-route-q="@Model.Query">@i</a>
56+
</li>
57+
}
58+
else
59+
{
60+
<li class="page-item">
61+
<a class="page-link" asp-action="Index" asp-route-ps="@Model.PageSize" asp-route-page="@i" asp-route-q="@Model.Query">@i</a>
62+
</li>
63+
}
64+
}
65+
}
66+
</ul>
67+
</nav>
4668
</div>
4769
</div>

src/web/JSE.WebApp.MVC/Views/Shared/_Layout.cshtml

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,19 @@
5050
<button type="button" class="btn-close" data-bs-dismiss="offcanvas" aria-label="Close"></button>
5151
</div>
5252

53+
<div class="col-lg-5 col-sm-12">
54+
<form method="get" asp-controller="Catalogo" asp-action="Index" class="search">
55+
<div class="input-group w-100">
56+
<input type="text" id="q" name="q" class="form-control" value="@ViewBag.Pesquisa" placeholder="O que você está procurando?">
57+
<div class="input-group-append">
58+
<button class="btn btn-primary" type="submit">
59+
<i class="fa fa-search"></i>
60+
</button>
61+
</div>
62+
</div>
63+
</form>
64+
</div>
65+
5366
<div class="offcanvas-header nav border-top px-0 py-3 mt-3 d-md-none">
5467
<a class="nav-link justify-content-center w-100" href="">
5568
<i class="ci-user fs-lg opacity-60 ms-n2 me-2"></i>

0 commit comments

Comments
 (0)