mirror of
https://github.com/google/comprehensive-rust.git
synced 2025-06-08 02:26:14 +02:00
Saving playground code state (#1917)
The embedded Playground's code reset when you navigate between slides. This has caused problems: if people navigate away from a slide to look something up, they've suddenly lost their work.
This commit is contained in:
parent
6b3eb83bff
commit
b7a6e3b46d
@ -46,7 +46,12 @@ urlcolor = "red"
|
|||||||
|
|
||||||
[output.html]
|
[output.html]
|
||||||
curly-quotes = true
|
curly-quotes = true
|
||||||
additional-js = ["theme/speaker-notes.js", "theme/redbox.js"]
|
additional-js = [
|
||||||
|
"theme/speaker-notes.js",
|
||||||
|
"theme/redbox.js",
|
||||||
|
"theme/save-playgrounds.js",
|
||||||
|
"theme/instructor-menu.js",
|
||||||
|
]
|
||||||
additional-css = [
|
additional-css = [
|
||||||
"theme/css/svgbob.css",
|
"theme/css/svgbob.css",
|
||||||
"theme/css/redbox.css",
|
"theme/css/redbox.css",
|
||||||
|
@ -18,3 +18,7 @@ div#aspect-ratio-helper div {
|
|||||||
of vertical space to borders. */
|
of vertical space to borders. */
|
||||||
aspect-ratio: 16/8.5;
|
aspect-ratio: 16/8.5;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#instructor-menu-list {
|
||||||
|
margin-left: 55px;
|
||||||
|
}
|
||||||
|
71
theme/instructor-menu.js
Normal file
71
theme/instructor-menu.js
Normal file
@ -0,0 +1,71 @@
|
|||||||
|
(function handleInstructor() {
|
||||||
|
function handleInstructorMenu() {
|
||||||
|
let leftButtons = document.getElementsByClassName("left-buttons")[0];
|
||||||
|
let instructorMenu = document.createElement("button");
|
||||||
|
let instructorMenuList = document.createElement("ul");
|
||||||
|
let redBoxItem = document.createElement("li");
|
||||||
|
let redBoxButton = document.createElement("button");
|
||||||
|
let playgroundStateItem = document.createElement("li");
|
||||||
|
let playgroundStateButton = document.createElement("button");
|
||||||
|
|
||||||
|
leftButtons.insertBefore(instructorMenu, leftButtons.lastChild);
|
||||||
|
leftButtons.insertBefore(instructorMenuList, leftButtons.lastChild);
|
||||||
|
instructorMenuList.insertBefore(redBoxItem, instructorMenuList.lastChild);
|
||||||
|
instructorMenuList.insertBefore(
|
||||||
|
playgroundStateItem,
|
||||||
|
instructorMenuList.lastChild
|
||||||
|
);
|
||||||
|
redBoxItem.insertBefore(redBoxButton, redBoxItem.lastChild);
|
||||||
|
playgroundStateItem.insertBefore(
|
||||||
|
playgroundStateButton,
|
||||||
|
playgroundStateItem.lastChild
|
||||||
|
);
|
||||||
|
|
||||||
|
instructorMenu.title = "Utilities for course instructors";
|
||||||
|
instructorMenu.innerHTML =
|
||||||
|
'<i class="fa fa-ellipsis-v" aria-hidden="true"></i>';
|
||||||
|
redBoxButton.innerHTML = "aspect-ratio box";
|
||||||
|
redBoxButton.title =
|
||||||
|
"Outline the area that fits on one screen while teaching the course.";
|
||||||
|
playgroundStateButton.innerHTML = "reset all playgrounds";
|
||||||
|
playgroundStateButton.title =
|
||||||
|
"Reset code in all playgrounds to its original value.";
|
||||||
|
|
||||||
|
instructorMenu.className = "icon-button";
|
||||||
|
instructorMenuList.className = "theme-popup";
|
||||||
|
redBoxButton.className = "theme";
|
||||||
|
playgroundStateButton.className = "theme";
|
||||||
|
instructorMenuList.style.display = "none";
|
||||||
|
|
||||||
|
instructorMenuList.role = "menu";
|
||||||
|
redBoxItem.role = "none";
|
||||||
|
playgroundStateItem.role = "none";
|
||||||
|
redBoxButton.role = "menuitem";
|
||||||
|
playgroundStateButton.role = "menuitem";
|
||||||
|
|
||||||
|
redBoxButton.id = "redbox";
|
||||||
|
instructorMenuList.id = "instructor-menu-list";
|
||||||
|
playgroundStateButton.id = "playground-state";
|
||||||
|
|
||||||
|
instructorMenu.addEventListener("click", () => {
|
||||||
|
if (instructorMenuList.style.display === "none") {
|
||||||
|
instructorMenuList.style.display = "block";
|
||||||
|
} else {
|
||||||
|
instructorMenuList.style.display = "none";
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
document.addEventListener("click", (e) => {
|
||||||
|
if (!instructorMenu.contains(e.target)) {
|
||||||
|
instructorMenuList.style.display = "none";
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
handleInstructorMenu();
|
||||||
|
var redBoxButton = document.getElementById("redbox");
|
||||||
|
var playgroundStateButton = document.getElementById("playground-state");
|
||||||
|
redBoxButton.addEventListener("click", () => window.redboxButtonClicked());
|
||||||
|
playgroundStateButton.addEventListener("click", () =>
|
||||||
|
window.resetPlaygroundsClicked()
|
||||||
|
);
|
||||||
|
})();
|
@ -11,28 +11,19 @@
|
|||||||
var parentElement = document.body; // Change this to your desired parent element
|
var parentElement = document.body; // Change this to your desired parent element
|
||||||
// Append the new div to the parent element
|
// Append the new div to the parent element
|
||||||
parentElement.insertBefore(newDiv, parentElement.firstChild);
|
parentElement.insertBefore(newDiv, parentElement.firstChild);
|
||||||
// Create the button element
|
|
||||||
var hideShowButton = document.createElement("button");
|
|
||||||
hideShowButton.innerHTML = '<i class="fa fa-square-o"></i>';
|
|
||||||
hideShowButton.className = "icon-button";
|
|
||||||
hideShowButton.type = "button";
|
|
||||||
hideShowButton.title =
|
|
||||||
"Outline the area that fits on one screen while teaching the course.";
|
|
||||||
hideShowButton.id = "Dev";
|
|
||||||
var navbarButtons = document.getElementsByClassName("left-buttons");
|
|
||||||
navbarButtons[0].insertBefore(hideShowButton, navbarButtons.firstChild);
|
|
||||||
//Default hiding the redbox
|
//Default hiding the redbox
|
||||||
document.getElementById("aspect-ratio-helper").style.display = "none";
|
document.getElementById("aspect-ratio-helper").style.display = "none";
|
||||||
//Add Event listener to button to perform on click action.
|
|
||||||
hideShowButton.addEventListener("click", function () {
|
|
||||||
if (
|
|
||||||
document.getElementById("aspect-ratio-helper").style.display === "none"
|
|
||||||
) {
|
|
||||||
document.getElementById("aspect-ratio-helper").style.display = "block";
|
|
||||||
hideShowButton.innerHTML = '<i class="fa fa-square"></i>';
|
|
||||||
} else {
|
|
||||||
document.getElementById("aspect-ratio-helper").style.display = "none";
|
|
||||||
hideShowButton.innerHTML = '<i class="fa fa-square-o"></i>';
|
|
||||||
}
|
|
||||||
});
|
|
||||||
})();
|
})();
|
||||||
|
|
||||||
|
//Create a function to button to perform on click action.
|
||||||
|
function redboxButtonClicked() {
|
||||||
|
var hideShowButton = document.getElementById("redbox");
|
||||||
|
if (document.getElementById("aspect-ratio-helper").style.display === "none") {
|
||||||
|
document.getElementById("aspect-ratio-helper").style.display = "block";
|
||||||
|
hideShowButton.innerHTML = "aspect-ratio box";
|
||||||
|
} else {
|
||||||
|
document.getElementById("aspect-ratio-helper").style.display = "none";
|
||||||
|
hideShowButton.innerHTML = "aspect-ratio box";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
window.redboxButtonClicked = redboxButtonClicked;
|
||||||
|
46
theme/save-playgrounds.js
Normal file
46
theme/save-playgrounds.js
Normal file
@ -0,0 +1,46 @@
|
|||||||
|
(function savePlaygrounds() {
|
||||||
|
function setCodeToPlayground() {
|
||||||
|
var codes = JSON.parse(
|
||||||
|
localStorage.getItem(`${window.location.href}₹code`)
|
||||||
|
);
|
||||||
|
if (codes) {
|
||||||
|
var i = 0;
|
||||||
|
Array.from(document.querySelectorAll(".playground")).forEach(function (
|
||||||
|
pre_block
|
||||||
|
) {
|
||||||
|
let code_block = pre_block.querySelector("code");
|
||||||
|
let editor = window.ace.edit(code_block);
|
||||||
|
editor.setValue(codes[i]);
|
||||||
|
editor.clearSelection();
|
||||||
|
i += 1;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
function getCodeFromPlayground() {
|
||||||
|
var codes = [];
|
||||||
|
Array.from(document.querySelectorAll(".playground")).forEach(function (
|
||||||
|
pre_block
|
||||||
|
) {
|
||||||
|
let code_block = pre_block.querySelector("code");
|
||||||
|
let editor = window.ace.edit(code_block);
|
||||||
|
let code = editor.getValue();
|
||||||
|
codes.push(code);
|
||||||
|
});
|
||||||
|
localStorage.setItem(`${window.location.href}₹code`, JSON.stringify(codes));
|
||||||
|
}
|
||||||
|
setCodeToPlayground();
|
||||||
|
addEventListener("pagehide", getCodeFromPlayground);
|
||||||
|
})();
|
||||||
|
|
||||||
|
function resetPlaygroundsClicked() {
|
||||||
|
let keys = [];
|
||||||
|
for (var i = 0, len = localStorage.length; i < len; i++) {
|
||||||
|
if (localStorage.key(i).includes("₹code")) {
|
||||||
|
keys.push(localStorage.key(i));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for (let j = 0; j < keys.length; j++) {
|
||||||
|
localStorage.removeItem(keys[j]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
window.resetPlaygroundsClicked = resetPlaygroundsClicked;
|
Loading…
x
Reference in New Issue
Block a user