Skip to content

Commit 822f86e

Browse files
Added paging to the ui.
1 parent 563d20f commit 822f86e

File tree

14 files changed

+457
-159
lines changed

14 files changed

+457
-159
lines changed

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -149,7 +149,7 @@ err := http.ListenAndServe(":9000", mux)
149149

150150
Then visit the given port and/or domain in your browser (ie, `localhost:9000`).
151151

152-
The web CSS and JS are provided by [tabler](https://github.com/tabler/tabler).
152+
The web CSS is provided by [tabler](https://github.com/tabler/tabler).
153153

154154
### Panic recovery
155155

internal/query/query.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ const SelectScheduledTasks = `
2727
wait_until ASC,
2828
id ASC
2929
LIMIT ?
30+
OFFSET ?
3031
`
3132

3233
const DeleteTask = `

internal/task/tasks.go

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -91,11 +91,28 @@ func GetTasks(ctx context.Context, db *sql.DB, query string, args ...any) (Tasks
9191
// It's important to note that this does not filter out tasks that are not yet ready based on their wait time.
9292
// The deadline provided is used to include tasks that have been claimed if that given amount of time has elapsed.
9393
func GetScheduledTasks(ctx context.Context, db *sql.DB, deadline time.Time, limit int) (Tasks, error) {
94+
return GetScheduledTasksWithOffset(
95+
ctx,
96+
db,
97+
deadline,
98+
limit,
99+
0,
100+
)
101+
}
102+
103+
// GetScheduledTasksWithOffset is the same as GetScheduledTasks but with an offset for paging.
104+
func GetScheduledTasksWithOffset(
105+
ctx context.Context,
106+
db *sql.DB,
107+
deadline time.Time,
108+
limit,
109+
offset int) (Tasks, error) {
94110
return GetTasks(
95111
ctx,
96112
db,
97113
query.SelectScheduledTasks,
98114
deadline.UnixMilli(),
99115
limit,
116+
offset,
100117
)
101118
}

ui/handler.go

Lines changed: 51 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@ import (
66
"io"
77
"log"
88
"net/http"
9+
"net/url"
10+
"strconv"
911
"text/template"
1012
"time"
1113

@@ -30,6 +32,9 @@ type (
3032

3133
// Content is the data to render.
3234
Content any
35+
36+
// Page is the page number.
37+
Page int
3338
}
3439

3540
// handleFunc is an HTTP handle func that returns an error.
@@ -64,7 +69,13 @@ func handle(hf handleFunc) http.HandlerFunc {
6469

6570
// Running renders the running tasks.
6671
func (h *Handler) Running(w http.ResponseWriter, req *http.Request) error {
67-
tasks, err := task.GetTasks(req.Context(), h.db, selectRunningTasks, itemLimit)
72+
tasks, err := task.GetTasks(
73+
req.Context(),
74+
h.db,
75+
selectRunningTasks,
76+
itemLimit,
77+
getOffset(req.URL),
78+
)
6879
if err != nil {
6980
return err
7081
}
@@ -74,8 +85,13 @@ func (h *Handler) Running(w http.ResponseWriter, req *http.Request) error {
7485

7586
// Upcoming renders the upcoming tasks.
7687
func (h *Handler) Upcoming(w http.ResponseWriter, req *http.Request) error {
77-
// TODO use actual time from the client
78-
tasks, err := task.GetScheduledTasks(req.Context(), h.db, time.Now().Add(-time.Hour), itemLimit)
88+
tasks, err := task.GetScheduledTasksWithOffset(
89+
req.Context(),
90+
h.db,
91+
time.Now().Add(-time.Hour), // TODO use actual time from the client
92+
itemLimit,
93+
getOffset(req.URL),
94+
)
7995
if err != nil {
8096
return err
8197
}
@@ -85,7 +101,14 @@ func (h *Handler) Upcoming(w http.ResponseWriter, req *http.Request) error {
85101

86102
// Succeeded renders the completed tasks that have succeeded.
87103
func (h *Handler) Succeeded(w http.ResponseWriter, req *http.Request) error {
88-
tasks, err := task.GetCompletedTasks(req.Context(), h.db, selectCompletedTasks, 1, itemLimit)
104+
tasks, err := task.GetCompletedTasks(
105+
req.Context(),
106+
h.db,
107+
selectCompletedTasks,
108+
1,
109+
itemLimit,
110+
getOffset(req.URL),
111+
)
89112
if err != nil {
90113
return err
91114
}
@@ -95,7 +118,14 @@ func (h *Handler) Succeeded(w http.ResponseWriter, req *http.Request) error {
95118

96119
// Failed renders the completed tasks that have failed.
97120
func (h *Handler) Failed(w http.ResponseWriter, req *http.Request) error {
98-
tasks, err := task.GetCompletedTasks(req.Context(), h.db, selectCompletedTasks, 0, itemLimit)
121+
tasks, err := task.GetCompletedTasks(
122+
req.Context(),
123+
h.db,
124+
selectCompletedTasks,
125+
0,
126+
itemLimit,
127+
getOffset(req.URL),
128+
)
99129
if err != nil {
100130
return err
101131
}
@@ -139,5 +169,21 @@ func (h *Handler) render(req *http.Request, w io.Writer, tmpl *template.Template
139169
return tmpl.ExecuteTemplate(w, "layout.gohtml", templateData{
140170
Path: req.URL.Path,
141171
Content: data,
172+
Page: getPage(req.URL),
142173
})
143174
}
175+
176+
func getPage(u *url.URL) int {
177+
if p := u.Query().Get("page"); p != "" {
178+
if page, err := strconv.Atoi(p); err == nil {
179+
if page > 0 {
180+
return page
181+
}
182+
}
183+
}
184+
return 1
185+
}
186+
187+
func getOffset(u *url.URL) int {
188+
return (getPage(u) - 1) * itemLimit
189+
}

0 commit comments

Comments
 (0)