activeadmin 2.2.0 → 2.12.0

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of activeadmin might be problematic. Click here for more details.

Files changed (274) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +382 -32
  3. data/CONTRIBUTING.md +45 -67
  4. data/README.md +11 -4
  5. data/app/assets/javascripts/active_admin/base.js +524 -0
  6. data/app/assets/stylesheets/active_admin/_base.scss +53 -37
  7. data/app/assets/stylesheets/active_admin/_forms.scss +0 -10
  8. data/app/assets/stylesheets/active_admin/_header.scss +40 -8
  9. data/app/assets/stylesheets/active_admin/_mixins.scss +1 -1
  10. data/{vendor → app}/assets/stylesheets/active_admin/_normalize.scss +25 -123
  11. data/app/assets/stylesheets/active_admin/{print.scss → _print.scss} +2 -2
  12. data/app/assets/stylesheets/active_admin/components/_comments.scss +2 -2
  13. data/app/assets/stylesheets/active_admin/components/_date_picker.scss +1 -2
  14. data/app/assets/stylesheets/active_admin/components/_dropdown_menu.scss +0 -1
  15. data/app/assets/stylesheets/active_admin/components/_tables.scss +1 -2
  16. data/app/assets/stylesheets/active_admin/mixins/_all.scss +8 -8
  17. data/app/assets/stylesheets/active_admin/mixins/_variables.scss +17 -0
  18. data/app/assets/stylesheets/active_admin/structure/_main_structure.scss +1 -1
  19. data/app/assets/stylesheets/active_admin/structure/_title_bar.scss +0 -1
  20. data/app/javascript/active_admin/base.js +28 -0
  21. data/app/{assets/javascripts/active_admin/lib/batch_actions.es6 → javascript/active_admin/initializers/batch-actions.js} +9 -3
  22. data/app/javascript/active_admin/initializers/checkbox-toggler.js +3 -0
  23. data/app/javascript/active_admin/initializers/dropdown-menu.js +9 -0
  24. data/app/javascript/active_admin/initializers/filters.js +10 -0
  25. data/app/{assets/javascripts/active_admin/lib/has_many.es6 → javascript/active_admin/initializers/has-many.js} +4 -1
  26. data/app/javascript/active_admin/initializers/per-page.js +13 -0
  27. data/app/javascript/active_admin/initializers/table-checkbox-toggler.js +3 -0
  28. data/app/{assets/javascripts/active_admin/lib/checkbox-toggler.es6 → javascript/active_admin/lib/checkbox-toggler.js} +5 -5
  29. data/app/{assets/javascripts/active_admin/lib/dropdown-menu.es6 → javascript/active_admin/lib/dropdown-menu.js} +3 -10
  30. data/app/javascript/active_admin/lib/filters.js +39 -0
  31. data/app/{assets/javascripts/active_admin/lib/modal_dialog.es6 → javascript/active_admin/lib/modal-dialog.js} +10 -8
  32. data/app/javascript/active_admin/lib/per-page.js +38 -0
  33. data/app/{assets/javascripts/active_admin/lib/table-checkbox-toggler.es6 → javascript/active_admin/lib/table-checkbox-toggler.js} +5 -3
  34. data/app/javascript/active_admin/lib/utils.js +40 -0
  35. data/app/views/active_admin/devise/mailer/reset_password_instructions.html.erb +1 -1
  36. data/app/views/active_admin/devise/mailer/unlock_instructions.html.erb +2 -2
  37. data/app/views/active_admin/devise/shared/_links.erb +1 -1
  38. data/app/views/active_admin/page/index.html.arb +1 -0
  39. data/app/views/active_admin/resource/edit.html.arb +1 -0
  40. data/app/views/active_admin/resource/index.html.arb +1 -0
  41. data/app/views/active_admin/resource/new.html.arb +1 -0
  42. data/app/views/active_admin/resource/show.html.arb +1 -0
  43. data/app/views/kaminari/active_admin_countless/_first_page.html.erb +11 -0
  44. data/app/views/kaminari/active_admin_countless/_gap.html.erb +8 -0
  45. data/app/views/kaminari/active_admin_countless/_next_page.html.erb +11 -0
  46. data/app/views/kaminari/active_admin_countless/_page.html.erb +12 -0
  47. data/app/views/kaminari/active_admin_countless/_paginator.html.erb +24 -0
  48. data/app/views/kaminari/active_admin_countless/_prev_page.html.erb +11 -0
  49. data/app/views/layouts/active_admin.html.arb +1 -0
  50. data/app/views/layouts/active_admin_logged_out.html.erb +15 -5
  51. data/config/locales/ar.yml +6 -6
  52. data/config/locales/az.yml +138 -0
  53. data/config/locales/ca.yml +0 -1
  54. data/config/locales/de.yml +18 -0
  55. data/config/locales/en-CA.yml +3 -3
  56. data/config/locales/en-GB.yml +3 -3
  57. data/config/locales/en.yml +3 -3
  58. data/config/locales/es-MX.yml +2 -1
  59. data/config/locales/es.yml +5 -5
  60. data/config/locales/fr.yml +4 -4
  61. data/config/locales/it.yml +18 -0
  62. data/config/locales/ja.yml +3 -3
  63. data/config/locales/ko.yml +1 -1
  64. data/config/locales/lv.yml +2 -2
  65. data/config/locales/nl.yml +1 -1
  66. data/config/locales/ro.yml +3 -2
  67. data/config/locales/sk.yml +59 -0
  68. data/config/locales/vi.yml +6 -5
  69. data/docs/0-installation.md +27 -3
  70. data/docs/1-general-configuration.md +20 -0
  71. data/docs/11-decorators.md +16 -5
  72. data/docs/2-resource-customization.md +11 -2
  73. data/docs/3-index-pages/index-as-table.md +7 -0
  74. data/docs/3-index-pages.md +1 -1
  75. data/docs/5-forms.md +7 -2
  76. data/docs/6-show-pages.md +12 -0
  77. data/docs/8-custom-actions.md +1 -1
  78. data/docs/9-batch-actions.md +2 -2
  79. data/docs/Gemfile +3 -3
  80. data/docs/Gemfile.lock +192 -158
  81. data/docs/_config.yml +2 -0
  82. data/docs/_includes/top-menu.html +2 -2
  83. data/docs/documentation.md +1 -1
  84. data/docs/index.html +109 -8
  85. data/docs/stylesheets/main.css +29 -0
  86. data/lib/active_admin/abstract_view_factory.rb +1 -0
  87. data/lib/active_admin/application.rb +20 -20
  88. data/lib/active_admin/application_settings.rb +4 -3
  89. data/lib/active_admin/asset_registration.rb +1 -0
  90. data/lib/active_admin/authorization_adapter.rb +4 -3
  91. data/lib/active_admin/base_controller/authorization.rb +15 -13
  92. data/lib/active_admin/base_controller/menu.rb +1 -0
  93. data/lib/active_admin/base_controller.rb +6 -5
  94. data/lib/active_admin/batch_actions/controller.rb +4 -3
  95. data/lib/active_admin/batch_actions/resource_extension.rb +10 -8
  96. data/lib/active_admin/batch_actions/views/batch_action_form.rb +4 -3
  97. data/lib/active_admin/batch_actions/views/batch_action_selector.rb +7 -6
  98. data/lib/active_admin/batch_actions/views/selection_cells.rb +4 -3
  99. data/lib/active_admin/batch_actions.rb +1 -0
  100. data/lib/active_admin/callbacks.rb +1 -0
  101. data/lib/active_admin/cancan_adapter.rb +2 -1
  102. data/lib/active_admin/collection_decorator.rb +32 -0
  103. data/lib/active_admin/component.rb +1 -0
  104. data/lib/active_admin/controller_action.rb +1 -0
  105. data/lib/active_admin/csv_builder.rb +13 -23
  106. data/lib/active_admin/dependency.rb +13 -12
  107. data/lib/active_admin/deprecation.rb +1 -0
  108. data/lib/active_admin/devise.rb +16 -5
  109. data/lib/active_admin/dsl.rb +2 -1
  110. data/lib/active_admin/dynamic_setting.rb +1 -0
  111. data/lib/active_admin/dynamic_settings_node.rb +3 -2
  112. data/lib/active_admin/engine.rb +13 -9
  113. data/lib/active_admin/error.rb +1 -2
  114. data/lib/active_admin/filters/active.rb +2 -1
  115. data/lib/active_admin/filters/active_filter.rb +7 -7
  116. data/lib/active_admin/filters/active_sidebar.rb +4 -30
  117. data/lib/active_admin/filters/dsl.rb +1 -0
  118. data/lib/active_admin/filters/forms.rb +7 -6
  119. data/lib/active_admin/filters/formtastic_addons.rb +2 -6
  120. data/lib/active_admin/filters/resource_extension.rb +26 -1
  121. data/lib/active_admin/filters.rb +8 -7
  122. data/lib/active_admin/form_builder.rb +25 -20
  123. data/lib/active_admin/generators/boilerplate.rb +13 -4
  124. data/lib/active_admin/helpers/collection.rb +2 -0
  125. data/lib/active_admin/helpers/i18n.rb +1 -0
  126. data/lib/active_admin/helpers/optional_display.rb +3 -2
  127. data/lib/active_admin/helpers/routes/url_helpers.rb +1 -0
  128. data/lib/active_admin/helpers/scope_chain.rb +1 -0
  129. data/lib/active_admin/inputs/datepicker_input.rb +2 -1
  130. data/lib/active_admin/inputs/filters/base/search_method_select.rb +5 -4
  131. data/lib/active_admin/inputs/filters/base.rb +2 -1
  132. data/lib/active_admin/inputs/filters/boolean_input.rb +2 -1
  133. data/lib/active_admin/inputs/filters/check_boxes_input.rb +2 -1
  134. data/lib/active_admin/inputs/filters/date_picker_input.rb +1 -0
  135. data/lib/active_admin/inputs/filters/date_range_input.rb +16 -12
  136. data/lib/active_admin/inputs/filters/numeric_input.rb +1 -0
  137. data/lib/active_admin/inputs/filters/select_input.rb +3 -2
  138. data/lib/active_admin/inputs/filters/string_input.rb +1 -0
  139. data/lib/active_admin/inputs/filters/text_input.rb +1 -0
  140. data/lib/active_admin/inputs.rb +1 -0
  141. data/lib/active_admin/localizers/resource_localizer.rb +4 -3
  142. data/lib/active_admin/localizers.rb +2 -1
  143. data/lib/active_admin/menu.rb +7 -3
  144. data/lib/active_admin/menu_collection.rb +1 -0
  145. data/lib/active_admin/menu_item.rb +8 -7
  146. data/lib/active_admin/namespace.rb +14 -13
  147. data/lib/active_admin/namespace_settings.rb +21 -4
  148. data/lib/active_admin/order_clause.rb +3 -2
  149. data/lib/active_admin/orm/active_record/comments/comment.rb +4 -3
  150. data/lib/active_admin/orm/active_record/comments/namespace_helper.rb +1 -0
  151. data/lib/active_admin/orm/active_record/comments/resource_helper.rb +1 -0
  152. data/lib/active_admin/orm/active_record/comments/show_page_helper.rb +1 -0
  153. data/lib/active_admin/orm/active_record/comments/views/active_admin_comments.rb +20 -19
  154. data/lib/active_admin/orm/active_record/comments/views.rb +3 -2
  155. data/lib/active_admin/orm/active_record/comments.rb +20 -19
  156. data/lib/active_admin/orm/active_record.rb +2 -1
  157. data/lib/active_admin/orm/mongoid.rb +1 -0
  158. data/lib/active_admin/page.rb +2 -1
  159. data/lib/active_admin/page_controller.rb +1 -0
  160. data/lib/active_admin/page_dsl.rb +1 -0
  161. data/lib/active_admin/page_presenter.rb +1 -0
  162. data/lib/active_admin/pundit_adapter.rb +47 -11
  163. data/lib/active_admin/resource/action_items.rb +6 -5
  164. data/lib/active_admin/resource/attributes.rb +2 -1
  165. data/lib/active_admin/resource/belongs_to.rb +6 -2
  166. data/lib/active_admin/resource/controllers.rb +2 -1
  167. data/lib/active_admin/resource/includes.rb +1 -0
  168. data/lib/active_admin/resource/menu.rb +5 -4
  169. data/lib/active_admin/resource/model.rb +16 -0
  170. data/lib/active_admin/resource/naming.rb +6 -5
  171. data/lib/active_admin/resource/ordering.rb +1 -0
  172. data/lib/active_admin/resource/page_presenters.rb +1 -0
  173. data/lib/active_admin/resource/pagination.rb +1 -0
  174. data/lib/active_admin/resource/routes.rb +17 -10
  175. data/lib/active_admin/resource/scope_to.rb +8 -7
  176. data/lib/active_admin/resource/scopes.rb +1 -0
  177. data/lib/active_admin/resource/sidebars.rb +2 -1
  178. data/lib/active_admin/resource.rb +33 -19
  179. data/lib/active_admin/resource_collection.rb +1 -0
  180. data/lib/active_admin/resource_controller/action_builder.rb +1 -0
  181. data/lib/active_admin/resource_controller/data_access.rb +31 -5
  182. data/lib/active_admin/resource_controller/decorators.rb +8 -29
  183. data/lib/active_admin/resource_controller/polymorphic_routes.rb +38 -0
  184. data/lib/active_admin/resource_controller/resource_class_methods.rb +1 -0
  185. data/lib/active_admin/resource_controller/scoping.rb +1 -0
  186. data/lib/active_admin/resource_controller/sidebars.rb +1 -0
  187. data/lib/active_admin/resource_controller/streaming.rb +9 -7
  188. data/lib/active_admin/resource_controller.rb +14 -10
  189. data/lib/active_admin/resource_dsl.rb +11 -25
  190. data/lib/active_admin/router.rb +1 -0
  191. data/lib/active_admin/scope.rb +7 -6
  192. data/lib/active_admin/settings_node.rb +1 -0
  193. data/lib/active_admin/sidebar_section.rb +1 -0
  194. data/lib/active_admin/version.rb +2 -1
  195. data/lib/active_admin/view_factory.rb +18 -17
  196. data/lib/active_admin/view_helpers/active_admin_application_helper.rb +1 -0
  197. data/lib/active_admin/view_helpers/auto_link_helper.rb +1 -0
  198. data/lib/active_admin/view_helpers/breadcrumb_helper.rb +4 -3
  199. data/lib/active_admin/view_helpers/display_helper.rb +15 -7
  200. data/lib/active_admin/view_helpers/download_format_links_helper.rb +2 -1
  201. data/lib/active_admin/view_helpers/fields_for.rb +3 -2
  202. data/lib/active_admin/view_helpers/flash_helper.rb +1 -0
  203. data/lib/active_admin/view_helpers/form_helper.rb +1 -0
  204. data/lib/active_admin/view_helpers/method_or_proc_helper.rb +1 -0
  205. data/lib/active_admin/view_helpers/scope_name_helper.rb +1 -0
  206. data/lib/active_admin/view_helpers/sidebar_helper.rb +1 -0
  207. data/lib/active_admin/view_helpers/title_helper.rb +1 -0
  208. data/lib/active_admin/view_helpers/view_factory_helper.rb +1 -0
  209. data/lib/active_admin/view_helpers.rb +2 -1
  210. data/lib/active_admin/views/action_items.rb +1 -0
  211. data/lib/active_admin/views/components/active_admin_form.rb +7 -6
  212. data/lib/active_admin/views/components/active_filters_sidebar_content.rb +59 -0
  213. data/lib/active_admin/views/components/attributes_table.rb +6 -5
  214. data/lib/active_admin/views/components/blank_slate.rb +2 -1
  215. data/lib/active_admin/views/components/columns.rb +1 -0
  216. data/lib/active_admin/views/components/dropdown_menu.rb +7 -9
  217. data/lib/active_admin/views/components/index_list.rb +4 -3
  218. data/lib/active_admin/views/components/menu.rb +2 -1
  219. data/lib/active_admin/views/components/menu_item.rb +5 -4
  220. data/lib/active_admin/views/components/paginated_collection.rb +21 -19
  221. data/lib/active_admin/views/components/panel.rb +2 -1
  222. data/lib/active_admin/views/components/scopes.rb +8 -5
  223. data/lib/active_admin/views/components/sidebar.rb +1 -0
  224. data/lib/active_admin/views/components/sidebar_section.rb +1 -0
  225. data/lib/active_admin/views/components/site_title.rb +2 -1
  226. data/lib/active_admin/views/components/status_tag.rb +12 -11
  227. data/lib/active_admin/views/components/table_for.rb +19 -17
  228. data/lib/active_admin/views/components/tabs.rb +4 -3
  229. data/lib/active_admin/views/components/unsupported_browser.rb +1 -0
  230. data/lib/active_admin/views/footer.rb +3 -1
  231. data/lib/active_admin/views/header.rb +3 -2
  232. data/lib/active_admin/views/index_as_block.rb +1 -0
  233. data/lib/active_admin/views/index_as_blog.rb +2 -1
  234. data/lib/active_admin/views/index_as_grid.rb +2 -1
  235. data/lib/active_admin/views/index_as_table.rb +24 -16
  236. data/lib/active_admin/views/pages/base.rb +19 -12
  237. data/lib/active_admin/views/pages/form.rb +1 -0
  238. data/lib/active_admin/views/pages/index.rb +16 -13
  239. data/lib/active_admin/views/pages/layout.rb +1 -0
  240. data/lib/active_admin/views/pages/page.rb +1 -0
  241. data/lib/active_admin/views/pages/show.rb +1 -0
  242. data/lib/active_admin/views/tabbed_navigation.rb +3 -2
  243. data/lib/active_admin/views/title_bar.rb +2 -1
  244. data/lib/active_admin/views.rb +2 -1
  245. data/lib/active_admin.rb +63 -64
  246. data/lib/activeadmin.rb +2 -1
  247. data/lib/generators/active_admin/assets/assets_generator.rb +3 -2
  248. data/lib/generators/active_admin/assets/templates/active_admin.scss +2 -2
  249. data/lib/generators/active_admin/devise/devise_generator.rb +6 -5
  250. data/lib/generators/active_admin/install/install_generator.rb +15 -8
  251. data/lib/generators/active_admin/install/templates/active_admin.rb.erb +21 -1
  252. data/lib/generators/active_admin/install/templates/dashboard.rb +1 -0
  253. data/lib/generators/active_admin/page/page_generator.rb +2 -1
  254. data/lib/generators/active_admin/page/templates/page.rb +1 -0
  255. data/lib/generators/active_admin/resource/resource_generator.rb +4 -3
  256. data/lib/generators/active_admin/resource/templates/admin.rb.erb +4 -2
  257. data/lib/generators/active_admin/webpacker/plugins/jquery.js +7 -0
  258. data/lib/generators/active_admin/webpacker/templates/active_admin.js +5 -0
  259. data/lib/generators/active_admin/webpacker/templates/active_admin.scss +17 -0
  260. data/lib/generators/active_admin/webpacker/templates/print.scss +2 -0
  261. data/lib/generators/active_admin/webpacker/webpacker_generator.rb +27 -0
  262. data/lib/ransack_ext.rb +9 -8
  263. metadata +62 -91
  264. data/app/assets/images/active_admin/nested_menu_arrow.gif +0 -0
  265. data/app/assets/images/active_admin/nested_menu_arrow_dark.gif +0 -0
  266. data/app/assets/images/active_admin/orderable.png +0 -0
  267. data/app/assets/javascripts/active_admin/base.es6 +0 -23
  268. data/app/assets/javascripts/active_admin/initializers/filters.es6 +0 -45
  269. data/app/assets/javascripts/active_admin/lib/active_admin.es6 +0 -41
  270. data/app/assets/javascripts/active_admin/lib/per_page.es6 +0 -47
  271. /data/app/{assets/javascripts/active_admin/ext/jquery-ui.es6 → javascript/active_admin/ext/jquery-ui.js} +0 -0
  272. /data/app/{assets/javascripts/active_admin/ext/jquery.es6 → javascript/active_admin/ext/jquery.js} +0 -0
  273. /data/app/{assets/javascripts/active_admin/initializers/datepicker.es6 → javascript/active_admin/initializers/datepicker.js} +0 -0
  274. /data/app/{assets/javascripts/active_admin/initializers/tabs.es6 → javascript/active_admin/initializers/tabs.js} +0 -0
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  # Provides an intuitive way to build has_many associated records in the same form.
2
3
  module Formtastic
3
4
  module Inputs
@@ -22,7 +23,7 @@ module ActiveAdmin
22
23
 
23
24
  def cancel_link(url = { action: "index" }, html_options = {}, li_attrs = {})
24
25
  li_attrs[:class] ||= "cancel"
25
- li_content = template.link_to I18n.t('active_admin.cancel'), url, html_options
26
+ li_content = template.link_to I18n.t("active_admin.cancel"), url, html_options
26
27
  template.content_tag(:li, li_content, li_attrs)
27
28
  end
28
29
 
@@ -40,14 +41,14 @@ module ActiveAdmin
40
41
  attr_reader :assoc
41
42
  attr_reader :options
42
43
  attr_reader :heading, :sortable_column, :sortable_start
43
- attr_reader :new_record, :destroy_option
44
+ attr_reader :new_record, :destroy_option, :remove_record
44
45
 
45
46
  def initialize(has_many_form, assoc, options)
46
47
  super has_many_form
47
48
  @assoc = assoc
48
49
  @options = extract_custom_settings!(options.dup)
49
50
  @options.reverse_merge!(for: assoc)
50
- @options[:class] = [options[:class], "inputs has_many_fields"].compact.join(' ')
51
+ @options[:class] = [options[:class], "inputs has_many_fields"].compact.join(" ")
51
52
 
52
53
  if sortable_column
53
54
  @options[:for] = [assoc, sorted_children(sortable_column)]
@@ -69,9 +70,10 @@ module ActiveAdmin
69
70
  def extract_custom_settings!(options)
70
71
  @heading = options.key?(:heading) ? options.delete(:heading) : default_heading
71
72
  @sortable_column = options.delete(:sortable)
72
- @sortable_start = options.delete(:sortable_start) || 0
73
+ @sortable_start = options.delete(:sortable_start) || 0
73
74
  @new_record = options.key?(:new_record) ? options.delete(:new_record) : true
74
75
  @destroy_option = options.delete(:allow_destroy)
76
+ @remove_record = options.delete(:remove_record)
75
77
  options
76
78
  end
77
79
 
@@ -93,7 +95,7 @@ module ActiveAdmin
93
95
  contents = without_wrapper { inputs(options, &form_block) }
94
96
  contents ||= "".html_safe
95
97
 
96
- js = new_record ? js_for_has_many(options[:class], &form_block) : ''
98
+ js = new_record ? js_for_has_many(options[:class], &form_block) : ""
97
99
  contents << js
98
100
  end
99
101
 
@@ -107,19 +109,21 @@ module ActiveAdmin
107
109
  def has_many_actions(form_builder, contents)
108
110
  if form_builder.object.new_record?
109
111
  contents << template.content_tag(:li) do
110
- template.link_to I18n.t('active_admin.has_many_remove'), "#", class: 'button has_many_remove'
112
+ remove_text = remove_record.is_a?(String) ? remove_record : I18n.t("active_admin.has_many_remove")
113
+ template.link_to remove_text, "#", class: "button has_many_remove"
111
114
  end
112
115
  elsif allow_destroy?(form_builder.object)
113
- form_builder.input(:_destroy, as: :boolean,
114
- wrapper_html: { class: 'has_many_delete' },
115
- label: I18n.t('active_admin.has_many_delete'))
116
+ form_builder.input(
117
+ :_destroy, as: :boolean,
118
+ wrapper_html: { class: "has_many_delete" },
119
+ label: I18n.t("active_admin.has_many_delete"))
116
120
  end
117
121
 
118
122
  if sortable_column
119
123
  form_builder.input sortable_column, as: :hidden
120
124
 
121
- contents << template.content_tag(:li, class: 'handle') do
122
- I18n.t('active_admin.move')
125
+ contents << template.content_tag(:li, class: "handle") do
126
+ I18n.t("active_admin.move")
123
127
  end
124
128
  end
125
129
 
@@ -156,27 +160,28 @@ module ActiveAdmin
156
160
 
157
161
  # Capture the ADD JS
158
162
  def js_for_has_many(class_string, &form_block)
159
- assoc_name = assoc_klass.model_name
160
- placeholder = "NEW_#{assoc_name.to_s.underscore.upcase.gsub(/\//, '_')}_RECORD"
163
+ assoc_name = assoc_klass.model_name
164
+ placeholder = "NEW_#{assoc_name.to_s.underscore.upcase.gsub(/\//, '_')}_RECORD"
161
165
  opts = {
162
166
  for: [assoc, assoc_klass.new],
163
167
  class: class_string,
164
168
  for_options: { child_index: placeholder }
165
169
  }
166
170
  html = template.capture { __getobj__.send(:inputs_for_nested_attributes, opts, &form_block) }
167
- text = new_record.is_a?(String) ? new_record : I18n.t('active_admin.has_many_new', model: assoc_name.human)
171
+ text = new_record.is_a?(String) ? new_record : I18n.t("active_admin.has_many_new", model: assoc_name.human)
168
172
 
169
- template.link_to text, '#', class: "button has_many_add", data: {
173
+ template.link_to text, "#", class: "button has_many_add", data: {
170
174
  html: CGI.escapeHTML(html).html_safe, placeholder: placeholder
171
175
  }
172
176
  end
173
177
 
174
178
  def wrap_div_or_li(html)
175
- template.content_tag(already_in_an_inputs_block ? :li : :div,
176
- html,
177
- class: "has_many_container #{assoc}",
178
- 'data-sortable' => sortable_column,
179
- 'data-sortable-start' => sortable_start)
179
+ template.content_tag(
180
+ already_in_an_inputs_block ? :li : :div,
181
+ html,
182
+ class: "has_many_container #{assoc}",
183
+ "data-sortable" => sortable_column,
184
+ "data-sortable-start" => sortable_start)
180
185
  end
181
186
  end
182
187
  end
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  module ActiveAdmin
2
3
  module Generators
3
4
  class Boilerplate
@@ -9,8 +10,16 @@ module ActiveAdmin
9
10
  @class_name.constantize.new.attributes.keys
10
11
  end
11
12
 
13
+ def assignable_attributes
14
+ attributes - %w(id created_at updated_at)
15
+ end
16
+
17
+ def permit_params
18
+ assignable_attributes.map { |a| a.to_sym.inspect }.join(", ")
19
+ end
20
+
12
21
  def rows
13
- attributes.map { |a| row(a) }.join("\n")
22
+ attributes.map { |a| row(a) }.join("\n ")
14
23
  end
15
24
 
16
25
  def row(name)
@@ -18,7 +27,7 @@ module ActiveAdmin
18
27
  end
19
28
 
20
29
  def columns
21
- attributes.map { |a| column(a) }.join("\n")
30
+ attributes.map { |a| column(a) }.join("\n ")
22
31
  end
23
32
 
24
33
  def column(name)
@@ -26,7 +35,7 @@ module ActiveAdmin
26
35
  end
27
36
 
28
37
  def filters
29
- attributes.map { |a| filter(a) }.join("\n")
38
+ attributes.map { |a| filter(a) }.join("\n ")
30
39
  end
31
40
 
32
41
  def filter(name)
@@ -34,7 +43,7 @@ module ActiveAdmin
34
43
  end
35
44
 
36
45
  def form_inputs
37
- attributes.reject { |a| %w(id created_at updated_at).include? a }.map { |a| form_input(a) }.join("\n")
46
+ assignable_attributes.map { |a| form_input(a) }.join("\n ")
38
47
  end
39
48
 
40
49
  def form_input(name)
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  module ActiveAdmin
2
3
  module Helpers
3
4
  module Collection
@@ -5,6 +6,7 @@ module ActiveAdmin
5
6
  # 2. correctly handles the Hash returned when `group by` is used
6
7
  def collection_size(c = collection)
7
8
  return c.count if c.is_a?(Array)
9
+ return c.length if c.limit_value
8
10
 
9
11
  c = c.except :select, :order
10
12
 
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  module ActiveAdmin
2
3
  module Helpers
3
4
  module I18n
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  module ActiveAdmin
2
3
 
3
4
  # Shareable module to give a #display_on?(action) method
@@ -15,7 +16,7 @@ module ActiveAdmin
15
16
 
16
17
  module OptionalDisplay
17
18
  def display_on?(action, render_context = self)
18
- return false if @options[:only] && !@options[:only].include?(action.to_sym)
19
+ return false if @options[:only] && !@options[:only].include?(action.to_sym)
19
20
  return false if @options[:except] && @options[:except].include?(action.to_sym)
20
21
 
21
22
  case condition = @options[:if]
@@ -31,7 +32,7 @@ module ActiveAdmin
31
32
  private
32
33
 
33
34
  def normalize_display_options!
34
- @options[:only] = Array(@options[:only]) if @options[:only]
35
+ @options[:only] = Array(@options[:only]) if @options[:only]
35
36
  @options[:except] = Array(@options[:except]) if @options[:except]
36
37
  end
37
38
  end
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  module ActiveAdmin
2
3
  module Helpers
3
4
  module Routes
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  module ActiveAdmin
2
3
  module ScopeChain
3
4
  private
@@ -1,9 +1,10 @@
1
+ # frozen_string_literal: true
1
2
  module ActiveAdmin
2
3
  module Inputs
3
4
  class DatepickerInput < ::Formtastic::Inputs::StringInput
4
5
  def input_html_options
5
6
  super.tap do |options|
6
- options[:class] = [options[:class], "datepicker"].compact.join(' ')
7
+ options[:class] = [options[:class], "datepicker"].compact.join(" ")
7
8
  options[:data] ||= {}
8
9
  options[:data].merge! datepicker_options
9
10
  end
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  # This is a common set of Formtastic overrides needed to build a filter form
2
3
  # that lets you select from a set of search methods for a given attribute.
3
4
  #
@@ -31,15 +32,15 @@ module ActiveAdmin
31
32
 
32
33
  def wrapper_html_options
33
34
  opts = super
34
- (opts[:class] ||= '') << ' select_and_search' unless seems_searchable?
35
+ (opts[:class] ||= "") << " select_and_search" unless seems_searchable?
35
36
  opts
36
37
  end
37
38
 
38
39
  def to_html
39
40
  input_wrapping do
40
- label_html << # your label
41
+ label_html << # your label
41
42
  select_html << # the dropdown that holds the available search methods
42
- input_html # your input field
43
+ input_html # your input field
43
44
  end
44
45
  end
45
46
 
@@ -48,7 +49,7 @@ module ActiveAdmin
48
49
  end
49
50
 
50
51
  def select_html
51
- template.select_tag '', template.options_for_select(filter_options, current_filter)
52
+ template.select_tag "", template.options_for_select(filter_options, current_filter)
52
53
  end
53
54
 
54
55
  def filters
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  module ActiveAdmin
2
3
  module Inputs
3
4
  module Filters
@@ -25,7 +26,7 @@ module ActiveAdmin
25
26
 
26
27
  def wrapper_html_options
27
28
  opts = super
28
- (opts[:class] ||= '') << " filter_form_field filter_#{as}"
29
+ (opts[:class] ||= "") << " filter_form_field filter_#{as}"
29
30
  opts
30
31
  end
31
32
 
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  module ActiveAdmin
2
3
  module Inputs
3
4
  module Filters
@@ -16,7 +17,7 @@ module ActiveAdmin
16
17
 
17
18
  # Provide the AA translation to the blank input field.
18
19
  def include_blank
19
- I18n.t 'active_admin.any' if super
20
+ I18n.t "active_admin.any" if super
20
21
  end
21
22
  end
22
23
  end
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  module ActiveAdmin
2
3
  module Inputs
3
4
  module Filters
@@ -22,7 +23,7 @@ module ActiveAdmin
22
23
 
23
24
  # Add whitespace before label
24
25
  def choice_label(choice)
25
- ' ' + super
26
+ " " + super
26
27
  end
27
28
 
28
29
  # Don't wrap in UL tag
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  module ActiveAdmin
2
3
  module Inputs
3
4
  module Filters
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  module ActiveAdmin
2
3
  module Inputs
3
4
  module Filters
@@ -7,8 +8,8 @@ module ActiveAdmin
7
8
  def to_html
8
9
  input_wrapping do
9
10
  [ label_html,
10
- builder.text_field(gt_input_name, input_html_options(gt_input_name, gt_input_placeholder)),
11
- builder.text_field(lt_input_name, input_html_options(lt_input_name, lt_input_placeholder)),
11
+ builder.text_field(gt_input_name, input_html_options_for(gt_input_name, gt_input_placeholder)),
12
+ builder.text_field(lt_input_name, input_html_options_for(lt_input_name, lt_input_placeholder)),
12
13
  ].join("\n").html_safe
13
14
  end
14
15
  end
@@ -22,18 +23,21 @@ module ActiveAdmin
22
23
  column && column.type == :date ? "#{method}_lteq" : "#{method}_lteq_datetime"
23
24
  end
24
25
 
25
- def input_html_options(input_name = gt_input_name, placeholder = gt_input_placeholder)
26
- current_value = begin
27
- #cast value to date object before rendering input
28
- @object.public_send(input_name).to_s.to_date
29
- rescue
30
- nil
31
- end
26
+ def input_html_options
32
27
  { size: 12,
33
28
  class: "datepicker",
34
- maxlength: 10,
35
- placeholder: placeholder,
36
- value: current_value ? current_value.strftime("%Y-%m-%d") : "" }
29
+ maxlength: 10 }.merge(options[:input_html] || {})
30
+ end
31
+
32
+ def input_html_options_for(input_name, placeholder)
33
+ current_value = begin
34
+ #cast value to date object before rendering input
35
+ @object.public_send(input_name).to_s.to_date
36
+ rescue
37
+ nil
38
+ end
39
+ { placeholder: placeholder,
40
+ value: current_value ? current_value.strftime("%Y-%m-%d") : "" }.merge(input_html_options)
37
41
  end
38
42
 
39
43
  def gt_input_placeholder
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  module ActiveAdmin
2
3
  module Inputs
3
4
  module Filters
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  module ActiveAdmin
2
3
  module Inputs
3
4
  module Filters
@@ -7,7 +8,7 @@ module ActiveAdmin
7
8
  def input_name
8
9
  return method if seems_searchable?
9
10
 
10
- searchable_method_name + (multiple? ? '_in' : '_eq')
11
+ searchable_method_name + (multiple? ? "_in" : "_eq")
11
12
  end
12
13
 
13
14
  def searchable_method_name
@@ -22,7 +23,7 @@ module ActiveAdmin
22
23
 
23
24
  # Provide the AA translation to the blank input field.
24
25
  def include_blank
25
- I18n.t 'active_admin.any' if super
26
+ I18n.t "active_admin.any" if super
26
27
  end
27
28
 
28
29
  def input_html_options_name
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  module ActiveAdmin
2
3
  module Inputs
3
4
  module Filters
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  module ActiveAdmin
2
3
  module Inputs
3
4
  module Filters
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  module ActiveAdmin
2
3
  module Inputs
3
4
  extend ActiveSupport::Autoload
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  module ActiveAdmin
2
3
  module Localizers
3
4
  class ResourceLocalizer
@@ -19,16 +20,16 @@ module ActiveAdmin
19
20
 
20
21
  def translate(key, options = {})
21
22
  scope = options.delete(:scope)
22
- specific_key = array_to_key('resources', @model_name, scope, key)
23
+ specific_key = array_to_key("resources", @model_name, scope, key)
23
24
  defaults = [array_to_key(scope, key), key.to_s.titleize]
24
- ::I18n.t specific_key, options.reverse_merge(model: @model, default: defaults, scope: 'active_admin')
25
+ ::I18n.t specific_key, **options.reverse_merge(model: @model, default: defaults, scope: "active_admin")
25
26
  end
26
27
  alias_method :t, :translate
27
28
 
28
29
  protected
29
30
 
30
31
  def array_to_key(*arr)
31
- arr.flatten.compact.join('.').to_sym
32
+ arr.flatten.compact.join(".").to_sym
32
33
  end
33
34
  end
34
35
  end
@@ -1,4 +1,5 @@
1
- require 'active_admin/localizers/resource_localizer'
1
+ # frozen_string_literal: true
2
+ require "active_admin/localizers/resource_localizer"
2
3
 
3
4
  module ActiveAdmin
4
5
  module Localizers
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  module ActiveAdmin
2
3
 
3
4
  # Each Namespace builds up it's own menu as the global navigation
@@ -47,7 +48,10 @@ module ActiveAdmin
47
48
  # menu.add parent: 'Dashboard', label: 'My Child Dashboard'
48
49
  #
49
50
  def add(options)
50
- item = if parent = options.delete(:parent)
51
+ parent_chain = Array.wrap(options.delete(:parent))
52
+
53
+ item = if parent = parent_chain.shift
54
+ options[:parent] = parent_chain if parent_chain.any?
51
55
  (self[parent] || add(label: parent)).add options
52
56
  else
53
57
  _add options.merge parent: self
@@ -60,7 +64,7 @@ module ActiveAdmin
60
64
 
61
65
  # Whether any children match the given item.
62
66
  def include?(item)
63
- @children.values.include? item
67
+ @children.values.include?(item) || @children.values.any? { |child| child.include?(item) }
64
68
  end
65
69
 
66
70
  # Used in the UI to visually distinguish which menu item is selected.
@@ -87,7 +91,7 @@ module ActiveAdmin
87
91
  def normalize_id(id)
88
92
  case id
89
93
  when String, Symbol, ActiveModel::Name
90
- id.to_s.downcase.tr ' ', '_'
94
+ id.to_s.downcase.tr " ", "_"
91
95
  when ActiveAdmin::Resource::Name
92
96
  id.param_key
93
97
  else
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  module ActiveAdmin
2
3
 
3
4
  DEFAULT_MENU = :default
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  module ActiveAdmin
2
3
  class MenuItem
3
4
  include Menu::MenuNode
@@ -45,13 +46,13 @@ module ActiveAdmin
45
46
  #
46
47
  def initialize(options = {})
47
48
  super() # MenuNode
48
- @label = options[:label]
49
- @dirty_id = options[:id] || options[:label]
50
- @url = options[:url] || '#'
51
- @priority = options[:priority] || 10
52
- @html_options = options[:html_options] || {}
53
- @should_display = options[:if] || proc { true }
54
- @parent = options[:parent]
49
+ @label = options[:label]
50
+ @dirty_id = options[:id] || options[:label]
51
+ @url = options[:url] || "#"
52
+ @priority = options[:priority] || 10
53
+ @html_options = options[:html_options] || {}
54
+ @should_display = options[:if] || proc { true }
55
+ @parent = options[:parent]
55
56
 
56
57
  yield(self) if block_given? # Builder style syntax
57
58
  end
@@ -1,4 +1,5 @@
1
- require 'active_admin/resource_collection'
1
+ # frozen_string_literal: true
2
+ require "active_admin/resource_collection"
2
3
 
3
4
  module ActiveAdmin
4
5
 
@@ -31,7 +32,7 @@ module ActiveAdmin
31
32
  end
32
33
  end
33
34
 
34
- RegisterEvent = 'active_admin.namespace.register'.freeze
35
+ RegisterEvent = "active_admin.namespace.register".freeze
35
36
 
36
37
  attr_reader :application, :resources, :menus
37
38
 
@@ -71,7 +72,7 @@ module ActiveAdmin
71
72
  reset_menu!
72
73
 
73
74
  # Dispatch a registration event
74
- ActiveSupport::Notifications.publish ActiveAdmin::Resource::RegisterEvent, config
75
+ ActiveSupport::Notifications.instrument ActiveAdmin::Resource::RegisterEvent, config
75
76
 
76
77
  # Return the config
77
78
  config
@@ -149,10 +150,10 @@ module ActiveAdmin
149
150
  def add_logout_button_to_menu(menu, priority = 20, html_options = {})
150
151
  if logout_link_path
151
152
  html_options = html_options.reverse_merge(method: logout_link_method || :get)
152
- menu.add id: 'logout', priority: priority, html_options: html_options,
153
- label: -> { I18n.t 'active_admin.logout' },
154
- url: -> { render_or_call_method_or_proc_on self, active_admin_namespace.logout_link_path },
155
- if: :current_active_admin_user?
153
+ menu.add id: "logout", priority: priority, html_options: html_options,
154
+ label: -> { I18n.t "active_admin.logout" },
155
+ url: -> { render_or_call_method_or_proc_on self, active_admin_namespace.logout_link_path },
156
+ if: :current_active_admin_user?
156
157
  end
157
158
  end
158
159
 
@@ -164,10 +165,10 @@ module ActiveAdmin
164
165
  #
165
166
  def add_current_user_to_menu(menu, priority = 10, html_options = {})
166
167
  if current_user_method
167
- menu.add id: 'current_user', priority: priority, html_options: html_options,
168
- label: -> { display_name current_active_admin_user },
169
- url: -> { auto_url_for(current_active_admin_user) },
170
- if: :current_active_admin_user?
168
+ menu.add id: "current_user", priority: priority, html_options: html_options,
169
+ label: -> { display_name current_active_admin_user },
170
+ url: -> { auto_url_for(current_active_admin_user) },
171
+ if: :current_active_admin_user?
171
172
  end
172
173
  end
173
174
 
@@ -211,8 +212,8 @@ module ActiveAdmin
211
212
 
212
213
  def unload_resources!
213
214
  resources.each do |resource|
214
- parent = (module_name || 'Object').constantize
215
- name = resource.controller_name.split('::').last
215
+ parent = (module_name || "Object").constantize
216
+ name = resource.controller_name.split("::").last
216
217
  parent.send(:remove_const, name) if parent.const_defined?(name, false)
217
218
 
218
219
  # Remove circular references
@@ -1,4 +1,5 @@
1
- require 'active_admin/dynamic_settings_node'
1
+ # frozen_string_literal: true
2
+ require "active_admin/dynamic_settings_node"
2
3
 
3
4
  module ActiveAdmin
4
5
  class NamespaceSettings < DynamicSettingsNode
@@ -57,7 +58,7 @@ module ActiveAdmin
57
58
  register :filters, true
58
59
 
59
60
  # The namespace root
60
- register :root_to, 'dashboard#index'
61
+ register :root_to, "dashboard#index"
61
62
 
62
63
  # Options that are passed to root_to
63
64
  register :root_to_options, {}
@@ -73,7 +74,7 @@ module ActiveAdmin
73
74
  register :create_another, false
74
75
 
75
76
  # Default CSV options
76
- register :csv_options, { col_sep: ',', byte_order_mark: "\xEF\xBB\xBF" }
77
+ register :csv_options, { col_sep: ",", byte_order_mark: "\xEF\xBB\xBF" }
77
78
 
78
79
  # Default Download Links options
79
80
  register :download_links, true
@@ -102,9 +103,25 @@ module ActiveAdmin
102
103
  ]
103
104
 
104
105
  # Set flash message keys that shouldn't show in ActiveAdmin
105
- register :flash_keys_to_except, ['timedout']
106
+ register :flash_keys_to_except, ["timedout"]
106
107
 
107
108
  # Include association filters by default
108
109
  register :include_default_association_filters, true
110
+
111
+ register :maximum_association_filter_arity, :unlimited
112
+
113
+ register :filter_columns_for_large_association, [
114
+ :display_name,
115
+ :full_name,
116
+ :name,
117
+ :username,
118
+ :login,
119
+ :title,
120
+ :email,
121
+ ]
122
+ register :filter_method_for_large_association, "_starts_with"
123
+
124
+ # Switch between asset pipeline and webpacker assets
125
+ register :use_webpacker, false
109
126
  end
110
127
  end
@@ -1,9 +1,10 @@
1
+ # frozen_string_literal: true
1
2
  module ActiveAdmin
2
3
  class OrderClause
3
4
  attr_reader :field, :order, :active_admin_config
4
5
 
5
6
  def initialize(active_admin_config, clause)
6
- clause =~ /^([\w\_\.]+)(->'\w+')?_(desc|asc)$/
7
+ clause =~ /^([\w\.]+)(->'\w+')?_(desc|asc)$/
7
8
  @column = $1
8
9
  @op = $2
9
10
  @order = $3
@@ -20,7 +21,7 @@ module ActiveAdmin
20
21
  end
21
22
 
22
23
  def to_sql
23
- [table_column, @op, ' ', @order].compact.join
24
+ [table_column, @op, " ", @order].compact.join
24
25
  end
25
26
 
26
27
  def table