+++ /dev/null
--<% if pager.paginate %>
-- <%= paginate(pager.paginate) %>
--<% end %>
+++ /dev/null
--<div>
-- <%= link_to 'more', pager.api_path %>
--</div>
--- /dev/null
- <%= link_to page.to_s, pager.url(page) %>
+<ul class="pagination">
+ <% if pager.has_previous_page %>
+ <li class="first">
+ <%= link_to '<<', pager.url(1) %>
+ </li>
+ <% end %>
+ <% if pager.has_previous_page %>
+ <li class="prev">
+ <%= link_to '<', pager.url(pager.current_page - 1) %>
+ </li>
+ <% end %>
+ <% if pager.has_previous_page_gap %>
+ <li class="page-gap">
+ ...
+ </li>
+ <% end %>
+ <% pager.range.each do |page| %>
+ <li class="page">
++ <%= link_to_if (page != pager.current_page), page.to_s, pager.url(page) %>
+ </li>
+ <% end %>
+ <% if pager.has_next_page_gap %>
+ <li class="page-gap">
+ ...
+ </li>
+ <% end %>
+ <% if pager.has_next_page %>
+ <li class="next">
+ <%= link_to '>', pager.url(pager.current_page + 1) %>
+ </li>
+ <% end %>
+ <% if pager.has_next_page %>
+ <li class="last">
+ <%= link_to '>>', pager.url(pager.total_page) %>
+ </li>
+ <% end %>
+</ul>
+<div class="row_break"></div>
--- /dev/null
--- /dev/null
++<ul class="pagination">
++ <% if pager.has_previous_page %>
++ <li class="first">
++ <%= link_to '<<', pager.url(pager.diff_offset(-pager.current_page + 1)) %>
++ </li>
++ <% end %>
++ <% if pager.has_previous_page %>
++ <li class="prev">
++ <%= link_to '<', pager.url(pager.diff_offset(-1)) %>
++ </li>
++ <% end %>
++ <% if pager.has_previous_page_gap %>
++ <li class="page-gap">
++ ...
++ </li>
++ <% end %>
++ <% pager.ranges.each do |range| %>
++ <li class="page">
++ <%= link_to_if (range['page'] != pager.current_page), range['page'].to_s, pager.url(pager.diff_offset(range['distance'])) %>
++ </li>
++ <% end %>
++ <% if pager.has_next_page_gap %>
++ <li class="page-gap">
++ ...
++ </li>
++ <% end %>
++ <% if pager.has_next_page %>
++ <li class="next">
++ <%= link_to '>', pager.url(pager.diff_offset(+1)) %>
++ </li>
++ <% end %>
++ <% if pager.has_next_page %>
++ <li class="last">
++ <%= link_to '>>', pager.url(pager.diff_offset(pager.total_page - pager.current_page)) %>
++ </li>
++ <% end %>
++</ul>
++<div class="row_break"></div>
--- /dev/null
- def paginate
- c = @total ? @total.to_i : 0
+module Locmare
+ module ListGroupModule
+ module LibModule
+ class PageStatus
+
+ class Default
+ attr :total, :options
+
+ def initialize list, total, options
+ @list = list
+ @total = total
+ @options = options
+ end
+
+ def to_hash
+ {
+ :type => :default, :total => @total,
+ :page => self.page, :page_size => self.limit
+ }
+ end
+
+ def pager
+ @pager ||= ::Locmare::ListGroupModule::LibModule::Pager::Default.new(self, @options)
+ end
+
+ def offset
+ return @offset if @offset
+ @offset = (self.page - 1) * self.limit
+ end
+
+ def limit
+ return @limit if @limit
+ @limit = PageStatus.page_size(@options) || self.default_page_size
+ if @list.limited?
+ @limit = self.default_page_size if @limit < 0
+ @limit = self.max_page_size if @limit > self.max_page_size
+ else # unlimited api
+ @limit = -1 if @limit < 0
+ end
+ @limit = @total if @total and (@limit > @total)
+ @limit
+ end
+
+ def page
+ return @page if @page
+ @page = PageStatus.page(@options).to_i
+ @page = 1 if @page < 1
+ @page
+ end
+
+ def default_page_size
+ @list.default_page_size
+ end
+
+ def max_page_size
+ @list.max_page_size
+ end
+
+ def total_page
+ (@total / self.limit) + 1
+ end
+
+ def pageable?
+ self.total_page > 1
+ end
+
+ end
+
+ class Offset
+ attr :total, :options
+
+ def initialize list, total, options
+ @list = list
+ @total = total
+ @options = options
+ end
+
+ def to_hash
+ {
+ :type => :offset, :total => @total,
+ :offset => self.offset, :count => self.limit
+ }
+ end
+
- @offset = self.count - 1 if @offset >= self.count
- @offset = self.count - @offset.abs if @offset < 0
++ def pager
++ @pager ||= ::Locmare::ListGroupModule::LibModule::Pager::Offset.new(self, @options)
+ end
+
+ def offset
+ return @offset if @offset
+ @offset = PageStatus.offset(@options).to_i
- :type => :none
++ @offset = @total - 1 if @offset >= @total
++ @offset = @total - @offset.abs if @offset < 0
+ @offset = 0 if @offset < 0
+ @offset
+ end
+
+ def limit
+ return @limit if @limit
+ @limit = self.count || self.default_page_size
++ @limit = self.default_page_size if @limit == 0
+ if @list.limited?
+ @limit = self.default_page_size if @limit < 0
+ @limit = self.max_page_size if @limit > self.max_page_size
+ else # unlimited api
+ @limit = -1 if @limit < 0
+ end
+ @limit = @total if @total and (@limit > @total)
+ @limit
+ end
+
+ def count
+ @count ||= PageStatus.count(@options)
+ end
+
++ def mod
++ self.offset % self.limit
++ end
++
++ def adjust
++ self.mod == 0 ? 0 : 1
++ end
++
++ def page
++ return 1 if self.limit < 0
++ self.offset / self.limit + 1 + self.adjust
++ end
++
++ def default_page_size
++ @list.default_page_size
++ end
++
++ def max_page_size
++ @list.max_page_size
++ end
++
++ def total_page
++ return 1 if self.limit < 0
++ round = (@total % self.limit) == 0 ? 0 : 1
++ @total / self.limit + round + self.adjust
++ end
++
++ def pageable?
++ self.total_page > 1
++ end
++
+ end
+
+ class Unlimited
+ attr :total, :options
+
+ def initialize list, total, options
+ @list = list
+ @total = total
+ @options = options
+ end
+
+ def to_hash
+ {
- def paginate
++ :type => :unlimited
+ }
+ end
+
++ def pager
+ nil
+ end
+
+ def offset
+ 0
+ end
+
+ def limit
+ -1
+ end
+
++ def pageable?
++ false
++ end
++
+ end
+
+ def self.load list, total, options
+ ps = if self.offset(options) or self.count(options)
+ Offset.new list, total, options
+ else
+ Default.new list, total, options
+ end
+ ps = Unlimited.new(list, total, options) if ps.limit < 0
+ ps
+ end
+
+ def self.page options
+ n = options['page'] || options[:page]
+ n ? n.to_i : nil
+ end
+
+ def self.page_size options
+ n = options['page_size'] || options[:page_size]
+ n ? n.to_i : nil
+ end
+
+ def self.offset options
+ n = options['offset'] || options[:offset]
+ n ? n.to_i : nil
+ end
+
+ def self.count options
+ n = options['count'] || options[:count]
+ n ? n.to_i : nil
+ end
+
+ end
+
+ end
+ end
+end
--- /dev/null
- @current_page = @page_status.page
- @per_page = @page_status.limit
- @total_page = @page_status.total_page
+module Locmare
+ module ListGroupModule
+ module LibModule
+ module Pager
+ class Default
+
+ attr :page_status, :options, :window_size,
+ :total, :current_page, :per_page, :total_page,
+ :template_dir, :template_name
+
+ def initialize page_status, options
+ @page_status = page_status
+ @options = options
+ @total = @page_status.total
-
++
+ @window_size = 3
+ @template_dir = 'templates/r/pager/'
+ @template_name = @template_dir + 'default'
+ @controller = Manifest.manifest.controllers[@options['controller'].to_s]
+ @action = @controller.actions[@options['action'].to_s]
++
++ @current_page = @page_status.page
++ @per_page = @page_status.limit
++ @total_page = @page_status.total_page
+ end
+
+ def range
+ f = if self.has_previous_page_gap
+ @current_page - @window_size
+ else
+ 1
+ end
+ t = if self.has_next_page_gap
+ @current_page + @window_size
+ else
+ @total_page
+ end
+ f..t
+ end
+
+ def has_previous_page
+ @current_page > 1
+ end
+
+ def has_next_page
+ @current_page < @total_page
+ end
+
+ def has_previous_page_gap
+ @current_page > @window_size + 1
+ end
+
+ def has_next_page_gap
+ @total_page - @current_page > @window_size
+ end
+
+ def url page
+ params = {}
+ @options.each do |k, v| # deep copy
+ params[k] = v
+ end
+ params['page'] = page
+ params['page_size'] = @per_page
+ @action.url params
+ end
+
+ end
++
++ class Offset
++
++ attr :page_status, :options, :window_size,
++ :total, :current_page, :per_page, :total_page,
++ :template_dir, :template_name
++
++ def initialize page_status, options
++ @page_status = page_status
++ @options = options
++ @total = @page_status.total
++
++ @window_size = 3
++ @template_dir = 'templates/r/pager/'
++ @template_name = @template_dir + 'offset'
++ @controller = Manifest.manifest.controllers[@options['controller'].to_s]
++ @action = @controller.actions[@options['action'].to_s]
++
++ @current_page = @page_status.page
++ @per_page = @page_status.limit
++ @total_page = @page_status.total_page
++ end
++
++ def ranges
++ ranges = []
++ (-@window_size..@window_size).each do |d|
++ next unless r = self.diff_offset(d)
++ ranges << r
++ end
++ ranges
++ end
++
++ def has_previous_page
++ @current_page > 1
++ end
++
++ def has_next_page
++ @current_page < @total_page
++ end
++
++ def has_previous_page_gap
++ @current_page > @window_size + 1
++ end
++
++ def has_next_page_gap
++ @total_page - @current_page > @window_size
++ end
++
++ def diff_offset d
++ f = @page_status.offset + d * @per_page
++ t = f + @per_page - 1
++ return nil if t < 0 or f >= @total
++ f = 0 if f < 0
++ t = @total - 1 if t >= @total
++ {
++ 'offset' => f, 'count' => t - f + 1,
++ 'page' => @current_page + d, 'distance' => d
++ }
++ end
++
++ def url range
++ params = {}
++ @options.each do |k, v| # deep copy
++ params[k] = v
++ end
++ params['offset'] = range['offset']
++ params['count'] = range['count']
++ @action.url params
++ end
++
++ end
+ end
+ end
+ end
+end
q = []
q.push('page=' + params['page'].to_s) if params['page']
q.push('page_size=' + params['page_size'].to_s) if params['page_size']
++ q.push('offset=' + params['offset'].to_s) if params['offset']
++ q.push('count=' + params['count'].to_s) if params['count']
if q.length > 0
'?' + q.join('&')
else