import loadScript from "discourse/lib/load-script"; import { observes } from "ember-addons/ember-computed-decorators"; const LOAD_ASYNC = !Ember.testing; export default Ember.Component.extend({ mode: "css", classNames: ["ace-wrapper"], _editor: null, _skipContentChangeEvent: null, disabled: false, @observes("editorId") editorIdChanged() { if (this.get("autofocus")) { this.send("focus"); } }, @observes("content") contentChanged() { if (this._editor && !this._skipContentChangeEvent) { this._editor.getSession().setValue(this.get("content")); } }, @observes("mode") modeChanged() { if (LOAD_ASYNC && this._editor && !this._skipContentChangeEvent) { this._editor.getSession().setMode("ace/mode/" + this.get("mode")); } }, @observes("disabled") disabledStateChanged() { this.changeDisabledState(); }, changeDisabledState() { const editor = this._editor; if (editor) { const disabled = this.get("disabled"); editor.setOptions({ readOnly: disabled, highlightActiveLine: !disabled, highlightGutterLine: !disabled }); editor.container.parentNode.setAttribute("data-disabled", disabled); } }, _destroyEditor: function() { if (this._editor) { this._editor.destroy(); this._editor = null; } if (this.appEvents) { // xxx: don't run during qunit tests this.appEvents.off("ace:resize", this, this.resize); } $(window).off("ace:resize"); }.on("willDestroyElement"), resize() { if (this._editor) { this._editor.resize(); } }, didInsertElement() { this._super(); loadScript("/javascripts/ace/ace.js", { scriptTag: true }).then(() => { window.ace.require(["ace/ace"], loadedAce => { if (!this.element || this.isDestroying || this.isDestroyed) { return; } const editor = loadedAce.edit(this.$(".ace")[0]); if (LOAD_ASYNC) { editor.setTheme("ace/theme/chrome"); } editor.setShowPrintMargin(false); editor.setOptions({ fontSize: "14px" }); if (LOAD_ASYNC) { editor.getSession().setMode("ace/mode/" + this.get("mode")); } editor.on("change", () => { this._skipContentChangeEvent = true; this.set("content", editor.getSession().getValue()); this._skipContentChangeEvent = false; }); editor.$blockScrolling = Infinity; editor.renderer.setScrollMargin(10, 10); this.$().data("editor", editor); this._editor = editor; this.changeDisabledState(); $(window) .off("ace:resize") .on("ace:resize", () => { this.appEvents.trigger("ace:resize"); }); if (this.appEvents) { // xxx: don't run during qunit tests this.appEvents.on("ace:resize", () => this.resize()); } if (this.get("autofocus")) { this.send("focus"); } }); }); }, actions: { focus() { if (this._editor) { this._editor.focus(); this._editor.navigateFileEnd(); } } } });