diff options
author | Vincent Petry <pvince81@owncloud.com> | 2014-02-11 15:57:45 +0100 |
---|---|---|
committer | Vincent Petry <pvince81@owncloud.com> | 2014-04-28 14:34:28 +0200 |
commit | efdf0c4df0012fe03fb3de136ff596af1bb38677 (patch) | |
tree | c0e960f81236f5d00a63ee0527a457517af8d34a /apps/files/js | |
parent | f685c3ccebd5f910a78038e75b0d8f8299a89b93 (diff) | |
download | nextcloud-server-efdf0c4df0012fe03fb3de136ff596af1bb38677.tar.gz nextcloud-server-efdf0c4df0012fe03fb3de136ff596af1bb38677.zip |
Added infinite scrolling (in-memory list)
Diffstat (limited to 'apps/files/js')
-rw-r--r-- | apps/files/js/filelist.js | 65 |
1 files changed, 60 insertions, 5 deletions
diff --git a/apps/files/js/filelist.js b/apps/files/js/filelist.js index c33b638b5a6..21ce1418210 100644 --- a/apps/files/js/filelist.js +++ b/apps/files/js/filelist.js @@ -19,6 +19,12 @@ window.FileList = { breadcrumb: null, initialized: false, + // number of files per page + pageSize: 20, + // zero based page number + pageNumber: 0, + totalPages: 0, + /** * Initialize the file list and its components */ @@ -62,6 +68,16 @@ window.FileList = { } }, + _onScroll: function(e) { + if (this.pageNumber + 1 >= this.totalPages) { + return; + } + var target = $(document); + if ($(window).scrollTop() + $(window).height() > $(document).height() - 20) { + this._nextPage(true); + } + }, + /** * Event handler when dropping on a breadcrumb */ @@ -129,6 +145,42 @@ window.FileList = { // use filterAttr to avoid escaping issues return this.$fileList.find('tr').filterAttr('data-file', fileName); }, + + /** + * Appends the next page of files into the table + * @param animate true to animate the new elements + */ + _nextPage: function(animate) { + var tr, index, count = this.pageSize, + newTrs = []; + + if (this.pageNumber + 1 >= this.totalPages) { + return; + } + + this.pageNumber++; + index = this.pageNumber * this.pageSize; + + while (count > 0 && index < this.files.length) { + tr = this.add(this.files[index], {updateSummary: false}); + if (animate) { + tr.addClass('appear transparent'); // TODO + newTrs.push(tr); + } + index++; + count--; + } + + if (animate) { + // defer, for animation + window.setTimeout(function() { + for (var i = 0; i < newTrs.length; i++ ) { + newTrs[i].removeClass('transparent'); + } + }, 0); + } + }, + /** * Sets the files to be displayed in the list. * This operation will rerender the list and update the summary. @@ -136,14 +188,15 @@ window.FileList = { */ setFiles:function(filesArray) { // detach to make adding multiple rows faster - this.$fileList.detach(); + this.files = filesArray; + this.pageNumber = -1; + this.totalPages = Math.ceil(filesArray.length / this.pageSize); + this.$fileList.detach(); this.$fileList.empty(); - this.isEmpty = filesArray.length === 0; - for (var i = 0; i < filesArray.length; i++) { - this.add(filesArray[i], {updateSummary: false}); - } + this.isEmpty = this.files.length === 0; + this._nextPage(); this.$el.find('thead').after(this.$fileList); @@ -1255,6 +1308,8 @@ $(document).ready(function() { } }; + $(window).scroll(function(e) {FileList._onScroll(e);}); + var dir = parseCurrentDirFromUrl(); // trigger ajax load, deferred to let sub-apps do their overrides first setTimeout(function() { |