an updated and hopefully faster version of the ST Toolbox
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

88 lines
1.9 KiB

package utils
import (
"math"
)
// Default pagination constants
const (
DefaultPage = 1
DefaultPageSize = 5
MaxPageSize = 100
)
// PaginationInfo contains all the information needed for pagination
type PaginationInfo struct {
TotalResults int
TotalPages int
CurrentPage int
Limit int
StartIndex int
EndIndex int
StartPage int
EndPage int
}
// CalculatePagination calculates pagination information based on total results, current page, and limit
func CalculatePagination(totalResults, currentPage, limit int) PaginationInfo {
if currentPage < 1 {
currentPage = 1
}
if limit < 1 {
limit = DefaultPageSize
}
totalPages := int(math.Ceil(float64(totalResults) / float64(limit)))
if totalPages < 1 {
totalPages = 1
}
// Ensure current page is within bounds
if currentPage > totalPages {
currentPage = totalPages
}
startIndex := (currentPage - 1) * limit
endIndex := startIndex + limit
if endIndex > totalResults {
endIndex = totalResults
}
// Calculate pagination range for display
startPage := 1
endPage := totalPages
// Show up to 10 page numbers, centered around current page when possible
if totalPages > 10 {
if currentPage <= 5 {
endPage = 10
} else if currentPage >= totalPages-4 {
startPage = totalPages - 9
} else {
startPage = currentPage - 4
endPage = currentPage + 5
}
}
return PaginationInfo{
TotalResults: totalResults,
TotalPages: totalPages,
CurrentPage: currentPage,
Limit: limit,
StartIndex: startIndex + 1, // Convert to 1-based for display
EndIndex: endIndex,
StartPage: startPage,
EndPage: endPage,
}
}
// GetPageResults extracts the results for the current page from a slice
func GetPageResults[T any](allResults []T, startIndex, endIndex int) []T {
if startIndex >= len(allResults) {
return []T{}
}
if endIndex > len(allResults) {
endIndex = len(allResults)
}
return allResults[startIndex:endIndex]
}