neat-pages 0.0.2 → 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
data/README.md CHANGED
@@ -1,7 +1,7 @@
1
1
  Neat Pages [![Build Status](https://secure.travis-ci.org/demarque/neat-pages.png?branch=master)](http://travis-ci.org/demarque/neat-pages)
2
2
  ===============
3
3
 
4
- A simple pagination API to paginate Mongoid Models or any other stuff...
4
+ A simple pagination API to paginate Mongoid Models.
5
5
 
6
6
  Install
7
7
  -------
@@ -19,13 +19,89 @@ In your Gemfile:
19
19
  gem 'neat-pages'
20
20
  ```
21
21
 
22
+
23
+ Setup
24
+ -----
25
+
26
+ First you need to link the assets.
27
+
28
+ In your css manifest put : ``` require neat_pages ```
29
+
30
+ In your javascript manifest put : ``` require neat_pages ```
31
+
32
+ You only need to require the javascript if you use the AJAX functionnality.
33
+
34
+ That's it.
35
+
36
+
22
37
  Usage
23
38
  -----
24
39
 
25
- COMING SOON
40
+
41
+ Examples
42
+ --------
43
+
44
+ ### Minimal integration
45
+
46
+ In your controller *(app/controllers/products_controller.rb)*
47
+
48
+ ```ruby
49
+ def index
50
+ paginate
51
+
52
+ @products = Product.all.paginate(pagination)
53
+ end
54
+ ```
55
+
56
+ In your view *(app/views/products/index.html.erb)*
57
+
58
+ ```erb
59
+ <%= render 'products', products: @products %>
60
+ <%= neat_pages_navigation %>
61
+ ```
62
+
63
+
64
+ ### Summon the power of AJAX
65
+
66
+ In your controller *(app/controllers/products_controller.rb)*
67
+
68
+ ```ruby
69
+ def index
70
+ paginate
71
+
72
+ @products = Product.all.paginate(pagination)
73
+ end
74
+ ```
75
+
76
+ In your view *(app/views/products/index.html.erb)*
77
+
78
+ ```erb
79
+ <%= neat_pages_ajax_items 'products', products: @products %>
80
+ <%= neat_pages_navigation %>
81
+ ```
82
+
83
+ Create the file *app/views/products/index.neatpage.erb* and place the following code in it.
84
+
85
+ ```erb
86
+ <% self.formats = ["html"] %>
87
+ <%= render 'products', products: @products %>
88
+ ```
89
+
90
+
91
+ Locales
92
+ -------
93
+
94
+ If you want to translate the text in the pagination helpers, just add the following keys in i18n.
95
+
96
+ ```yml
97
+ fr:
98
+ neat_pages:
99
+ next_page: Page suivante
100
+ previous_page: Page précédente
101
+ ```
26
102
 
27
103
 
28
104
  Copyright
29
105
  ---------
30
106
 
31
- Copyright (c) 2012 De Marque inc. See LICENSE for further details.
107
+ Copyright (c) 2013 De Marque inc. See LICENSE for further details.
data/Rakefile CHANGED
@@ -8,4 +8,4 @@ RSpec::Core::RakeTask.new(:spec) do |spec|
8
8
  spec.pattern = "spec/**/*_spec.rb"
9
9
  end
10
10
 
11
- task :default => :spec
11
+ task default: :spec
@@ -0,0 +1,138 @@
1
+ class NeatPage
2
+ constructor: () ->
3
+ @initPagination()
4
+
5
+ $(window).hashchange () => @loadPage @getPageFromHash()
6
+
7
+ $('#neat-pages-navigation li.next a').click (e) => @nextPage() ; return false
8
+ $('#neat-pages-navigation li.previous a').click (e) => @previousPage() ; return false
9
+ $('#neat-pages-navigation li.page a').click (e) => @thatPage $(e.target) ; return false
10
+
11
+
12
+
13
+ cachePage: (noPage) ->
14
+ url = @getPage(noPage).attr('href').replace('?', '.neatpage?')
15
+ $.get(url, (data) => @cachePages[noPage] = data)
16
+
17
+
18
+ cacheNextPage: () ->
19
+ noNextPage = @getPageFromHash() + 1
20
+
21
+ @cachePage noNextPage if noNextPage < @totalPages() and not @pageIsCached noNextPage
22
+
23
+
24
+ centerPages: () ->
25
+ current = @currentPageNumber()
26
+ totalPageLink = $('#neat-pages-navigation li.page:visible').length
27
+ halfTotalPageLink = totalPageLink/2
28
+
29
+ start = if current > halfTotalPageLink then current - halfTotalPageLink + 1 else 1
30
+ finish = if current >= @totalPages() - halfTotalPageLink then @totalPages() else (start + totalPageLink - 1)
31
+ start = (finish - totalPageLink + 1) if start - finish < totalPageLink - 1
32
+ start = 1 if start < 1
33
+
34
+ $('#neat-pages-navigation li.page').hide()
35
+ @getPage(page).closest('li').show() for page in [start..finish]
36
+
37
+
38
+ currentPage: () -> $('#neat-pages-navigation li.page.selected a')
39
+
40
+ currentPageNumber: () -> Number(@currentPage().data('page'))
41
+
42
+ getPage: (noPage) -> $('#neat-pages-navigation li.page a[data-page="' + noPage + '"]')
43
+
44
+ getPageFromHash: () ->
45
+ page = 1
46
+
47
+ if location.hash.indexOf('page-') isnt -1
48
+ selection = Number(location.hash.replace('#page-', ''))
49
+ page = selection if selection > 0 and selection <= @totalPages()
50
+
51
+ return page
52
+
53
+
54
+ initPagination: () ->
55
+ @cachePages = []
56
+ @cachePages[@currentPageNumber()] = $('#neat-pages-ajax-wrapper').html()
57
+ @cacheNextPage()
58
+
59
+ # When starting from a page that is not 1. (EX: Press Refresh or Back)
60
+ if @getPageFromHash() != 1
61
+ $('#neat-pages-ajax-wrapper').hide()
62
+ @loadPage @getPageFromHash()
63
+
64
+
65
+
66
+ loadPage: (noPage) ->
67
+ $('#neat-pages-ajax-wrapper').css( opacity: 0.5 )
68
+ @updateNav Number(noPage)
69
+ @updateStatus()
70
+
71
+ if @pageIsCached noPage
72
+ @updatePage @cachePages[noPage], noPage
73
+ else
74
+ url = @getPage(noPage).attr('href').replace('?', '.neatpage?')
75
+ $.get(url, (data) => @updatePage data, noPage)
76
+
77
+
78
+ moveIsDisabled: (direction) -> $('#neat-pages-navigation li.' + direction).hasClass('disabled')
79
+
80
+ nextPage: () -> @updateHash @currentPageNumber() + 1 if not @moveIsDisabled 'next'
81
+
82
+ pageIsCached: (noPage) -> if @cachePages[noPage] then true else false
83
+
84
+ perPage: () -> Number($('#neat-pages-navigation').data('per-page'))
85
+
86
+ previousPage: () -> @updateHash @currentPageNumber() - 1 if not @moveIsDisabled 'previous'
87
+
88
+ thatPage: (link) -> @updateHash link.data('page') if not link.closest('li').hasClass('selected')
89
+
90
+ totalItems: () -> Number($('#neat-pages-navigation').data('total-items'))
91
+
92
+ totalPages: () -> Number($('#neat-pages-navigation').data('total-pages'))
93
+
94
+ updateHash: (noPage) -> location.href = '#page-' + noPage
95
+
96
+ updateNav: (noPage) ->
97
+ $('#neat-pages-navigation li.page').removeClass('selected')
98
+ @getPage(noPage).closest('li').addClass('selected')
99
+ $('#neat-pages-navigation li.move').removeClass('disabled')
100
+
101
+ if noPage <= 1
102
+ $('#neat-pages-navigation li.previous').addClass('disabled')
103
+ $('#neat-pages-navigation li.previous a').attr('href', '#')
104
+ else
105
+ $('#neat-pages-navigation li.previous a').attr('href', @getPage(noPage-1).attr('href'))
106
+
107
+ if noPage >= @totalPages()
108
+ $('#neat-pages-navigation li.next').addClass('disabled')
109
+ $('#neat-pages-navigation li.next a').attr('href', '#')
110
+ else
111
+ $('#neat-pages-navigation li.next a').attr('href', @getPage(noPage+1).attr('href'))
112
+
113
+ @centerPages()
114
+
115
+
116
+ updatePage: (data, noPage) ->
117
+ @cachePages[noPage] = data if not @pageIsCached noPage
118
+
119
+ $('#neat-pages-ajax-wrapper').hide()
120
+ $('#neat-pages-ajax-wrapper').css( opacity: 1 )
121
+ $('#neat-pages-ajax-wrapper').html(data)
122
+ $('#neat-pages-ajax-wrapper').fadeIn(300)
123
+
124
+ $('#neat-pages-navigation').trigger 'change'
125
+
126
+ @cacheNextPage()
127
+
128
+
129
+ updateStatus: () ->
130
+ from = ((@currentPageNumber()-1) * @perPage()) + 1
131
+ to = from + @perPage() - 1
132
+ to = @totalItems if to > @totalItems()
133
+
134
+ $('#neat-pages-status').find('span.from').html(from)
135
+ $('#neat-pages-status').find('span.to').html(to)
136
+
137
+
138
+ $ -> new NeatPage if $('#neat-pages-navigation').length > 0
@@ -0,0 +1,3 @@
1
+ //= require jquery.hashchange.min
2
+ //= require ./base
3
+
@@ -0,0 +1,24 @@
1
+ /****************************************************************************
2
+ * STANDARD
3
+ ****************************************************************************/
4
+ ul#neat-pages-navigation{border-top:1px solid #ddd;clear:both;padding-top:30px;text-align:center;width:100%;
5
+ li{background:none;border:0;display:inline-block;font-size:12px;margin:0px 2px 0px 0px;
6
+ a{background:#fff;border:solid 1px #eee;color:#555;font-size:12px;font-weight:normal;margin-right:2px;padding:5px 9px;text-decoration:none;}
7
+ a:hover{border:solid 1px #ccc;color:#000;}
8
+ }
9
+ li.page.selected a{background:#ccc;border:1px solid #777;color:#222;font-weight:normal;padding:5px 9px;}
10
+ li.move.disabled a{background-color:#eee;border:solid 1px #DEDEDE;color:#aaa;cursor:default;}
11
+ }
12
+
13
+ /****************************************************************************
14
+ * LIGHT
15
+ ****************************************************************************/
16
+ ul#neat-pages-navigation.light{
17
+ li.page{display:none;float:left;height:1px;position:absolute;visibility:hidden;width:1px;}
18
+ li.move{display:block;}
19
+ li.move.disabled{display:none;}
20
+ li.move.previous{float:left;margin-left:5%;}
21
+ li.move.next{float:right;margin-right:5%;}
22
+ }
23
+
24
+
@@ -0,0 +1,3 @@
1
+ /*
2
+ *= require ./base
3
+ */
@@ -0,0 +1,4 @@
1
+ en:
2
+ neat_pages:
3
+ next_page: Next
4
+ previous_page: Previous
@@ -0,0 +1,4 @@
1
+ fr:
2
+ neat_pages:
3
+ next_page: Suivante
4
+ previous_page: Précédente
@@ -2,7 +2,8 @@ module NeatPages
2
2
 
3
3
  end
4
4
 
5
+ require "neat_pages/engine"
5
6
  require 'neat_pages/base'
6
- require 'neat_pages/helpers'
7
7
  require 'neat_pages/errors'
8
8
  require 'neat_pages/implants'
9
+
@@ -11,7 +11,7 @@ module NeatPages
11
11
  # CONSTRUCTOR
12
12
  #*************************************************************************************
13
13
  def initialize(current_page, options={})
14
- options = { :per_page => 10, :total_items => 0 }.merge(options)
14
+ options = { per_page: 10, total_items: 0 }.merge(options)
15
15
 
16
16
  @per_page = options[:per_page].to_i
17
17
  @total_items = options[:total_items]
@@ -25,24 +25,10 @@ module NeatPages
25
25
  #*************************************************************************************
26
26
  # PUBLIC INSTANCE METHODS
27
27
  #*************************************************************************************
28
- def activate_helpers(base_url='', params={})
29
- @helpers = NeatPages::Helpers.new(self, base_url, params)
30
- end
31
-
32
28
  def empty?
33
29
  @total_items == 0
34
30
  end
35
31
 
36
- def helpers
37
- if @helpers
38
- @helpers
39
- else
40
- raise 'You must activate the helpers by calling "activate_helpers".'
41
- end
42
- end
43
-
44
- alias_method :h, :helpers
45
-
46
32
  def limit
47
33
  @per_page
48
34
  end
@@ -0,0 +1,5 @@
1
+ module NeatPages
2
+ class Engine < Rails::Engine
3
+ #auto wire
4
+ end
5
+ end
@@ -1,75 +1,27 @@
1
- # encoding : utf-8
2
- module NeatPages
3
- #*************************************************************************************
4
- # TOCOMMENT
5
- #*************************************************************************************
6
- class Helpers
7
- #*************************************************************************************
8
- # CONSTRUCTOR
9
- #*************************************************************************************
10
- def initialize(pagination, base_url, params)
11
- @pagination = pagination
12
- @base_url = base_url
13
- @params = params
14
- end
15
-
16
-
17
- #*************************************************************************************
18
- # PUBLIC INSTANCE METHODS
19
- #*************************************************************************************
20
- def navigation
21
- if paginated?
22
- content = ''
23
- content << navigation_link('previous') if previous?
24
- content << navigation_link('next') if next?
25
-
26
- return "<div class=\"pagination\">#{content.html_safe}</div>".html_safe
27
- else
28
- return ''
29
- end
30
- end
31
-
32
- def status
33
- return '' if empty? or out_of_bound?
34
-
35
- from = offset
36
- to = from + per_page
37
- to = total_items if to > total_items
38
-
39
- return "#{from+1} #{t('to')} #{to}/#{total_items}"
40
- end
41
-
42
- private
43
-
44
- #*************************************************************************************
45
- # PRIVATE INSTANCE METHODS
46
- #*************************************************************************************
47
- def navigation_link(direction)
48
- label_str = direction == 'next' ? "#{t('page_next')} »" : "« #{t('page_previous')}"
49
-
50
- link_url = path_to(send("#{direction}_page"))
51
-
52
- return "<a href=\"#{link_url}\" class=\"#{direction}\">#{label_str}</a>".html_safe
53
- end
54
-
55
- def path_to(page)
56
- qs = ["page=#{page}"]
1
+ module NeatPages::Helpers
2
+ def neat_pages_ajax_items(partial_path, options={})
3
+ ('<div id="neat-pages-ajax-wrapper" class="first-load">' + render(partial_path, options) + '</div>').html_safe
4
+ end
57
5
 
58
- @params.each { |k,v| qs << "#{k}=#{v}" if k != 'page' }
6
+ def neat_pages_base_url
7
+ request.protocol + request.host + request.path_info
8
+ end
59
9
 
60
- return @base_url + '?' + qs.join("&")
61
- end
10
+ def neat_pages_base_params
11
+ request.env['action_dispatch.request.query_parameters']
12
+ end
62
13
 
63
- def t(text_path)
64
- (defined? I18n) ? I18n.t("neat_pages.#{text_path}") : text_path
65
- end
14
+ def neat_pages_navigation(options={})
15
+ NeatPages::Helpers::Navigation.new(pagination, neat_pages_base_url, neat_pages_base_params).generate(options)
16
+ end
66
17
 
67
- def method_missing(*args, &block)
68
- if @pagination.respond_to? args.first
69
- return @pagination.send *args, &block
70
- else
71
- raise NoMethodError.new("undefined local variable or method '#{args.first}' for #{self.class}")
72
- end
73
- end
18
+ def neat_pages_status
19
+ NeatPages::Helpers::Status.new(pagination, neat_pages_base_url, neat_pages_base_params).generate
74
20
  end
21
+
22
+ ::ActionView::Base.send :include, self
75
23
  end
24
+
25
+ require 'neat_pages/helpers/builder'
26
+ require 'neat_pages/helpers/navigation'
27
+ require 'neat_pages/helpers/status'
@@ -0,0 +1,47 @@
1
+ class NeatPages::Helpers::Builder
2
+ def initialize(pagination, base_url, params)
3
+ @pagination = pagination
4
+ @base_url = base_url
5
+ @params = params
6
+
7
+ reset_builder
8
+ end
9
+
10
+ def b(str='')
11
+ @builder << str
12
+
13
+ return @builder.html_safe
14
+ end
15
+
16
+ def li(content, css_class='', hidden=false)
17
+ attributes = 'class="' + css_class + '" '
18
+ attributes << 'style="display:none"' if hidden
19
+
20
+ return "<li #{attributes}>#{content}</li>"
21
+ end
22
+
23
+ def path_to(page)
24
+ qs = ["page=#{page}"]
25
+
26
+ @params.each { |k,v| qs << "#{k}=#{v}" if k != 'page' }
27
+
28
+ return @base_url + '?' + qs.join("&")
29
+ end
30
+
31
+ def reset_builder
32
+ @builder = ''
33
+ end
34
+
35
+ def t(text_path)
36
+ (defined? I18n) ? I18n.t("neat_pages.#{text_path}") : text_path
37
+ end
38
+
39
+ def method_missing(*args, &block)
40
+ if @pagination.respond_to? args.first
41
+ return @pagination.send *args, &block
42
+ else
43
+ raise NoMethodError.new("undefined local variable or method '#{args.first}' for #{self.class}")
44
+ end
45
+ end
46
+
47
+ end
@@ -0,0 +1,88 @@
1
+ class NeatPages::Helpers::Navigation < NeatPages::Helpers::Builder
2
+ def generate(options={})
3
+ options = { format: :standard }.merge(options)
4
+
5
+ return '' if not paginated?
6
+
7
+ reset_builder
8
+
9
+ return case options[:format]
10
+ when :light then navigation_light
11
+ else navigation_standard
12
+ end
13
+ end
14
+
15
+ private
16
+
17
+ def link_to(label, no_page, options={})
18
+ options = { class: '' }.merge(options)
19
+
20
+ url = (no_page == '#' ? '#' : path_to(no_page))
21
+
22
+ return "<a href=\"#{url}\" data-page=\"#{no_page}\" class=\"#{options[:class]}\">#{label}</a>"
23
+ end
24
+
25
+ def link_to_page(no_page)
26
+ link_to no_page, no_page
27
+ end
28
+
29
+ def navigation_attributes
30
+ {
31
+ "id" => "neat-pages-navigation",
32
+ "data-neat-pages-control=" => "navigation",
33
+ "data-per-page" => per_page,
34
+ "data-total-items" => total_items,
35
+ "data-total-pages" => total_pages
36
+ }.map{ |k,v| "#{k}=\"#{v}\"" }.join(' ')
37
+ end
38
+
39
+ def navigation_label(direction)
40
+ (direction == 'next' ? "#{t('next_page')} &raquo;" : "&laquo; #{t('previous_page')}").html_safe
41
+ end
42
+
43
+ def navigation_list_link(direction, enabled)
44
+ list_class = enabled ? '' : 'disabled'
45
+ content = enabled ? navigation_link(direction) : link_to(navigation_label(direction), '#', class: direction)
46
+
47
+ b li(content, "move #{direction} #{list_class}")
48
+ end
49
+
50
+ def navigation_light
51
+ b '<ul class="light" ' + navigation_attributes + '>'
52
+ navigation_list_link 'previous', previous?
53
+ navigation_page_items(10)
54
+ navigation_list_link 'next', next?
55
+ b '</ul>'
56
+
57
+ return b
58
+ end
59
+
60
+ def navigation_link(direction)
61
+ link_to(navigation_label(direction), send("#{direction}_page"), class: direction)
62
+ end
63
+
64
+ def navigation_page_items(nbr_items=10)
65
+ half_nbr_items = nbr_items / 2
66
+
67
+ start = current_page > half_nbr_items ? (current_page - half_nbr_items + 1) : 1
68
+ finish = current_page >= total_pages - half_nbr_items ? total_pages : (start + nbr_items - 1)
69
+ start = (finish - nbr_items + 1) if start - finish < nbr_items
70
+ start = 1 if start < 1
71
+
72
+ (1..total_pages).each do |i|
73
+ hidden = (i < start or i > finish)
74
+ b (current_page == i ? li(link_to_page(i), 'page selected') : li(link_to_page(i), 'page', hidden))
75
+ end
76
+ end
77
+
78
+ def navigation_standard
79
+ b '<ul class="standard" ' + navigation_attributes + '>'
80
+ navigation_list_link 'previous', previous?
81
+ navigation_page_items(10)
82
+ navigation_list_link 'next', next?
83
+ b '</ul>'
84
+
85
+ return b
86
+ end
87
+
88
+ end
@@ -0,0 +1,30 @@
1
+ class NeatPages::Helpers::Status < NeatPages::Helpers::Builder
2
+ def generate
3
+ return '' if empty? or out_of_bound?
4
+
5
+ from, to = get_from_to_data
6
+
7
+ return build_status from, to
8
+ end
9
+
10
+ def build_status(from, to)
11
+ reset_builder
12
+
13
+ b '<span data-neat-pages-control="status" id="neat-pages-status">'
14
+ b "<span class=\"from\">#{from+1}</span>"
15
+ b " #{t('to')} "
16
+ b "<span class=\"to\">#{to}</span>/"
17
+ b "<span class=\"total\">#{total_items}</span>"
18
+ b '</span>'
19
+
20
+ return b
21
+ end
22
+
23
+ def get_from_to_data
24
+ from = offset
25
+ to = from + per_page
26
+ to = total_items if to > total_items
27
+
28
+ return [from, to]
29
+ end
30
+ end
@@ -3,31 +3,24 @@ module NeatPages::Implants::ActionControllerImplant
3
3
 
4
4
  included do
5
5
  append_after_filter :set_pagination_header
6
- helper_method :pagination, :pagination_helpers
7
- rescue_from NeatPages::OutOfBound, :with => :render_out_of_bound
8
- end
9
6
 
10
- def paginate(options={})
11
- options.reverse_merge!(:per_page => 20)
7
+ helper_method :pagination
12
8
 
13
- base_current_url = request.protocol + request.host + request.path_info
9
+ rescue_from NeatPages::OutOfBound, with: :render_out_of_bound
10
+ end
14
11
 
15
- neat_pages = NeatPages::Base.new(params[:page], options)
16
- neat_pages.activate_helpers(base_current_url, request.env['action_dispatch.request.query_parameters'])
12
+ def paginate(options={})
13
+ options.reverse_merge! per_page: 20
17
14
 
18
- @_env['neat_pages'] = neat_pages
15
+ @_env['neat_pages'] = NeatPages::Base.new(params[:page], options)
19
16
  end
20
17
 
21
18
  def pagination
22
19
  @_env['neat_pages']
23
20
  end
24
21
 
25
- def pagination_helpers
26
- pagination.helpers
27
- end
28
-
29
22
  def render_out_of_bound
30
- render :text => "out_of_bound", :status => 404
23
+ render text: "out_of_bound", status: 404
31
24
  end
32
25
 
33
26
  def set_pagination_header
@@ -2,12 +2,21 @@ require 'neat_pages/implants/action_controller_implant'
2
2
 
3
3
  module NeatPages::Implants
4
4
  class Railtie < Rails::Railtie
5
- initializer "neat_pages" do |app|
6
-
5
+ initializer "neat-pages" do |app|
7
6
  ActiveSupport.on_load :action_controller do
8
7
  include NeatPages::Implants::ActionControllerImplant
9
8
  end
10
9
 
10
+ ActiveSupport.on_load :action_view do
11
+ require 'neat_pages/helpers'
12
+ end
13
+
14
+ Mime::Type.register "text/html", :neatpage if not Mime::Type.lookup_by_extension :neatpage
11
15
  end
12
16
  end
13
17
  end
18
+
19
+ dir = File.expand_path(File.dirname(__FILE__))
20
+
21
+ I18n.load_path << File.join(dir, '../../../config/locales', 'fr.yml')
22
+
@@ -6,7 +6,7 @@ describe NeatPages::Base do
6
6
  #*************************************************************************************
7
7
  describe "#empty?" do
8
8
  context "with a 20 items pagination" do
9
- specify { NeatPages::Base.new(0, :total_items => 20).should_not be_empty }
9
+ specify { NeatPages::Base.new(0, total_items: 20).should_not be_empty }
10
10
  end
11
11
 
12
12
  context "with a 0 item pagination" do
@@ -16,109 +16,109 @@ describe NeatPages::Base do
16
16
 
17
17
  describe "#next_page" do
18
18
  context "with a 100 items pagination starting at 0 and having 10 items per page" do
19
- specify { NeatPages::Base.new(0, :per_page => 10, :total_items => 100).next_page.should eql 2 }
19
+ specify { NeatPages::Base.new(0, per_page: 10, total_items: 100).next_page.should eql 2 }
20
20
  end
21
21
 
22
22
  context "with a 100 items pagination starting at page 3 and having 15 items per page" do
23
- specify { NeatPages::Base.new(3, :per_page => 15, :total_items => 100).next_page.should eql 4 }
23
+ specify { NeatPages::Base.new(3, per_page: 15, total_items: 100).next_page.should eql 4 }
24
24
  end
25
25
 
26
26
  context "with a 5 items pagination starting at 0 and having 10 items per page" do
27
- specify { NeatPages::Base.new(0, :per_page => 10, :total_items => 5).next_page.should eql 1 }
27
+ specify { NeatPages::Base.new(0, per_page: 10, total_items: 5).next_page.should eql 1 }
28
28
  end
29
29
  end
30
30
 
31
31
  describe "#next?" do
32
32
  context "with a 100 items pagination starting at 0 and having 10 items per page" do
33
- specify { NeatPages::Base.new(0, :per_page => 10, :total_items => 100).should be_next }
33
+ specify { NeatPages::Base.new(0, per_page: 10, total_items: 100).should be_next }
34
34
  end
35
35
 
36
36
  context "with a 5 items pagination starting at 0 and having 10 items per page" do
37
- specify { NeatPages::Base.new(0, :per_page => 10, :total_items => 5).should_not be_next }
37
+ specify { NeatPages::Base.new(0, per_page: 10, total_items: 5).should_not be_next }
38
38
  end
39
39
  end
40
40
 
41
41
  describe "#offset" do
42
42
  context "with a 100 items pagination starting at page 1 and having 10 items per page" do
43
- specify { NeatPages::Base.new(1, :per_page => 10, :total_items => 100).offset.should eql 0 }
43
+ specify { NeatPages::Base.new(1, per_page: 10, total_items: 100).offset.should eql 0 }
44
44
  end
45
45
 
46
46
  context "with a 100 items pagination starting at page 4 and having 15 items per page" do
47
- specify { NeatPages::Base.new(4, :per_page => 15, :total_items => 100).offset.should eql 45 }
47
+ specify { NeatPages::Base.new(4, per_page: 15, total_items: 100).offset.should eql 45 }
48
48
  end
49
49
 
50
50
  context "with a 100 items pagination starting at page 999 and having 15 items per page" do
51
- specify { NeatPages::Base.new(999, :per_page => 15, :total_items => 100).offset.should eql 101 }
51
+ specify { NeatPages::Base.new(999, per_page: 15, total_items: 100).offset.should eql 101 }
52
52
  end
53
53
  end
54
54
 
55
55
  describe "#out_of_bound?" do
56
56
  context "with a 100 items pagination starting at page 1 and having 10 items per page" do
57
- specify { NeatPages::Base.new(1, :per_page => 10, :total_items => 100).should_not be_out_of_bound }
57
+ specify { NeatPages::Base.new(1, per_page: 10, total_items: 100).should_not be_out_of_bound }
58
58
  end
59
59
 
60
60
  context "with a 100 items pagination starting at page 11 and having 10 items per page" do
61
- specify { NeatPages::Base.new(11, :per_page => 10, :total_items => 100).should be_out_of_bound }
61
+ specify { NeatPages::Base.new(11, per_page: 10, total_items: 100).should be_out_of_bound }
62
62
  end
63
63
  end
64
64
 
65
65
  describe "#previous_page" do
66
66
  context "with a 100 items pagination starting at page 5 and having 10 items per page" do
67
- specify { NeatPages::Base.new(5, :per_page => 10, :total_items => 100).previous_page.should eql 4 }
67
+ specify { NeatPages::Base.new(5, per_page: 10, total_items: 100).previous_page.should eql 4 }
68
68
  end
69
69
 
70
70
  context "with a 100 items pagination starting at page 3 and having 15 items per page" do
71
- specify { NeatPages::Base.new(3, :per_page => 15, :total_items => 100).previous_page.should eql 2 }
71
+ specify { NeatPages::Base.new(3, per_page: 15, total_items: 100).previous_page.should eql 2 }
72
72
  end
73
73
 
74
74
  context "with a 50 items pagination starting at 0 and having 10 items per page" do
75
- specify { NeatPages::Base.new(0, :per_page => 10, :total_items => 50).previous_page.should eql 1 }
75
+ specify { NeatPages::Base.new(0, per_page: 10, total_items: 50).previous_page.should eql 1 }
76
76
  end
77
77
  end
78
78
 
79
79
  describe "#previous" do
80
80
  context "with a 100 items pagination starting at page 5 and having 10 items per page" do
81
- specify { NeatPages::Base.new(5, :per_page => 10, :total_items => 100).should be_previous }
81
+ specify { NeatPages::Base.new(5, per_page: 10, total_items: 100).should be_previous }
82
82
  end
83
83
 
84
84
  context "with a 50 items pagination starting at 0 and having 10 items per page" do
85
- specify { NeatPages::Base.new(0, :per_page => 10, :total_items => 50).should_not be_previous }
85
+ specify { NeatPages::Base.new(0, per_page: 10, total_items: 50).should_not be_previous }
86
86
  end
87
87
  end
88
88
 
89
89
  describe "#previous?" do
90
90
  context "with a 100 items pagination starting at 0 and having 10 items per page" do
91
- specify { NeatPages::Base.new(0, :per_page => 10, :total_items => 100).should_not be_previous }
91
+ specify { NeatPages::Base.new(0, per_page: 10, total_items: 100).should_not be_previous }
92
92
  end
93
93
 
94
94
  context "with a 100 items pagination starting at page 2 and having 10 items per page" do
95
- specify { NeatPages::Base.new(2, :per_page => 10, :total_items => 100).should be_previous }
95
+ specify { NeatPages::Base.new(2, per_page: 10, total_items: 100).should be_previous }
96
96
  end
97
97
 
98
98
  context "with a 5 items pagination starting at 0 and having 10 items per page" do
99
- specify { NeatPages::Base.new(0, :per_page => 10, :total_items => 5).should_not be_previous }
99
+ specify { NeatPages::Base.new(0, per_page: 10, total_items: 5).should_not be_previous }
100
100
  end
101
101
  end
102
102
 
103
103
  describe "#response_headers" do
104
104
  context "with a 200 items pagination starting at page 1 and having 10 items per page" do
105
- subject { NeatPages::Base.new(1, :per_page => 10, :total_items => 200).response_headers }
105
+ subject { NeatPages::Base.new(1, per_page: 10, total_items: 200).response_headers }
106
106
 
107
107
  its(:length) { should eql 4 }
108
108
  its(['X-Total-Items']) { should eql '200' }
109
109
  its(['X-Total-Pages']) { should eql '20' }
110
- its(['X-Per-Page']) { should eql '10' }
110
+ its(['X-Per-Page']) { should eql '10' }#
111
111
  its(['X-Current-Page']) { should eql '1' }
112
112
  end
113
113
  end
114
114
 
115
115
  describe "#total_pages" do
116
116
  context "with a 100 items pagination and having 10 items per page" do
117
- specify { NeatPages::Base.new(0, :per_page => 10, :total_items => 100).total_pages.should eql 10 }
117
+ specify { NeatPages::Base.new(0, per_page: 10, total_items: 100).total_pages.should eql 10 }
118
118
  end
119
119
 
120
120
  context "with a 0 items pagination and having 10 items per page" do
121
- specify { NeatPages::Base.new(0, :per_page => 10).total_pages.should eql 1 }
121
+ specify { NeatPages::Base.new(0, per_page: 10).total_pages.should eql 1 }
122
122
  end
123
123
  end
124
124
  end
@@ -2,6 +2,7 @@ require "rubygems"
2
2
  require "bundler/setup"
3
3
 
4
4
  require 'rspec'
5
+ require 'rails'
5
6
 
6
7
  require File.expand_path('../../lib/neat-pages', __FILE__)
7
8
 
@@ -0,0 +1,9 @@
1
+ /*
2
+ * jQuery hashchange event - v1.3 - 7/21/2010
3
+ * http://benalman.com/projects/jquery-hashchange-plugin/
4
+ *
5
+ * Copyright (c) 2010 "Cowboy" Ben Alman
6
+ * Dual licensed under the MIT and GPL licenses.
7
+ * http://benalman.com/about/license/
8
+ */
9
+ (function($,e,b){var c="hashchange",h=document,f,g=$.event.special,i=h.documentMode,d="on"+c in e&&(i===b||i>7);function a(j){j=j||location.href;return"#"+j.replace(/^[^#]*#?(.*)$/,"$1")}$.fn[c]=function(j){return j?this.bind(c,j):this.trigger(c)};$.fn[c].delay=50;g[c]=$.extend(g[c],{setup:function(){if(d){return false}$(f.start)},teardown:function(){if(d){return false}$(f.stop)}});f=(function(){var j={},p,m=a(),k=function(q){return q},l=k,o=k;j.start=function(){p||n()};j.stop=function(){p&&clearTimeout(p);p=b};function n(){var r=a(),q=o(m);if(r!==m){l(m=r,q);$(e).trigger(c)}else{if(q!==m){location.href=location.href.replace(/#.*/,"")+q}}p=setTimeout(n,$.fn[c].delay)}$.browser.msie&&!d&&(function(){var q,r;j.start=function(){if(!q){r=$.fn[c].src;r=r&&r+a();q=$('<iframe tabindex="-1" title="empty"/>').hide().one("load",function(){r||l(a());n()}).attr("src",r||"javascript:0").insertAfter("body")[0].contentWindow;h.onpropertychange=function(){try{if(event.propertyName==="title"){q.document.title=h.title}}catch(s){}}}};j.stop=k;o=function(){return a(q.location.href)};l=function(v,s){var u=q.document,t=$.fn[c].domain;if(v!==s){u.title=h.title;u.open();t&&u.write('<script>document.domain="'+t+'"<\/script>');u.close();q.location.hash=v}}})();return j})()})(jQuery,this);
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: neat-pages
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.2
4
+ version: 0.1.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,30 +9,41 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-05-16 00:00:00.000000000 Z
12
+ date: 2013-02-25 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
- name: rake
16
- requirement: &2151882000 !ruby/object:Gem::Requirement
17
- none: false
15
+ requirement: &2159931860 !ruby/object:Gem::Requirement
18
16
  requirements:
19
17
  - - ! '>='
20
18
  - !ruby/object:Gem::Version
21
19
  version: 0.8.7
22
- type: :development
20
+ none: false
23
21
  prerelease: false
24
- version_requirements: *2151882000
22
+ type: :development
23
+ name: rake
24
+ version_requirements: *2159931860
25
25
  - !ruby/object:Gem::Dependency
26
- name: rspec
27
- requirement: &2151880820 !ruby/object:Gem::Requirement
28
- none: false
26
+ requirement: &2159930740 !ruby/object:Gem::Requirement
29
27
  requirements:
30
28
  - - ! '>='
31
29
  - !ruby/object:Gem::Version
32
30
  version: '2.0'
31
+ none: false
32
+ prerelease: false
33
33
  type: :development
34
+ name: rspec
35
+ version_requirements: *2159930740
36
+ - !ruby/object:Gem::Dependency
37
+ requirement: &2159929800 !ruby/object:Gem::Requirement
38
+ requirements:
39
+ - - ! '>='
40
+ - !ruby/object:Gem::Version
41
+ version: '3.0'
42
+ none: false
34
43
  prerelease: false
35
- version_requirements: *2151880820
44
+ type: :development
45
+ name: rails
46
+ version_requirements: *2159929800
36
47
  description: ''
37
48
  email:
38
49
  - sebastien@demarque.com
@@ -42,9 +53,19 @@ extra_rdoc_files:
42
53
  - LICENSE
43
54
  - README.md
44
55
  files:
56
+ - app/assets/javascripts/neat_pages/base.coffee
57
+ - app/assets/javascripts/neat_pages/index.js
58
+ - app/assets/stylesheets/neat_pages/base.css.scss
59
+ - app/assets/stylesheets/neat_pages/index.css
60
+ - config/locales/en.yml
61
+ - config/locales/fr.yml
45
62
  - lib/neat-pages.rb
46
63
  - lib/neat_pages/base.rb
64
+ - lib/neat_pages/engine.rb
47
65
  - lib/neat_pages/errors.rb
66
+ - lib/neat_pages/helpers/builder.rb
67
+ - lib/neat_pages/helpers/navigation.rb
68
+ - lib/neat_pages/helpers/status.rb
48
69
  - lib/neat_pages/helpers.rb
49
70
  - lib/neat_pages/implants/action_controller_implant.rb
50
71
  - lib/neat_pages/implants/mongoid_implant.rb
@@ -52,8 +73,8 @@ files:
52
73
  - lib/neat_pages/implants.rb
53
74
  - spec/neat-pages_spec.rb
54
75
  - spec/neat_pages/base_spec.rb
55
- - spec/neat_pages/helpers_spec.rb
56
76
  - spec/spec_helper.rb
77
+ - vendor/assets/javascripts/jquery.hashchange.min.js
57
78
  - LICENSE
58
79
  - README.md
59
80
  - Rakefile
@@ -66,21 +87,22 @@ rdoc_options: []
66
87
  require_paths:
67
88
  - lib
68
89
  required_ruby_version: !ruby/object:Gem::Requirement
69
- none: false
70
90
  requirements:
71
91
  - - ! '>='
72
92
  - !ruby/object:Gem::Version
73
93
  version: '0'
74
- required_rubygems_version: !ruby/object:Gem::Requirement
75
94
  none: false
95
+ required_rubygems_version: !ruby/object:Gem::Requirement
76
96
  requirements:
77
97
  - - ! '>='
78
98
  - !ruby/object:Gem::Version
79
99
  version: '0'
100
+ none: false
80
101
  requirements: []
81
102
  rubyforge_project: neat-pages
82
- rubygems_version: 1.8.17
103
+ rubygems_version: 1.8.10
83
104
  signing_key:
84
105
  specification_version: 3
85
106
  summary: ''
86
107
  test_files: []
108
+ has_rdoc:
@@ -1,29 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe NeatPages::Helpers do
4
- describe "#status" do
5
- context "with a 100 items pagination starting at 0 and having 10 items per page" do
6
- let(:neat_pages) { NeatPages::Base.new(0, :per_page => 10, :total_items => 100) }
7
-
8
- before { neat_pages.activate_helpers }
9
-
10
- specify { neat_pages.helpers.status.should eql "1 to 10/100" }
11
- end
12
-
13
- context "with a 23 items pagination starting at page 3 and having 10 items per page" do
14
- let(:neat_pages) { NeatPages::Base.new(3, :per_page => 10, :total_items => 23) }
15
-
16
- before { neat_pages.activate_helpers }
17
-
18
- specify { neat_pages.helpers.status.should eql "21 to 23/23" }
19
- end
20
-
21
- context "with a 0 items pagination starting at 0 and having 10 items per page" do
22
- let(:neat_pages) { NeatPages::Base.new(0, :per_page => 10, :total_items => 0) }
23
-
24
- before { neat_pages.activate_helpers }
25
-
26
- specify { neat_pages.helpers.status.should be_empty }
27
- end
28
- end
29
- end