activeadmin 2.9.0 → 3.2.0

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 (278) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +284 -1
  3. data/CONTRIBUTING.md +4 -12
  4. data/README.md +2 -2
  5. data/app/assets/javascripts/active_admin/base.js +13 -9
  6. data/app/assets/stylesheets/active_admin/_base.scss +53 -37
  7. data/app/assets/stylesheets/active_admin/_forms.scss +1 -11
  8. data/app/assets/stylesheets/active_admin/_normalize.scss +25 -123
  9. data/app/assets/stylesheets/active_admin/components/_date_picker.scss +1 -2
  10. data/app/assets/stylesheets/active_admin/components/_dropdown_menu.scss +0 -1
  11. data/app/assets/stylesheets/active_admin/mixins/_variables.scss +9 -0
  12. data/app/assets/stylesheets/active_admin/structure/_footer.scss +6 -1
  13. data/app/assets/stylesheets/active_admin/structure/_title_bar.scss +0 -1
  14. data/app/javascript/active_admin/initializers/has-many.js +4 -1
  15. data/app/views/active_admin/devise/shared/_links.erb +1 -1
  16. data/app/views/active_admin/page/index.html.arb +1 -0
  17. data/app/views/active_admin/resource/edit.html.arb +1 -0
  18. data/app/views/active_admin/resource/index.html.arb +1 -0
  19. data/app/views/active_admin/resource/new.html.arb +1 -0
  20. data/app/views/active_admin/resource/show.html.arb +1 -0
  21. data/app/views/layouts/active_admin.html.arb +1 -0
  22. data/app/views/layouts/active_admin_logged_out.html.erb +5 -4
  23. data/config/locales/ar.yml +0 -7
  24. data/config/locales/az.yml +0 -7
  25. data/config/locales/bg.yml +0 -7
  26. data/config/locales/bs.yml +0 -7
  27. data/config/locales/ca.yml +0 -7
  28. data/config/locales/cs.yml +0 -7
  29. data/config/locales/da.yml +0 -7
  30. data/config/locales/de-CH.yml +0 -7
  31. data/config/locales/de.yml +0 -8
  32. data/config/locales/el.yml +0 -7
  33. data/config/locales/en-CA.yml +0 -7
  34. data/config/locales/en-GB.yml +0 -7
  35. data/config/locales/en.yml +0 -8
  36. data/config/locales/eo.yml +0 -8
  37. data/config/locales/es-MX.yml +0 -7
  38. data/config/locales/es.yml +0 -8
  39. data/config/locales/fa.yml +0 -7
  40. data/config/locales/fi.yml +0 -7
  41. data/config/locales/fr.yml +3 -11
  42. data/config/locales/he.yml +0 -9
  43. data/config/locales/hr.yml +0 -7
  44. data/config/locales/hu.yml +0 -8
  45. data/config/locales/id.yml +0 -7
  46. data/config/locales/it.yml +0 -8
  47. data/config/locales/ja.yml +0 -8
  48. data/config/locales/ko.yml +1 -8
  49. data/config/locales/lt.yml +0 -8
  50. data/config/locales/lv.yml +0 -7
  51. data/config/locales/mk.yml +0 -8
  52. data/config/locales/nb.yml +0 -8
  53. data/config/locales/nl.yml +1 -9
  54. data/config/locales/pl.yml +0 -8
  55. data/config/locales/pt-BR.yml +0 -8
  56. data/config/locales/pt-PT.yml +0 -7
  57. data/config/locales/ro.yml +3 -9
  58. data/config/locales/ru.yml +0 -6
  59. data/config/locales/sk.yml +0 -8
  60. data/config/locales/sv-SE.yml +58 -39
  61. data/config/locales/tr.yml +0 -11
  62. data/config/locales/uk.yml +0 -6
  63. data/config/locales/vi.yml +34 -15
  64. data/config/locales/zh-CN.yml +34 -23
  65. data/config/locales/zh-TW.yml +0 -7
  66. data/lib/active_admin/abstract_view_factory.rb +1 -0
  67. data/lib/active_admin/application.rb +10 -10
  68. data/lib/active_admin/application_settings.rb +1 -0
  69. data/lib/active_admin/asset_registration.rb +4 -3
  70. data/lib/active_admin/authorization_adapter.rb +3 -0
  71. data/lib/active_admin/base_controller/authorization.rb +4 -3
  72. data/lib/active_admin/base_controller/menu.rb +1 -0
  73. data/lib/active_admin/base_controller.rb +2 -1
  74. data/lib/active_admin/batch_actions/controller.rb +1 -0
  75. data/lib/active_admin/batch_actions/resource_extension.rb +1 -0
  76. data/lib/active_admin/batch_actions/views/batch_action_form.rb +1 -0
  77. data/lib/active_admin/batch_actions/views/batch_action_selector.rb +1 -0
  78. data/lib/active_admin/batch_actions/views/selection_cells.rb +1 -0
  79. data/lib/active_admin/batch_actions.rb +1 -0
  80. data/lib/active_admin/callbacks.rb +1 -0
  81. data/lib/active_admin/cancan_adapter.rb +1 -0
  82. data/lib/active_admin/collection_decorator.rb +1 -0
  83. data/lib/active_admin/component.rb +1 -0
  84. data/lib/active_admin/controller_action.rb +1 -0
  85. data/lib/active_admin/csv_builder.rb +24 -16
  86. data/lib/active_admin/dependency.rb +1 -4
  87. data/lib/active_admin/devise.rb +11 -0
  88. data/lib/active_admin/dsl.rb +1 -0
  89. data/lib/active_admin/dynamic_setting.rb +1 -0
  90. data/lib/active_admin/dynamic_settings_node.rb +1 -0
  91. data/lib/active_admin/engine.rb +8 -2
  92. data/lib/active_admin/error.rb +1 -0
  93. data/lib/active_admin/filters/active.rb +1 -0
  94. data/lib/active_admin/filters/active_filter.rb +2 -1
  95. data/lib/active_admin/filters/active_sidebar.rb +2 -28
  96. data/lib/active_admin/filters/dsl.rb +1 -0
  97. data/lib/active_admin/filters/forms.rb +3 -2
  98. data/lib/active_admin/filters/formtastic_addons.rb +2 -1
  99. data/lib/active_admin/filters/resource_extension.rb +5 -4
  100. data/lib/active_admin/filters.rb +1 -0
  101. data/lib/active_admin/form_builder.rb +1 -0
  102. data/lib/active_admin/generators/boilerplate.rb +1 -0
  103. data/lib/active_admin/helpers/collection.rb +2 -0
  104. data/lib/active_admin/helpers/i18n.rb +1 -0
  105. data/lib/active_admin/helpers/optional_display.rb +1 -0
  106. data/lib/active_admin/helpers/routes/url_helpers.rb +1 -0
  107. data/lib/active_admin/helpers/scope_chain.rb +1 -0
  108. data/lib/active_admin/inputs/datepicker_input.rb +1 -0
  109. data/lib/active_admin/inputs/filters/base/search_method_select.rb +3 -2
  110. data/lib/active_admin/inputs/filters/base.rb +1 -0
  111. data/lib/active_admin/inputs/filters/boolean_input.rb +1 -0
  112. data/lib/active_admin/inputs/filters/check_boxes_input.rb +1 -0
  113. data/lib/active_admin/inputs/filters/date_picker_input.rb +1 -0
  114. data/lib/active_admin/inputs/filters/date_range_input.rb +3 -2
  115. data/lib/active_admin/inputs/filters/numeric_input.rb +2 -1
  116. data/lib/active_admin/inputs/filters/select_input.rb +3 -0
  117. data/lib/active_admin/inputs/filters/string_input.rb +2 -1
  118. data/lib/active_admin/inputs/filters/text_input.rb +1 -0
  119. data/lib/active_admin/inputs.rb +1 -0
  120. data/lib/active_admin/localizers/resource_localizer.rb +1 -0
  121. data/lib/active_admin/localizers.rb +1 -0
  122. data/lib/active_admin/menu.rb +2 -0
  123. data/lib/active_admin/menu_collection.rb +1 -0
  124. data/lib/active_admin/menu_item.rb +1 -0
  125. data/lib/active_admin/namespace.rb +4 -3
  126. data/lib/active_admin/namespace_settings.rb +2 -1
  127. data/lib/active_admin/order_clause.rb +1 -0
  128. data/lib/active_admin/orm/active_record/comments/comment.rb +9 -0
  129. data/lib/active_admin/orm/active_record/comments/namespace_helper.rb +1 -0
  130. data/lib/active_admin/orm/active_record/comments/resource_helper.rb +1 -0
  131. data/lib/active_admin/orm/active_record/comments/show_page_helper.rb +1 -0
  132. data/lib/active_admin/orm/active_record/comments/views/active_admin_comments.rb +2 -1
  133. data/lib/active_admin/orm/active_record/comments/views.rb +1 -0
  134. data/lib/active_admin/orm/active_record/comments.rb +9 -8
  135. data/lib/active_admin/orm/active_record.rb +1 -0
  136. data/lib/active_admin/orm/mongoid.rb +1 -0
  137. data/lib/active_admin/page.rb +1 -0
  138. data/lib/active_admin/page_controller.rb +1 -0
  139. data/lib/active_admin/page_dsl.rb +1 -0
  140. data/lib/active_admin/page_presenter.rb +1 -0
  141. data/lib/active_admin/pundit_adapter.rb +55 -13
  142. data/lib/active_admin/resource/action_items.rb +3 -2
  143. data/lib/active_admin/resource/attributes.rb +1 -0
  144. data/lib/active_admin/resource/belongs_to.rb +1 -0
  145. data/lib/active_admin/resource/controllers.rb +1 -0
  146. data/lib/active_admin/resource/includes.rb +1 -0
  147. data/lib/active_admin/resource/menu.rb +1 -0
  148. data/lib/active_admin/resource/model.rb +1 -0
  149. data/lib/active_admin/resource/naming.rb +1 -0
  150. data/lib/active_admin/resource/ordering.rb +1 -0
  151. data/lib/active_admin/resource/page_presenters.rb +1 -0
  152. data/lib/active_admin/resource/pagination.rb +1 -0
  153. data/lib/active_admin/resource/routes.rb +1 -0
  154. data/lib/active_admin/resource/scope_to.rb +1 -0
  155. data/lib/active_admin/resource/scopes.rb +1 -0
  156. data/lib/active_admin/resource/sidebars.rb +1 -0
  157. data/lib/active_admin/resource.rb +3 -2
  158. data/lib/active_admin/resource_collection.rb +1 -0
  159. data/lib/active_admin/resource_controller/action_builder.rb +1 -0
  160. data/lib/active_admin/resource_controller/data_access.rb +30 -4
  161. data/lib/active_admin/resource_controller/decorators.rb +1 -0
  162. data/lib/active_admin/resource_controller/polymorphic_routes.rb +1 -0
  163. data/lib/active_admin/resource_controller/resource_class_methods.rb +1 -0
  164. data/lib/active_admin/resource_controller/scoping.rb +1 -0
  165. data/lib/active_admin/resource_controller/sidebars.rb +1 -0
  166. data/lib/active_admin/resource_controller/streaming.rb +3 -2
  167. data/lib/active_admin/resource_controller.rb +1 -0
  168. data/lib/active_admin/resource_dsl.rb +7 -21
  169. data/lib/active_admin/router.rb +1 -0
  170. data/lib/active_admin/scope.rb +1 -0
  171. data/lib/active_admin/settings_node.rb +1 -0
  172. data/lib/active_admin/sidebar_section.rb +1 -0
  173. data/lib/active_admin/version.rb +2 -1
  174. data/lib/active_admin/view_factory.rb +1 -0
  175. data/lib/active_admin/view_helpers/active_admin_application_helper.rb +1 -0
  176. data/lib/active_admin/view_helpers/auto_link_helper.rb +2 -1
  177. data/lib/active_admin/view_helpers/breadcrumb_helper.rb +1 -0
  178. data/lib/active_admin/view_helpers/display_helper.rb +19 -4
  179. data/lib/active_admin/view_helpers/download_format_links_helper.rb +1 -0
  180. data/lib/active_admin/view_helpers/fields_for.rb +1 -0
  181. data/lib/active_admin/view_helpers/flash_helper.rb +1 -0
  182. data/lib/active_admin/view_helpers/form_helper.rb +1 -0
  183. data/lib/active_admin/view_helpers/method_or_proc_helper.rb +1 -0
  184. data/lib/active_admin/view_helpers/scope_name_helper.rb +1 -0
  185. data/lib/active_admin/view_helpers/sidebar_helper.rb +1 -0
  186. data/lib/active_admin/view_helpers/title_helper.rb +1 -0
  187. data/lib/active_admin/view_helpers/view_factory_helper.rb +1 -0
  188. data/lib/active_admin/view_helpers.rb +1 -0
  189. data/lib/active_admin/views/action_items.rb +1 -0
  190. data/lib/active_admin/views/components/active_admin_form.rb +2 -5
  191. data/lib/active_admin/views/components/active_filters_sidebar_content.rb +59 -0
  192. data/lib/active_admin/views/components/attributes_table.rb +1 -0
  193. data/lib/active_admin/views/components/blank_slate.rb +1 -0
  194. data/lib/active_admin/views/components/columns.rb +1 -0
  195. data/lib/active_admin/views/components/dropdown_menu.rb +3 -5
  196. data/lib/active_admin/views/components/index_list.rb +1 -0
  197. data/lib/active_admin/views/components/menu.rb +1 -0
  198. data/lib/active_admin/views/components/menu_item.rb +1 -0
  199. data/lib/active_admin/views/components/paginated_collection.rb +1 -0
  200. data/lib/active_admin/views/components/panel.rb +1 -0
  201. data/lib/active_admin/views/components/scopes.rb +1 -0
  202. data/lib/active_admin/views/components/sidebar.rb +1 -0
  203. data/lib/active_admin/views/components/sidebar_section.rb +1 -0
  204. data/lib/active_admin/views/components/site_title.rb +1 -0
  205. data/lib/active_admin/views/components/status_tag.rb +1 -0
  206. data/lib/active_admin/views/components/table_for.rb +1 -0
  207. data/lib/active_admin/views/components/tabs.rb +1 -0
  208. data/lib/active_admin/views/components/unsupported_browser.rb +1 -0
  209. data/lib/active_admin/views/footer.rb +1 -0
  210. data/lib/active_admin/views/header.rb +1 -0
  211. data/lib/active_admin/views/index_as_block.rb +1 -0
  212. data/lib/active_admin/views/index_as_blog.rb +1 -0
  213. data/lib/active_admin/views/index_as_grid.rb +1 -0
  214. data/lib/active_admin/views/index_as_table.rb +2 -5
  215. data/lib/active_admin/views/pages/base.rb +8 -4
  216. data/lib/active_admin/views/pages/form.rb +1 -0
  217. data/lib/active_admin/views/pages/index.rb +2 -1
  218. data/lib/active_admin/views/pages/layout.rb +1 -0
  219. data/lib/active_admin/views/pages/page.rb +1 -0
  220. data/lib/active_admin/views/pages/show.rb +2 -7
  221. data/lib/active_admin/views/tabbed_navigation.rb +1 -0
  222. data/lib/active_admin/views/title_bar.rb +1 -0
  223. data/lib/active_admin/views.rb +1 -0
  224. data/lib/active_admin.rb +6 -3
  225. data/lib/activeadmin.rb +1 -0
  226. data/lib/generators/active_admin/assets/assets_generator.rb +1 -0
  227. data/lib/generators/active_admin/devise/devise_generator.rb +1 -0
  228. data/lib/generators/active_admin/install/install_generator.rb +1 -0
  229. data/lib/generators/active_admin/install/templates/active_admin.rb.erb +18 -1
  230. data/lib/generators/active_admin/install/templates/dashboard.rb +1 -0
  231. data/lib/generators/active_admin/page/page_generator.rb +1 -0
  232. data/lib/generators/active_admin/page/templates/page.rb +1 -0
  233. data/lib/generators/active_admin/resource/resource_generator.rb +1 -0
  234. data/lib/generators/active_admin/webpacker/webpacker_generator.rb +1 -0
  235. metadata +26 -83
  236. data/docs/.gitignore +0 -1
  237. data/docs/0-installation.md +0 -142
  238. data/docs/1-general-configuration.md +0 -224
  239. data/docs/10-custom-pages.md +0 -150
  240. data/docs/11-decorators.md +0 -70
  241. data/docs/12-arbre-components.md +0 -214
  242. data/docs/13-authorization-adapter.md +0 -285
  243. data/docs/14-gotchas.md +0 -138
  244. data/docs/2-resource-customization.md +0 -475
  245. data/docs/3-index-pages/custom-index.md +0 -35
  246. data/docs/3-index-pages/index-as-block.md +0 -19
  247. data/docs/3-index-pages/index-as-blog.md +0 -69
  248. data/docs/3-index-pages/index-as-grid.md +0 -27
  249. data/docs/3-index-pages/index-as-table.md +0 -234
  250. data/docs/3-index-pages.md +0 -328
  251. data/docs/4-csv-format.md +0 -74
  252. data/docs/5-forms.md +0 -237
  253. data/docs/6-show-pages.md +0 -93
  254. data/docs/7-sidebars.md +0 -75
  255. data/docs/8-custom-actions.md +0 -177
  256. data/docs/9-batch-actions.md +0 -237
  257. data/docs/CNAME +0 -1
  258. data/docs/Gemfile +0 -3
  259. data/docs/Gemfile.lock +0 -259
  260. data/docs/README.md +0 -24
  261. data/docs/_config.yml +0 -4
  262. data/docs/_includes/footer.html +0 -8
  263. data/docs/_includes/google-analytics.html +0 -16
  264. data/docs/_includes/head.html +0 -7
  265. data/docs/_includes/toc.html +0 -98
  266. data/docs/_includes/top-menu.html +0 -17
  267. data/docs/_layouts/default.html +0 -21
  268. data/docs/documentation.md +0 -60
  269. data/docs/images/activeadmin.png +0 -0
  270. data/docs/images/code-header.png +0 -0
  271. data/docs/images/divider.png +0 -0
  272. data/docs/images/features.png +0 -0
  273. data/docs/images/tidelift.svg +0 -14
  274. data/docs/index.html +0 -226
  275. data/docs/stylesheets/main.css +0 -1205
  276. data/lib/active_admin/deprecation.rb +0 -10
  277. data/lib/ransack_ext.rb +0 -20
  278. /data/app/assets/stylesheets/active_admin/{print.scss → _print.scss} +0 -0
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  module ActiveAdmin
2
3
  module Filters
3
4
 
@@ -40,7 +41,7 @@ module ActiveAdmin
40
41
 
41
42
  def predicate_name
42
43
  I18n.t(
43
- "active_admin.filters.predicates.#{condition.predicate.name}",
44
+ "ransack.predicates.#{condition.predicate.name}",
44
45
  default: ransack_predicate_name)
45
46
  end
46
47
 
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  require "active_admin/filters/active"
2
3
 
3
4
  module ActiveAdmin
@@ -9,34 +10,7 @@ module ActiveAdmin
9
10
  end
10
11
 
11
12
  def block
12
- -> do
13
- active_filters = ActiveAdmin::Filters::Active.new(active_admin_config, assigns[:search])
14
- span do
15
- if current_scope
16
- h4 I18n.t("active_admin.search_status.current_scope"), style: "display: inline"
17
- b scope_name(current_scope), class: "current_scope_name", style: "display: inline"
18
- end
19
- div style: "margin-top: 10px" do
20
- h4 I18n.t("active_admin.search_status.current_filters"), style: "margin-bottom: 10px"
21
- ul do
22
- if active_filters.filters.blank?
23
- li I18n.t("active_admin.search_status.no_current_filters")
24
- else
25
- active_filters.filters.each do |filter|
26
- li filter.html_options do
27
- span do
28
- text_node filter.label
29
- end
30
- b do
31
- text_node to_sentence(filter.values.map { |v| pretty_format(v) })
32
- end
33
- end
34
- end
35
- end
36
- end
37
- end
38
- end
39
- end
13
+ -> { active_filters_sidebar_content }
40
14
  end
41
15
 
42
16
  def title
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  module ActiveAdmin
2
3
  module Filters
3
4
  module DSL
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  module ActiveAdmin
2
3
  module Filters
3
4
  # This form builder defines methods to build filter forms such
@@ -20,7 +21,7 @@ module ActiveAdmin
20
21
  # Returns the default filter type for a given attribute. If you want
21
22
  # to use a custom search method, you have to specify the type yourself.
22
23
  def default_input_type(method, options = {})
23
- if method =~ /_(eq|equals|cont|contains|start|starts_with|end|ends_with)\z/
24
+ if method =~ /_(eq|cont|start|end)\z/
24
25
  :string
25
26
  elsif klass._ransackers.key?(method.to_s)
26
27
  klass._ransackers[method.to_s].type
@@ -30,7 +31,7 @@ module ActiveAdmin
30
31
  case column.type
31
32
  when :date, :datetime
32
33
  :date_range
33
- when :string, :text
34
+ when :string, :text, :citext
34
35
  :string
35
36
  when :integer, :float, :decimal
36
37
  :numeric
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  module ActiveAdmin
2
3
  module Filters
3
4
  module FormtasticAddons
@@ -46,7 +47,7 @@ module ActiveAdmin
46
47
  #
47
48
 
48
49
  def searchable_has_many_through?
49
- if reflection && reflection.options[:through]
50
+ if klass.ransackable_associations.include?(method.to_s) && reflection && reflection.options[:through]
50
51
  reflection.through_reflection.klass.ransackable_attributes.include? reflection.foreign_key
51
52
  else
52
53
  false
@@ -1,9 +1,10 @@
1
+ # frozen_string_literal: true
1
2
  module ActiveAdmin
2
3
  module Filters
3
4
 
4
5
  class Disabled < RuntimeError
5
- def initialize
6
- super "Can't remove a filter when filters are disabled. Enable filters with 'config.filters = true'"
6
+ def initialize(action)
7
+ super "Cannot #{action} a filter when filters are disabled. Enable filters with 'config.filters = true'"
7
8
  end
8
9
  end
9
10
 
@@ -60,7 +61,7 @@ module ActiveAdmin
60
61
  #
61
62
  # @param [Symbol] attributes The attributes to not filter on
62
63
  def remove_filter(*attributes)
63
- raise Disabled unless filters_enabled?
64
+ raise Disabled, "remove" unless filters_enabled?
64
65
 
65
66
  attributes.each { |attribute| (@filters_to_remove ||= []) << attribute.to_sym }
66
67
  end
@@ -72,7 +73,7 @@ module ActiveAdmin
72
73
  # @param [Hash] options The set of options that are passed through to
73
74
  # ransack for the field definition.
74
75
  def add_filter(attribute, options = {})
75
- raise Disabled unless filters_enabled?
76
+ raise Disabled, "add" unless filters_enabled?
76
77
 
77
78
  (@filters ||= {})[attribute.to_sym] = options
78
79
  end
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  require "active_admin/filters/dsl"
2
3
  require "active_admin/filters/resource_extension"
3
4
  require "active_admin/filters/formtastic_addons"
@@ -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
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  module ActiveAdmin
2
3
  module Generators
3
4
  class Boilerplate
@@ -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
@@ -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,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  module ActiveAdmin
2
3
  module Inputs
3
4
  class DatepickerInput < ::Formtastic::Inputs::StringInput
@@ -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
  #
@@ -8,7 +9,7 @@
8
9
  # include Base
9
10
  # include Base::SearchMethodSelect
10
11
  #
11
- # filter :equals, :greater_than, :less_than
12
+ # filter :eq, :gt, :lt
12
13
  # end
13
14
  #
14
15
  module ActiveAdmin
@@ -64,7 +65,7 @@ module ActiveAdmin
64
65
 
65
66
  def filter_options
66
67
  filters.collect do |filter|
67
- [I18n.t("active_admin.filters.predicates.#{filter}"), "#{method}_#{filter}"]
68
+ [I18n.t("ransack.predicates.#{filter}").capitalize, "#{method}_#{filter}"]
68
69
  end
69
70
  end
70
71
 
@@ -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
  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
  module Filters
@@ -14,12 +15,12 @@ module ActiveAdmin
14
15
  end
15
16
 
16
17
  def gt_input_name
17
- column && column.type == :date ? "#{method}_gteq" : "#{method}_gteq_datetime"
18
+ "#{method}_gteq"
18
19
  end
19
20
  alias :input_name :gt_input_name
20
21
 
21
22
  def lt_input_name
22
- column && column.type == :date ? "#{method}_lteq" : "#{method}_lteq_datetime"
23
+ "#{method}_lteq"
23
24
  end
24
25
 
25
26
  def input_html_options
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  module ActiveAdmin
2
3
  module Inputs
3
4
  module Filters
@@ -5,7 +6,7 @@ module ActiveAdmin
5
6
  include Base
6
7
  include Base::SearchMethodSelect
7
8
 
8
- filter :equals, :greater_than, :less_than
9
+ filter :eq, :gt, :lt
9
10
  end
10
11
  end
11
12
  end
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  module ActiveAdmin
2
3
  module Inputs
3
4
  module Filters
@@ -42,6 +43,8 @@ module ActiveAdmin
42
43
  else
43
44
  super
44
45
  end
46
+ rescue ActiveRecord::QueryCanceled => error
47
+ raise ActiveRecord::QueryCanceled.new "#{error.message.strip} while querying the values for the ActiveAdmin :#{method} filter"
45
48
  end
46
49
 
47
50
  def pluck_column
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  module ActiveAdmin
2
3
  module Inputs
3
4
  module Filters
@@ -5,7 +6,7 @@ module ActiveAdmin
5
6
  include Base
6
7
  include Base::SearchMethodSelect
7
8
 
8
- filter :contains, :equals, :starts_with, :ends_with
9
+ filter :cont, :eq, :start, :end
9
10
 
10
11
  # If the filter method includes a search condition, build a normal string search field.
11
12
  # Else, build a search field with a companion dropdown to choose a search condition from.
@@ -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
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  require "active_admin/localizers/resource_localizer"
2
3
 
3
4
  module ActiveAdmin
@@ -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,6 +48,7 @@ module ActiveAdmin
47
48
  # menu.add parent: 'Dashboard', label: 'My Child Dashboard'
48
49
  #
49
50
  def add(options)
51
+ options = options.dup # Make sure parameter is not modified
50
52
  parent_chain = Array.wrap(options.delete(:parent))
51
53
 
52
54
  item = if parent = parent_chain.shift
@@ -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
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  require "active_admin/resource_collection"
2
3
 
3
4
  module ActiveAdmin
@@ -27,7 +28,7 @@ module ActiveAdmin
27
28
  class Namespace
28
29
  class << self
29
30
  def setting(name, default)
30
- Deprecation.warn "This method does not do anything and will be removed."
31
+ ActiveAdmin.deprecator.warn "This method does not do anything and will be removed."
31
32
  end
32
33
  end
33
34
 
@@ -59,7 +60,7 @@ module ActiveAdmin
59
60
  settings.respond_to?(method) ? settings.send(method, *args) : super
60
61
  end
61
62
 
62
- # Register a resource into this namespace. The preffered method to access this is to
63
+ # Register a resource into this namespace. The preferred method to access this is to
63
64
  # use the global registration ActiveAdmin.register which delegates to the proper
64
65
  # namespace instance.
65
66
  def register(resource_class, options = {}, &block)
@@ -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, { active_admin_resource: config }
75
76
 
76
77
  # Return the config
77
78
  config
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  require "active_admin/dynamic_settings_node"
2
3
 
3
4
  module ActiveAdmin
@@ -118,7 +119,7 @@ module ActiveAdmin
118
119
  :title,
119
120
  :email,
120
121
  ]
121
- register :filter_method_for_large_association, "_starts_with"
122
+ register :filter_method_for_large_association, "_start"
122
123
 
123
124
  # Switch between asset pipeline and webpacker assets
124
125
  register :use_webpacker, false
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  module ActiveAdmin
2
3
  class OrderClause
3
4
  attr_reader :field, :order, :active_admin_config
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  module ActiveAdmin
2
3
  class Comment < ActiveRecord::Base
3
4
 
@@ -27,5 +28,13 @@ module ActiveAdmin
27
28
  self.resource_type = self.class.resource_type(resource)
28
29
  end
29
30
 
31
+ def self.ransackable_attributes(auth_object = nil)
32
+ authorizable_ransackable_attributes
33
+ end
34
+
35
+ def self.ransackable_associations(auth_object = nil)
36
+ authorizable_ransackable_associations
37
+ end
38
+
30
39
  end
31
40
  end
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  module ActiveAdmin
2
3
  module Comments
3
4
 
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  module ActiveAdmin
2
3
  module Comments
3
4
 
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  module ActiveAdmin
2
3
  module Comments
3
4
 
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  require "active_admin/views"
2
3
  require "active_admin/views/components/panel"
3
4
 
@@ -35,7 +36,7 @@ module ActiveAdmin
35
36
 
36
37
  text_node paginate @comments
37
38
 
38
- if authorized?(ActiveAdmin::Auth::CREATE, ActiveAdmin::Comment)
39
+ if authorized?(ActiveAdmin::Auth::NEW, ActiveAdmin::Comment)
39
40
  build_comment_form
40
41
  end
41
42
  end
@@ -1,2 +1,3 @@
1
+ # frozen_string_literal: true
1
2
  require "active_admin/views"
2
3
  require "active_admin/orm/active_record/comments/views/active_admin_comments"
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  require "active_admin/orm/active_record/comments/views"
2
3
  require "active_admin/orm/active_record/comments/show_page_helper"
3
4
  require "active_admin/orm/active_record/comments/namespace_helper"
@@ -71,15 +72,15 @@ ActiveAdmin.after_load do |app|
71
72
  redirect_back fallback_location: active_admin_root
72
73
  end
73
74
  end
75
+ end
74
76
 
75
- def destroy
76
- destroy! do |success, failure|
77
- success.html do
78
- redirect_back fallback_location: active_admin_root
79
- end
80
- failure.html do
81
- redirect_back fallback_location: active_admin_root
82
- end
77
+ def destroy
78
+ destroy! do |success, failure|
79
+ success.html do
80
+ redirect_back fallback_location: active_admin_root
81
+ end
82
+ failure.html do
83
+ redirect_back fallback_location: active_admin_root
83
84
  end
84
85
  end
85
86
  end
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  # ActiveRecord-specific plugins should be required here
2
3
 
3
4
  ActiveAdmin::DatabaseHitDuringLoad.database_error_classes << ActiveRecord::StatementInvalid
@@ -1 +1,2 @@
1
+ # frozen_string_literal: true
1
2
  # Mongoid-specific plugins should be required here
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  module ActiveAdmin
2
3
  # Page is the primary data storage for page configuration in Active Admin
3
4
  #
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  module ActiveAdmin
2
3
 
3
4
  # All Pages controllers inherit from this controller.
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  module ActiveAdmin
2
3
  # This is the class where all the register_page blocks are evaluated.
3
4
  class PageDSL < DSL
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  module ActiveAdmin
2
3
 
3
4
  # A simple object that gets used to present different aspects of views
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  ActiveAdmin::Dependency.pundit!
2
3
 
3
4
  require "pundit"
@@ -30,24 +31,19 @@ module ActiveAdmin
30
31
  end
31
32
 
32
33
  def retrieve_policy(subject)
33
- case subject
34
- when nil then Pundit.policy!(user, namespace(resource))
35
- when Class then Pundit.policy!(user, namespace(subject.new))
36
- else Pundit.policy!(user, namespace(subject))
37
- end
38
- rescue Pundit::NotDefinedError => e
39
- if default_policy_class
40
- default_policy(user, subject)
34
+ target = policy_target(subject)
35
+ if (policy = policy(namespace(target)) || compat_policy(subject))
36
+ policy
37
+ elsif default_policy_class
38
+ default_policy(subject)
41
39
  else
42
- raise e
40
+ raise Pundit::NotDefinedError, "unable to find a compatible policy for `#{target}`"
43
41
  end
44
42
  end
45
43
 
46
44
  def format_action(action, subject)
47
45
  # https://github.com/varvet/pundit/blob/master/lib/generators/pundit/install/templates/application_policy.rb
48
46
  case action
49
- when Auth::CREATE then :create?
50
- when Auth::UPDATE then :update?
51
47
  when Auth::READ then subject.is_a?(Class) ? :index? : :show?
52
48
  when Auth::DESTROY then subject.is_a?(Class) ? :destroy_all? : :destroy?
53
49
  else "#{action}?"
@@ -56,8 +52,42 @@ module ActiveAdmin
56
52
 
57
53
  private
58
54
 
55
+ def policy_target(subject)
56
+ case subject
57
+ when nil then resource
58
+ when Class then subject.new
59
+ else subject
60
+ end
61
+ end
62
+
63
+ # This method is needed to fallback to our previous policy searching logic.
64
+ # I.e.: when class name contains `default_policy_namespace` (eg: ShopAdmin)
65
+ # we should try to search it without namespace. This is because that's
66
+ # the only thing that worked in this case before we fixed our buggy namespace
67
+ # detection, so people are probably relying on it.
68
+ # This fallback might be removed in future versions of ActiveAdmin, so
69
+ # pundit_adapter search will work consistently with provided namespaces
70
+ def compat_policy(subject)
71
+ return unless default_policy_namespace
72
+
73
+ target = policy_target(subject)
74
+
75
+ return unless target.class.to_s.include?(default_policy_module) &&
76
+ (policy = policy(target))
77
+
78
+ policy_name = policy.class.to_s
79
+
80
+ ActiveAdmin.deprecator.warn "You have `pundit_policy_namespace` configured as `#{default_policy_namespace}`, " \
81
+ "but ActiveAdmin was unable to find policy #{default_policy_module}::#{policy_name}. " \
82
+ "#{policy_name} will be used instead. " \
83
+ "This behavior will be removed in future versions of ActiveAdmin. " \
84
+ "To fix this warning, move your #{policy_name} policy to the #{default_policy_module} namespace"
85
+
86
+ policy
87
+ end
88
+
59
89
  def namespace(object)
60
- if default_policy_namespace && !object.class.to_s.include?(default_policy_namespace.to_s.camelize)
90
+ if default_policy_namespace && !object.class.to_s.start_with?("#{default_policy_module}::")
61
91
  [default_policy_namespace.to_sym, object]
62
92
  else
63
93
  object
@@ -68,7 +98,7 @@ module ActiveAdmin
68
98
  ActiveAdmin.application.pundit_default_policy && ActiveAdmin.application.pundit_default_policy.constantize
69
99
  end
70
100
 
71
- def default_policy(user, subject)
101
+ def default_policy(subject)
72
102
  default_policy_class.new(user, subject)
73
103
  end
74
104
 
@@ -76,6 +106,18 @@ module ActiveAdmin
76
106
  ActiveAdmin.application.pundit_policy_namespace
77
107
  end
78
108
 
109
+ def default_policy_module
110
+ default_policy_namespace.to_s.camelize
111
+ end
112
+
113
+ def policy(target)
114
+ policies[target] ||= Pundit.policy(user, target)
115
+ end
116
+
117
+ def policies
118
+ @policies ||= {}
119
+ end
120
+
79
121
  end
80
122
 
81
123
  end