//= require ./pettanr/picture
//= require ./pettanr/pettan_imager
//= require ./pettanr/operator
-//= require backbone.fetch-cache
+//= require ./backbone.fetch-cache
//= require main
@model_class = Manifest.item_name_to_model @item_name\r
@table_name = @model_class.table_name()\r
\r
+ parse: (res) ->\r
+ @s = res.page_status\r
+ res.list\r
+ \r
page_number: (prm = null) ->\r
page = Pettanr.to_i(parseInt(prm))\r
page = 1 if page < 1\r
if @id\r
@url = @url + @id\r
\r
-class Pettanr.Admin.Collection extends Backbone.Collection\r
- model: Pettanr.Admin\r
- url: '/admins'\r
if @id\r
@url = @url + @id\r
\r
-class Pettanr.Author.Collection extends Backbone.Collection\r
- model: Pettanr.Author\r
- url: '/authors'\r
if @id\r
@url = @url + @id\r
\r
-class Pettanr.Balloon.Collection extends Backbone.Collection\r
- model: Pettanr.Balloon\r
- url: '/balloons'\r
-\r
if @id\r
@url = @url + @id\r
\r
-class Pettanr.Comic.Collection extends Backbone.Collection\r
- model: Pettanr.Comic\r
- url: '/comics'\r
if @id\r
@url = @url + @id\r
\r
-class Pettanr.ComicStory.Collection extends Backbone.Collection\r
- model: Pettanr.ComicStory\r
- url: '/comic_stories'\r
initialize: () ->\r
super()\r
@url = @url + '?ref=1'\r
-class Pettanr.Folder.Collection extends Backbone.Collection\r
- model: Pettanr.Folder\r
- url: 'folders'\r
class Pettanr.Folder.Root extends Pettanr.Folder\r
model: Pettanr.Folder\r
url: '/folders/root?ref=1'\r
if @id\r
@url = @url + @id\r
\r
-class Pettanr.GroundColor.Collection extends Backbone.Collection\r
- model: Pettanr.GroundColor\r
- url: '/ground_colors/'\r
- \r
if @id\r
@url = @url + @id\r
\r
-class Pettanr.GroundPicture.Collection extends Backbone.Collection\r
- model: Pettanr.GroundPicture\r
- url: '/ground_pictures/'\r
- \r
if @id\r
@url = @url + @id\r
\r
-class Pettanr.License.Collection extends Backbone.Collection\r
- model: Pettanr.License\r
- url: '/licenses'\r
-\r
class Pettanr.License.Caption extends Backbone.View\r
tagName: 'span'\r
initialize: (options) ->\r
if @id\r
@url = @url + @id\r
\r
-class Pettanr.LicenseGroup.Collection extends Backbone.Collection\r
- model: Pettanr.LicenseGroup\r
- url: '/license_groups'\r
if @id\r
@url = @url + @id\r
\r
-class Pettanr.OriginalPictureLicense.Collection extends Backbone.Collection\r
- model: Pettanr.OriginalPictureLicense\r
- url: '/original_picture_licenses'\r
if @id\r
@url = @url + @id\r
\r
-class Pettanr.OriginalPictureLicenseGroup.Collection extends Backbone.Collection\r
- model: Pettanr.OriginalPictureLicenseGroup\r
- url: '/original_picture_license_groups'\r
if options.with_elements\r
@url = @url + '?with_elements=true'\r
\r
-class Pettanr.Panels extends Backbone.Collection\r
- model: Pettanr.Panel\r
- url: '/panels/'\r
- \r
if @id\r
@url = @url + @id\r
\r
-class Pettanr.PanelPictures extends Backbone.Collection\r
- model: Pettanr.PanelPicture\r
- url: '/panel_pictures/'\r
- \r
if @id\r
@url = @url + @id\r
\r
-class Pettanr.ResourcePicture.Collection extends Backbone.Collection\r
- model: Pettanr.ResourcePicture\r
- url: '/resource_pictures/'\r
if @id\r
@url = @url + @id\r
\r
-class Pettanr.Scroll.Collection extends Backbone.Collection\r
- model: Pettanr.Scroll\r
- url: '/scrolls'\r
if @id\r
@url = @url + @id\r
\r
-class Pettanr.ScrollPanel.Collection extends Backbone.Collection\r
- model: Pettanr.ScrollPanel\r
- url: '/scroll_panels'\r
if @id\r
@url = @url + @id\r
\r
-class Pettanr.Sheet.Collection extends Backbone.Collection\r
- model: Pettanr.Sheet\r
- url: '/sheets'\r
if @id\r
@url = @url + @id\r
\r
-class Pettanr.SheetPanel.Collection extends Backbone.Collection\r
- model: Pettanr.SheetPanel\r
- url: '/sheet_panels'\r
if @id\r
@url = @url + @id\r
\r
-class Pettanr.SpeechBalloon.Collection extends Backbone.Collection\r
- model: Pettanr.SpeechBalloon\r
- url: '/speech_balloons/'\r
- \r
if @id\r
@url = @url + @id\r
\r
-class Pettanr.SpeechBalloonTemplate.Collection extends Backbone.Collection\r
- model: Pettanr.SpeechBalloonTemplate\r
- url: '/speech_balloon_templates'\r
if @id\r
@url = @url + @id\r
\r
-class Pettanr.Story.Collection extends Backbone.Collection\r
- model: Pettanr.Story\r
- url: '/stories'\r
if @id\r
@url = @url + @id\r
\r
-class Pettanr.StorySheet.Collection extends Backbone.Collection\r
- model: Pettanr.StorySheet\r
- url: '/story_sheets'\r
if @id\r
@url = @url + @id\r
\r
-class Pettanr.SystemPicture.Collection extends Backbone.Collection\r
- model: Pettanr.SystemPicture\r
- url: '/system_pictures'\r
if @id\r
@url = @url + @id\r
\r
-class Pettanr.WritingFormat.Collection extends Backbone.Collection\r
- model: Pettanr.WritingFormat\r
- url: '/writing_formats'\r
-\r
@cache = {}\r
@credits = {}\r
\r
- class Pettanr.FilerCollection extends Backbone.Collection\r
- \r
- initialize: (models, options) ->\r
- @model = options['model']\r
- @action = options['action']\r
- @params = options['params']\r
- \r
- @url = '/' + @action.url(@params)\r
- \r
class Pettanr.AppController\r
constructor: () ->\r
@params = {}\r
def filer_list
set_list
- list_result = @list.open(@operators)
- @items = list_result.items
+ @items = @list.items
respond_to do |format|
format.html {
- @filer = Locmare::Filer.new @list.item_name, list_result.items, list_result, :default, @operators
+ @filer = Locmare::Filer.new @list.item_name, @items, @list.page_status, @operators
render @filer.template_name, :locals => {
:filer => @filer
}
}
- format.json { render json: @items.map{|i| i.attributes}.to_json }
- # rails3.2 has problem
- # y method defined as private
- # attribute y conflict at PanelPicture, balloon ..etc
- # use i.attributes[name]
- # format.json { render json: @items.to_json }
+ format.json {
+ res = {
+ :page_status => @list.page_status.to_hash,
+ # rails3.2 has problem
+ # y method defined as private
+ # attribute y conflict at PanelPicture, balloon ..etc
+ # use i.attributes[name]
+ :list => @items.map{|i| i.attributes}
+ # :list => @items.to_json
+ }
+ render json: res.to_json
+ }
format.atom
format.rss
end
def children_html_format format
format.html {
- @filer = Locmare::Filer.new Folder.item_name, @item.children, nil, :none, @operators
+ @filer = Locmare::Filer.new Folder.item_name, @item.children, nil, @operators
render :action => :show
}
end
<div class="filer">
<%= render filer.header.template_name, :header => filer.header %>
<%= render filer.body.template_name, :body => filer.body %>
- <%= render filer.pager.template_name, :pager => filer.pager %>
+ <% if filer.page_status and filer.page_status.pageable? %>
+ <% pager = filer.page_status.pager %>
+ <%= render pager.template_name, :pager => pager %>
+ <% end %>
</div>
+++ /dev/null
-<% if pager.paginate %>
- <%= paginate(pager.paginate) %>
-<% end %>
+++ /dev/null
-<div>
- <%= link_to 'more', pager.api_path %>
-</div>
--- /dev/null
+<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
+<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>
class Filer
include FilerModule
- attr :manifest, :item_name, :items, :list_result, :pager_type, :operators, :template_dir,
- :header, :body, :pager
+ attr :manifest, :item_name, :items, :page_status, :operators, :template_dir,
+ :header, :body
- def initialize item_name, items, list_result, pager_type, operators
+ def initialize item_name, items, page_status, operators
@item_name = item_name
@items = items
- @list_result = list_result
- @pager_type = pager_type.to_s
+ @page_status = page_status
@operators = operators
@manifest = LocalManifest.manifest.filers[@item_name]
@template_dir = 'templates/r/filer/'
@header = Header.new self
@body = self.mybody.new self
- self.init_pager
- end
-
- def init_pager
- @pager = self.class.pager[@pager_type].new self
- end
-
- def self.pager
- {'none' => NonePager, 'default' => DefaultPager, 'more' => MorePager}
end
def model
require_dependency "locmare/list_group/list/through_filter"
require_dependency "locmare/list_group/list/foreign_filter"
require_dependency "locmare/list_group/list/play"
+require_dependency "locmare/list_group/lib"
module Locmare
class ListGroup
include ListGroupModule
+ include LibModule
def self.types
{
--- /dev/null
+require_dependency "locmare/list_group/lib/pager"
+require_dependency "locmare/list_group/lib/page_status"
--- /dev/null
+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
+
+ def pager
+ @pager ||= ::Locmare::ListGroupModule::LibModule::Pager::Offset.new(self, @options)
+ end
+
+ def offset
+ return @offset if @offset
+ @offset = PageStatus.offset(@options).to_i
+ @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
+ {
+ :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
+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
module Locmare
module ListGroupModule
class Base
- class ListResult
- attr :list, :items, :count, :paginate
-
- def initialize list, items, count, paginate, operators
- @list = list
- @items = items
- @count = count # total count
- @paginate = paginate
- @operators = operators
- end
-
- def path
- @list.action_manifest.url @list.options
- end
-
- end
-
attr :list_group_name, :list_name, :options, :item_name,
:controller_manifest, :action_manifest, :list_manifest, :model,
- :count
+ :page_status
+
def initialize list_group_name, list_name, operators, options = {}
@list_group_name = list_group_name
@list_name = list_name
end
def init
- self.set_count
- self.set_offset
- self.set_limit
+ @page_status = LibModule::PageStatus.load self, self.total, @options
+ self.boost items
end
def model_name
@model.model_name
end
- def set_offset
- if prm = @options['offset'] || @options[:offset]
- @offset = prm.to_i
- @offset = @count - 1 if @offset >= @count
- @offset = @count - @offset.abs if @offset < 0
- @offset = 0 if @offset < 0
- offset
- else
- @offset = (self.fixed_page - 1) * self.fixed_page_size
- end
- @offset
- end
-
- def limit?
+ def limited?
self.max_page_size > 0
end
- def unlimit?
- !limit?
- end
-
- def fixed_page
- page = self.opt_page.to_i
- page = 1 if page < 1
- page
- end
-
- def fixed_page_size
- page_size = self.opt_page_size || self.default_page_size
- page_size = self.max_page_size if self.limit? and (page_size > self.max_page_size)
- page_size
- end
-
- def set_limit
- prm = self.opt_page_size || self.opt_count
- @limit = prm.to_i
- if self.max_page_size > 0
- @limit = self.max_page_size if @limit > self.max_page_size
- else # unlimited api
- @limit = @count if @limit > @count
- end
- @limit = self.default_page_size if @limit < 1
- @limit
- end
-
- def opt_page
- n = @options['page'] || @options[:page]
- n ? n.to_i : nil
- end
-
- def opt_page_size
- n = @options['page_size'] || @options[:page_size]
- n ? n.to_i : nil
- end
-
- def opt_count
- n = @options['count'] || @options[:count]
- n ? n.to_i : nil
+ def unlimited?
+ !self.limited?
end
def default_page_size
end
def items
- @model.where(
+ @items ||= @model.where(
self.where_condition
).includes(
self.include_hash
).order(
self.order_by
- ).offset(@offset).limit(@limit)
+ ).offset(@page_status.offset).limit(@page_status.limit)
end
- def set_count
- @count = @model.where(
+ def total
+ @model.where(
self.where_condition
).includes(
self.include_hash
).count
- end
-
- def paginate count
- c = count ? count.to_i : 0
- Kaminari.paginate_array(Array.new(c, nil)).page(self.fixed_page).per(self.fixed_page_size)
+ # return string : =>"25"
end
def boost_manifests
end
end
- def open operators
- items = self.items
- pg = if limit?
- self.paginate @count
- else
- nil
- end
- self.boost items
- ListResult.new self, items, @count, pg, @operators
- end
-
end
end
rescue ActiveRecord::RecordNotFound, ActiveRecord::Forbidden
r = []
end
- ::Locmare::Filer.new self.parent_model.item_name, r, nil, :none, self.profiler.operators
+ ::Locmare::Filer.new(
+ self.parent_model.item_name, r,
+ nil, self.profiler.operators
+ )
end
def model_manifest
self.profiler.operators,
{:id => self.item.id, :page => 1, :page_size => 3}
)
- list_result = list.open(self.profiler.operators)
- items = list_result.items
- ::Locmare::Filer.new self.has_many_model.item_name, items, list_result, :more, self.profiler.operators
+ ::Locmare::Filer.new(
+ self.has_many_model.item_name, list.items,
+ list.page_status, self.profiler.operators
+ )
end
def profiler
self.profiler.operators,
{:id => self.item.id}
)
- list_result = list.open(self.profiler.operators)
- items = list_result.items
- ::Locmare::Filer.new self.has_one_model.item_name, items, nil, :none, self.profiler.operators
+ ::Locmare::Filer.new(
+ self.has_one_model.item_name, list.items,
+ nil, self.profiler.operators
+ )
end
def profiler
end
def filer
- Locmare::Filer.new @profiler.item_name, [@profiler.item], nil, :none, @profiler.operators
+ Locmare::Filer.new(
+ @profiler.item_name, [@profiler.item],
+ nil, @profiler.operators
+ )
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