Skip to content

Commit ab1da03

Browse files
Load release list only when needed
1 parent 77eaf07 commit ab1da03

File tree

5 files changed

+87
-5
lines changed

5 files changed

+87
-5
lines changed

src/web/crate_details.rs

+32
Original file line numberDiff line numberDiff line change
@@ -373,6 +373,38 @@ pub(crate) async fn crate_details_handler(
373373
Ok(res.into_response())
374374
}
375375

376+
#[tracing::instrument]
377+
pub(crate) async fn get_all_releases(
378+
Path(params): Path<CrateDetailHandlerParams>,
379+
Extension(pool): Extension<Pool>,
380+
) -> AxumResult<axum::extract::Json<Vec<Release>>> {
381+
let releases: Vec<Release> = spawn_blocking({
382+
let pool = pool.clone();
383+
let params = params.clone();
384+
move || {
385+
let mut conn = pool.get()?;
386+
let query = "
387+
SELECT
388+
crates.id AS crate_id
389+
FROM crates
390+
WHERE crates.name = $1;";
391+
392+
let rows = conn.query(query, &[&params.name])?;
393+
394+
let result = if rows.is_empty() {
395+
return Ok(Vec::new());
396+
} else {
397+
&rows[0]
398+
};
399+
// get releases, sorted by semver
400+
releases_for_crate(&mut *conn, result.get("crate_id"))
401+
}
402+
})
403+
.await?;
404+
405+
Ok(axum::extract::Json(releases))
406+
}
407+
376408
#[cfg(test)]
377409
mod tests {
378410
use super::*;

src/web/routes.rs

+4
Original file line numberDiff line numberDiff line change
@@ -167,6 +167,10 @@ pub(super) fn build_axum_routes() -> AxumRouter {
167167
"/crate/:name",
168168
get_internal(super::crate_details::crate_details_handler),
169169
)
170+
.route(
171+
"/:name/releases",
172+
get_internal(super::crate_details::get_all_releases),
173+
)
170174
.route_with_tsr(
171175
"/crate/:name/:version",
172176
get_internal(super::crate_details::crate_details_handler),

static/menu.js

+32
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,37 @@ const updateMenuPositionForSubMenu = (currentMenuSupplier) => {
55
subMenu?.style.setProperty('--menu-x', `${currentMenu.getBoundingClientRect().x}px`);
66
}
77

8+
let loadReleases = function() {
9+
const crate_name = window.location.pathname.split('/')[1];
10+
const xhttp = new XMLHttpRequest();
11+
xhttp.onreadystatechange = function() {
12+
if (xhttp.readyState !== XMLHttpRequest.DONE) {
13+
return;
14+
}
15+
if (xhttp.status === 200) {
16+
const data = JSON.parse(xhttp.responseText);
17+
const currentPath = window.location.pathname.split('/');
18+
const releases = [];
19+
for (const release of data) {
20+
currentPath[2] = release.version;
21+
releases.push(`\
22+
<li class="pure-menu-item">
23+
<a href="${currentPath.join('/')}" rel="nofollow" class="pure-menu-link">${release["version"]}</a>
24+
</li>`);
25+
}
26+
document.getElementById('releases-list').innerHTML = `\
27+
<ul class="pure-menu-list">${releases.join('')}</ul>`;
28+
} else {
29+
console.error(`Failed to load release list: [${xhttp.status}] ${xhttp.responseText}`);
30+
document.getElementById('releases-list').innerHTML = "Failed to load release list";
31+
}
32+
};
33+
xhttp.open("GET", `/${crate_name}/releases`, true);
34+
xhttp.send();
35+
// To prevent reloading the list unnecessarily.
36+
loadReleases = function() {};
37+
};
38+
839
// Allow menus to be open and used by keyboard.
940
(function() {
1041
var currentMenu;
@@ -53,6 +84,7 @@ const updateMenuPositionForSubMenu = (currentMenuSupplier) => {
5384
currentMenu = newMenu;
5485
newMenu.className += " pure-menu-active";
5586
backdrop.style.display = "block";
87+
loadReleases();
5688
}
5789
function menuOnClick(e) {
5890
if (this.getAttribute("href") != "#") {

templates/rustdoc/topbar.html

+2-5
Original file line numberDiff line numberDiff line change
@@ -134,11 +134,8 @@
134134
<li class="pure-menu-heading">Versions</li>
135135

136136
<li class="pure-menu-item">
137-
<div class="pure-menu pure-menu-scrollable sub-menu" tabindex="-1">
138-
<ul class="pure-menu-list">
139-
{# Display all releases of this crate #}
140-
{{ macros::releases_list(name=krate.name, releases=krate.releases, target=target, inner_path=inner_path) }}
141-
</ul>
137+
<div class="pure-menu pure-menu-scrollable sub-menu" id="releases-list" tabindex="-1">
138+
<span class="rotate"></span>
142139
</div>
143140
</li>
144141
</ul>

templates/style/_navbar.scss

+17
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,15 @@ body {
1515
padding: 0;
1616
}
1717

18+
@keyframes rotating_text {
19+
from {
20+
transform: rotate(0deg);
21+
}
22+
to {
23+
transform: rotate(360deg);
24+
}
25+
}
26+
1827
div.nav-container {
1928
// Nothing is supposed to be over or hovering the top navbar. Maybe add a few others '('? :)
2029
z-index: 999;
@@ -324,6 +333,14 @@ div.nav-container {
324333
}
325334
}
326335
}
336+
337+
#releases-list {
338+
.rotate {
339+
display: inline-block;
340+
font-size: 30px;
341+
animation: rotating_text 2s linear infinite;
342+
}
343+
}
327344
}
328345

329346
#nav-search {

0 commit comments

Comments
 (0)