diff --git a/kaminari-actionview/lib/kaminari/actionview.rb b/kaminari-actionview/lib/kaminari/actionview.rb index f256566..feda76a 100644 --- a/kaminari-actionview/lib/kaminari/actionview.rb +++ b/kaminari-actionview/lib/kaminari/actionview.rb @@ -2,6 +2,8 @@ require "kaminari/actionview/version" ActiveSupport.on_load :action_view do + require 'kaminari/helpers/helper_methods' + ::ActionView::Base.send :include, Kaminari::Helpers::HelperMethods + require 'kaminari/actionview/action_view_extension' - ::ActionView::Base.send :include, Kaminari::ActionViewExtension end diff --git a/kaminari-actionview/lib/kaminari/actionview/action_view_extension.rb b/kaminari-actionview/lib/kaminari/actionview/action_view_extension.rb index 569158a..30cd61d 100644 --- a/kaminari-actionview/lib/kaminari/actionview/action_view_extension.rb +++ b/kaminari-actionview/lib/kaminari/actionview/action_view_extension.rb @@ -6,170 +6,6 @@ require 'action_view/context' module Kaminari # = Helpers module ActionViewExtension - # A helper that renders the pagination links. - # - # <%= paginate @articles %> - # - # ==== Options - # * :window - The "inner window" size (4 by default). - # * :outer_window - The "outer window" size (0 by default). - # * :left - The "left outer window" size (0 by default). - # * :right - The "right outer window" size (0 by default). - # * :params - url_for parameters for the links (:controller, :action, etc.) - # * :param_name - parameter name for page number in the links (:page by default) - # * :remote - Ajax? (false by default) - # * :paginator_class - Specify a custom Paginator (Kaminari::Helpers::Paginator by default) - # * :ANY_OTHER_VALUES - Any other hash key & values would be directly passed into each tag as :locals value. - def paginate(scope, paginator_class: Kaminari::Helpers::Paginator, **options) - options[:total_pages] ||= scope.total_pages - options.reverse_merge! current_page: scope.current_page, per_page: scope.limit_value, remote: false - - paginator = paginator_class.new self, options - paginator.to_s - end - - # A simple "Twitter like" pagination link that creates a link to the previous page. - # - # ==== Examples - # Basic usage: - # - # <%= link_to_previous_page @items, 'Previous Page' %> - # - # Ajax: - # - # <%= link_to_previous_page @items, 'Previous Page', :remote => true %> - # - # By default, it renders nothing if there are no more results on the previous page. - # You can customize this output by passing a block. - # - # <%= link_to_previous_page @users, 'Previous Page' do %> - # At the Beginning - # <% end %> - def link_to_previous_page(scope, name, **options) - prev_page = path_to_prev_page(scope, options) - - options.except! :params, :param_name - options[:rel] ||= 'prev' - - link_to_if prev_page, name, prev_page, options do - yield if block_given? - end - end - - # A simple "Twitter like" pagination link that creates a link to the next page. - # - # ==== Examples - # Basic usage: - # - # <%= link_to_next_page @items, 'Next Page' %> - # - # Ajax: - # - # <%= link_to_next_page @items, 'Next Page', :remote => true %> - # - # By default, it renders nothing if there are no more results on the next page. - # You can customize this output by passing a block. - # - # <%= link_to_next_page @users, 'Next Page' do %> - # No More Pages - # <% end %> - def link_to_next_page(scope, name, **options) - next_page = path_to_next_page(scope, options) - - options.except! :params, :param_name - options[:rel] ||= 'next' - - link_to_if next_page, name, next_page, options do - yield if block_given? - end - end - - # Renders a helpful message with numbers of displayed vs. total entries. - # Ported from mislav/will_paginate - # - # ==== Examples - # Basic usage: - # - # <%= page_entries_info @posts %> - # #-> Displaying posts 6 - 10 of 26 in total - # - # By default, the message will use the humanized class name of objects - # in collection: for instance, "project types" for ProjectType models. - # The namespace will be cutted out and only the last name will be used. - # Override this with the :entry_name parameter: - # - # <%= 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) - 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) - else - first = collection.offset_value + 1 - last = (sum = collection.offset_value + collection.limit_value) > collection.total_count ? collection.total_count : sum - t('helpers.page_entries_info.more_pages.display_entries', entry_name: entry_name, first: first, last: last, total: collection.total_count) - end.html_safe - end - - # Renders rel="next" and rel="prev" links to be used in the head. - # - # ==== Examples - # Basic usage: - # - # In head: - # - # My Website - # <%= yield :head %> - # - # - # Somewhere in body: - # <% content_for :head do %> - # <%= rel_next_prev_link_tags @items %> - # <% end %> - # - # #-> - # - def rel_next_prev_link_tags(scope, options = {}) - next_page = path_to_next_page(scope, options) - prev_page = path_to_prev_page(scope, options) - - output = String.new - output << tag(:link, rel: "next", href: next_page) if next_page - output << tag(:link, rel: "prev", href: prev_page) if prev_page - output.html_safe - end - - # A helper that calculates the path to the next page. - # - # ==== Examples - # Basic usage: - # - # <%= path_to_next_page @items %> - # #-> /items?page=2 - # - # It will return `nil` if there is no next page. - def path_to_next_page(scope, options = {}) - Kaminari::Helpers::NextPage.new(self, options.reverse_merge(current_page: scope.current_page)).url if scope.next_page - end - - # A helper that calculates the path to the previous page. - # - # ==== Examples - # Basic usage: - # - # <%= path_to_prev_page @items %> - # #-> /items - # - # It will return `nil` if there is no previous page. - def path_to_prev_page(scope, options = {}) - Kaminari::Helpers::PrevPage.new(self, options.reverse_merge(current_page: scope.current_page)).url if scope.prev_page - end - module PaginatorExtension extend ActiveSupport::Concern diff --git a/kaminari-core/lib/kaminari/helpers/helper_methods.rb b/kaminari-core/lib/kaminari/helpers/helper_methods.rb new file mode 100644 index 0000000..7600943 --- /dev/null +++ b/kaminari-core/lib/kaminari/helpers/helper_methods.rb @@ -0,0 +1,169 @@ +module Kaminari + module Helpers + module HelperMethods + # A helper that renders the pagination links. + # + # <%= paginate @articles %> + # + # ==== Options + # * :window - The "inner window" size (4 by default). + # * :outer_window - The "outer window" size (0 by default). + # * :left - The "left outer window" size (0 by default). + # * :right - The "right outer window" size (0 by default). + # * :params - url_for parameters for the links (:controller, :action, etc.) + # * :param_name - parameter name for page number in the links (:page by default) + # * :remote - Ajax? (false by default) + # * :paginator_class - Specify a custom Paginator (Kaminari::Helpers::Paginator by default) + # * :ANY_OTHER_VALUES - Any other hash key & values would be directly passed into each tag as :locals value. + def paginate(scope, paginator_class: Kaminari::Helpers::Paginator, **options) + options[:total_pages] ||= scope.total_pages + options.reverse_merge! current_page: scope.current_page, per_page: scope.limit_value, remote: false + + paginator = paginator_class.new self, options + paginator.to_s + end + + # A simple "Twitter like" pagination link that creates a link to the previous page. + # + # ==== Examples + # Basic usage: + # + # <%= link_to_previous_page @items, 'Previous Page' %> + # + # Ajax: + # + # <%= link_to_previous_page @items, 'Previous Page', :remote => true %> + # + # By default, it renders nothing if there are no more results on the previous page. + # You can customize this output by passing a block. + # + # <%= link_to_previous_page @users, 'Previous Page' do %> + # At the Beginning + # <% end %> + def link_to_previous_page(scope, name, **options) + prev_page = path_to_prev_page(scope, options) + + options.except! :params, :param_name + options[:rel] ||= 'prev' + + link_to_if prev_page, name, prev_page, options do + yield if block_given? + end + end + + # A simple "Twitter like" pagination link that creates a link to the next page. + # + # ==== Examples + # Basic usage: + # + # <%= link_to_next_page @items, 'Next Page' %> + # + # Ajax: + # + # <%= link_to_next_page @items, 'Next Page', :remote => true %> + # + # By default, it renders nothing if there are no more results on the next page. + # You can customize this output by passing a block. + # + # <%= link_to_next_page @users, 'Next Page' do %> + # No More Pages + # <% end %> + def link_to_next_page(scope, name, **options) + next_page = path_to_next_page(scope, options) + + options.except! :params, :param_name + options[:rel] ||= 'next' + + link_to_if next_page, name, next_page, options do + yield if block_given? + end + end + + # Renders a helpful message with numbers of displayed vs. total entries. + # Ported from mislav/will_paginate + # + # ==== Examples + # Basic usage: + # + # <%= page_entries_info @posts %> + # #-> Displaying posts 6 - 10 of 26 in total + # + # By default, the message will use the humanized class name of objects + # in collection: for instance, "project types" for ProjectType models. + # The namespace will be cutted out and only the last name will be used. + # Override this with the :entry_name parameter: + # + # <%= 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) + 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) + else + first = collection.offset_value + 1 + last = (sum = collection.offset_value + collection.limit_value) > collection.total_count ? collection.total_count : sum + t('helpers.page_entries_info.more_pages.display_entries', entry_name: entry_name, first: first, last: last, total: collection.total_count) + end.html_safe + end + + # Renders rel="next" and rel="prev" links to be used in the head. + # + # ==== Examples + # Basic usage: + # + # In head: + # + # My Website + # <%= yield :head %> + # + # + # Somewhere in body: + # <% content_for :head do %> + # <%= rel_next_prev_link_tags @items %> + # <% end %> + # + # #-> + # + def rel_next_prev_link_tags(scope, options = {}) + next_page = path_to_next_page(scope, options) + prev_page = path_to_prev_page(scope, options) + + output = String.new + output << tag(:link, rel: "next", href: next_page) if next_page + output << tag(:link, rel: "prev", href: prev_page) if prev_page + output.html_safe + end + + # A helper that calculates the path to the next page. + # + # ==== Examples + # Basic usage: + # + # <%= path_to_next_page @items %> + # #-> /items?page=2 + # + # It will return `nil` if there is no next page. + def path_to_next_page(scope, options = {}) + Kaminari::Helpers::NextPage.new(self, options.reverse_merge(current_page: scope.current_page)).url if scope.next_page + end + + # A helper that calculates the path to the previous page. + # + # ==== Examples + # Basic usage: + # + # <%= path_to_prev_page @items %> + # #-> /items + # + # It will return `nil` if there is no previous page. + def path_to_prev_page(scope, options = {}) + Kaminari::Helpers::PrevPage.new(self, options.reverse_merge(current_page: scope.current_page)).url if scope.prev_page + end + end + end +end