root/peasantonline/lib/ajax_scaffold.rb

Revision 1242, 6.0 kB (checked in by james, 2 years ago)

sortable order screen

Line 
1 module AjaxScaffold # :nodoc:
2   class ScaffoldColumn
3     attr_reader :name, :eval, :sort_sql, :label, :class_name, :sanitize
4
5     # Only options[:name] is required. It will infer the eval and sort values
6     # based on the given class.
7     def initialize(klass, options)
8       @name = options[:name]
9       @eval = options[:eval].nil? ? "#{Inflector.underscore(klass.to_s)}.#{@name}" : options[:eval]
10       @label = options[:label].nil? ? Inflector.titleize(@name) : options[:label]
11       @sortable = options[:sortable].nil? ? true : options[:sortable]
12       @sort_sql = options[:sort_sql].nil? ? "#{klass.table_name}.#{@name}" : options[:sort_sql] unless !@sortable
13       @class_name = options[:class_name].nil? ? "" : options[:class_name]
14       @sanitize = options[:sanitize].nil? ? true : options[:sanitize]
15     end
16
17     def sanitize?
18       @sanitize
19     end
20
21     def sortable?
22       @sortable
23     end
24
25   end
26
27   module Common
28     def current_sort(params)
29       session[params[:scaffold_id]][:sort]
30     end
31
32     def current_sort_direction(params)
33       session[params[:scaffold_id]][:sort_direction]
34     end
35   end
36
37   module Controller
38     include AjaxScaffold::Common
39
40     def clear_flashes
41       if request.xhr?
42         flash.keys.each do |flash_key|
43           flash[flash_key] = nil
44         end
45       end
46     end
47
48     def default_per_page
49       25
50     end
51
52     def store_or_get_from_session(id_key, value_key)
53       session[id_key][value_key] = params[value_key] if !params[value_key].nil?
54       params[value_key] ||= session[id_key][value_key]
55     end
56
57     def update_params(options)
58       @scaffold_id = params[:scaffold_id] ||= options[:default_scaffold_id]
59       session[@scaffold_id] ||= {:sort => options[:default_sort], :sort_direction => options[:default_sort_direction], :page => 1}
60
61       store_or_get_from_session(@scaffold_id, :sort)
62       store_or_get_from_session(@scaffold_id, :sort_direction)
63       store_or_get_from_session(@scaffold_id, :page)
64     end
65
66   end
67
68   module Helper
69     include AjaxScaffold::Common
70
71     def format_column(column_value, sanitize = true)
72       if column_empty?(column_value)
73         empty_column_text
74       elsif column_value.instance_of? Time
75         format_time(column_value)
76       elsif column_value.instance_of? Date
77         format_date(column_value)
78       else
79         sanitize ? h(column_value.to_s) : column_value.to_s
80       end
81     end
82
83     def format_time(time)
84       time.strftime("%m/%d/%Y %I:%M %p")
85     end
86
87     def format_date(date)
88       date.strftime("%m/%d/%Y")
89     end
90
91     def column_empty?(column_value)
92       column_value.nil? || (column_value.empty? rescue false)
93     end
94
95     def empty_column_text
96       "-"
97     end
98
99     # Generates a temporary id for creating a new element
100     def generate_temporary_id
101       (Time.now.to_f*1000).to_i.to_s
102     end
103
104     def pagination_ajax_links(paginator, params)
105       pagination_links_each(paginator, {}) do |n|
106         link_to_remote n,
107            { :url => params.merge(:page => n ),
108            :loading => "Element.show('#{loading_indicator_id(params.merge(:action => 'pagination'))}');",
109            :update => scaffold_content_id(params) },
110            { :href => url_for(params.merge(:page => n )) }
111       end
112     end
113
114     def column_sort_direction(column_name, params)
115       if column_name && column_name == current_sort(params)
116         current_sort_direction(params) == "asc" ? "desc" : "asc"
117       else
118         "asc"
119       end
120     end
121
122     def column_class(column_name, column_value, sort_column, class_name = nil)
123       class_attr = String.new
124       class_attr += "empty " if column_empty?(column_value)
125       class_attr += "sorted " if (!sort_column.nil? && column_name == sort_column)
126       class_attr += "#{class_name} " unless class_name.nil?
127       class_attr
128     end
129
130     def loading_indicator_tag(options)
131       image_tag "indicator.gif", :style => "display:none;", :id => loading_indicator_id(options), :alt => "loading indicator", :class => "loading-indicator"
132     end
133
134     # The following are a bunch of helper methods to produce the common scaffold view id's
135
136     def scaffold_content_id(options)
137       "#{options[:scaffold_id]}-content"
138     end
139
140     def scaffold_column_header_id(options)
141       "#{options[:scaffold_id]}-#{options[:column_name]}-column"
142     end
143
144     def scaffold_tbody_id(options)
145       "#{options[:scaffold_id]}-tbody"
146     end
147
148     def scaffold_messages_id(options)
149       "#{options[:scaffold_id]}-messages"
150     end
151
152     def empty_message_id(options)
153       "#{options[:scaffold_id]}-empty-message"
154     end
155
156     def element_row_id(options)
157       "#{options[:scaffold_id]}-#{options[:action]}-#{options[:id]}-row"
158     end
159
160     def element_cell_id(options)
161       "#{options[:scaffold_id]}-#{options[:action]}-#{options[:id]}-cell"
162     end
163
164     def element_form_id(options)
165       "#{options[:scaffold_id]}-#{options[:action]}-#{options[:id]}-form"
166     end
167
168     def loading_indicator_id(options)
169       if options[:id].nil?
170         "#{options[:scaffold_id]}-#{options[:action]}-loading-indicator"
171       else
172         "#{options[:scaffold_id]}-#{options[:action]}-#{options[:id]}-loading-indicator"
173       end
174     end
175
176     def element_messages_id(options)
177       "#{options[:scaffold_id]}-#{options[:action]}-#{options[:id]}-messages"
178     end
179   end
180
181   module Model
182     module ClassMethods
183
184     def build_scaffold_columns
185       scaffold_columns = Array.new
186       content_columns.each do |column|
187         scaffold_columns << ScaffoldColumn.new(self, { :name => column.name })
188       end
189       scaffold_columns
190     end
191
192     def build_scaffold_columns_hash
193       scaffold_columns_hash = Hash.new
194       scaffold_columns.each do |scaffold_column|
195         scaffold_columns_hash[scaffold_column.name] = scaffold_column
196       end
197         scaffold_columns_hash
198       end
199     end
200   end
201 end
202
203 class ActiveRecord::Base
204   extend AjaxScaffold::Model::ClassMethods
205
206   @scaffold_columns = nil
207   def self.scaffold_columns
208     @scaffold_columns ||= build_scaffold_columns
209   end
210
211   @scaffold_columns_hash = nil
212   def self.scaffold_columns_hash
213     @scaffold_columns_hash ||= build_scaffold_columns_hash
214   end
215 end
Note: See TracBrowser for help on using the browser.