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 }