Mercurial > hg > soundsoftware-site
comparison vendor/plugins/classic_pagination/lib/pagination_helper.rb @ 0:513646585e45
* Import Redmine trunk SVN rev 3859
author | Chris Cannam |
---|---|
date | Fri, 23 Jul 2010 15:52:44 +0100 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
-1:000000000000 | 0:513646585e45 |
---|---|
1 module ActionView | |
2 module Helpers | |
3 # Provides methods for linking to ActionController::Pagination objects using a simple generator API. You can optionally | |
4 # also build your links manually using ActionView::Helpers::AssetHelper#link_to like so: | |
5 # | |
6 # <%= link_to "Previous page", { :page => paginator.current.previous } if paginator.current.previous %> | |
7 # <%= link_to "Next page", { :page => paginator.current.next } if paginator.current.next %> | |
8 module PaginationHelper | |
9 unless const_defined?(:DEFAULT_OPTIONS) | |
10 DEFAULT_OPTIONS = { | |
11 :name => :page, | |
12 :window_size => 2, | |
13 :always_show_anchors => true, | |
14 :link_to_current_page => false, | |
15 :params => {} | |
16 } | |
17 end | |
18 | |
19 # Creates a basic HTML link bar for the given +paginator+. Links will be created | |
20 # for the next and/or previous page and for a number of other pages around the current | |
21 # pages position. The +html_options+ hash is passed to +link_to+ when the links are created. | |
22 # | |
23 # ==== Options | |
24 # <tt>:name</tt>:: the routing name for this paginator | |
25 # (defaults to +page+) | |
26 # <tt>:prefix</tt>:: prefix for pagination links | |
27 # (i.e. Older Pages: 1 2 3 4) | |
28 # <tt>:suffix</tt>:: suffix for pagination links | |
29 # (i.e. 1 2 3 4 <- Older Pages) | |
30 # <tt>:window_size</tt>:: the number of pages to show around | |
31 # the current page (defaults to <tt>2</tt>) | |
32 # <tt>:always_show_anchors</tt>:: whether or not the first and last | |
33 # pages should always be shown | |
34 # (defaults to +true+) | |
35 # <tt>:link_to_current_page</tt>:: whether or not the current page | |
36 # should be linked to (defaults to | |
37 # +false+) | |
38 # <tt>:params</tt>:: any additional routing parameters | |
39 # for page URLs | |
40 # | |
41 # ==== Examples | |
42 # # We'll assume we have a paginator setup in @person_pages... | |
43 # | |
44 # pagination_links(@person_pages) | |
45 # # => 1 <a href="/?page=2/">2</a> <a href="/?page=3/">3</a> ... <a href="/?page=10/">10</a> | |
46 # | |
47 # pagination_links(@person_pages, :link_to_current_page => true) | |
48 # # => <a href="/?page=1/">1</a> <a href="/?page=2/">2</a> <a href="/?page=3/">3</a> ... <a href="/?page=10/">10</a> | |
49 # | |
50 # pagination_links(@person_pages, :always_show_anchors => false) | |
51 # # => 1 <a href="/?page=2/">2</a> <a href="/?page=3/">3</a> | |
52 # | |
53 # pagination_links(@person_pages, :window_size => 1) | |
54 # # => 1 <a href="/?page=2/">2</a> ... <a href="/?page=10/">10</a> | |
55 # | |
56 # pagination_links(@person_pages, :params => { :viewer => "flash" }) | |
57 # # => 1 <a href="/?page=2&viewer=flash/">2</a> <a href="/?page=3&viewer=flash/">3</a> ... | |
58 # # <a href="/?page=10&viewer=flash/">10</a> | |
59 def pagination_links(paginator, options={}, html_options={}) | |
60 name = options[:name] || DEFAULT_OPTIONS[:name] | |
61 params = (options[:params] || DEFAULT_OPTIONS[:params]).clone | |
62 | |
63 prefix = options[:prefix] || '' | |
64 suffix = options[:suffix] || '' | |
65 | |
66 pagination_links_each(paginator, options, prefix, suffix) do |n| | |
67 params[name] = n | |
68 link_to(n.to_s, params, html_options) | |
69 end | |
70 end | |
71 | |
72 # Iterate through the pages of a given +paginator+, invoking a | |
73 # block for each page number that needs to be rendered as a link. | |
74 # | |
75 # ==== Options | |
76 # <tt>:window_size</tt>:: the number of pages to show around | |
77 # the current page (defaults to +2+) | |
78 # <tt>:always_show_anchors</tt>:: whether or not the first and last | |
79 # pages should always be shown | |
80 # (defaults to +true+) | |
81 # <tt>:link_to_current_page</tt>:: whether or not the current page | |
82 # should be linked to (defaults to | |
83 # +false+) | |
84 # | |
85 # ==== Example | |
86 # # Turn paginated links into an Ajax call | |
87 # pagination_links_each(paginator, page_options) do |link| | |
88 # options = { :url => {:action => 'list'}, :update => 'results' } | |
89 # html_options = { :href => url_for(:action => 'list') } | |
90 # | |
91 # link_to_remote(link.to_s, options, html_options) | |
92 # end | |
93 def pagination_links_each(paginator, options, prefix = nil, suffix = nil) | |
94 options = DEFAULT_OPTIONS.merge(options) | |
95 link_to_current_page = options[:link_to_current_page] | |
96 always_show_anchors = options[:always_show_anchors] | |
97 | |
98 current_page = paginator.current_page | |
99 window_pages = current_page.window(options[:window_size]).pages | |
100 return if window_pages.length <= 1 unless link_to_current_page | |
101 | |
102 first, last = paginator.first, paginator.last | |
103 | |
104 html = '' | |
105 | |
106 html << prefix if prefix | |
107 | |
108 if always_show_anchors and not (wp_first = window_pages[0]).first? | |
109 html << yield(first.number) | |
110 html << ' ... ' if wp_first.number - first.number > 1 | |
111 html << ' ' | |
112 end | |
113 | |
114 window_pages.each do |page| | |
115 if current_page == page && !link_to_current_page | |
116 html << page.number.to_s | |
117 else | |
118 html << yield(page.number) | |
119 end | |
120 html << ' ' | |
121 end | |
122 | |
123 if always_show_anchors and not (wp_last = window_pages[-1]).last? | |
124 html << ' ... ' if last.number - wp_last.number > 1 | |
125 html << yield(last.number) | |
126 end | |
127 | |
128 html << suffix if suffix | |
129 | |
130 html | |
131 end | |
132 | |
133 end # PaginationHelper | |
134 end # Helpers | |
135 end # ActionView |