Add pagination to the jobs page

This commit is contained in:
Christopher Baines 2019-12-26 23:03:12 +00:00
parent b877b64eb8
commit 5163398e54
3 changed files with 86 additions and 11 deletions

View file

@ -1050,9 +1050,10 @@ RETURNING id;")
(list commit))))
result))
(define (select-jobs-and-events conn)
(define (select-jobs-and-events conn before-id limit)
(define query
"
(string-append
"
SELECT
load_new_guix_revision_jobs.id,
load_new_guix_revision_jobs.commit,
@ -1071,7 +1072,19 @@ SELECT
SELECT 1 FROM load_new_guix_revision_job_logs WHERE job_id = load_new_guix_revision_jobs.id
) AS log_exists
FROM load_new_guix_revision_jobs
ORDER BY load_new_guix_revision_jobs.id DESC")
"
(if before-id
(string-append
"WHERE load_new_guix_revision_jobs.id < "
(number->string before-id))
"")
"
ORDER BY load_new_guix_revision_jobs.id DESC
"
(if limit
(string-append
"LIMIT " (number->string limit))
"")))
(map
(match-lambda

View file

@ -30,8 +30,19 @@
conn)
(match method-and-path-components
(('GET "jobs")
(render-jobs mime-types
conn))
(let ((parsed-query-parameters
(guard-against-mutually-exclusive-query-parameters
(parse-query-parameters
request
`((before_id ,parse-number)
(limit_results ,parse-result-limit
#:no-default-when (all_results)
#:default 20)
(all_results ,parse-checkbox-value)))
'((limit_results all_results)))))
(render-jobs mime-types
conn
parsed-query-parameters)))
(('GET "jobs" "queue")
(render-job-queue mime-types
conn))
@ -47,10 +58,20 @@
parsed-query-parameters)))
(_ #f)))
(define (render-jobs mime-types conn)
(render-html
#:sxml (view-jobs
(select-jobs-and-events conn))))
(define (render-jobs mime-types conn query-parameters)
(let* ((limit-results
(assq-ref query-parameters 'limit_results))
(jobs (select-jobs-and-events
conn
(assq-ref query-parameters 'before_id)
limit-results)))
(render-html
#:sxml (view-jobs
query-parameters
jobs
(and limit-results
(>= (length jobs)
limit-results))))))
(define (render-job-queue mime-types conn)
(render-html

View file

@ -16,13 +16,17 @@
;;; <http://www.gnu.org/licenses/>.
(define-module (guix-data-service web jobs html)
#:use-module (srfi srfi-1)
#:use-module (ice-9 match)
#:use-module (guix-data-service web html-utils)
#:use-module (guix-data-service web view html)
#:export (view-jobs
view-job-queue
view-job))
(define (view-jobs jobs-and-events)
(define (view-jobs query-parameters
jobs-and-events
show-next-page?)
(layout
#:body
`(,(header)
@ -42,6 +46,33 @@
(href "/jobs/queue")
(role "button"))
"Queue"))))
(div
(@ (class "row"))
(div
(@ (class "col-sm-12"))
(div
(@ (class "well"))
(form
(@ (method "get")
(action "")
(style "padding-bottom: 0")
(class "form-horizontal"))
,(form-horizontal-control
"Before ID" query-parameters
#:help-text
"List packages that are alphabetically after the given name.")
,(form-horizontal-control
"Limit results" query-parameters
#:help-text "The maximum number of packages by name to return.")
,(form-horizontal-control
"All results" query-parameters
#:type "checkbox"
#:help-text "Return all results.")
(div (@ (class "form-group form-group-lg"))
(div (@ (class "col-sm-offset-2 col-sm-10"))
(button (@ (type "submit")
(class "btn btn-lg btn-primary"))
"Update results")))))))
(div
(@ (class "row"))
(div
@ -94,7 +125,17 @@
`((a (@ (href ,(string-append "/job/" id)))
"View log"))
'())))))
jobs-and-events)))))))))
jobs-and-events)))
,@(if show-next-page?
`((div
(@ (class "row"))
(a (@ (href
,(next-page-link "/jobs"
query-parameters
'before_id
(car (last jobs-and-events)))))
"Next page")))
'())))))))
(define (view-job-queue jobs-and-events)
(layout