github.com/kotovmak/go-admin@v1.1.1/plugins/admin/modules/paginator/paginator.go (about)

     1  package paginator
     2  
     3  import (
     4  	"fmt"
     5  	"html/template"
     6  	"math"
     7  	"strconv"
     8  
     9  	"github.com/kotovmak/go-admin/modules/language"
    10  	"github.com/kotovmak/go-admin/plugins/admin/modules/form"
    11  	"github.com/kotovmak/go-admin/plugins/admin/modules/parameter"
    12  	template2 "github.com/kotovmak/go-admin/template"
    13  	"github.com/kotovmak/go-admin/template/components"
    14  	"github.com/kotovmak/go-admin/template/types"
    15  )
    16  
    17  type Config struct {
    18  	Size         int
    19  	Param        parameter.Parameters
    20  	PageSizeList []string
    21  }
    22  
    23  func Get(cfg Config) types.PaginatorAttribute {
    24  
    25  	paginator := template2.Default().Paginator().(*components.PaginatorAttribute)
    26  
    27  	totalPage := int(math.Ceil(float64(cfg.Size) / float64(cfg.Param.PageSizeInt)))
    28  
    29  	if cfg.Param.PageInt == 1 {
    30  		paginator.PreviousClass = "disabled"
    31  		paginator.PreviousUrl = cfg.Param.URLPath
    32  	} else {
    33  		paginator.PreviousClass = ""
    34  		paginator.PreviousUrl = cfg.Param.URLPath + cfg.Param.GetLastPageRouteParamStr(true)
    35  	}
    36  
    37  	if cfg.Param.PageInt == totalPage {
    38  		paginator.NextClass = "disabled"
    39  		paginator.NextUrl = cfg.Param.URLPath
    40  	} else {
    41  		paginator.NextClass = ""
    42  		paginator.NextUrl = cfg.Param.URLPath + cfg.Param.GetNextPageRouteParamStr(true)
    43  	}
    44  	paginator.Url = cfg.Param.URLPath + cfg.Param.GetRouteParamStrWithoutPageSize("1") + "&" + form.NoAnimationKey + "=true"
    45  	paginator.CurPageEndIndex = strconv.Itoa((cfg.Param.PageInt) * cfg.Param.PageSizeInt)
    46  	paginator.CurPageStartIndex = strconv.Itoa((cfg.Param.PageInt-1)*cfg.Param.PageSizeInt + 1)
    47  	paginator.Total = strconv.Itoa(cfg.Size)
    48  
    49  	if len(cfg.PageSizeList) == 0 {
    50  		cfg.PageSizeList = []string{"10", "20", "50", "100"}
    51  	}
    52  
    53  	paginator.Option = make(map[string]template.HTML, len(cfg.PageSizeList))
    54  	for i := 0; i < len(cfg.PageSizeList); i++ {
    55  		paginator.Option[cfg.PageSizeList[i]] = template.HTML("")
    56  	}
    57  
    58  	paginator.Option[cfg.Param.PageSize] = template.HTML("selected")
    59  
    60  	paginator.Pages = []map[string]string{}
    61  
    62  	var pagesArr []map[string]string
    63  
    64  	if totalPage < 10 {
    65  		for i := 1; i < totalPage+1; i++ {
    66  			if i == cfg.Param.PageInt {
    67  				pagesArr = addPageLink(pagesArr, cfg.Param, cfg.Param.PageInt, "active")
    68  			} else {
    69  				pagesArr = addPageLink(pagesArr, cfg.Param, i, "")
    70  			}
    71  		}
    72  	} else {
    73  		if cfg.Param.PageInt < 6 {
    74  			for i := 1; i < totalPage+1; i++ {
    75  
    76  				if i == cfg.Param.PageInt {
    77  					pagesArr = addPageLink(pagesArr, cfg.Param, cfg.Param.PageInt, "active")
    78  				} else {
    79  					pagesArr = addPageLink(pagesArr, cfg.Param, i, "")
    80  				}
    81  
    82  				if i == 6 {
    83  					pagesArr = addPageLink(pagesArr, cfg.Param, i, "split")
    84  					i = totalPage - 2
    85  				}
    86  			}
    87  		} else if cfg.Param.PageInt < totalPage-4 {
    88  			for i := 1; i < totalPage+1; i++ {
    89  
    90  				if i == cfg.Param.PageInt {
    91  					pagesArr = addPageLink(pagesArr, cfg.Param, cfg.Param.PageInt, "active")
    92  				} else {
    93  					pagesArr = addPageLink(pagesArr, cfg.Param, i, "")
    94  				}
    95  
    96  				if i == 2 {
    97  					pagesArr = addPageLink(pagesArr, cfg.Param, i, "split")
    98  					i = cfg.Param.PageInt - 3
    99  				}
   100  
   101  				if i == cfg.Param.PageInt+2 {
   102  					pagesArr = addPageLink(pagesArr, cfg.Param, i, "split")
   103  					i = totalPage - 1
   104  				}
   105  			}
   106  		} else {
   107  			for i := 1; i < totalPage+1; i++ {
   108  
   109  				if i == cfg.Param.PageInt {
   110  					pagesArr = addPageLink(pagesArr, cfg.Param, cfg.Param.PageInt, "active")
   111  				} else {
   112  					pagesArr = addPageLink(pagesArr, cfg.Param, i, "")
   113  				}
   114  
   115  				if i == 2 {
   116  					pagesArr = addPageLink(pagesArr, cfg.Param, i, "split")
   117  					i = totalPage - 6
   118  				}
   119  			}
   120  		}
   121  	}
   122  
   123  	paginator.Pages = pagesArr
   124  
   125  	endNum := paginator.CurPageEndIndex
   126  	if cfg.Size < cfg.Param.PageSizeInt {
   127  		endNum = paginator.Total
   128  	}
   129  
   130  	if cfg.Param.PageInt >= (cfg.Size+cfg.Param.PageSizeInt-1)/cfg.Param.PageSizeInt {
   131  		endNum = paginator.Total
   132  	}
   133  
   134  	paginator.SetEntriesInfo(template.HTML(fmt.Sprintf(language.Get("showing <b>%s</b> to <b>%s</b> of <b>%s</b> entries"),
   135  		paginator.CurPageStartIndex, endNum, paginator.Total)))
   136  
   137  	return paginator.SetPageSizeList(cfg.PageSizeList)
   138  }
   139  
   140  func addPageLink(arr []map[string]string, params parameter.Parameters, page int, active string) []map[string]string {
   141  
   142  	pageStr := strconv.Itoa(page)
   143  	isSplit := "0"
   144  
   145  	if active == "split" {
   146  		isSplit = "1"
   147  		active = ""
   148  		pageStr = ""
   149  	}
   150  
   151  	return append(arr, map[string]string{
   152  		"page":    pageStr,
   153  		"active":  active,
   154  		"isSplit": isSplit,
   155  		"url":     params.URLNoAnimation(pageStr),
   156  	})
   157  }