activeadmin 2.9.0 → 2.13.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 (199) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +161 -1
  3. data/CONTRIBUTING.md +1 -1
  4. data/app/assets/javascripts/active_admin/base.js +13 -6
  5. data/app/assets/stylesheets/active_admin/_base.scss +53 -37
  6. data/app/assets/stylesheets/active_admin/_forms.scss +0 -10
  7. data/app/assets/stylesheets/active_admin/_normalize.scss +25 -123
  8. data/app/assets/stylesheets/active_admin/{print.scss → _print.scss} +0 -0
  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/_title_bar.scss +0 -1
  13. data/app/javascript/active_admin/initializers/has-many.js +4 -1
  14. data/app/views/active_admin/devise/shared/_links.erb +1 -1
  15. data/app/views/active_admin/page/index.html.arb +1 -0
  16. data/app/views/active_admin/resource/edit.html.arb +1 -0
  17. data/app/views/active_admin/resource/index.html.arb +1 -0
  18. data/app/views/active_admin/resource/new.html.arb +1 -0
  19. data/app/views/active_admin/resource/show.html.arb +1 -0
  20. data/app/views/layouts/active_admin.html.arb +1 -0
  21. data/config/locales/ko.yml +1 -1
  22. data/config/locales/nl.yml +1 -1
  23. data/config/locales/ro.yml +3 -2
  24. data/docs/0-installation.md +2 -2
  25. data/docs/5-forms.md +3 -2
  26. data/docs/8-custom-actions.md +1 -1
  27. data/docs/Gemfile +1 -0
  28. data/docs/Gemfile.lock +116 -92
  29. data/lib/active_admin/abstract_view_factory.rb +1 -0
  30. data/lib/active_admin/application.rb +9 -9
  31. data/lib/active_admin/application_settings.rb +1 -0
  32. data/lib/active_admin/asset_registration.rb +1 -0
  33. data/lib/active_admin/authorization_adapter.rb +1 -0
  34. data/lib/active_admin/base_controller/authorization.rb +2 -1
  35. data/lib/active_admin/base_controller/menu.rb +1 -0
  36. data/lib/active_admin/base_controller.rb +2 -1
  37. data/lib/active_admin/batch_actions/controller.rb +1 -0
  38. data/lib/active_admin/batch_actions/resource_extension.rb +1 -0
  39. data/lib/active_admin/batch_actions/views/batch_action_form.rb +1 -0
  40. data/lib/active_admin/batch_actions/views/batch_action_selector.rb +1 -0
  41. data/lib/active_admin/batch_actions/views/selection_cells.rb +1 -0
  42. data/lib/active_admin/batch_actions.rb +1 -0
  43. data/lib/active_admin/callbacks.rb +1 -0
  44. data/lib/active_admin/cancan_adapter.rb +1 -0
  45. data/lib/active_admin/collection_decorator.rb +1 -0
  46. data/lib/active_admin/component.rb +1 -0
  47. data/lib/active_admin/controller_action.rb +1 -0
  48. data/lib/active_admin/csv_builder.rb +5 -18
  49. data/lib/active_admin/dependency.rb +2 -1
  50. data/lib/active_admin/deprecation.rb +1 -0
  51. data/lib/active_admin/devise.rb +11 -0
  52. data/lib/active_admin/dsl.rb +1 -0
  53. data/lib/active_admin/dynamic_setting.rb +1 -0
  54. data/lib/active_admin/dynamic_settings_node.rb +1 -0
  55. data/lib/active_admin/engine.rb +3 -1
  56. data/lib/active_admin/error.rb +1 -0
  57. data/lib/active_admin/filters/active.rb +1 -0
  58. data/lib/active_admin/filters/active_filter.rb +1 -0
  59. data/lib/active_admin/filters/active_sidebar.rb +2 -28
  60. data/lib/active_admin/filters/dsl.rb +1 -0
  61. data/lib/active_admin/filters/forms.rb +1 -0
  62. data/lib/active_admin/filters/formtastic_addons.rb +1 -0
  63. data/lib/active_admin/filters/resource_extension.rb +1 -0
  64. data/lib/active_admin/filters.rb +1 -0
  65. data/lib/active_admin/form_builder.rb +1 -0
  66. data/lib/active_admin/generators/boilerplate.rb +1 -0
  67. data/lib/active_admin/helpers/collection.rb +2 -0
  68. data/lib/active_admin/helpers/i18n.rb +1 -0
  69. data/lib/active_admin/helpers/optional_display.rb +1 -0
  70. data/lib/active_admin/helpers/routes/url_helpers.rb +1 -0
  71. data/lib/active_admin/helpers/scope_chain.rb +1 -0
  72. data/lib/active_admin/inputs/datepicker_input.rb +1 -0
  73. data/lib/active_admin/inputs/filters/base/search_method_select.rb +1 -0
  74. data/lib/active_admin/inputs/filters/base.rb +1 -0
  75. data/lib/active_admin/inputs/filters/boolean_input.rb +1 -0
  76. data/lib/active_admin/inputs/filters/check_boxes_input.rb +1 -0
  77. data/lib/active_admin/inputs/filters/date_picker_input.rb +1 -0
  78. data/lib/active_admin/inputs/filters/date_range_input.rb +1 -0
  79. data/lib/active_admin/inputs/filters/numeric_input.rb +1 -0
  80. data/lib/active_admin/inputs/filters/select_input.rb +1 -0
  81. data/lib/active_admin/inputs/filters/string_input.rb +1 -0
  82. data/lib/active_admin/inputs/filters/text_input.rb +1 -0
  83. data/lib/active_admin/inputs.rb +1 -0
  84. data/lib/active_admin/localizers/resource_localizer.rb +1 -0
  85. data/lib/active_admin/localizers.rb +1 -0
  86. data/lib/active_admin/menu.rb +1 -0
  87. data/lib/active_admin/menu_collection.rb +1 -0
  88. data/lib/active_admin/menu_item.rb +1 -0
  89. data/lib/active_admin/namespace.rb +2 -1
  90. data/lib/active_admin/namespace_settings.rb +1 -0
  91. data/lib/active_admin/order_clause.rb +1 -0
  92. data/lib/active_admin/orm/active_record/comments/comment.rb +1 -0
  93. data/lib/active_admin/orm/active_record/comments/namespace_helper.rb +1 -0
  94. data/lib/active_admin/orm/active_record/comments/resource_helper.rb +1 -0
  95. data/lib/active_admin/orm/active_record/comments/show_page_helper.rb +1 -0
  96. data/lib/active_admin/orm/active_record/comments/views/active_admin_comments.rb +1 -0
  97. data/lib/active_admin/orm/active_record/comments/views.rb +1 -0
  98. data/lib/active_admin/orm/active_record/comments.rb +1 -0
  99. data/lib/active_admin/orm/active_record.rb +1 -0
  100. data/lib/active_admin/orm/mongoid.rb +1 -0
  101. data/lib/active_admin/page.rb +1 -0
  102. data/lib/active_admin/page_controller.rb +1 -0
  103. data/lib/active_admin/page_dsl.rb +1 -0
  104. data/lib/active_admin/page_presenter.rb +1 -0
  105. data/lib/active_admin/pundit_adapter.rb +55 -11
  106. data/lib/active_admin/resource/action_items.rb +1 -0
  107. data/lib/active_admin/resource/attributes.rb +1 -0
  108. data/lib/active_admin/resource/belongs_to.rb +1 -0
  109. data/lib/active_admin/resource/controllers.rb +1 -0
  110. data/lib/active_admin/resource/includes.rb +1 -0
  111. data/lib/active_admin/resource/menu.rb +1 -0
  112. data/lib/active_admin/resource/model.rb +1 -0
  113. data/lib/active_admin/resource/naming.rb +1 -0
  114. data/lib/active_admin/resource/ordering.rb +1 -0
  115. data/lib/active_admin/resource/page_presenters.rb +1 -0
  116. data/lib/active_admin/resource/pagination.rb +1 -0
  117. data/lib/active_admin/resource/routes.rb +1 -0
  118. data/lib/active_admin/resource/scope_to.rb +1 -0
  119. data/lib/active_admin/resource/scopes.rb +1 -0
  120. data/lib/active_admin/resource/sidebars.rb +1 -0
  121. data/lib/active_admin/resource.rb +3 -2
  122. data/lib/active_admin/resource_collection.rb +1 -0
  123. data/lib/active_admin/resource_controller/action_builder.rb +1 -0
  124. data/lib/active_admin/resource_controller/data_access.rb +30 -4
  125. data/lib/active_admin/resource_controller/decorators.rb +1 -0
  126. data/lib/active_admin/resource_controller/polymorphic_routes.rb +1 -0
  127. data/lib/active_admin/resource_controller/resource_class_methods.rb +1 -0
  128. data/lib/active_admin/resource_controller/scoping.rb +1 -0
  129. data/lib/active_admin/resource_controller/sidebars.rb +1 -0
  130. data/lib/active_admin/resource_controller/streaming.rb +3 -2
  131. data/lib/active_admin/resource_controller.rb +1 -0
  132. data/lib/active_admin/resource_dsl.rb +7 -21
  133. data/lib/active_admin/router.rb +1 -0
  134. data/lib/active_admin/scope.rb +1 -0
  135. data/lib/active_admin/settings_node.rb +1 -0
  136. data/lib/active_admin/sidebar_section.rb +1 -0
  137. data/lib/active_admin/version.rb +2 -1
  138. data/lib/active_admin/view_factory.rb +1 -0
  139. data/lib/active_admin/view_helpers/active_admin_application_helper.rb +1 -0
  140. data/lib/active_admin/view_helpers/auto_link_helper.rb +1 -0
  141. data/lib/active_admin/view_helpers/breadcrumb_helper.rb +1 -0
  142. data/lib/active_admin/view_helpers/display_helper.rb +11 -3
  143. data/lib/active_admin/view_helpers/download_format_links_helper.rb +1 -0
  144. data/lib/active_admin/view_helpers/fields_for.rb +1 -0
  145. data/lib/active_admin/view_helpers/flash_helper.rb +1 -0
  146. data/lib/active_admin/view_helpers/form_helper.rb +1 -0
  147. data/lib/active_admin/view_helpers/method_or_proc_helper.rb +1 -0
  148. data/lib/active_admin/view_helpers/scope_name_helper.rb +1 -0
  149. data/lib/active_admin/view_helpers/sidebar_helper.rb +1 -0
  150. data/lib/active_admin/view_helpers/title_helper.rb +1 -0
  151. data/lib/active_admin/view_helpers/view_factory_helper.rb +1 -0
  152. data/lib/active_admin/view_helpers.rb +1 -0
  153. data/lib/active_admin/views/action_items.rb +1 -0
  154. data/lib/active_admin/views/components/active_admin_form.rb +2 -1
  155. data/lib/active_admin/views/components/active_filters_sidebar_content.rb +59 -0
  156. data/lib/active_admin/views/components/attributes_table.rb +1 -0
  157. data/lib/active_admin/views/components/blank_slate.rb +1 -0
  158. data/lib/active_admin/views/components/columns.rb +1 -0
  159. data/lib/active_admin/views/components/dropdown_menu.rb +3 -5
  160. data/lib/active_admin/views/components/index_list.rb +1 -0
  161. data/lib/active_admin/views/components/menu.rb +1 -0
  162. data/lib/active_admin/views/components/menu_item.rb +1 -0
  163. data/lib/active_admin/views/components/paginated_collection.rb +1 -0
  164. data/lib/active_admin/views/components/panel.rb +1 -0
  165. data/lib/active_admin/views/components/scopes.rb +1 -0
  166. data/lib/active_admin/views/components/sidebar.rb +1 -0
  167. data/lib/active_admin/views/components/sidebar_section.rb +1 -0
  168. data/lib/active_admin/views/components/site_title.rb +1 -0
  169. data/lib/active_admin/views/components/status_tag.rb +1 -0
  170. data/lib/active_admin/views/components/table_for.rb +1 -0
  171. data/lib/active_admin/views/components/tabs.rb +1 -0
  172. data/lib/active_admin/views/components/unsupported_browser.rb +1 -0
  173. data/lib/active_admin/views/footer.rb +1 -0
  174. data/lib/active_admin/views/header.rb +1 -0
  175. data/lib/active_admin/views/index_as_block.rb +1 -0
  176. data/lib/active_admin/views/index_as_blog.rb +1 -0
  177. data/lib/active_admin/views/index_as_grid.rb +1 -0
  178. data/lib/active_admin/views/index_as_table.rb +1 -0
  179. data/lib/active_admin/views/pages/base.rb +4 -1
  180. data/lib/active_admin/views/pages/form.rb +1 -0
  181. data/lib/active_admin/views/pages/index.rb +1 -0
  182. data/lib/active_admin/views/pages/layout.rb +1 -0
  183. data/lib/active_admin/views/pages/page.rb +1 -0
  184. data/lib/active_admin/views/pages/show.rb +1 -0
  185. data/lib/active_admin/views/tabbed_navigation.rb +1 -0
  186. data/lib/active_admin/views/title_bar.rb +1 -0
  187. data/lib/active_admin/views.rb +1 -0
  188. data/lib/active_admin.rb +2 -1
  189. data/lib/activeadmin.rb +1 -0
  190. data/lib/generators/active_admin/assets/assets_generator.rb +1 -0
  191. data/lib/generators/active_admin/devise/devise_generator.rb +1 -0
  192. data/lib/generators/active_admin/install/install_generator.rb +1 -0
  193. data/lib/generators/active_admin/install/templates/dashboard.rb +1 -0
  194. data/lib/generators/active_admin/page/page_generator.rb +1 -0
  195. data/lib/generators/active_admin/page/templates/page.rb +1 -0
  196. data/lib/generators/active_admin/resource/resource_generator.rb +1 -0
  197. data/lib/generators/active_admin/webpacker/webpacker_generator.rb +1 -0
  198. data/lib/ransack_ext.rb +1 -0
  199. metadata +19 -18
@@ -1,6 +1,8 @@
1
+ # frozen_string_literal: true
1
2
  module ActiveAdmin
2
3
  class Engine < ::Rails::Engine
3
- initializer "active_admin.load_app_path" do |app|
4
+ # Set default values for app_path and load_paths before running initializers
5
+ initializer "active_admin.load_app_path", before: :load_config_initializers do |app|
4
6
  ActiveAdmin::Application.setting :app_path, app.root
5
7
  ActiveAdmin::Application.setting :load_paths, [File.expand_path("app/admin", app.root)]
6
8
  end
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  module ActiveAdmin
2
3
  # Exception class to raise when there is an authorized access
3
4
  # exception thrown. The exception has a few goodies that may
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  require "active_admin/filters/active_filter"
2
3
 
3
4
  module ActiveAdmin
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  module ActiveAdmin
2
3
  module Filters
3
4
 
@@ -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
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  module ActiveAdmin
2
3
  module Filters
3
4
  module FormtasticAddons
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  module ActiveAdmin
2
3
  module Filters
3
4
 
@@ -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
  #
@@ -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
@@ -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
  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
@@ -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
@@ -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
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  require "active_admin/dynamic_settings_node"
2
3
 
3
4
  module ActiveAdmin
@@ -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
 
@@ -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
 
@@ -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"
@@ -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,16 +31,13 @@ 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
 
@@ -56,8 +54,42 @@ module ActiveAdmin
56
54
 
57
55
  private
58
56
 
57
+ def policy_target(subject)
58
+ case subject
59
+ when nil then resource
60
+ when Class then subject.new
61
+ else subject
62
+ end
63
+ end
64
+
65
+ # This method is needed to fallback to our previous policy searching logic.
66
+ # I.e.: when class name contains `default_policy_namespace` (eg: ShopAdmin)
67
+ # we should try to search it without namespace. This is because that's
68
+ # the only thing that worked in this case before we fixed our buggy namespace
69
+ # detection, so people are probably relying on it.
70
+ # This fallback might be removed in future versions of ActiveAdmin, so
71
+ # pundit_adapter search will work consistently with provided namespaces
72
+ def compat_policy(subject)
73
+ return unless default_policy_namespace
74
+
75
+ target = policy_target(subject)
76
+
77
+ return unless target.class.to_s.include?(default_policy_module) &&
78
+ (policy = policy(target))
79
+
80
+ policy_name = policy.class.to_s
81
+
82
+ Deprecation.warn "You have `pundit_policy_namespace` configured as `#{default_policy_namespace}`, " \
83
+ "but ActiveAdmin was unable to find policy #{default_policy_module}::#{policy_name}. " \
84
+ "#{policy_name} will be used instead. " \
85
+ "This behavior will be removed in future versions of ActiveAdmin. " \
86
+ "To fix this warning, move your #{policy_name} policy to the #{default_policy_module} namespace"
87
+
88
+ policy
89
+ end
90
+
59
91
  def namespace(object)
60
- if default_policy_namespace && !object.class.to_s.include?(default_policy_namespace.to_s.camelize)
92
+ if default_policy_namespace && !object.class.to_s.start_with?("#{default_policy_module}::")
61
93
  [default_policy_namespace.to_sym, object]
62
94
  else
63
95
  object
@@ -68,7 +100,7 @@ module ActiveAdmin
68
100
  ActiveAdmin.application.pundit_default_policy && ActiveAdmin.application.pundit_default_policy.constantize
69
101
  end
70
102
 
71
- def default_policy(user, subject)
103
+ def default_policy(subject)
72
104
  default_policy_class.new(user, subject)
73
105
  end
74
106
 
@@ -76,6 +108,18 @@ module ActiveAdmin
76
108
  ActiveAdmin.application.pundit_policy_namespace
77
109
  end
78
110
 
111
+ def default_policy_module
112
+ default_policy_namespace.to_s.camelize
113
+ end
114
+
115
+ def policy(target)
116
+ policies[target] ||= Pundit.policy(user, target)
117
+ end
118
+
119
+ def policies
120
+ @policies ||= {}
121
+ end
122
+
79
123
  end
80
124
 
81
125
  end
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  require "active_admin/helpers/optional_display"
2
3
 
3
4
  module ActiveAdmin
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  module ActiveAdmin
2
3
 
3
4
  class Resource
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  require "active_admin/resource"
2
3
 
3
4
  module ActiveAdmin
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  module ActiveAdmin
2
3
  class Resource
3
4
  module Controllers
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  module ActiveAdmin
2
3
  class Resource
3
4
  module Includes
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  module ActiveAdmin
2
3
  class Resource
3
4
 
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  module ActiveAdmin
2
3
  class Model
3
4
  def initialize(resource, record)
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  module ActiveAdmin
2
3
  class Resource
3
4
 
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  module ActiveAdmin
2
3
  class Resource
3
4
  module Ordering
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  module ActiveAdmin
2
3
  class Resource
3
4
  module PagePresenters
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  module ActiveAdmin
2
3
 
3
4
  class Resource
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  module ActiveAdmin
2
3
  class Resource
3
4
  module Routes
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  module ActiveAdmin
2
3
  class Resource
3
4
  module ScopeTo
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  module ActiveAdmin
2
3
  class Resource
3
4
  module Scopes
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  require "active_admin/helpers/optional_display"
2
3
 
3
4
  module ActiveAdmin
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  require "active_admin/resource/action_items"
2
3
  require "active_admin/resource/attributes"
3
4
  require "active_admin/resource/controllers"
@@ -98,11 +99,11 @@ module ActiveAdmin
98
99
  # The class this resource wraps. If you register the Post model, Resource#resource_class
99
100
  # will point to the Post class
100
101
  def resource_class
101
- ActiveSupport::Dependencies.constantize(resource_class_name)
102
+ resource_class_name.constantize
102
103
  end
103
104
 
104
105
  def decorator_class
105
- ActiveSupport::Dependencies.constantize(decorator_class_name) if decorator_class_name
106
+ decorator_class_name&.constantize
106
107
  end
107
108
 
108
109
  def resource_name_extension
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  module ActiveAdmin
2
3
  # This is a container for resources, which acts much like a Hash.
3
4
  # It's assumed that an added resource responds to `resource_name`.
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  module ActiveAdmin
2
3
  class ResourceController < BaseController
3
4