Skip to content

Commit 1a58978

Browse files
KixironJoshua Nelson
authored and
Joshua Nelson
committed
Build Queue
1 parent d1bc23b commit 1a58978

File tree

4 files changed

+146
-48
lines changed

4 files changed

+146
-48
lines changed

src/build_queue.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ use crate::db::Pool;
33
use crate::error::Result;
44
use log::error;
55

6-
#[derive(Debug, Eq, PartialEq, serde::Serialize)]
6+
#[derive(Debug, Clone, Eq, PartialEq, serde::Serialize)]
77
pub(crate) struct QueuedCrate {
88
#[serde(skip)]
99
id: i32,

src/web/releases.rs

+19-18
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,10 @@
11
//! Releases web handlers
22
33
use crate::{
4+
build_queue::QueuedCrate,
45
db::Pool,
56
impl_webpage,
6-
web::{
7-
error::Nope,
8-
match_version,
9-
page::{Page, WebPage},
10-
redirect_base,
11-
},
7+
web::{error::Nope, match_version, page::WebPage, redirect_base},
128
BuildQueue,
139
};
1410
use chrono::{DateTime, NaiveDateTime, Utc};
@@ -692,25 +688,30 @@ pub fn activity_handler(req: &mut Request) -> IronResult<Response> {
692688
.into_response(req)
693689
}
694690

695-
pub fn build_queue_handler(req: &mut Request) -> IronResult<Response> {
696-
let queue = extension!(req, BuildQueue);
691+
#[derive(Debug, Clone, PartialEq, Serialize)]
692+
struct BuildQueuePage {
693+
description: Cow<'static, str>,
694+
queue: Vec<QueuedCrate>,
695+
}
696+
697+
impl_webpage! {
698+
BuildQueuePage = "releases/build_queue.html",
699+
}
697700

698-
let mut crates = ctry!(req, queue.queued_crates());
699-
for krate in &mut crates {
701+
pub fn build_queue_handler(req: &mut Request) -> IronResult<Response> {
702+
let mut queue = ctry!(req, extension!(req, BuildQueue).queued_crates());
703+
for krate in queue.iter_mut() {
700704
// The priority here is inverted: in the database if a crate has a higher priority it
701705
// will be built after everything else, which is counter-intuitive for people not
702706
// familiar with docs.rs's inner workings.
703707
krate.priority = -krate.priority;
704708
}
705709

706-
let is_empty = crates.is_empty();
707-
Page::new(crates)
708-
.title("Build queue")
709-
.set("description", "List of crates scheduled to build")
710-
.set_bool("queue_empty", is_empty)
711-
.set_true("show_releases_navigation")
712-
.set_true("releases_queue_tab")
713-
.to_resp("releases_queue")
710+
BuildQueuePage {
711+
description: Cow::Borrowed("List of crates scheduled to build"),
712+
queue,
713+
}
714+
.into_response(req)
714715
}
715716

716717
#[cfg(test)]

templates/releases_queue.hbs

-29
This file was deleted.
+126
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,126 @@
1+
{%- extends "base.html" -%}
2+
{%- import "releases/header.html" as release_macros -%}
3+
4+
{%- block title -%}Build Queue - Docs.rs{%- endblock title -%}
5+
6+
{%- block header -%}
7+
{{ release_macros::header(title="Build Queue", description=description, tab="queue") }}
8+
{%- endblock header -%}
9+
10+
{%- block body -%}
11+
<div class="container">
12+
<div class="recent-releases-container">
13+
14+
<div class="release">
15+
{% set queue_length = queue | length -%}
16+
{%- if queue_length == 0 -%}
17+
<strong>There is nothing in queue</strong>
18+
{%- else -%}
19+
<strong>Queue</strong>
20+
{%- endif %}
21+
</div>
22+
23+
<ol class="queue-list">
24+
{% for crate in queue -%}
25+
<li>
26+
<a href="https://crates.io/crates/{{ crate.name }}">
27+
{{ crate.name }} {{ crate.version }}
28+
</a>
29+
30+
{% if crate.priority != 0 -%}
31+
(priority: {{ crate.priority }})
32+
{%- endif %}
33+
</li>
34+
{%- endfor %}
35+
</ol>
36+
</div>
37+
</div>
38+
{%- endblock body -%}
39+
40+
{%- block javascript -%}
41+
<script type="text/javascript" charset="utf-8">
42+
function getKey(ev) {
43+
if ("key" in ev && typeof ev.key != "undefined") {
44+
return ev.key;
45+
}
46+
return String.fromCharCode(ev.charCode || ev.keyCode);
47+
}
48+
49+
document.getElementById("i-am-feeling-lucky-button").onclick = function () {
50+
var form = document.getElementsByClassName("landing-search-form");
51+
var input = document.createElement('input');
52+
input.type = 'hidden';
53+
input.name = 'i-am-feeling-lucky';
54+
input.value = 1;
55+
document.getElementsByClassName("landing-search-form")[0].appendChild(input);
56+
return true;
57+
};
58+
59+
function handleShortcut(ev) {
60+
if (ev.ctrlKey || ev.altKey || ev.metaKey || document.activeElement.tagName === "INPUT") {
61+
return;
62+
}
63+
switch (getKey(ev)) {
64+
case "s":
65+
case "S":
66+
ev.preventDefault();
67+
document.getElementById("search").focus();
68+
break;
69+
}
70+
}
71+
72+
document.onkeypress = handleShortcut;
73+
document.onkeydown = handleShortcut;
74+
75+
var active = null;
76+
77+
function handleKey(ev) {
78+
if (ev.ctrlKey || ev.altKey || ev.metaKey || document.activeElement.tagName === "INPUT") {
79+
return;
80+
}
81+
if (ev.which === 40) { // Down arrow
82+
ev.preventDefault();
83+
if (active === null) {
84+
active = document.getElementsByClassName("recent-releases-container")[0].getElementsByTagName("li")[0];
85+
} else if (active.nextElementSibling) {
86+
active.classList.remove("selected");
87+
active = active.nextElementSibling;
88+
}
89+
active.classList.add("selected");
90+
} else if (ev.which === 38) { // Up arrow
91+
ev.preventDefault();
92+
if (active === null) {
93+
active = document.getElementsByClassName("recent-releases-container")[0].getElementsByTagName("li")[0];
94+
} else if (active.previousElementSibling) {
95+
active.classList.remove("selected");
96+
active = active.previousElementSibling;
97+
}
98+
active.classList.add("selected");
99+
active.focus();
100+
} else if (ev.which === 13) { // Return
101+
if (active !== null) {
102+
document.location.href = active.getElementsByTagName("a")[0].href;
103+
}
104+
} else {
105+
switch (getKey(ev)) {
106+
case "s":
107+
case "S":
108+
ev.preventDefault();
109+
document.getElementsByClassName("search-input-nav")[0].focus();
110+
break;
111+
}
112+
}
113+
}
114+
document.onkeypress = handleKey;
115+
document.onkeydown = handleKey;
116+
var crates =
117+
Array.prototype.slice.call(document.getElementsByClassName("recent-releases-container")[0].getElementsByTagName("li"));
118+
for (var i = 0; i < crates.length; ++i) {
119+
crates[i].addEventListener("mouseover", function (event) {
120+
this.classList.remove("selected"); active = null;
121+
}); crates[i].addEventListener("mouseout", function (event) {
122+
this.classList.remove("selected"); active = null;
123+
});
124+
}
125+
</script>
126+
{%- endblock javascript -%}

0 commit comments

Comments
 (0)