Monorepo for Tangled

appview/pulls: add pagination to pull requests listing

Add offset-based pagination to the pulls page, matching the issues behavior

Signed-off-by: moshyfawn <email@moshyfawn.dev>
Signed-off-by: Seongmin Lee <git@boltless.me>

authored by

moshyfawn and committed by tangled.org 2403bf5e b480d950

+26 -5
+2
appview/pages/pages.go
··· 1069 Stacks map[string]models.Stack 1070 Pipelines map[string]models.Pipeline 1071 LabelDefs map[string]*models.LabelDefinition 1072 } 1073 1074 func (p *Pages) RepoPulls(w io.Writer, params RepoPullsParams) error {
··· 1069 Stacks map[string]models.Stack 1070 Pipelines map[string]models.Pipeline 1071 LabelDefs map[string]*models.LabelDefinition 1072 + Page pagination.Page 1073 + PullCount int 1074 } 1075 1076 func (p *Pages) RepoPulls(w io.Writer, params RepoPullsParams) error {
+8
appview/pages/templates/repo/pulls/pulls.html
··· 170 </div> 171 {{ end }} 172 </div> 173 {{ end }} 174 175 {{ define "stackedPullList" }}
··· 170 </div> 171 {{ end }} 172 </div> 173 + {{if gt .PullCount .Page.Limit }} 174 + {{ template "fragments/pagination" (dict 175 + "Page" .Page 176 + "TotalCount" .PullCount 177 + "BasePath" (printf "/%s/pulls" .RepoInfo.FullName) 178 + "QueryParams" (printf "state=%s&q=%s" .FilteringBy.String .FilterQuery) 179 + ) }} 180 + {{ end }} 181 {{ end }} 182 183 {{ define "stackedPullList" }}
+15 -4
appview/pulls/pulls.go
··· 567 state = models.PullMerged 568 } 569 570 f, err := s.repoResolver.Resolve(r) 571 if err != nil { 572 log.Println("failed to get repo and knot", err) 573 return 574 } 575 576 - keyword := params.Get("q") 577 578 - page := pagination.Page{ 579 - Limit: 99999, 580 - } 581 582 var pulls []*models.Pull 583 searchOpts := models.PullSearchOptions{ ··· 593 l.Error("failed to search for pulls", "err", err) 594 return 595 } 596 l.Debug("searched pulls with indexer", "count", len(res.Hits)) 597 598 pulls, err = db.GetPulls( ··· 700 FilterQuery: keyword, 701 Stacks: stacks, 702 Pipelines: m, 703 }) 704 } 705
··· 567 state = models.PullMerged 568 } 569 570 + page := pagination.FromContext(r.Context()) 571 + 572 f, err := s.repoResolver.Resolve(r) 573 if err != nil { 574 log.Println("failed to get repo and knot", err) 575 return 576 } 577 578 + var totalPulls int 579 + switch state { 580 + case models.PullOpen: 581 + totalPulls = f.RepoStats.PullCount.Open 582 + case models.PullMerged: 583 + totalPulls = f.RepoStats.PullCount.Merged 584 + case models.PullClosed: 585 + totalPulls = f.RepoStats.PullCount.Closed 586 + } 587 588 + keyword := params.Get("q") 589 590 var pulls []*models.Pull 591 searchOpts := models.PullSearchOptions{ ··· 601 l.Error("failed to search for pulls", "err", err) 602 return 603 } 604 + totalPulls = int(res.Total) 605 l.Debug("searched pulls with indexer", "count", len(res.Hits)) 606 607 pulls, err = db.GetPulls( ··· 709 FilterQuery: keyword, 710 Stacks: stacks, 711 Pipelines: m, 712 + Page: page, 713 + PullCount: totalPulls, 714 }) 715 } 716
+1 -1
appview/pulls/router.go
··· 9 10 func (s *Pulls) Router(mw *middleware.Middleware) http.Handler { 11 r := chi.NewRouter() 12 - r.Get("/", s.RepoPulls) 13 r.With(middleware.AuthMiddleware(s.oauth)).Route("/new", func(r chi.Router) { 14 r.Get("/", s.NewPull) 15 r.Get("/patch-upload", s.PatchUploadFragment)
··· 9 10 func (s *Pulls) Router(mw *middleware.Middleware) http.Handler { 11 r := chi.NewRouter() 12 + r.With(middleware.Paginate).Get("/", s.RepoPulls) 13 r.With(middleware.AuthMiddleware(s.oauth)).Route("/new", func(r chi.Router) { 14 r.Get("/", s.NewPull) 15 r.Get("/patch-upload", s.PatchUploadFragment)