diff --git a/app/assets/javascripts/application.js b/app/assets/javascripts/application.js index 5782f0afc7580f9fb370dcb114a2ab85efce1660..1a011c7d43ee67bd8352ae3acd51c160f24c2927 100644 --- a/app/assets/javascripts/application.js +++ b/app/assets/javascripts/application.js @@ -10,6 +10,7 @@ //= require jquery.ui.selectmenu //= require jquery.tagify //= require jquery.cookie +//= require jquery.endless-scroll //= require modernizr //= require chosen //= require raphael diff --git a/app/assets/javascripts/commits.js b/app/assets/javascripts/commits.js index bb06df55c6e18b3e6d50b000312e5008ad64ab6a..b31fe485896865d09f0104af225fac248a144886 100644 --- a/app/assets/javascripts/commits.js +++ b/app/assets/javascripts/commits.js @@ -2,6 +2,7 @@ var CommitsList = { ref:null, limit:0, offset:0, + disable:false, init: function(ref, limit) { @@ -36,15 +37,21 @@ var CommitsList = { $("#commits_list").append(html); if(count > 0) { this.offset += count; - this.initLoadMore(); + } else { + this.disable = true; } }, initLoadMore: function() { - $(window).bind('scroll', function(){ - if($(window).scrollTop() == $(document).height() - $(window).height()){ - $(window).unbind('scroll'); + $(document).endlessScroll({ + bottomPixels: 400, + fireDelay: 1000, + fireOnce:true, + ceaseFire: function() { + return CommitsList.disable; + }, + callback: function(i) { CommitsList.getOld(); } }); diff --git a/app/assets/javascripts/note.js b/app/assets/javascripts/note.js index c791623b91d06a1a96de88f2f4b751900d736369..831150ffbdb616adf103157e5cdee8917c96351a 100644 --- a/app/assets/javascripts/note.js +++ b/app/assets/javascripts/note.js @@ -3,6 +3,7 @@ var NoteList = { first_id: 0, last_id: 0, resource_name: null, +disable:false, init: function(resource_name, first_id, last_id) { @@ -26,9 +27,12 @@ getOld: append: function(id, html) { - this.first_id = id; - $("#notes-list").append(html); - this.initLoadMore(); + if(this.first_id == id) { + this.disable = true; + } else { + this.first_id = id; + $("#notes-list").append(html); + } }, replace: @@ -76,11 +80,16 @@ initRefresh: initLoadMore: function() { - $(window).bind('scroll', function(){ - if($(window).scrollTop() == $(document).height() - $(window).height()){ - $(window).unbind('scroll'); + $(document).endlessScroll({ + bottomPixels: 400, + fireDelay: 1000, + fireOnce:true, + ceaseFire: function() { + return NoteList.disable; + }, + callback: function(i) { NoteList.getOld(); } - }); + }); } } diff --git a/app/assets/javascripts/pager.js b/app/assets/javascripts/pager.js index f34f198d85043e4f901adb86bb46b132d6c8111c..d42ae1e05d1aa210faf75229b122afbb4d0e7fae 100644 --- a/app/assets/javascripts/pager.js +++ b/app/assets/javascripts/pager.js @@ -1,11 +1,10 @@ var Pager = { - ref:null, limit:0, offset:0, + disable:false, init: - function(ref, limit) { - this.ref=ref; + function(limit) { this.limit=limit; this.offset=limit; this.initLoadMore(); @@ -28,17 +27,24 @@ var Pager = { $(".content_list").append(html); if(count > 0) { this.offset += count; - this.initLoadMore(); + } else { + this.disable = true; } }, initLoadMore: function() { - $(window).bind('scroll', function(){ - if($(window).scrollTop() == $(document).height() - $(window).height()){ - $(window).unbind('scroll'); + $(document).endlessScroll({ + bottomPixels: 400, + fireDelay: 1000, + fireOnce:true, + ceaseFire: function() { + return Pager.disable; + }, + callback: function(i) { + $('.loading').show(); Pager.getOld(); } - }); + }); } } diff --git a/app/assets/javascripts/projects.js b/app/assets/javascripts/projects.js deleted file mode 100644 index 90de73a112def4edbb3e775c90e3c5654e6d08af..0000000000000000000000000000000000000000 --- a/app/assets/javascripts/projects.js +++ /dev/null @@ -1,42 +0,0 @@ -var ProjectsList = { - limit:0, - offset:0, - - init: - function(limit) { - this.limit=limit; - this.offset=limit; - this.initLoadMore(); - }, - - getOld: - function() { - $('.loading').show(); - $.ajax({ - type: "GET", - url: location.href, - data: "limit=" + this.limit + "&offset=" + this.offset, - complete: function(){ $('.loading').hide()}, - dataType: "script"}); - }, - - append: - function(count, html) { - $(".tile").append(html); - if(count > 0) { - this.offset += count; - this.initLoadMore(); - } - }, - - initLoadMore: - function() { - $(window).bind('scroll', function(){ - if($(window).scrollTop() == $(document).height() - $(window).height()){ - $(window).unbind('scroll'); - $('.loading').show(); - ProjectsList.getOld(); - } - }); - } -} diff --git a/app/controllers/commits_controller.rb b/app/controllers/commits_controller.rb index 74ea018a15003b0464b633ce37219fd1ebaf7fe9..18f2758794e622e05b74a04ec3494dae8c5acfda 100644 --- a/app/controllers/commits_controller.rb +++ b/app/controllers/commits_controller.rb @@ -13,7 +13,7 @@ class CommitsController < ApplicationController def index @repo = project.repo - @limit, @offset = (params[:limit] || 20), (params[:offset] || 0) + @limit, @offset = (params[:limit] || 40), (params[:offset] || 0) @commits = @project.commits(@ref, params[:path], @limit, @offset) respond_to do |format| diff --git a/app/views/commits/index.html.haml b/app/views/commits/index.html.haml index a1a5eed796b59afa70874d2b033c221a377e366e..048ee733cb57d24b782253bf8ed118a54b7371ac 100644 --- a/app/views/commits/index.html.haml +++ b/app/views/commits/index.html.haml @@ -26,6 +26,6 @@ - if @commits.count == @limit :javascript $(function(){ - CommitsList.init("#{@ref}", 20); + CommitsList.init("#{@ref}", #{@limit}); }); diff --git a/app/views/notes/_load.js.haml b/app/views/notes/_load.js.haml index 62d44fe1d5f99429dbb03c33ff9fdf7e15835aef..8d1b83f47087fb37089e14397f6274255a675feb 100644 --- a/app/views/notes/_load.js.haml +++ b/app/views/notes/_load.js.haml @@ -14,3 +14,8 @@ - else :plain + +- else + - if params[:first_id] + :plain + NoteList.append(#{params[:first_id]}, ""); diff --git a/app/views/projects/index.html.haml b/app/views/projects/index.html.haml index c52a7f858196cf146321d121d13f41ab7026a309..32c4685fe0c8349fa4d1ca12075ff17aeffe73bb 100644 --- a/app/views/projects/index.html.haml +++ b/app/views/projects/index.html.haml @@ -3,7 +3,7 @@ %small= "( #{current_user.projects.count} )" %hr - unless @projects.empty? - %div.tile= render "tile" + %div.content_list= render "tile" -# If projects requris paging -# We add ajax loader & init script @@ -13,7 +13,7 @@ :javascript $(function(){ - ProjectsList.init(16); + Pager.init(#{@limit}); }); - else %h2 Nothing here diff --git a/app/views/projects/index.js.haml b/app/views/projects/index.js.haml index 25da7cb420249eca07edbe6307d6a41c07ea94f4..15bbd9730d0c147a776eb86983db17d74a0c0dc0 100644 --- a/app/views/projects/index.js.haml +++ b/app/views/projects/index.js.haml @@ -1,2 +1,2 @@ :plain - ProjectsList.append(#{@projects.count}, "#{escape_javascript(render(:partial => 'projects/tile'))}"); + Pager.append(#{@projects.count}, "#{escape_javascript(render(:partial => 'projects/tile'))}"); diff --git a/vendor/assets/javascripts/jquery.endless-scroll.js b/vendor/assets/javascripts/jquery.endless-scroll.js new file mode 100644 index 0000000000000000000000000000000000000000..38db6b0510127ebd9d6dc02e19a75fff0a6af2d8 --- /dev/null +++ b/vendor/assets/javascripts/jquery.endless-scroll.js @@ -0,0 +1,128 @@ +/** + * Endless Scroll plugin for jQuery + * + * v1.4.8 + * + * Copyright (c) 2008 Fred Wu + * + * Dual licensed under the MIT and GPL licenses: + * http://www.opensource.org/licenses/mit-license.php + * http://www.gnu.org/licenses/gpl.html + */ + +/** + * Usage: + * + * // using default options + * $(document).endlessScroll(); + * + * // using some custom options + * $(document).endlessScroll({ + * fireOnce: false, + * fireDelay: false, + * loader: "<div class=\"loading\"><div>", + * callback: function(){ + * alert("test"); + * } + * }); + * + * Configuration options: + * + * bottomPixels integer the number of pixels from the bottom of the page that triggers the event + * fireOnce boolean only fire once until the execution of the current event is completed + * fireDelay integer delay the subsequent firing, in milliseconds, 0 or false to disable delay + * loader string the HTML to be displayed during loading + * data string|function plain HTML data, can be either a string or a function that returns a string, + * when passed as a function it accepts one argument: fire sequence (the number + * of times the event triggered during the current page session) + * insertAfter string jQuery selector syntax: where to put the loader as well as the plain HTML data + * callback function callback function, accepts one argument: fire sequence (the number of times + * the event triggered during the current page session) + * resetCounter function resets the fire sequence counter if the function returns true, this function + * could also perform hook actions since it is applied at the start of the event + * ceaseFire function stops the event (no more endless scrolling) if the function returns true + * + * Usage tips: + * + * The plugin is more useful when used with the callback function, which can then make AJAX calls to retrieve content. + * The fire sequence argument (for the callback function) is useful for 'pagination'-like features. + */ + +(function($){ + + $.fn.endlessScroll = function(options) { + + var defaults = { + bottomPixels : 50, + fireOnce : true, + fireDelay : 150, + loader : "<br />Loading...<br />", + data : "", + insertAfter : "div:last", + resetCounter : function() { return false; }, + callback : function() { return true; }, + ceaseFire : function() { return false; } + }; + + var options = $.extend({}, defaults, options), + firing = true, + fired = false, + fireSequence = 0, + is_scrollable; + + if (options.ceaseFire.apply(this) === true) + firing = false; + + if (firing === true) { + $(this).scroll(function() { + if (options.ceaseFire.apply(this) === true) { + firing = false; + return; // Scroll will still get called, but nothing will happen + } + + if (this == document || this == window) { + is_scrollable = $(document).height() - $(window).height() <= $(window).scrollTop() + options.bottomPixels; + } else { + // calculates the actual height of the scrolling container + var inner_wrap = $(".endless_scroll_inner_wrap", this); + if (inner_wrap.length == 0) + inner_wrap = $(this).wrapInner("<div class=\"endless_scroll_inner_wrap\" />").find(".endless_scroll_inner_wrap"); + is_scrollable = inner_wrap.length > 0 && + (inner_wrap.height() - $(this).height() <= $(this).scrollTop() + options.bottomPixels); + } + + if (is_scrollable && (options.fireOnce == false || (options.fireOnce == true && fired != true))) { + if (options.resetCounter.apply(this) === true) fireSequence = 0; + + fired = true; + fireSequence++; + + $(options.insertAfter).after("<div id=\"endless_scroll_loader\">" + options.loader + "</div>"); + + data = typeof options.data == 'function' ? options.data.apply(this, [fireSequence]) : options.data; + + if (data !== false) { + $(options.insertAfter).after("<div id=\"endless_scroll_data\">" + data + "</div>"); + $("#endless_scroll_data").hide().fadeIn(250, function() {$(this).removeAttr("id");}); + + options.callback.apply(this, [fireSequence]); + + if (options.fireDelay !== false || options.fireDelay !== 0) { + $("body").after("<div id=\"endless_scroll_marker\"></div>"); + // slight delay for preventing event firing twice + $("#endless_scroll_marker").fadeTo(options.fireDelay, 1, function() { + $(this).remove(); + fired = false; + }); + } + else + fired = false; + } + + $("#endless_scroll_loader").remove(); + } + }); + } + }; + +})(jQuery); \ No newline at end of file