diff --git a/src/web/metrics.rs b/src/web/metrics.rs index 7978a4079..89a2d15f1 100644 --- a/src/web/metrics.rs +++ b/src/web/metrics.rs @@ -121,6 +121,7 @@ mod tests { ("/-/static/index.js", "static resource"), ("/-/static/menu.js", "static resource"), ("/-/static/keyboard.js", "static resource"), + ("/-/static/source.js", "static resource"), ("/-/static/opensearch.xml", "static resource"), ("/releases", "/releases"), ("/releases/feed", "static resource"), diff --git a/src/web/statics.rs b/src/web/statics.rs index 3a64eceee..f3f9a3d39 100644 --- a/src/web/statics.rs +++ b/src/web/statics.rs @@ -228,6 +228,24 @@ mod tests { }); } + #[test] + fn source_js() { + wrapper(|env| { + let web = env.frontend(); + + let resp = web.get("/-/static/source.js").send()?; + assert!(resp.status().is_success()); + assert_eq!( + resp.headers().get("Content-Type"), + Some(&"application/javascript".parse().unwrap()), + ); + assert!(resp.content_length().unwrap() > 10); + assert!(resp.text()?.contains("toggleSource")); + + Ok(()) + }); + } + #[test] fn static_files() { wrapper(|env| { diff --git a/static/source.js b/static/source.js new file mode 100644 index 000000000..9bd14cfac --- /dev/null +++ b/static/source.js @@ -0,0 +1,41 @@ +(function() { + var oldLabel; + + function showSourceFiles(button, sideMenu, sourceCode) { + button.title = oldLabel; + button.setAttribute("aria-label", button.title); + button.setAttribute("aria-expanded", "true"); + + sideMenu.classList.remove("collapsed"); + sourceCode.classList.remove("expanded"); + } + + function hideSourceFiles(button, sideMenu, sourceCode) { + button.title = "Show source sidebar"; + button.setAttribute("aria-label", button.title); + button.setAttribute("aria-expanded", "false"); + + sideMenu.classList.add("collapsed"); + sourceCode.classList.add("expanded"); + } + + function toggleSource(button) { + var sideMenu = document.getElementById("side-menu"); + var sourceCode = document.getElementById("source-code"); + + if (sideMenu.classList.contains("collapsed")) { + showSourceFiles(button, sideMenu, sourceCode); + } else { + hideSourceFiles(button, sideMenu, sourceCode); + } + } + + document.addEventListener("DOMContentLoaded", function(event) { + var toggleSourceButton = document.querySelector("li.toggle-source button"); + oldLabel = toggleSourceButton.getAttribute("aria-label"); + + toggleSourceButton.addEventListener("click", function() { + toggleSource(toggleSourceButton); + }); + }); +})(); diff --git a/templates/crate/source.html b/templates/crate/source.html index 4312e924d..f9ae49760 100644 --- a/templates/crate/source.html +++ b/templates/crate/source.html @@ -24,13 +24,19 @@ {%- block body -%}