summaryrefslogtreecommitdiff
path: root/app/assets/javascripts/filterable_list.js
diff options
context:
space:
mode:
authorAlfredo Sumaran <alfredo@gitlab.com>2017-06-06 00:06:08 -0500
committerAlfredo Sumaran <alfredo@gitlab.com>2017-06-06 04:31:40 -0500
commit323a326c73f4aabf37bf79f8e42350c128983c2d (patch)
treefb21b276fac004c817871c68af5a349bc8ed012f /app/assets/javascripts/filterable_list.js
parentea531e1effa51bcec84e50a69901e6eec7c789c1 (diff)
downloadgitlab-ce-323a326c73f4aabf37bf79f8e42350c128983c2d.tar.gz
Improve pagination when searching or filtering
[ci skip]
Diffstat (limited to 'app/assets/javascripts/filterable_list.js')
-rw-r--r--app/assets/javascripts/filterable_list.js62
1 files changed, 41 insertions, 21 deletions
diff --git a/app/assets/javascripts/filterable_list.js b/app/assets/javascripts/filterable_list.js
index 17c39cc7bbb..139206cc185 100644
--- a/app/assets/javascripts/filterable_list.js
+++ b/app/assets/javascripts/filterable_list.js
@@ -8,7 +8,15 @@ export default class FilterableList {
this.filterForm = form;
this.listFilterElement = filter;
this.listHolderElement = holder;
- this.filterUrl = `${this.filterForm.getAttribute('action')}?${$(this.filterForm).serialize()}`;
+ this.isBusy = false;
+ }
+
+ getFilterEndpoint() {
+ return `${this.filterForm.getAttribute('action')}?${$(this.filterForm).serialize()}`;
+ }
+
+ getPagePath() {
+ return this.getFilterEndpoint();
}
initSearch() {
@@ -20,9 +28,19 @@ export default class FilterableList {
}
onFilterInput() {
- const url = this.filterForm.getAttribute('action');
- const data = $(this.filterForm).serialize();
- this.filterResults(url, data, 'filter-input');
+ const $form = $(this.filterForm);
+ const queryData = {};
+ const filterGroupsParam = $form.find('[name="filter_groups"]').val();
+
+ if (filterGroupsParam) {
+ queryData.filter_groups = filterGroupsParam;
+ }
+
+ this.filterResults(queryData);
+
+ if (this.setDefaultFilterOption) {
+ this.setDefaultFilterOption();
+ }
}
bindEvents() {
@@ -33,42 +51,44 @@ export default class FilterableList {
this.listFilterElement.removeEventListener('input', this.debounceFilter);
}
- filterResults(url, data, comingFrom) {
- const endpoint = url || this.filterForm.getAttribute('action');
- const additionalData = data || $(this.filterForm).serialize();
+ filterResults(queryData) {
+ if (this.isBusy) {
+ return false;
+ }
$(this.listHolderElement).fadeTo(250, 0.5);
return $.ajax({
- url: endpoint,
- data: additionalData,
+ url: this.getFilterEndpoint(),
+ data: queryData,
type: 'GET',
dataType: 'json',
context: this,
complete: this.onFilterComplete,
+ beforeSend: () => {
+ this.isBusy = true;
+ },
success: (response, textStatus, xhr) => {
- if (this.preOnFilterSuccess) {
- this.preOnFilterSuccess(comingFrom);
- }
-
- this.onFilterSuccess(response, xhr);
+ this.onFilterSuccess(response, xhr, queryData);
},
});
}
- onFilterSuccess(data) {
- if (data.html) {
- this.listHolderElement.innerHTML = data.html;
+ onFilterSuccess(response, xhr, queryData) {
+ if (response.html) {
+ this.listHolderElement.innerHTML = response.html;
}
- // Change url so if user reload a page - search results are saved
- return window.history.replaceState({
- page: this.filterUrl,
+ // Change url so if user reload a page - search results are saved
+ const currentPath = this.getPagePath(queryData);
- }, document.title, this.filterUrl);
+ return window.history.replaceState({
+ page: currentPath,
+ }, document.title, currentPath);
}
onFilterComplete() {
+ this.isBusy = false;
$(this.listHolderElement).fadeTo(250, 1);
}
}