summaryrefslogtreecommitdiff
path: root/app/assets/javascripts/boards/stores/boards_store.js.es6
blob: cdf1b09c0a48c8e1b96f1a90e05c94a163deca47 (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
/* eslint-disable comma-dangle, space-before-function-paren, one-var, no-shadow, dot-notation, max-len */
/* global Cookies */
/* global List */

(() => {
  window.gl = window.gl || {};
  window.gl.issueBoards = window.gl.issueBoards || {};

  gl.issueBoards.BoardsStore = {
    disabled: false,
    state: {},
    detail: {
      issue: {}
    },
    moving: {
      issue: {},
      list: {}
    },
    create () {
      this.state.lists = [];
      this.state.filters = {
        author_id: gl.utils.getParameterValues('author_id')[0],
        assignee_id: gl.utils.getParameterValues('assignee_id')[0],
        milestone_title: gl.utils.getParameterValues('milestone_title')[0],
        label_name: gl.utils.getParameterValues('label_name[]'),
        search: ''
      };
    },
    addList (listObj) {
      const list = new List(listObj);
      this.state.lists.push(list);

      return list;
    },
    new (listObj) {
      const list = this.addList(listObj);
      const backlogList = this.findList('type', 'backlog', 'backlog');

      list
        .save()
        .then(() => {
          // Remove any new issues from the backlog
          // as they will be visible in the new list
          list.issues.forEach(backlogList.removeIssue.bind(backlogList));

          this.state.lists = _.sortBy(this.state.lists, 'position');
        });
      this.removeBlankState();
    },
    updateNewListDropdown (listId) {
      $(`.js-board-list-${listId}`).removeClass('is-active');
    },
    shouldAddBlankState () {
      // Decide whether to add the blank state
      return !(this.state.lists.filter(list => list.type !== 'backlog' && list.type !== 'done')[0]);
    },
    addBlankState () {
      if (!this.shouldAddBlankState() || this.welcomeIsHidden() || this.disabled) return;

      this.addList({
        id: 'blank',
        list_type: 'blank',
        title: 'Welcome to your Issue Board!',
        position: 0
      });

      this.state.lists = _.sortBy(this.state.lists, 'position');
    },
    removeBlankState () {
      this.removeList('blank');

      Cookies.set('issue_board_welcome_hidden', 'true', {
        expires: 365 * 10,
        path: ''
      });
    },
    welcomeIsHidden () {
      return Cookies.get('issue_board_welcome_hidden') === 'true';
    },
    removeList (id, type = 'blank') {
      const list = this.findList('id', id, type);

      if (!list) return;

      this.state.lists = this.state.lists.filter(list => list.id !== id);
    },
    moveList (listFrom, orderLists) {
      orderLists.forEach((id, i) => {
        const list = this.findList('id', parseInt(id, 10));

        list.position = i;
      });
      listFrom.update();
    },
    moveIssueToList (listFrom, listTo, issue, newIndex) {
      const issueTo = listTo.findIssue(issue.id);
      const issueLists = issue.getLists();
      const listLabels = issueLists.map(listIssue => listIssue.label);

      // Add to new lists issues if it doesn't already exist
      if (!issueTo) {
        listTo.addIssue(issue, listFrom, newIndex);
      }

      if (listTo.type === 'done' && listFrom.type !== 'backlog') {
        issueLists.forEach((list) => {
          list.removeIssue(issue);
        });
        issue.removeLabels(listLabels);
      } else {
        listFrom.removeIssue(issue);
      }
    },
    findList (key, val, type = 'label') {
      return this.state.lists.filter((list) => {
        const byType = type ? list['type'] === type : true;

        return list[key] === val && byType;
      })[0];
    },
    updateFiltersUrl () {
      history.pushState(null, null, `?${$.param(this.state.filters)}`);
    }
  };
})();