internal/frontend: add package tab query
If a user searches for #DB, they will always be brought to the symbols
tab. However, if they click on the packages tab from that page, we want
them to see something useful.
As a result, the packages tab now has href set to:
/search?m=package&q=<query-stripped-of-filters.
For golang/go#44142
Change-Id: Iff7f3d8b3f8752a40855b816cc94354b0f7ea93f
Reviewed-on: https://go-review.googlesource.com/c/pkgsite/+/348814
Trust: Julie Qiu <julie@golang.org>
Run-TryBot: Julie Qiu <julie@golang.org>
TryBot-Result: kokoro <noreply+kokoro@google.com>
Reviewed-by: Jonathan Amsterdam <jba@google.com>
diff --git a/internal/frontend/search.go b/internal/frontend/search.go
index dab2666..081a6f3 100644
--- a/internal/frontend/search.go
+++ b/internal/frontend/search.go
@@ -44,8 +44,8 @@
}
ctx := r.Context()
- query, filters := searchQueryAndFilters(r)
- if !utf8.ValidString(query) {
+ cq, filters := searchQueryAndFilters(r)
+ if !utf8.ValidString(cq) {
return &serverError{status: http.StatusBadRequest}
}
if len(filters) > 1 {
@@ -57,7 +57,7 @@
},
}
}
- if len(query) > maxSearchQueryLength {
+ if len(cq) > maxSearchQueryLength {
return &serverError{
status: http.StatusBadRequest,
epage: &errorPage{
@@ -66,7 +66,7 @@
},
}
}
- if query == "" {
+ if cq == "" {
http.Redirect(w, r, "/", http.StatusFound)
return nil
}
@@ -89,7 +89,7 @@
},
}
}
- if path := searchRequestRedirectPath(ctx, ds, query); path != "" {
+ if path := searchRequestRedirectPath(ctx, ds, cq); path != "" {
http.Redirect(w, r, path, http.StatusFound)
return nil
}
@@ -99,11 +99,11 @@
symbol = filters[0]
}
mode := searchMode(r)
- page, err := fetchSearchPage(ctx, db, query, symbol, pageParams, mode == searchModeSymbol, s.getVulnEntries)
+ page, err := fetchSearchPage(ctx, db, cq, symbol, pageParams, mode == searchModeSymbol, s.getVulnEntries)
if err != nil {
- return fmt.Errorf("fetchSearchPage(ctx, db, %q): %v", query, err)
+ return fmt.Errorf("fetchSearchPage(ctx, db, %q): %v", cq, err)
}
- page.basePage = s.newBasePage(r, fmt.Sprintf("%s - Search Results", query))
+ page.basePage = s.newBasePage(r, fmt.Sprintf("%s - Search Results", cq))
page.SearchMode = mode
if s.shouldServeJSON(r) {
return s.serveJSONPage(w, r, page)
@@ -152,6 +152,11 @@
// populate.
type SearchPage struct {
basePage
+
+ // PackageTabQuery is the search query, stripped of any filters.
+ // This is used if the user clicks on the package tab.
+ PackageTabQuery string
+
Pagination pagination
Results []*SearchResult
}
@@ -187,7 +192,7 @@
// fetchSearchPage fetches data matching the search query from the database and
// returns a SearchPage.
-func fetchSearchPage(ctx context.Context, db *postgres.DB, query, symbol string,
+func fetchSearchPage(ctx context.Context, db *postgres.DB, cq, symbol string,
pageParams paginationParams, searchSymbols bool, getVulnEntries vulnEntriesFunc) (*SearchPage, error) {
maxResultCount := maxSearchOffset + pageParams.limit
@@ -196,7 +201,7 @@
// When using search grouping, do pageless search: always start from the beginning.
offset = 0
}
- dbresults, err := db.Search(ctx, query, postgres.SearchOptions{
+ dbresults, err := db.Search(ctx, cq, postgres.SearchOptions{
MaxResults: pageParams.limit,
Offset: offset,
MaxResultCount: maxResultCount,
@@ -234,8 +239,9 @@
pgs := newPagination(pageParams, numPageResults, numResults)
sp := &SearchPage{
- Results: results,
- Pagination: pgs,
+ PackageTabQuery: cq,
+ Results: results,
+ Pagination: pgs,
}
return sp, nil
}
diff --git a/internal/frontend/search_test.go b/internal/frontend/search_test.go
index 5b24f20..de826e2 100644
--- a/internal/frontend/search_test.go
+++ b/internal/frontend/search_test.go
@@ -176,6 +176,7 @@
name: "want expected search page",
query: "foo bar",
wantSearchPage: &SearchPage{
+ PackageTabQuery: "foo bar",
Pagination: pagination{
TotalCount: 1,
ResultCount: 1,
@@ -205,6 +206,7 @@
name: "want only foo search page",
query: "package",
wantSearchPage: &SearchPage{
+ PackageTabQuery: "package",
Pagination: pagination{
TotalCount: 1,
ResultCount: 1,
diff --git a/static/frontend/search/search.tmpl b/static/frontend/search/search.tmpl
index b640197..88031d8 100644
--- a/static/frontend/search/search.tmpl
+++ b/static/frontend/search/search.tmpl
@@ -193,8 +193,12 @@
<div>
<nav class="go-TabNav">
<ul>
- <li {{if not (eq .SearchMode .SearchModeSymbol)}}aria-current="page"{{end}}><a href="{{.Pagination.URL .Pagination.Limit .SearchModePackage .Query}}">Packages</a></li>
- <li {{if eq .SearchMode .SearchModeSymbol}}aria-current="page"{{end}}><a href="{{.Pagination.URL .Pagination.Limit .SearchModeSymbol .Query}}">Symbols</a></li>
+ <li {{if not (eq .SearchMode .SearchModeSymbol)}}aria-current="page"{{end}}>
+ <a href="{{.Pagination.URL .Pagination.Limit .SearchModePackage .PackageTabQuery}}">Packages</a>
+ </li>
+ <li {{if eq .SearchMode .SearchModeSymbol}}aria-current="page"{{end}}>
+ <a href="{{.Pagination.URL .Pagination.Limit .SearchModeSymbol .Query}}">Symbols</a>
+ </li>
</ul>
<hr />
</nav>
diff --git a/tests/search/main.go b/tests/search/main.go
index 41cbba8..ee0a1ba 100755
--- a/tests/search/main.go
+++ b/tests/search/main.go
@@ -117,6 +117,9 @@
return nil, err
}
gotResults := searchPage.Results
+ if strings.ContainsAny(searchPage.PackageTabQuery, "#") {
+ output = append(output, "invalid package tab query, should not contain #: %q", searchPage.PackageTabQuery)
+ }
for i, want := range st.results {
got := &frontend.SearchResult{}
if len(gotResults) > i {