active_scaffold 3.4.17 → 3.4.18

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 (183) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG +12 -1
  3. data/README.md +8 -4
  4. data/app/assets/javascripts/jquery/active_scaffold.js +82 -67
  5. data/app/assets/stylesheets/active_scaffold.scss +1 -1
  6. data/app/assets/stylesheets/active_scaffold_colors.scss +1 -1
  7. data/app/assets/stylesheets/blue-theme.css +1 -1
  8. data/app/views/active_scaffold_overrides/_form_association.html.erb +3 -3
  9. data/app/views/active_scaffold_overrides/_form_association_record.html.erb +3 -3
  10. data/app/views/active_scaffold_overrides/_show_columns.html.erb +1 -1
  11. data/lib/active_scaffold.rb +16 -16
  12. data/lib/active_scaffold/actions/common_search.rb +13 -11
  13. data/lib/active_scaffold/actions/core.rb +85 -78
  14. data/lib/active_scaffold/actions/create.rb +29 -28
  15. data/lib/active_scaffold/actions/delete.rb +17 -17
  16. data/lib/active_scaffold/actions/field_search.rb +18 -19
  17. data/lib/active_scaffold/actions/list.rb +30 -22
  18. data/lib/active_scaffold/actions/mark.rb +1 -1
  19. data/lib/active_scaffold/actions/nested.rb +78 -65
  20. data/lib/active_scaffold/actions/search.rb +13 -10
  21. data/lib/active_scaffold/actions/show.rb +10 -6
  22. data/lib/active_scaffold/actions/subform.rb +1 -2
  23. data/lib/active_scaffold/actions/update.rb +39 -31
  24. data/lib/active_scaffold/active_record_permissions.rb +14 -15
  25. data/lib/active_scaffold/attribute_params.rb +42 -43
  26. data/lib/active_scaffold/bridges.rb +22 -12
  27. data/lib/active_scaffold/bridges/ancestry.rb +1 -1
  28. data/lib/active_scaffold/bridges/ancestry/ancestry_bridge.rb +6 -6
  29. data/lib/active_scaffold/bridges/bitfields.rb +1 -1
  30. data/lib/active_scaffold/bridges/bitfields/bitfields_bridge.rb +12 -13
  31. data/lib/active_scaffold/bridges/calendar_date_select.rb +5 -5
  32. data/lib/active_scaffold/bridges/calendar_date_select/as_cds_bridge.rb +17 -20
  33. data/lib/active_scaffold/bridges/cancan.rb +1 -1
  34. data/lib/active_scaffold/bridges/cancan/cancan_bridge.rb +8 -9
  35. data/lib/active_scaffold/bridges/carrierwave.rb +4 -4
  36. data/lib/active_scaffold/bridges/carrierwave/carrierwave_bridge.rb +9 -8
  37. data/lib/active_scaffold/bridges/carrierwave/form_ui.rb +11 -10
  38. data/lib/active_scaffold/bridges/carrierwave/list_ui.rb +7 -6
  39. data/lib/active_scaffold/bridges/chosen.rb +1 -1
  40. data/lib/active_scaffold/bridges/chosen/helpers.rb +4 -4
  41. data/lib/active_scaffold/bridges/country_helper.rb +1 -1
  42. data/lib/active_scaffold/bridges/country_helper/country_helper_bridge.rb +259 -260
  43. data/lib/active_scaffold/bridges/date_picker.rb +2 -2
  44. data/lib/active_scaffold/bridges/date_picker/ext.rb +9 -11
  45. data/lib/active_scaffold/bridges/date_picker/helper.rb +61 -67
  46. data/lib/active_scaffold/bridges/dragonfly.rb +4 -4
  47. data/lib/active_scaffold/bridges/dragonfly/dragonfly_bridge.rb +9 -8
  48. data/lib/active_scaffold/bridges/dragonfly/form_ui.rb +11 -10
  49. data/lib/active_scaffold/bridges/dragonfly/list_ui.rb +6 -5
  50. data/lib/active_scaffold/bridges/file_column.rb +5 -5
  51. data/lib/active_scaffold/bridges/file_column/as_file_column_bridge.rb +20 -23
  52. data/lib/active_scaffold/bridges/file_column/file_column_helpers.rb +20 -23
  53. data/lib/active_scaffold/bridges/file_column/form_ui.rb +13 -14
  54. data/lib/active_scaffold/bridges/file_column/list_ui.rb +7 -8
  55. data/lib/active_scaffold/bridges/file_column/test/functional/file_column_keep_test.rb +18 -22
  56. data/lib/active_scaffold/bridges/file_column/test/mock_model.rb +5 -4
  57. data/lib/active_scaffold/bridges/file_column/test/test_helper.rb +2 -10
  58. data/lib/active_scaffold/bridges/paper_trail.rb +7 -5
  59. data/lib/active_scaffold/bridges/paper_trail/paper_trail_bridge.rb +4 -3
  60. data/lib/active_scaffold/bridges/paperclip.rb +5 -5
  61. data/lib/active_scaffold/bridges/paperclip/form_ui.rb +11 -10
  62. data/lib/active_scaffold/bridges/paperclip/list_ui.rb +6 -5
  63. data/lib/active_scaffold/bridges/paperclip/paperclip_bridge.rb +10 -9
  64. data/lib/active_scaffold/bridges/record_select.rb +1 -1
  65. data/lib/active_scaffold/bridges/record_select/helpers.rb +28 -28
  66. data/lib/active_scaffold/bridges/semantic_attributes.rb +1 -1
  67. data/lib/active_scaffold/bridges/semantic_attributes/column.rb +1 -1
  68. data/lib/active_scaffold/bridges/shared/date_bridge.rb +58 -52
  69. data/lib/active_scaffold/bridges/tiny_mce.rb +2 -2
  70. data/lib/active_scaffold/bridges/tiny_mce/helpers.rb +3 -3
  71. data/lib/active_scaffold/config/base.rb +9 -10
  72. data/lib/active_scaffold/config/core.rb +24 -29
  73. data/lib/active_scaffold/config/create.rb +0 -1
  74. data/lib/active_scaffold/config/field_search.rb +8 -10
  75. data/lib/active_scaffold/config/form.rb +5 -5
  76. data/lib/active_scaffold/config/list.rb +21 -20
  77. data/lib/active_scaffold/config/mark.rb +3 -3
  78. data/lib/active_scaffold/config/nested.rb +11 -10
  79. data/lib/active_scaffold/config/search.rb +2 -3
  80. data/lib/active_scaffold/config/show.rb +1 -1
  81. data/lib/active_scaffold/config/update.rb +1 -2
  82. data/lib/active_scaffold/configurable.rb +9 -11
  83. data/lib/active_scaffold/constraints.rb +9 -8
  84. data/lib/active_scaffold/core.rb +72 -84
  85. data/lib/active_scaffold/data_structures/action_columns.rb +26 -25
  86. data/lib/active_scaffold/data_structures/action_link.rb +43 -43
  87. data/lib/active_scaffold/data_structures/action_links.rb +17 -15
  88. data/lib/active_scaffold/data_structures/actions.rb +5 -5
  89. data/lib/active_scaffold/data_structures/bridge.rb +6 -3
  90. data/lib/active_scaffold/data_structures/column.rb +110 -89
  91. data/lib/active_scaffold/data_structures/columns.rb +3 -3
  92. data/lib/active_scaffold/data_structures/error_message.rb +4 -6
  93. data/lib/active_scaffold/data_structures/nested_info.rb +43 -48
  94. data/lib/active_scaffold/data_structures/set.rb +7 -8
  95. data/lib/active_scaffold/data_structures/sorting.rb +38 -33
  96. data/lib/active_scaffold/delayed_setup.rb +5 -6
  97. data/lib/active_scaffold/engine.rb +4 -4
  98. data/lib/active_scaffold/extensions/action_controller_rendering.rb +3 -4
  99. data/lib/active_scaffold/extensions/action_controller_rescueing.rb +1 -1
  100. data/lib/active_scaffold/extensions/action_view_rendering.rb +5 -6
  101. data/lib/active_scaffold/extensions/left_outer_joins.rb +11 -11
  102. data/lib/active_scaffold/extensions/localize.rb +1 -1
  103. data/lib/active_scaffold/extensions/name_option_for_datetime.rb +1 -1
  104. data/lib/active_scaffold/extensions/paginator_extensions.rb +2 -5
  105. data/lib/active_scaffold/extensions/reverse_associations.rb +13 -13
  106. data/lib/active_scaffold/extensions/routing_mapper.rb +9 -9
  107. data/lib/active_scaffold/extensions/unsaved_associated.rb +9 -9
  108. data/lib/active_scaffold/finder.rb +90 -93
  109. data/lib/active_scaffold/helpers/association_helpers.rb +5 -5
  110. data/lib/active_scaffold/helpers/controller_helpers.rb +22 -19
  111. data/lib/active_scaffold/helpers/form_column_helpers.rb +115 -105
  112. data/lib/active_scaffold/helpers/human_condition_helpers.rb +62 -35
  113. data/lib/active_scaffold/helpers/id_helpers.rb +6 -6
  114. data/lib/active_scaffold/helpers/list_column_helpers.rb +89 -94
  115. data/lib/active_scaffold/helpers/pagination_helpers.rb +9 -9
  116. data/lib/active_scaffold/helpers/search_column_helpers.rb +47 -44
  117. data/lib/active_scaffold/helpers/show_column_helpers.rb +2 -2
  118. data/lib/active_scaffold/helpers/view_helpers.rb +86 -91
  119. data/lib/active_scaffold/marked_model.rb +10 -10
  120. data/lib/active_scaffold/paginator.rb +30 -34
  121. data/lib/active_scaffold/responds_to_parent.rb +27 -28
  122. data/lib/active_scaffold/tableless.rb +20 -15
  123. data/lib/active_scaffold/version.rb +1 -1
  124. data/lib/generators/active_scaffold/active_scaffold_generator.rb +8 -8
  125. data/lib/generators/active_scaffold_controller/active_scaffold_controller_generator.rb +9 -9
  126. data/shoulda_macros/macros.rb +27 -22
  127. data/test/bridges/bridge_test.rb +38 -29
  128. data/test/bridges/date_picker_test.rb +1 -1
  129. data/test/bridges/paper_trail_test.rb +17 -0
  130. data/test/bridges/paperclip_test.rb +3 -2
  131. data/test/bridges/tiny_mce_test.rb +5 -2
  132. data/test/company.rb +25 -30
  133. data/test/config/base_test.rb +1 -1
  134. data/test/config/core_test.rb +9 -9
  135. data/test/config/create_test.rb +14 -8
  136. data/test/config/delete_test.rb +4 -4
  137. data/test/config/field_search_test.rb +6 -6
  138. data/test/config/list_test.rb +16 -16
  139. data/test/config/nested_test.rb +4 -4
  140. data/test/config/search_test.rb +8 -8
  141. data/test/config/show_test.rb +6 -6
  142. data/test/config/subform_test.rb +1 -1
  143. data/test/config/update_test.rb +5 -5
  144. data/test/const_mocker.rb +4 -4
  145. data/test/data_structures/action_columns_test.rb +4 -5
  146. data/test/data_structures/action_link_test.rb +1 -0
  147. data/test/data_structures/action_links_test.rb +5 -5
  148. data/test/data_structures/column_test.rb +9 -9
  149. data/test/data_structures/columns_test.rb +2 -2
  150. data/test/data_structures/error_message_test.rb +4 -5
  151. data/test/data_structures/set_test.rb +1 -2
  152. data/test/data_structures/sorting_test.rb +10 -10
  153. data/test/data_structures/validation_reflection_test.rb +8 -0
  154. data/test/extensions/routing_mapper_test.rb +2 -2
  155. data/test/helpers/list_column_helpers_test.rb +3 -2
  156. data/test/helpers/pagination_helpers_test.rb +5 -4
  157. data/test/helpers/search_column_helpers_test.rb +1 -1
  158. data/test/misc/active_record_permissions_test.rb +63 -50
  159. data/test/misc/attribute_params_test.rb +28 -26
  160. data/test/misc/calculation_test.rb +10 -3
  161. data/test/misc/configurable_test.rb +12 -13
  162. data/test/misc/constraints_test.rb +6 -6
  163. data/test/misc/convert_numbers_format_test.rb +7 -6
  164. data/test/misc/finder_test.rb +17 -12
  165. data/test/misc/lang_test.rb +3 -4
  166. data/test/misc/tableless_test.rb +2 -3
  167. data/test/mock_app/app/controllers/addresses_controller.rb +1 -1
  168. data/test/mock_app/app/controllers/buildings_controller.rb +1 -1
  169. data/test/mock_app/app/controllers/cars_controller.rb +1 -1
  170. data/test/mock_app/app/controllers/contacts_controller.rb +1 -1
  171. data/test/mock_app/app/controllers/people_controller.rb +1 -1
  172. data/test/mock_app/app/models/file_model.rb +2 -2
  173. data/test/mock_app/app/models/person.rb +1 -1
  174. data/test/mock_app/config/application.rb +3 -3
  175. data/test/mock_app/config/boot.rb +1 -1
  176. data/test/mock_app/config/environment.rb +1 -0
  177. data/test/mock_app/config/environments/development.rb +0 -1
  178. data/test/mock_app/config/environments/production.rb +1 -1
  179. data/test/mock_app/db/schema.rb +14 -15
  180. data/test/model_stub.rb +13 -16
  181. data/test/run_all.rb +5 -7
  182. data/test/test_helper.rb +12 -9
  183. metadata +19 -3
@@ -15,8 +15,9 @@ module ActiveScaffold::Actions
15
15
  end
16
16
 
17
17
  protected
18
+
18
19
  def response_location
19
- url_for(params_for(:action => "show", :id => @record.to_param)) if successful?
20
+ url_for(params_for(:action => 'show', :id => @record.to_param)) if successful?
20
21
  end
21
22
 
22
23
  def new_respond_to_html
@@ -26,13 +27,13 @@ module ActiveScaffold::Actions
26
27
  return_to_main
27
28
  end
28
29
  end
29
-
30
+
30
31
  def new_respond_to_js
31
32
  render(:partial => 'create_form')
32
33
  end
33
34
 
34
35
  def create_respond_to_html
35
- if params[:iframe]=='true' # was this an iframe post ?
36
+ if params[:iframe] == 'true' # was this an iframe post ?
36
37
  do_refresh_list if successful? && active_scaffold_config.create.refresh_list && !render_parent?
37
38
  responds_to_parent do
38
39
  render :action => 'on_create', :formats => [:js], :layout => false
@@ -40,10 +41,10 @@ module ActiveScaffold::Actions
40
41
  else
41
42
  if successful?
42
43
  flash[:info] = as_(:created_model, :model => @record.to_label)
43
- if action = active_scaffold_config.create.action_after_create
44
+ if (action = active_scaffold_config.create.action_after_create)
44
45
  redirect_to params_for(:action => action, :id => @record.to_param)
45
46
  elsif params[:dont_close]
46
- redirect_to params_for(:action => "new")
47
+ redirect_to params_for(:action => 'new')
47
48
  else
48
49
  return_to_main
49
50
  end
@@ -95,28 +96,25 @@ module ActiveScaffold::Actions
95
96
  # If you want to customize this behavior, consider using the +before_create_save+ and +after_create_save+ callbacks.
96
97
  def do_create(options = {})
97
98
  attributes = options[:attributes] || params[:record]
98
- begin
99
- active_scaffold_config.model.transaction do
100
- @record = update_record_from_params(new_model, active_scaffold_config.create.columns, attributes)
101
- apply_constraints_to_record(@record, :allow_autosave => true)
102
- create_association_with_parent(@record) if nested?
103
- before_create_save(@record)
104
- # errors to @record can be added by update_record_from_params when association fails to set and ActiveRecord::RecordNotSaved is raised
105
- self.successful = [@record.errors.empty? && @record.valid?, @record.associated_valid?].all? # this syntax avoids a short-circuit
106
- create_save(@record) unless options[:skip_save]
107
- end
108
- rescue ActiveRecord::ActiveRecordError => ex
109
- flash[:error] = ex.message
110
- self.successful = false
111
- @record ||= new_model # ensure @record exists or display form will fail
99
+ active_scaffold_config.model.transaction do
100
+ @record = update_record_from_params(new_model, active_scaffold_config.create.columns, attributes)
101
+ apply_constraints_to_record(@record, :allow_autosave => true)
102
+ create_association_with_parent(@record) if nested?
103
+ before_create_save(@record)
104
+ # errors to @record can be added by update_record_from_params when association fails to set and ActiveRecord::RecordNotSaved is raised
105
+ self.successful = [@record.errors.empty? && @record.valid?, @record.associated_valid?].all? # this syntax avoids a short-circuit
106
+ create_save(@record) unless options[:skip_save]
112
107
  end
108
+ rescue ActiveRecord::ActiveRecordError => ex
109
+ flash[:error] = ex.message
110
+ self.successful = false
111
+ @record ||= new_model # ensure @record exists or display form will fail
113
112
  end
114
113
 
115
114
  def create_save(record)
116
- if successful?
117
- record.save! and record.save_associated!
118
- after_create_save(record)
119
- end
115
+ return unless successful?
116
+ record.save! && record.save_associated!
117
+ after_create_save(record)
120
118
  end
121
119
 
122
120
  # override this method if you want to inject data in the record (or its associated objects) before the save
@@ -127,26 +125,29 @@ module ActiveScaffold::Actions
127
125
 
128
126
  # The default security delegates to ActiveRecordPermissions.
129
127
  # You may override the method to customize.
130
-
128
+
131
129
  def create_ignore?
132
130
  active_scaffold_config.list.always_show_create
133
131
  end
134
-
132
+
135
133
  def create_authorized?
136
134
  if nested?
137
- nested_authorized = !nested.readonly? && !nested.readonly_through_association?(active_scaffold_config.create.columns)
138
- return false unless nested_authorized
135
+ return false if nested.readonly? || nested.readonly_through_association?(active_scaffold_config.create.columns)
139
136
  end
140
137
  authorized_for?(:crud_type => :create)
141
138
  end
139
+
142
140
  private
141
+
143
142
  def create_authorized_filter
144
143
  link = active_scaffold_config.create.link || active_scaffold_config.create.class.link
145
- raise ActiveScaffold::ActionNotAllowed unless self.send(link.security_method)
144
+ raise ActiveScaffold::ActionNotAllowed unless send(link.security_method)
146
145
  end
146
+
147
147
  def new_formats
148
148
  (default_formats + active_scaffold_config.formats).uniq
149
149
  end
150
+
150
151
  def create_formats
151
152
  (default_formats + active_scaffold_config.formats + active_scaffold_config.create.formats).uniq
152
153
  end
@@ -7,18 +7,14 @@ module ActiveScaffold::Actions
7
7
  def destroy
8
8
  params.delete :destroy_action
9
9
  process_action_link_action(:destroy) do |record|
10
- do_destroy
10
+ do_destroy(record)
11
11
  end
12
12
  end
13
13
 
14
14
  protected
15
+
15
16
  def destroy_respond_to_html
16
- if self.successful?
17
- flash[:info] = as_(:deleted_model, :model => @record.to_label)
18
- else
19
- #error_message_for not available in controller...
20
- #flash[:error] = active_scaffold_error_messages_for(@record, :object_name => "#{@record.class.model_name.human.downcase}#{@record.new_record? ? '' : ": #{@record.to_label}"}", :header_message => '', :message => "#{@record.class.model_name.human.downcase}#{@record.new_record? ? '' : ": #{@record.to_label}"}", :container_tag => nil, :list_type => :br)
21
- end
17
+ flash[:info] = as_(:deleted_model, :model => @record.to_label) if self.successful?
22
18
  return_to_main
23
19
  end
24
20
 
@@ -28,15 +24,15 @@ module ActiveScaffold::Actions
28
24
  end
29
25
 
30
26
  def destroy_respond_to_xml
31
- render :xml => successful? ? "" : response_object.to_xml(:only => active_scaffold_config.list.columns.names), :content_type => Mime::XML, :status => response_status
27
+ render :xml => successful? ? '' : response_object.to_xml(:only => active_scaffold_config.list.columns.names), :content_type => Mime::XML, :status => response_status
32
28
  end
33
29
 
34
30
  def destroy_respond_to_json
35
- render :text => successful? ? "" : response_object.to_json(:only => active_scaffold_config.list.columns.names), :content_type => Mime::JSON, :status => response_status
31
+ render :text => successful? ? '' : response_object.to_json(:only => active_scaffold_config.list.columns.names), :content_type => Mime::JSON, :status => response_status
36
32
  end
37
33
 
38
34
  def destroy_respond_to_yaml
39
- render :text => successful? ? "" : Hash.from_xml(response_object.to_xml(:only => active_scaffold_config.list.columns.names)).to_yaml, :content_type => Mime::YAML, :status => response_status
35
+ render :text => successful? ? '' : Hash.from_xml(response_object.to_xml(:only => active_scaffold_config.list.columns.names)).to_yaml, :content_type => Mime::YAML, :status => response_status
40
36
  end
41
37
 
42
38
  def destroy_find_record
@@ -45,12 +41,12 @@ module ActiveScaffold::Actions
45
41
 
46
42
  # A simple method to handle the actual destroying of a record
47
43
  # May be overridden to customize the behavior
48
- def do_destroy
49
- @record ||= destroy_find_record
44
+ def do_destroy(record)
45
+ record ||= destroy_find_record
50
46
  begin
51
- self.successful = @record.destroy
52
- rescue Exception => ex
53
- flash[:warning] = as_(:cant_destroy_record, :record => @record.to_label)
47
+ self.successful = record.destroy
48
+ rescue StandardError => ex
49
+ flash[:warning] = as_(:cant_destroy_record, :record => record.to_label)
54
50
  self.successful = false
55
51
  logger.debug ex.message
56
52
  logger.debug ex.backtrace.join("\n")
@@ -62,14 +58,18 @@ module ActiveScaffold::Actions
62
58
  def delete_authorized?(record = nil)
63
59
  (!nested? || !nested.readonly?) && (record || self).send(:authorized_for?, :crud_type => :delete)
64
60
  end
61
+
65
62
  def delete_ignore?(record = nil)
66
- (nested? && nested.readonly?) || !self.send(:authorized_for?, :crud_type => :delete)
63
+ (nested? && nested.readonly?) || !send(:authorized_for?, :crud_type => :delete)
67
64
  end
65
+
68
66
  private
67
+
69
68
  def delete_authorized_filter
70
69
  link = active_scaffold_config.delete.link || active_scaffold_config.delete.class.link
71
- raise ActiveScaffold::ActionNotAllowed unless self.send(link.security_method)
70
+ raise ActiveScaffold::ActionNotAllowed unless send(link.security_method)
72
71
  end
72
+
73
73
  def destroy_formats
74
74
  (default_formats + active_scaffold_config.formats + active_scaffold_config.delete.formats).uniq
75
75
  end
@@ -5,9 +5,8 @@ module ActiveScaffold::Actions
5
5
  base.send :include, ActiveScaffold::Actions::CommonSearch
6
6
  base.send :include, InstanceMethods
7
7
  end
8
-
9
- module InstanceMethods
10
8
 
9
+ module InstanceMethods
11
10
  # FieldSearch uses params[:search] and not @record because search conditions do not always pass the Model's validations.
12
11
  # This facilitates for example, textual searches against associations via .search_sql
13
12
  def show_search
@@ -20,28 +19,27 @@ module ActiveScaffold::Actions
20
19
  def search_partial
21
20
  super || :field_search
22
21
  end
23
-
22
+
24
23
  def store_search_params_into_session
25
24
  set_field_search_default_params(active_scaffold_config.field_search.default_params) unless active_scaffold_config.field_search.default_params.nil?
26
25
  super
27
26
  end
28
-
27
+
29
28
  def set_field_search_default_params(default_params)
30
- if (params[:search].nil? && search_params.nil?) || (params[:search].is_a?(String) && params[:search].blank?)
31
- params[:search] = default_params.is_a?(Proc) ? self.instance_eval(&default_params) : default_params
32
- end
29
+ return unless (params[:search].is_a?(String) || search_params.nil?) && params[:search].blank?
30
+ params[:search] = default_params.is_a?(Proc) ? instance_eval(&default_params) : default_params
33
31
  end
34
-
32
+
35
33
  def field_search_params
36
34
  search_params.is_a?(Hash) ? search_params : {}
37
35
  end
38
36
 
39
37
  def field_search_respond_to_html
40
- render(:action => "field_search")
38
+ render(:action => 'field_search')
41
39
  end
42
-
40
+
43
41
  def field_search_respond_to_js
44
- render(:partial => "field_search")
42
+ render(:partial => 'field_search')
45
43
  end
46
44
 
47
45
  def do_search
@@ -53,15 +51,15 @@ module ActiveScaffold::Actions
53
51
  next unless columns.include? key
54
52
  column = active_scaffold_config.columns[key]
55
53
  search_condition = self.class.condition_for_column(column, value, text_search)
56
- unless search_condition.blank?
57
- if active_scaffold_config.list.user.count_includes.nil? && column.includes.present? && list_columns.include?(column)
58
- self.active_scaffold_references << column.includes
59
- elsif column.search_joins.present?
60
- self.active_scaffold_outer_joins << column.search_joins
61
- end
62
- self.active_scaffold_conditions << search_condition
63
- filtered_columns << column
54
+ next if search_condition.blank?
55
+
56
+ if active_scaffold_config.list.user.count_includes.nil? && column.includes.present? && list_columns.include?(column)
57
+ active_scaffold_references << column.includes
58
+ elsif column.search_joins.present?
59
+ active_scaffold_outer_joins << column.search_joins
64
60
  end
61
+ active_scaffold_conditions << search_condition
62
+ filtered_columns << column
65
63
  end
66
64
  unless filtered_columns.blank?
67
65
  @filtered = active_scaffold_config.field_search.human_conditions ? filtered_columns : true
@@ -78,6 +76,7 @@ module ActiveScaffold::Actions
78
76
  end
79
77
 
80
78
  private
79
+
81
80
  def field_search_formats
82
81
  (default_formats + active_scaffold_config.formats + active_scaffold_config.field_search.formats).uniq
83
82
  end
@@ -14,6 +14,7 @@ module ActiveScaffold::Actions
14
14
  end
15
15
 
16
16
  protected
17
+
17
18
  # get just a single row
18
19
  def row
19
20
  get_row
@@ -36,6 +37,7 @@ module ActiveScaffold::Actions
36
37
  render :action => 'list'
37
38
  end
38
39
  end
40
+
39
41
  def list_respond_to_js
40
42
  if params[:adapter] || loading_embedded?
41
43
  render(:partial => 'list_with_header')
@@ -44,12 +46,15 @@ module ActiveScaffold::Actions
44
46
  render :partial => 'refresh_list', :formats => [:js]
45
47
  end
46
48
  end
49
+
47
50
  def list_respond_to_xml
48
51
  render :xml => response_object.to_xml(:only => list_columns_names + [active_scaffold_config.model.primary_key], :include => association_columns(list_columns_names), :methods => virtual_columns(list_columns_names)), :content_type => Mime::XML, :status => response_status
49
52
  end
53
+
50
54
  def list_respond_to_json
51
55
  render :text => response_object.to_json(:only => list_columns_names + [active_scaffold_config.model.primary_key], :include => association_columns(list_columns_names), :methods => virtual_columns(list_columns_names)), :content_type => Mime::JSON, :status => response_status
52
56
  end
57
+
53
58
  def list_respond_to_yaml
54
59
  render :text => Hash.from_xml(response_object.to_xml(:only => list_columns_names + [active_scaffold_config.model.primary_key], :include => association_columns(list_columns_names), :methods => virtual_columns(list_columns_names))).to_yaml, :content_type => Mime::YAML, :status => response_status
55
60
  end
@@ -65,15 +70,16 @@ module ActiveScaffold::Actions
65
70
  # The actual algorithm to prepare for the list view
66
71
  def set_includes_for_columns(action = :list)
67
72
  @cache_associations = true
68
- columns = if respond_to?(:"#{action}_columns", true)
69
- send(:"#{action}_columns")
70
- else
71
- active_scaffold_config.send(action).columns.collect_visible(:flatten => true)
72
- end
73
+ columns =
74
+ if respond_to?(:"#{action}_columns", true)
75
+ send(:"#{action}_columns")
76
+ else
77
+ active_scaffold_config.send(action).columns.collect_visible(:flatten => true)
78
+ end
73
79
  sorting = active_scaffold_config.list.user.sorting
74
- columns_for_joins, columns_for_includes = columns.select{ |c| c.includes.present? }.partition {|c| sorting.sorts_on? c }
75
- self.active_scaffold_preload.concat columns_for_includes.map(&:includes).flatten.uniq
76
- self.active_scaffold_references.concat columns_for_joins.map(&:includes).flatten.uniq
80
+ columns_for_joins, columns_for_includes = columns.select { |c| c.includes.present? }.partition { |c| sorting.sorts_on? c }
81
+ active_scaffold_preload.concat columns_for_includes.map(&:includes).flatten.uniq
82
+ active_scaffold_references.concat columns_for_joins.map(&:includes).flatten.uniq
77
83
  end
78
84
 
79
85
  def get_row(crud_type_or_security_options = :read)
@@ -85,9 +91,9 @@ module ActiveScaffold::Actions
85
91
  def do_list
86
92
  set_includes_for_columns
87
93
 
88
- options = { :sorting => active_scaffold_config.list.user.sorting,
89
- :count_includes => active_scaffold_config.list.user.count_includes }
90
- paginate = (params[:format].nil?) ? (accepts? :html, :js) : ['html', 'js'].include?(params[:format])
94
+ options = {:sorting => active_scaffold_config.list.user.sorting,
95
+ :count_includes => active_scaffold_config.list.user.count_includes}
96
+ paginate = (params[:format].nil?) ? (accepts? :html, :js) : %w(html js).include?(params[:format])
91
97
  options[:pagination] = active_scaffold_config.list.pagination if paginate
92
98
  if options[:pagination]
93
99
  options.merge!(
@@ -120,15 +126,15 @@ module ActiveScaffold::Actions
120
126
  end
121
127
 
122
128
  def each_record_in_page
123
- _page = active_scaffold_config.list.user.page
129
+ current_page = active_scaffold_config.list.user.page
124
130
  do_search if respond_to? :do_search, true
125
- active_scaffold_config.list.user.page = _page
131
+ active_scaffold_config.list.user.page = current_page
126
132
  do_list
127
- @page.items.each {|record| yield record}
133
+ @page.items.each { |record| yield record }
128
134
  end
129
135
 
130
136
  def each_record_in_scope
131
- scoped_query.each {|record| yield record}
137
+ scoped_query.each { |record| yield record }
132
138
  end
133
139
 
134
140
  def scoped_query
@@ -150,19 +156,21 @@ module ActiveScaffold::Actions
150
156
  do_refresh_list unless @record.present?
151
157
  super
152
158
  end
153
-
159
+
154
160
  def objects_for_etag
155
- objects = if @list_columns
156
- if active_scaffold_config.list.calculate_etag
157
- @records.to_a
158
- elsif active_scaffold_config.list.user.sorting
159
- {:etag => active_scaffold_config.list.user.sorting.clause}
161
+ objects =
162
+ if @list_columns
163
+ if active_scaffold_config.list.calculate_etag
164
+ @records.to_a
165
+ elsif active_scaffold_config.list.user.sorting
166
+ {:etag => active_scaffold_config.list.user.sorting.clause}
167
+ end
160
168
  end
161
- end
162
169
  objects.present? ? objects : super
163
170
  end
164
171
 
165
172
  private
173
+
166
174
  def list_authorized_filter
167
175
  raise ActiveScaffold::ActionNotAllowed unless list_authorized?
168
176
  end
@@ -1,6 +1,5 @@
1
1
  module ActiveScaffold::Actions
2
2
  module Mark
3
-
4
3
  def self.included(base)
5
4
  base.before_filter :mark_authorized?, :only => :mark
6
5
  base.before_filter :assign_marked_records_to_model
@@ -19,6 +18,7 @@ module ActiveScaffold::Actions
19
18
  end
20
19
  respond_to_action(:mark)
21
20
  end
21
+
22
22
  protected
23
23
 
24
24
  def mark_respond_to_html
@@ -1,13 +1,12 @@
1
1
  module ActiveScaffold::Actions
2
2
  # The Nested module basically handles automatically linking controllers together. It does this by creating column links with the right parameters, and by providing any supporting systems (like a /:controller/nested action for returning associated scaffolds).
3
3
  module Nested
4
-
5
4
  def self.included(base)
6
5
  super
7
6
  base.module_eval do
8
7
  before_filter :set_nested
9
8
  before_filter :configure_nested
10
- include ActiveScaffold::Actions::Nested::ChildMethods if active_scaffold_config.model.reflect_on_all_associations.any? {|a| a.macro == :has_and_belongs_to_many}
9
+ include ActiveScaffold::Actions::Nested::ChildMethods if active_scaffold_config.model.reflect_on_all_associations.any? { |a| a.macro == :has_and_belongs_to_many }
11
10
  end
12
11
  base.before_filter :include_habtm_actions
13
12
  base.helper_method :nested
@@ -15,64 +14,68 @@ module ActiveScaffold::Actions
15
14
  end
16
15
 
17
16
  protected
17
+
18
18
  def nested
19
19
  set_nested unless defined? @nested
20
20
  @nested
21
21
  end
22
-
22
+
23
23
  def nested?
24
24
  !nested.nil?
25
25
  end
26
-
26
+
27
27
  def set_nested
28
- if params[:parent_scaffold] && (params[:association] || params[:named_scope])
29
- @nested = ActiveScaffold::DataStructures::NestedInfo.get(active_scaffold_config.model, params)
30
- register_constraints_with_action_columns(@nested.constrained_fields) unless @nested.nil?
31
- end
28
+ return unless params[:parent_scaffold] && (params[:association] || params[:named_scope])
29
+ @nested = ActiveScaffold::DataStructures::NestedInfo.get(active_scaffold_config.model, params)
30
+ register_constraints_with_action_columns(@nested.constrained_fields) unless @nested.nil?
32
31
  end
33
-
32
+
34
33
  def configure_nested
35
- if nested?
36
- active_scaffold_config.list.user.label = if nested.belongs_to?
37
- as_(:nested_of_model, :nested_model => active_scaffold_config.model.model_name.human, :parent_model => nested_parent_record.to_label)
38
- else
39
- as_(:nested_for_model, :nested_model => active_scaffold_config.list.label, :parent_model => nested_parent_record.to_label)
40
- end
41
- if nested.sorted? && !active_scaffold_config.nested.ignore_order_from_association
42
- active_scaffold_config.list.user.nested_default_sorting = {:table_name => active_scaffold_config.model.model_name, :default_sorting => nested.default_sorting}
43
- end
34
+ return unless nested?
35
+ active_scaffold_config.list.user.label = nested_label
36
+ active_scaffold_config.list.user.nested_default_sorting = nested_default_sorting if nested.sorted? && !active_scaffold_config.nested.ignore_order_from_association
37
+ end
38
+
39
+ def nested_label
40
+ if nested.belongs_to?
41
+ as_(:nested_of_model, :nested_model => active_scaffold_config.model.model_name.human, :parent_model => nested_parent_record.to_label)
42
+ else
43
+ as_(:nested_for_model, :nested_model => active_scaffold_config.list.label, :parent_model => nested_parent_record.to_label)
44
44
  end
45
45
  end
46
-
46
+
47
+ def nested_default_sorting
48
+ {:table_name => active_scaffold_config.model.model_name, :default_sorting => nested.default_sorting}
49
+ end
50
+
47
51
  def nested_authorized?(record = nil)
48
52
  true
49
53
  end
50
54
 
51
55
  def include_habtm_actions
52
- if nested?
53
- if nested.habtm?
54
- # Production mode is ok with adding a link everytime the scaffold is nested - we ar not ok with that.
55
- active_scaffold_config.action_links.add('new_existing', :label => :add_existing, :type => :collection, :security_method => :add_existing_authorized?) unless active_scaffold_config.action_links['new_existing']
56
- if active_scaffold_config.nested.shallow_delete
57
- active_scaffold_config.action_links.add('destroy_existing', :label => :remove, :type => :member, :confirm => :are_you_sure_to_delete, :method => :delete, :position => false, :security_method => :delete_existing_authorized?) unless active_scaffold_config.action_links['destroy_existing']
58
- if active_scaffold_config.actions.include?(:delete)
59
- active_scaffold_config.action_links.delete("delete") if active_scaffold_config.action_links['delete']
60
- end
56
+ return unless nested?
57
+ if nested.habtm?
58
+ # Production mode is ok with adding a link everytime the scaffold is nested - we are not ok with that.
59
+ active_scaffold_config.action_links.add('new_existing', :label => :add_existing, :type => :collection, :security_method => :add_existing_authorized?) unless active_scaffold_config.action_links['new_existing']
60
+ if active_scaffold_config.nested.shallow_delete
61
+ active_scaffold_config.action_links.add('destroy_existing', :label => :remove, :type => :member, :confirm => :are_you_sure_to_delete, :method => :delete, :position => false, :security_method => :delete_existing_authorized?) unless active_scaffold_config.action_links['destroy_existing']
62
+ if active_scaffold_config.actions.include?(:delete)
63
+ active_scaffold_config.action_links.delete('delete') if active_scaffold_config.action_links['delete']
61
64
  end
62
- else
63
- # Production mode is caching this link into a non nested scaffold
64
- active_scaffold_config.action_links.delete('new_existing') if active_scaffold_config.action_links['new_existing']
65
-
66
- if active_scaffold_config.nested.shallow_delete
67
- active_scaffold_config.action_links.delete("destroy_existing") if active_scaffold_config.action_links['destroy_existing']
68
- if active_scaffold_config.actions.include?(:delete)
69
- active_scaffold_config.action_links.add(ActiveScaffold::Config::Delete.link) unless active_scaffold_config.action_links['delete']
70
- end
65
+ end
66
+ else
67
+ # Production mode is caching this link into a non nested scaffold
68
+ active_scaffold_config.action_links.delete('new_existing') if active_scaffold_config.action_links['new_existing']
69
+
70
+ if active_scaffold_config.nested.shallow_delete
71
+ active_scaffold_config.action_links.delete('destroy_existing') if active_scaffold_config.action_links['destroy_existing']
72
+ if active_scaffold_config.actions.include?(:delete)
73
+ active_scaffold_config.action_links.add(ActiveScaffold::Config::Delete.link) unless active_scaffold_config.action_links['delete']
71
74
  end
72
75
  end
73
76
  end
74
77
  end
75
-
78
+
76
79
  def beginning_of_chain
77
80
  if nested? && nested.association
78
81
  if nested.association.collection?
@@ -85,10 +88,11 @@ module ActiveScaffold::Actions
85
88
  active_scaffold_config.model.where(nested.child_association.foreign_key => nested_parent_record.send(nested.association.association_primary_key))
86
89
  elsif nested.association.belongs_to?
87
90
  chain = active_scaffold_config.model.joins(nested.child_association.name)
88
- table_name = if active_scaffold_config.model == nested.association.active_record
89
- dependency = ActiveRecord::Associations::JoinDependency.new(chain.klass, chain.joins_values, [])
90
- dependency.join_associations.find {|join| join.try(:reflection).try(:name) == nested.child_association.name}.try(:table).try(:right)
91
- end
91
+ table_name =
92
+ if active_scaffold_config.model == nested.association.active_record
93
+ dependency = ActiveRecord::Associations::JoinDependency.new(chain.klass, chain.joins_values, [])
94
+ dependency.join_associations.find { |join| join.try(:reflection).try(:name) == nested.child_association.name }.try(:table).try(:right)
95
+ end
92
96
  table_name ||= nested.association.active_record.table_name
93
97
  chain.where(table_name => {nested.association.active_record.primary_key => nested_parent_record}).readonly(false)
94
98
  end
@@ -102,23 +106,21 @@ module ActiveScaffold::Actions
102
106
  def nested_parent_record(crud = :read)
103
107
  @nested_parent_record ||= find_if_allowed(nested.parent_id, crud, nested.parent_model)
104
108
  end
105
-
109
+
106
110
  def create_association_with_parent(record)
107
- if nested?
108
- # has_many is done by beginning_of_chain and rails
109
- if (nested.belongs_to? || nested.has_one? || nested.habtm?) && nested.child_association
110
- parent = nested_parent_record(:read)
111
- case nested.child_association.macro
112
- when :has_one, :belongs_to
113
- record.send("#{nested.child_association.name}=", parent)
114
- when :has_many, :has_and_belongs_to_many
115
- record.send("#{nested.child_association.name}").send(:<<, parent)
116
- end unless parent.nil?
117
- end
111
+ # has_many is done by beginning_of_chain and rails
112
+ return unless (nested.belongs_to? || nested.has_one? || nested.habtm?) && nested.child_association
113
+ return if (parent = nested_parent_record).nil?
114
+ case nested.child_association.macro
115
+ when :has_one, :belongs_to
116
+ record.send("#{nested.child_association.name}=", parent)
117
+ when :has_many, :has_and_belongs_to_many
118
+ record.send("#{nested.child_association.name}").send(:<<, parent)
118
119
  end
119
120
  end
120
-
121
+
121
122
  private
123
+
122
124
  def nested_formats
123
125
  (default_formats + active_scaffold_config.formats + active_scaffold_config.nested.formats).uniq
124
126
  end
@@ -127,7 +129,6 @@ end
127
129
 
128
130
  module ActiveScaffold::Actions::Nested
129
131
  module ChildMethods
130
-
131
132
  def self.included(base)
132
133
  super
133
134
  end
@@ -147,8 +148,9 @@ module ActiveScaffold::Actions::Nested
147
148
  do_destroy_existing
148
149
  respond_to_action(:destroy_existing)
149
150
  end
150
-
151
+
151
152
  protected
153
+
152
154
  def new_existing_respond_to_html
153
155
  if successful?
154
156
  render(:action => 'add_existing_form')
@@ -156,9 +158,11 @@ module ActiveScaffold::Actions::Nested
156
158
  return_to_main
157
159
  end
158
160
  end
161
+
159
162
  def new_existing_respond_to_js
160
163
  render(:partial => 'add_existing_form')
161
164
  end
165
+
162
166
  def add_existing_respond_to_html
163
167
  if successful?
164
168
  flash[:info] = as_(:created_model, :model => @record.to_label)
@@ -167,6 +171,7 @@ module ActiveScaffold::Actions::Nested
167
171
  render(:action => 'add_existing_form')
168
172
  end
169
173
  end
174
+
170
175
  def add_existing_respond_to_js
171
176
  if successful?
172
177
  render :action => 'add_existing'
@@ -174,15 +179,19 @@ module ActiveScaffold::Actions::Nested
174
179
  render :action => 'form_messages'
175
180
  end
176
181
  end
182
+
177
183
  def add_existing_respond_to_xml
178
184
  render :xml => response_object.to_xml(:only => active_scaffold_config.list.columns.names), :content_type => Mime::XML, :status => response_status
179
185
  end
186
+
180
187
  def add_existing_respond_to_json
181
188
  render :text => response_object.to_json(:only => active_scaffold_config.list.columns.names), :content_type => Mime::JSON, :status => response_status
182
189
  end
190
+
183
191
  def add_existing_respond_to_yaml
184
192
  render :text => Hash.from_xml(response_object.to_xml(:only => active_scaffold_config.list.columns.names)).to_yaml, :content_type => Mime::YAML, :status => response_status
185
193
  end
194
+
186
195
  def destroy_existing_respond_to_html
187
196
  flash[:info] = as_(:deleted_model, :model => @record.to_label)
188
197
  return_to_main
@@ -193,29 +202,29 @@ module ActiveScaffold::Actions::Nested
193
202
  end
194
203
 
195
204
  def destroy_existing_respond_to_xml
196
- render :xml => successful? ? "" : response_object.to_xml(:only => active_scaffold_config.list.columns.names), :content_type => Mime::XML, :status => response_status
205
+ render :xml => successful? ? '' : response_object.to_xml(:only => active_scaffold_config.list.columns.names), :content_type => Mime::XML, :status => response_status
197
206
  end
198
207
 
199
208
  def destroy_existing_respond_to_json
200
- render :text => successful? ? "" : response_object.to_json(:only => active_scaffold_config.list.columns.names), :content_type => Mime::JSON, :status => response_status
209
+ render :text => successful? ? '' : response_object.to_json(:only => active_scaffold_config.list.columns.names), :content_type => Mime::JSON, :status => response_status
201
210
  end
202
211
 
203
212
  def destroy_existing_respond_to_yaml
204
- render :text => successful? ? "" : Hash.from_xml(response_object.to_xml(:only => active_scaffold_config.list.columns.names)).to_yaml, :content_type => Mime::YAML, :status => response_status
213
+ render :text => successful? ? '' : Hash.from_xml(response_object.to_xml(:only => active_scaffold_config.list.columns.names)).to_yaml, :content_type => Mime::YAML, :status => response_status
205
214
  end
206
215
 
207
216
  def add_existing_authorized?(record = nil)
208
217
  true
209
218
  end
219
+
210
220
  def delete_existing_authorized?(record = nil)
211
221
  true
212
222
  end
213
-
223
+
214
224
  def after_create_save(record)
215
- if params[:association_macro] == :has_and_belongs_to_many
216
- params[:associated_id] = record
217
- do_add_existing
218
- end
225
+ return unless params[:association_macro] == :has_and_belongs_to_many
226
+ params[:associated_id] = record
227
+ do_add_existing
219
228
  end
220
229
 
221
230
  # The actual "add_existing" algorithm
@@ -240,13 +249,17 @@ module ActiveScaffold::Actions::Nested
240
249
  do_destroy
241
250
  end
242
251
  end
252
+
243
253
  private
254
+
244
255
  def new_existing_formats
245
256
  (default_formats + active_scaffold_config.formats).uniq
246
257
  end
258
+
247
259
  def add_existing_formats
248
260
  (default_formats + active_scaffold_config.formats).uniq
249
261
  end
262
+
250
263
  def destroy_existing_formats
251
264
  (default_formats + active_scaffold_config.formats).uniq
252
265
  end