all repos — searchix @ 342121cc03e7ecb8ce68fd445dbf4a60fddf7a52

Search engine for NixOS, nix-darwin, home-manager and NUR users

feat: Handle returning to scoped importer search page

Kaya
commit

342121cc03e7ecb8ce68fd445dbf4a60fddf7a52

parent

18eab011a18b9fd42d797635d47bec93fbf212b8

M frontend/static/search.jsfrontend/static/search.js
@@ -239,8 +239,10 @@ dialog.addEventListener("close", function () {
detailsRange.deleteContents(); if (closedByPopstate) { closedByPopstate = false; - } else if (history.state?.detail) { - pageHistory.restore(history.state); + } else { + if (history.state?.detail) { + pageHistory.restore(history.state); + } pageHistory.push(pageHistory.state.url); } updateTitle(pageHistory.state.title, false);
@@ -291,6 +293,13 @@ }
if (dialog.open) { dialog.removeAttribute("open"); + + // If the dialog was open via js or via ssr + const closeLink = dialog.querySelector("a.button"); + if (closeLink) { + pageHistory.state.url = closeLink.href; + } + dialog.showModal(); }
M internal/components/results.gointernal/components/results.go
@@ -23,6 +23,13 @@ return Span(Role("status"), g.Text("Nothing found"))
} qs := r.SearchNav.URL.RawQuery + if r.Source.Importer != config.All { + if qs != "" { + qs += "&scoped" + } else { + qs = "scoped" + } + } var content g.Node switch r.Source.Importer { case config.Options:
M internal/server/global.gointernal/server/global.go
@@ -63,6 +63,7 @@ ) (*components.ResultData, int, error) {
facets := r.URL.Query() facets.Del("query") facets.Del("page") + facets.Del("scoped") if !r.URL.Query().Has("query") && len(facets) == 0 { return nil, 0, nil
@@ -125,7 +126,9 @@ }
searchURL := *source.LocalURL() searchURL.Path += "search" - searchURL.RawQuery = r.URL.Query().Encode() + searchQuery := r.URL.Query() + searchQuery.Del("scoped") + searchURL.RawQuery = searchQuery.Encode() tdata := &components.ResultData{ TemplateData: components.TemplateData{
M internal/server/source.gointernal/server/source.go
@@ -34,6 +34,26 @@ func (h *SourceHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
h.mux.ServeHTTP(w, r) } +func (h *SourceHandler) searchSource(r *http.Request) config.Source { + if r.URL.Query().Has("scoped") { + return h.source + } + + return config.Source{Importer: config.All} +} + +func (h *SourceHandler) closeURL(r *http.Request) string { + q := r.URL.Query() + scoped := q.Has("scoped") + q.Del("scoped") + + if scoped { + return "/" + h.source.Importer.String() + "/" + h.source.Key + "/search?" + q.Encode() + } + + return "/?" + q.Encode() +} + func (h *SourceHandler) Search(w http.ResponseWriter, r *http.Request) { h.global.Search(h.source, w, r) }
@@ -78,11 +98,12 @@ if r.Header.Get("Fetch") == "true" {
w.Header().Add("Content-Type", "text/html; charset=utf-8") w.Header().Add("Title", h.getTitle(doc)) baseErr = components.Detail(doc).Render(w) - } else if searchResult, _, searchErr := h.global.ExecuteSearch(h.source, r); searchErr == nil && searchResult != nil { + } else if searchResult, _, searchErr := h.global.ExecuteSearch(h.searchSource(r), r); searchErr == nil && + searchResult != nil { searchResult.Title = h.getTitle(doc) searchResult.Description = components.MetaDescription(doc) searchResult.DetailContent = components.Detail(doc) - searchResult.SearchURL = searchResult.SearchNav.URL.String() + searchResult.SearchURL = h.closeURL(r) baseErr = components.ResultsPage(*searchResult).Render(w) } else { tdata := components.TemplateData{