From 920764211064521930441b96ed914034302a7470 Mon Sep 17 00:00:00 2001
From: Alan Pearce
Date: Sun, 5 Jan 2025 20:51:24 +0100
Subject: feat: offer to show all results on one page (if < 10000)
Implements: https://todo.sr.ht/~alanpearce/searchix/5
---
internal/components/data.go | 1 +
internal/components/results.templ | 7 +++++--
internal/config/config.go | 2 ++
internal/server/mux.go | 25 +++++++++++--------------
4 files changed, 19 insertions(+), 16 deletions(-)
diff --git a/internal/components/data.go b/internal/components/data.go
index aecd44c..862429e 100644
--- a/internal/components/data.go
+++ b/internal/components/data.go
@@ -25,4 +25,5 @@ type ResultData struct {
Results *search.Result
Prev string
Next string
+ All string
}
diff --git a/internal/components/results.templ b/internal/components/results.templ
index 226b71e..fee211c 100644
--- a/internal/components/results.templ
+++ b/internal/components/results.templ
@@ -1,9 +1,9 @@
package components
import (
- "strconv"
- "go.alanpearce.eu/searchix/internal/nix"
"go.alanpearce.eu/searchix/internal/config"
+ "go.alanpearce.eu/searchix/internal/nix"
+ "strconv"
)
func convertMatch[I nix.Importable](m nix.Importable) *I {
@@ -37,6 +37,9 @@ templ Results(r ResultData) {
}
{ strconv.FormatUint(r.Results.Total, 10) } results
+ if r.Next != r.Prev && r.Results.Total < config.MaxResultsShowAll {
+ Show All
+ }
} else {
Nothing found
diff --git a/internal/config/config.go b/internal/config/config.go
index 33ce1da..b2af53c 100644
--- a/internal/config/config.go
+++ b/internal/config/config.go
@@ -14,6 +14,8 @@ import (
var Version string
var DevMode bool
+const MaxResultsShowAll = 10_000
+
type URL struct {
*url.URL
}
diff --git a/internal/server/mux.go b/internal/server/mux.go
index 80c68cb..83fde10 100644
--- a/internal/server/mux.go
+++ b/internal/server/mux.go
@@ -110,11 +110,15 @@ func NewMux(
var pageNumber = 1
if pg := r.URL.Query().Get("page"); pg != "" {
pageNumber, err = strconv.Atoi(pg)
- if err != nil || pageNumber <= 0 || pageNumber > math.MaxInt {
+ if err != nil || pageNumber > math.MaxInt {
errorHandler(w, r, "Bad query string", http.StatusBadRequest)
return
}
+ if pageNumber == 0 {
+ pageNumber = 1
+ pageSize = math.MaxInt
+ }
}
page := pagination.New(pageNumber, pageSize)
results, err := index.Search(ctx, source, qs, page.From, page.Size)
@@ -129,6 +133,9 @@ func NewMux(
return
}
+ if pageSize == math.MaxInt && results.Total > config.MaxResultsShowAll {
+ errorHandler(w, r, "Too many results, use pagination", http.StatusBadRequest)
+ }
tdata := components.ResultData{
TemplateData: components.TemplateData{
@@ -143,19 +150,6 @@ func NewMux(
}
page.SetResults(results.Total)
- log.Debug(
- "pag",
- "needed",
- page.Needed,
- "current",
- page.Current,
- "total",
- results.Total,
- "next",
- page.Next,
- "prev",
- page.Prev,
- )
if page.Needed {
q, err := url.ParseQuery(r.URL.RawQuery)
if err != nil {
@@ -177,6 +171,9 @@ func NewMux(
}
tdata.Prev = "search?" + q.Encode()
}
+
+ q.Set("page", "0")
+ tdata.All = "search?" + q.Encode()
}
w.Header().Add("Cache-Control", "max-age=300")
--
cgit 1.4.1