summaryrefslogtreecommitdiff
path: root/app/assets/javascripts/blob/create_branch_dropdown.js
blob: 95517f51b1c76ae3f224da94e6d89649d9eae425 (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
class CreateBranchDropdown {
  constructor(el, targetBranchDropdown) {
    this.targetBranchDropdown = targetBranchDropdown;
    this.el = el;
    this.dropdownBack = this.el.closest('.dropdown').querySelector('.dropdown-menu-back');
    this.cancelButton = this.el.querySelector('.js-cancel-branch-btn');
    this.newBranchField = this.el.querySelector('#new_branch_name');
    this.newBranchCreateButton = this.el.querySelector('.js-new-branch-btn');

    this.newBranchCreateButton.setAttribute('disabled', '');

    this.addBindings();
    this.cleanupWrapper = this.cleanup.bind(this);
    document.addEventListener('beforeunload', this.cleanupWrapper);
  }

  cleanup() {
    this.cleanBindings();
    document.removeEventListener('beforeunload', this.cleanupWrapper);
  }

  cleanBindings() {
    this.newBranchField.removeEventListener('keyup', this.enableBranchCreateButtonWrapper);
    this.newBranchField.removeEventListener('change', this.enableBranchCreateButtonWrapper);
    this.newBranchField.removeEventListener('keydown', this.handleNewBranchKeydownWrapper);
    this.dropdownBack.removeEventListener('click', this.resetFormWrapper);
    this.cancelButton.removeEventListener('click', this.handleCancelClickWrapper);
    this.newBranchCreateButton.removeEventListener('click', this.createBranchWrapper);
  }

  addBindings() {
    this.enableBranchCreateButtonWrapper = this.enableBranchCreateButton.bind(this);
    this.handleNewBranchKeydownWrapper = this.handleNewBranchKeydown.bind(this);
    this.resetFormWrapper = this.resetForm.bind(this);
    this.handleCancelClickWrapper = this.handleCancelClick.bind(this);
    this.createBranchWrapper = this.createBranch.bind(this);

    this.newBranchField.addEventListener('keyup', this.enableBranchCreateButtonWrapper);
    this.newBranchField.addEventListener('change', this.enableBranchCreateButtonWrapper);
    this.newBranchField.addEventListener('keydown', this.handleNewBranchKeydownWrapper);
    this.dropdownBack.addEventListener('click', this.resetFormWrapper);
    this.cancelButton.addEventListener('click', this.handleCancelClickWrapper);
    this.newBranchCreateButton.addEventListener('click', this.createBranchWrapper);
  }

  handleCancelClick(e) {
    e.preventDefault();
    e.stopPropagation();

    this.resetForm();
    this.dropdownBack.click();
  }

  handleNewBranchKeydown(e) {
    const keyCode = e.which;
    const ENTER_KEYCODE = 13;
    if (keyCode === ENTER_KEYCODE) {
      this.createBranch(e);
    }
  }

  enableBranchCreateButton() {
    if (this.newBranchField.value !== '') {
      this.newBranchCreateButton.removeAttribute('disabled');
    } else {
      this.newBranchCreateButton.setAttribute('disabled', '');
    }
  }

  resetForm() {
    this.newBranchField.value = '';
    this.enableBranchCreateButtonWrapper();
  }

  createBranch(e) {
    e.preventDefault();

    if (this.newBranchCreateButton.getAttribute('disabled') === '') {
      return;
    }
    const newBranchName = this.newBranchField.value;
    this.targetBranchDropdown.setNewBranch(newBranchName);
    this.resetForm();
  }
}

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