Port queue page to maud

This commit is contained in:
Joscha 2024-05-12 13:17:38 +02:00
parent b3f8c6390c
commit 5d4232ac6b
6 changed files with 131 additions and 159 deletions

View file

@ -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::<String>()
} else {
text.to_string()
}
}

View file

@ -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::<String>()
} 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) }
}
}
}

View file

@ -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<Worker>,
tasks: Vec<Task>,
fn page_inner(workers: Vec<Worker>, tasks: Vec<Task>) -> 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())
}