indentlabs/notebook

View on GitHub
app/assets/javascripts/document_editor.js

Summary

Maintainability
C
7 hrs
Test Coverage
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: '<b>H1</b>',
          classList: [ 'custom-class-h1' ],
          attrs: { 'data-custom-attr': 'attr-value-h1'
        }
        },
        {
          name: 'h2',
          action: 'append-h3',
          aria: 'header type 2',
          tagNames: [ 'h3' ],
          contentDefault: '<b>H2</b>',
          classList: [ 'custom-class-h2' ],
          attrs: { 'data-custom-attr': 'attr-value-h2'
        }
        },
        {
          name: 'h3',
          action: 'append-h4',
          aria: 'header type 3',
          tagNames: [ 'h4' ],
          contentDefault: '<b>H3</b>',
          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")));