docbrown/app/javascript/utilities/codeFullscreenModeSwitcher.js
rhymes f9506affb5
Use faster JS selection methods (#11409)
* Add JS tips section to frontend documentation

* Replace document.getElementsByTagName('body') with document.body

* Replace querySelectorAll with faster selecting methods where appropriate

* Replace querySelector with faster selecting methods where appropriate

* Fix typo

* Fix forEach and getElementsByClassName

* Change querySelector* to faster methods in erb files

* Change querySelector* to faster methods in ruby files

* Fix runkit tag

* Various fixes

* Update app/assets/javascripts/initializers/initializeEllipsisMenu.js

Co-authored-by: Ridhwana <Ridhwana.Khan16@gmail.com>

* Update app/assets/javascripts/utilities/slideSidebar.js

Co-authored-by: Ridhwana <Ridhwana.Khan16@gmail.com>

* Commenting out flaky spec

Co-authored-by: Ridhwana <Ridhwana.Khan16@gmail.com>
2020-11-16 17:35:50 +01:00

86 lines
2.2 KiB
JavaScript

let isFullScreenModeCodeOn = false;
let screenScroll = 0;
const fullScreenWindow = document.getElementsByClassName(
'js-fullscreen-code',
)[0];
const body = document.body;
function setAfterFullScreenScrollPosition() {
window.scrollTo(0, screenScroll);
}
function getBeforeFullScreenScrollPosition() {
screenScroll = window.scrollY;
}
function onPressEscape(event) {
if (event.key == 'Escape') {
fullScreenModeControl(event);
}
}
function listenToKeyboardForEscape(listen) {
if (listen) {
document.body.addEventListener('keyup', onPressEscape);
} else {
document.body.removeEventListener('keyup', onPressEscape);
}
}
function toggleOverflowForDocument(overflow) {
if (overflow) {
body.style.overflow = 'hidden';
} else {
body.style.overflow = '';
}
}
function addFullScreenModeControl(elements) {
if (elements) {
for (let element of elements) {
element.addEventListener('click', fullScreenModeControl);
}
}
}
function removeFullScreenModeControl(elements) {
if (elements) {
for (let element of elements) {
element.removeEventListener('click', fullScreenModeControl);
}
}
}
function fullScreenModeControl(event) {
const codeBlock = event.currentTarget.closest('.js-code-highlight')
? event.currentTarget.closest('.js-code-highlight').cloneNode(true)
: null;
const codeBlockControls = codeBlock
? codeBlock.getElementsByClassName('js-fullscreen-code-action')
: null;
if (isFullScreenModeCodeOn) {
toggleOverflowForDocument(false);
setAfterFullScreenScrollPosition();
listenToKeyboardForEscape(false);
removeFullScreenModeControl(codeBlockControls);
fullScreenWindow.classList.remove('is-open');
fullScreenWindow.removeChild(fullScreenWindow.childNodes[0]);
isFullScreenModeCodeOn = false;
} else {
toggleOverflowForDocument(true);
getBeforeFullScreenScrollPosition();
listenToKeyboardForEscape(true);
codeBlock.classList.add('is-fullscreen');
fullScreenWindow.appendChild(codeBlock);
fullScreenWindow.classList.add('is-open');
addFullScreenModeControl(codeBlockControls);
isFullScreenModeCodeOn = true;
}
}
export default addFullScreenModeControl;