-
Notifications
You must be signed in to change notification settings - Fork 1.7k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Saving playground code state #1917
Changes from 16 commits
6fdae32
65e4327
61403a5
58b36a1
9a42d76
23f7592
5a27433
7c51897
8fea0af
55729b0
c12f277
9d03037
ed05702
138fbd7
28fbdd9
8889a48
7a0de16
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,74 @@ | ||
(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.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() | ||
); | ||
})(); |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,46 @@ | ||
(function savePlaygrounds() { | ||
function setCodeToPlayground() { | ||
var codes = JSON.parse( | ||
localStorage.getItem(`${window.location.href}₹code`) | ||
djmitche marked this conversation as resolved.
Show resolved
Hide resolved
|
||
); | ||
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)); | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Has it already been discussed what the Have you considered using just the There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Oh, if the There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
Sorry, I didn't understand creating of "another function for key creating". There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Hey @mani-chand, I'm suggesting creating a one-line function which returns the correct key for the current page. Something like function localStorageKey() {
// The '₹' here is used for ...
return `${window.location.href}₹code`
} You should then explain what |
||
} | ||
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; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Did you discuss simply adding this to the theme instead? Since this will be a permanent thing on all pages, it should go into index.hbs or head.hbs.
That would simplify the code a lot since you can just write out the HTML directly.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Why was this not done for the red box, you might ask? Because that was not supposed to be rendered for people looking at the course in the published version.