From 6a2898da5832e93a6d48acfe4ca644c0d80d5ebe Mon Sep 17 00:00:00 2001 From: Michael Whittaker Date: Sun, 20 Jan 2013 13:46:08 +0100 Subject: [PATCH] first try infinite loading with jquery.pageless. (#34) but only loads second page... --- Gemfile | 2 + Gemfile.lock | 8 + app/assets/images/load.gif | Bin 0 -> 8768 bytes app/assets/javascripts/ads.js.coffee | 2 + .../javascripts/libs/jquery.pageless.js | 210 ++++++++++++++++++ app/controllers/ads_controller.rb | 12 +- app/helpers/ads_helper.rb | 29 +++ app/models/ad.rb | 2 + app/views/ads/index.html.erb | 15 +- config/initializers/requires.rb | 3 +- config/locales/{recaptcha.yml => gems.yml} | 10 +- 11 files changed, 284 insertions(+), 9 deletions(-) create mode 100644 app/assets/images/load.gif create mode 100644 app/assets/javascripts/libs/jquery.pageless.js rename config/locales/{recaptcha.yml => gems.yml} (65%) diff --git a/Gemfile b/Gemfile index 6a114b9..10683f7 100644 --- a/Gemfile +++ b/Gemfile @@ -70,6 +70,8 @@ gem 'jquery-rails' gem 'twitter-bootstrap-rails' gem "high_voltage" +gem "will_paginate_mongoid" +gem 'bootstrap-will_paginate' gem "nokogiri" diff --git a/Gemfile.lock b/Gemfile.lock index af24f4d..e4a4716 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -53,6 +53,8 @@ GEM bbenezech-nested_form (0.0.6) bcrypt-ruby (3.0.1) bootstrap-sass (2.0.4.2) + bootstrap-will_paginate (0.0.9) + will_paginate bson (1.6.2) bson_ext (1.6.2) bson (~> 1.6.2) @@ -286,6 +288,10 @@ GEM uuidtools (2.1.3) warden (1.2.1) rack (>= 1.0) + will_paginate (3.0.4) + will_paginate_mongoid (1.1.0) + mongoid (>= 2.4) + will_paginate (~> 3.0) yajl-ruby (1.1.0) PLATFORMS @@ -293,6 +299,7 @@ PLATFORMS DEPENDENCIES aws-sdk + bootstrap-will_paginate bson_ext coffee-rails (~> 3.2.1) compass-rails @@ -331,4 +338,5 @@ DEPENDENCIES twitter-bootstrap-rails uglifier (>= 1.0.3) unicorn + will_paginate_mongoid yajl-ruby diff --git a/app/assets/images/load.gif b/app/assets/images/load.gif new file mode 100644 index 0000000000000000000000000000000000000000..1572476f6596dcae3ded6b2e484eca41a7f13b50 GIT binary patch literal 8768 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 K){bs~E&mTjVNN;# literal 0 HcmV?d00001 diff --git a/app/assets/javascripts/ads.js.coffee b/app/assets/javascripts/ads.js.coffee index 6015e9c..3fe5145 100644 --- a/app/assets/javascripts/ads.js.coffee +++ b/app/assets/javascripts/ads.js.coffee @@ -25,4 +25,6 @@ column_count++ return ) + if options.doNotDelete != true then $("#post_list").empty() + return grid diff --git a/app/assets/javascripts/libs/jquery.pageless.js b/app/assets/javascripts/libs/jquery.pageless.js new file mode 100644 index 0000000..df3bbba --- /dev/null +++ b/app/assets/javascripts/libs/jquery.pageless.js @@ -0,0 +1,210 @@ +// https://raw.github.com/jney/jquery.pageless/master/lib/jquery.pageless.js +// +// ======================================================================= +// PageLess - endless page +// +// Pageless is a jQuery plugin. +// As you scroll down you see more results coming back at you automatically. +// It provides an automatic pagination in an accessible way : if javascript +// is disabled your standard pagination is supposed to work. +// +// Licensed under the MIT: +// http://www.opensource.org/licenses/mit-license.php +// +// Parameters: +// currentPage: current page (params[:page]) +// distance: distance to the end of page in px when ajax query is fired +// loader: selector of the loader div (ajax activity indicator) +// loaderHtml: html code of the div if loader not used +// loaderImage: image inside the loader +// loaderMsg: displayed ajax message +// pagination: selector of the paginator divs. +// if javascript is disabled paginator is provided +// params: paramaters for the ajax query, you can pass auth_token here +// totalPages: total number of pages +// url: URL used to request more data +// method: HTML method for call URL, default - get +// +// Callback Parameters: +// scrape: A function to modify the incoming data. +// complete: A function to call when a new page has been loaded (optional) +// end: A function to call when the last page has been loaded (optional) +// +// Usage: +// $('#results').pageless({ totalPages: 10 +// , url: '/articles/' +// , loaderMsg: 'Loading more results' +// }); +// +// Requires: jquery +// +// Author: Jean-Sébastien Ney (https://github.com/jney) +// +// Contributors: +// Alexander Lang (https://github.com/langalex) +// Lukas Rieder (https://github.com/Overbryd) +// Kathryn Reeve (https://github.com/BinaryKitten) +// +// Thanks to: +// * codemonky.com/post/34940898 +// * www.unspace.ca/discover/pageless/ +// * famspam.com/facebox +// ======================================================================= + +(function($) { + + var FALSE = !1 + , TRUE = !FALSE + , element + , isLoading = FALSE + , loader + , namespace = '.pageless' + , SCROLL = 'scroll' + namespace + , RESIZE = 'resize' + namespace + , settings = { container: window + , currentPage: 1 + , distance: 100 + , pagination: '.pagination' + , params: {} + , url: location.href + , loaderImage: "/images/load.gif" + , method: 'get' + } + , container + , $container; + + $.pageless = function(opts) { + $.isFunction(opts) ? opts.call() : init(opts); + }; + + $.pagelessReset = function() { + settings = { container: window + , currentPage: 1 + , distance: 100 + , pagination: '.pagination' + , params: {} + , url: location.href + , loaderImage: "/images/load.gif" + , method: 'get' + }; + stopListener(); + // if there is a afterStopListener callback we call it + if (settings.end) settings.end.call(); + }; + + var loaderHtml = function () { + return settings.loaderHtml || '\ +'; + }; + + // settings params: totalPages + var init = function (opts) { + if (settings.inited) return; + settings.inited = TRUE; + + if (opts) $.extend(settings, opts); + + container = settings.container; + $container = $(container); + + // for accessibility we can keep pagination links + // but since we have javascript enabled we remove pagination links + if(settings.pagination) $(settings.pagination).remove(); + + // start the listener + startListener(); + }; + + $.fn.pageless = function (opts) { + var $el = $(this) + , $loader = $(opts.loader, $el); + + init(opts); + element = $el; + + // loader element + if (opts.loader && $loader.length) { + loader = $loader; + } else { + loader = $(loaderHtml()); + $el.append(loader); + // if we use the default loader, set the message + if (!opts.loaderHtml) { + $('#pageless-loader .msg').html(opts.loaderMsg).css(opts.msgStyles || {}); + } + } + }; + + // + var loading = function (bool) { + (isLoading = bool) + ? (loader && loader.fadeIn('normal')) + : (loader && loader.fadeOut('normal')); + }; + + // distance to end of the container + var distanceToBottom = function () { + return (container === window) + ? $(document).height() + - $container.scrollTop() + - $container.height() + : $container[0].scrollHeight + - $container.scrollTop() + - $container.height(); + }; + + var stopListener = function() { + $container.unbind(namespace); + }; + + // * bind a scroll event + // * trigger is once in case of reload + var startListener = function() { + $container.bind(SCROLL+' '+RESIZE, watch) + .trigger(SCROLL); + }; + + var watch = function() { + // listener was stopped or we've run out of pages + if (settings.totalPages <= settings.currentPage) { + stopListener(); + // if there is a afterStopListener callback we call it + if (settings.end) settings.end.call(); + return; + } + + // if slider past our scroll offset, then fire a request for more data + if(!isLoading && (distanceToBottom() < settings.distance)) { + loading(TRUE); + // move to next page + settings.currentPage++; + // set up ajax query params + $.extend( settings.params + , { page: settings.currentPage }); + // finally ajax query + if (settings.method == 'post') { + $.post( settings.url + , settings.params + , function (data) { + $.isFunction(settings.scrape) ? settings.scrape(data) : data; + loader ? loader.before(data) : element.append(data); + loading(FALSE); + // if there is a complete callback we call it + if (settings.complete) settings.complete.call(); + }, 'html'); + } else { + $.get( settings.url + , settings.params + , function (data) { + $.isFunction(settings.scrape) ? settings.scrape(data) : data; + loader ? loader.before(data) : element.append(data); + loading(FALSE); + if (settings.complete) settings.complete.call(); + }, 'html'); + } + } + }; +})(jQuery); \ No newline at end of file diff --git a/app/controllers/ads_controller.rb b/app/controllers/ads_controller.rb index bc0765d..3363c4f 100644 --- a/app/controllers/ads_controller.rb +++ b/app/controllers/ads_controller.rb @@ -22,7 +22,7 @@ def index end end - pp @ads #DEBUG + # pp @ads #DEBUG else # nope, no search, normal index if @category @ads = @category.all_ads @@ -33,7 +33,14 @@ def index end respond_to do |format| - format.html + format.html { + @ads = @ads.paginate(:per_page => 16, :page => params[:page]) + if request.xhr? + render partial: @ads + else + render "index" + end + } format.json { render json: @ads, except: [:admin_token, :email, :publish_email, :user_id] } format.atom end @@ -112,6 +119,7 @@ def set_youtube_thumbnail (ad) if ad.photo.blank? video = extract_youtube_videos(ad.text).first ad.alternative_thumbnail_url = video.thumbnail_url unless video.blank? || video.thumbnail_url.blank? + params[:ad][:alternative_thumbnail_url] = ad.alternative_thumbnail_url end end diff --git a/app/helpers/ads_helper.rb b/app/helpers/ads_helper.rb index ec0bf3b..26b26b0 100644 --- a/app/helpers/ads_helper.rb +++ b/app/helpers/ads_helper.rb @@ -4,4 +4,33 @@ def convert_links(html_string) "#{url}" end end + + # https://github.com/jney/jquery.pageless + def pageless(total_pages, url=nil, container=nil) + content_for :javascript do + js = <<-JS + + JS + js.html_safe + end + end + + end diff --git a/app/models/ad.rb b/app/models/ad.rb index 7a6e909..1b8df12 100644 --- a/app/models/ad.rb +++ b/app/models/ad.rb @@ -7,6 +7,8 @@ class Ad include Tire::Model::Search include Tire::Model::Callbacks + + attr_protected :views mapping do indexes :id, :index => :not_analyzed diff --git a/app/views/ads/index.html.erb b/app/views/ads/index.html.erb index 406f35f..24e2d2a 100644 --- a/app/views/ads/index.html.erb +++ b/app/views/ads/index.html.erb @@ -36,14 +36,16 @@ <% if @ads.count == 0 %>

<%= t ".no_entries" %>

<% end %> -
- +
+
+
+<%= will_paginate(@ads) %> <% content_for :head, auto_discovery_link_tag(:atom, params.merge({format: :atom, locale: nil}), {title: "iUPB Kleinanzeigen #{@category ? "("+@category.name+")" : "Feed"}"}) %> @@ -51,8 +53,9 @@ <% content_for :javascript do %> -<% end %> \ No newline at end of file +<% end %> + +<% pageless(@ads.total_pages, ads_path, "#post_list") %> \ No newline at end of file diff --git a/config/initializers/requires.rb b/config/initializers/requires.rb index e40f371..5499b15 100644 --- a/config/initializers/requires.rb +++ b/config/initializers/requires.rb @@ -1,4 +1,5 @@ require 'digest/md5' require 'ipaddr' require 'ostruct' -require "oembed" \ No newline at end of file +require "oembed" +require 'will_paginate/array' # https://github.com/mislav/will_paginate/issues/163#issuecomment-1837948 \ No newline at end of file diff --git a/config/locales/recaptcha.yml b/config/locales/gems.yml similarity index 65% rename from config/locales/recaptcha.yml rename to config/locales/gems.yml index 340f135..4ad807d 100644 --- a/config/locales/recaptcha.yml +++ b/config/locales/gems.yml @@ -5,6 +5,11 @@ en: errors: incorrect-captcha-sol: 'Invalid Captcha code' + will_paginate: + previous_label: Previous + previous_label: Next + + de: @@ -14,5 +19,8 @@ de: errors: incorrect-captcha-sol: 'Ungültiger Captcha-Code' + will_paginate: + previous_label: "Zurück" + previous_label: Weiter + -