summaryrefslogtreecommitdiffstats
path: root/web_src/js/features/comp/CommentEasyMDE.js
blob: 8efbe4d34de914a463c3541e1e922c860cc54935 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
import attachTribute from '../tribute.js';

/**
 * create an EasyMDE editor for comment
 * @param textarea jQuery or HTMLElement
 * @returns {null|EasyMDE}
 */
export function createCommentEasyMDE(textarea) {
  if (textarea instanceof jQuery) {
    textarea = textarea[0];
  }
  if (!textarea) {
    return null;
  }

  const easyMDE = new window.EasyMDE({
    autoDownloadFontAwesome: false,
    element: textarea,
    forceSync: true,
    renderingConfig: {
      singleLineBreaks: false
    },
    indentWithTabs: false,
    tabSize: 4,
    spellChecker: false,
    toolbar: ['bold', 'italic', 'strikethrough', '|',
      'heading-1', 'heading-2', 'heading-3', 'heading-bigger', 'heading-smaller', '|',
      'code', 'quote', '|', {
        name: 'checkbox-empty',
        action(e) {
          const cm = e.codemirror;
          cm.replaceSelection(`\n- [ ] ${cm.getSelection()}`);
          cm.focus();
        },
        className: 'fa fa-square-o',
        title: 'Add Checkbox (empty)',
      },
      {
        name: 'checkbox-checked',
        action(e) {
          const cm = e.codemirror;
          cm.replaceSelection(`\n- [x] ${cm.getSelection()}`);
          cm.focus();
        },
        className: 'fa fa-check-square-o',
        title: 'Add Checkbox (checked)',
      }, '|',
      'unordered-list', 'ordered-list', '|',
      'link', 'image', 'table', 'horizontal-rule', '|',
      'clean-block', '|',
      {
        name: 'revert-to-textarea',
        action(e) {
          e.toTextArea();
        },
        className: 'fa fa-file',
        title: 'Revert to simple textarea',
      },
    ]
  });
  const inputField = easyMDE.codemirror.getInputField();
  inputField.classList.add('js-quick-submit');
  easyMDE.codemirror.setOption('extraKeys', {
    Enter: () => {
      const tributeContainer = document.querySelector('.tribute-container');
      if (!tributeContainer || tributeContainer.style.display === 'none') {
        return CodeMirror.Pass;
      }
    },
    Backspace: (cm) => {
      if (cm.getInputField().trigger) {
        cm.getInputField().trigger('input');
      }
      cm.execCommand('delCharBefore');
    }
  });
  attachTribute(inputField, {mentions: true, emoji: true});

  // TODO: that's the only way we can do now to attach the EasyMDE object to a HTMLElement
  inputField._data_easyMDE = easyMDE;
  textarea._data_easyMDE = easyMDE;
  return easyMDE;
}

/**
 * get the attached EasyMDE editor created by createCommentEasyMDE
 * @param el jQuery or HTMLElement
 * @returns {null|EasyMDE}
 */
export function getAttachedEasyMDE(el) {
  if (el instanceof jQuery) {
    el = el[0];
  }
  if (!el) {
    return null;
  }
  return el._data_easyMDE;
}

/**
 * validate if the given textarea from a form, is non-empty.
 * @param {jQuery | HTMLElement} form
 * @param {jQuery | HTMLElement} textarea
 * @returns {boolean} returns true if validation succeeded.
 */
export function validateTextareaNonEmpty(form, textarea) {
  if (form instanceof jQuery) {
    form = form[0];
  }
  if (textarea instanceof jQuery) {
    textarea = textarea[0];
  }

  const $markdownEditorTextArea = $(getAttachedEasyMDE(textarea).codemirror.getInputField());
  // The original edit area HTML element is hidden and replaced by the
  // SimpleMDE/EasyMDE editor, breaking HTML5 input validation if the text area is empty.
  // This is a workaround for this upstream bug.
  // See https://github.com/sparksuite/simplemde-markdown-editor/issues/324
  if (textarea.value.length) {
    $markdownEditorTextArea.prop('required', true);
    form.reportValidity();
    return false;
  }
  $markdownEditorTextArea.prop('required', false);
  return true;
}