BigW Consortium Gitlab

issues-bulk-assignment.js 4.93 KB
Newer Older
Fatih Acet committed
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 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161
(function() {
  this.IssuableBulkActions = (function() {
    function IssuableBulkActions(opts) {
      var ref, ref1, ref2;
      if (opts == null) {
        opts = {};
      }
      this.container = (ref = opts.container) != null ? ref : $('.content'), this.form = (ref1 = opts.form) != null ? ref1 : this.getElement('.bulk-update'), this.issues = (ref2 = opts.issues) != null ? ref2 : this.getElement('.issues-list .issue');
      this.form.data('bulkActions', this);
      this.willUpdateLabels = false;
      this.bindEvents();
      Issuable.initChecks();
    }

    IssuableBulkActions.prototype.getElement = function(selector) {
      return this.container.find(selector);
    };

    IssuableBulkActions.prototype.bindEvents = function() {
      return this.form.off('submit').on('submit', this.onFormSubmit.bind(this));
    };

    IssuableBulkActions.prototype.onFormSubmit = function(e) {
      e.preventDefault();
      return this.submit();
    };

    IssuableBulkActions.prototype.submit = function() {
      var _this, xhr;
      _this = this;
      xhr = $.ajax({
        url: this.form.attr('action'),
        method: this.form.attr('method'),
        dataType: 'JSON',
        data: this.getFormDataAsObject()
      });
      xhr.done(function(response, status, xhr) {
        return location.reload();
      });
      xhr.fail(function() {
        return new Flash("Issue update failed");
      });
      return xhr.always(this.onFormSubmitAlways.bind(this));
    };

    IssuableBulkActions.prototype.onFormSubmitAlways = function() {
      return this.form.find('[type="submit"]').enable();
    };

    IssuableBulkActions.prototype.getSelectedIssues = function() {
      return this.issues.has('.selected_issue:checked');
    };

    IssuableBulkActions.prototype.getLabelsFromSelection = function() {
      var labels;
      labels = [];
      this.getSelectedIssues().map(function() {
        var _labels;
        _labels = $(this).data('labels');
        if (_labels) {
          return _labels.map(function(labelId) {
            if (labels.indexOf(labelId) === -1) {
              return labels.push(labelId);
            }
          });
        }
      });
      return labels;
    };


    /**
     * Will return only labels that were marked previously and the user has unmarked
     * @return {Array} Label IDs
     */

    IssuableBulkActions.prototype.getUnmarkedIndeterminedLabels = function() {
      var el, i, id, j, labelsToKeep, len, len1, ref, ref1, result;
      result = [];
      labelsToKeep = [];
      ref = this.getElement('.labels-filter .is-indeterminate');
      for (i = 0, len = ref.length; i < len; i++) {
        el = ref[i];
        labelsToKeep.push($(el).data('labelId'));
      }
      ref1 = this.getLabelsFromSelection();
      for (j = 0, len1 = ref1.length; j < len1; j++) {
        id = ref1[j];
        if (labelsToKeep.indexOf(id) === -1) {
          result.push(id);
        }
      }
      return result;
    };


    /**
     * Simple form serialization, it will return just what we need
     * Returns key/value pairs from form data
     */

    IssuableBulkActions.prototype.getFormDataAsObject = function() {
      var formData;
      formData = {
        update: {
          state_event: this.form.find('input[name="update[state_event]"]').val(),
          assignee_id: this.form.find('input[name="update[assignee_id]"]').val(),
          milestone_id: this.form.find('input[name="update[milestone_id]"]').val(),
          issues_ids: this.form.find('input[name="update[issues_ids]"]').val(),
          subscription_event: this.form.find('input[name="update[subscription_event]"]').val(),
          add_label_ids: [],
          remove_label_ids: []
        }
      };
      if (this.willUpdateLabels) {
        this.getLabelsToApply().map(function(id) {
          return formData.update.add_label_ids.push(id);
        });
        this.getLabelsToRemove().map(function(id) {
          return formData.update.remove_label_ids.push(id);
        });
      }
      return formData;
    };

    IssuableBulkActions.prototype.getLabelsToApply = function() {
      var $labels, labelIds;
      labelIds = [];
      $labels = this.form.find('.labels-filter input[name="update[label_ids][]"]');
      $labels.each(function(k, label) {
        if (label) {
          return labelIds.push(parseInt($(label).val()));
        }
      });
      return labelIds;
    };


    /**
     * Returns Label IDs that will be removed from issue selection
     * @return {Array} Array of labels IDs
     */

    IssuableBulkActions.prototype.getLabelsToRemove = function() {
      var indeterminatedLabels, labelsToApply, result;
      result = [];
      indeterminatedLabels = this.getUnmarkedIndeterminedLabels();
      labelsToApply = this.getLabelsToApply();
      indeterminatedLabels.map(function(id) {
        if (labelsToApply.indexOf(id) === -1) {
          return result.push(id);
        }
      });
      return result;
    };

    return IssuableBulkActions;

  })();

}).call(this);