72 lines
1.4 KiB
Go
72 lines
1.4 KiB
Go
package helpers
|
|
|
|
type Pagination struct {
|
|
PageSize int
|
|
MaxPages int
|
|
CurrentPage int
|
|
Offset int
|
|
Count int
|
|
Pages []int
|
|
}
|
|
|
|
func Paginate(size int, count int, page int) Pagination {
|
|
if size < 1 {
|
|
size = 1
|
|
}
|
|
|
|
if page < 1 {
|
|
page = 1
|
|
}
|
|
|
|
pagination := Pagination{
|
|
PageSize: size,
|
|
CurrentPage: page,
|
|
Count: count,
|
|
MaxPages: 1,
|
|
}
|
|
|
|
if pagination.Count > pagination.PageSize {
|
|
pagination.MaxPages = pagination.Count / pagination.PageSize
|
|
|
|
if pagination.Count%pagination.PageSize > 0 {
|
|
pagination.MaxPages++
|
|
}
|
|
}
|
|
|
|
if pagination.CurrentPage > pagination.MaxPages {
|
|
pagination.CurrentPage = 1
|
|
}
|
|
|
|
pagination.Offset = (pagination.CurrentPage - 1) * pagination.PageSize
|
|
|
|
for i := 1; i <= pagination.MaxPages; i++ {
|
|
|
|
if i == pagination.CurrentPage {
|
|
pagination.Pages = append(pagination.Pages, i)
|
|
continue
|
|
}
|
|
|
|
if i >= (pagination.CurrentPage-2) && i < pagination.CurrentPage {
|
|
pagination.Pages = append(pagination.Pages, i)
|
|
continue
|
|
}
|
|
|
|
if i <= (pagination.CurrentPage+2) && i > pagination.CurrentPage {
|
|
pagination.Pages = append(pagination.Pages, i)
|
|
continue
|
|
}
|
|
|
|
if pagination.CurrentPage <= 2 && i <= 5 {
|
|
pagination.Pages = append(pagination.Pages, i)
|
|
continue
|
|
}
|
|
|
|
if pagination.CurrentPage >= (pagination.MaxPages-2) && i >= (pagination.MaxPages-5) {
|
|
pagination.Pages = append(pagination.Pages, i)
|
|
continue
|
|
}
|
|
|
|
}
|
|
|
|
return pagination
|
|
}
|