X-Git-Url: http://source.bookstackapp.com/bookstack/blobdiff_plain/a6633642232efd164d4708967ab59e498fbff896..refs/pull/3555/head:/resources/js/components/code-editor.js diff --git a/resources/js/components/code-editor.js b/resources/js/components/code-editor.js index 2e3506ec7..27ff56395 100644 --- a/resources/js/components/code-editor.js +++ b/resources/js/components/code-editor.js @@ -1,4 +1,3 @@ -import Code from "../services/code"; import {onChildEvent, onEnterPress, onSelect} from "../services/dom"; /** @@ -34,10 +33,11 @@ class CodeEditor { onSelect(this.languageLinks, event => { const language = event.target.dataset.lang; this.languageInput.value = language; - this.updateEditorMode(language); + this.languageInputChange(language); }); onEnterPress(this.languageInput, e => this.save()); + this.languageInput.addEventListener('input', e => this.languageInputChange(this.languageInput.value)); onSelect(this.saveButton, e => this.save()); onChildEvent(this.historyList, 'button', 'click', (event, elem) => { @@ -60,16 +60,18 @@ class CodeEditor { this.languageInput.value = language; this.callback = callback; - this.show(); - this.updateEditorMode(language); - - Code.setContent(this.editor, code); + this.show() + .then(() => this.languageInputChange(language)) + .then(() => window.importVersioned('code')) + .then(Code => Code.setContent(this.editor, code)); } - show() { + async show() { + const Code = await window.importVersioned('code'); if (!this.editor) { this.editor = Code.popupEditor(this.editorInput, this.languageInput.value); } + this.loadHistory(); this.popup.components.popup.show(() => { Code.updateLayout(this.editor); @@ -84,17 +86,34 @@ class CodeEditor { this.addHistory(); } - updateEditorMode(language) { + async updateEditorMode(language) { + const Code = await window.importVersioned('code'); Code.setMode(this.editor, language, this.editor.getValue()); } + languageInputChange(language) { + this.updateEditorMode(language); + const inputLang = language.toLowerCase(); + let matched = false; + + for (const link of this.languageLinks) { + const lang = link.dataset.lang.toLowerCase().trim(); + const isMatch = inputLang && lang.startsWith(inputLang); + link.classList.toggle('active', isMatch); + if (isMatch && !matched) { + link.scrollIntoView({block: "center", behavior: "smooth"}); + matched = true; + } + } + } + loadHistory() { this.history = JSON.parse(window.sessionStorage.getItem(this.historyKey) || '{}'); const historyKeys = Object.keys(this.history).reverse(); this.historyDropDown.classList.toggle('hidden', historyKeys.length === 0); this.historyList.innerHTML = historyKeys.map(key => { const localTime = (new Date(parseInt(key))).toLocaleTimeString(); - return `
`; + return ``; }).join(''); }