OSDN Git Service

fix:element remove func failed
[pettanr/pettanr.git] / lib / manifest / controller / action / list.rb
1 module Manifest
2   module ControllerModule
3     module ActionModule
4       class ActionList < Base
5         attr :order, :direction, :default_page_size, :max_page_size, :return_item_name
6         
7         def set_default
8           super
9           @args['direction'] ||= -1
10           @args['default_page_size'] ||= 25
11           @args['max_page_size'] ||= 100
12         end
13         
14         def init
15           super
16           @order = @args['order'] || 'updated_at'
17           @direction = @args['direction'].to_i
18           @default_page_size = @args['default_page_size']
19           @max_page_size = @args['max_page_size']
20           @return_item_name = @args['return_item_name'] || @item_name
21         end
22         
23         def a_arg_names
24           super + ['order', 'direction', 'default_page_size', 'max_page_size']
25         end
26         
27         def find options = {}
28           if has_alias_action
29             return self.alias_action.find options
30           end
31           self.finder(options).order(
32             self.order_sql(options[:order], options[:direction])
33           ).page(options[:page]).per(options[:page_size])
34         end
35         
36         def finder options = {}
37           finder_name = options[:finder] || 'find_' + @name
38           finder = if args = options[:param]
39             args = [args] unless options[:param].is_a?(Array)  # param to array
40             self.finder_model.__send__(finder_name, *args)
41           else
42             self.finder_model.__send__(finder_name)
43           end
44         end
45         
46         def finder_model
47           Manifest.manifest.models[@item_name].classify
48         end
49         
50         def return_model
51           Manifest.manifest.models[@return_item_name].classify
52         end
53         
54         def order_sql order, direction
55           order ||= self.order
56           direction ||= (self.direction < 0 ? :desc : :asc)
57           self.return_model.arel_table[order].__send__(direction)
58         end
59         
60         def page page
61           page.to_i
62           page = 1 if page < 1
63           page
64         end
65         
66         def page_size page_size
67           page_size ||= self.default_page_size
68           page_size = -1 if page_size < 0
69           page_size = self.max_page_size if page_size > self.max_page_size
70           page_size
71         end
72         
73         def limited?
74           self.max_page_size > 0
75         end
76         
77         def unlimited?
78           !self.limited?
79         end
80         
81       end
82       
83     end
84   end
85 end