summaryrefslogtreecommitdiff
path: root/app/assets/javascripts/groups/groups_filterable_list.js
blob: 041f4fc54f35932cd5a0dc96b1135b87255676d1 (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
import FilterableList from '~/filterable_list';
import eventHub from './event_hub';

export default class GroupFilterableList extends FilterableList {
  constructor({ form, filter, holder, filterDropdownSel, filterEndpoint, pagePath }) {
    super(form, filter, holder);
    this.form = form;
    this.filterEndpoint = filterEndpoint;
    this.pagePath = pagePath;
    this.$dropdown = $(filterDropdownSel);
  }

  getFilterEndpoint() {
    return this.filterEndpoint;
  }

  getPagePath(queryData) {
    const params = queryData ? $.param(queryData) : '';
    const queryString = params ? `?${params}` : '';
    return `${this.pagePath}${queryString}`;
  }

  bindEvents() {
    super.bindEvents();

    this.onFormSubmitWrapper = this.onFormSubmit.bind(this);
    this.onFilterOptionClikWrapper = this.onOptionClick.bind(this);

    this.filterForm.addEventListener('submit', this.onFormSubmitWrapper);
    this.$dropdown.on('click', 'a', this.onFilterOptionClikWrapper);
  }

  onFormSubmit(e) {
    e.preventDefault();

    const $form = $(this.form);
    const filterGroupsParam = $form.find('[name="filter_groups"]').val();
    const queryData = {};

    if (filterGroupsParam) {
      queryData.filter_groups = filterGroupsParam;
    }

    this.filterResults(queryData);
    this.setDefaultFilterOption();
  }

  setDefaultFilterOption() {
    const defaultOption = $.trim(this.$dropdown.find('.dropdown-menu a:first-child').text());
    this.$dropdown.find('.dropdown-label').text(defaultOption);
  }

  onOptionClick(e) {
    e.preventDefault();

    const queryData = {};
    const sortParam = gl.utils.getParameterByName('sort', e.currentTarget.href);

    if (sortParam) {
      queryData.sort = sortParam;
    }

    this.filterResults(queryData);

    // Active selected option
    this.$dropdown.find('.dropdown-label').text($.trim(e.currentTarget.text));

    // Clear current value on search form
    this.form.querySelector('[name="filter_groups"]').value = '';
  }

  onFilterSuccess(data, xhr, queryData) {
    super.onFilterSuccess(data, xhr, queryData);

    const paginationData = {
      'X-Per-Page': xhr.getResponseHeader('X-Per-Page'),
      'X-Page': xhr.getResponseHeader('X-Page'),
      'X-Total': xhr.getResponseHeader('X-Total'),
      'X-Total-Pages': xhr.getResponseHeader('X-Total-Pages'),
      'X-Next-Page': xhr.getResponseHeader('X-Next-Page'),
      'X-Prev-Page': xhr.getResponseHeader('X-Prev-Page'),
    };

    eventHub.$emit('updateGroups', data);
    eventHub.$emit('updatePagination', paginationData);
  }
}