summaryrefslogtreecommitdiff
path: root/app/assets/javascripts/merge_request.js
blob: 5444457f65104e42205f6b49ea0c1f3bf45f3e8f (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
127
128
/* eslint-disable func-names, space-before-function-paren, no-var, prefer-rest-params, wrap-iife, quotes, no-underscore-dangle, one-var, one-var-declaration-per-line, consistent-return, dot-notation, quote-props, comma-dangle, object-shorthand, max-len, prefer-arrow-callback */
/* global MergeRequestTabs */

import 'vendor/jquery.waitforimages';
import TaskList from './task_list';
import './merge_request_tabs';
import IssuablesHelper from './helpers/issuables_helper';

function MergeRequest(opts) {
  // Initialize MergeRequest behavior
  //
  // Options:
  //   action - String, current controller action
  //
  this.opts = opts != null ? opts : {};
  this.submitNoteForm = this.submitNoteForm.bind(this);
  this.$el = $('.merge-request');
  this.$('.show-all-commits').on('click', (function(_this) {
    return function() {
      return _this.showAllCommits();
    };
  })(this));

  this.initTabs();
  this.initMRBtnListeners();
  this.initCommitMessageListeners();
  this.closeReopenReportToggle = IssuablesHelper.initCloseReopenReport();

  if ($("a.btn-close").length) {
    this.taskList = new TaskList({
      dataType: 'merge_request',
      fieldName: 'description',
      selector: '.detail-page-description',
      onSuccess: (result) => {
        document.querySelector('#task_status').innerText = result.task_status;
        document.querySelector('#task_status_short').innerText = result.task_status_short;
      }
    });
  }
}

// Local jQuery finder
MergeRequest.prototype.$ = function(selector) {
  return this.$el.find(selector);
};

MergeRequest.prototype.initTabs = function() {
  if (window.mrTabs) {
    window.mrTabs.unbindEvents();
  }
  window.mrTabs = new gl.MergeRequestTabs(this.opts);
};

MergeRequest.prototype.showAllCommits = function() {
  this.$('.first-commits').remove();
  return this.$('.all-commits').removeClass('hide');
};

MergeRequest.prototype.initMRBtnListeners = function() {
  var _this;
  _this = this;
  return $('a.btn-close, a.btn-reopen').on('click', function(e) {
    var $this, shouldSubmit;
    $this = $(this);
    shouldSubmit = $this.hasClass('btn-comment');
    if (shouldSubmit && $this.data('submitted')) {
      return;
    }

    if (this.closeReopenReportToggle) this.closeReopenReportToggle.setDisable();

    if (shouldSubmit) {
      if ($this.hasClass('btn-comment-and-close') || $this.hasClass('btn-comment-and-reopen')) {
        e.preventDefault();
        e.stopImmediatePropagation();

        _this.submitNoteForm($this.closest('form'), $this);
      }
    }
  });
};

MergeRequest.prototype.submitNoteForm = function(form, $button) {
  var noteText;
  noteText = form.find("textarea.js-note-text").val();
  if (noteText.trim().length > 0) {
    form.submit();
    $button.data('submitted', true);
    return $button.trigger('click');
  }
};

MergeRequest.prototype.initCommitMessageListeners = function() {
  $(document).on('click', 'a.js-with-description-link', function(e) {
    var textarea = $('textarea.js-commit-message');
    e.preventDefault();

    textarea.val(textarea.data('messageWithDescription'));
    $('.js-with-description-hint').hide();
    $('.js-without-description-hint').show();
  });

  $(document).on('click', 'a.js-without-description-link', function(e) {
    var textarea = $('textarea.js-commit-message');
    e.preventDefault();

    textarea.val(textarea.data('messageWithoutDescription'));
    $('.js-with-description-hint').show();
    $('.js-without-description-hint').hide();
  });
};

MergeRequest.prototype.updateStatusText = function(classToRemove, classToAdd, newStatusText) {
  $('.detail-page-header .status-box')
    .removeClass(classToRemove)
    .addClass(classToAdd)
    .find('span')
    .text(newStatusText);
};

MergeRequest.prototype.decreaseCounter = function(by = 1) {
  const $el = $('.nav-links .js-merge-counter');
  const count = Math.max((parseInt($el.text().replace(/[^\d]/, ''), 10) - by), 0);

  $el.text(gl.text.addDelimiter(count));
};

window.MergeRequest = MergeRequest;