From 3f4cd8c9a4ce4336a659d7ad7f7093c0c1cd6ee9 Mon Sep 17 00:00:00 2001 From: yasushiito Date: Sat, 8 Nov 2014 09:20:23 +0900 Subject: [PATCH] change page status --- app/assets/javascripts/ap.js | 2 +- .../locmare/list_group/list/base.js.coffee | 4 + app/assets/javascripts/models/admin.js.coffee | 3 - app/assets/javascripts/models/author.js.coffee | 3 - app/assets/javascripts/models/balloon.js.coffee | 4 - app/assets/javascripts/models/comic.js.coffee | 3 - .../javascripts/models/comic_story.js.coffee | 3 - app/assets/javascripts/models/folder.js.coffee | 3 - .../javascripts/models/ground_color.js.coffee | 4 - .../javascripts/models/ground_picture.js.coffee | 4 - app/assets/javascripts/models/license.js.coffee | 4 - .../javascripts/models/license_group.js.coffee | 3 - .../models/original_picture_license.js.coffee | 3 - .../original_picture_license_group.js.coffee | 3 - app/assets/javascripts/models/panel.js.coffee | 3 - .../javascripts/models/panel_picture.js.coffee | 4 - .../javascripts/models/resource_picture.js.coffee | 3 - app/assets/javascripts/models/scroll.js.coffee | 3 - .../javascripts/models/scroll_panel.js.coffee | 3 - app/assets/javascripts/models/sheet.js.coffee | 3 - .../javascripts/models/sheet_panel.js.coffee | 3 - .../javascripts/models/speech_balloon.js.coffee | 4 - .../models/speech_balloon_template.js.coffee | 3 - app/assets/javascripts/models/story.js.coffee | 3 - .../javascripts/models/story_sheet.js.coffee | 3 - .../javascripts/models/system_picture.js.coffee | 3 - .../javascripts/models/writing_format.js.coffee | 4 - app/assets/javascripts/pettanr.js.coffee | 9 -- app/controllers/application_controller.rb | 23 +-- app/controllers/folders_controller.rb | 2 +- app/views/templates/r/filer/_filer.html.erb | 5 +- app/views/templates/r/pager/_default.html.erb | 38 +++++ lib/locmare/filer.rb | 18 +-- lib/locmare/list_group.rb | 2 + lib/locmare/list_group/lib.rb | 2 + lib/locmare/list_group/lib/page_status.rb | 180 +++++++++++++++++++++ lib/locmare/list_group/lib/pager.rb | 70 ++++++++ lib/locmare/list_group/list/base.rb | 108 ++----------- lib/locmare/profiler/association/belongs_to.rb | 5 +- lib/locmare/profiler/association/has_many.rb | 7 +- lib/locmare/profiler/association/has_one.rb | 7 +- lib/locmare/profiler/header.rb | 5 +- 42 files changed, 348 insertions(+), 221 deletions(-) create mode 100644 app/views/templates/r/pager/_default.html.erb create mode 100644 lib/locmare/list_group/lib.rb create mode 100644 lib/locmare/list_group/lib/page_status.rb create mode 100644 lib/locmare/list_group/lib/pager.rb diff --git a/app/assets/javascripts/ap.js b/app/assets/javascripts/ap.js index 9ecd8928..68575eec 100644 --- a/app/assets/javascripts/ap.js +++ b/app/assets/javascripts/ap.js @@ -322,5 +322,5 @@ //= require ./pettanr/picture //= require ./pettanr/pettan_imager //= require ./pettanr/operator -//= require backbone.fetch-cache +//= require ./backbone.fetch-cache //= require main diff --git a/app/assets/javascripts/locmare/list_group/list/base.js.coffee b/app/assets/javascripts/locmare/list_group/list/base.js.coffee index b2683ed6..d1644ac7 100644 --- a/app/assets/javascripts/locmare/list_group/list/base.js.coffee +++ b/app/assets/javascripts/locmare/list_group/list/base.js.coffee @@ -18,6 +18,10 @@ class Locmare.ListGroupModule.Base extends Backbone.Collection @model_class = Manifest.item_name_to_model @item_name @table_name = @model_class.table_name() + parse: (res) -> + @s = res.page_status + res.list + page_number: (prm = null) -> page = Pettanr.to_i(parseInt(prm)) page = 1 if page < 1 diff --git a/app/assets/javascripts/models/admin.js.coffee b/app/assets/javascripts/models/admin.js.coffee index 3ed7399d..7b1cf056 100644 --- a/app/assets/javascripts/models/admin.js.coffee +++ b/app/assets/javascripts/models/admin.js.coffee @@ -8,6 +8,3 @@ class Pettanr.Admin extends Backbone.Model if @id @url = @url + @id -class Pettanr.Admin.Collection extends Backbone.Collection - model: Pettanr.Admin - url: '/admins' diff --git a/app/assets/javascripts/models/author.js.coffee b/app/assets/javascripts/models/author.js.coffee index ff93aee9..4c8745e7 100644 --- a/app/assets/javascripts/models/author.js.coffee +++ b/app/assets/javascripts/models/author.js.coffee @@ -19,6 +19,3 @@ class Pettanr.Author extends Peta.Owner if @id @url = @url + @id -class Pettanr.Author.Collection extends Backbone.Collection - model: Pettanr.Author - url: '/authors' diff --git a/app/assets/javascripts/models/balloon.js.coffee b/app/assets/javascripts/models/balloon.js.coffee index 40bf22d0..f1b8eab8 100644 --- a/app/assets/javascripts/models/balloon.js.coffee +++ b/app/assets/javascripts/models/balloon.js.coffee @@ -38,7 +38,3 @@ class Pettanr.Balloon extends Peta.Element if @id @url = @url + @id -class Pettanr.Balloon.Collection extends Backbone.Collection - model: Pettanr.Balloon - url: '/balloons' - diff --git a/app/assets/javascripts/models/comic.js.coffee b/app/assets/javascripts/models/comic.js.coffee index 8cb686aa..3699848c 100644 --- a/app/assets/javascripts/models/comic.js.coffee +++ b/app/assets/javascripts/models/comic.js.coffee @@ -31,6 +31,3 @@ class Pettanr.Comic extends Peta.Binder if @id @url = @url + @id -class Pettanr.Comic.Collection extends Backbone.Collection - model: Pettanr.Comic - url: '/comics' diff --git a/app/assets/javascripts/models/comic_story.js.coffee b/app/assets/javascripts/models/comic_story.js.coffee index bc8b0153..c8cfc2bc 100644 --- a/app/assets/javascripts/models/comic_story.js.coffee +++ b/app/assets/javascripts/models/comic_story.js.coffee @@ -33,6 +33,3 @@ class Pettanr.ComicStory extends Peta.Leaf if @id @url = @url + @id -class Pettanr.ComicStory.Collection extends Backbone.Collection - model: Pettanr.ComicStory - url: '/comic_stories' diff --git a/app/assets/javascripts/models/folder.js.coffee b/app/assets/javascripts/models/folder.js.coffee index 554856e7..fe910066 100644 --- a/app/assets/javascripts/models/folder.js.coffee +++ b/app/assets/javascripts/models/folder.js.coffee @@ -39,9 +39,6 @@ class Pettanr.FolderWatch extends Pettanr.Folder initialize: () -> super() @url = @url + '?ref=1' -class Pettanr.Folder.Collection extends Backbone.Collection - model: Pettanr.Folder - url: 'folders' class Pettanr.Folder.Root extends Pettanr.Folder model: Pettanr.Folder url: '/folders/root?ref=1' diff --git a/app/assets/javascripts/models/ground_color.js.coffee b/app/assets/javascripts/models/ground_color.js.coffee index 7839866f..3643f1f4 100644 --- a/app/assets/javascripts/models/ground_color.js.coffee +++ b/app/assets/javascripts/models/ground_color.js.coffee @@ -22,7 +22,3 @@ class Pettanr.GroundColor extends Peta.Element if @id @url = @url + @id -class Pettanr.GroundColor.Collection extends Backbone.Collection - model: Pettanr.GroundColor - url: '/ground_colors/' - diff --git a/app/assets/javascripts/models/ground_picture.js.coffee b/app/assets/javascripts/models/ground_picture.js.coffee index 219127a0..e4e2fb92 100644 --- a/app/assets/javascripts/models/ground_picture.js.coffee +++ b/app/assets/javascripts/models/ground_picture.js.coffee @@ -48,7 +48,3 @@ class Pettanr.GroundPicture extends Peta.Element if @id @url = @url + @id -class Pettanr.GroundPicture.Collection extends Backbone.Collection - model: Pettanr.GroundPicture - url: '/ground_pictures/' - diff --git a/app/assets/javascripts/models/license.js.coffee b/app/assets/javascripts/models/license.js.coffee index 47ec960e..c5f32eba 100644 --- a/app/assets/javascripts/models/license.js.coffee +++ b/app/assets/javascripts/models/license.js.coffee @@ -29,10 +29,6 @@ class Pettanr.License extends Peta.SystemResource if @id @url = @url + @id -class Pettanr.License.Collection extends Backbone.Collection - model: Pettanr.License - url: '/licenses' - class Pettanr.License.Caption extends Backbone.View tagName: 'span' initialize: (options) -> diff --git a/app/assets/javascripts/models/license_group.js.coffee b/app/assets/javascripts/models/license_group.js.coffee index 5c22091f..75980bf3 100644 --- a/app/assets/javascripts/models/license_group.js.coffee +++ b/app/assets/javascripts/models/license_group.js.coffee @@ -15,6 +15,3 @@ class Pettanr.LicenseGroup extends Peta.Template if @id @url = @url + @id -class Pettanr.LicenseGroup.Collection extends Backbone.Collection - model: Pettanr.LicenseGroup - url: '/license_groups' diff --git a/app/assets/javascripts/models/original_picture_license.js.coffee b/app/assets/javascripts/models/original_picture_license.js.coffee index 64726b3d..c8d5622a 100644 --- a/app/assets/javascripts/models/original_picture_license.js.coffee +++ b/app/assets/javascripts/models/original_picture_license.js.coffee @@ -13,6 +13,3 @@ class Pettanr.OriginalPictureLicense extends Peta.Item if @id @url = @url + @id -class Pettanr.OriginalPictureLicense.Collection extends Backbone.Collection - model: Pettanr.OriginalPictureLicense - url: '/original_picture_licenses' diff --git a/app/assets/javascripts/models/original_picture_license_group.js.coffee b/app/assets/javascripts/models/original_picture_license_group.js.coffee index 44cdba31..dd87d73d 100644 --- a/app/assets/javascripts/models/original_picture_license_group.js.coffee +++ b/app/assets/javascripts/models/original_picture_license_group.js.coffee @@ -13,6 +13,3 @@ class Pettanr.OriginalPictureLicenseGroup extends Peta.Item if @id @url = @url + @id -class Pettanr.OriginalPictureLicenseGroup.Collection extends Backbone.Collection - model: Pettanr.OriginalPictureLicenseGroup - url: '/original_picture_license_groups' diff --git a/app/assets/javascripts/models/panel.js.coffee b/app/assets/javascripts/models/panel.js.coffee index 40a99a1a..1f0c97c7 100644 --- a/app/assets/javascripts/models/panel.js.coffee +++ b/app/assets/javascripts/models/panel.js.coffee @@ -56,6 +56,3 @@ class Pettanr.Panel extends Peta.Root if options.with_elements @url = @url + '?with_elements=true' -class Pettanr.Panels extends Backbone.Collection - model: Pettanr.Panel - url: '/panels/' diff --git a/app/assets/javascripts/models/panel_picture.js.coffee b/app/assets/javascripts/models/panel_picture.js.coffee index 00ab9926..c1f2068b 100644 --- a/app/assets/javascripts/models/panel_picture.js.coffee +++ b/app/assets/javascripts/models/panel_picture.js.coffee @@ -59,7 +59,3 @@ class Pettanr.PanelPicture extends Peta.Element if @id @url = @url + @id -class Pettanr.PanelPictures extends Backbone.Collection - model: Pettanr.PanelPicture - url: '/panel_pictures/' - diff --git a/app/assets/javascripts/models/resource_picture.js.coffee b/app/assets/javascripts/models/resource_picture.js.coffee index 42409da7..cc052043 100644 --- a/app/assets/javascripts/models/resource_picture.js.coffee +++ b/app/assets/javascripts/models/resource_picture.js.coffee @@ -64,6 +64,3 @@ class Pettanr.ResourcePicture extends Peta.Content if @id @url = @url + @id -class Pettanr.ResourcePicture.Collection extends Backbone.Collection - model: Pettanr.ResourcePicture - url: '/resource_pictures/' diff --git a/app/assets/javascripts/models/scroll.js.coffee b/app/assets/javascripts/models/scroll.js.coffee index a40b2baf..c3126058 100644 --- a/app/assets/javascripts/models/scroll.js.coffee +++ b/app/assets/javascripts/models/scroll.js.coffee @@ -24,6 +24,3 @@ class Pettanr.Scroll extends Peta.Binder if @id @url = @url + @id -class Pettanr.Scroll.Collection extends Backbone.Collection - model: Pettanr.Scroll - url: '/scrolls' diff --git a/app/assets/javascripts/models/scroll_panel.js.coffee b/app/assets/javascripts/models/scroll_panel.js.coffee index a4ed1fd0..d2ab0142 100644 --- a/app/assets/javascripts/models/scroll_panel.js.coffee +++ b/app/assets/javascripts/models/scroll_panel.js.coffee @@ -24,6 +24,3 @@ class Pettanr.ScrollPanel extends Peta.Leaf if @id @url = @url + @id -class Pettanr.ScrollPanel.Collection extends Backbone.Collection - model: Pettanr.ScrollPanel - url: '/scroll_panels' diff --git a/app/assets/javascripts/models/sheet.js.coffee b/app/assets/javascripts/models/sheet.js.coffee index 6b1c72bc..1c377ad8 100644 --- a/app/assets/javascripts/models/sheet.js.coffee +++ b/app/assets/javascripts/models/sheet.js.coffee @@ -29,6 +29,3 @@ class Pettanr.Sheet extends Peta.Root if @id @url = @url + @id -class Pettanr.Sheet.Collection extends Backbone.Collection - model: Pettanr.Sheet - url: '/sheets' diff --git a/app/assets/javascripts/models/sheet_panel.js.coffee b/app/assets/javascripts/models/sheet_panel.js.coffee index b2e689f5..d5fcf9cb 100644 --- a/app/assets/javascripts/models/sheet_panel.js.coffee +++ b/app/assets/javascripts/models/sheet_panel.js.coffee @@ -27,6 +27,3 @@ class Pettanr.SheetPanel extends Peta.Leaf if @id @url = @url + @id -class Pettanr.SheetPanel.Collection extends Backbone.Collection - model: Pettanr.SheetPanel - url: '/sheet_panels' diff --git a/app/assets/javascripts/models/speech_balloon.js.coffee b/app/assets/javascripts/models/speech_balloon.js.coffee index c10b7b5d..bedcfa1c 100644 --- a/app/assets/javascripts/models/speech_balloon.js.coffee +++ b/app/assets/javascripts/models/speech_balloon.js.coffee @@ -36,7 +36,3 @@ class Pettanr.SpeechBalloon extends Peta.Element if @id @url = @url + @id -class Pettanr.SpeechBalloon.Collection extends Backbone.Collection - model: Pettanr.SpeechBalloon - url: '/speech_balloons/' - diff --git a/app/assets/javascripts/models/speech_balloon_template.js.coffee b/app/assets/javascripts/models/speech_balloon_template.js.coffee index 9fcc6030..f8021461 100644 --- a/app/assets/javascripts/models/speech_balloon_template.js.coffee +++ b/app/assets/javascripts/models/speech_balloon_template.js.coffee @@ -26,6 +26,3 @@ class Pettanr.SpeechBalloonTemplate extends Peta.Template if @id @url = @url + @id -class Pettanr.SpeechBalloonTemplate.Collection extends Backbone.Collection - model: Pettanr.SpeechBalloonTemplate - url: '/speech_balloon_templates' diff --git a/app/assets/javascripts/models/story.js.coffee b/app/assets/javascripts/models/story.js.coffee index 625cec7b..df372475 100644 --- a/app/assets/javascripts/models/story.js.coffee +++ b/app/assets/javascripts/models/story.js.coffee @@ -29,6 +29,3 @@ class Pettanr.Story extends Peta.Binder if @id @url = @url + @id -class Pettanr.Story.Collection extends Backbone.Collection - model: Pettanr.Story - url: '/stories' diff --git a/app/assets/javascripts/models/story_sheet.js.coffee b/app/assets/javascripts/models/story_sheet.js.coffee index 55d7ee47..b7e9b752 100644 --- a/app/assets/javascripts/models/story_sheet.js.coffee +++ b/app/assets/javascripts/models/story_sheet.js.coffee @@ -24,6 +24,3 @@ class Pettanr.StorySheet extends Peta.Leaf if @id @url = @url + @id -class Pettanr.StorySheet.Collection extends Backbone.Collection - model: Pettanr.StorySheet - url: '/story_sheets' diff --git a/app/assets/javascripts/models/system_picture.js.coffee b/app/assets/javascripts/models/system_picture.js.coffee index 3ec4833a..024469d9 100644 --- a/app/assets/javascripts/models/system_picture.js.coffee +++ b/app/assets/javascripts/models/system_picture.js.coffee @@ -43,6 +43,3 @@ class Pettanr.SystemPicture extends Peta.SystemResource if @id @url = @url + @id -class Pettanr.SystemPicture.Collection extends Backbone.Collection - model: Pettanr.SystemPicture - url: '/system_pictures' diff --git a/app/assets/javascripts/models/writing_format.js.coffee b/app/assets/javascripts/models/writing_format.js.coffee index b36b8b23..7b9f1dac 100644 --- a/app/assets/javascripts/models/writing_format.js.coffee +++ b/app/assets/javascripts/models/writing_format.js.coffee @@ -23,7 +23,3 @@ class Pettanr.WritingFormat extends Peta.Template if @id @url = @url + @id -class Pettanr.WritingFormat.Collection extends Backbone.Collection - model: Pettanr.WritingFormat - url: '/writing_formats' - diff --git a/app/assets/javascripts/pettanr.js.coffee b/app/assets/javascripts/pettanr.js.coffee index 4a7a0a39..773f6c65 100644 --- a/app/assets/javascripts/pettanr.js.coffee +++ b/app/assets/javascripts/pettanr.js.coffee @@ -99,15 +99,6 @@ class Pettanr @cache = {} @credits = {} - class Pettanr.FilerCollection extends Backbone.Collection - - initialize: (models, options) -> - @model = options['model'] - @action = options['action'] - @params = options['params'] - - @url = '/' + @action.url(@params) - class Pettanr.AppController constructor: () -> @params = {} diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index 8fe618b9..c6c83a9c 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -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 diff --git a/app/controllers/folders_controller.rb b/app/controllers/folders_controller.rb index 02e2ab23..07ae91a8 100644 --- a/app/controllers/folders_controller.rb +++ b/app/controllers/folders_controller.rb @@ -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 diff --git a/app/views/templates/r/filer/_filer.html.erb b/app/views/templates/r/filer/_filer.html.erb index 7c5f52e6..50d9e8dc 100644 --- a/app/views/templates/r/filer/_filer.html.erb +++ b/app/views/templates/r/filer/_filer.html.erb @@ -1,5 +1,8 @@
<%= 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 %>
diff --git a/app/views/templates/r/pager/_default.html.erb b/app/views/templates/r/pager/_default.html.erb new file mode 100644 index 00000000..7804dc66 --- /dev/null +++ b/app/views/templates/r/pager/_default.html.erb @@ -0,0 +1,38 @@ + +
diff --git a/lib/locmare/filer.rb b/lib/locmare/filer.rb index 0df34928..610f0c09 100644 --- a/lib/locmare/filer.rb +++ b/lib/locmare/filer.rb @@ -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 diff --git a/lib/locmare/list_group.rb b/lib/locmare/list_group.rb index eae27aa1..dabc160e 100644 --- a/lib/locmare/list_group.rb +++ b/lib/locmare/list_group.rb @@ -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 index 00000000..709d8d4a --- /dev/null +++ b/lib/locmare/list_group/lib.rb @@ -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 index 00000000..4176ee19 --- /dev/null +++ b/lib/locmare/list_group/lib/page_status.rb @@ -0,0 +1,180 @@ +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 paginate + c = @total ? @total.to_i : 0 + end + + def offset + return @offset if @offset + @offset = PageStatus.offset(@options).to_i + @offset = self.count - 1 if @offset >= self.count + @offset = self.count - @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 + 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 + + end + + class Unlimited + attr :total, :options + + def initialize list, total, options + @list = list + @total = total + @options = options + end + + def to_hash + { + :type => :none + } + end + + def paginate + nil + end + + def offset + 0 + end + + def limit + -1 + 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 index 00000000..f904e783 --- /dev/null +++ b/lib/locmare/list_group/lib/pager.rb @@ -0,0 +1,70 @@ +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 + @current_page = @page_status.page + @per_page = @page_status.limit + @total_page = @page_status.total_page + @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] + 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 + end + + end + end +end diff --git a/lib/locmare/list_group/list/base.rb b/lib/locmare/list_group/list/base.rb index 7c900a0b..e899fd4a 100644 --- a/lib/locmare/list_group/list/base.rb +++ b/lib/locmare/list_group/list/base.rb @@ -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 diff --git a/lib/locmare/profiler/association/belongs_to.rb b/lib/locmare/profiler/association/belongs_to.rb index a40cf365..ea06aaa4 100644 --- a/lib/locmare/profiler/association/belongs_to.rb +++ b/lib/locmare/profiler/association/belongs_to.rb @@ -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 diff --git a/lib/locmare/profiler/association/has_many.rb b/lib/locmare/profiler/association/has_many.rb index 62cfbce9..e611743f 100644 --- a/lib/locmare/profiler/association/has_many.rb +++ b/lib/locmare/profiler/association/has_many.rb @@ -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 diff --git a/lib/locmare/profiler/association/has_one.rb b/lib/locmare/profiler/association/has_one.rb index 954554cf..e491987f 100644 --- a/lib/locmare/profiler/association/has_one.rb +++ b/lib/locmare/profiler/association/has_one.rb @@ -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 diff --git a/lib/locmare/profiler/header.rb b/lib/locmare/profiler/header.rb index 956b025e..3b69a2aa 100644 --- a/lib/locmare/profiler/header.rb +++ b/lib/locmare/profiler/header.rb @@ -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 -- 2.11.0