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
@@ -57,6 +57,7 @@ module ActiveScaffold::DataStructures
57
57
  klass = column.association.klass
58
58
  columns.each do |col|
59
59
  next if find_by_name col
60
+
60
61
  @set[col.to_sym] = ActiveScaffold::DataStructures::Column.new(col, klass, column.association)
61
62
  end
62
63
  end
@@ -77,8 +78,8 @@ module ActiveScaffold::DataStructures
77
78
  end
78
79
  alias [] find_by_name
79
80
 
80
- def each
81
- @set.each_value { |name| yield name }
81
+ def each(&block)
82
+ @set.each_value(&block)
82
83
  end
83
84
 
84
85
  def _inheritable
@@ -18,7 +18,7 @@ module ActiveScaffold::DataStructures
18
18
  end
19
19
 
20
20
  def to_params
21
- {:parent_scaffold => parent_scaffold.controller_path}
21
+ {parent_scaffold: parent_scaffold.controller_path}
22
22
  end
23
23
 
24
24
  def new_instance?
@@ -87,7 +87,7 @@ module ActiveScaffold::DataStructures
87
87
  setup_constrained_fields
88
88
  end
89
89
 
90
- delegate :name, :belongs_to?, :has_one?, :has_many?, :habtm?, :readonly?, :to => :association
90
+ delegate :name, :belongs_to?, :has_one?, :has_many?, :habtm?, :readonly?, to: :association
91
91
 
92
92
  # A through association with has_one or has_many as source association
93
93
  # create cannot be called in nested through associations, and not-nested through associations, unless:
@@ -108,7 +108,7 @@ module ActiveScaffold::DataStructures
108
108
  return false unless association.source_reflection.collection? # create allowed if source is singular, rails creates joint model
109
109
 
110
110
  # create allowed only if through reflection in record to be created is included in create columns
111
- !child_association || !columns.include?(child_association.through_reflection.name)
111
+ !child_association || columns.exclude?(child_association.through_reflection.name)
112
112
  end
113
113
 
114
114
  def create_through_singular?
@@ -146,13 +146,14 @@ module ActiveScaffold::DataStructures
146
146
  def default_sorting(chain)
147
147
  return @default_sorting if defined? @default_sorting
148
148
  return unless association.scope.is_a?(Proc) && chain.respond_to?(:values) && chain.values[:order]
149
+
149
150
  @default_sorting = chain.values[:order]
150
151
  @default_sorting = @default_sorting.map(&:to_sql) if @default_sorting[0].is_a? Arel::Nodes::Node
151
152
  @default_sorting = @default_sorting.join(', ')
152
153
  end
153
154
 
154
155
  def to_params
155
- super.merge(:association => @association.name, @param_name => parent_id)
156
+ super.merge(association: @association.name, @param_name => parent_id)
156
157
  end
157
158
 
158
159
  protected
@@ -177,7 +178,7 @@ module ActiveScaffold::DataStructures
177
178
  end
178
179
 
179
180
  def to_params
180
- super.merge(:named_scope => @scope)
181
+ super.merge(named_scope: @scope)
181
182
  end
182
183
 
183
184
  def name
@@ -0,0 +1,68 @@
1
+ # frozen_string_literal: true
2
+
3
+ module ActiveScaffold::DataStructures
4
+ class ProxyColumn
5
+ COPY_VARS = %i[@list_ui @list_ui_options @show_ui @show_ui_options @search_ui @search_ui_options @search_joins].freeze
6
+ def initialize(column)
7
+ @column = column
8
+ # without override_or_delegate, the methods won't use column's values if they are set
9
+ # with override_or_delegate, if they had no value, they won't return overrided form_ui
10
+ # the easier way is copying variables to proxy object
11
+ (column.instance_variables & COPY_VARS).each do |var|
12
+ instance_variable_set(var, column.instance_variable_get(var))
13
+ end
14
+ end
15
+
16
+ def self.attr_reader(*names)
17
+ names.each do |name|
18
+ define_method name do
19
+ instance_variable_defined?(:"@#{name}") ? instance_variable_get(:"@#{name}") : @column.send(name)
20
+ end
21
+ end
22
+ end
23
+
24
+ def self.attr_accessor(*names)
25
+ attr_reader(*names)
26
+ attr_writer(*names)
27
+ end
28
+
29
+ def self.override_or_delegate(*names)
30
+ location = caller_locations(1, 1).first
31
+ method_def = names.map do |name|
32
+ "def #{name}(...)
33
+ instance_variable_defined?(\"@#{name.to_s.gsub(/\?$/, '')}\") ? super : @column.send(\"#{name}\", ...)
34
+ end"
35
+ end
36
+
37
+ module_eval method_def.join(';'), location.path, location.lineno
38
+ names
39
+ end
40
+
41
+ include Column::ProxyableMethods
42
+
43
+ def method_missing(name, ...)
44
+ if respond_to_missing?(name, true)
45
+ @column.send(name, ...)
46
+ else
47
+ super
48
+ end
49
+ end
50
+
51
+ def respond_to_missing?(name, include_all = false)
52
+ (!name.match?(/[!=]$/) && @column.respond_to?(name, include_all)) || super
53
+ end
54
+
55
+ def params=(value)
56
+ @params = Set.new(*value)
57
+ end
58
+ attr_reader :params, :options
59
+
60
+ override_or_delegate :required?, :label, :description, :placeholder, :sort, :associated_number?,
61
+ :show_blank_record?, :number?, :search_sql, :link
62
+ delegate :==, to: :@column
63
+
64
+ def is_a?(klass)
65
+ super || @column.is_a?(klass)
66
+ end
67
+ end
68
+ end
@@ -43,13 +43,12 @@ module ActiveScaffold::DataStructures
43
43
  # returns the item of the given name.
44
44
  def find_by_name(name)
45
45
  # this works because of `def item.=='
46
- item = @set.find { |c| c == name }
47
- item
46
+ @set.find { |c| c == name }
48
47
  end
49
48
  alias [] find_by_name
50
49
 
51
- def each
52
- @set.each { |i| yield i }
50
+ def each(&block)
51
+ @set.each(&block)
53
52
  end
54
53
 
55
54
  # returns the number of items in the set
@@ -61,6 +60,10 @@ module ActiveScaffold::DataStructures
61
60
  @set.empty?
62
61
  end
63
62
 
63
+ def +(other)
64
+ self.class.new(@set, *other)
65
+ end
66
+
64
67
  protected
65
68
 
66
69
  attr_reader :set
@@ -4,8 +4,7 @@ module ActiveScaffold::DataStructures
4
4
  include Enumerable
5
5
  include ActiveScaffold::OrmChecks
6
6
 
7
- attr_accessor :constraint_columns
8
- attr_accessor :sorting_by_primary_key # enabled by default for postgres
7
+ attr_accessor :constraint_columns, :sorting_by_primary_key # sorting_by_primary_key enabled by default for postgres
9
8
  attr_reader :model
10
9
  alias active_record_class model
11
10
 
@@ -19,11 +18,13 @@ module ActiveScaffold::DataStructures
19
18
 
20
19
  def set_default_sorting
21
20
  return unless active_record?
21
+
22
22
  # fallback to setting primary key ordering
23
23
  setup_primary_key_order_clause
24
24
  model_scope = model.send(:build_default_scope)
25
25
  order_clause = model_scope.order_values.join(',') if model_scope
26
26
  return unless order_clause
27
+
27
28
  # If an ORDER BY clause is found set default sorting according to it
28
29
  set_sorting_from_order_clause(order_clause, model.table_name)
29
30
  @default_sorting = true
@@ -41,6 +42,7 @@ module ActiveScaffold::DataStructures
41
42
  column = get_column(column_name)
42
43
  raise ArgumentError, "Could not find column #{column_name}" if column.nil?
43
44
  raise ArgumentError, 'Sorting direction unknown' unless %i[ASC DESC].include? direction.to_sym
45
+
44
46
  @clauses << [column, direction] if column.sortable?
45
47
  raise ArgumentError, "Can't mix :method- and :sql-based sorting" if mixed_sorting?
46
48
  end
@@ -83,11 +85,12 @@ module ActiveScaffold::DataStructures
83
85
  def direction_of(column)
84
86
  clause = get_clause(column)
85
87
  return if clause.nil?
88
+
86
89
  clause[1]
87
90
  end
88
91
 
89
- SORTING_STAGES = Hash[%w[reset ASC DESC reset].each_cons(2).to_a].freeze
90
- DEFAULT_SORTING_STAGES = Hash[%w[ASC DESC ASC].each_cons(2).to_a].freeze
92
+ SORTING_STAGES = %w[reset ASC DESC reset].each_cons(2).to_h.freeze
93
+ DEFAULT_SORTING_STAGES = %w[ASC DESC ASC].each_cons(2).to_h.freeze
91
94
  def next_sorting_of(column, sorted_by_default)
92
95
  stages = sorted_by_default ? DEFAULT_SORTING_STAGES : SORTING_STAGES
93
96
  stages[direction_of(column)] || 'ASC'
@@ -103,8 +106,8 @@ module ActiveScaffold::DataStructures
103
106
  end
104
107
 
105
108
  # iterate over the clauses
106
- def each
107
- @clauses.each { |clause| yield clause }
109
+ def each(&block)
110
+ @clauses.each(&block)
108
111
  end
109
112
 
110
113
  def each_column
@@ -128,8 +131,10 @@ module ActiveScaffold::DataStructures
128
131
  order = []
129
132
  each do |sort_column, sort_direction|
130
133
  next if constraint_columns.include? sort_column.name
134
+
131
135
  sql = grouped_columns ? grouped_columns[sort_column.name] : sort_column.sort[:sql]
132
136
  next if sql.blank?
137
+
133
138
  sql = sql.to_sql if sql.respond_to?(:to_sql)
134
139
 
135
140
  parts = Array(sql).map do |column|
@@ -155,6 +160,7 @@ module ActiveScaffold::DataStructures
155
160
  def get_column(name_or_column)
156
161
  # it's a column
157
162
  return name_or_column if name_or_column.is_a? ActiveScaffold::DataStructures::Column
163
+
158
164
  # it's a name
159
165
  name_or_column = name_or_column.to_s.split('.').last if name_or_column.to_s.include? '.'
160
166
  @columns[name_or_column]
@@ -171,18 +177,20 @@ module ActiveScaffold::DataStructures
171
177
  def set_sorting_from_order_clause(order_clause, model_table_name = nil)
172
178
  clear
173
179
  order_clause.to_s.split(',').each do |criterion|
174
- if criterion.present?
175
- order_parts = extract_order_parts(criterion)
176
- add(order_parts[:column_name], order_parts[:direction]) unless different_table?(model_table_name, order_parts[:table_name]) || get_column(order_parts[:column_name]).nil?
180
+ next if criterion.blank?
181
+
182
+ parts = extract_order_parts(criterion)
183
+ unless different_table?(model_table_name, parts[:table_name]) || get_column(parts[:column_name]).nil?
184
+ add(parts[:column_name], parts[:direction])
177
185
  end
178
186
  end
179
187
  end
180
188
 
181
189
  def extract_order_parts(criterion_parts)
182
- column_name_part, direction_part = criterion_parts.strip.split(' ')
190
+ column_name_part, direction_part = criterion_parts.strip.split(' ') # rubocop:disable Style/RedundantArgument
183
191
  column_name_parts = column_name_part.split('.')
184
- order = {:direction => extract_direction(direction_part),
185
- :column_name => remove_quotes(column_name_parts.last)}
192
+ order = {direction: extract_direction(direction_part),
193
+ column_name: remove_quotes(column_name_parts.last)}
186
194
  order[:table_name] = remove_quotes(column_name_parts[-2]) if column_name_parts.length >= 2
187
195
  order
188
196
  end
@@ -213,6 +221,7 @@ module ActiveScaffold::DataStructures
213
221
 
214
222
  def setup_primary_key_order_clause
215
223
  return unless model.column_names.include?(model.primary_key)
224
+
216
225
  set([model.primary_key, 'ASC'])
217
226
  @primary_key_order_clause = clause
218
227
  @sorting_by_primary_key = postgres? # mandatory for postgres, so enabled by default
@@ -30,29 +30,29 @@ module ActiveScaffold
30
30
  require 'active_scaffold/extensions/unsaved_associated'
31
31
  require 'active_scaffold/extensions/unsaved_record'
32
32
  include ActiveScaffold::ActiveRecordPermissions::ModelUserAccess::Model
33
- module ActiveRecord::Associations
34
- Association.send :include, ActiveScaffold::Tableless::Association
35
- CollectionAssociation.send :include, ActiveScaffold::Tableless::CollectionAssociation
36
- SingularAssociation.send :include, ActiveScaffold::Tableless::SingularAssociation
33
+ ActiveRecord::Associations.module_eval do
34
+ self::Association.include ActiveScaffold::Tableless::Association
35
+ self::CollectionAssociation.include ActiveScaffold::Tableless::CollectionAssociation
36
+ self::SingularAssociation.include ActiveScaffold::Tableless::SingularAssociation
37
37
  end
38
- module ActiveRecord::ConnectionAdapters
39
- AbstractAdapter.send :include, ActiveScaffold::ConnectionAdapters::AbstractAdapter
40
- if defined?(PostgreSQLAdapter)
41
- PostgreSQLAdapter.send :include, ActiveScaffold::ConnectionAdapters::PostgreSQLAdapter
38
+
39
+ ActiveRecord::ConnectionAdapters.module_eval do
40
+ self::AbstractAdapter.include ActiveScaffold::ConnectionAdapters::AbstractAdapter
41
+ if const_defined?(:PostgreSQLAdapter)
42
+ self::PostgreSQLAdapter.include ActiveScaffold::ConnectionAdapters::PostgreSQLAdapter
42
43
  end
43
- if defined?(SQLServerAdapter)
44
- SQLServerAdapter.send :include, ActiveScaffold::ConnectionAdapters::SQLServerAdapter
44
+ if const_defined?(:SQLServerAdapter)
45
+ self::SQLServerAdapter.include ActiveScaffold::ConnectionAdapters::SQLServerAdapter
45
46
  end
46
47
  end
47
48
  end
48
49
  end
49
50
 
50
51
  initializer 'active_scaffold.assets' do
51
- config.assets.precompile << 'active_scaffold/indicator.gif'
52
+ config.assets.precompile << 'active_scaffold_manifest.js' if Rails::VERSION::MAJOR < 7
52
53
  end
53
54
 
54
55
  initializer 'active_scaffold.extensions' do
55
- require 'active_scaffold/extensions/cow_proxy'
56
56
  require 'active_scaffold/extensions/ice_nine'
57
57
  require 'active_scaffold/extensions/localize'
58
58
  require 'active_scaffold/extensions/paginator_extensions'
@@ -1,18 +1,18 @@
1
1
  # wrap the action rendering for ActiveScaffold controllers
2
2
  module ActiveScaffold
3
- module ActionController #:nodoc:
3
+ module ActionController # :nodoc:
4
4
  def render(*args, &block)
5
5
  if self.class.uses_active_scaffold? && params[:adapter] && @rendering_adapter.nil? && request.xhr?
6
6
  @rendering_adapter = true # recursion control
7
7
  # if we need an adapter, then we render the actual stuff to a string and insert it into the adapter template
8
8
  opts = args.any? ? args.first : {}
9
9
 
10
- render :partial => params[:adapter][1..-1],
11
- :locals => {:payload => render_to_string(opts.merge(:layout => false), &block).html_safe}, # rubocop:disable Rails/OutputSafety
12
- :use_full_path => true, :layout => false, :content_type => :html
10
+ render partial: params[:adapter][1..],
11
+ locals: {payload: render_to_string(opts.merge(layout: false), &block).html_safe}, # rubocop:disable Rails/OutputSafety
12
+ use_full_path: true, layout: false, content_type: :html
13
13
  @rendering_adapter = nil # recursion control
14
14
  else
15
- super(*args, &block)
15
+ super
16
16
  end
17
17
  end
18
18
  end
@@ -1,4 +1,4 @@
1
- module ActionController #:nodoc:
1
+ module ActionController # :nodoc:
2
2
  class Base
3
3
  # adding to ActionController::Base so it can overrided in ApplicationController
4
4
  def deny_access
@@ -2,14 +2,14 @@ module ActiveScaffold
2
2
  module LookupContext
3
3
  attr_accessor :last_template
4
4
 
5
- def find_template(name, prefixes = [], partial = false, keys = [], options = {})
6
- self.last_template = super(name, prefixes, partial, keys, options)
5
+ def find_template(name, prefixes = [], partial = false, keys = [], options = {}) # rubocop:disable Metrics, Style
6
+ self.last_template = super
7
7
  end
8
8
  end
9
9
  end
10
10
 
11
11
  # wrap the action rendering for ActiveScaffold views
12
- module ActiveScaffold #:nodoc:
12
+ module ActiveScaffold # :nodoc:
13
13
  module RenderingHelper
14
14
  #
15
15
  # Adds two rendering options.
@@ -19,7 +19,7 @@ module ActiveScaffold #:nodoc:
19
19
  # This syntax skips all template overrides and goes directly to the provided ActiveScaffold templates.
20
20
  # Useful if you want to wrap an existing template. Just call super!
21
21
  #
22
- # ==render :active_scaffold => #{controller.to_s}, options = {}+
22
+ # ==render active_scaffold: #{controller.to_s}, options+
23
23
  #
24
24
  # Lets you embed an ActiveScaffold by referencing the controller where it's configured.
25
25
  #
@@ -45,7 +45,7 @@ module ActiveScaffold #:nodoc:
45
45
  @_view_paths ||= lookup_context.view_paths.clone
46
46
  @_last_template ||= lookup_context.last_template
47
47
  end
48
- result = super options_for_render_super(args[1])
48
+ result = super(options_for_render_super(args[1]))
49
49
  @lookup_context = @_lookup_context if @_lookup_context # rails 6
50
50
  lookup_context.view_paths = @_view_paths if @_view_paths # rails < 6
51
51
  lookup_context.last_template = @_last_template if @_last_template # rails < 6
@@ -74,7 +74,7 @@ module ActiveScaffold #:nodoc:
74
74
  end
75
75
 
76
76
  def view_stack
77
- @_view_stack ||= []
77
+ @view_stack ||= []
78
78
  end
79
79
 
80
80
  private
@@ -91,11 +91,11 @@ module ActiveScaffold #:nodoc:
91
91
  options[:template] = parts.pop
92
92
  prefix = parts.join('/')
93
93
  # if prefix is active_scaffold_overrides we must try to render with this prefix in following paths
94
- if prefix != 'active_scaffold_overrides'
95
- options[:prefixes] = lookup_context.prefixes.drop((lookup_context.prefixes.find_index(prefix) || -1) + 1)
96
- else
94
+ if prefix == 'active_scaffold_overrides'
97
95
  options[:prefixes] = ['active_scaffold_overrides']
98
96
  update_view_paths
97
+ else
98
+ options[:prefixes] = lookup_context.prefixes.drop((lookup_context.prefixes.find_index(prefix) || -1) + 1)
99
99
  end
100
100
  options
101
101
  end
@@ -145,7 +145,7 @@ module ActiveScaffold #:nodoc:
145
145
  eid_info[:conditions] = options[:conditions] if options[:conditions]
146
146
  eid_info[:label] = options[:label] if options[:label]
147
147
  options[:params] ||= {}
148
- options[:params].merge! :eid => eid, :embedded => eid_info
148
+ options[:params].merge! eid: eid, embedded: eid_info
149
149
 
150
150
  id = "as_#{eid}-embedded"
151
151
  url_options = {controller: remote_controller.to_s, action: 'index', id: nil}.merge(options[:params])
@@ -154,8 +154,8 @@ module ActiveScaffold #:nodoc:
154
154
  controller.send(:render_component_into_view, url_options)
155
155
  else
156
156
  url = url_for(url_options)
157
- content_tag(:div, :id => id, :class => 'active-scaffold-component', :data => {:refresh => url}) do
158
- content_tag(:div, :class => 'active-scaffold-header') do
157
+ content_tag(:div, id: id, class: 'active-scaffold-component', data: {refresh: url}) do
158
+ content_tag(:div, class: 'active-scaffold-header') do
159
159
  content_tag(:h2) do
160
160
  label = options[:label] || remote_controller_config(remote_controller).list.label
161
161
  link_to(label, url, remote: true, class: 'load-embedded', data: {error_msg: as_(:error_500)}) <<
@@ -178,27 +178,25 @@ module ActionView
178
178
  include ActiveScaffold::RenderingHelper
179
179
  end
180
180
 
181
- if Gem.loaded_specs['rails'].version.segments.first >= 6
182
- RenderingHelper.class_eval do
183
- # override the render method to use our @lookup_context instead of the
184
- # memoized @_lookup_context
185
- def render(options = {}, locals = {}, &block)
186
- case options
187
- when Hash
188
- in_rendering_context(options) do |_|
189
- # previously set view paths and lookup context are lost here
190
- # if you use view_renderer, so instead create a new renderer
191
- # with our context
192
- temp_renderer = ActionView::Renderer.new(@lookup_context)
193
- if block_given?
194
- temp_renderer.render_partial(self, options.merge(partial: options[:layout]), &block)
195
- else
196
- temp_renderer.render(self, options)
197
- end
181
+ RenderingHelper.class_eval do
182
+ # override the render method to use our @lookup_context instead of the
183
+ # memoized @_lookup_context
184
+ def render(options = {}, locals = {}, &block)
185
+ case options
186
+ when Hash
187
+ in_rendering_context(options) do |_|
188
+ # previously set view paths and lookup context are lost here
189
+ # if you use view_renderer, so instead create a new renderer
190
+ # with our context
191
+ temp_renderer = ActionView::Renderer.new(@lookup_context)
192
+ if block_given?
193
+ temp_renderer.render_partial(self, options.merge(partial: options[:layout]), &block)
194
+ else
195
+ temp_renderer.render(self, options)
198
196
  end
199
- else
200
- view_renderer.render_partial(self, partial: options, locals: locals, &block)
201
197
  end
198
+ else
199
+ view_renderer.render_partial(self, partial: options, locals: locals, &block)
202
200
  end
203
201
  end
204
202
  end
@@ -2,7 +2,7 @@ module IceNine
2
2
  class Freezer
3
3
  def self.find(name)
4
4
  freezer = name.split('::').reduce(self) do |mod, const|
5
- mod.const_lookup(const) or break mod # rubocop:disable Style/AndOr
5
+ mod.const_lookup(const) or break mod
6
6
  end
7
7
  freezer if freezer < self # only return a descendant freezer
8
8
  end
@@ -13,6 +13,7 @@ module IceNine
13
13
  def self.freeze_instance_variables(object, recursion_guard)
14
14
  object.instance_variables.each do |ivar_name|
15
15
  next if excluded_vars.include? ivar_name
16
+
16
17
  Freezer.guarded_deep_freeze(
17
18
  object.instance_variable_get(ivar_name),
18
19
  recursion_guard
@@ -2,8 +2,8 @@ class Object
2
2
  def as_(key, options = {})
3
3
  if key.present?
4
4
  scope = [:active_scaffold, *options.delete(:scope)]
5
- options = options.reverse_merge(:scope => scope, :default => key.is_a?(String) ? key : key.to_s.titleize)
6
- text = I18n.translate(key.to_s, **options).html_safe # rubocop:disable Rails/OutputSafety
5
+ options = options.reverse_merge(scope: scope, default: key.is_a?(String) ? key : key.to_s.titleize)
6
+ text = I18n.t(key.to_s, **options).html_safe
7
7
  # text = nil if text.include?('translation missing:')
8
8
  end
9
9
  text || key
@@ -4,7 +4,7 @@ module ActiveScaffold
4
4
 
5
5
  def datetime_selector(options, html_options)
6
6
  options[:prefix] = options[:name].gsub(/\[[^\[]*\]$/, '') if options[:name]
7
- super(options, html_options)
7
+ super
8
8
  end
9
9
  end
10
10
  end
@@ -1,12 +1,12 @@
1
1
  module ActiveScaffold
2
2
  module Routing
3
3
  ACTIVE_SCAFFOLD_CORE_ROUTING = {
4
- :collection => {:show_search => :get, :render_field => :post, :mark => :post},
5
- :member => {:update_column => :post, :render_field => %i[get post], :mark => :post}
4
+ collection: {show_search: :get, render_field: :post, mark: :post},
5
+ member: {update_column: :post, render_field: %i[get post], mark: :post}
6
6
  }.freeze
7
7
  ACTIVE_SCAFFOLD_ASSOCIATION_ROUTING = {
8
- :collection => {:edit_associated => :get, :new_existing => :get, :add_existing => :post},
9
- :member => {:edit_associated => :get, :destroy_existing => :delete}
8
+ collection: {edit_associated: :get, new_existing: :get, add_existing: :post},
9
+ member: {edit_associated: :get, destroy_existing: :delete}
10
10
  }.freeze
11
11
 
12
12
  class Association
@@ -44,6 +44,7 @@ module ActiveScaffold
44
44
 
45
45
  class Basic < Association
46
46
  def initialize(defaults = {})
47
+ super()
47
48
  @defaults = defaults
48
49
  end
49
50
 
@@ -2,6 +2,7 @@
2
2
  class ActiveRecord::Base
3
3
  def associated_valid?(path = [])
4
4
  return true if path.include?(self) # prevent recursion (if associated and parent are new records)
5
+
5
6
  path << self
6
7
  # using [].all? syntax to avoid a short-circuit
7
8
  # errors to associated record can be added by update_record_from_params when association fails to set and ActiveRecord::RecordNotSaved is raised
@@ -47,14 +48,14 @@ class ActiveRecord::Base
47
48
  # yields every associated object that has been instantiated and is flagged as unsaved.
48
49
  # returns false if any yield returns false.
49
50
  # returns true otherwise, even when none of the associations have been instantiated. build wrapper methods accordingly.
50
- def with_unsaved_associated
51
+ def with_unsaved_associated(&block)
51
52
  associations_for_update.map do |assoc|
52
53
  association_proxy = association(assoc.name)
53
54
  if association_proxy.target.present?
54
55
  records = association_proxy.target
55
56
  records = [records] unless records.is_a? Array # convert singular associations into collections for ease of use
56
57
  # must use select instead of find_all, which Rails overrides on association proxies for db access
57
- records.select { |r| r.unsaved? && !r.readonly? }.map { |r| yield r }.all?
58
+ records.select { |r| r.unsaved? && !r.readonly? }.map(&block).all?
58
59
  else
59
60
  true
60
61
  end