Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add Kaminari.config.page_entries_info_number_formatter #1029

Open
wants to merge 2 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
36 changes: 26 additions & 10 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -139,16 +139,17 @@ unpaged_users = users.except(:limit, :offset) # unpaged_users will not use the k

You can configure the following default values by overriding these values using `Kaminari.configure` method.

default_per_page # 25 by default
max_per_page # nil by default
max_pages # nil by default
window # 4 by default
outer_window # 0 by default
left # 0 by default
right # 0 by default
page_method_name # :page by default
param_name # :page by default
params_on_first_page # false by default
default_per_page # 25 by default
max_per_page # nil by default
max_pages # nil by default
window # 4 by default
outer_window # 0 by default
left # 0 by default
right # 0 by default
page_method_name # :page by default
param_name # :page by default
params_on_first_page # false by default
page_entries_info_number_formatter # ->(n) { n } by default

There's a handy generator that generates the default configuration file into config/initializers directory.
Run the following generator command, then edit the generated file.
Expand Down Expand Up @@ -184,6 +185,21 @@ class User < ActiveRecord::Base
end
```

### Configuring the page_entries_info_number_formatter

You can change the `page_entries_info_number_formatter` to a proc which will be called each time a number is rendered in the `page_entries_info` helper, this can be useful for adding thousands separators when you have a large number of entries.
Default value is an identity function, which just returns the yielded number as-is.

```ruby
class NumberHelper
include ActionView::Helpers::NumberHelper
end

Kaminari.configure do |config|
config.page_entries_info_number_formatter = NumberHelper.new.method(:number_with_delimiter)
end
```

### Configuring params_on_first_page when using ransack_memory

If you are using [the `ransack_memory` gem](https://github.com/richardrails/ransack_memory) and experience problems navigating back to the previous or first page, set the `params_on_first_page` setting to `true`.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,4 +11,5 @@
# config.param_name = :page
# config.max_pages = nil
# config.params_on_first_page = false
# config.page_entries_info_number_formatter = ->(number) { number }
end
5 changes: 4 additions & 1 deletion kaminari-core/lib/kaminari/config.rb
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
# frozen_string_literal: true

module Kaminari
IDENTITY_FN = ->(value) { value }

# Configures global settings for Kaminari
# Kaminari.configure do |config|
# config.default_per_page = 10
Expand All @@ -16,7 +18,7 @@ def config
end

class Config
attr_accessor :default_per_page, :max_per_page, :window, :outer_window, :left, :right, :page_method_name, :max_pages, :params_on_first_page
attr_accessor :default_per_page, :max_per_page, :window, :outer_window, :left, :right, :page_method_name, :max_pages, :params_on_first_page, :page_entries_info_number_formatter
attr_writer :param_name

def initialize
Expand All @@ -30,6 +32,7 @@ def initialize
@param_name = :page
@max_pages = nil
@params_on_first_page = false
@page_entries_info_number_formatter = IDENTITY_FN
end

# If param_name was given as a callable object, call it when returning
Expand Down
20 changes: 11 additions & 9 deletions kaminari-core/lib/kaminari/helpers/helper_methods.rb
Original file line number Diff line number Diff line change
Expand Up @@ -199,19 +199,21 @@ def link_to_next_page(scope, name, **options)
# <%= page_entries_info @posts, entry_name: 'item' %>
# #-> Displaying items 6 - 10 of 26 in total
def page_entries_info(collection, entry_name: nil)
entry_name = if entry_name
entry_name.pluralize(collection.size, I18n.locale)
else
collection.entry_name(count: collection.size).downcase
end
formatter = Kaminari.config.page_entries_info_number_formatter
total_count = formatter.(collection.total_count)
entry_name = if entry_name
entry_name.pluralize(collection.size, I18n.locale)
else
collection.entry_name(count: collection.size).downcase
end

if collection.total_pages < 2
t('helpers.page_entries_info.one_page.display_entries', entry_name: entry_name, count: collection.total_count)
t('helpers.page_entries_info.one_page.display_entries', entry_name: entry_name, count: total_count)
else
from = collection.offset_value + 1
to = collection.offset_value + (collection.respond_to?(:records) ? collection.records : collection.to_a).size
from = formatter.(collection.offset_value + 1)
to = formatter.(collection.offset_value + (collection.respond_to?(:records) ? collection.records : collection.to_a).size)

t('helpers.page_entries_info.more_pages.display_entries', entry_name: entry_name, first: from, last: to, total: collection.total_count)
t('helpers.page_entries_info.more_pages.display_entries', entry_name: entry_name, first: from, last: to, total: total_count)
end.html_safe
end

Expand Down
15 changes: 15 additions & 0 deletions kaminari-core/test/config/config_test.rb
Original file line number Diff line number Diff line change
Expand Up @@ -96,4 +96,19 @@ class ConfigurationTest < ::Test::Unit::TestCase
end
end
end

sub_test_case 'page_entries_info_number_formatter' do
test 'by default' do
assert_equal Kaminari::IDENTITY_FN, Kaminari.config.page_entries_info_number_formatter
end
test 'configure via config block' do
begin
always_42 = ->(number) { 42 }
Kaminari.configure {|c| c.page_entries_info_number_formatter = always_42 }
assert_equal always_42, Kaminari.config.page_entries_info_number_formatter
ensure
Kaminari.configure {|c| c.page_entries_info_number_formatter = Kaminari::IDENTITY_FN }
end
end
end
end
99 changes: 91 additions & 8 deletions kaminari-core/test/helpers/action_view_extension_test.rb
Original file line number Diff line number Diff line change
Expand Up @@ -281,6 +281,28 @@ def to_s
end
end

sub_test_case 'with a custom page entries info number formatter' do
setup do
Kaminari.config.page_entries_info_number_formatter = ->(n) { "+#{n}+" }
end

teardown do
Kaminari.config.page_entries_info_number_formatter = Kaminari::IDENTITY_FN
end

test 'it uses the custom page entries info number formatter' do
users = User.page(1).per(25)
assert_equal 'Displaying users <b>+1+&nbsp;-&nbsp;+25+</b> of <b>+50+</b> in total', view.page_entries_info(users)
end
end

sub_test_case 'without a custom page entries info number formatter' do
test 'it uses the default number formatter' do
users = User.page(1).per(25)
assert_equal 'Displaying users <b>1&nbsp;-&nbsp;25</b> of <b>50</b> in total', view.page_entries_info(users)
end
end

test 'it accepts a decorated object' do
page_info_presenter = Class.new(SimpleDelegator) do
include ActionView::Helpers::NumberHelper
Expand All @@ -302,15 +324,36 @@ def total_count
50.times {|i| User.create! name: "user#{i}"}
end

test 'page_entries_info translates entry' do
users = User.page(1).per(25)
begin
sub_test_case 'with custom translations' do
setup do
I18n.backend.store_translations(:en, User.i18n_scope => { models: { user: { one: "person", other: "people" } } })
end

assert_equal 'Displaying people <b>1&nbsp;-&nbsp;25</b> of <b>50</b> in total', view.page_entries_info(users)
ensure
teardown do
I18n.backend.reload!
end

sub_test_case 'with a custom page entries info number formatter' do
setup do
Kaminari.config.page_entries_info_number_formatter = ->(n) { "+#{n}+" }
end

teardown do
Kaminari.config.page_entries_info_number_formatter = Kaminari::IDENTITY_FN
end

test 'page_entries_info translates entry using the custom page entries info number formatter' do
users = User.page(1).per(25)
assert_equal 'Displaying people <b>+1+&nbsp;-&nbsp;+25+</b> of <b>+50+</b> in total', view.page_entries_info(users)
end
end

sub_test_case 'without a custom page entries info number formatter' do
test 'page_entries_info translates entry using the default number formatter' do
users = User.page(1).per(25)
assert_equal 'Displaying people <b>1&nbsp;-&nbsp;25</b> of <b>50</b> in total', view.page_entries_info(users)
end
end
end

sub_test_case 'with any other locale' do
Expand Down Expand Up @@ -468,13 +511,53 @@ def total_count
assert_equal 'Displaying places <b>26&nbsp;-&nbsp;50</b> of <b>50</b> in total', view.page_entries_info(addresses, entry_name: 'place')
end
end

sub_test_case 'with a custom page entries info number formatter' do
setup do
Kaminari.config.page_entries_info_number_formatter = ->(n) { "+#{n}+" }
end

teardown do
Kaminari.config.page_entries_info_number_formatter = Kaminari::IDENTITY_FN
end

test 'it uses the custom page entries info number formatter' do
addresses = User::Address.page(2).per(25)
assert_equal 'Displaying addresses <b>+26+&nbsp;-&nbsp;+50+</b> of <b>+50+</b> in total', view.page_entries_info(addresses)
end
end

sub_test_case 'without a custom page entries info number formatter' do
test 'it uses the default number formatter' do
addresses = User::Address.page(2).per(25)
assert_equal 'Displaying addresses <b>26&nbsp;-&nbsp;50</b> of <b>50</b> in total', view.page_entries_info(addresses)
end
end
end
end

test 'on a PaginatableArray' do
numbers = Kaminari.paginate_array(%w{one two three}).page(1)
sub_test_case 'on a PaginatableArray' do
sub_test_case 'with a custom page entries info number formatter' do
setup do
Kaminari.config.page_entries_info_number_formatter = ->(n) { "+#{n}+" }
end

assert_equal 'Displaying <b>all 3</b> entries', view.page_entries_info(numbers)
teardown do
Kaminari.config.page_entries_info_number_formatter = Kaminari::IDENTITY_FN
end

test 'it uses the custom page entries info number formatter' do
numbers = Kaminari.paginate_array(%w{one two three}).page(1)
assert_equal 'Displaying <b>all +3+</b> entries', view.page_entries_info(numbers)
end
end

sub_test_case 'without a custom page entries info number formatter' do
test 'it uses the default number formatter' do
numbers = Kaminari.paginate_array(%w{one two three}).page(1)
assert_equal 'Displaying <b>all 3</b> entries', view.page_entries_info(numbers)
end
end
end
end

Expand Down