summaryrefslogtreecommitdiff
path: root/app
diff options
context:
space:
mode:
authorPhil Hughes <me@iamphill.com>2016-08-05 14:58:42 +0100
committerPhil Hughes <me@iamphill.com>2016-08-17 17:12:47 +0100
commitd06e20b2635a97f2a6533ec6ecdbfc31b182e134 (patch)
treeeccfb4a71cdc010f224c463ba23cea49bed1b085 /app
parent9d307ee0260caac256eac88da0f6910035f41597 (diff)
downloadgitlab-ce-d06e20b2635a97f2a6533ec6ecdbfc31b182e134.tar.gz
Added ability to infinite scroll issues list
Diffstat (limited to 'app')
-rw-r--r--app/assets/javascripts/boards/components/board.js.es69
-rw-r--r--app/assets/javascripts/boards/components/board_list.js.es620
-rw-r--r--app/assets/javascripts/boards/models/list.js.es625
-rw-r--r--app/views/projects/boards/components/_board.html.haml7
4 files changed, 44 insertions, 17 deletions
diff --git a/app/assets/javascripts/boards/components/board.js.es6 b/app/assets/javascripts/boards/components/board.js.es6
index 755469744d7..e798f72bddb 100644
--- a/app/assets/javascripts/boards/components/board.js.es6
+++ b/app/assets/javascripts/boards/components/board.js.es6
@@ -11,14 +11,19 @@
watch: {
'query': function () {
if (this.board.canSearch()) {
- const data = _.extend(this.filters, { search: this.query });
- this.board.getIssues(data);
+ this.board.filters = this.getFilterData();
+ this.board.getIssues(true);
}
}
},
methods: {
clearSearch: function () {
this.query = '';
+ },
+ getFilterData: function () {
+ const queryData = this.board.canSearch() ? { search: this.query } : {};
+
+ return _.extend(this.filters, queryData);
}
},
computed: {
diff --git a/app/assets/javascripts/boards/components/board_list.js.es6 b/app/assets/javascripts/boards/components/board_list.js.es6
index 4b949661d22..50acfeb5669 100644
--- a/app/assets/javascripts/boards/components/board_list.js.es6
+++ b/app/assets/javascripts/boards/components/board_list.js.es6
@@ -2,16 +2,15 @@
const BoardList = Vue.extend({
props: {
disabled: Boolean,
- boardId: [Number, String],
- filters: Object,
+ list: Object,
issues: Array,
loading: Boolean,
issueLinkBase: String
},
data: function () {
return {
- scrollOffset: 20,
- loadMore: false
+ scrollOffset: 250,
+ loadingMore: false
};
},
methods: {
@@ -24,8 +23,15 @@
scrollTop: function () {
return this.$els.list.scrollTop + this.listHeight();
},
- loadFromLastId: function () {
+ loadNextPage: function () {
+ this.loadingMore = true;
+ const getIssues = this.list.nextPage();
+ if (getIssues) {
+ getIssues.then(() => {
+ this.loadingMore = false;
+ });
+ }
},
},
ready: function () {
@@ -51,8 +57,8 @@
// Scroll event on list to load more
this.$els.list.onscroll = () => {
- if ((this.scrollTop() > this.scrollHeight() - this.scrollOffset) && !this.loadMore) {
- this.loadFromLastId();
+ if ((this.scrollTop() > this.scrollHeight() - this.scrollOffset) && !this.loadingMore) {
+ this.loadNextPage();
}
};
}
diff --git a/app/assets/javascripts/boards/models/list.js.es6 b/app/assets/javascripts/boards/models/list.js.es6
index 4639491f4aa..aa73c93f52b 100644
--- a/app/assets/javascripts/boards/models/list.js.es6
+++ b/app/assets/javascripts/boards/models/list.js.es6
@@ -4,6 +4,8 @@ class List {
this.position = obj.position;
this.title = obj.title;
this.type = obj.list_type;
+ this.filters = {};
+ this.page = 1;
this.loading = true;
this.issues = [];
@@ -39,19 +41,34 @@ class List {
gl.boardService.updateList(this);
}
+ nextPage () {
+ if (this.issues.length / 20 === this.page) {
+ this.page++;
+
+ return this.getIssues(false);
+ }
+ }
+
canSearch () {
return this.type === 'backlog';
}
- getIssues (filter = {}) {
- this.loading = true;
+ getIssues (emptyIssues = true) {
+ const data = _.extend({ page: this.page }, this.filters);
- gl.boardService.getIssuesForList(this.id, filter)
+ if (emptyIssues) {
+ this.loading = true;
+ }
+
+ return gl.boardService.getIssuesForList(this.id, data)
.then((resp) => {
const data = resp.json();
this.loading = false;
- this.issues = [];
+ if (emptyIssues) {
+ this.issues = [];
+ }
+
this.createIssues(data);
});
}
diff --git a/app/views/projects/boards/components/_board.html.haml b/app/views/projects/boards/components/_board.html.haml
index b4d4ca4df06..bde02b12bff 100644
--- a/app/views/projects/boards/components/_board.html.haml
+++ b/app/views/projects/boards/components/_board.html.haml
@@ -15,18 +15,17 @@
%button.board-search-clear-btn{ type: "button", role: "button", "aria-label" => "Clear search", "@click" => "clearSearch", "v-show" => "query" }
= icon("times", class: "board-search-clear")
%board-list{ "inline-template" => true,
- "v-if" => "board.id != 'blank'",
- ":board-id" => "board.id",
+ "v-if" => "board.type !== 'blank'",
+ ":list" => "board",
":issues" => "board.issues",
":disabled" => "#{current_user.nil?}",
- ":filters" => "filters",
":loading" => "board.loading",
":issue-link-base" => "'#{namespace_project_issues_path(@project.namespace, @project)}'" }
.board-list-loading.text-center{ "v-if" => "loading" }
= icon("spinner spin")
%ul.board-list{ "v-el:list" => true,
"v-show" => "!loading",
- ":data-board" => "boardId" }
+ ":data-board" => "list.id" }
= render "projects/boards/components/card"
- if current_user
= render "projects/boards/components/blank_state"