boards_store.js.es6 3.44 KB
Newer Older
1
/* eslint-disable */
2 3 4 5 6
(() => {
  window.gl = window.gl || {};
  window.gl.issueBoards = window.gl.issueBoards || {};

  gl.issueBoards.BoardsStore = {
7
    disabled: false,
8 9 10
    state: {},
    detail: {
      issue: {}
Phil Hughes's avatar
Phil Hughes committed
11
    },
12 13 14 15
    moving: {
      issue: {},
      list: {}
    },
Phil Hughes's avatar
Phil Hughes committed
16
    create () {
17 18
      this.state.lists = [];
      this.state.filters = {
19 20
        author_id: gl.utils.getParameterValues('author_id')[0],
        assignee_id: gl.utils.getParameterValues('assignee_id')[0],
21
        milestone_title: gl.utils.getParameterValues('milestone_title')[0],
22 23
        label_name: gl.utils.getParameterValues('label_name[]'),
        search: ''
24 25
      };
    },
Phil Hughes's avatar
Phil Hughes committed
26
    addList (listObj) {
Phil Hughes's avatar
Phil Hughes committed
27
      const list = new List(listObj);
28 29
      this.state.lists.push(list);

30 31
      return list;
    },
Phil Hughes's avatar
Phil Hughes committed
32
    new (listObj) {
Phil Hughes's avatar
Phil Hughes committed
33
      const list = this.addList(listObj),
34
            backlogList = this.findList('type', 'backlog', 'backlog');
Phil Hughes's avatar
Phil Hughes committed
35 36 37

      list
        .save()
Phil Hughes's avatar
Phil Hughes committed
38
        .then(() => {
Phil Hughes's avatar
Phil Hughes committed
39 40
          // Remove any new issues from the backlog
          // as they will be visible in the new list
Phil Hughes's avatar
Phil Hughes committed
41
          list.issues.forEach(backlogList.removeIssue.bind(backlogList));
42 43

          this.state.lists = _.sortBy(this.state.lists, 'position');
Phil Hughes's avatar
Phil Hughes committed
44 45 46
        });
      this.removeBlankState();
    },
47 48
    updateNewListDropdown (listId) {
      $(`.js-board-list-${listId}`).removeClass('is-active');
49
    },
Phil Hughes's avatar
Phil Hughes committed
50
    shouldAddBlankState () {
51
      // Decide whether to add the blank state
Phil Hughes's avatar
Phil Hughes committed
52
      return !(this.state.lists.filter( list => list.type !== 'backlog' && list.type !== 'done' )[0]);
53
    },
Phil Hughes's avatar
Phil Hughes committed
54
    addBlankState () {
Phil Hughes's avatar
Phil Hughes committed
55
      if (!this.shouldAddBlankState() || this.welcomeIsHidden() || this.disabled) return;
56

Phil Hughes's avatar
Phil Hughes committed
57 58 59 60 61 62
      this.addList({
        id: 'blank',
        list_type: 'blank',
        title: 'Welcome to your Issue Board!',
        position: 0
      });
Phil Hughes's avatar
Phil Hughes committed
63 64

      this.state.lists = _.sortBy(this.state.lists, 'position');
65
    },
Phil Hughes's avatar
Phil Hughes committed
66
    removeBlankState () {
67
      this.removeList('blank');
68

69
      Cookies.set('issue_board_welcome_hidden', 'true', {
70 71
        expires: 365 * 10,
        path: ''
72
      });
73
    },
Phil Hughes's avatar
Phil Hughes committed
74
    welcomeIsHidden () {
75
      return Cookies.get('issue_board_welcome_hidden') === 'true';
76
    },
77 78
    removeList (id, type = 'blank') {
      const list = this.findList('id', id, type);
79 80 81

      if (!list) return;

Phil Hughes's avatar
Phil Hughes committed
82
      this.state.lists = this.state.lists.filter( list => list.id !== id );
Phil Hughes's avatar
Phil Hughes committed
83
    },
84
    moveList (listFrom, orderLists) {
Phil Hughes's avatar
Phil Hughes committed
85
      orderLists.forEach((id, i) => {
Phil Hughes's avatar
Phil Hughes committed
86
        const list = this.findList('id', parseInt(id));
Phil Hughes's avatar
Phil Hughes committed
87

88
        list.position = i;
Phil Hughes's avatar
Phil Hughes committed
89
      });
90
      listFrom.update();
Phil Hughes's avatar
Phil Hughes committed
91
    },
92
    moveIssueToList (listFrom, listTo, issue, newIndex) {
93
      const issueTo = listTo.findIssue(issue.id),
94
            issueLists = issue.getLists(),
Phil Hughes's avatar
Phil Hughes committed
95
            listLabels = issueLists.map( listIssue => listIssue.label );
96

Phil Hughes's avatar
Phil Hughes committed
97
      // Add to new lists issues if it doesn't already exist
98
      if (!issueTo) {
99
        listTo.addIssue(issue, listFrom, newIndex);
Phil Hughes's avatar
Phil Hughes committed
100 101
      }

102
      if (listTo.type === 'done' && listFrom.type !== 'backlog') {
Phil Hughes's avatar
Phil Hughes committed
103
        issueLists.forEach((list) => {
104
          list.removeIssue(issue);
Phil Hughes's avatar
Phil Hughes committed
105
        })
106
        issue.removeLabels(listLabels);
107 108
      } else {
        listFrom.removeIssue(issue);
Phil Hughes's avatar
Phil Hughes committed
109 110
      }
    },
111
    findList (key, val, type = 'label') {
Phil Hughes's avatar
Phil Hughes committed
112
      return this.state.lists.filter((list) => {
113
        const byType = type ? list['type'] === type : true;
114

115
        return list[key] === val && byType;
Phil Hughes's avatar
Phil Hughes committed
116
      })[0];
117
    },
Phil Hughes's avatar
Phil Hughes committed
118
    updateFiltersUrl () {
119
      history.pushState(null, null, `?${$.param(this.state.filters)}`);
Phil Hughes's avatar
Phil Hughes committed
120 121
    }
  };
122
})();