active_scaffold 3.2.20 → 3.3.0.rc

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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)