kanbanworkflowstimelinescrumrubyroadmapproject-planningproject-managementopenprojectangularissue-trackerifcgantt-chartganttbug-trackerboardsbcf
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
103 lines
2.8 KiB
103 lines
2.8 KiB
#-- encoding: UTF-8
|
|
#-- copyright
|
|
# OpenProject is a project management system.
|
|
#
|
|
# Copyright (C) 2012-2013 the OpenProject Team
|
|
#
|
|
# This program is free software; you can redistribute it and/or
|
|
# modify it under the terms of the GNU General Public License version 3.
|
|
#
|
|
# See doc/COPYRIGHT.rdoc for more details.
|
|
#++
|
|
|
|
require 'will_paginate'
|
|
|
|
module PaginationHelper
|
|
def pagination_links_full(paginator, options = {})
|
|
merged_options = { next_label: I18n.t(:label_next),
|
|
previous_label: I18n.t(:label_previous),
|
|
container: true }.merge(options)
|
|
|
|
html = ''.html_safe
|
|
|
|
if paginator.total_entries > 0
|
|
html << will_paginate(paginator, merged_options.merge({ :container => false }) )
|
|
|
|
html << content_tag(:span, "(#{paginator.offset + 1} - #{paginator.offset + paginator.length}/#{paginator.total_entries})", :class => 'range')
|
|
|
|
if per_page_links && links = per_page_links(paginator.per_page, merged_options[:params] || params)
|
|
html << links
|
|
end
|
|
end
|
|
|
|
merged_options[:container] ?
|
|
content_tag(:p, html, :class => "pagination") :
|
|
html
|
|
end
|
|
|
|
def per_page_links(selected=nil, options = params)
|
|
links = Setting.per_page_options_array.collect do |n|
|
|
n == selected ?
|
|
content_tag(:span, n, :class => 'current') :
|
|
link_to_content_update(n, options.merge(:page => 1, :per_page => n))
|
|
end
|
|
content_tag :span, :class => 'per_page_options' do
|
|
links.size > 1 ? l(:label_display_per_page, links.join(', ')).html_safe : nil
|
|
end
|
|
end
|
|
|
|
# Returns page option used for pagination
|
|
# based on:
|
|
# * offset
|
|
# * limit
|
|
# * page
|
|
# parameters.
|
|
# Preferes page over the other two and
|
|
# calculates page in it's absence based on limit and offset.
|
|
# Return 1 if all else fails.
|
|
|
|
def page_param(options = params)
|
|
page = if options[:page]
|
|
|
|
options[:page].to_i
|
|
|
|
elsif options[:offset] && options[:limit]
|
|
|
|
begin
|
|
# + 1 as page is not 0 but 1 based
|
|
options[:offset].to_i/per_page_param(options) + 1
|
|
rescue ZeroDivisionError
|
|
1
|
|
end
|
|
|
|
else
|
|
|
|
1
|
|
|
|
end
|
|
|
|
page > 0 ?
|
|
page :
|
|
1
|
|
end
|
|
|
|
# Returns per_page option used for pagination
|
|
# based on:
|
|
# * per_page session value
|
|
# * per_page options value
|
|
# * limit options value
|
|
# in that order
|
|
# Return smallest possible setting if all else fails.
|
|
|
|
def per_page_param(options = params)
|
|
per_page_candidates = [options[:per_page].to_i, session[:per_page].to_i, options[:limit].to_i]
|
|
|
|
unless (union = per_page_candidates & Setting.per_page_options_array).empty?
|
|
session[:per_page] = union.first
|
|
|
|
union.first
|
|
else
|
|
Setting.per_page_options_array.sort.first
|
|
end
|
|
end
|
|
end
|
|
|