diff --git a/resources/assets/js/controllers.js b/resources/assets/js/controllers.js index 1b5bef797..3a465da97 100644 --- a/resources/assets/js/controllers.js +++ b/resources/assets/js/controllers.js @@ -2,6 +2,8 @@ import moment from 'moment'; import 'moment/locale/en-gb'; +import editorOptions from "./pages/page-form"; + moment.locale('en-gb'); export default function (ngApp, events) { @@ -23,14 +25,14 @@ export default function (ngApp, events) { $scope.searching = false; $scope.searchTerm = ''; - var page = 0; - var previousClickTime = 0; - var previousClickImage = 0; - var dataLoaded = false; - var callback = false; + let page = 0; + let previousClickTime = 0; + let previousClickImage = 0; + let dataLoaded = false; + let callback = false; - var preSearchImages = []; - var preSearchHasMore = false; + let preSearchImages = []; + let preSearchHasMore = false; /** * Used by dropzone to get the endpoint to upload to. @@ -79,9 +81,9 @@ export default function (ngApp, events) { * @param image */ $scope.imageSelect = function (image) { - var dblClickTime = 300; - var currentTime = Date.now(); - var timeDiff = currentTime - previousClickTime; + let dblClickTime = 300; + let currentTime = Date.now(); + let timeDiff = currentTime - previousClickTime; if (timeDiff < dblClickTime && image.id === previousClickImage) { // If double click @@ -137,19 +139,19 @@ export default function (ngApp, events) { $('#image-manager').find('.overlay').fadeOut(240); }; - var baseUrl = window.baseUrl('/images/' + $scope.imageType + '/all/'); + let baseUrl = window.baseUrl('/images/' + $scope.imageType + '/all/'); /** * Fetch the list image data from the server. */ function fetchData() { - var url = baseUrl + page + '?'; - var components = {}; + let url = baseUrl + page + '?'; + let components = {}; if ($scope.uploadedTo) components['page_id'] = $scope.uploadedTo; if ($scope.searching) components['term'] = $scope.searchTerm; - var urlQueryString = Object.keys(components).map((key) => { + let urlQueryString = Object.keys(components).map((key) => { return key + '=' + encodeURIComponent(components[key]); }).join('&'); url += urlQueryString; @@ -205,13 +207,13 @@ export default function (ngApp, events) { */ $scope.saveImageDetails = function (event) { event.preventDefault(); - var url = window.baseUrl('/images/update/' + $scope.selectedImage.id); + let url = window.baseUrl('/images/update/' + $scope.selectedImage.id); $http.put(url, this.selectedImage).then(response => { events.emit('success', 'Image details updated'); }, (response) => { if (response.status === 422) { - var errors = response.data; - var message = ''; + let errors = response.data; + let message = ''; Object.keys(errors).forEach((key) => { message += errors[key].join('\n'); }); @@ -230,8 +232,8 @@ export default function (ngApp, events) { */ $scope.deleteImage = function (event) { event.preventDefault(); - var force = $scope.dependantPages !== false; - var url = window.baseUrl('/images/' + $scope.selectedImage.id); + let force = $scope.dependantPages !== false; + let url = window.baseUrl('/images/' + $scope.selectedImage.id); if (force) url += '?force=true'; $http.delete(url).then((response) => { $scope.images.splice($scope.images.indexOf($scope.selectedImage), 1); @@ -266,11 +268,11 @@ export default function (ngApp, events) { $scope.searchBook = function (e) { e.preventDefault(); - var term = $scope.searchTerm; + let term = $scope.searchTerm; if (term.length == 0) return; $scope.searching = true; $scope.searchResults = ''; - var searchUrl = window.baseUrl('/search/book/' + $attrs.bookId); + let searchUrl = window.baseUrl('/search/book/' + $attrs.bookId); searchUrl += '?term=' + encodeURIComponent(term); $http.get(searchUrl).then((response) => { $scope.searchResults = $sce.trustAsHtml(response.data); @@ -294,13 +296,13 @@ export default function (ngApp, events) { ngApp.controller('PageEditController', ['$scope', '$http', '$attrs', '$interval', '$timeout', '$sce', function ($scope, $http, $attrs, $interval, $timeout, $sce) { - $scope.editorOptions = require('./pages/page-form'); + $scope.editorOptions = editorOptions(); $scope.editContent = ''; $scope.draftText = ''; - var pageId = Number($attrs.pageId); - var isEdit = pageId !== 0; - var autosaveFrequency = 30; // AutoSave interval in seconds. - var isMarkdown = $attrs.editorType === 'markdown'; + let pageId = Number($attrs.pageId); + let isEdit = pageId !== 0; + let autosaveFrequency = 30; // AutoSave interval in seconds. + let isMarkdown = $attrs.editorType === 'markdown'; $scope.draftsEnabled = $attrs.draftsEnabled === 'true'; $scope.isUpdateDraft = Number($attrs.pageUpdateDraft) === 1; $scope.isNewPageDraft = Number($attrs.pageNewDraft) === 1; @@ -312,9 +314,9 @@ export default function (ngApp, events) { $scope.draftText = 'Editing Page' } - var autoSave = false; + let autoSave = false; - var currentContent = { + let currentContent = { title: false, html: false }; @@ -351,8 +353,8 @@ export default function (ngApp, events) { autoSave = $interval(() => { // Return if manually saved recently to prevent bombarding the server if (Date.now() - lastSave < (1000*autosaveFrequency)/2) return; - var newTitle = $('#name').val(); - var newHtml = $scope.editContent; + let newTitle = $('#name').val(); + let newHtml = $scope.editContent; if (newTitle !== currentContent.title || newHtml !== currentContent.html) { currentContent.html = newHtml; @@ -369,7 +371,7 @@ export default function (ngApp, events) { */ function saveDraft() { if (!$scope.draftsEnabled) return; - var data = { + let data = { name: $('#name').val(), html: isMarkdown ? $sce.getTrustedHtml($scope.displayContent) : $scope.editContent }; @@ -379,7 +381,7 @@ export default function (ngApp, events) { let url = window.baseUrl('/ajax/page/' + pageId + '/save-draft'); $http.put(url, data).then(responseData => { draftErroring = false; - var updateTime = moment.utc(moment.unix(responseData.data.timestamp)).toDate(); + let updateTime = moment.utc(moment.unix(responseData.data.timestamp)).toDate(); $scope.draftText = responseData.data.message + moment(updateTime).format('HH:mm'); if (!$scope.isNewPageDraft) $scope.isUpdateDraft = true; showDraftSaveNotification(); diff --git a/resources/assets/js/directives.js b/resources/assets/js/directives.js index 44d1a14e1..28c4f6e17 100644 --- a/resources/assets/js/directives.js +++ b/resources/assets/js/directives.js @@ -1,8 +1,8 @@ "use strict"; -const DropZone = require('dropzone'); -const markdown = require('marked'); +import DropZone from "dropzone"; +import markdown from "marked"; -module.exports = function (ngApp, events) { +export default function (ngApp, events) { /** * Toggle Switches @@ -190,14 +190,14 @@ module.exports = function (ngApp, events) { }, link: function (scope, element, attrs) { if (attrs.placeholder) element[0].querySelector('.dz-message').textContent = attrs.placeholder; - var dropZone = new DropZone(element[0].querySelector('.dropzone-container'), { + let dropZone = new DropZone(element[0].querySelector('.dropzone-container'), { url: scope.uploadUrl, init: function () { - var dz = this; + let dz = this; dz.on('sending', function (file, xhr, data) { - var token = window.document.querySelector('meta[name=token]').getAttribute('content'); + let token = window.document.querySelector('meta[name=token]').getAttribute('content'); data.append('_token', token); - var uploadedTo = typeof scope.uploadedTo === 'undefined' ? 0 : scope.uploadedTo; + let uploadedTo = typeof scope.uploadedTo === 'undefined' ? 0 : scope.uploadedTo; data.append('uploaded_to', uploadedTo); }); if (typeof scope.eventSuccess !== 'undefined') dz.on('success', scope.eventSuccess); @@ -273,7 +273,7 @@ module.exports = function (ngApp, events) { function tinyMceSetup(editor) { editor.on('ExecCommand change NodeChange ObjectResized', (e) => { - var content = editor.getContent(); + let content = editor.getContent(); $timeout(() => { scope.mceModel = content; }); @@ -301,9 +301,9 @@ module.exports = function (ngApp, events) { // Custom tinyMCE plugins tinymce.PluginManager.add('customhr', function (editor) { editor.addCommand('InsertHorizontalRule', function () { - var hrElem = document.createElement('hr'); - var cNode = editor.selection.getNode(); - var parentNode = cNode.parentNode; + let hrElem = document.createElement('hr'); + let cNode = editor.selection.getNode(); + let parentNode = cNode.parentNode; parentNode.insertBefore(hrElem, cNode); }); @@ -474,9 +474,9 @@ module.exports = function (ngApp, events) { function editorPaste(e) { e = e.originalEvent; if (!e.clipboardData) return - var items = e.clipboardData.items; + let items = e.clipboardData.items; if (!items) return; - for (var i = 0; i < items.length; i++) { + for (let i = 0; i < items.length; i++) { uploadImage(items[i].getAsFile()); } } @@ -498,12 +498,12 @@ module.exports = function (ngApp, events) { // Handle image upload and add image into markdown content function uploadImage(file) { if (file.type.indexOf('image') !== 0) return; - var formData = new FormData(); - var ext = 'png'; - var xhr = new XMLHttpRequest(); + let formData = new FormData(); + let ext = 'png'; + let xhr = new XMLHttpRequest(); if (file.name) { - var fileNameMatches = file.name.match(/\.(.+)$/); + let fileNameMatches = file.name.match(/\.(.+)$/); if (fileNameMatches) { ext = fileNameMatches[1]; } @@ -531,7 +531,7 @@ module.exports = function (ngApp, events) { xhr.onload = function () { let selectStart = input[0].selectionStart; if (xhr.status === 200 || xhr.status === 201) { - var result = JSON.parse(xhr.responseText); + let result = JSON.parse(xhr.responseText); input[0].value = input[0].value.replace(placeholderImage, result.thumbs.display); input.change(); } else { @@ -732,14 +732,13 @@ module.exports = function (ngApp, events) { // Build suggestions $suggestionBox[0].innerHTML = ''; for (let i = 0; i < suggestions.length; i++) { - var suggestion = document.createElement('li'); + let suggestion = document.createElement('li'); suggestion.textContent = suggestions[i]; suggestion.onclick = suggestionClick; if (i === 0) { - suggestion.className = 'active' + suggestion.className = 'active'; active = 0; } - ; $suggestionBox[0].appendChild(suggestion); } @@ -748,12 +747,11 @@ module.exports = function (ngApp, events) { // Suggestion click event function suggestionClick(event) { - let text = this.textContent; - currentInput[0].value = text; + currentInput[0].value = this.textContent; currentInput.focus(); $suggestionBox.hide(); isShowing = false; - }; + } // Get suggestions & cache function getSuggestions(input, url) { @@ -843,7 +841,7 @@ module.exports = function (ngApp, events) { const input = element.find('[entity-selector-input]').first(); // Detect double click events - var lastClick = 0; + let lastClick = 0; function isDoubleClick() { let now = Date.now(); let answer = now - lastClick < 300; diff --git a/resources/assets/js/global.js b/resources/assets/js/global.js index 9aa5dff52..0f2bbbf20 100644 --- a/resources/assets/js/global.js +++ b/resources/assets/js/global.js @@ -1,11 +1,11 @@ "use strict"; // AngularJS - Create application and load components -var angular = require('angular'); -var ngResource = require('angular-resource'); -var ngAnimate = require('angular-animate'); -var ngSanitize = require('angular-sanitize'); -require('angular-ui-sortable'); +import angular from "angular"; +import "angular-resource"; +import "angular-animate"; +import "angular-sanitize"; +import "angular-ui-sortable"; // Url retrieval function window.baseUrl = function(path) { @@ -15,7 +15,7 @@ window.baseUrl = function(path) { return basePath + '/' + path; }; -var ngApp = angular.module('bookStack', ['ngResource', 'ngAnimate', 'ngSanitize', 'ui.sortable']); +let ngApp = angular.module('bookStack', ['ngResource', 'ngAnimate', 'ngSanitize', 'ui.sortable']); // Global Event System class EventManager { @@ -25,9 +25,9 @@ class EventManager { emit(eventName, eventData) { if (typeof this.listeners[eventName] === 'undefined') return this; - var eventsToStart = this.listeners[eventName]; + let eventsToStart = this.listeners[eventName]; for (let i = 0; i < eventsToStart.length; i++) { - var event = eventsToStart[i]; + let event = eventsToStart[i]; event(eventData); } return this; @@ -72,10 +72,10 @@ jQuery.expr[":"].contains = $.expr.createPseudo(function (arg) { // Global jQuery Elements $(function () { - var notifications = $('.notification'); - var successNotification = notifications.filter('.pos'); - var errorNotification = notifications.filter('.neg'); - var warningNotification = notifications.filter('.warning'); + let notifications = $('.notification'); + let successNotification = notifications.filter('.pos'); + let errorNotification = notifications.filter('.neg'); + let warningNotification = notifications.filter('.warning'); // Notification Events window.Events.listen('success', function (text) { successNotification.hide(); @@ -109,9 +109,9 @@ $(function () { $('#back-to-top').click(function() { $('#header').smoothScrollTo(); }); - var scrollTopShowing = false; - var scrollTop = document.getElementById('back-to-top'); - var scrollTopBreakpoint = 1200; + let scrollTopShowing = false; + let scrollTop = document.getElementById('back-to-top'); + let scrollTopBreakpoint = 1200; window.addEventListener('scroll', function() { let scrollTopPos = document.documentElement.scrollTop || document.body.scrollTop || 0; if (!scrollTopShowing && scrollTopPos > scrollTopBreakpoint) { @@ -159,4 +159,4 @@ $(function () { }); // Page specific items -require('./pages/page-show'); +import "./pages/page-show"; diff --git a/resources/assets/js/pages/page-form.js b/resources/assets/js/pages/page-form.js index 1fb8b915f..e1c0cfe8f 100644 --- a/resources/assets/js/pages/page-form.js +++ b/resources/assets/js/pages/page-form.js @@ -60,108 +60,108 @@ function registerEditorShortcuts(editor) { editor.addShortcut('meta+shift+E', '', ['FormatBlock', false, 'code']); } -var mceOptions = module.exports = { - selector: '#html-editor', - content_css: [ - window.baseUrl('/css/styles.css'), - window.baseUrl('/libs/material-design-iconic-font/css/material-design-iconic-font.min.css') - ], - body_class: 'page-content', - relative_urls: false, - remove_script_host: false, - document_base_url: window.baseUrl('/'), - statusbar: false, - menubar: false, - paste_data_images: false, - extended_valid_elements: 'pre[*]', - automatic_uploads: false, - valid_children: "-div[p|pre|h1|h2|h3|h4|h5|h6|blockquote]", - plugins: "image table textcolor paste link fullscreen imagetools code customhr autosave lists", - imagetools_toolbar: 'imageoptions', - toolbar: "undo redo | styleselect | bold italic underline strikethrough superscript subscript | forecolor backcolor | alignleft aligncenter alignright alignjustify | bullist numlist outdent indent | table image-insert link hr | removeformat code fullscreen", - content_style: "body {padding-left: 15px !important; padding-right: 15px !important; margin:0!important; margin-left:auto!important;margin-right:auto!important;}", - style_formats: [ - {title: "Header Large", format: "h2"}, - {title: "Header Medium", format: "h3"}, - {title: "Header Small", format: "h4"}, - {title: "Header Tiny", format: "h5"}, - {title: "Paragraph", format: "p", exact: true, classes: ''}, - {title: "Blockquote", format: "blockquote"}, - {title: "Code Block", icon: "code", format: "pre"}, - {title: "Inline Code", icon: "code", inline: "code"}, - {title: "Callouts", items: [ - {title: "Success", block: 'p', exact: true, attributes : {'class' : 'callout success'}}, - {title: "Info", block: 'p', exact: true, attributes : {'class' : 'callout info'}}, - {title: "Warning", block: 'p', exact: true, attributes : {'class' : 'callout warning'}}, - {title: "Danger", block: 'p', exact: true, attributes : {'class' : 'callout danger'}} - ]} - ], - style_formats_merge: false, - formats: { - alignleft: {selector: 'p,h1,h2,h3,h4,h5,h6,td,th,div,ul,ol,li,table,img', classes: 'align-left'}, - aligncenter: {selector: 'p,h1,h2,h3,h4,h5,h6,td,th,div,ul,ol,li,table,img', classes: 'align-center'}, - alignright: {selector: 'p,h1,h2,h3,h4,h5,h6,td,th,div,ul,ol,li,table,img', classes: 'align-right'}, - }, - file_browser_callback: function (field_name, url, type, win) { +export default function() { + let settings = { + selector: '#html-editor', + content_css: [ + window.baseUrl('/css/styles.css'), + window.baseUrl('/libs/material-design-iconic-font/css/material-design-iconic-font.min.css') + ], + body_class: 'page-content', + relative_urls: false, + remove_script_host: false, + document_base_url: window.baseUrl('/'), + statusbar: false, + menubar: false, + paste_data_images: false, + extended_valid_elements: 'pre[*]', + automatic_uploads: false, + valid_children: "-div[p|pre|h1|h2|h3|h4|h5|h6|blockquote]", + plugins: "image table textcolor paste link fullscreen imagetools code customhr autosave lists", + imagetools_toolbar: 'imageoptions', + toolbar: "undo redo | styleselect | bold italic underline strikethrough superscript subscript | forecolor backcolor | alignleft aligncenter alignright alignjustify | bullist numlist outdent indent | table image-insert link hr | removeformat code fullscreen", + content_style: "body {padding-left: 15px !important; padding-right: 15px !important; margin:0!important; margin-left:auto!important;margin-right:auto!important;}", + style_formats: [ + {title: "Header Large", format: "h2"}, + {title: "Header Medium", format: "h3"}, + {title: "Header Small", format: "h4"}, + {title: "Header Tiny", format: "h5"}, + {title: "Paragraph", format: "p", exact: true, classes: ''}, + {title: "Blockquote", format: "blockquote"}, + {title: "Code Block", icon: "code", format: "pre"}, + {title: "Inline Code", icon: "code", inline: "code"}, + {title: "Callouts", items: [ + {title: "Success", block: 'p', exact: true, attributes : {'class' : 'callout success'}}, + {title: "Info", block: 'p', exact: true, attributes : {'class' : 'callout info'}}, + {title: "Warning", block: 'p', exact: true, attributes : {'class' : 'callout warning'}}, + {title: "Danger", block: 'p', exact: true, attributes : {'class' : 'callout danger'}} + ]} + ], + style_formats_merge: false, + formats: { + alignleft: {selector: 'p,h1,h2,h3,h4,h5,h6,td,th,div,ul,ol,li,table,img', classes: 'align-left'}, + aligncenter: {selector: 'p,h1,h2,h3,h4,h5,h6,td,th,div,ul,ol,li,table,img', classes: 'align-center'}, + alignright: {selector: 'p,h1,h2,h3,h4,h5,h6,td,th,div,ul,ol,li,table,img', classes: 'align-right'}, + }, + file_browser_callback: function (field_name, url, type, win) { - if (type === 'file') { - window.showEntityLinkSelector(function(entity) { - let originalField = win.document.getElementById(field_name); - originalField.value = entity.link; - $(originalField).closest('.mce-form').find('input').eq(2).val(entity.name); - }); - } + if (type === 'file') { + window.showEntityLinkSelector(function(entity) { + let originalField = win.document.getElementById(field_name); + originalField.value = entity.link; + $(originalField).closest('.mce-form').find('input').eq(2).val(entity.name); + }); + } - if (type === 'image') { - // Show image manager - window.ImageManager.showExternal(function (image) { + if (type === 'image') { + // Show image manager + window.ImageManager.showExternal(function (image) { - // Set popover link input to image url then fire change event - // to ensure the new value sticks - win.document.getElementById(field_name).value = image.url; - if ("createEvent" in document) { - let evt = document.createEvent("HTMLEvents"); - evt.initEvent("change", false, true); - win.document.getElementById(field_name).dispatchEvent(evt); - } else { - win.document.getElementById(field_name).fireEvent("onchange"); - } + // Set popover link input to image url then fire change event + // to ensure the new value sticks + win.document.getElementById(field_name).value = image.url; + if ("createEvent" in document) { + let evt = document.createEvent("HTMLEvents"); + evt.initEvent("change", false, true); + win.document.getElementById(field_name).dispatchEvent(evt); + } else { + win.document.getElementById(field_name).fireEvent("onchange"); + } - // Replace the actively selected content with the linked image - let html = ``; - html += `${image.name}`; - html += ''; - win.tinyMCE.activeEditor.execCommand('mceInsertContent', false, html); - }); - } + // Replace the actively selected content with the linked image + let html = ``; + html += `${image.name}`; + html += ''; + win.tinyMCE.activeEditor.execCommand('mceInsertContent', false, html); + }); + } - }, - paste_preprocess: function (plugin, args) { - let content = args.content; - if (content.indexOf('`; - html += `${image.name}`; - html += ''; - editor.execCommand('mceInsertContent', false, html); - }); - } - }); + // Custom Image picker button + editor.addButton('image-insert', { + title: 'My title', + icon: 'image', + tooltip: 'Insert an image', + onclick: function () { + window.ImageManager.showExternal(function (image) { + let html = ``; + html += `${image.name}`; + html += ''; + editor.execCommand('mceInsertContent', false, html); + }); + } + }); - // Paste image-uploads - editor.on('paste', function(event) { - editorPaste(event, editor); - }); - } -}; \ No newline at end of file + // Paste image-uploads + editor.on('paste', function(event) { + editorPaste(event, editor); + }); + } + }; + return settings; +} \ No newline at end of file diff --git a/resources/assets/js/pages/page-show.js b/resources/assets/js/pages/page-show.js index 41b92453f..0cdde790d 100644 --- a/resources/assets/js/pages/page-show.js +++ b/resources/assets/js/pages/page-show.js @@ -1,16 +1,13 @@ "use strict"; // Configure ZeroClipboard -var zeroClipBoard = require('zeroclipboard'); -zeroClipBoard.config({ - swfPath: window.baseUrl('/ZeroClipboard.swf') -}); +import zeroClipBoard from "zeroclipboard"; -window.setupPageShow = module.exports = function (pageId) { +export default window.setupPageShow = function (pageId) { // Set up pointer - var $pointer = $('#pointer').detach(); - var $pointerInner = $pointer.children('div.pointer').first(); - var isSelection = false; + let $pointer = $('#pointer').detach(); + let $pointerInner = $pointer.children('div.pointer').first(); + let isSelection = false; // Select all contents on input click $pointer.on('click', 'input', function (e) { @@ -19,6 +16,9 @@ window.setupPageShow = module.exports = function (pageId) { }); // Set up copy-to-clipboard + zeroClipBoard.config({ + swfPath: window.baseUrl('/ZeroClipboard.swf') + }); new zeroClipBoard($pointer.find('button').first()[0]); // Hide pointer when clicking away @@ -31,11 +31,11 @@ window.setupPageShow = module.exports = function (pageId) { // Show pointer when selecting a single block of tagged content $('.page-content [id^="bkmrk"]').on('mouseup keyup', function (e) { e.stopPropagation(); - var selection = window.getSelection(); + let selection = window.getSelection(); if (selection.toString().length === 0) return; // Show pointer and set link - var $elem = $(this); + let $elem = $(this); let link = window.baseUrl('/link/' + pageId + '#' + $elem.attr('id')); if (link.indexOf('http') !== 0) link = window.location.protocol + "//" + window.location.host + link; $pointer.find('input').val(link); @@ -44,9 +44,9 @@ window.setupPageShow = module.exports = function (pageId) { $pointer.show(); // Set pointer to sit near mouse-up position - var pointerLeftOffset = (e.pageX - $elem.offset().left - ($pointerInner.width() / 2)); + let pointerLeftOffset = (e.pageX - $elem.offset().left - ($pointerInner.width() / 2)); if (pointerLeftOffset < 0) pointerLeftOffset = 0; - var pointerLeftOffsetPercent = (pointerLeftOffset / $elem.width()) * 100; + let pointerLeftOffsetPercent = (pointerLeftOffset / $elem.width()) * 100; $pointerInner.css('left', pointerLeftOffsetPercent + '%'); isSelection = true; @@ -57,7 +57,7 @@ window.setupPageShow = module.exports = function (pageId) { // Go to, and highlight if necessary, the specified text. function goToText(text) { - var idElem = $('.page-content #' + text).first(); + let idElem = $('.page-content #' + text).first(); if (idElem.length !== 0) { idElem.smoothScrollTo(); idElem.css('background-color', 'rgba(244, 249, 54, 0.25)'); @@ -68,19 +68,19 @@ window.setupPageShow = module.exports = function (pageId) { // Check the hash on load if (window.location.hash) { - var text = window.location.hash.replace(/\%20/g, ' ').substr(1); + let text = window.location.hash.replace(/\%20/g, ' ').substr(1); goToText(text); } // Make the book-tree sidebar stick in view on scroll - var $window = $(window); - var $bookTree = $(".book-tree"); - var $bookTreeParent = $bookTree.parent(); + let $window = $(window); + let $bookTree = $(".book-tree"); + let $bookTreeParent = $bookTree.parent(); // Check the page is scrollable and the content is taller than the tree - var pageScrollable = ($(document).height() > $window.height()) && ($bookTree.height() < $('.page-content').height()); + let pageScrollable = ($(document).height() > $window.height()) && ($bookTree.height() < $('.page-content').height()); // Get current tree's width and header height - var headerHeight = $("#header").height() + $(".toolbar").height(); - var isFixed = $window.scrollTop() > headerHeight; + let headerHeight = $("#header").height() + $(".toolbar").height(); + let isFixed = $window.scrollTop() > headerHeight; // Function to fix the tree as a sidebar function stickTree() { $bookTree.width($bookTreeParent.width() + 15); @@ -95,7 +95,7 @@ window.setupPageShow = module.exports = function (pageId) { } // Checks if the tree stickiness state should change function checkTreeStickiness(skipCheck) { - var shouldBeFixed = $window.scrollTop() > headerHeight; + let shouldBeFixed = $window.scrollTop() > headerHeight; if (shouldBeFixed && (!isFixed || skipCheck)) { stickTree(); } else if (!shouldBeFixed && (isFixed || skipCheck)) {