From fdfad2f9e1caf9e8926658a304d73d3e573a0985 Mon Sep 17 00:00:00 2001 From: Tigor Hutasuhut Date: Sun, 12 May 2024 22:45:41 +0700 Subject: [PATCH] pagination: implemented seek page feature --- views/components/image_card.templ | 4 +- views/components/pagination.templ | 127 +++++++++++++++++++++++++++--- views/context.go | 13 +++ 3 files changed, 130 insertions(+), 14 deletions(-) diff --git a/views/components/image_card.templ b/views/components/image_card.templ index 78dd5fb..d434534 100644 --- a/views/components/image_card.templ +++ b/views/components/image_card.templ @@ -71,8 +71,8 @@ templ ImageCard(data *models.Image, opts ImageCardOption) {

{ formatByteSize(data.ImageSize) }

if data.R.Device != nil && !opts.Has(HideDevice) { - -
{ data.R.Device.Name }
+
+
{ data.R.Device.Name }
} diff --git a/views/components/pagination.templ b/views/components/pagination.templ index 5ca2a37..14235ac 100644 --- a/views/components/pagination.templ +++ b/views/components/pagination.templ @@ -4,28 +4,131 @@ import "github.com/tigorlazuardi/redmage/views" import "strconv" import "github.com/tigorlazuardi/redmage/views/utils" import "strings" +import "fmt" type PaginationData struct { - Offset int64 - Limit int64 - BaseURL string - Total int64 - Classes []string + Offset int64 + Limit int64 + BaseURL string + Total int64 + Classes []string + UnhideRange int +} + +type pageStatus int + +const ( + pageStatusShow = iota + pageStatusHidden + pageStatusDot +) + +func (pgdata PaginationData) GetUnhideRange() int { + if pgdata.UnhideRange < 1 { + return 2 + } + return pgdata.UnhideRange +} + +func (pgdata PaginationData) getPageStatus(page int) pageStatus { + if page < 2 { + return pageStatusShow + } + lastPage := (pgdata.Total / max(pgdata.Limit, 1)) + 1 + if page == int(lastPage) { + return pageStatusShow + } + current := pgdata.GetCurrentPage() + unhideRange := pgdata.GetUnhideRange() + if page == current-unhideRange-1 { + return pageStatusDot + } + if page == current+unhideRange+1 { + return pageStatusDot + } + if page >= current-unhideRange && page <= current+unhideRange { + return pageStatusShow + } + + return pageStatusHidden +} + +func (pgdata PaginationData) GetCurrentPage() int { + return int(pgdata.Offset/pgdata.Limit) + 1 +} + +func (pgdata PaginationData) GetTotalPage() int { + return int(pgdata.Total/max(pgdata.Limit, 1)) + 1 } templ Pagination(c *views.Context, data PaginationData) { if data.Total > data.Limit { -
- for i, count := 1, int64(0); count < data.Total; i, count = i+1, count+data.Limit { - + + + +
} } diff --git a/views/context.go b/views/context.go index d8f4dda..4afb4ea 100644 --- a/views/context.go +++ b/views/context.go @@ -1,6 +1,7 @@ package views import ( + "encoding/json" "fmt" "net/http" "net/url" @@ -35,6 +36,18 @@ func (c *Context) URLWithExtraQuery(baseUrl string, extraKeyValues ...string) te return templ.SafeURL(fmt.Sprintf("%s?%s", baseUrl, query.Encode())) } +func (c *Context) JSONQuery() string { + m := make(map[string]string, len(c.Query)) + for k := range c.Query { + v := c.Query.Get(k) + if v != "" { + m[k] = v + } + } + v, _ := json.Marshal(m) + return string(v) +} + func NewContext(config *config.Config, request *http.Request) *Context { return &Context{ Config: config,