Notebook.DocumentEditor = class DocumentEditor { constructor(el) { this.el = el; if (!(this.el.length > 0)) { return; } window.editor = new MediumEditor('#editor', { targetBlank: true, autoLink: false, buttonLabels: 'fontawesome', toolbar: { buttons: [ 'bold', 'italic', 'underline', 'strikethrough', { name: 'h1', action: 'append-h2', aria: 'header type 1', tagNames: [ 'h2' ], contentDefault: 'H1', classList: [ 'custom-class-h1' ], attrs: { 'data-custom-attr': 'attr-value-h1' } }, { name: 'h2', action: 'append-h3', aria: 'header type 2', tagNames: [ 'h3' ], contentDefault: 'H2', classList: [ 'custom-class-h2' ], attrs: { 'data-custom-attr': 'attr-value-h2' } }, { name: 'h3', action: 'append-h4', aria: 'header type 3', tagNames: [ 'h4' ], contentDefault: 'H3', classList: [ 'custom-class-h3' ], attrs: { 'data-custom-attr': 'attr-value-h3' } }, 'justifyLeft', 'justifyCenter', 'justifyRight', 'justifyFull', 'orderedlist', 'unorderedlist', 'quote', 'anchor', 'removeFormat' ] }, anchorPreview: { hideDelay: 0 }, placeholder: { text: 'Write as little or as much as you want!' }, paste: { forcePlainText: false } }); // Autosave let autosave_event = null; let last_autosave = null; const autosave = function() { if (autosave_event === null) { console.log('Queueing autosave'); $('.js-autosave-icon').addClass('grey-text'); $('.js-autosave-icon').removeClass('black-text'); $('.js-autosave-icon').removeClass('red-text'); $('.js-autosave-status').text('Saving changes...'); autosave_event = setTimeout((function() { console.log('Autosaving...'); $('.js-autosave-status').text('Saving...'); autosave_event = null; // Do the autosave last_autosave = $.ajax({ type: 'PATCH', url: $('#editor').data('save-url'), data: { document: { title: $('#document_title').val(), body: $('#editor').html() } } }); last_autosave.fail(function(jqXHR, textStatus) { $('.js-autosave-status').text('There was a problem saving! We will try to save again, but please make sure you back up any changes.'); $('.js-autosave-status').addClass('red-text'); $('.js-autosave-status').removeClass('grey-text'); $('.js-autosave-status').removeClass('black-text'); }); // Done! $('.js-autosave-icon').addClass('black-text'); $('.js-autosave-icon').removeClass('grey-text'); $('.js-autosave-icon').removeClass('red-text'); $('.js-autosave-status').text('Saved!'); }), 2500); } else { console.log('Waiting for existing autosave'); } }; editor.subscribe('editableInput', autosave); $('#document_title').on('change', autosave); $('#document_title').on('keydown', autosave); $('.js-autosave-status').on('click', autosave); // Allow entering `tab` into the editor $(document).delegate('#editor', 'keydown', function(e) { const keyCode = e.keyCode || e.which; if (keyCode === 9) { e.preventDefault(); } }); } }; $(() => new Notebook.DocumentEditor($("body.documents.edit")));