2011-02-10 18:45:43 +00:00
|
|
|
module Kaminari
|
|
|
|
module Helpers
|
2011-02-10 23:22:59 +00:00
|
|
|
# A tag stands for an HTML tag inside the paginator.
|
|
|
|
# Basically, a tag has its own partial template file, so every tag can be
|
|
|
|
# rendered into String using its partial template.
|
|
|
|
#
|
|
|
|
# The template file should be placed in your app/views/kaminari/ directory
|
|
|
|
# with underscored class name (besides the "Tag" class. Tag is an abstract
|
|
|
|
# class, so _tag parital is not needed).
|
|
|
|
# e.g.) PrevLink -> app/views/kaminari/_prev_link.html.erb
|
|
|
|
#
|
|
|
|
# If the template file does not exist, it falls back to ancestor classes.
|
|
|
|
# e.g.) FirstPageLink -> app/views/kaminari/_first_page_link.html.erb
|
|
|
|
# -> app/views/kaminari/_page_link.html.erb
|
|
|
|
#
|
|
|
|
# When no template were found in your app, finally the engine's pre insatalled
|
|
|
|
# template will be used.
|
|
|
|
# e.g.) Paginator -> $GEM_HOME/kaminari-x.x.x/app/views/kaminari/_paginator.html.erb
|
2011-02-10 18:45:43 +00:00
|
|
|
class Tag
|
2011-02-10 23:22:59 +00:00
|
|
|
def self.template_filename #:nodoc:
|
2011-02-10 18:45:43 +00:00
|
|
|
name.demodulize.underscore
|
|
|
|
end
|
|
|
|
|
2011-02-10 23:22:59 +00:00
|
|
|
def initialize(renderer, options = {}) #:nodoc:
|
2011-02-10 18:45:43 +00:00
|
|
|
@renderer, @options = renderer, renderer.options.merge(options)
|
|
|
|
end
|
|
|
|
|
2011-02-10 23:22:59 +00:00
|
|
|
def to_s(locals = {}) #:nodoc:
|
2011-02-10 18:45:43 +00:00
|
|
|
@renderer.render :partial => find_template, :locals => @options.merge(locals)
|
|
|
|
end
|
|
|
|
|
|
|
|
private
|
|
|
|
# OMG yet another super dirty hack
|
|
|
|
# this method finds
|
|
|
|
# 1. a template for the given class from app/views
|
|
|
|
# 2. a template for its parent class from app/views
|
|
|
|
# 3. the default one inside the engine
|
|
|
|
def find_template(klass = self.class)
|
2011-02-11 06:30:26 +00:00
|
|
|
if @renderer.partial_exists? klass.template_filename
|
2011-02-10 18:45:43 +00:00
|
|
|
"kaminari/#{klass.template_filename}"
|
|
|
|
elsif (parent = klass.ancestors[1]) == Tag
|
|
|
|
"kaminari/#{self.class.template_filename}"
|
|
|
|
else
|
|
|
|
find_template parent
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
def page_url_for(page)
|
|
|
|
@renderer.url_for @renderer.params.merge(:page => (page <= 1 ? nil : page))
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2011-02-10 23:22:59 +00:00
|
|
|
# "Previous" without link
|
2011-02-10 18:45:43 +00:00
|
|
|
class PrevSpan < Tag
|
|
|
|
end
|
|
|
|
|
2011-02-10 23:22:59 +00:00
|
|
|
# "Previous" with link
|
2011-02-10 18:45:43 +00:00
|
|
|
class PrevLink < Tag
|
2011-02-10 23:22:59 +00:00
|
|
|
def to_s #:nodoc:
|
2011-02-10 18:45:43 +00:00
|
|
|
super :prev_url => page_url_for(@options[:current_page] - 1)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2011-02-10 23:22:59 +00:00
|
|
|
# "Next" without link
|
2011-02-10 18:45:43 +00:00
|
|
|
class NextSpan < Tag
|
|
|
|
end
|
|
|
|
|
2011-02-10 23:22:59 +00:00
|
|
|
# "Next" with link
|
2011-02-10 18:45:43 +00:00
|
|
|
class NextLink < Tag
|
2011-02-10 23:22:59 +00:00
|
|
|
def to_s #:nodoc:
|
2011-02-10 18:45:43 +00:00
|
|
|
super :next_url => page_url_for(@options[:current_page] + 1)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2011-02-10 23:22:59 +00:00
|
|
|
# A link showing page number
|
2011-02-10 18:45:43 +00:00
|
|
|
class PageLink < Tag
|
2011-02-10 23:22:59 +00:00
|
|
|
def to_s #:nodoc:
|
2011-02-10 18:45:43 +00:00
|
|
|
super :page_url => page_url_for(@options[:page])
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2011-02-10 23:22:59 +00:00
|
|
|
# A non-link tag showing the current page number
|
2011-02-10 18:45:43 +00:00
|
|
|
class CurrentPage < Tag
|
2011-02-10 23:22:59 +00:00
|
|
|
def to_s #:nodoc:
|
2011-02-10 18:45:43 +00:00
|
|
|
super :page_url => page_url_for(@options[:page])
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2011-02-10 23:22:59 +00:00
|
|
|
# A link with page number that appears at the leftmost
|
2011-02-10 18:45:43 +00:00
|
|
|
class FirstPageLink < PageLink
|
|
|
|
end
|
|
|
|
|
2011-02-10 23:22:59 +00:00
|
|
|
# A link with page number that appears at the rightmost
|
2011-02-10 18:45:43 +00:00
|
|
|
class LastPageLink < PageLink
|
|
|
|
end
|
|
|
|
|
2011-02-10 23:22:59 +00:00
|
|
|
# A non-link tag that stands for skipped pages...
|
2011-02-10 18:45:43 +00:00
|
|
|
class TruncatedSpan < Tag
|
|
|
|
end
|
|
|
|
|
2011-02-10 23:22:59 +00:00
|
|
|
# The container tag
|
2011-02-10 18:45:43 +00:00
|
|
|
class Paginator < Tag
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|