active_scaffold 3.4.17 → 3.4.18

Sign up to get free protection for your applications and to get access to all the features.
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