X-Git-Url: http://source.bookstackapp.com/bookstack/blobdiff_plain/be736b3939a428674ccab33c7aaca95c05ef6437..refs/pull/4673/head:/resources/js/components/code-editor.js diff --git a/resources/js/components/code-editor.js b/resources/js/components/code-editor.js index 205cbd8fd..1c68c2048 100644 --- a/resources/js/components/code-editor.js +++ b/resources/js/components/code-editor.js @@ -1,9 +1,27 @@ -import {onChildEvent, onEnterPress, onSelect} from "../services/dom"; -import {Component} from "./component"; - +import {onChildEvent, onEnterPress, onSelect} from '../services/dom'; +import {Component} from './component'; export class CodeEditor extends Component { + /** + * @type {null|SimpleEditorInterface} + */ + editor = null; + + /** + * @type {?Function} + */ + saveCallback = null; + + /** + * @type {?Function} + */ + cancelCallback = null; + + history = {}; + + historyKey = 'code_history'; + setup() { this.container = this.$refs.container; this.popup = this.$el; @@ -16,10 +34,6 @@ export class CodeEditor extends Component { this.historyList = this.$refs.historyList; this.favourites = new Set(this.$opts.favourites.split(',')); - this.callback = null; - this.editor = null; - this.history = {}; - this.historyKey = 'code_history'; this.setupListeners(); this.setupFavourites(); } @@ -37,15 +51,15 @@ export class CodeEditor extends Component { 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()); + onEnterPress(this.languageInput, () => this.save()); + this.languageInput.addEventListener('input', () => this.languageInputChange(this.languageInput.value)); + onSelect(this.saveButton, () => this.save()); onChildEvent(this.historyList, 'button', 'click', (event, elem) => { event.preventDefault(); const historyTime = elem.dataset.time; if (this.editor) { - this.editor.setValue(this.history[historyTime]); + this.editor.setContent(this.history[historyTime]); } }); } @@ -68,17 +82,23 @@ export class CodeEditor extends Component { onChildEvent(button.parentElement, '.lang-option-favorite-toggle', 'click', () => { isFavorite = !isFavorite; - isFavorite ? this.favourites.add(language) : this.favourites.delete(language); + + if (isFavorite) { + this.favourites.add(language); + } else { + this.favourites.delete(language); + } + button.setAttribute('data-favourite', isFavorite ? 'true' : 'false'); window.$http.patch('/preferences/update-code-language-favourite', { - language: language, - active: isFavorite + language, + active: isFavorite, }); this.sortLanguageList(); if (isFavorite) { - button.scrollIntoView({block: "center", behavior: "smooth"}); + button.scrollIntoView({block: 'center', behavior: 'smooth'}); } }); } @@ -90,7 +110,7 @@ export class CodeEditor extends Component { if (aFav && !bFav) { return -1; - } else if (bFav && !aFav) { + } if (bFav && !aFav) { return 1; } @@ -103,20 +123,20 @@ export class CodeEditor extends Component { } save() { - if (this.callback) { - this.callback(this.editor.getValue(), this.languageInput.value); + if (this.saveCallback) { + this.saveCallback(this.editor.getContent(), this.languageInput.value); } this.hide(); } - open(code, language, callback) { + async open(code, language, saveCallback, cancelCallback) { this.languageInput.value = language; - this.callback = callback; + this.saveCallback = saveCallback; + this.cancelCallback = cancelCallback; - this.show() - .then(() => this.languageInputChange(language)) - .then(() => window.importVersioned('code')) - .then(Code => Code.setContent(this.editor, code)); + await this.show(); + this.languageInputChange(language); + this.editor.setContent(code); } async show() { @@ -127,10 +147,12 @@ export class CodeEditor extends Component { this.loadHistory(); this.getPopup().show(() => { - Code.updateLayout(this.editor); this.editor.focus(); }, () => { - this.addHistory() + this.addHistory(); + if (this.cancelCallback) { + this.cancelCallback(); + } }); } @@ -147,8 +169,7 @@ export class CodeEditor extends Component { } async updateEditorMode(language) { - const Code = await window.importVersioned('code'); - Code.setMode(this.editor, language, this.editor.getValue()); + this.editor.setMode(language, this.editor.getContent()); } languageInputChange(language) { @@ -160,7 +181,7 @@ export class CodeEditor extends Component { const isMatch = inputLang === lang; link.classList.toggle('active', isMatch); if (isMatch) { - link.scrollIntoView({block: "center", behavior: "smooth"}); + link.scrollIntoView({block: 'center', behavior: 'smooth'}); } } } @@ -170,14 +191,14 @@ export class CodeEditor extends Component { 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 `
`; + const localTime = (new Date(parseInt(key, 10))).toLocaleTimeString(); + return ``; }).join(''); } addHistory() { if (!this.editor) return; - const code = this.editor.getValue(); + const code = this.editor.getContent(); if (!code) return; // Stop if we'd be storing the same as the last item @@ -189,4 +210,4 @@ export class CodeEditor extends Component { window.sessionStorage.setItem(this.historyKey, historyString); } -} \ No newline at end of file +}