active_scaffold 3.7.12 → 4.0.0.rc1

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 (303) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.rdoc +9 -23
  3. data/README.md +3 -2
  4. data/app/assets/config/active_scaffold_manifest.js +3 -0
  5. data/app/assets/javascripts/active_scaffold.js.erb +24 -34
  6. data/app/assets/javascripts/jquery/active_scaffold.js +41 -58
  7. data/app/assets/javascripts/jquery/date_picker_bridge.js.erb +1 -1
  8. data/app/assets/stylesheets/active_scaffold_colors.scss +0 -7
  9. data/app/assets/stylesheets/active_scaffold_extensions.css.erb +2 -2
  10. data/app/assets/stylesheets/active_scaffold_jquery_ui.css.erb +7 -7
  11. data/app/assets/stylesheets/active_scaffold_layout.css +57 -30
  12. data/app/views/active_scaffold_overrides/_add_existing_form.html.erb +10 -10
  13. data/app/views/active_scaffold_overrides/_base_form.html.erb +21 -21
  14. data/app/views/active_scaffold_overrides/_create_form.html.erb +10 -7
  15. data/app/views/active_scaffold_overrides/_create_form_on_list.html.erb +5 -5
  16. data/app/views/active_scaffold_overrides/_field_search.html.erb +6 -6
  17. data/app/views/active_scaffold_overrides/_form.html.erb +11 -14
  18. data/app/views/active_scaffold_overrides/_form_association.html.erb +21 -12
  19. data/app/views/active_scaffold_overrides/_form_association_footer.html.erb +19 -10
  20. data/app/views/active_scaffold_overrides/_form_association_record.html.erb +15 -21
  21. data/app/views/active_scaffold_overrides/_form_messages.html.erb +2 -2
  22. data/app/views/active_scaffold_overrides/_horizontal_subform.html.erb +7 -6
  23. data/app/views/active_scaffold_overrides/_human_conditions.html.erb +2 -2
  24. data/app/views/active_scaffold_overrides/_list.html.erb +15 -8
  25. data/app/views/active_scaffold_overrides/_list_calculations.html.erb +2 -3
  26. data/app/views/active_scaffold_overrides/_list_header.html.erb +2 -2
  27. data/app/views/active_scaffold_overrides/_list_inline_adapter.html.erb +5 -5
  28. data/app/views/active_scaffold_overrides/_list_messages.html.erb +12 -3
  29. data/app/views/active_scaffold_overrides/_list_pagination.html.erb +3 -3
  30. data/app/views/active_scaffold_overrides/_list_pagination_links.html.erb +4 -4
  31. data/app/views/active_scaffold_overrides/_list_record.html.erb +6 -6
  32. data/app/views/active_scaffold_overrides/_list_with_header.html.erb +4 -4
  33. data/app/views/active_scaffold_overrides/_messages.html.erb +1 -1
  34. data/app/views/active_scaffold_overrides/_refresh_list.js.erb +2 -2
  35. data/app/views/active_scaffold_overrides/_render_field.js.erb +4 -4
  36. data/app/views/active_scaffold_overrides/_row.html.erb +1 -1
  37. data/app/views/active_scaffold_overrides/_search.html.erb +6 -5
  38. data/app/views/active_scaffold_overrides/_show.html.erb +3 -3
  39. data/app/views/active_scaffold_overrides/_show_actions.html.erb +1 -1
  40. data/app/views/active_scaffold_overrides/_show_association.html.erb +1 -1
  41. data/app/views/active_scaffold_overrides/_show_association_horizontal.html.erb +1 -1
  42. data/app/views/active_scaffold_overrides/_show_association_vertical.html.erb +1 -1
  43. data/app/views/active_scaffold_overrides/_show_columns.html.erb +1 -1
  44. data/app/views/active_scaffold_overrides/_show_horizontal_record.html.erb +1 -1
  45. data/app/views/active_scaffold_overrides/_update_actions.html.erb +1 -1
  46. data/app/views/active_scaffold_overrides/_update_calculations.js.erb +2 -2
  47. data/app/views/active_scaffold_overrides/_update_column.js.erb +8 -7
  48. data/app/views/active_scaffold_overrides/_update_form.html.erb +5 -5
  49. data/app/views/active_scaffold_overrides/_update_messages.js.erb +1 -1
  50. data/app/views/active_scaffold_overrides/_vertical_subform.html.erb +4 -3
  51. data/app/views/active_scaffold_overrides/action_confirmation.html.erb +3 -3
  52. data/app/views/active_scaffold_overrides/add_existing.js.erb +6 -6
  53. data/app/views/active_scaffold_overrides/add_existing_form.html.erb +1 -1
  54. data/app/views/active_scaffold_overrides/add_tab.js.erb +15 -0
  55. data/app/views/active_scaffold_overrides/create.html.erb +1 -1
  56. data/app/views/active_scaffold_overrides/delete.html.erb +4 -4
  57. data/app/views/active_scaffold_overrides/destroy.js.erb +15 -13
  58. data/app/views/active_scaffold_overrides/edit_associated.js.erb +3 -3
  59. data/app/views/active_scaffold_overrides/field_search.html.erb +1 -1
  60. data/app/views/active_scaffold_overrides/form_messages.js.erb +1 -1
  61. data/app/views/active_scaffold_overrides/list.html.erb +1 -1
  62. data/app/views/active_scaffold_overrides/on_action_update.js.erb +13 -8
  63. data/app/views/active_scaffold_overrides/on_create.js.erb +34 -6
  64. data/app/views/active_scaffold_overrides/on_mark.js.erb +3 -3
  65. data/app/views/active_scaffold_overrides/on_update.js.erb +9 -9
  66. data/app/views/active_scaffold_overrides/render_field.js.erb +1 -1
  67. data/app/views/active_scaffold_overrides/render_field_inplace.html.erb +1 -1
  68. data/app/views/active_scaffold_overrides/row.js.erb +2 -2
  69. data/app/views/active_scaffold_overrides/search.html.erb +1 -1
  70. data/app/views/active_scaffold_overrides/show.html.erb +3 -3
  71. data/app/views/active_scaffold_overrides/update.html.erb +2 -2
  72. data/app/views/active_scaffold_overrides/update_column.js.erb +4 -4
  73. data/app/views/active_scaffold_overrides/update_row.js.erb +1 -1
  74. data/lib/active_scaffold/actions/common_search.rb +5 -3
  75. data/lib/active_scaffold/actions/core.rb +57 -32
  76. data/lib/active_scaffold/actions/create.rb +19 -17
  77. data/lib/active_scaffold/actions/delete.rb +10 -12
  78. data/lib/active_scaffold/actions/field_search.rb +28 -13
  79. data/lib/active_scaffold/actions/list.rb +34 -34
  80. data/lib/active_scaffold/actions/mark.rb +5 -5
  81. data/lib/active_scaffold/actions/nested.rb +64 -56
  82. data/lib/active_scaffold/actions/search.rb +2 -2
  83. data/lib/active_scaffold/actions/show.rb +5 -5
  84. data/lib/active_scaffold/actions/subform.rb +15 -4
  85. data/lib/active_scaffold/actions/update.rb +20 -20
  86. data/lib/active_scaffold/active_record_permissions.rb +4 -3
  87. data/lib/active_scaffold/attribute_params.rb +51 -50
  88. data/lib/active_scaffold/bridges/active_storage/active_storage_bridge.rb +4 -4
  89. data/lib/active_scaffold/bridges/active_storage/active_storage_helpers.rb +6 -2
  90. data/lib/active_scaffold/bridges/active_storage.rb +1 -1
  91. data/lib/active_scaffold/bridges/ancestry/ancestry_bridge.rb +3 -3
  92. data/lib/active_scaffold/bridges/bitfields/bitfields_bridge.rb +4 -1
  93. data/lib/active_scaffold/bridges/bitfields.rb +1 -1
  94. data/lib/active_scaffold/bridges/cancan/cancan_bridge.rb +9 -8
  95. data/lib/active_scaffold/bridges/cancan.rb +8 -8
  96. data/lib/active_scaffold/bridges/carrierwave/form_ui.rb +1 -1
  97. data/lib/active_scaffold/bridges/carrierwave/list_ui.rb +4 -3
  98. data/lib/active_scaffold/bridges/carrierwave.rb +2 -2
  99. data/lib/active_scaffold/bridges/chosen.rb +1 -5
  100. data/lib/active_scaffold/bridges/country_select/country_select_bridge_helper.rb +4 -2
  101. data/lib/active_scaffold/bridges/date_picker/ext.rb +20 -12
  102. data/lib/active_scaffold/bridges/date_picker/helper.rb +37 -33
  103. data/lib/active_scaffold/bridges/date_picker.rb +1 -4
  104. data/lib/active_scaffold/bridges/dragonfly/dragonfly_bridge.rb +1 -1
  105. data/lib/active_scaffold/bridges/dragonfly/list_ui.rb +3 -2
  106. data/lib/active_scaffold/bridges/dragonfly.rb +1 -1
  107. data/lib/active_scaffold/bridges/file_column/as_file_column_bridge.rb +3 -2
  108. data/lib/active_scaffold/bridges/file_column/file_column_helpers.rb +2 -1
  109. data/lib/active_scaffold/bridges/file_column/form_ui.rb +4 -9
  110. data/lib/active_scaffold/bridges/file_column/list_ui.rb +6 -3
  111. data/lib/active_scaffold/bridges/file_column/test/functional/file_column_keep_test.rb +3 -3
  112. data/lib/active_scaffold/bridges/file_column/test/mock_model.rb +1 -4
  113. data/lib/active_scaffold/bridges/file_column.rb +1 -0
  114. data/lib/active_scaffold/bridges/paper_trail/actions.rb +4 -2
  115. data/lib/active_scaffold/bridges/paper_trail/config.rb +1 -1
  116. data/lib/active_scaffold/bridges/paper_trail/helper.rb +1 -1
  117. data/lib/active_scaffold/bridges/paper_trail/paper_trail_bridge.rb +2 -1
  118. data/lib/active_scaffold/bridges/paperclip/list_ui.rb +3 -2
  119. data/lib/active_scaffold/bridges/paperclip/paperclip_bridge.rb +1 -1
  120. data/lib/active_scaffold/bridges/paperclip/paperclip_bridge_helpers.rb +10 -9
  121. data/lib/active_scaffold/bridges/paperclip.rb +2 -1
  122. data/lib/active_scaffold/bridges/record_select/helpers.rb +10 -11
  123. data/lib/active_scaffold/bridges/semantic_attributes/column.rb +3 -1
  124. data/lib/active_scaffold/bridges/tiny_mce/helpers.rb +3 -7
  125. data/lib/active_scaffold/bridges/tiny_mce.rb +2 -7
  126. data/lib/active_scaffold/bridges/usa_state_select/usa_state_select_helper.rb +7 -7
  127. data/lib/active_scaffold/bridges.rb +7 -5
  128. data/lib/active_scaffold/config/base.rb +20 -24
  129. data/lib/active_scaffold/config/core.rb +27 -39
  130. data/lib/active_scaffold/config/create.rb +1 -1
  131. data/lib/active_scaffold/config/delete.rb +9 -9
  132. data/lib/active_scaffold/config/field_search.rb +4 -9
  133. data/lib/active_scaffold/config/form.rb +3 -1
  134. data/lib/active_scaffold/config/list.rb +19 -15
  135. data/lib/active_scaffold/config/nested.rb +2 -2
  136. data/lib/active_scaffold/config/search.rb +5 -5
  137. data/lib/active_scaffold/config/show.rb +1 -1
  138. data/lib/active_scaffold/config/subform.rb +1 -1
  139. data/lib/active_scaffold/config/update.rb +4 -5
  140. data/lib/active_scaffold/configurable.rb +2 -1
  141. data/lib/active_scaffold/constraints.rb +16 -11
  142. data/lib/active_scaffold/core.rb +25 -27
  143. data/lib/active_scaffold/data_structures/action_columns.rb +10 -3
  144. data/lib/active_scaffold/data_structures/action_link.rb +19 -9
  145. data/lib/active_scaffold/data_structures/action_links.rb +20 -26
  146. data/lib/active_scaffold/data_structures/actions.rb +3 -3
  147. data/lib/active_scaffold/data_structures/association/abstract.rb +8 -4
  148. data/lib/active_scaffold/data_structures/association/active_mongoid.rb +1 -0
  149. data/lib/active_scaffold/data_structures/association/active_record.rb +1 -4
  150. data/lib/active_scaffold/data_structures/column.rb +368 -327
  151. data/lib/active_scaffold/data_structures/columns.rb +3 -2
  152. data/lib/active_scaffold/data_structures/nested_info.rb +6 -5
  153. data/lib/active_scaffold/data_structures/proxy_column.rb +68 -0
  154. data/lib/active_scaffold/data_structures/set.rb +7 -4
  155. data/lib/active_scaffold/data_structures/sorting.rb +21 -12
  156. data/lib/active_scaffold/engine.rb +12 -12
  157. data/lib/active_scaffold/extensions/action_controller_rendering.rb +5 -5
  158. data/lib/active_scaffold/extensions/action_controller_rescueing.rb +1 -1
  159. data/lib/active_scaffold/extensions/action_view_rendering.rb +29 -31
  160. data/lib/active_scaffold/extensions/ice_nine.rb +2 -1
  161. data/lib/active_scaffold/extensions/localize.rb +2 -2
  162. data/lib/active_scaffold/extensions/name_option_for_datetime.rb +1 -1
  163. data/lib/active_scaffold/extensions/routing_mapper.rb +5 -4
  164. data/lib/active_scaffold/extensions/unsaved_associated.rb +3 -2
  165. data/lib/active_scaffold/finder.rb +71 -78
  166. data/lib/active_scaffold/helpers/action_link_helpers.rb +37 -49
  167. data/lib/active_scaffold/helpers/association_helpers.rb +3 -2
  168. data/lib/active_scaffold/helpers/controller_helpers.rb +18 -16
  169. data/lib/active_scaffold/helpers/form_column_helpers.rb +69 -53
  170. data/lib/active_scaffold/helpers/human_condition_helpers.rb +17 -15
  171. data/lib/active_scaffold/helpers/id_helpers.rb +5 -5
  172. data/lib/active_scaffold/helpers/list_column_helpers.rb +35 -38
  173. data/lib/active_scaffold/helpers/pagination_helpers.rb +4 -4
  174. data/lib/active_scaffold/helpers/search_column_helpers.rb +25 -34
  175. data/lib/active_scaffold/helpers/show_column_helpers.rb +7 -4
  176. data/lib/active_scaffold/helpers/tabs_helpers.rb +88 -0
  177. data/lib/active_scaffold/helpers/view_helpers.rb +15 -13
  178. data/lib/active_scaffold/marked_model.rb +1 -2
  179. data/lib/active_scaffold/orm_checks.rb +6 -4
  180. data/lib/active_scaffold/paginator.rb +3 -2
  181. data/lib/active_scaffold/registry.rb +5 -0
  182. data/lib/active_scaffold/tableless.rb +24 -14
  183. data/lib/active_scaffold/version.rb +4 -4
  184. data/lib/active_scaffold.rb +8 -34
  185. data/lib/generators/active_scaffold/controller_generator.rb +20 -20
  186. data/lib/generators/active_scaffold/install_generator.rb +4 -8
  187. data/lib/generators/active_scaffold/resource_generator.rb +31 -31
  188. data/lib/tasks/brakeman.rake +1 -1
  189. data/shoulda_macros/macros.rb +14 -14
  190. metadata +11 -232
  191. data/app/assets/javascripts/prototype/active_scaffold.js +0 -1249
  192. data/app/assets/javascripts/prototype/active_scaffold_chosen.js +0 -0
  193. data/app/assets/javascripts/prototype/dhtml_history.js +0 -870
  194. data/app/assets/javascripts/prototype/form_enhancements.js +0 -117
  195. data/app/assets/javascripts/prototype/tiny_mce_bridge.js +0 -17
  196. data/app/views/active_scaffold_overrides/_list_messages_content.html.erb +0 -8
  197. data/app/views/active_scaffold_overrides/_new_record.js.erb +0 -15
  198. data/app/views/active_scaffold_overrides/_popup_adapter.html.erb +0 -20
  199. data/app/views/active_scaffold_overrides/_refresh_create_form.js.erb +0 -12
  200. data/lib/active_scaffold/bridges/calendar_date_select/as_cds_bridge.rb +0 -58
  201. data/lib/active_scaffold/bridges/calendar_date_select.rb +0 -17
  202. data/lib/active_scaffold/data_structures/action_link_separator.rb +0 -13
  203. data/lib/active_scaffold/extensions/cow_proxy.rb +0 -102
  204. data/test/active_scaffold_config_mock.rb +0 -33
  205. data/test/bridges/bridge_test.rb +0 -88
  206. data/test/bridges/date_picker_test.rb +0 -31
  207. data/test/bridges/paper_trail_test.rb +0 -16
  208. data/test/bridges/paperclip_test.rb +0 -85
  209. data/test/bridges/tiny_mce_test.rb +0 -61
  210. data/test/class_with_finder.rb +0 -42
  211. data/test/company.rb +0 -97
  212. data/test/config/base_test.rb +0 -17
  213. data/test/config/core_test.rb +0 -66
  214. data/test/config/create_test.rb +0 -72
  215. data/test/config/delete_test.rb +0 -35
  216. data/test/config/field_search_test.rb +0 -49
  217. data/test/config/list_test.rb +0 -134
  218. data/test/config/nested_test.rb +0 -55
  219. data/test/config/search_test.rb +0 -62
  220. data/test/config/show_test.rb +0 -45
  221. data/test/config/subform_test.rb +0 -19
  222. data/test/config/update_test.rb +0 -52
  223. data/test/const_mocker.rb +0 -32
  224. data/test/data_structures/action_columns_test.rb +0 -112
  225. data/test/data_structures/action_link_test.rb +0 -79
  226. data/test/data_structures/action_links_test.rb +0 -78
  227. data/test/data_structures/actions_test.rb +0 -25
  228. data/test/data_structures/association_column_test.rb +0 -41
  229. data/test/data_structures/column_test.rb +0 -186
  230. data/test/data_structures/columns_test.rb +0 -68
  231. data/test/data_structures/set_test.rb +0 -84
  232. data/test/data_structures/sorting_test.rb +0 -148
  233. data/test/data_structures/standard_column_test.rb +0 -23
  234. data/test/data_structures/validation_reflection_test.rb +0 -69
  235. data/test/data_structures/virtual_column_test.rb +0 -23
  236. data/test/extensions/action_view_rendering_test.rb +0 -20
  237. data/test/extensions/active_record_test.rb +0 -44
  238. data/test/extensions/routing_mapper_test.rb +0 -73
  239. data/test/helpers/form_column_helpers_test.rb +0 -34
  240. data/test/helpers/list_column_helpers_test.rb +0 -53
  241. data/test/helpers/pagination_helpers_test.rb +0 -65
  242. data/test/helpers/search_column_helpers_test.rb +0 -15
  243. data/test/misc/active_record_permissions_test.rb +0 -193
  244. data/test/misc/attribute_params_test.rb +0 -460
  245. data/test/misc/calculation_test.rb +0 -39
  246. data/test/misc/configurable_test.rb +0 -97
  247. data/test/misc/constraints_test.rb +0 -209
  248. data/test/misc/convert_numbers_format_test.rb +0 -171
  249. data/test/misc/finder_test.rb +0 -124
  250. data/test/misc/lang_test.rb +0 -10
  251. data/test/misc/parse_datetime_test.rb +0 -159
  252. data/test/misc/render_test.rb +0 -9
  253. data/test/misc/tableless_test.rb +0 -56
  254. data/test/mock_app/.gitignore +0 -2
  255. data/test/mock_app/Rakefile +0 -7
  256. data/test/mock_app/app/assets/config/manifest.js +0 -0
  257. data/test/mock_app/app/controllers/addresses_controller.rb +0 -4
  258. data/test/mock_app/app/controllers/application_controller.rb +0 -10
  259. data/test/mock_app/app/controllers/buildings_controller.rb +0 -4
  260. data/test/mock_app/app/controllers/cars_controller.rb +0 -5
  261. data/test/mock_app/app/controllers/contacts_controller.rb +0 -4
  262. data/test/mock_app/app/controllers/floors_controller.rb +0 -6
  263. data/test/mock_app/app/controllers/people_controller.rb +0 -8
  264. data/test/mock_app/app/controllers/roles_controller.rb +0 -4
  265. data/test/mock_app/app/helpers/application_helper.rb +0 -3
  266. data/test/mock_app/app/models/address.rb +0 -3
  267. data/test/mock_app/app/models/building.rb +0 -9
  268. data/test/mock_app/app/models/car.rb +0 -3
  269. data/test/mock_app/app/models/contact.rb +0 -3
  270. data/test/mock_app/app/models/file_model.rb +0 -31
  271. data/test/mock_app/app/models/floor.rb +0 -8
  272. data/test/mock_app/app/models/person.rb +0 -12
  273. data/test/mock_app/app/models/role.rb +0 -3
  274. data/test/mock_app/app/views/active_scaffold_overrides/_form.html.erb +0 -2
  275. data/test/mock_app/app/views/active_scaffold_overrides/list.html.erb +0 -2
  276. data/test/mock_app/app/views/people/_first_name_form_column.html.erb +0 -2
  277. data/test/mock_app/app/views/people/_form.html.erb +0 -2
  278. data/test/mock_app/app/views/people/list.html.erb +0 -2
  279. data/test/mock_app/config/application.rb +0 -14
  280. data/test/mock_app/config/boot.rb +0 -7
  281. data/test/mock_app/config/database.yml +0 -16
  282. data/test/mock_app/config/environment.rb +0 -6
  283. data/test/mock_app/config/environments/development.rb +0 -24
  284. data/test/mock_app/config/environments/production.rb +0 -49
  285. data/test/mock_app/config/environments/test.rb +0 -34
  286. data/test/mock_app/config/initializers/backtrace_silencers.rb +0 -7
  287. data/test/mock_app/config/initializers/inflections.rb +0 -10
  288. data/test/mock_app/config/initializers/mime_types.rb +0 -5
  289. data/test/mock_app/config/initializers/secret_token.rb +0 -11
  290. data/test/mock_app/config/initializers/session_store.rb +0 -8
  291. data/test/mock_app/config/initializers/wrap_parameters.rb +0 -14
  292. data/test/mock_app/config/locales/en.yml +0 -5
  293. data/test/mock_app/config/routes.rb +0 -17
  294. data/test/mock_app/config.ru +0 -4
  295. data/test/mock_app/db/schema.rb +0 -68
  296. data/test/mock_app/db/test.sqlite3 +0 -1
  297. data/test/model_stub.rb +0 -64
  298. data/test/performance/list_cars_performance_test.rb +0 -34
  299. data/test/performance/list_people_performance_test.rb +0 -31
  300. data/test/performance_test_help.rb +0 -3
  301. data/test/run_all.rb +0 -6
  302. data/test/test_helper.rb +0 -71
  303. data/vendor/assets/javascripts/getprototypeof.js +0 -12
@@ -1,7 +1,7 @@
1
1
  module ActiveScaffold::Actions
2
2
  module List
3
3
  def self.included(base)
4
- base.before_action :list_authorized_filter, :only => :index
4
+ base.before_action :list_authorized_filter, only: :index
5
5
  base.helper_method :list_columns, :count_on_association_class?
6
6
  end
7
7
 
@@ -32,19 +32,19 @@ module ActiveScaffold::Actions
32
32
 
33
33
  def list_respond_to_html
34
34
  if loading_embedded?
35
- render :action => 'list', :layout => false
35
+ render action: 'list', layout: false
36
36
  else
37
- render :action => 'list'
37
+ render action: 'list'
38
38
  end
39
39
  end
40
40
 
41
41
  def list_respond_to_js
42
42
  if params[:adapter] || loading_embedded?
43
- render(:partial => 'list_with_header')
43
+ render partial: 'list_with_header'
44
44
  else
45
45
  @auto_pagination = params[:auto_pagination]
46
46
  @popstate = params.delete(:_popstate)
47
- render :partial => 'refresh_list', :formats => [:js]
47
+ render partial: 'refresh_list', formats: [:js]
48
48
  end
49
49
  end
50
50
 
@@ -57,22 +57,17 @@ module ActiveScaffold::Actions
57
57
  end
58
58
 
59
59
  def row_respond_to_html
60
- render(:partial => 'row', :locals => {:record => @record})
60
+ render partial: 'row', locals: {record: @record}
61
61
  end
62
62
 
63
63
  def row_respond_to_js
64
- render :action => 'row'
64
+ render action: 'row'
65
65
  end
66
66
 
67
67
  # The actual algorithm to prepare for the list view
68
68
  def set_includes_for_columns(action = :list, sorting = active_scaffold_config.list.user.sorting)
69
69
  @cache_associations = true
70
- columns =
71
- if respond_to?(:"#{action}_columns", true)
72
- send(:"#{action}_columns")
73
- else
74
- active_scaffold_config.send(action).columns.visible_columns(flatten: true)
75
- end
70
+ columns = columns_for_action(action)
76
71
  joins_cols, preload_cols = columns.select { |c| c.includes.present? }.partition do |col|
77
72
  includes_need_join?(col, sorting) && !grouped_search?
78
73
  end
@@ -81,10 +76,19 @@ module ActiveScaffold::Actions
81
76
  set_includes_for_sorting(columns, sorting) if sorting.sorts_by_sql?
82
77
  end
83
78
 
79
+ def columns_for_action(action)
80
+ if respond_to?(:"#{action}_columns", true)
81
+ send(:"#{action}_columns")
82
+ else
83
+ active_scaffold_config.send(action).columns.visible_columns(flatten: true)
84
+ end
85
+ end
86
+
84
87
  def set_includes_for_sorting(columns, sorting)
85
88
  sorting.each_column do |col|
86
89
  next if sorting.constraint_columns.include? col.name
87
- next unless col.includes.present? && !columns.include?(col)
90
+ next unless col.includes.present? && columns.exclude?(col)
91
+
88
92
  if active_scaffold_config.model.connection.needs_order_expressions_in_select?
89
93
  active_scaffold_references << col.includes
90
94
  else
@@ -130,11 +134,7 @@ module ActiveScaffold::Actions
130
134
  end
131
135
 
132
136
  def columns_to_cache_counts
133
- list_columns.select do |col|
134
- col.association&.collection? && col.includes.blank? && col.associated_number? &&
135
- !ActiveScaffold::OrmChecks.tableless?(col.association.klass) &&
136
- !col.association.reverse_association&.counter_cache
137
- end
137
+ list_columns.select(&:cache_count?)
138
138
  end
139
139
 
140
140
  def cache_column_counts(records)
@@ -166,18 +166,18 @@ module ActiveScaffold::Actions
166
166
  if column.association.as
167
167
  query.where!(column.association.reverse_association.foreign_type => active_scaffold_config.model.name)
168
168
  end
169
- if column.association.scope
170
- query = query.instance_exec(&column.association.scope)
171
- end
169
+ query = query.instance_exec(&column.association.scope) if column.association.scope
172
170
  query.group(column.association.foreign_key)
173
171
  end
174
172
 
175
173
  def count_query_with_join(column, records)
176
174
  klass = column.association.klass
177
175
  query = active_scaffold_config.model.where(active_scaffold_config.primary_key => records.map(&:id))
178
- .joins(column.name).group(active_scaffold_config.primary_key)
179
- .select("#{klass.quoted_table_name}.#{klass.quoted_primary_key}")
180
- query = query.distinct if column.association.scope && klass.instance_exec(&column.association.scope).values[:distinct]
176
+ .joins(column.name).group(active_scaffold_config.primary_key)
177
+ .select("#{klass.quoted_table_name}.#{klass.quoted_primary_key}")
178
+ if column.association.scope && klass.instance_exec(&column.association.scope).values[:distinct]
179
+ query = query.distinct
180
+ end
181
181
  query
182
182
  end
183
183
 
@@ -195,8 +195,8 @@ module ActiveScaffold::Actions
195
195
 
196
196
  def find_page_options
197
197
  options = {
198
- :sorting => active_scaffold_config.list.user.sorting,
199
- :count_includes => active_scaffold_config.list.user.count_includes
198
+ sorting: active_scaffold_config.list.user.sorting,
199
+ count_includes: active_scaffold_config.list.user.count_includes
200
200
  }
201
201
 
202
202
  paginate = params[:format].nil? ? accepts?(:html, :js) : %w[html js].include?(params[:format])
@@ -208,7 +208,7 @@ module ActiveScaffold::Actions
208
208
 
209
209
  if active_scaffold_config.list.auto_select_columns
210
210
  auto_select_columns = list_columns + [active_scaffold_config.columns[active_scaffold_config.model.primary_key]]
211
- options[:select] = auto_select_columns.map { |c| quoted_select_columns(c.select_columns) }.compact.flatten
211
+ options[:select] = auto_select_columns.filter_map { |c| quoted_select_columns(c.select_columns) }.flatten
212
212
  end
213
213
 
214
214
  options
@@ -227,12 +227,12 @@ module ActiveScaffold::Actions
227
227
  do_list
228
228
  end
229
229
 
230
- def each_record_in_page
231
- page_items.each { |record| yield record }
230
+ def each_record_in_page(&block)
231
+ page_items.each(&block)
232
232
  end
233
233
 
234
- def each_record_in_scope
235
- scoped_query.each { |record| yield record }
234
+ def each_record_in_scope(&block)
235
+ scoped_query.each(&block)
236
236
  end
237
237
 
238
238
  def page_items
@@ -257,7 +257,7 @@ module ActiveScaffold::Actions
257
257
  # The default security delegates to ActiveRecordPermissions.
258
258
  # You may override the method to customize.
259
259
  def list_authorized?
260
- authorized_for?(:crud_type => :read)
260
+ authorized_for?(crud_type: :read)
261
261
  end
262
262
 
263
263
  def action_update_respond_to_js
@@ -271,7 +271,7 @@ module ActiveScaffold::Actions
271
271
  if active_scaffold_config.list.calculate_etag
272
272
  @records.to_a
273
273
  elsif active_scaffold_config.list.user.sorting
274
- {:etag => active_scaffold_config.list.user.sorting.clause}
274
+ {etag: active_scaffold_config.list.user.sorting.clause}
275
275
  end
276
276
  end
277
277
  objects.presence || super
@@ -1,7 +1,7 @@
1
1
  module ActiveScaffold::Actions
2
2
  module Mark
3
3
  def self.included(base)
4
- base.before_action :mark_authorized_filter, :only => :mark
4
+ base.before_action :mark_authorized_filter, only: :mark
5
5
  base.before_action :assign_marked_records_to_model
6
6
  base.helper_method :marked_records
7
7
  end
@@ -14,7 +14,7 @@ module ActiveScaffold::Actions
14
14
  end
15
15
  if marked_records.any?
16
16
  count = marked_records.length
17
- flash[:info] = as_(:records_marked, :count => count, :model => active_scaffold_config.label(:count => count))
17
+ flash[:info] = as_(:records_marked, count: count, model: active_scaffold_config.label(count: count))
18
18
  end
19
19
  respond_to_action(:mark)
20
20
  end
@@ -30,11 +30,11 @@ module ActiveScaffold::Actions
30
30
  if params.delete(:id) # so find_page doesn't filter by :id
31
31
  do_search if respond_to? :do_search, true
32
32
  set_includes_for_columns if active_scaffold_config.actions.include? :list
33
- @page = find_page(:pagination => active_scaffold_config.mark.mark_all_mode != :page)
34
- render :action => 'on_mark'
33
+ @page = find_page(pagination: active_scaffold_config.mark.mark_all_mode != :page)
34
+ render action: 'on_mark'
35
35
  else
36
36
  @include_checkboxes = true
37
- render :action => 'on_mark', :locals => {:checked => mark?}
37
+ render action: 'on_mark', locals: {checked: mark?}
38
38
  end
39
39
  end
40
40
 
@@ -8,9 +8,8 @@ module ActiveScaffold::Actions
8
8
  base.module_eval do
9
9
  before_action :set_nested
10
10
  before_action :configure_nested
11
- include ActiveScaffold::Actions::Nested::ChildMethods if active_scaffold_config.columns.map(&:association).compact.any?(&:habtm?)
11
+ include ActiveScaffold::Actions::Nested::ChildMethods if active_scaffold_config.columns.filter_map(&:association).any?(&:habtm?)
12
12
  end
13
- base.before_action :include_habtm_actions
14
13
  base.helper_method :nested
15
14
  base.helper_method :nested_parent_record
16
15
  end
@@ -29,65 +28,39 @@ module ActiveScaffold::Actions
29
28
  def set_nested
30
29
  @nested = nil
31
30
  return unless params[:parent_scaffold] && (params[:association] || params[:named_scope])
31
+
32
32
  @nested = ActiveScaffold::DataStructures::NestedInfo.get(self.class.active_scaffold_config.model, params)
33
33
  end
34
34
 
35
35
  def configure_nested
36
36
  return unless nested?
37
+
37
38
  register_constraints_with_action_columns(nested.constrained_fields)
38
39
  return unless active_scaffold_config.actions.include? :list
40
+
39
41
  active_scaffold_config.list.user.label = nested_label
40
42
  return if active_scaffold_config.nested.ignore_order_from_association
43
+
41
44
  chain = beginning_of_chain
42
45
  active_scaffold_config.list.user.nested_default_sorting = nested_default_sorting(chain) if nested.sorted?(chain)
43
46
  end
44
47
 
45
48
  def nested_label
46
49
  if nested.belongs_to?
47
- as_(:nested_of_model, :nested_model => active_scaffold_config.model.model_name.human, :parent_model => ERB::Util.h(nested_parent_record.to_label))
50
+ as_(:nested_of_model, nested_model: active_scaffold_config.model.model_name.human, parent_model: ERB::Util.h(nested_parent_record.to_label))
48
51
  else
49
- as_(:nested_for_model, :nested_model => active_scaffold_config.list.label, :parent_model => ERB::Util.h(nested_parent_record.to_label))
52
+ as_(:nested_for_model, nested_model: active_scaffold_config.list.label, parent_model: ERB::Util.h(nested_parent_record.to_label))
50
53
  end
51
54
  end
52
55
 
53
56
  def nested_default_sorting(chain)
54
- {:table_name => active_scaffold_config._table_name, :default_sorting => nested.default_sorting(chain)}
57
+ {table_name: active_scaffold_config._table_name, default_sorting: nested.default_sorting(chain)}
55
58
  end
56
59
 
57
60
  def nested_authorized?(record = nil)
58
61
  true
59
62
  end
60
63
 
61
- def include_habtm_actions
62
- if nested&.habtm?
63
- # Production mode is ok with adding a link everytime the scaffold is nested - we are not ok with that.
64
- unless active_scaffold_config.action_links['new_existing']
65
- active_scaffold_config.action_links.add('new_existing', :label => :add_existing, :type => :collection, :security_method => :add_existing_authorized?)
66
- end
67
- add_shallow_links if active_scaffold_config.nested.shallow_delete
68
- elsif !ActiveScaffold.threadsafe
69
- # Production mode is caching this link into a non nested scaffold, when threadsafe is disabled
70
- active_scaffold_config.action_links.delete('new_existing')
71
- restore_shallow_links if active_scaffold_config.nested.shallow_delete
72
- end
73
- end
74
-
75
- def add_shallow_links
76
- unless active_scaffold_config.action_links['destroy_existing']
77
- link_options = {:label => :remove, :type => :member, :confirm => :are_you_sure_to_delete, :method => :delete, :position => false, :security_method => :delete_existing_authorized?}
78
- active_scaffold_config.action_links.add('destroy_existing', link_options)
79
- end
80
- active_scaffold_config.action_links.delete('destroy') if active_scaffold_config.actions.include?(:delete)
81
- end
82
-
83
- def restore_shallow_links
84
- if active_scaffold_config.actions.include?(:delete) && active_scaffold_config.delete.link
85
- link = active_scaffold_config.delete.link
86
- active_scaffold_config.action_links.add(link) unless active_scaffold_config.action_links[link.action]
87
- end
88
- active_scaffold_config.action_links.delete('destroy_existing')
89
- end
90
-
91
64
  def beginning_of_chain
92
65
  # only if nested is related to current controller, e.g. not when adding record in subform inside subform
93
66
  if nested? && nested.match_model?(active_scaffold_config.model)
@@ -118,24 +91,26 @@ module ActiveScaffold::Actions
118
91
  @nested_parent_record ||= find_if_allowed(nested.parent_id, crud, nested.parent_model)
119
92
  end
120
93
 
121
- def create_association_with_parent?(check_match = false)
94
+ def create_association_with_parent?(check_match: false)
122
95
  # has_many is done by beginning_of_chain and rails if direct association, not in through associations
123
96
  return false unless nested.create_with_parent?
124
97
  return false if check_match && !nested.match_model?(active_scaffold_config.model)
98
+
125
99
  nested_parent_record.present?
126
100
  end
127
101
 
128
- def create_association_with_parent(record, check_match = false)
129
- return unless create_association_with_parent?(check_match)
102
+ def create_association_with_parent(record, check_match: false)
103
+ return unless create_association_with_parent?(check_match: check_match)
104
+
130
105
  if nested.child_association&.singular?
131
- record.send("#{nested.child_association.name}=", nested_parent_record)
106
+ record.send(:"#{nested.child_association.name}=", nested_parent_record)
132
107
  elsif nested.create_through_singular?
133
108
  through = nested_parent_record.send(nested.association.through_reflection.name) ||
134
- nested_parent_record.send("build_#{nested.association.through_reflection.name}")
109
+ nested_parent_record.send(:"build_#{nested.association.through_reflection.name}")
135
110
  if nested.source_reflection.reverse_association.collection?
136
111
  record.send(nested.source_reflection.reverse) << through
137
112
  else
138
- record.send("#{nested.source_reflection.reverse}=", through)
113
+ record.send(:"#{nested.source_reflection.reverse}=", through)
139
114
  end
140
115
  else
141
116
  record.send(nested.child_association.name) << nested_parent_record
@@ -154,6 +129,25 @@ module ActiveScaffold::Actions::Nested
154
129
  module ChildMethods
155
130
  def self.included(base)
156
131
  super
132
+ include_habtm_actions base.active_scaffold_config
133
+ end
134
+
135
+ def self.include_habtm_actions(config)
136
+ # Production mode is ok with adding a link everytime the scaffold is nested - we are not ok with that.
137
+ unless config.action_links['new_existing']
138
+ config.action_links.add('new_existing', label: :add_existing, type: :collection,
139
+ security_method: :add_existing_authorized?,
140
+ ignore_method: :add_existing_ignore?)
141
+ end
142
+ return unless config.nested.shallow_delete
143
+
144
+ unless config.action_links['destroy_existing']
145
+ config.action_links.add('destroy_existing', label: :remove, type: :member, confirm: :are_you_sure_to_delete,
146
+ method: :delete, position: false,
147
+ security_method: :add_existing_authorized?,
148
+ ignore_method: :add_existing_ignore?)
149
+ end
150
+ config.action_links['destroy'].ignore_method = :habtm_delete_ignore? if config.actions.include?(:delete)
157
151
  end
158
152
 
159
153
  def new_existing
@@ -167,7 +161,8 @@ module ActiveScaffold::Actions::Nested
167
161
  end
168
162
 
169
163
  def destroy_existing
170
- return redirect_to(params.merge(:action => :delete, :only_path => true)) if request.get? || request.head?
164
+ return redirect_to(params.merge(action: :delete, only_path: true)) if request.get? || request.head?
165
+
171
166
  do_destroy_existing
172
167
  respond_to_action(:destroy_existing)
173
168
  end
@@ -176,68 +171,81 @@ module ActiveScaffold::Actions::Nested
176
171
 
177
172
  def new_existing_respond_to_html
178
173
  if successful?
179
- render(:action => 'add_existing_form')
174
+ render action: 'add_existing_form'
180
175
  else
181
176
  return_to_main
182
177
  end
183
178
  end
184
179
 
185
180
  def new_existing_respond_to_js
186
- render(:partial => 'add_existing_form')
181
+ render partial: 'add_existing_form'
187
182
  end
188
183
 
189
184
  def add_existing_respond_to_html
190
185
  if successful?
191
- flash[:info] = as_(:created_model, :model => ERB::Util.h(@record.to_label))
186
+ flash[:info] = as_(:created_model, model: ERB::Util.h(@record.to_label))
192
187
  return_to_main
193
188
  else
194
- render(:action => 'add_existing_form')
189
+ render action: 'add_existing_form'
195
190
  end
196
191
  end
197
192
 
198
193
  def add_existing_respond_to_js
199
194
  if successful?
200
- render :action => 'add_existing'
195
+ render action: 'add_existing'
201
196
  else
202
- render :action => 'form_messages'
197
+ render action: 'form_messages'
203
198
  end
204
199
  end
205
200
 
206
201
  def add_existing_respond_to_xml
207
- render :xml => response_object, :only => active_scaffold_config.list.columns.visible_columns_names, :status => response_status
202
+ render xml: response_object, only: active_scaffold_config.list.columns.visible_columns_names, status: response_status
208
203
  end
209
204
 
210
205
  def add_existing_respond_to_json
211
- render :json => response_object, :only => active_scaffold_config.list.columns.visible_columns_names, :status => response_status
206
+ render json: response_object, only: active_scaffold_config.list.columns.visible_columns_names, status: response_status
212
207
  end
213
208
 
214
209
  def destroy_existing_respond_to_html
215
- flash[:info] = as_(:deleted_model, :model => ERB::Util.h(@record.to_label))
210
+ flash[:info] = as_(:deleted_model, model: ERB::Util.h(@record.to_label))
216
211
  return_to_main
217
212
  end
218
213
 
219
214
  def destroy_existing_respond_to_js
220
- render(:action => 'destroy')
215
+ render action: 'destroy'
221
216
  end
222
217
 
223
218
  def destroy_existing_respond_to_xml
224
- render :xml => successful? ? '' : response_object, :only => active_scaffold_config.list.columns.visible_columns_names, :status => response_status
219
+ render xml: successful? ? '' : response_object, only: active_scaffold_config.list.columns.visible_columns_names, status: response_status
225
220
  end
226
221
 
227
222
  def destroy_existing_respond_to_json
228
- render :json => successful? ? '' : response_object, :only => active_scaffold_config.list.columns.visible_columns_names, :status => response_status
223
+ render json: successful? ? '' : response_object, only: active_scaffold_config.list.columns.visible_columns_names, status: response_status
229
224
  end
230
225
 
231
226
  def add_existing_authorized?(record = nil)
232
- nested_parent_record.authorized_for?(:crud_type => :update, :column => nested.association.try(:name))
227
+ nested_parent_record.authorized_for?(crud_type: :update, column: nested.association.try(:name))
233
228
  end
234
229
 
235
230
  def delete_existing_authorized?(record = nil)
236
- nested_parent_record.authorized_for?(:crud_type => :update, :column => nested.association.try(:name), :reason => true)
231
+ nested_parent_record.authorized_for?(crud_type: :update, column: nested.association.try(:name), reason: true)
232
+ end
233
+
234
+ def add_existing_ignore?(record = nil)
235
+ !nested&.habtm?
236
+ end
237
+
238
+ def delete_existing_ignore?(record = nil)
239
+ !nested&.habtm?
240
+ end
241
+
242
+ def habtm_delete_ignore?(record = nil)
243
+ !delete_existing_ignore?(record) || delete_ignore?(record)
237
244
  end
238
245
 
239
246
  def after_create_save(record)
240
247
  return unless params[:association_macro] == :has_and_belongs_to_many
248
+
241
249
  params[:associated_id] = record
242
250
  do_add_existing
243
251
  end
@@ -9,11 +9,11 @@ module ActiveScaffold::Actions
9
9
  protected
10
10
 
11
11
  def search_respond_to_html
12
- render(:action => 'search')
12
+ render action: 'search'
13
13
  end
14
14
 
15
15
  def search_respond_to_js
16
- render(:partial => 'search')
16
+ render partial: 'search'
17
17
  end
18
18
 
19
19
  def do_search
@@ -1,7 +1,7 @@
1
1
  module ActiveScaffold::Actions
2
2
  module Show
3
3
  def self.included(base)
4
- base.before_action :show_authorized_filter, :only => :show
4
+ base.before_action :show_authorized_filter, only: :show
5
5
  end
6
6
 
7
7
  def show
@@ -27,11 +27,11 @@ module ActiveScaffold::Actions
27
27
  end
28
28
 
29
29
  def show_respond_to_js
30
- render :partial => 'show'
30
+ render partial: 'show'
31
31
  end
32
32
 
33
33
  def show_respond_to_html
34
- render :action => 'show'
34
+ render action: 'show'
35
35
  end
36
36
 
37
37
  def show_columns_names
@@ -52,14 +52,14 @@ module ActiveScaffold::Actions
52
52
  end
53
53
 
54
54
  def show_ignore?(record = nil)
55
- !send(:authorized_for?, :crud_type => :read)
55
+ !send(:authorized_for?, crud_type: :read)
56
56
  end
57
57
 
58
58
  private
59
59
 
60
60
  def show_authorized_filter
61
61
  link = active_scaffold_config.show.link || self.class.active_scaffold_config.show.class.link
62
- raise ActiveScaffold::ActionNotAllowed unless Array(send(link.security_method))[0]
62
+ raise ActiveScaffold::ActionNotAllowed unless action_link_authorized?(link)
63
63
  end
64
64
 
65
65
  def show_formats
@@ -3,7 +3,7 @@ module ActiveScaffold::Actions
3
3
  def edit_associated
4
4
  do_edit_associated
5
5
  respond_to do |format|
6
- format.js { render :action => 'edit_associated', :formats => [:js], :readonly => @column.association.readonly? }
6
+ format.js { render action: 'edit_associated', formats: [:js], readonly: @column.association.readonly? }
7
7
  end
8
8
  end
9
9
 
@@ -13,7 +13,7 @@ module ActiveScaffold::Actions
13
13
  parent_record = new_model
14
14
  # don't apply if scope, subform inside subform, because constraints won't apply to parent_record
15
15
  apply_constraints_to_record parent_record unless @scope
16
- create_association_with_parent parent_record, true if nested?
16
+ create_association_with_parent parent_record, check_match: true if nested?
17
17
  parent_record
18
18
  end
19
19
 
@@ -24,8 +24,19 @@ module ActiveScaffold::Actions
24
24
  cache_generated_id(@parent_record, params[:generated_id]) if @parent_record.new_record?
25
25
  @column = active_scaffold_config.columns[params[:child_association]]
26
26
 
27
- @record = find_associated_record if params[:associated_id]
28
- @record ||= build_associated(@column.association, @parent_record)
27
+ @record = (find_associated_record if params[:associated_id]) ||
28
+ build_associated(@column.association, @parent_record) do |blank_record|
29
+ if params[:tabbed_by] && params[:value]
30
+ assign_tabbed_by(blank_record, @column, params[:tabbed_by], params[:value], params[:value_type])
31
+ end
32
+ end
33
+ end
34
+
35
+ def assign_tabbed_by(record, parent_column, tabbed_by, value, value_type)
36
+ if (association = tabbed_by_association(parent_column, tabbed_by))
37
+ klass = value_type&.constantize || association.klass
38
+ end
39
+ record.send :"#{tabbed_by}=", klass&.find(value) || value
29
40
  end
30
41
 
31
42
  def find_associated_record