OSDN Git Service

change page status for offset
authoryasushiito <yas@pen-chan.jp>
Sun, 9 Nov 2014 00:48:29 +0000 (09:48 +0900)
committeryasushiito <yas@pen-chan.jp>
Sun, 9 Nov 2014 00:48:29 +0000 (09:48 +0900)
47 files changed:
app/assets/javascripts/ap.js
app/assets/javascripts/locmare/list_group/list/base.js.coffee
app/assets/javascripts/models/admin.js.coffee
app/assets/javascripts/models/author.js.coffee
app/assets/javascripts/models/balloon.js.coffee
app/assets/javascripts/models/comic.js.coffee
app/assets/javascripts/models/comic_story.js.coffee
app/assets/javascripts/models/folder.js.coffee
app/assets/javascripts/models/ground_color.js.coffee
app/assets/javascripts/models/ground_picture.js.coffee
app/assets/javascripts/models/license.js.coffee
app/assets/javascripts/models/license_group.js.coffee
app/assets/javascripts/models/original_picture_license.js.coffee
app/assets/javascripts/models/original_picture_license_group.js.coffee
app/assets/javascripts/models/panel.js.coffee
app/assets/javascripts/models/panel_picture.js.coffee
app/assets/javascripts/models/resource_picture.js.coffee
app/assets/javascripts/models/scroll.js.coffee
app/assets/javascripts/models/scroll_panel.js.coffee
app/assets/javascripts/models/sheet.js.coffee
app/assets/javascripts/models/sheet_panel.js.coffee
app/assets/javascripts/models/speech_balloon.js.coffee
app/assets/javascripts/models/speech_balloon_template.js.coffee
app/assets/javascripts/models/story.js.coffee
app/assets/javascripts/models/story_sheet.js.coffee
app/assets/javascripts/models/system_picture.js.coffee
app/assets/javascripts/models/writing_format.js.coffee
app/assets/javascripts/pettanr.js.coffee
app/controllers/application_controller.rb
app/controllers/folders_controller.rb
app/views/templates/r/filer/_filer.html.erb
app/views/templates/r/filer/pager/_default.html.erb [deleted file]
app/views/templates/r/filer/pager/_more.html.erb [deleted file]
app/views/templates/r/filer/pager/_none.html.erb [deleted file]
app/views/templates/r/pager/_default.html.erb [new file with mode: 0644]
app/views/templates/r/pager/_offset.html.erb [new file with mode: 0644]
lib/locmare/filer.rb
lib/locmare/list_group.rb
lib/locmare/list_group/lib.rb [new file with mode: 0644]
lib/locmare/list_group/lib/page_status.rb [new file with mode: 0644]
lib/locmare/list_group/lib/pager.rb [new file with mode: 0644]
lib/locmare/list_group/list/base.rb
lib/locmare/profiler/association/belongs_to.rb
lib/locmare/profiler/association/has_many.rb
lib/locmare/profiler/association/has_one.rb
lib/locmare/profiler/header.rb
lib/manifest/controller/action/base.rb

index 92d5646..02dbcd5 100644 (file)
 //= require ./pettanr/picture
 //= require ./pettanr/pettan_imager
 //= require ./pettanr/operator
-//= require backbone.fetch-cache
+//= require ./backbone.fetch-cache
 //= require main
index b2683ed..d1644ac 100644 (file)
@@ -18,6 +18,10 @@ class Locmare.ListGroupModule.Base extends Backbone.Collection
     @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
index 3ed7399..7b1cf05 100644 (file)
@@ -8,6 +8,3 @@ class Pettanr.Admin extends Backbone.Model
     if @id\r
       @url = @url + @id\r
   \r
-class Pettanr.Admin.Collection extends Backbone.Collection\r
-  model: Pettanr.Admin\r
-  url: '/admins'\r
index ff93aee..4c8745e 100644 (file)
@@ -19,6 +19,3 @@ class Pettanr.Author extends Peta.Owner
     if @id\r
       @url = @url + @id\r
   \r
-class Pettanr.Author.Collection extends Backbone.Collection\r
-  model: Pettanr.Author\r
-  url: '/authors'\r
index 40bf22d..f1b8eab 100644 (file)
@@ -38,7 +38,3 @@ class Pettanr.Balloon extends Peta.Element
     if @id\r
       @url = @url + @id\r
   \r
-class Pettanr.Balloon.Collection extends Backbone.Collection\r
-  model: Pettanr.Balloon\r
-  url: '/balloons'\r
-\r
index 8cb686a..3699848 100644 (file)
@@ -31,6 +31,3 @@ class Pettanr.Comic extends Peta.Binder
     if @id\r
       @url = @url + @id\r
   \r
-class Pettanr.Comic.Collection extends Backbone.Collection\r
-  model: Pettanr.Comic\r
-  url: '/comics'\r
index bc8b015..c8cfc2b 100644 (file)
@@ -33,6 +33,3 @@ class Pettanr.ComicStory extends Peta.Leaf
     if @id\r
       @url = @url + @id\r
   \r
-class Pettanr.ComicStory.Collection extends Backbone.Collection\r
-  model: Pettanr.ComicStory\r
-  url: '/comic_stories'\r
index 554856e..fe91006 100644 (file)
@@ -39,9 +39,6 @@ class Pettanr.FolderWatch extends Pettanr.Folder
   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
index 46971d8..09cfeaf 100644 (file)
@@ -25,7 +25,3 @@ class Pettanr.GroundColor extends Peta.Element
     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
index bc561ee..ccadfa9 100644 (file)
@@ -51,7 +51,3 @@ class Pettanr.GroundPicture extends Peta.Element
     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
index 47ec960..c5f32eb 100644 (file)
@@ -29,10 +29,6 @@ class Pettanr.License extends Peta.SystemResource
     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
index 5c22091..75980bf 100644 (file)
@@ -15,6 +15,3 @@ class Pettanr.LicenseGroup extends Peta.Template
     if @id\r
       @url = @url + @id\r
   \r
-class Pettanr.LicenseGroup.Collection extends Backbone.Collection\r
-  model: Pettanr.LicenseGroup\r
-  url: '/license_groups'\r
index 64726b3..c8d5622 100644 (file)
@@ -13,6 +13,3 @@ class Pettanr.OriginalPictureLicense extends Peta.Item
     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
index 44cdba3..dd87d73 100644 (file)
@@ -13,6 +13,3 @@ class Pettanr.OriginalPictureLicenseGroup extends Peta.Item
     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
index a588f76..1f0c97c 100644 (file)
@@ -56,7 +56,3 @@ class Pettanr.Panel extends Peta.Root
     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
index 1530475..3c3003d 100644 (file)
@@ -62,7 +62,3 @@ class Pettanr.PanelPicture extends Peta.Element
     if @id\r
       @url = @url + @id\r
   \r
-class Pettanr.PanelPictures extends Backbone.Collection\r
-  model: Pettanr.PanelPicture\r
-  url: '/panel_pictures/'\r
-  \r
index 42409da..cc05204 100644 (file)
@@ -64,6 +64,3 @@ class Pettanr.ResourcePicture extends Peta.Content
     if @id\r
       @url = @url + @id\r
   \r
-class Pettanr.ResourcePicture.Collection extends Backbone.Collection\r
-  model: Pettanr.ResourcePicture\r
-  url: '/resource_pictures/'\r
index a40b2ba..c312605 100644 (file)
@@ -24,6 +24,3 @@ class Pettanr.Scroll extends Peta.Binder
     if @id\r
       @url = @url + @id\r
   \r
-class Pettanr.Scroll.Collection extends Backbone.Collection\r
-  model: Pettanr.Scroll\r
-  url: '/scrolls'\r
index a4ed1fd..d2ab014 100644 (file)
@@ -24,6 +24,3 @@ class Pettanr.ScrollPanel extends Peta.Leaf
     if @id\r
       @url = @url + @id\r
   \r
-class Pettanr.ScrollPanel.Collection extends Backbone.Collection\r
-  model: Pettanr.ScrollPanel\r
-  url: '/scroll_panels'\r
index 6b1c72b..1c377ad 100644 (file)
@@ -29,6 +29,3 @@ class Pettanr.Sheet extends Peta.Root
     if @id\r
       @url = @url + @id\r
   \r
-class Pettanr.Sheet.Collection extends Backbone.Collection\r
-  model: Pettanr.Sheet\r
-  url: '/sheets'\r
index b2e689f..d5fcf9c 100644 (file)
@@ -27,6 +27,3 @@ class Pettanr.SheetPanel extends Peta.Leaf
     if @id\r
       @url = @url + @id\r
   \r
-class Pettanr.SheetPanel.Collection extends Backbone.Collection\r
-  model: Pettanr.SheetPanel\r
-  url: '/sheet_panels'\r
index ecb19a8..23e821b 100644 (file)
@@ -39,7 +39,3 @@ class Pettanr.SpeechBalloon extends Peta.Element
     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
index 9fcc603..f802146 100644 (file)
@@ -26,6 +26,3 @@ class Pettanr.SpeechBalloonTemplate extends Peta.Template
     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
index 625cec7..df37247 100644 (file)
@@ -29,6 +29,3 @@ class Pettanr.Story extends Peta.Binder
     if @id\r
       @url = @url + @id\r
   \r
-class Pettanr.Story.Collection extends Backbone.Collection\r
-  model: Pettanr.Story\r
-  url: '/stories'\r
index 55d7ee4..b7e9b75 100644 (file)
@@ -24,6 +24,3 @@ class Pettanr.StorySheet extends Peta.Leaf
     if @id\r
       @url = @url + @id\r
   \r
-class Pettanr.StorySheet.Collection extends Backbone.Collection\r
-  model: Pettanr.StorySheet\r
-  url: '/story_sheets'\r
index 3ec4833..024469d 100644 (file)
@@ -43,6 +43,3 @@ class Pettanr.SystemPicture extends Peta.SystemResource
     if @id\r
       @url = @url + @id\r
   \r
-class Pettanr.SystemPicture.Collection extends Backbone.Collection\r
-  model: Pettanr.SystemPicture\r
-  url: '/system_pictures'\r
index b36b8b2..7b9f1da 100644 (file)
@@ -23,7 +23,3 @@ class Pettanr.WritingFormat extends Peta.Template
     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
index 4a7a0a3..773f6c6 100644 (file)
@@ -99,15 +99,6 @@ class Pettanr
   @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
index 8fe618b..c6c83a9 100644 (file)
@@ -119,21 +119,26 @@ class ApplicationController < ActionController::Base
   
   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
index 02e2ab2..07ae91a 100644 (file)
@@ -34,7 +34,7 @@ class FoldersController < ApplicationController
   
   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
index 7c5f52e..50d9e8d 100644 (file)
@@ -1,5 +1,8 @@
 <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>
diff --git a/app/views/templates/r/filer/pager/_default.html.erb b/app/views/templates/r/filer/pager/_default.html.erb
deleted file mode 100644 (file)
index 938994e..0000000
+++ /dev/null
@@ -1,3 +0,0 @@
-<% if pager.paginate %>
-  <%= paginate(pager.paginate) %>
-<% end %>
diff --git a/app/views/templates/r/filer/pager/_more.html.erb b/app/views/templates/r/filer/pager/_more.html.erb
deleted file mode 100644 (file)
index dfa3d9a..0000000
+++ /dev/null
@@ -1,3 +0,0 @@
-<div>
-  <%= link_to 'more', pager.api_path %>
-</div>
diff --git a/app/views/templates/r/filer/pager/_none.html.erb b/app/views/templates/r/filer/pager/_none.html.erb
deleted file mode 100644 (file)
index e69de29..0000000
diff --git a/app/views/templates/r/pager/_default.html.erb b/app/views/templates/r/pager/_default.html.erb
new file mode 100644 (file)
index 0000000..27cdf83
--- /dev/null
@@ -0,0 +1,38 @@
+<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>
diff --git a/app/views/templates/r/pager/_offset.html.erb b/app/views/templates/r/pager/_offset.html.erb
new file mode 100644 (file)
index 0000000..6ff7550
--- /dev/null
@@ -0,0 +1,38 @@
+<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>
index 0df3492..610f0c0 100644 (file)
@@ -5,28 +5,18 @@ module Locmare
   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
index eae27aa..dabc160 100644 (file)
@@ -6,9 +6,11 @@ require_dependency "locmare/list_group/list/filter"
 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
       {
diff --git a/lib/locmare/list_group/lib.rb b/lib/locmare/list_group/lib.rb
new file mode 100644 (file)
index 0000000..709d8d4
--- /dev/null
@@ -0,0 +1,2 @@
+require_dependency "locmare/list_group/lib/pager"
+require_dependency "locmare/list_group/lib/page_status"
diff --git a/lib/locmare/list_group/lib/page_status.rb b/lib/locmare/list_group/lib/page_status.rb
new file mode 100644 (file)
index 0000000..843a877
--- /dev/null
@@ -0,0 +1,216 @@
+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
diff --git a/lib/locmare/list_group/lib/pager.rb b/lib/locmare/list_group/lib/pager.rb
new file mode 100644 (file)
index 0000000..cf5d4d0
--- /dev/null
@@ -0,0 +1,142 @@
+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
index 7c900a0..e899fd4 100644 (file)
@@ -1,26 +1,10 @@
 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
@@ -43,73 +27,20 @@ module Locmare
       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
@@ -161,26 +92,22 @@ module Locmare
       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
@@ -198,17 +125,6 @@ module Locmare
         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
index a40cf36..ea06aaa 100644 (file)
@@ -27,7 +27,10 @@ module Locmare
           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
index 62cfbce..e611743 100644 (file)
@@ -23,9 +23,10 @@ module Locmare
             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
index 954554c..e491987 100644 (file)
@@ -23,9 +23,10 @@ module Locmare
             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
index 956b025..3b69a2a 100644 (file)
@@ -7,7 +7,10 @@ module Locmare
       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
index e7488e5..ebed55a 100644 (file)
@@ -25,6 +25,8 @@ module Manifest
           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