From 5d4232ac6b45cc284ab353826b16d361ac7924dc Mon Sep 17 00:00:00 2001 From: Joscha Date: Sun, 12 May 2024 13:17:38 +0200 Subject: [PATCH] Port queue page to maud --- src/server/util.rs | 12 +++ src/server/web/link.rs | 24 ++--- src/server/web/pages/queue.rs | 146 ++++++++++++++++++++++-------- templates/pages/queue.html | 23 ----- templates/pages/queue_delete.html | 18 ---- templates/pages/queue_inner.html | 67 -------------- 6 files changed, 131 insertions(+), 159 deletions(-) delete mode 100644 templates/pages/queue.html delete mode 100644 templates/pages/queue_delete.html delete mode 100644 templates/pages/queue_inner.html diff --git a/src/server/util.rs b/src/server/util.rs index 8c82799..cfcc10f 100644 --- a/src/server/util.rs +++ b/src/server/util.rs @@ -70,3 +70,15 @@ pub fn format_value(value: f64) -> String { format!("{value:.2}") } } + +pub fn truncate(text: &str, width: usize) -> String { + let truncate = text.chars().take(width + 1).count() > width; + if truncate { + text.chars() + .take(80 - 3) + .chain("...".chars()) + .collect::() + } else { + text.to_string() + } +} diff --git a/src/server/web/link.rs b/src/server/web/link.rs index b43f70c..d8dd1ff 100644 --- a/src/server/web/link.rs +++ b/src/server/web/link.rs @@ -57,17 +57,7 @@ impl LinkCommit { pub fn html(&self) -> Markup { let (class, title) = self.class_and_title(); - - let truncate = self.short.chars().take(81).count() > 80; - let short = if truncate { - self.short - .chars() - .take(80 - 3) - .chain("...".chars()) - .collect::() - } else { - self.short.to_string() - }; + let short = util::truncate(&self.short, 80); html! { a href=(self.link) .(class) title=(title) { (short) } @@ -92,6 +82,12 @@ impl LinkRunShort { short: util::format_commit_short(hash, message), } } + + pub fn html(&self) -> Markup { + html! { + a href=(self.link) { "Run of " (util::truncate(&self.short, 80)) } + } + } } #[derive(Template)] @@ -133,4 +129,10 @@ impl LinkWorker { name, } } + + pub fn html(&self) -> Markup { + html! { + a href=(self.link) { (self.name) } + } + } } diff --git a/src/server/web/pages/queue.rs b/src/server/web/pages/queue.rs index 89a95e4..0199946 100644 --- a/src/server/web/pages/queue.rs +++ b/src/server/web/pages/queue.rs @@ -3,13 +3,13 @@ use std::{ sync::{Arc, Mutex}, }; -use askama::Template; use axum::{ extract::State, http::StatusCode, response::{IntoResponse, Response}, }; use futures::TryStreamExt; +use maud::{html, Markup}; use sqlx::SqlitePool; use crate::{ @@ -152,11 +152,71 @@ async fn get_queue_data( Ok(tasks) } -#[derive(Template)] -#[template(path = "pages/queue_inner.html")] -struct PageInner { - workers: Vec, - tasks: Vec, +fn page_inner(workers: Vec, tasks: Vec) -> Markup { + html! { + h2 { "Workers" } + @if workers.is_empty() { + p { "No workers connected" } + } @else { + table .queue-workers { + thead { + tr { + th { "worker" } + th { "status" } + } + } + tbody { + @for worker in workers { tr { + td { (worker.link.html()) } + td { @match worker.status { + Status::Idle => "idle", + Status::Busy => "busy", + Status::Working(link) => (link.html()), + } } + } } + } + } + } + h2 { "Queue (" (tasks.len()) ")" } + form .queue-commits method="post" { + table #queue data-count=(tasks.len()) { + thead { + tr { + th { "commit" } + th { "since" } + th { "priority" } + th { "worker" } + } + } + tbody { + @for task in tasks { tr .odd[task.odd] { + td { (task.commit.html()) } + td { + (task.since) " [" + a href=(task.link_delete) title="Delete from queue" { "del" } + "]" + } + td { + (task.priority) " [" + button .linkish title="Increase priority by 1" formaction=(task.link_increase) name="hash" value=(task.hash) { "inc" } + "/" + button .linkish title="Decrease priority by 1" formaction=(task.link_decrease) name="hash" value=(task.hash) { "dec" } + "]" + td { + @if task.workers.is_empty() { + "-" + } + @for (i, worker) in task.workers.iter().enumerate() { + @if i > 0 { ", " } + (worker.html()) + } + } + } + } } + } + } + } + } } pub async fn get_queue_inner( @@ -169,16 +229,7 @@ pub async fn get_queue_inner( let sorted_workers = sorted_workers(&workers); let workers = get_workers(&db, &sorted_workers, &base).await?; let tasks = get_queue_data(&db, &sorted_workers, &base).await?; - Ok(PageInner { workers, tasks }) -} - -#[derive(Template)] -#[template(path = "pages/queue.html")] -struct Page { - link_queue_js: Link, - link_admin_queue_add_batch: Link, - base: Base, - inner: PageInner, + Ok(page_inner(workers, tasks)) } pub async fn get_queue( @@ -191,23 +242,29 @@ pub async fn get_queue( let sorted_workers = sorted_workers(&workers); let workers = get_workers(&db, &sorted_workers, &base).await?; let tasks = get_queue_data(&db, &sorted_workers, &base).await?; - Ok(Page { - link_queue_js: base.link(QUEUE_JS), - link_admin_queue_add_batch: base.link(PathAdminQueueAddBatch {}), - base, - inner: PageInner { workers, tasks }, - }) -} -#[derive(Template)] -#[template(path = "pages/queue_delete.html")] -struct PageDelete { - base: Base, - link_delete: Link, - - short: String, - commit: LinkCommit, - hash: String, + Ok(base.html( + &format!("queue ({})", tasks.len()), + html! { + script type="module" src=(base.link(QUEUE_JS)) {} + }, + html! { + div #inner { (page_inner(workers, tasks)) } + form method="post" action=(base.link(PathAdminQueueAddBatch {})) { + label { + "Batch size: " + input name="amount" type="number" value="10" min="1"; + } + " " + label { + "Priority: " + input #priority name="priority" type="number" value="-1" min="-2147483648" max="2147483647"; + } + " " + button { "Add batch to queue" } + } + }, + )) } pub async fn get_queue_delete( @@ -231,13 +288,22 @@ pub async fn get_queue_delete( return Ok(StatusCode::NOT_FOUND.into_response()); }; - Ok(PageDelete { - short: util::format_commit_short(&r.hash, &r.message), - commit: LinkCommit::new(&base, r.hash.clone(), &r.message, r.reachable), - hash: r.hash, + let commit = LinkCommit::new(&base, r.hash.clone(), &r.message, r.reachable); - link_delete: base.link(PathAdminQueueDelete {}), - base, - } - .into_response()) + Ok(base + .html( + &format!("del {}", util::format_commit_short(&r.hash, &r.message)), + html! {}, + html! { + h2 { "Delete commit from queue" } + p { "You are about to delete this commit from the queue:" } + p { (commit.html()) } + p { "All runs of this commit currently in progress will be aborted!" } + form method="post" action=(base.link(PathAdminQueueDelete {})) { + input name="hash" type="hidden" value=(r.hash); + button { "Delete commit and abort runs" } + } + }, + ) + .into_response()) } diff --git a/templates/pages/queue.html b/templates/pages/queue.html deleted file mode 100644 index d911428..0000000 --- a/templates/pages/queue.html +++ /dev/null @@ -1,23 +0,0 @@ -{% extends "base.html" %} - -{% block title %}queue ({{ inner.tasks.len() }}){% endblock %} - -{% block head %} - -{% endblock %} - -{% block body %} -
{{ inner|safe }}
- -
- - - -
-{% endblock %} diff --git a/templates/pages/queue_delete.html b/templates/pages/queue_delete.html deleted file mode 100644 index 7a9bba1..0000000 --- a/templates/pages/queue_delete.html +++ /dev/null @@ -1,18 +0,0 @@ -{% extends "base.html" %} - -{% block title %}del {{ short }}{% endblock %} - -{% block body %} - -

Delete commit from queue

- -

You are about to delete this commit from the queue:

-

{{ commit|safe }}

-

All runs of this commit currently in progress will be aborted!

- -
- - -
- -{% endblock %} diff --git a/templates/pages/queue_inner.html b/templates/pages/queue_inner.html deleted file mode 100644 index f50f5ed..0000000 --- a/templates/pages/queue_inner.html +++ /dev/null @@ -1,67 +0,0 @@ -

Workers

- -{% if workers.is_empty() %} -

No workers connected

-{% else %} - - - - - - - - - {% for worker in workers %} - - - {% match worker.status %} - {% when Status::Idle %} - - {% when Status::Busy %} - - {% when Status::Working with (link) %} - - {% endmatch %} - - {% endfor %} - -
workerstatus
{{ worker.link|safe }}idlebusy{{ link|safe }}
-{% endif %} - -

Queue ({{ tasks.len() }})

- -
- - - - - - - - - - - {% for task in tasks %} - - - - - {% if task.workers.is_empty() %} - - {% else %} - - {% endif %} - - {% endfor %} - -
commitsincepriorityworker
{{ task.commit|safe }} - {{ task.since }} - [del] - - {{ task.priority }} - [/] - -{{ task.workers|join(", ")|safe }}
-