X-Git-Url: https://git.openstreetmap.org./rails.git/blobdiff_plain/e660e609661edadc1ed5ad49d6e83e936b2f91cd..8cb270f5576c3b95f085c8ec25f6dfa376925351:/lib/classic_pagination/pagination_helper.rb?ds=sidebyside diff --git a/lib/classic_pagination/pagination_helper.rb b/lib/classic_pagination/pagination_helper.rb index 069d77566..c450de4e1 100644 --- a/lib/classic_pagination/pagination_helper.rb +++ b/lib/classic_pagination/pagination_helper.rb @@ -13,7 +13,7 @@ module ActionView :always_show_anchors => true, :link_to_current_page => false, :params => {} - } + }.freeze end # Creates a basic HTML link bar for the given +paginator+. Links will be created @@ -27,7 +27,7 @@ module ActionView # (i.e. Older Pages: 1 2 3 4) # :suffix:: suffix for pagination links # (i.e. 1 2 3 4 <- Older Pages) - # :window_size:: the number of pages to show around + # :window_size:: the number of pages to show around # the current page (defaults to 2) # :always_show_anchors:: whether or not the first and last # pages should always be shown @@ -48,20 +48,20 @@ module ActionView # # => 1 2 3 ... 10 # # pagination_links(@person_pages, :always_show_anchors => false) - # # => 1 2 3 + # # => 1 2 3 # # pagination_links(@person_pages, :window_size => 1) # # => 1 2 ... 10 # # pagination_links(@person_pages, :params => { :viewer => "flash" }) - # # => 1 2 3 ... + # # => 1 2 3 ... # # 10 - def pagination_links(paginator, options={}, html_options={}) + def pagination_links(paginator, options = {}, html_options = {}) name = options[:name] || DEFAULT_OPTIONS[:name] params = (options[:params] || DEFAULT_OPTIONS[:params]).clone - - prefix = options[:prefix] || '' - suffix = options[:suffix] || '' + + prefix = options[:prefix] || "" + suffix = options[:suffix] || "" pagination_links_each(paginator, options, prefix, suffix) do |n| params[name] = n @@ -71,9 +71,9 @@ module ActionView # Iterate through the pages of a given +paginator+, invoking a # block for each page number that needs to be rendered as a link. - # + # # ==== Options - # :window_size:: the number of pages to show around + # :window_size:: the number of pages to show around # the current page (defaults to +2+) # :always_show_anchors:: whether or not the first and last # pages should always be shown @@ -97,31 +97,32 @@ module ActionView current_page = paginator.current_page window_pages = current_page.window(options[:window_size]).pages - return if window_pages.length <= 1 unless link_to_current_page - - first, last = paginator.first, paginator.last - - html = '' + return unless link_to_current_page || window_pages.length > 1 + + first = paginator.first + last = paginator.last + + html = "" html << prefix if prefix - if always_show_anchors and not (wp_first = window_pages[0]).first? + if always_show_anchors && !(wp_first = window_pages[0]).first? html << yield(first.number) - html << ' ... ' if wp_first.number - first.number > 1 - html << ' ' + html << " ... " if wp_first.number - first.number > 1 + html << " " end - + window_pages.each do |page| - if current_page == page && !link_to_current_page - html << page.number.to_s - else - html << yield(page.number) - end - html << ' ' + html << if current_page == page && !link_to_current_page + page.number.to_s + else + yield(page.number) + end + html << " " end - - if always_show_anchors and not (wp_last = window_pages[-1]).last? - html << ' ... ' if last.number - wp_last.number > 1 + + if always_show_anchors && !(wp_last = window_pages[-1]).last? + html << " ... " if last.number - wp_last.number > 1 html << yield(last.number) end @@ -129,7 +130,40 @@ module ActionView html end - - end # PaginationHelper - end # Helpers -end # ActionView + + def pagination_items(paginator, options) + options = DEFAULT_OPTIONS.merge(options) + link_to_current_page = options[:link_to_current_page] + always_show_anchors = options[:always_show_anchors] + + current_page = paginator.current_page + window_pages = current_page.window(options[:window_size]).pages + + first = paginator.first + last = paginator.last + + items = [] + + if always_show_anchors && !(wp_first = window_pages[0]).first? + items.push [first.number.to_s, first] + items.push ["...", "disabled"] if wp_first.number - first.number > 1 + end + + window_pages.each do |page| + if current_page == page && !link_to_current_page + items.push [page.number.to_s, "active"] + else + items.push [page.number.to_s, page] + end + end + + if always_show_anchors && !(wp_last = window_pages[-1]).last? + items.push ["...", "disabled"] if last.number - wp_last.number > 1 + items.push [last.number.to_s, last] + end + + items + end + end + end +end