X-Git-Url: http://source.bookstackapp.com/bookstack/blobdiff_plain/0df5ae0658b5ff409c2cc3d3da278692f80c790d..refs/pull/3908/head:/resources/js/components/code-editor.js diff --git a/resources/js/components/code-editor.js b/resources/js/components/code-editor.js index 022deafef..205cbd8fd 100644 --- a/resources/js/components/code-editor.js +++ b/resources/js/components/code-editor.js @@ -1,16 +1,15 @@ import {onChildEvent, onEnterPress, onSelect} from "../services/dom"; +import {Component} from "./component"; -/** - * Code Editor - * @extends {Component} - */ -class CodeEditor { + +export class CodeEditor extends Component { setup() { this.container = this.$refs.container; this.popup = this.$el; this.editorInput = this.$refs.editor; - this.languageLinks = this.$manyRefs.languageLink; + this.languageButtons = this.$manyRefs.languageButton; + this.languageOptionsContainer = this.$refs.languageOptionsContainer; this.saveButton = this.$refs.saveButton; this.languageInput = this.$refs.languageInput; this.historyDropDown = this.$refs.historyDropDown; @@ -32,7 +31,7 @@ class CodeEditor { } }); - onSelect(this.languageLinks, event => { + onSelect(this.languageButtons, event => { const language = event.target.dataset.lang; this.languageInput.value = language; this.languageInputChange(language); @@ -52,7 +51,7 @@ class CodeEditor { } setupFavourites() { - for (const button of this.languageLinks) { + for (const button of this.languageButtons) { this.setupFavouritesForButton(button); } @@ -72,7 +71,7 @@ class CodeEditor { isFavorite ? this.favourites.add(language) : this.favourites.delete(language); button.setAttribute('data-favourite', isFavorite ? 'true' : 'false'); - window.$http.patch('/settings/users/update-code-language-favourite', { + window.$http.patch('/preferences/update-code-language-favourite', { language: language, active: isFavorite }); @@ -85,7 +84,22 @@ class CodeEditor { } sortLanguageList() { - // TODO + const sortedParents = this.languageButtons.sort((a, b) => { + const aFav = a.dataset.favourite === 'true'; + const bFav = b.dataset.favourite === 'true'; + + if (aFav && !bFav) { + return -1; + } else if (bFav && !aFav) { + return 1; + } + + return a.dataset.lang > b.dataset.lang ? 1 : -1; + }).map(button => button.parentElement); + + for (const parent of sortedParents) { + this.languageOptionsContainer.append(parent); + } } save() { @@ -112,7 +126,7 @@ class CodeEditor { } this.loadHistory(); - this.popup.components.popup.show(() => { + this.getPopup().show(() => { Code.updateLayout(this.editor); this.editor.focus(); }, () => { @@ -121,10 +135,17 @@ class CodeEditor { } hide() { - this.popup.components.popup.hide(); + this.getPopup().hide(); this.addHistory(); } + /** + * @returns {Popup} + */ + getPopup() { + return window.$components.firstOnElement(this.popup, 'popup'); + } + async updateEditorMode(language) { const Code = await window.importVersioned('code'); Code.setMode(this.editor, language, this.editor.getValue()); @@ -134,7 +155,7 @@ class CodeEditor { this.updateEditorMode(language); const inputLang = language.toLowerCase(); - for (const link of this.languageLinks) { + for (const link of this.languageButtons) { const lang = link.dataset.lang.toLowerCase().trim(); const isMatch = inputLang === lang; link.classList.toggle('active', isMatch); @@ -168,6 +189,4 @@ class CodeEditor { window.sessionStorage.setItem(this.historyKey, historyString); } -} - -export default CodeEditor; \ No newline at end of file +} \ No newline at end of file