active_scaffold 3.2.20 → 3.3.0.rc

Sign up to get free protection for your applications and to get access to all the features.
Files changed (152) hide show
  1. data/CHANGELOG +19 -13
  2. data/README +66 -0
  3. data/app/assets/javascripts/jquery/active_scaffold.js +156 -113
  4. data/app/assets/javascripts/jquery/active_scaffold_chosen.js +11 -0
  5. data/app/assets/javascripts/jquery/date_picker_bridge.js.erb +0 -1
  6. data/app/assets/javascripts/jquery/jquery.editinplace.js +132 -128
  7. data/app/assets/javascripts/prototype/active_scaffold.js +68 -25
  8. data/{frontends/default/views/_horizontal_subform_footer.html.erb → app/assets/javascripts/prototype/active_scaffold_chosen.js} +0 -0
  9. data/app/assets/stylesheets/active_scaffold_colors.css.scss +8 -1
  10. data/app/assets/stylesheets/active_scaffold_layout.css +14 -8
  11. data/{frontends/default/views → app/views/active_scaffold_overrides}/_add_existing_form.html.erb +0 -0
  12. data/{frontends/default/views → app/views/active_scaffold_overrides}/_base_form.html.erb +0 -0
  13. data/{frontends/default/views → app/views/active_scaffold_overrides}/_create_form.html.erb +0 -0
  14. data/{frontends/default/views → app/views/active_scaffold_overrides}/_create_form_on_list.html.erb +0 -0
  15. data/{frontends/default/views → app/views/active_scaffold_overrides}/_field_search.html.erb +0 -0
  16. data/{frontends/default/views → app/views/active_scaffold_overrides}/_form.html.erb +0 -0
  17. data/{frontends/default/views → app/views/active_scaffold_overrides}/_form_association.html.erb +8 -3
  18. data/{frontends/default/views → app/views/active_scaffold_overrides}/_form_association_footer.html.erb +5 -4
  19. data/app/views/active_scaffold_overrides/_form_association_record.html.erb +85 -0
  20. data/app/views/active_scaffold_overrides/_form_attribute.html.erb +23 -0
  21. data/{frontends/default/views → app/views/active_scaffold_overrides}/_form_hidden_attribute.html.erb +0 -0
  22. data/{frontends/default/views → app/views/active_scaffold_overrides}/_form_messages.html.erb +0 -0
  23. data/app/views/active_scaffold_overrides/_horizontal_subform.html.erb +12 -0
  24. data/app/views/active_scaffold_overrides/_horizontal_subform_footer.html.erb +0 -0
  25. data/{frontends/default/views → app/views/active_scaffold_overrides}/_horizontal_subform_header.html.erb +3 -2
  26. data/{frontends/default/views → app/views/active_scaffold_overrides}/_human_conditions.html.erb +0 -0
  27. data/app/views/active_scaffold_overrides/_list.html.erb +35 -0
  28. data/{frontends/default/views → app/views/active_scaffold_overrides}/_list_calculations.html.erb +0 -0
  29. data/{frontends/default/views → app/views/active_scaffold_overrides}/_list_column_headings.html.erb +0 -0
  30. data/app/views/active_scaffold_overrides/_list_header.html.erb +8 -0
  31. data/{frontends/default/views → app/views/active_scaffold_overrides}/_list_inline_adapter.html.erb +0 -0
  32. data/{frontends/default/views → app/views/active_scaffold_overrides}/_list_messages.html.erb +4 -4
  33. data/{frontends/default/views → app/views/active_scaffold_overrides}/_list_pagination.html.erb +0 -0
  34. data/{frontends/default/views → app/views/active_scaffold_overrides}/_list_pagination_links.html.erb +0 -0
  35. data/app/views/active_scaffold_overrides/_list_record.html.erb +30 -0
  36. data/{frontends/default/views → app/views/active_scaffold_overrides}/_list_with_header.html.erb +0 -0
  37. data/{frontends/default/views → app/views/active_scaffold_overrides}/_messages.html.erb +0 -0
  38. data/app/views/active_scaffold_overrides/_refresh_list.js.erb +1 -0
  39. data/{frontends/default/views → app/views/active_scaffold_overrides}/_render_field.js.erb +9 -1
  40. data/{frontends/default/views → app/views/active_scaffold_overrides}/_row.html.erb +0 -0
  41. data/{frontends/default/views → app/views/active_scaffold_overrides}/_search.html.erb +0 -0
  42. data/{frontends/default/views → app/views/active_scaffold_overrides}/_search_attribute.html.erb +0 -0
  43. data/{frontends/default/views → app/views/active_scaffold_overrides}/_show.html.erb +0 -0
  44. data/{frontends/default/views → app/views/active_scaffold_overrides}/_show_columns.html.erb +0 -0
  45. data/app/views/active_scaffold_overrides/_update_actions.html.erb +9 -0
  46. data/{frontends/default/views → app/views/active_scaffold_overrides}/_update_calculations.js.erb +0 -0
  47. data/app/views/active_scaffold_overrides/_update_column.js.erb +16 -0
  48. data/{frontends/default/views → app/views/active_scaffold_overrides}/_update_form.html.erb +0 -0
  49. data/{frontends/default/views → app/views/active_scaffold_overrides}/_update_messages.js.erb +0 -0
  50. data/app/views/active_scaffold_overrides/_vertical_subform.html.erb +8 -0
  51. data/{frontends/default/views → app/views/active_scaffold_overrides}/action_confirmation.html.erb +0 -0
  52. data/{frontends/default/views → app/views/active_scaffold_overrides}/add_existing.js.erb +0 -0
  53. data/{frontends/default/views → app/views/active_scaffold_overrides}/add_existing_form.html.erb +0 -0
  54. data/{frontends/default/views → app/views/active_scaffold_overrides}/create.html.erb +0 -0
  55. data/{frontends/default/views → app/views/active_scaffold_overrides}/delete.html.erb +0 -0
  56. data/{frontends/default/views → app/views/active_scaffold_overrides}/destroy.js.erb +0 -0
  57. data/{frontends/default/views → app/views/active_scaffold_overrides}/edit_associated.js.erb +1 -1
  58. data/{frontends/default/views → app/views/active_scaffold_overrides}/field_search.html.erb +0 -0
  59. data/{frontends/default/views → app/views/active_scaffold_overrides}/form_messages.js.erb +0 -0
  60. data/{frontends/default/views → app/views/active_scaffold_overrides}/list.html.erb +0 -0
  61. data/{frontends/default/views → app/views/active_scaffold_overrides}/on_action_update.js.erb +3 -3
  62. data/{frontends/default/views → app/views/active_scaffold_overrides}/on_create.js.erb +1 -1
  63. data/{frontends/default/views → app/views/active_scaffold_overrides}/on_mark.js.erb +0 -0
  64. data/{frontends/default/views → app/views/active_scaffold_overrides}/on_update.js.erb +4 -4
  65. data/{frontends/default/views → app/views/active_scaffold_overrides}/render_field.js.erb +0 -0
  66. data/{frontends/default/views → app/views/active_scaffold_overrides}/row.js.erb +1 -1
  67. data/{frontends/default/views → app/views/active_scaffold_overrides}/search.html.erb +0 -0
  68. data/{frontends/default/views → app/views/active_scaffold_overrides}/show.html.erb +0 -0
  69. data/{frontends/default/views → app/views/active_scaffold_overrides}/update.html.erb +1 -1
  70. data/app/views/active_scaffold_overrides/update_column.js.erb +26 -0
  71. data/{frontends/default/views → app/views/active_scaffold_overrides}/update_row.js.erb +0 -0
  72. data/config/locales/de.yml +1 -0
  73. data/config/locales/en.yml +1 -0
  74. data/config/locales/es.yml +1 -0
  75. data/config/locales/fr.yml +1 -0
  76. data/config/locales/hu.yml +1 -0
  77. data/config/locales/ja.yml +1 -0
  78. data/config/locales/ru.yml +1 -0
  79. data/lib/active_scaffold.rb +14 -26
  80. data/lib/active_scaffold/actions/core.rb +14 -11
  81. data/lib/active_scaffold/actions/create.rb +3 -3
  82. data/lib/active_scaffold/actions/delete.rb +3 -0
  83. data/lib/active_scaffold/actions/list.rb +9 -6
  84. data/lib/active_scaffold/actions/mark.rb +1 -1
  85. data/lib/active_scaffold/actions/nested.rb +8 -6
  86. data/lib/active_scaffold/actions/show.rb +6 -1
  87. data/lib/active_scaffold/actions/update.rb +39 -19
  88. data/lib/active_scaffold/active_record_permissions.rb +29 -12
  89. data/lib/active_scaffold/attribute_params.rb +14 -7
  90. data/lib/active_scaffold/bridges/calendar_date_select.rb +1 -1
  91. data/lib/active_scaffold/bridges/cancan/cancan_bridge.rb +1 -2
  92. data/lib/active_scaffold/bridges/carrierwave/list_ui.rb +1 -1
  93. data/lib/active_scaffold/bridges/chosen.rb +14 -0
  94. data/lib/active_scaffold/bridges/chosen/helpers.rb +48 -0
  95. data/lib/active_scaffold/bridges/date_picker/helper.rb +7 -6
  96. data/lib/active_scaffold/bridges/dragonfly/form_ui.rb +1 -1
  97. data/lib/active_scaffold/bridges/dragonfly/list_ui.rb +1 -1
  98. data/lib/active_scaffold/bridges/file_column.rb +1 -1
  99. data/lib/active_scaffold/bridges/file_column/as_file_column_bridge.rb +1 -1
  100. data/lib/active_scaffold/bridges/file_column/file_column_helpers.rb +2 -2
  101. data/lib/active_scaffold/bridges/file_column/list_ui.rb +4 -4
  102. data/lib/active_scaffold/bridges/paperclip.rb +1 -1
  103. data/lib/active_scaffold/bridges/paperclip/form_ui.rb +1 -1
  104. data/lib/active_scaffold/bridges/paperclip/list_ui.rb +1 -1
  105. data/lib/active_scaffold/bridges/paperclip/paperclip_bridge_helpers.rb +1 -1
  106. data/lib/active_scaffold/bridges/shared/date_bridge.rb +1 -1
  107. data/lib/active_scaffold/bridges/tiny_mce/helpers.rb +1 -1
  108. data/lib/active_scaffold/config/core.rb +9 -2
  109. data/lib/active_scaffold/config/list.rb +9 -13
  110. data/lib/active_scaffold/config/nested.rb +11 -2
  111. data/lib/active_scaffold/data_structures/action_columns.rb +19 -5
  112. data/lib/active_scaffold/data_structures/action_link.rb +9 -2
  113. data/lib/active_scaffold/data_structures/action_links.rb +5 -36
  114. data/lib/active_scaffold/data_structures/column.rb +21 -21
  115. data/lib/active_scaffold/data_structures/nested_info.rb +31 -44
  116. data/lib/active_scaffold/extensions/action_controller_rescueing.rb +1 -0
  117. data/lib/active_scaffold/extensions/action_view_rendering.rb +30 -36
  118. data/lib/active_scaffold/extensions/reverse_associations.rb +10 -6
  119. data/lib/active_scaffold/extensions/routing_mapper.rb +6 -5
  120. data/lib/active_scaffold/extensions/unsaved_associated.rb +1 -1
  121. data/lib/active_scaffold/finder.rb +18 -10
  122. data/lib/active_scaffold/helpers/association_helpers.rb +21 -2
  123. data/lib/active_scaffold/helpers/controller_helpers.rb +14 -16
  124. data/lib/active_scaffold/helpers/form_column_helpers.rb +161 -21
  125. data/lib/active_scaffold/helpers/id_helpers.rb +7 -7
  126. data/lib/active_scaffold/helpers/list_column_helpers.rb +42 -92
  127. data/lib/active_scaffold/helpers/search_column_helpers.rb +10 -3
  128. data/lib/active_scaffold/helpers/show_column_helpers.rb +4 -9
  129. data/lib/active_scaffold/helpers/view_helpers.rb +278 -78
  130. data/lib/active_scaffold/version.rb +2 -2
  131. data/lib/generators/active_scaffold_controller/templates/controller.rb +1 -1
  132. data/test/bridges/paperclip_test.rb +2 -2
  133. data/vendor/assets/javascripts/jquery-ui-timepicker-addon.js +1882 -1276
  134. metadata +79 -80
  135. data/README.md +0 -67
  136. data/frontends/default/views/_action_group.html.erb +0 -24
  137. data/frontends/default/views/_form_attribute.html.erb +0 -23
  138. data/frontends/default/views/_horizontal_subform.html.erb +0 -22
  139. data/frontends/default/views/_horizontal_subform_record.html.erb +0 -43
  140. data/frontends/default/views/_list.html.erb +0 -18
  141. data/frontends/default/views/_list_actions.html.erb +0 -15
  142. data/frontends/default/views/_list_header.html.erb +0 -10
  143. data/frontends/default/views/_list_record.html.erb +0 -13
  144. data/frontends/default/views/_list_record_columns.html.erb +0 -8
  145. data/frontends/default/views/_refresh_list.js.erb +0 -1
  146. data/frontends/default/views/_update_actions.html.erb +0 -9
  147. data/frontends/default/views/_vertical_subform.html.erb +0 -12
  148. data/frontends/default/views/_vertical_subform_record.html.erb +0 -43
  149. data/frontends/default/views/refresh_list.js.erb +0 -2
  150. data/frontends/default/views/update_column.js.erb +0 -15
  151. data/lib/active_scaffold/extensions/active_record_offset.rb +0 -12
  152. data/lib/active_scaffold/extensions/nil_id_in_url_params.rb +0 -7
@@ -61,7 +61,7 @@ module ActiveScaffold
61
61
  associated.collect!(&:to_i)
62
62
 
63
63
  if column.association
64
- select_options = options_for_association(column.association, false)
64
+ select_options = sorted_association_options_find(column.association).collect {|r| [r.to_label, r.id]}
65
65
  else
66
66
  select_options = column.options[:options].collect do |text, value|
67
67
  active_scaffold_translated_option(column, text, value)
@@ -77,7 +77,7 @@ module ActiveScaffold
77
77
  if column.association
78
78
  associated = associated.is_a?(Array) ? associated.map(&:to_i) : associated.to_i unless associated.nil?
79
79
  method = column.association.macro == :belongs_to ? column.association.foreign_key : column.name
80
- select_options = options_for_association(column.association, true)
80
+ select_options = sorted_association_options_find(column.association, false)
81
81
  else
82
82
  method = column.name
83
83
  select_options = column.options[:options].collect do |text, value|
@@ -92,7 +92,14 @@ module ActiveScaffold
92
92
  else
93
93
  options[:include_blank] ||= as_(:_select_)
94
94
  end
95
- select(:record, method, select_options, options, html_options)
95
+
96
+ if optgroup = options.delete(:optgroup)
97
+ select(:record, method, grouped_options_for_select(column, select_options, optgroup), options, html_options)
98
+ elsif column.association
99
+ collection_select(:record, method, select_options, :id, :to_label, options, html_options)
100
+ else
101
+ select(:record, method, select_options, options, html_options)
102
+ end
96
103
  end
97
104
 
98
105
  def active_scaffold_search_text(column, options)
@@ -8,25 +8,20 @@ module ActiveScaffold
8
8
  # we only pass the record as the argument. we previously also passed the formatted_value,
9
9
  # but mike perham pointed out that prohibited the usage of overrides to improve on the
10
10
  # performance of our default formatting. see issue #138.
11
- if method(method).arity == 1
12
- ActiveSupport::Deprecation.warn("Add column argument to field override, signature is unified with list_ui")
13
- send(method, record)
14
- else
15
- send(method, record, column)
16
- end
11
+ send(method, record, column)
17
12
  # second, check if the dev has specified a valid list_ui for this column
18
13
  elsif column.list_ui and (method = override_show_column_ui(column.list_ui))
19
- send(method, column, record)
14
+ send(method, record, column)
20
15
  else
21
16
  if column.column and (method = override_show_column_ui(column.column.type))
22
- send(method, column, record)
17
+ send(method, record, column)
23
18
  else
24
19
  get_column_value(record, column)
25
20
  end
26
21
  end
27
22
  end
28
23
 
29
- def active_scaffold_show_text(column, record)
24
+ def active_scaffold_show_text(record, column)
30
25
  simple_format(clean_column_value(record.send(column.name)))
31
26
  end
32
27
 
@@ -3,6 +3,7 @@ module ActiveScaffold
3
3
  # All extra helpers that should be included in the View.
4
4
  # Also a dumping ground for uncategorized helpers.
5
5
  module ViewHelpers
6
+ NESTED_PARAMS = [:eid, :association, :parent_scaffold]
6
7
  include ActiveScaffold::Helpers::IdHelpers
7
8
  include ActiveScaffold::Helpers::AssociationHelpers
8
9
  include ActiveScaffold::Helpers::PaginationHelpers
@@ -99,61 +100,243 @@ module ActiveScaffold
99
100
  javascript_tag("ActiveScaffold.create_visibility_toggle('#{id}', #{options.to_json});")
100
101
  end
101
102
 
102
- def skip_action_link(link, *args)
103
- (!link.ignore_method.nil? && controller.respond_to?(link.ignore_method) && controller.send(link.ignore_method, *args)) || ((link.security_method_set? or controller.respond_to? link.security_method) and !controller.send(link.security_method, *args))
103
+ def skip_action_link?(link, *args)
104
+ !link.ignore_method.nil? && controller.respond_to?(link.ignore_method) && controller.send(link.ignore_method, *args)
104
105
  end
105
106
 
106
- def render_action_link(link, url_options, record = nil, html_options = {})
107
- url_options = action_link_url_options(link, url_options, record)
108
- html_options = action_link_html_options(link, url_options, record, html_options)
109
- action_link_html(link, url_options, html_options, record)
107
+ def action_link_authorized?(link, *args)
108
+ security_method = link.security_method_set? || controller.respond_to?(link.security_method)
109
+ authorized = if security_method
110
+ controller.send(link.security_method, *args)
111
+ else
112
+ args.empty? ? true : args.first.authorized_for?(:crud_type => link.crud_type, :action => link.action)
113
+ end
114
+ end
115
+
116
+ def display_action_links(action_links, record, options, &block)
117
+ options[:level_0_tag] ||= nil
118
+ options[:options_level_0_tag] ||= nil
119
+ options[:level] ||= 0
120
+ options[:first_action] = true
121
+ output = ActiveSupport::SafeBuffer.new
122
+
123
+ action_links.each(:reverse => options.delete(:reverse), :groups => true) do |link|
124
+ if link.is_a? ActiveScaffold::DataStructures::ActionLinks
125
+ unless link.empty?
126
+ options[:level] += 1
127
+ content = display_action_links(link, record, options, &block)
128
+ options[:level] -= 1
129
+ if content.present?
130
+ output << display_action_link(link, content, record, options)
131
+ options[:first_action] = false
132
+ end
133
+ end
134
+ elsif !skip_action_link?(link, *Array(options[:for]))
135
+ authorized = action_link_authorized?(link, *Array(options[:for]))
136
+ next if !authorized && options[:skip_unauthorized]
137
+ output << display_action_link(link, nil, record, options.merge(:authorized => authorized))
138
+ options[:first_action] = false
139
+ end
140
+ end
141
+ output
142
+ end
143
+
144
+ def display_action_link(link, content, record, options)
145
+ if content
146
+ html_classes = hover_via_click? ? 'hover_click ' : ''
147
+ if options[:level] == 0
148
+ html_classes << 'action_group'
149
+ group_tag = :div
150
+ else
151
+ html_classes << 'top' if options[:first_action]
152
+ group_tag = :li
153
+ end
154
+ content = content_tag(group_tag, :class => (html_classes if html_classes.present?), :onclick => ('' if hover_via_click?)) do
155
+ content_tag(:div, as_(link.name), :class => link.name.to_s.downcase) << content_tag(:ul, content)
156
+ end
157
+ else
158
+ content = render_action_link(link, record, options)
159
+ content = content_tag(:li, content, :class => ('top' if options[:first_action])) unless options[:level] == 0
160
+ end
161
+ content = content_tag(options[:level_0_tag], content, options[:options_level_0_tag]) if options[:level] == 0 && options[:level_0_tag]
162
+ content
163
+ end
164
+
165
+ def render_action_link(link, record = nil, options = {})
166
+ if link.action.nil? || link.column.try(:polymorphic_association?)
167
+ link = action_link_to_inline_form(link, record)
168
+ options[:authorized] = false if link.action.nil? || link.controller.nil?
169
+ options.delete :link if link.crud_type == :create
170
+ end
171
+ if link.action.nil? || (link.type == :member && options.has_key?(:authorized) && !options[:authorized])
172
+ action_link_html(link, nil, options.merge(:class => "disabled #{link.action}#{" #{link.html_options[:class]}" unless link.html_options[:class].blank?}"), record)
173
+ else
174
+ url = action_link_url(link, record)
175
+ html_options = action_link_html_options(link, record, options)
176
+ action_link_html(link, url, html_options, record)
177
+ end
178
+ end
179
+
180
+ # setup the action link to inline form
181
+ def action_link_to_inline_form(link, record)
182
+ link = link.clone
183
+ associated = record.send(link.column.association.name)
184
+ if link.column.polymorphic_association?
185
+ link.controller = controller_path_for_activerecord(associated.class)
186
+ return link if link.controller.nil?
187
+ end
188
+ link = configure_column_link(link, record, associated) if link.action.nil?
189
+ link
110
190
  end
111
191
 
112
- def render_group_action_link(link, url_options, options, record = nil)
113
- if link.type == :member && !options[:authorized]
114
- action_link_html(link, nil, {:class => "disabled #{link.action}#{link.html_options[:class].blank? ? '' : (' ' + link.html_options[:class])}"}, record)
192
+ def configure_column_link(link, record, associated, actions = nil)
193
+ actions ||= link.column.actions_for_association_links
194
+ if column_empty?(associated) # if association is empty, we only can link to create form
195
+ if actions.include?(:new)
196
+ link.action = 'new'
197
+ link.crud_type = :create
198
+ link.label ||= as_(:create_new)
199
+ end
200
+ elsif actions.include?(:edit)
201
+ link.action = 'edit'
202
+ link.crud_type = :update
203
+ elsif actions.include?(:show)
204
+ link.action = 'show'
205
+ link.crud_type = :read
206
+ elsif actions.include?(:list)
207
+ link.action = 'index'
208
+ link.crud_type = :read
209
+ end
210
+
211
+ unless column_link_authorized?(link, link.column, record, associated)
212
+ link.action = nil
213
+ # if action is edit and is not authorized, fallback to show if it's enabled
214
+ if link.crud_type == :update && actions.include?(:show)
215
+ link = configure_column_link(link, record, associated, [:show])
216
+ end
217
+ end
218
+ link
219
+ end
220
+
221
+ def column_link_authorized?(link, column, record, associated)
222
+ if column.association
223
+ associated_for_authorized = if column.plural_association? || (associated.respond_to?(:blank?) && associated.blank?)
224
+ column.association.klass
225
+ else
226
+ associated
227
+ end
228
+ authorized = associated_for_authorized.authorized_for?(:crud_type => link.crud_type)
229
+ authorized = authorized and record.authorized_for?(:crud_type => :update, :column => column.name) if link.crud_type == :create
230
+ authorized
115
231
  else
116
- render_action_link(link, url_options, record)
232
+ record.authorized_for?(:crud_type => link.crud_type)
117
233
  end
118
234
  end
235
+
236
+ def action_link_url(link, record)
237
+ url = (@action_links_urls ||= {})[link.name_to_cache_link_url]
238
+ url ||= begin
239
+ url_options = action_link_url_options(link, record)
240
+ if active_scaffold_config.cache_action_link_urls
241
+ url = url_for(url_options)
242
+ @action_links_urls[link.name_to_cache_link_url] = url unless link.dynamic_parameters.is_a?(Proc)
243
+ url
244
+ else
245
+ url_for(params_for(url_options))
246
+ end
247
+ end
248
+
249
+ url = record ? url.sub('--ID--', record.id.to_s) : url.clone
250
+ if link.column.try(:singular_association?)
251
+ url = url.sub('--CHILD_ID--', record.send(link.column.association.name).try(:id).to_s)
252
+ elsif nested?
253
+ url = url.sub('--CHILD_ID--', params[nested.param_name].to_s)
254
+ end
255
+
256
+ if active_scaffold_config.cache_action_link_urls
257
+ query_string, non_nested_query_string = query_string_for_action_links(link)
258
+ if query_string || (!link.nested_link? && non_nested_query_string)
259
+ url << (url.include?('?') ? '&' : '?')
260
+ url << query_string if query_string
261
+ url << non_nested_query_string if !link.nested_link? && non_nested_query_string
262
+ end
263
+ end
264
+ url
265
+ end
266
+
267
+ def query_string_for_action_links(link)
268
+ if defined?(@query_string) && link.parameters.none? { |k, v| @query_string_params.include? k }
269
+ return [@query_string, @non_nested_query_string]
270
+ end
271
+ keep = true
272
+ @query_string_params ||= Set.new
273
+ query_string_for_all = nil
274
+ query_string_options = []
275
+ non_nested_query_string_options = []
276
+
277
+ params_for.except(:controller, :action, :id).each do |key, value|
278
+ @query_string_params << key
279
+ if link.parameters.include? key
280
+ keep = false
281
+ next
282
+ end
283
+ qs = "#{key}=#{value}"
284
+ if NESTED_PARAMS.include?(key) || conditions_from_params.include?(key) || (nested? && nested.param_name == key)
285
+ non_nested_query_string_options << qs
286
+ else
287
+ query_string_options << qs
288
+ end
289
+ end
290
+
291
+ query_string = URI.escape(query_string_options.join('&')) if query_string_options.present?
292
+ if non_nested_query_string_options.present?
293
+ non_nested_query_string = "#{'&' if query_string}#{URI.escape(non_nested_query_string_options.join('&'))}"
294
+ end
295
+ if keep
296
+ @query_string = query_string
297
+ @non_nested_query_string = non_nested_query_string
298
+ end
299
+ [query_string, non_nested_query_string]
300
+ end
119
301
 
120
- def action_link_url_options(link, url_options, record, options = {})
121
- url_options = url_options.clone
122
- url_options[:action] = link.action
302
+ def action_link_url_options(link, record)
303
+ url_options = {:action => link.action}
304
+ url_options[:id] = '--ID--' unless record.nil?
123
305
  url_options[:controller] = link.controller.to_s if link.controller
124
- url_options.delete(:search) if link.controller and link.controller.to_s != params[:controller]
125
306
  url_options.merge! link.parameters if link.parameters
126
307
  if link.dynamic_parameters.is_a?(Proc)
127
308
  if record.nil?
128
309
  url_options.merge! link.dynamic_parameters.call
129
- elsif link.dynamic_parameters.arity == 0
130
- ActiveSupport::Deprecation.warn("dynamic_parameters must be a block with an argument for member action links, instead of using @link_record")
131
- @link_record = record
132
- url_options.merge! self.instance_eval(&(link.dynamic_parameters))
133
- @link_record = nil
134
310
  else
135
311
  url_options.merge! link.dynamic_parameters.call(record)
136
312
  end
137
313
  end
138
- url_options_for_nested_link(link.column, record, link, url_options, options) if link.nested_link?
139
- url_options_for_sti_link(link.column, record, link, url_options, options) unless record.nil? || active_scaffold_config.sti_children.nil?
314
+ if link.nested_link?
315
+ url_options_for_nested_link(link.column, record, link, url_options)
316
+ elsif nested?
317
+ url_options[nested.param_name] = '--CHILD_ID--'
318
+ end
319
+ url_options_for_sti_link(link.column, record, link, url_options) unless record.nil? || active_scaffold_config.sti_children.nil?
140
320
  url_options[:_method] = link.method if !link.confirm? && link.inline? && link.method != :get
141
321
  url_options
142
322
  end
143
323
 
144
- def action_link_html_options(link, url_options, record, html_options)
145
- link_id = get_action_link_id(url_options, record, link.column)
324
+ def action_link_html_options(link, record, html_options)
325
+ link_id = get_action_link_id(link, record)
146
326
  html_options.reverse_merge! link.html_options.merge(:class => link.action.to_s)
147
327
 
148
328
  # Needs to be in html_options to as the adding _method to the url is no longer supported by Rails
149
329
  html_options[:method] = link.method if link.method != :get
150
330
 
151
- html_options[:class] += ' as_action' if link.inline?
152
331
  html_options[:data] = {}
153
332
  html_options[:data][:confirm] = link.confirm(record.try(:to_label)) if link.confirm?
154
- html_options[:data][:position] = link.position if link.position and link.inline?
155
- html_options[:data][:action] = link.action if link.inline?
156
- html_options[:data][:'cancel-refresh'] = true if link.inline? and link.refresh_on_close
333
+ if link.inline?
334
+ html_options[:class] += ' as_action'
335
+ html_options[:data][:position] = link.position if link.position
336
+ html_options[:data][:action] = link.action
337
+ html_options[:data][:cancel_refresh] = true if link.refresh_on_close
338
+ html_options[:data][:keep_open] = true if link.keep_open?
339
+ end
157
340
  if link.popup?
158
341
  html_options[:data][:popup] = true
159
342
  html_options[:target] = '_blank'
@@ -161,8 +344,10 @@ module ActiveScaffold
161
344
  html_options[:id] = link_id
162
345
  html_options[:remote] = true unless link.page? || link.popup?
163
346
  if link.dhtml_confirm?
164
- html_options[:class] += ' as_action' if !link.inline?
165
- html_options[:page_link] = 'true' if !link.inline?
347
+ unless link.inline?
348
+ html_options[:class] += ' as_action'
349
+ html_options[:page_link] = 'true'
350
+ end
166
351
  html_options[:dhtml_confirm] = link.dhtml_confirm.value
167
352
  html_options[:onclick] = link.dhtml_confirm.onclick_function(controller, link_id)
168
353
  end
@@ -170,48 +355,49 @@ module ActiveScaffold
170
355
  html_options
171
356
  end
172
357
 
173
- def get_action_link_id(url_options, record = nil, column = nil)
174
- id = url_options[:id] || url_options[:parent_id]
175
- id = "#{column.association.name}-#{record.id}" if column && column.plural_association?
176
- if record.try(column.association.name.to_sym).present?
177
- id = "#{column.association.name}-#{record.send(column.association.name).id}-#{record.id}"
178
- else
179
- id = "#{column.association.name}-#{record.id}" unless record.nil?
180
- end if column && column.singular_association?
181
- id = "#{id}-#{url_options[:batch_scope].downcase}" if url_options[:batch_scope]
182
- action_id = "#{id_from_controller(url_options[:controller]) + '-' if url_options[:parent_controller] || url_options[:controller] != controller.controller_path}#{url_options[:action].to_s}"
358
+ def get_action_link_id(link, record = nil, column = nil)
359
+ column ||= link.column
360
+ id = record ? record.id.to_s : (nested? ? nested.parent_id : '')
361
+ if column && column.plural_association?
362
+ id = "#{column.association.name}-#{record.id}"
363
+ elsif column && column.singular_association?
364
+ if record.try(column.association.name.to_sym).present?
365
+ id = "#{column.association.name}-#{record.send(column.association.name).id}-#{record.id}"
366
+ else
367
+ id = "#{column.association.name}-#{record.id}" unless record.nil?
368
+ end
369
+ end
370
+ action_id = "#{id_from_controller("#{link.controller}-") if params[:parent_controller] || link.controller != controller.controller_path}#{link.action}"
183
371
  action_link_id(action_id, id)
184
372
  end
185
373
 
186
374
  def action_link_html(link, url, html_options, record)
187
- # issue 260, use url_options[:link] if it exists. This prevents DB data from being localized.
188
- label = url.delete(:link) if url.is_a?(Hash)
375
+ label = html_options.delete(:link)
189
376
  label ||= link.label
190
- if link.image.nil?
191
- html = link_to(label, url, html_options)
377
+ label = image_tag(link.image[:name], :size => link.image[:size], :alt => label, :title => label) if link.image
378
+ if url.nil?
379
+ content_tag(:a, label, html_options)
192
380
  else
193
- html = link_to(image_tag(link.image[:name], :size => link.image[:size], :alt => label, :title => label), url, html_options)
381
+ link_to(label, url, html_options)
194
382
  end
195
- # if url is nil we would like to generate an anchor without href attribute
196
- url.nil? ? html.sub(/href=".*?"/, '').html_safe : html.html_safe
197
383
  end
198
384
 
199
- def url_options_for_nested_link(column, record, link, url_options, options = {})
385
+ def url_options_for_nested_link(column, record, link, url_options)
200
386
  if column && column.association
201
387
  url_options[:parent_scaffold] = controller_path
202
388
  url_options[column.association.active_record.name.foreign_key.to_sym] = url_options.delete(:id)
203
- url_options[:id] = record.send(column.association.name).id if column.singular_association? && record.send(column.association.name).present?
204
- url_options[:eid] = nil # needed for nested scaffolds open from an embedded scaffold
389
+ if column.singular_association? && url_options[:action].to_sym != :index
390
+ url_options[:id] = '--CHILD_ID--'
391
+ else
392
+ url_options[:id] = nil
393
+ end
205
394
  elsif link.parameters && link.parameters[:named_scope]
206
395
  url_options[:parent_scaffold] = controller_path
207
396
  url_options[active_scaffold_config.model.name.foreign_key.to_sym] = url_options.delete(:id)
208
- url_options[:eid] = nil # needed for nested scaffolds open from an embedded scaffold
209
397
  end
210
- url_options.except! *params_conditions
211
- url_options.except! *nested.constrained_fields if nested?
212
398
  end
213
399
 
214
- def url_options_for_sti_link(column, record, link, url_options, options = {})
400
+ def url_options_for_sti_link(column, record, link, url_options)
215
401
  #need to find out controller of current record type
216
402
  #and set parameters
217
403
  # its quite difficult to detect an sti link
@@ -226,9 +412,15 @@ module ActiveScaffold
226
412
  end
227
413
  end
228
414
 
229
- def list_row_class(record)
415
+ def list_row_class_method(record)
416
+ return @_list_row_class_method if defined? @_list_row_class_method
230
417
  class_override_helper = :"#{clean_class_name(record.class.name)}_list_row_class"
231
- respond_to?(class_override_helper) ? send(class_override_helper, record) : ''
418
+ @_list_row_class_method = (class_override_helper if respond_to?(class_override_helper))
419
+ end
420
+
421
+ def list_row_class(record)
422
+ class_override_helper = list_row_class_method(record)
423
+ class_override_helper ? send(class_override_helper, record) : ''
232
424
  end
233
425
 
234
426
  def column_attributes(column, record)
@@ -238,39 +430,39 @@ module ActiveScaffold
238
430
  end
239
431
 
240
432
  def column_class(column, column_value, record)
241
- classes = []
242
- classes << "#{column.name}-column"
433
+ @_column_classes ||= {}
434
+ @_column_classes[column.name] ||= begin
435
+ classes = "#{column.name}-column "
436
+ classes << 'sorted ' if active_scaffold_config.list.user.sorting.sorts_on?(column)
437
+ classes << 'numeric ' if column.column and [:decimal, :float, :integer].include?(column.column.type)
438
+ classes << column.css_class unless column.css_class.nil? || column.css_class.is_a?(Proc)
439
+ end
440
+ classes = "#{@_column_classes[column.name]} "
441
+ classes << 'empty ' if column_empty? column_value
442
+ classes << 'in_place_editor_field ' if inplace_edit?(record, column) or column.list_ui == :marked
243
443
  if column.css_class.is_a?(Proc)
244
444
  css_class = column.css_class.call(column_value, record)
245
445
  classes << css_class unless css_class.nil?
246
- else
247
- classes << column.css_class
248
- end unless column.css_class.nil?
249
-
250
- classes << 'empty' if column_empty? column_value
251
- classes << 'sorted' if active_scaffold_config.list.user.sorting.sorts_on?(column)
252
- classes << 'numeric' if column.column and [:decimal, :float, :integer].include?(column.column.type)
253
- classes << 'in_place_editor_field' if inplace_edit?(record, column) or column.list_ui == :marked
254
- classes.join(' ').rstrip
446
+ end
447
+ classes
255
448
  end
256
449
 
257
450
  def column_heading_class(column, sorting)
258
- classes = []
259
- classes << "#{column.name}-column_heading"
260
- classes << "sorted #{sorting.direction_of(column).downcase}" if sorting.sorts_on? column
451
+ classes = "#{column.name}-column_heading "
452
+ classes << "sorted #{sorting.direction_of(column).downcase} " if sorting.sorts_on? column
261
453
  classes << column.css_class unless column.css_class.nil? || column.css_class.is_a?(Proc)
262
- classes.join(' ')
454
+ classes
263
455
  end
264
456
 
265
457
  def as_main_div_class
266
- classes = ["active-scaffold", "active-scaffold-#{controller_id}", "#{id_from_controller params[:controller]}-view", "#{active_scaffold_config.theme}-theme"]
267
- classes << "as_touch" if touch_device?
268
- classes.join(' ')
458
+ classes = "active-scaffold active-scaffold-#{controller_id} #{id_from_controller params[:controller]}-view #{active_scaffold_config.theme}-theme"
459
+ classes << " as_touch" if touch_device?
460
+ classes
269
461
  end
270
462
 
271
463
  def column_empty?(column_value)
272
464
  empty = column_value.nil?
273
- empty ||= column_value.blank? if column_value.respond_to? :blank?
465
+ empty ||= column_value.blank?
274
466
  empty ||= ['&nbsp;', active_scaffold_config.list.empty_field_text].include? column_value if String === column_value
275
467
  return empty
276
468
  end
@@ -315,10 +507,18 @@ module ActiveScaffold
315
507
  end
316
508
 
317
509
  def override_helper(column, suffix)
318
- method_with_class = override_helper_name(column, suffix, true)
319
- return method_with_class if respond_to?(method_with_class)
320
- method = override_helper_name(column, suffix)
321
- method if respond_to?(method)
510
+ @_override_helpers ||= {}
511
+ @_override_helpers[suffix] ||= {}
512
+ return @_override_helpers[suffix][column.name] if @_override_helpers[suffix].include? column.name
513
+ @_override_helpers[suffix][column.name] = begin
514
+ method_with_class = override_helper_name(column, suffix, true)
515
+ if respond_to?(method_with_class)
516
+ method_with_class
517
+ else
518
+ method = override_helper_name(column, suffix)
519
+ method if respond_to?(method)
520
+ end
521
+ end
322
522
  end
323
523
 
324
524
  def display_message(message)