Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Unifies pagination template usage (#6531) #6533

Merged
merged 10 commits into from Apr 20, 2019
20 changes: 10 additions & 10 deletions modules/context/api.go
Expand Up @@ -19,8 +19,7 @@ import (
"code.gitea.io/gitea/modules/log"
"code.gitea.io/gitea/modules/setting"

"github.com/Unknwon/paginater"
macaron "gopkg.in/macaron.v1"
"gopkg.in/macaron.v1"
)

// APIContext is a specific macaron context for API service
Expand Down Expand Up @@ -83,19 +82,20 @@ func (ctx *APIContext) Error(status int, title string, obj interface{}) {

// SetLinkHeader sets pagination link header by given total number and page size.
func (ctx *APIContext) SetLinkHeader(total, pageSize int) {
page := paginater.New(total, pageSize, ctx.QueryInt("page"), 0)
page := NewPagination(total, pageSize, ctx.QueryInt("page"), 0)
paginater := page.Paginater
links := make([]string, 0, 4)
if page.HasNext() {
links = append(links, fmt.Sprintf("<%s%s?page=%d>; rel=\"next\"", setting.AppURL, ctx.Req.URL.Path[1:], page.Next()))
if paginater.HasNext() {
links = append(links, fmt.Sprintf("<%s%s?page=%d>; rel=\"next\"", setting.AppURL, ctx.Req.URL.Path[1:], paginater.Next()))
}
if !page.IsLast() {
links = append(links, fmt.Sprintf("<%s%s?page=%d>; rel=\"last\"", setting.AppURL, ctx.Req.URL.Path[1:], page.TotalPages()))
if !paginater.IsLast() {
links = append(links, fmt.Sprintf("<%s%s?page=%d>; rel=\"last\"", setting.AppURL, ctx.Req.URL.Path[1:], paginater.TotalPages()))
}
if !page.IsFirst() {
if !paginater.IsFirst() {
links = append(links, fmt.Sprintf("<%s%s?page=1>; rel=\"first\"", setting.AppURL, ctx.Req.URL.Path[1:]))
}
if page.HasPrevious() {
links = append(links, fmt.Sprintf("<%s%s?page=%d>; rel=\"prev\"", setting.AppURL, ctx.Req.URL.Path[1:], page.Previous()))
if paginater.HasPrevious() {
links = append(links, fmt.Sprintf("<%s%s?page=%d>; rel=\"prev\"", setting.AppURL, ctx.Req.URL.Path[1:], paginater.Previous()))
}

if len(links) > 0 {
Expand Down
50 changes: 50 additions & 0 deletions modules/context/pagination.go
@@ -0,0 +1,50 @@
// Copyright 2019 The Gitea Authors. All rights reserved.
// Use of this source code is governed by a MIT-style
// license that can be found in the LICENSE file.

package context
saitho marked this conversation as resolved.
Show resolved Hide resolved

import (
"fmt"
"html/template"
"net/url"
"strings"

"github.com/Unknwon/paginater"
)

// Pagination provides a pagination via Paginater and additional configurations for the link params used in rendering
type Pagination struct {
Paginater *paginater.Paginater
urlParams []string
}

// NewPagination creates a new instance of the Pagination struct
func NewPagination(total int, page int, issueNum int, numPages int) *Pagination {
p := &Pagination{}
p.Paginater = paginater.New(total, page, issueNum, numPages)
return p
}

// AddParam adds a value from context identified by ctxKey as link param under a given paramKey
func (p *Pagination) AddParam(ctx *Context, paramKey string, ctxKey string) {
_, exists := ctx.Data[ctxKey]
if !exists {
return
}
paramData := fmt.Sprintf("%v", ctx.Data[ctxKey]) // cast interface{} to string
urlParam := fmt.Sprintf("%s=%v", url.QueryEscape(paramKey), url.QueryEscape(paramData))
p.urlParams = append(p.urlParams, urlParam)
}

// GetParams returns the configured URL params
func (p *Pagination) GetParams() template.URL {
return template.URL(strings.Join(p.urlParams[:], "&"))
}

// SetDefaultParams sets common pagination params that are often used
func (p *Pagination) SetDefaultParams(ctx *Context) {
p.AddParam(ctx, "sort", "SortType")
p.AddParam(ctx, "q", "Keyword")
p.AddParam(ctx, "tab", "TabName")
}
10 changes: 6 additions & 4 deletions routers/admin/notice.go
@@ -1,18 +1,18 @@
// Copyright 2014 The Gogs Authors. All rights reserved.
// Copyright 2019 The Gitea Authors. All rights reserved.
// Use of this source code is governed by a MIT-style
// license that can be found in the LICENSE file.

package admin
saitho marked this conversation as resolved.
Show resolved Hide resolved

import (
"github.com/Unknwon/com"
"github.com/Unknwon/paginater"

"code.gitea.io/gitea/models"
"code.gitea.io/gitea/modules/base"
"code.gitea.io/gitea/modules/context"
"code.gitea.io/gitea/modules/log"
"code.gitea.io/gitea/modules/setting"

"github.com/Unknwon/com"
saitho marked this conversation as resolved.
Show resolved Hide resolved
)

const (
Expand All @@ -30,7 +30,6 @@ func Notices(ctx *context.Context) {
if page <= 1 {
page = 1
}
ctx.Data["Page"] = paginater.New(int(total), setting.UI.Admin.NoticePagingNum, page, 5)

notices, err := models.Notices(page, setting.UI.Admin.NoticePagingNum)
if err != nil {
Expand All @@ -40,6 +39,9 @@ func Notices(ctx *context.Context) {
ctx.Data["Notices"] = notices

ctx.Data["Total"] = total

ctx.Data["Page"] = context.NewPagination(int(total), setting.UI.Admin.NoticePagingNum, page, 5)

ctx.HTML(200, tplNotices)
}

Expand Down
19 changes: 13 additions & 6 deletions routers/home.go
Expand Up @@ -17,8 +17,6 @@ import (
"code.gitea.io/gitea/modules/setting"
"code.gitea.io/gitea/modules/util"
"code.gitea.io/gitea/routers/user"

"github.com/Unknwon/paginater"
)

const (
Expand Down Expand Up @@ -151,10 +149,13 @@ func RenderRepoSearch(ctx *context.Context, opts *RepoSearchOptions) {
}
ctx.Data["Keyword"] = keyword
ctx.Data["Total"] = count
ctx.Data["Page"] = paginater.New(int(count), opts.PageSize, page, 5)
ctx.Data["Repos"] = repos
ctx.Data["IsRepoIndexerEnabled"] = setting.Indexer.RepoIndexerEnabled

pager := context.NewPagination(int(count), opts.PageSize, page, 5)
pager.SetDefaultParams(ctx)
ctx.Data["Page"] = pager

ctx.HTML(200, opts.TplName)
}

Expand Down Expand Up @@ -222,11 +223,14 @@ func RenderUserSearch(ctx *context.Context, opts *models.SearchUserOptions, tplN
}
ctx.Data["Keyword"] = opts.Keyword
ctx.Data["Total"] = count
ctx.Data["Page"] = paginater.New(int(count), opts.PageSize, opts.Page, 5)
ctx.Data["Users"] = users
ctx.Data["ShowUserEmail"] = setting.UI.ShowUserEmail
ctx.Data["IsRepoIndexerEnabled"] = setting.Indexer.RepoIndexerEnabled

pager := context.NewPagination(int(count), opts.PageSize, opts.Page, 5)
pager.SetDefaultParams(ctx)
ctx.Data["Page"] = pager

ctx.HTML(200, tplName)
}

Expand Down Expand Up @@ -364,11 +368,14 @@ func ExploreCode(ctx *context.Context) {
}

ctx.Data["Keyword"] = keyword
pager := paginater.New(total, setting.UI.RepoSearchPagingNum, page, 5)
ctx.Data["Page"] = pager
ctx.Data["SearchResults"] = searchResults
ctx.Data["RequireHighlightJS"] = true
ctx.Data["PageIsViewCode"] = true

pager := context.NewPagination(total, setting.UI.RepoSearchPagingNum, page, 5)
pager.SetDefaultParams(ctx)
ctx.Data["Page"] = pager

ctx.HTML(200, tplExploreCode)
}

Expand Down
15 changes: 11 additions & 4 deletions routers/repo/commit.go
@@ -1,4 +1,5 @@
// Copyright 2014 The Gogs Authors. All rights reserved.
// Copyright 2019 The Gitea Authors. All rights reserved.
// Use of this source code is governed by a MIT-style
// license that can be found in the LICENSE file.

Expand All @@ -14,8 +15,6 @@ import (
"code.gitea.io/gitea/modules/git"
"code.gitea.io/gitea/modules/log"
saitho marked this conversation as resolved.
Show resolved Hide resolved
"code.gitea.io/gitea/modules/setting"

"github.com/Unknwon/paginater"
)

const (
Expand Down Expand Up @@ -55,7 +54,6 @@ func Commits(ctx *context.Context) {
if page <= 1 {
page = 1
}
ctx.Data["Page"] = paginater.New(int(commitsCount), git.CommitsRangeSize, page, 5)

// Both `git log branchName` and `git log commitId` work.
commits, err := ctx.Repo.Commit.CommitsByRange(page)
Expand All @@ -72,6 +70,11 @@ func Commits(ctx *context.Context) {
ctx.Data["Reponame"] = ctx.Repo.Repository.Name
ctx.Data["CommitCount"] = commitsCount
ctx.Data["Branch"] = ctx.Repo.BranchName

pager := context.NewPagination(int(commitsCount), git.CommitsRangeSize, page, 5)
pager.SetDefaultParams(ctx)
ctx.Data["Page"] = pager

ctx.HTML(200, tplCommits)
}

Expand Down Expand Up @@ -160,7 +163,6 @@ func FileHistory(ctx *context.Context) {
if page <= 1 {
page = 1
}
ctx.Data["Page"] = paginater.New(int(commitsCount), git.CommitsRangeSize, page, 5)

commits, err := ctx.Repo.GitRepo.CommitsByFileAndRange(branchName, fileName, page)
if err != nil {
Expand All @@ -177,6 +179,11 @@ func FileHistory(ctx *context.Context) {
ctx.Data["FileName"] = fileName
ctx.Data["CommitCount"] = commitsCount
ctx.Data["Branch"] = branchName

pager := context.NewPagination(int(commitsCount), git.CommitsRangeSize, page, 5)
pager.SetDefaultParams(ctx)
ctx.Data["Page"] = pager

ctx.HTML(200, tplCommits)
}

Expand Down
15 changes: 11 additions & 4 deletions routers/repo/issue.go
Expand Up @@ -27,7 +27,6 @@ import (
"code.gitea.io/gitea/modules/util"

"github.com/Unknwon/com"
"github.com/Unknwon/paginater"
)

const (
Expand Down Expand Up @@ -186,8 +185,7 @@ func issues(ctx *context.Context, milestoneID int64, isPullOption util.OptionalB
} else {
total = int(issueStats.ClosedCount)
}
pager := paginater.New(total, setting.UI.IssuePagingNum, page, 5)
ctx.Data["Page"] = pager
pager := context.NewPagination(total, setting.UI.IssuePagingNum, page, 5)

var issues []*models.Issue
if forceEmpty {
Expand All @@ -199,7 +197,7 @@ func issues(ctx *context.Context, milestoneID int64, isPullOption util.OptionalB
PosterID: posterID,
MentionedID: mentionedID,
MilestoneID: milestoneID,
Page: pager.Current(),
Page: pager.Paginater.Current(),
PageSize: setting.UI.IssuePagingNum,
IsClosed: util.OptionalBoolOf(isShowClosed),
IsPull: isPullOption,
Expand Down Expand Up @@ -268,6 +266,15 @@ func issues(ctx *context.Context, milestoneID int64, isPullOption util.OptionalB
} else {
ctx.Data["State"] = "open"
}

pager.AddParam(ctx, "q", "Keyword")
pager.AddParam(ctx, "type", "ViewType")
pager.AddParam(ctx, "sort", "SortType")
pager.AddParam(ctx, "state", "State")
pager.AddParam(ctx, "labels", "SelectLabels")
pager.AddParam(ctx, "milestone", "MilestoneID")
pager.AddParam(ctx, "assignee", "AssigneeID")
ctx.Data["Page"] = pager
}

// Issues render issues page
Expand Down
7 changes: 5 additions & 2 deletions routers/repo/milestone.go
Expand Up @@ -14,7 +14,6 @@ import (
"code.gitea.io/gitea/modules/markup/markdown"
"code.gitea.io/gitea/modules/setting"
"code.gitea.io/gitea/modules/util"
"github.com/Unknwon/paginater"
)

const (
Expand Down Expand Up @@ -51,7 +50,6 @@ func Milestones(ctx *context.Context) {
} else {
total = int(closedCount)
}
ctx.Data["Page"] = paginater.New(total, setting.UI.IssuePagingNum, page, 5)

miles, err := models.GetMilestones(ctx.Repo.Repository.ID, page, isShowClosed, sortType)
if err != nil {
Expand All @@ -77,6 +75,11 @@ func Milestones(ctx *context.Context) {

ctx.Data["SortType"] = sortType
ctx.Data["IsShowClosed"] = isShowClosed

pager := context.NewPagination(total, setting.UI.IssuePagingNum, page, 5)
pager.AddParam(ctx, "state", "State")
ctx.Data["Page"] = pager

ctx.HTML(200, tplMilestone)
}

Expand Down
9 changes: 5 additions & 4 deletions routers/repo/release.go
Expand Up @@ -15,8 +15,6 @@ import (
"code.gitea.io/gitea/modules/log"
"code.gitea.io/gitea/modules/markup/markdown"
"code.gitea.io/gitea/modules/setting"

"github.com/Unknwon/paginater"
)

const (
Expand Down Expand Up @@ -120,9 +118,12 @@ func Releases(ctx *context.Context) {
r.Note = markdown.RenderString(r.Note, ctx.Repo.RepoLink, ctx.Repo.Repository.ComposeMetas())
}

pager := paginater.New(int(count), limit, page, 5)
ctx.Data["Page"] = pager
ctx.Data["Releases"] = releases

pager := context.NewPagination(int(count), limit, page, 5)
pager.SetDefaultParams(ctx)
ctx.Data["Page"] = pager

ctx.HTML(200, tplReleases)
}

Expand Down
9 changes: 5 additions & 4 deletions routers/repo/search.go
Expand Up @@ -12,8 +12,6 @@ import (
"code.gitea.io/gitea/modules/context"
"code.gitea.io/gitea/modules/search"
"code.gitea.io/gitea/modules/setting"

"github.com/Unknwon/paginater"
)

const tplSearch base.TplName = "repo/search"
Expand All @@ -36,12 +34,15 @@ func Search(ctx *context.Context) {
return
}
ctx.Data["Keyword"] = keyword
pager := paginater.New(total, setting.UI.RepoSearchPagingNum, page, 5)
ctx.Data["Page"] = pager
ctx.Data["SourcePath"] = setting.AppSubURL + "/" +
path.Join(ctx.Repo.Repository.Owner.Name, ctx.Repo.Repository.Name, "src", "branch", ctx.Repo.Repository.DefaultBranch)
ctx.Data["SearchResults"] = searchResults
ctx.Data["RequireHighlightJS"] = true
ctx.Data["PageIsViewCode"] = true

pager := context.NewPagination(total, setting.UI.RepoSearchPagingNum, page, 5)
pager.SetDefaultParams(ctx)
ctx.Data["Page"] = pager

ctx.HTML(200, tplSearch)
}
7 changes: 3 additions & 4 deletions routers/repo/view.go
Expand Up @@ -24,8 +24,6 @@ import (
"code.gitea.io/gitea/modules/markup"
"code.gitea.io/gitea/modules/setting"
"code.gitea.io/gitea/modules/templates"

"github.com/Unknwon/paginater"
)

const (
Expand Down Expand Up @@ -462,10 +460,10 @@ func RenderUserCards(ctx *context.Context, total int, getter func(page int) ([]*
if page <= 0 {
page = 1
}
pager := paginater.New(total, models.ItemsPerPage, page, 5)
pager := context.NewPagination(total, models.ItemsPerPage, page, 5)
ctx.Data["Page"] = pager

items, err := getter(pager.Current())
items, err := getter(pager.Paginater.Current())
if err != nil {
ctx.ServerError("getter", err)
return
Expand All @@ -480,6 +478,7 @@ func Watchers(ctx *context.Context) {
ctx.Data["Title"] = ctx.Tr("repo.watchers")
ctx.Data["CardsTitle"] = ctx.Tr("repo.watchers")
ctx.Data["PageIsWatchers"] = true

RenderUserCards(ctx, ctx.Repo.Repository.NumWatches, ctx.Repo.Repository.GetWatchers, tplWatchers)
}

Expand Down