summaryrefslogtreecommitdiff
path: root/app/assets/javascripts/gl_form.js
blob: 4e8141b2956e023ab323a3a5a937780fba8ab7c8 (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
/* eslint-disable func-names, space-before-function-paren, wrap-iife, no-var, no-new, max-len */
/* global GitLab */
/* global DropzoneInput */
/* global autosize */

import GfmAutoComplete from './gfm_auto_complete';

window.gl = window.gl || {};

function GLForm(form, enableGFM = false) {
  this.form = form;
  this.textarea = this.form.find('textarea.js-gfm-input');
  this.enableGFM = enableGFM;
  // Before we start, we should clean up any previous data for this form
  this.destroy();
  // Setup the form
  this.setupForm();
  this.form.data('gl-form', this);
}

GLForm.prototype.destroy = function() {
  // Clean form listeners
  this.clearEventListeners();
  if (this.autoComplete) {
    this.autoComplete.destroy();
  }
  return this.form.data('gl-form', null);
};

GLForm.prototype.setupForm = function() {
  var isNewForm;
  isNewForm = this.form.is(':not(.gfm-form)');
  this.form.removeClass('js-new-note-form');
  if (isNewForm) {
    this.form.find('.div-dropzone').remove();
    this.form.addClass('gfm-form');
    // remove notify commit author checkbox for non-commit notes
    gl.utils.disableButtonIfEmptyField(this.form.find('.js-note-text'), this.form.find('.js-comment-button, .js-note-new-discussion'));
    this.autoComplete = new GfmAutoComplete(gl.GfmAutoComplete && gl.GfmAutoComplete.dataSources);
    this.autoComplete.setup(this.form.find('.js-gfm-input'), {
      emojis: true,
      members: this.enableGFM,
      issues: this.enableGFM,
      milestones: this.enableGFM,
      mergeRequests: this.enableGFM,
      labels: this.enableGFM,
    });
    new DropzoneInput(this.form);
    autosize(this.textarea);
  }
  // form and textarea event listeners
  this.addEventListeners();
  gl.text.init(this.form);
  // hide discard button
  this.form.find('.js-note-discard').hide();
  this.form.show();
  if (this.isAutosizeable) this.setupAutosize();
};

GLForm.prototype.setupAutosize = function () {
  this.textarea.off('autosize:resized')
    .on('autosize:resized', this.setHeightData.bind(this));

  this.textarea.off('mouseup.autosize')
    .on('mouseup.autosize', this.destroyAutosize.bind(this));

  setTimeout(() => {
    autosize(this.textarea);
    this.textarea.css('resize', 'vertical');
  }, 0);
};

GLForm.prototype.setHeightData = function () {
  this.textarea.data('height', this.textarea.outerHeight());
};

GLForm.prototype.destroyAutosize = function () {
  const outerHeight = this.textarea.outerHeight();

  if (this.textarea.data('height') === outerHeight) return;

  autosize.destroy(this.textarea);

  this.textarea.data('height', outerHeight);
  this.textarea.outerHeight(outerHeight);
  this.textarea.css('max-height', window.outerHeight);
};

GLForm.prototype.clearEventListeners = function() {
  this.textarea.off('focus');
  this.textarea.off('blur');
  return gl.text.removeListeners(this.form);
};

GLForm.prototype.addEventListeners = function() {
  this.textarea.on('focus', function() {
    return $(this).closest('.md-area').addClass('is-focused');
  });
  return this.textarea.on('blur', function() {
    return $(this).closest('.md-area').removeClass('is-focused');
  });
};

window.gl.GLForm = GLForm;