From b434c1acfe58fa495efecd8dd24a56511303e99b Mon Sep 17 00:00:00 2001 From: Tim Van Baak Date: Fri, 7 Feb 2025 08:17:51 -0800 Subject: [PATCH] Add paging links to web feed --- README.md | 2 +- test/test_items.sh | 7 +++++++ web/channel.go | 16 +++++++++++----- web/html/feed.html | 12 ++++++++++-- web/html/html.go | 14 +++++++++++++- web/main.go | 11 +++++++++++ web/source.go | 16 +++++++++++----- 7 files changed, 64 insertions(+), 14 deletions(-) diff --git a/README.md b/README.md index 9a0b0cb..c560336 100644 --- a/README.md +++ b/README.md @@ -98,7 +98,7 @@ Parity features * [x] web feed supports item TTS * [x] item punt -* [ ] web feed paging +* [x] web feed paging * [ ] web fetch * [ ] set a working directory for item actions * [ ] crontab integration diff --git a/test/test_items.sh b/test/test_items.sh index e647712..cafcf5b 100755 --- a/test/test_items.sh +++ b/test/test_items.sh @@ -37,5 +37,12 @@ tmp/intake channel add -c all -s spook tmp/intake channel add -c none -s nothing +tmp/intake source add -s page +tmp/intake item add -s page --id 1 --title "Item 1" --body "This is the body of item 1" +for i in $(seq 2 211); do + tmp/intake item add -s page --id $i --title "Item $i" --body "This is the body of item $i" 2>/dev/null +done +tmp/intake item add -s page --id 212 --title "Item 212" --body "This is the body of item 212" + echo "hello" | tmp/intake passwd --stdin echo "hello" | tmp/intake passwd --stdin --verify diff --git a/web/channel.go b/web/channel.go index 724c7ed..386c909 100644 --- a/web/channel.go +++ b/web/channel.go @@ -10,13 +10,16 @@ import ( func (env *Env) getChannel(writer http.ResponseWriter, req *http.Request) { channel := req.PathValue("channel") + page := getQueryInt(req, "page", 1) + count := getQueryInt(req, "count", core.DefaultFeedLimit) + showHidden := getQueryInt(req, "hidden", 0) + var items []core.Item var err error - inactive := req.URL.Query().Get("inactive") == "1" - if inactive { - items, err = core.GetAllItemsForChannel(env.db, channel, 0, core.DefaultFeedLimit) + if showHidden != 0 { + items, err = core.GetAllItemsForChannel(env.db, channel, (page-1)*count, count) } else { - items, err = core.GetActiveItemsForChannel(env.db, channel, 0, core.DefaultFeedLimit) + items, err = core.GetActiveItemsForChannel(env.db, channel, (page-1)*count, count) } if err != nil { http.Error(writer, err.Error(), 500) @@ -24,7 +27,10 @@ func (env *Env) getChannel(writer http.ResponseWriter, req *http.Request) { } data := html.FeedData{ - Items: items, + Items: items, + ShowHidden: showHidden, + Page: page, + Count: count, } html.Feed(writer, data) } diff --git a/web/html/feed.html b/web/html/feed.html index e8e9c33..b4f983c 100644 --- a/web/html/feed.html +++ b/web/html/feed.html @@ -2,9 +2,17 @@ {{ define "content" -}}
- + +<-- Home -[Active | All] + + {{ if .ShowHidden -}} + [ Active | All ] + {{- else -}} + [ Active | All ] + {{- end }} + +-->
diff --git a/web/html/html.go b/web/html/html.go index 8a434e3..b398041 100644 --- a/web/html/html.go +++ b/web/html/html.go @@ -61,12 +61,21 @@ func massDeactivateVals(items []core.Item) string { return string(vals) } +func page(i int, delta int) int { + i = i + delta + if i < 1 { + return 1 + } + return i +} + var funcs = template.FuncMap{ "raw": rawHtml, "dateFormat": dateFormat, "tsToDate": tsToDate, "until": until, "massDeacVars": massDeactivateVals, + "page": page, } //go:embed intake.css @@ -108,7 +117,10 @@ func Home(writer io.Writer, data HomeData) { var feed = load("feed.html", "item.html") type FeedData struct { - Items []core.Item + Items []core.Item + ShowHidden int + Page int + Count int } func Feed(writer io.Writer, data FeedData) { diff --git a/web/main.go b/web/main.go index bf058f8..5b4bf27 100644 --- a/web/main.go +++ b/web/main.go @@ -4,6 +4,7 @@ import ( "log" "net" "net/http" + "strconv" "github.com/Jaculabilis/intake/core" ) @@ -48,3 +49,13 @@ func RunServer(db core.DB, addr string, port string) { log.Fatal(http.ListenAndServe(bind, nil)) } + +func getQueryInt(req *http.Request, name string, def int) int { + s := req.URL.Query().Get(name) + i, err := strconv.Atoi(s) + if err != nil { + return def + } else { + return i + } +} diff --git a/web/source.go b/web/source.go index 11ad133..c7dfa9e 100644 --- a/web/source.go +++ b/web/source.go @@ -14,13 +14,16 @@ func (env *Env) getSource(writer http.ResponseWriter, req *http.Request) { return } + page := getQueryInt(req, "page", 1) + count := getQueryInt(req, "count", core.DefaultFeedLimit) + showHidden := getQueryInt(req, "hidden", 0) + var items []core.Item var err error - inactive := req.URL.Query().Get("inactive") == "1" - if inactive { - items, err = core.GetAllItemsForSource(env.db, source, 0, core.DefaultFeedLimit) + if showHidden != 0 { + items, err = core.GetAllItemsForSource(env.db, source, (page-1)*count, count) } else { - items, err = core.GetActiveItemsForSource(env.db, source, 0, core.DefaultFeedLimit) + items, err = core.GetActiveItemsForSource(env.db, source, (page-1)*count, count) } if err != nil { http.Error(writer, err.Error(), 500) @@ -28,7 +31,10 @@ func (env *Env) getSource(writer http.ResponseWriter, req *http.Request) { } data := html.FeedData{ - Items: items, + Items: items, + ShowHidden: showHidden, + Page: page, + Count: count, } html.Feed(writer, data) }