issuable_bulk_update_sidebar.js 5.0 KB
Newer Older
1 2
/* eslint-disable class-methods-use-this, no-new */

3
import $ from 'jquery';
4
import { property } from 'underscore';
5
import IssuableBulkUpdateActions from './issuable_bulk_update_actions';
C
Constance Okoghenun 已提交
6
import MilestoneSelect from './milestone_select';
7
import issueStatusSelect from './issue_status_select';
F
Filipa Lacerda 已提交
8
import subscriptionSelect from './subscription_select';
9
import LabelsSelect from './labels_select';
10
import issueableEventHub from './issuables_list/eventhub';
11 12 13 14 15 16 17 18

const HIDDEN_CLASS = 'hidden';
const DISABLED_CONTENT_CLASS = 'disabled-content';
const SIDEBAR_EXPANDED_CLASS = 'right-sidebar-expanded issuable-bulk-update-sidebar';
const SIDEBAR_COLLAPSED_CLASS = 'right-sidebar-collapsed issuable-bulk-update-sidebar';

export default class IssuableBulkUpdateSidebar {
  constructor() {
19 20
    this.vueIssuablesListFeature = property(['gon', 'features', 'vueIssuablesList'])(window);

21 22 23 24 25 26 27
    this.initDomElements();
    this.bindEvents();
    this.initDropdowns();
    this.setupBulkUpdateActions();
  }

  initDomElements() {
28
    this.$page = $('.layout-page');
29
    this.$sidebar = $('.right-sidebar');
B
Bryce Johnson 已提交
30
    this.$sidebarInnerContainer = this.$sidebar.find('.issuable-sidebar');
31 32 33 34 35 36
    this.$bulkEditCancelBtn = $('.js-bulk-update-menu-hide');
    this.$bulkEditSubmitBtn = $('.update-selected-issues');
    this.$bulkUpdateEnableBtn = $('.js-bulk-update-toggle');
    this.$otherFilters = $('.issues-other-filters');
    this.$checkAllContainer = $('.check-all-holder');
    this.$issueChecks = $('.issue-check');
37
    this.$issuesList = $('.selected-issuable');
38 39 40 41 42 43 44 45 46 47
    this.$issuableIdsInput = $('#update_issuable_ids');
  }

  bindEvents() {
    this.$bulkUpdateEnableBtn.on('click', e => this.toggleBulkEdit(e, true));
    this.$bulkEditCancelBtn.on('click', e => this.toggleBulkEdit(e, false));
    this.$checkAllContainer.on('click', e => this.selectAll(e));
    this.$issuesList.on('change', () => this.updateFormState());
    this.$bulkEditSubmitBtn.on('click', () => this.prepForSubmit());
    this.$checkAllContainer.on('click', () => this.updateFormState());
48 49 50 51 52 53 54 55 56 57 58

    if (this.vueIssuablesListFeature) {
      issueableEventHub.$on('issuables:updateBulkEdit', () => {
        // Danger! Strong coupling ahead!
        // The bulk update sidebar and its dropdowns look for .selected-issuable checkboxes, and get data on which issue
        // is selected by inspecting the DOM. Ideally, we would pass the selected issuable IDs and their properties
        // explicitly, but this component is used in too many places right now to refactor straight away.

        this.updateFormState();
      });
    }
59 60 61 62 63
  }

  initDropdowns() {
    new LabelsSelect();
    new MilestoneSelect();
64
    issueStatusSelect();
F
Filipa Lacerda 已提交
65
    subscriptionSelect();
66 67 68 69 70 71 72
  }

  setupBulkUpdateActions() {
    IssuableBulkUpdateActions.setOriginalDropdownData();
  }

  updateFormState() {
73
    const noCheckedIssues = !$('.selected-issuable:checked').length;
74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90

    this.toggleSubmitButtonDisabled(noCheckedIssues);
    this.updateSelectedIssuableIds();

    IssuableBulkUpdateActions.setOriginalDropdownData();
  }

  prepForSubmit() {
    // if submit button is disabled, submission is blocked. This ensures we disable after
    // form submission is carried out
    setTimeout(() => this.$bulkEditSubmitBtn.disable());
    this.updateSelectedIssuableIds();
  }

  toggleBulkEdit(e, enable) {
    e.preventDefault();

91 92
    issueableEventHub.$emit('issuables:toggleBulkEdit', enable);

93 94 95 96
    this.toggleSidebarDisplay(enable);
    this.toggleBulkEditButtonDisabled(enable);
    this.toggleOtherFiltersDisabled(enable);
    this.toggleCheckboxDisplay(enable);
B
Bryce Johnson 已提交
97 98
  }

99 100 101 102 103 104 105 106 107 108 109 110 111
  updateSelectedIssuableIds() {
    this.$issuableIdsInput.val(IssuableBulkUpdateSidebar.getCheckedIssueIds());
  }

  selectAll() {
    const checkAllButtonState = this.$checkAllContainer.find('input').prop('checked');

    this.$issuesList.prop('checked', checkAllButtonState);
  }

  toggleSidebarDisplay(show) {
    this.$page.toggleClass(SIDEBAR_EXPANDED_CLASS, show);
    this.$page.toggleClass(SIDEBAR_COLLAPSED_CLASS, !show);
B
Bryce Johnson 已提交
112
    this.$sidebarInnerContainer.toggleClass(HIDDEN_CLASS, !show);
113 114 115 116 117 118 119 120 121 122 123 124 125
    this.$sidebar.toggleClass(SIDEBAR_EXPANDED_CLASS, show);
    this.$sidebar.toggleClass(SIDEBAR_COLLAPSED_CLASS, !show);
  }

  toggleBulkEditButtonDisabled(disable) {
    if (disable) {
      this.$bulkUpdateEnableBtn.disable();
    } else {
      this.$bulkUpdateEnableBtn.enable();
    }
  }

  toggleCheckboxDisplay(show) {
126
    this.$checkAllContainer.toggleClass(HIDDEN_CLASS, !show || this.vueIssuablesListFeature);
127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142
    this.$issueChecks.toggleClass(HIDDEN_CLASS, !show);
  }

  toggleOtherFiltersDisabled(disable) {
    this.$otherFilters.toggleClass(DISABLED_CONTENT_CLASS, disable);
  }

  toggleSubmitButtonDisabled(disable) {
    if (disable) {
      this.$bulkEditSubmitBtn.disable();
    } else {
      this.$bulkEditSubmitBtn.enable();
    }
  }

  static getCheckedIssueIds() {
143
    const $checkedIssues = $('.selected-issuable:checked');
144 145 146 147 148 149 150 151

    if ($checkedIssues.length > 0) {
      return $.map($checkedIssues, value => $(value).data('id'));
    }

    return [];
  }
}