From 2dc39aff32af64337f9f43e06cc32b15df1ffe01 Mon Sep 17 00:00:00 2001 From: Thomas Karpiniec Date: Wed, 11 Feb 2026 20:40:46 +1100 Subject: [PATCH] appview: update tab counts to reflect search filters When searching issues or pulls with filters, the open/closed tab counts were showing unfiltered repo totals. Run per-state count queries when a search is active and update RepoInfo.Stats before rendering. Based on a fix by Patrick Dewey (pdewey.com) for issue #400. Signed-off-by: Thomas Karpiniec --- appview/issues/issues.go | 16 +++++++++++++++- appview/pulls/pulls.go | 20 ++++++++++++++++++++ 2 files changed, 35 insertions(+), 1 deletion(-) diff --git a/appview/issues/issues.go b/appview/issues/issues.go index 3f394916..a4415cd6 100644 --- a/appview/issues/issues.go +++ b/appview/issues/issues.go @@ -892,6 +892,8 @@ func (rp *Issues) RepoIssues(w http.ResponseWriter, r *http.Request) { totalIssues = f.RepoStats.IssueCount.Closed } + repoInfo := rp.repoResolver.GetRepoInfo(r, user) + var issues []models.Issue if searchOpts.HasSearchFilters() { @@ -903,6 +905,18 @@ func (rp *Issues) RepoIssues(w http.ResponseWriter, r *http.Request) { l.Debug("searched issues with indexer", "count", len(res.Hits)) totalIssues = int(res.Total) + // update tab counts to reflect filtered results + countOpts := searchOpts + countOpts.Page = pagination.Page{Limit: 1} + countOpts.IsOpen = ptrBool(true) + if openRes, err := rp.indexer.Search(r.Context(), countOpts); err == nil { + repoInfo.Stats.IssueCount.Open = int(openRes.Total) + } + countOpts.IsOpen = ptrBool(false) + if closedRes, err := rp.indexer.Search(r.Context(), countOpts); err == nil { + repoInfo.Stats.IssueCount.Closed = int(closedRes.Total) + } + if len(res.Hits) > 0 { issues, err = db.GetIssues( rp.db, @@ -964,7 +978,7 @@ func (rp *Issues) RepoIssues(w http.ResponseWriter, r *http.Request) { rp.pages.RepoIssues(w, pages.RepoIssuesParams{ LoggedInUser: rp.oauth.GetMultiAccountUser(r), - RepoInfo: rp.repoResolver.GetRepoInfo(r, user), + RepoInfo: repoInfo, Issues: issues, IssueCount: totalIssues, LabelDefs: defs, diff --git a/appview/pulls/pulls.go b/appview/pulls/pulls.go index 37fcd677..4f554d43 100644 --- a/appview/pulls/pulls.go +++ b/appview/pulls/pulls.go @@ -643,6 +643,26 @@ func (s *Pulls) RepoPulls(w http.ResponseWriter, r *http.Request) { totalPulls = int(res.Total) l.Debug("searched pulls with indexer", "count", len(res.Hits)) + // update tab counts to reflect filtered results + countOpts := searchOpts + countOpts.Page = pagination.Page{Limit: 1} + for _, ps := range []models.PullState{models.PullOpen, models.PullMerged, models.PullClosed} { + ps := ps + countOpts.State = &ps + countRes, err := s.indexer.Search(r.Context(), countOpts) + if err != nil { + continue + } + switch ps { + case models.PullOpen: + repoInfo.Stats.PullCount.Open = int(countRes.Total) + case models.PullMerged: + repoInfo.Stats.PullCount.Merged = int(countRes.Total) + case models.PullClosed: + repoInfo.Stats.PullCount.Closed = int(countRes.Total) + } + } + if len(res.Hits) > 0 { pulls, err = db.GetPulls( s.db, -- 2.51.2