From 1f258ea17e6f83a5b4a03bdc0594cc329010d710 Mon Sep 17 00:00:00 2001 From: mikestefanello Date: Fri, 3 Dec 2021 07:20:01 -0500 Subject: [PATCH] Added pager. --- controllers/page.go | 7 ++++++ pager/pager.go | 56 +++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 63 insertions(+) create mode 100644 pager/pager.go diff --git a/controllers/page.go b/controllers/page.go index e2631d1..b438583 100644 --- a/controllers/page.go +++ b/controllers/page.go @@ -5,10 +5,15 @@ import ( "net/http" "goweb/msg" + "goweb/pager" "github.com/labstack/echo/v4" ) +const ( + DefaultItemsPerPage = 20 +) + type Page struct { AppName string Title string @@ -25,6 +30,7 @@ type Page struct { Description string Keywords []string } + Pager pager.Pager } func NewPage(c echo.Context) Page { @@ -33,6 +39,7 @@ func NewPage(c echo.Context) Page { Reverse: c.Echo().Reverse, Path: c.Request().URL.Path, StatusCode: http.StatusOK, + Pager: pager.NewPager(c, DefaultItemsPerPage), } p.IsHome = p.Path == "/" diff --git a/pager/pager.go b/pager/pager.go new file mode 100644 index 0000000..d9b87ef --- /dev/null +++ b/pager/pager.go @@ -0,0 +1,56 @@ +package pager + +import ( + "math" + "strconv" + + "github.com/labstack/echo/v4" +) + +type Pager struct { + Items int + Page int + ItemsPerPage int + Pages int +} + +func NewPager(c echo.Context, itemsPerPage int) Pager { + p := Pager{ + ItemsPerPage: itemsPerPage, + Page: 1, + } + + if page := c.QueryParam("page"); page != "" { + if pageInt, err := strconv.Atoi(page); err != nil { + if pageInt > 0 { + p.Page = pageInt + } + } + } + + return p +} + +func (p *Pager) SetItems(items int) { + p.Items = items + p.Pages = int(math.Ceil(float64(items) / float64(p.ItemsPerPage))) + + if p.Page > p.Pages { + p.Page = p.Pages + } +} + +func (p *Pager) IsBeginning() bool { + return p.Page == 1 +} + +func (p *Pager) IsEnd() bool { + return p.Page >= p.Pages +} + +func (p *Pager) GetOffset() int { + if p.Page == 0 { + p.Page = 1 + } + return (p.Page - 1) * p.ItemsPerPage +}