Add pagination to the jobs page
This commit is contained in:
parent
b877b64eb8
commit
5163398e54
3 changed files with 86 additions and 11 deletions
|
|
@ -1050,8 +1050,9 @@ RETURNING id;")
|
||||||
(list commit))))
|
(list commit))))
|
||||||
result))
|
result))
|
||||||
|
|
||||||
(define (select-jobs-and-events conn)
|
(define (select-jobs-and-events conn before-id limit)
|
||||||
(define query
|
(define query
|
||||||
|
(string-append
|
||||||
"
|
"
|
||||||
SELECT
|
SELECT
|
||||||
load_new_guix_revision_jobs.id,
|
load_new_guix_revision_jobs.id,
|
||||||
|
|
@ -1071,7 +1072,19 @@ SELECT
|
||||||
SELECT 1 FROM load_new_guix_revision_job_logs WHERE job_id = load_new_guix_revision_jobs.id
|
SELECT 1 FROM load_new_guix_revision_job_logs WHERE job_id = load_new_guix_revision_jobs.id
|
||||||
) AS log_exists
|
) AS log_exists
|
||||||
FROM load_new_guix_revision_jobs
|
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
|
(map
|
||||||
(match-lambda
|
(match-lambda
|
||||||
|
|
|
||||||
|
|
@ -30,8 +30,19 @@
|
||||||
conn)
|
conn)
|
||||||
(match method-and-path-components
|
(match method-and-path-components
|
||||||
(('GET "jobs")
|
(('GET "jobs")
|
||||||
|
(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
|
(render-jobs mime-types
|
||||||
conn))
|
conn
|
||||||
|
parsed-query-parameters)))
|
||||||
(('GET "jobs" "queue")
|
(('GET "jobs" "queue")
|
||||||
(render-job-queue mime-types
|
(render-job-queue mime-types
|
||||||
conn))
|
conn))
|
||||||
|
|
@ -47,10 +58,20 @@
|
||||||
parsed-query-parameters)))
|
parsed-query-parameters)))
|
||||||
(_ #f)))
|
(_ #f)))
|
||||||
|
|
||||||
(define (render-jobs mime-types 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
|
(render-html
|
||||||
#:sxml (view-jobs
|
#:sxml (view-jobs
|
||||||
(select-jobs-and-events conn))))
|
query-parameters
|
||||||
|
jobs
|
||||||
|
(and limit-results
|
||||||
|
(>= (length jobs)
|
||||||
|
limit-results))))))
|
||||||
|
|
||||||
(define (render-job-queue mime-types conn)
|
(define (render-job-queue mime-types conn)
|
||||||
(render-html
|
(render-html
|
||||||
|
|
|
||||||
|
|
@ -16,13 +16,17 @@
|
||||||
;;; <http://www.gnu.org/licenses/>.
|
;;; <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
(define-module (guix-data-service web jobs html)
|
(define-module (guix-data-service web jobs html)
|
||||||
|
#:use-module (srfi srfi-1)
|
||||||
#:use-module (ice-9 match)
|
#:use-module (ice-9 match)
|
||||||
|
#:use-module (guix-data-service web html-utils)
|
||||||
#:use-module (guix-data-service web view html)
|
#:use-module (guix-data-service web view html)
|
||||||
#:export (view-jobs
|
#:export (view-jobs
|
||||||
view-job-queue
|
view-job-queue
|
||||||
view-job))
|
view-job))
|
||||||
|
|
||||||
(define (view-jobs jobs-and-events)
|
(define (view-jobs query-parameters
|
||||||
|
jobs-and-events
|
||||||
|
show-next-page?)
|
||||||
(layout
|
(layout
|
||||||
#:body
|
#:body
|
||||||
`(,(header)
|
`(,(header)
|
||||||
|
|
@ -42,6 +46,33 @@
|
||||||
(href "/jobs/queue")
|
(href "/jobs/queue")
|
||||||
(role "button"))
|
(role "button"))
|
||||||
"Queue"))))
|
"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
|
(div
|
||||||
(@ (class "row"))
|
(@ (class "row"))
|
||||||
(div
|
(div
|
||||||
|
|
@ -94,7 +125,17 @@
|
||||||
`((a (@ (href ,(string-append "/job/" id)))
|
`((a (@ (href ,(string-append "/job/" id)))
|
||||||
"View log"))
|
"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)
|
(define (view-job-queue jobs-and-events)
|
||||||
(layout
|
(layout
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue