feat: Handle returning to scoped importer search page
4 files changed, 45 insertions(+), 5 deletions(-)
M frontend/static/search.js → frontend/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.go → internal/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.go → internal/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.go → internal/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{