77 lines
1.2 KiB
Go
77 lines
1.2 KiB
Go
|
package models
|
||
|
|
||
|
import (
|
||
|
"net/http"
|
||
|
"strconv"
|
||
|
|
||
|
"git.kirsle.net/apps/gosocial/pkg/log"
|
||
|
)
|
||
|
|
||
|
// Pagination result object.
|
||
|
type Pagination struct {
|
||
|
Page int
|
||
|
PerPage int
|
||
|
Pages int
|
||
|
Total int64
|
||
|
Sort string
|
||
|
}
|
||
|
|
||
|
// Page for Iter.
|
||
|
type Page struct {
|
||
|
Page int
|
||
|
IsCurrent bool
|
||
|
}
|
||
|
|
||
|
// Load the page from form or query parameters.
|
||
|
func (p *Pagination) ParsePage(r *http.Request) {
|
||
|
raw := r.FormValue("page")
|
||
|
a, err := strconv.Atoi(raw)
|
||
|
log.Debug("ParsePage: %s %d err=%s", raw, a, err)
|
||
|
if err == nil {
|
||
|
if a < 0 {
|
||
|
a = 1
|
||
|
}
|
||
|
p.Page = a
|
||
|
log.Warn("set page1=%+v =XXXXX%d", p, a)
|
||
|
}
|
||
|
log.Warn("set page=%+v", p)
|
||
|
}
|
||
|
|
||
|
// Iter the pages, for templates.
|
||
|
func (p *Pagination) Iter() []Page {
|
||
|
var pages = []Page{}
|
||
|
for i := 1; i <= p.Pages; i++ {
|
||
|
pages = append(pages, Page{
|
||
|
Page: i,
|
||
|
IsCurrent: i == p.Page,
|
||
|
})
|
||
|
}
|
||
|
return pages
|
||
|
}
|
||
|
|
||
|
func (p *Pagination) GetOffset() int {
|
||
|
return (p.Page - 1) * p.PerPage
|
||
|
}
|
||
|
|
||
|
func (p *Pagination) HasNext() bool {
|
||
|
return p.Page < p.Pages
|
||
|
}
|
||
|
|
||
|
func (p *Pagination) HasPrevious() bool {
|
||
|
return p.Page > 1
|
||
|
}
|
||
|
|
||
|
func (p *Pagination) Next() int {
|
||
|
if p.Page >= p.Pages {
|
||
|
return p.Pages
|
||
|
}
|
||
|
return p.Page + 1
|
||
|
}
|
||
|
|
||
|
func (p *Pagination) Previous() int {
|
||
|
if p.Page > 1 {
|
||
|
return p.Page - 1
|
||
|
}
|
||
|
return 1
|
||
|
}
|