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)
13 files changed:
1  2 
app/assets/javascripts/ap.js
app/assets/javascripts/models/ground_color.js.coffee
app/assets/javascripts/models/ground_picture.js.coffee
app/assets/javascripts/models/panel_picture.js.coffee
app/assets/javascripts/models/speech_balloon.js.coffee
app/views/templates/r/filer/pager/_default.html.erb
app/views/templates/r/filer/pager/_more.html.erb
app/views/templates/r/filer/pager/_none.html.erb
app/views/templates/r/pager/_default.html.erb
app/views/templates/r/pager/_offset.html.erb
lib/locmare/list_group/lib/page_status.rb
lib/locmare/list_group/lib/pager.rb
lib/manifest/controller/action/base.rb

Simple merge
diff --cc app/views/templates/r/filer/pager/_default.html.erb
index 938994e,938994e..0000000
deleted file mode 100644,100644
+++ /dev/null
@@@ -1,3 -1,3 +1,0 @@@
--<% if pager.paginate %>
--  <%= paginate(pager.paginate) %>
--<% end %>
diff --cc app/views/templates/r/filer/pager/_more.html.erb
index dfa3d9a,dfa3d9a..0000000
deleted file mode 100644,100644
+++ /dev/null
@@@ -1,3 -1,3 +1,0 @@@
--<div>
--  <%= link_to 'more', pager.api_path %>
--</div>
diff --cc app/views/templates/r/filer/pager/_none.html.erb
index e69de29,e69de29..0000000
deleted file mode 100644,100644
+++ /dev/null
index 7804dc6,0000000..27cdf83
mode 100644,000000..100644
--- /dev/null
@@@ -1,38 -1,0 +1,38 @@@
-       <%= 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>
index 0000000,0000000..6ff7550
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,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 4176ee1,0000000..843a877
mode 100644,000000..100644
--- /dev/null
@@@ -1,180 -1,0 +1,216 @@@
-           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
index f904e78,0000000..cf5d4d0
mode 100644,000000..100644
--- /dev/null
@@@ -1,70 -1,0 +1,142 @@@
-             @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
@@@ -25,6 -25,6 +25,8 @@@ module Manifes
            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