activeadmin 1.4.2 → 2.3.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 (226) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +306 -144
  3. data/CONTRIBUTING.md +21 -16
  4. data/README.md +44 -11
  5. data/app/assets/javascripts/active_admin/base.es6 +23 -0
  6. data/app/assets/javascripts/active_admin/ext/jquery-ui.es6 +7 -0
  7. data/app/assets/javascripts/active_admin/ext/jquery.es6 +9 -0
  8. data/app/assets/javascripts/active_admin/initializers/datepicker.es6 +16 -0
  9. data/app/assets/javascripts/active_admin/initializers/filters.es6 +45 -0
  10. data/app/assets/javascripts/active_admin/initializers/tabs.es6 +6 -0
  11. data/app/assets/javascripts/active_admin/lib/active_admin.es6 +41 -0
  12. data/app/assets/javascripts/active_admin/lib/batch_actions.es6 +59 -0
  13. data/app/assets/javascripts/active_admin/lib/checkbox-toggler.es6 +49 -0
  14. data/app/assets/javascripts/active_admin/lib/dropdown-menu.es6 +123 -0
  15. data/app/assets/javascripts/active_admin/lib/has_many.es6 +95 -0
  16. data/app/assets/javascripts/active_admin/lib/modal_dialog.es6 +61 -0
  17. data/app/assets/javascripts/active_admin/lib/per_page.es6 +47 -0
  18. data/app/assets/javascripts/active_admin/lib/table-checkbox-toggler.es6 +36 -0
  19. data/app/assets/stylesheets/active_admin/_forms.scss +2 -14
  20. data/app/assets/stylesheets/active_admin/components/_status_tags.scss +0 -5
  21. data/app/assets/stylesheets/active_admin/components/_tabs.scss +1 -1
  22. data/app/assets/stylesheets/active_admin/mixins/_gradients.scss +1 -1
  23. data/app/views/active_admin/devise/confirmations/new.html.erb +1 -1
  24. data/app/views/active_admin/devise/passwords/edit.html.erb +1 -1
  25. data/app/views/active_admin/devise/passwords/new.html.erb +1 -1
  26. data/app/views/active_admin/devise/registrations/new.html.erb +1 -2
  27. data/app/views/active_admin/devise/shared/_error_messages.html.erb +15 -0
  28. data/app/views/active_admin/devise/unlocks/new.html.erb +1 -1
  29. data/app/views/kaminari/active_admin_countless/_first_page.html.erb +11 -0
  30. data/app/views/kaminari/active_admin_countless/_gap.html.erb +8 -0
  31. data/app/views/kaminari/active_admin_countless/_next_page.html.erb +11 -0
  32. data/app/views/kaminari/active_admin_countless/_page.html.erb +12 -0
  33. data/app/views/kaminari/active_admin_countless/_paginator.html.erb +24 -0
  34. data/app/views/kaminari/active_admin_countless/_prev_page.html.erb +11 -0
  35. data/app/views/layouts/active_admin_logged_out.html.erb +1 -1
  36. data/config/locales/ar.yml +3 -2
  37. data/config/locales/bg.yml +1 -1
  38. data/config/locales/bs.yml +1 -0
  39. data/config/locales/ca.yml +1 -1
  40. data/config/locales/cs.yml +1 -0
  41. data/config/locales/da.yml +1 -0
  42. data/config/locales/de-CH.yml +1 -0
  43. data/config/locales/de.yml +1 -0
  44. data/config/locales/el.yml +1 -0
  45. data/config/locales/en-CA.yml +1 -0
  46. data/config/locales/en-GB.yml +1 -0
  47. data/config/locales/en.yml +1 -0
  48. data/config/locales/eo.yml +1 -0
  49. data/config/locales/es-MX.yml +1 -0
  50. data/config/locales/es.yml +1 -0
  51. data/config/locales/fa.yml +1 -0
  52. data/config/locales/fi.yml +1 -0
  53. data/config/locales/fr.yml +2 -1
  54. data/config/locales/he.yml +1 -1
  55. data/config/locales/hr.yml +1 -0
  56. data/config/locales/hu.yml +5 -0
  57. data/config/locales/id.yml +1 -0
  58. data/config/locales/it.yml +1 -0
  59. data/config/locales/ja.yml +1 -0
  60. data/config/locales/ko.yml +1 -0
  61. data/config/locales/lt.yml +3 -2
  62. data/config/locales/lv.yml +1 -0
  63. data/config/locales/mk.yml +134 -0
  64. data/config/locales/nb.yml +1 -0
  65. data/config/locales/nl.yml +1 -0
  66. data/config/locales/pl.yml +1 -0
  67. data/config/locales/pt-BR.yml +1 -0
  68. data/config/locales/pt-PT.yml +1 -0
  69. data/config/locales/ro.yml +1 -0
  70. data/config/locales/ru.yml +1 -0
  71. data/config/locales/sk.yml +1 -0
  72. data/config/locales/sv-SE.yml +1 -0
  73. data/config/locales/tr.yml +1 -0
  74. data/config/locales/uk.yml +3 -0
  75. data/config/locales/vi.yml +1 -0
  76. data/config/locales/zh-CN.yml +1 -0
  77. data/config/locales/zh-TW.yml +1 -0
  78. data/docs/0-installation.md +2 -2
  79. data/docs/12-arbre-components.md +13 -0
  80. data/docs/13-authorization-adapter.md +6 -6
  81. data/docs/2-resource-customization.md +1 -1
  82. data/docs/3-index-pages/index-as-table.md +7 -0
  83. data/docs/CNAME +1 -1
  84. data/docs/Gemfile +0 -1
  85. data/docs/Gemfile.lock +3 -4
  86. data/docs/_config.yml +2 -0
  87. data/docs/_includes/top-menu.html +2 -2
  88. data/docs/index.html +109 -8
  89. data/docs/stylesheets/main.css +29 -0
  90. data/lib/active_admin.rb +10 -4
  91. data/lib/active_admin/application.rb +11 -18
  92. data/lib/active_admin/application_settings.rb +3 -0
  93. data/lib/active_admin/asset_registration.rb +0 -8
  94. data/lib/active_admin/base_controller.rb +6 -6
  95. data/lib/active_admin/base_controller/authorization.rb +3 -4
  96. data/lib/active_admin/batch_actions/controller.rb +2 -2
  97. data/lib/active_admin/batch_actions/resource_extension.rb +9 -5
  98. data/lib/active_admin/callbacks.rb +1 -1
  99. data/lib/active_admin/controller_action.rb +2 -1
  100. data/lib/active_admin/csv_builder.rb +4 -3
  101. data/lib/active_admin/dependency.rb +3 -75
  102. data/lib/active_admin/dsl.rb +1 -8
  103. data/lib/active_admin/error.rb +4 -2
  104. data/lib/active_admin/filters/active_filter.rb +5 -4
  105. data/lib/active_admin/filters/active_sidebar.rb +5 -1
  106. data/lib/active_admin/filters/forms.rb +2 -2
  107. data/lib/active_admin/filters/formtastic_addons.rb +1 -1
  108. data/lib/active_admin/filters/resource_extension.rb +3 -3
  109. data/lib/active_admin/form_builder.rb +3 -3
  110. data/lib/active_admin/generators/boilerplate.rb +12 -4
  111. data/lib/active_admin/helpers/scope_chain.rb +1 -0
  112. data/lib/active_admin/inputs/datepicker_input.rb +1 -1
  113. data/lib/active_admin/inputs/filters/base/search_method_select.rb +2 -2
  114. data/lib/active_admin/menu_item.rb +1 -1
  115. data/lib/active_admin/namespace.rb +2 -2
  116. data/lib/active_admin/namespace_settings.rb +7 -4
  117. data/lib/active_admin/orm/active_record/comments.rb +4 -4
  118. data/lib/active_admin/orm/active_record/comments/comment.rb +2 -2
  119. data/lib/active_admin/orm/active_record/comments/views/active_admin_comments.rb +10 -5
  120. data/lib/active_admin/page_dsl.rb +1 -1
  121. data/lib/active_admin/page_presenter.rb +2 -1
  122. data/lib/active_admin/pundit_adapter.rb +18 -5
  123. data/lib/active_admin/resource.rb +17 -3
  124. data/lib/active_admin/resource/action_items.rb +1 -1
  125. data/lib/active_admin/resource/attributes.rb +7 -4
  126. data/lib/active_admin/resource/belongs_to.rb +6 -1
  127. data/lib/active_admin/resource/menu.rb +3 -3
  128. data/lib/active_admin/resource/model.rb +15 -0
  129. data/lib/active_admin/resource/naming.rb +3 -3
  130. data/lib/active_admin/resource/routes.rb +20 -7
  131. data/lib/active_admin/resource/scopes.rb +3 -3
  132. data/lib/active_admin/resource/sidebars.rb +1 -1
  133. data/lib/active_admin/resource_collection.rb +2 -2
  134. data/lib/active_admin/resource_controller.rb +2 -0
  135. data/lib/active_admin/resource_controller/action_builder.rb +10 -0
  136. data/lib/active_admin/resource_controller/polymorphic_routes.rb +36 -0
  137. data/lib/active_admin/resource_controller/resource_class_methods.rb +2 -0
  138. data/lib/active_admin/resource_controller/scoping.rb +1 -1
  139. data/lib/active_admin/resource_dsl.rb +6 -4
  140. data/lib/active_admin/router.rb +3 -2
  141. data/lib/active_admin/scope.rb +11 -7
  142. data/lib/active_admin/settings_node.rb +1 -1
  143. data/lib/active_admin/sidebar_section.rb +3 -1
  144. data/lib/active_admin/version.rb +1 -1
  145. data/lib/active_admin/view_helpers.rb +1 -1
  146. data/lib/active_admin/view_helpers/breadcrumb_helper.rb +2 -2
  147. data/lib/active_admin/view_helpers/display_helper.rb +13 -4
  148. data/lib/active_admin/view_helpers/download_format_links_helper.rb +1 -0
  149. data/lib/active_admin/view_helpers/method_or_proc_helper.rb +3 -0
  150. data/lib/active_admin/views.rb +1 -1
  151. data/lib/active_admin/views/components/active_admin_form.rb +7 -1
  152. data/lib/active_admin/views/components/attributes_table.rb +3 -3
  153. data/lib/active_admin/views/components/paginated_collection.rb +2 -2
  154. data/lib/active_admin/views/components/sidebar_section.rb +0 -3
  155. data/lib/active_admin/views/components/status_tag.rb +6 -19
  156. data/lib/active_admin/views/components/table_for.rb +2 -2
  157. data/lib/active_admin/views/components/tabs.rb +11 -2
  158. data/lib/active_admin/views/footer.rb +1 -1
  159. data/lib/active_admin/views/index_as_table.rb +12 -4
  160. data/lib/active_admin/views/pages/base.rb +3 -0
  161. data/lib/generators/active_admin/assets/assets_generator.rb +2 -2
  162. data/lib/generators/active_admin/assets/templates/active_admin.js +1 -0
  163. data/lib/generators/active_admin/install/install_generator.rb +6 -2
  164. data/lib/generators/active_admin/install/templates/active_admin.rb.erb +24 -2
  165. data/lib/generators/active_admin/install/templates/dashboard.rb +2 -3
  166. data/lib/generators/active_admin/install/templates/migrations/create_active_admin_comments.rb.erb +1 -15
  167. data/lib/generators/active_admin/page/page_generator.rb +1 -1
  168. data/lib/generators/active_admin/resource/resource_generator.rb +1 -1
  169. data/lib/generators/active_admin/resource/templates/admin.rb.erb +40 -37
  170. data/lib/ransack_ext.rb +3 -3
  171. data/vendor/assets/javascripts/jquery-ui/form-reset-mixin.js +80 -0
  172. data/vendor/assets/javascripts/jquery-ui/form.js +22 -0
  173. data/vendor/assets/javascripts/jquery-ui/labels.js +65 -0
  174. data/vendor/assets/javascripts/jquery-ui/widgets/checkboxradio.js +274 -283
  175. metadata +113 -100
  176. data/.circleci/config.yml +0 -467
  177. data/.github/ISSUE_TEMPLATE.md +0 -20
  178. data/.gitignore +0 -46
  179. data/.mdlrc +0 -1
  180. data/.rspec +0 -1
  181. data/.rspec_parallel +0 -2
  182. data/.rubocop.yml +0 -94
  183. data/.simplecov +0 -11
  184. data/.yardopts +0 -7
  185. data/Gemfile +0 -10
  186. data/Gemfile.common +0 -53
  187. data/Gemfile.lock +0 -431
  188. data/Rakefile +0 -23
  189. data/activeadmin.gemspec +0 -32
  190. data/app/assets/javascripts/active_admin/base.js.coffee +0 -13
  191. data/app/assets/javascripts/active_admin/ext/jquery-ui.js.coffee +0 -6
  192. data/app/assets/javascripts/active_admin/ext/jquery.js.coffee +0 -7
  193. data/app/assets/javascripts/active_admin/initializers/batch_actions.js.coffee +0 -11
  194. data/app/assets/javascripts/active_admin/initializers/datepicker.js.coffee +0 -14
  195. data/app/assets/javascripts/active_admin/initializers/filters.js.coffee +0 -26
  196. data/app/assets/javascripts/active_admin/initializers/tabs.js.coffee +0 -7
  197. data/app/assets/javascripts/active_admin/lib/batch_actions.js.coffee +0 -42
  198. data/app/assets/javascripts/active_admin/lib/checkbox-toggler.js.coffee +0 -46
  199. data/app/assets/javascripts/active_admin/lib/dropdown-menu.js.coffee +0 -104
  200. data/app/assets/javascripts/active_admin/lib/flash.js.coffee +0 -19
  201. data/app/assets/javascripts/active_admin/lib/has_many.js.coffee +0 -79
  202. data/app/assets/javascripts/active_admin/lib/modal_dialog.js.coffee +0 -45
  203. data/app/assets/javascripts/active_admin/lib/per_page.js.coffee +0 -46
  204. data/app/assets/javascripts/active_admin/lib/table-checkbox-toggler.js.coffee +0 -22
  205. data/bin/install_chromedriver.sh +0 -17
  206. data/codecov.yml +0 -25
  207. data/config/i18n-tasks.yml +0 -26
  208. data/config/mdl_style.rb +0 -11
  209. data/cucumber.yml +0 -7
  210. data/gemfiles/rails_42.gemfile +0 -10
  211. data/gemfiles/rails_42.gemfile.lock +0 -410
  212. data/gemfiles/rails_50.gemfile +0 -10
  213. data/gemfiles/rails_50.gemfile.lock +0 -424
  214. data/gemfiles/rails_51.gemfile +0 -10
  215. data/gemfiles/rails_51.gemfile.lock +0 -423
  216. data/lib/active_admin/event.rb +0 -24
  217. data/lib/active_admin/helpers/output_safety_helper.rb +0 -35
  218. data/lib/active_admin/reloader.rb +0 -25
  219. data/lib/bug_report_templates/active_admin_master.rb +0 -111
  220. data/lib/generators/active_admin/assets/templates/active_admin.js.coffee +0 -1
  221. data/tasks/application_generator.rb +0 -48
  222. data/tasks/docs.rake +0 -64
  223. data/tasks/gemfiles.rake +0 -8
  224. data/tasks/lint.rake +0 -110
  225. data/tasks/local.rake +0 -27
  226. data/tasks/test.rake +0 -43
@@ -83,14 +83,7 @@ module ActiveAdmin
83
83
  # this action item on.
84
84
  # :except: A single or array of controller actions not to
85
85
  # display this action item on.
86
- def action_item(name = nil, options = {}, &block)
87
- if name.is_a?(Hash)
88
- options = name
89
- name = nil
90
- end
91
-
92
- Deprecation.warn "using `action_item` without a name is deprecated! Use `action_item(:edit)`." unless name
93
-
86
+ def action_item(name, options = {}, &block)
94
87
  config.add_action_item(name, options, &block)
95
88
  end
96
89
 
@@ -6,7 +6,9 @@ module ActiveAdmin
6
6
  attr_reader :user, :action, :subject
7
7
 
8
8
  def initialize(user, action, subject = nil)
9
- @user, @action, @subject = user, action, subject
9
+ @user = user
10
+ @action = action
11
+ @subject = subject
10
12
 
11
13
  super()
12
14
  end
@@ -22,7 +24,7 @@ module ActiveAdmin
22
24
  class ErrorLoading < Error
23
25
  # Locates the most recent file and line from the caught exception's backtrace.
24
26
  def find_cause(folder, backtrace)
25
- backtrace.grep(/\/(#{folder}\/.*\.rb):(\d+)/){ [$1, $2] }.first
27
+ backtrace.grep(/\/(#{folder}\/.*\.rb):(\d+)/) { [$1, $2] }.first
26
28
  end
27
29
  end
28
30
 
@@ -26,9 +26,10 @@ module ActiveAdmin
26
26
  end
27
27
 
28
28
  def label
29
- # TODO: to remind us to go back to the simpler str.downcase once we support ruby >= 2.4 only.
30
- translated_predicate = predicate_name.mb_chars.downcase.to_s
31
- if filter_label
29
+ translated_predicate = predicate_name.downcase
30
+ if filter_label && filter_label.is_a?(Proc)
31
+ "#{filter_label.call} #{translated_predicate}"
32
+ elsif filter_label
32
33
  "#{filter_label} #{translated_predicate}"
33
34
  elsif related_class
34
35
  "#{related_class_name} #{translated_predicate}"
@@ -65,7 +66,7 @@ module ActiveAdmin
65
66
  def filter_label
66
67
  return unless filter
67
68
 
68
- filter[:label]
69
+ filter[:label] || I18n.t(name, scope: ['formtastic', 'labels'], default: nil)
69
70
  end
70
71
 
71
72
  #@return Ransack::Nodes::Attribute
@@ -5,7 +5,7 @@ module ActiveAdmin
5
5
  class ActiveSidebar < ActiveAdmin::SidebarSection
6
6
 
7
7
  def initialize
8
- super I18n.t("active_admin.search_status.headline"), sidebar_options
8
+ super 'search_status', sidebar_options
9
9
  end
10
10
 
11
11
  def block
@@ -39,6 +39,10 @@ module ActiveAdmin
39
39
  end
40
40
  end
41
41
 
42
+ def title
43
+ I18n.t("active_admin.search_status.headline")
44
+ end
45
+
42
46
  protected
43
47
 
44
48
  def sidebar_options
@@ -48,8 +48,8 @@ module ActiveAdmin
48
48
  def active_admin_filters_form_for(search, filters, options = {})
49
49
  defaults = { builder: ActiveAdmin::Filters::FormBuilder,
50
50
  url: collection_path,
51
- html: {class: 'filter_form'} }
52
- required = { html: {method: :get},
51
+ html: { class: 'filter_form' } }
52
+ required = { html: { method: :get },
53
53
  as: :q }
54
54
  options = defaults.deep_merge(options).deep_merge(required)
55
55
 
@@ -37,7 +37,7 @@ module ActiveAdmin
37
37
  end
38
38
 
39
39
  def polymorphic_foreign_type?(method)
40
- klass.reflect_on_all_associations.select{ |r| r.macro == :belongs_to && r.options[:polymorphic] }
40
+ klass.reflect_on_all_associations.select { |r| r.macro == :belongs_to && r.options[:polymorphic] }
41
41
  .map(&:foreign_type).include? method.to_s
42
42
  end
43
43
 
@@ -123,10 +123,10 @@ module ActiveAdmin
123
123
  # Returns a default set of filters for the associations
124
124
  def default_association_filters
125
125
  if resource_class.respond_to?(:reflect_on_all_associations)
126
- poly, not_poly = resource_class.reflect_on_all_associations.partition{ |r| r.macro == :belongs_to && r.options[:polymorphic] }
126
+ poly, not_poly = resource_class.reflect_on_all_associations.partition { |r| r.macro == :belongs_to && r.options[:polymorphic] }
127
127
 
128
128
  # remove deeply nested associations
129
- not_poly.reject!{ |r| r.chain.length > 2 }
129
+ not_poly.reject! { |r| r.chain.length > 2 }
130
130
 
131
131
  filters = poly.map(&:foreign_type) + not_poly.map(&:name)
132
132
  filters.map &:to_sym
@@ -140,7 +140,7 @@ module ActiveAdmin
140
140
  end
141
141
 
142
142
  def filters_sidebar_section
143
- ActiveAdmin::SidebarSection.new :filters, only: :index, if: ->{ active_admin_config.filters.any? } do
143
+ ActiveAdmin::SidebarSection.new :filters, only: :index, if: -> { active_admin_config.filters.any? } do
144
144
  active_admin_filters_form_for assigns[:search], active_admin_config.filters
145
145
  end
146
146
  end
@@ -20,7 +20,7 @@ module ActiveAdmin
20
20
  self.input_class_finder = ::Formtastic::InputClassFinder
21
21
  self.action_class_finder = ::Formtastic::ActionClassFinder
22
22
 
23
- def cancel_link(url = {action: "index"}, html_options = {}, li_attrs = {})
23
+ def cancel_link(url = { action: "index" }, html_options = {}, li_attrs = {})
24
24
  li_attrs[:class] ||= "cancel"
25
25
  li_content = template.link_to I18n.t('active_admin.cancel'), url, html_options
26
26
  template.content_tag(:li, li_content, li_attrs)
@@ -111,7 +111,7 @@ module ActiveAdmin
111
111
  end
112
112
  elsif allow_destroy?(form_builder.object)
113
113
  form_builder.input(:_destroy, as: :boolean,
114
- wrapper_html: {class: 'has_many_delete'},
114
+ wrapper_html: { class: 'has_many_delete' },
115
115
  label: I18n.t('active_admin.has_many_delete'))
116
116
  end
117
117
 
@@ -163,7 +163,7 @@ module ActiveAdmin
163
163
  class: class_string,
164
164
  for_options: { child_index: placeholder }
165
165
  }
166
- html = template.capture{ __getobj__.send(:inputs_for_nested_attributes, opts, &form_block) }
166
+ html = template.capture { __getobj__.send(:inputs_for_nested_attributes, opts, &form_block) }
167
167
  text = new_record.is_a?(String) ? new_record : I18n.t('active_admin.has_many_new', model: assoc_name.human)
168
168
 
169
169
  template.link_to text, '#', class: "button has_many_add", data: {
@@ -9,8 +9,16 @@ module ActiveAdmin
9
9
  @class_name.constantize.new.attributes.keys
10
10
  end
11
11
 
12
+ def assignable_attributes
13
+ attributes - %w(id created_at updated_at)
14
+ end
15
+
16
+ def permit_params
17
+ assignable_attributes.map { |a| a.to_sym.inspect }.join(', ')
18
+ end
19
+
12
20
  def rows
13
- attributes.map { |a| row(a) }.join("\n")
21
+ attributes.map { |a| row(a) }.join("\n ")
14
22
  end
15
23
 
16
24
  def row(name)
@@ -18,7 +26,7 @@ module ActiveAdmin
18
26
  end
19
27
 
20
28
  def columns
21
- attributes.map { |a| column(a) }.join("\n")
29
+ attributes.map { |a| column(a) }.join("\n ")
22
30
  end
23
31
 
24
32
  def column(name)
@@ -26,7 +34,7 @@ module ActiveAdmin
26
34
  end
27
35
 
28
36
  def filters
29
- attributes.map { |a| filter(a) }.join("\n")
37
+ attributes.map { |a| filter(a) }.join("\n ")
30
38
  end
31
39
 
32
40
  def filter(name)
@@ -34,7 +42,7 @@ module ActiveAdmin
34
42
  end
35
43
 
36
44
  def form_inputs
37
- attributes.reject{|a| %w(id created_at updated_at).include? a}.map{ |a| form_input(a) }.join("\n")
45
+ assignable_attributes.map { |a| form_input(a) }.join("\n ")
38
46
  end
39
47
 
40
48
  def form_input(name)
@@ -1,5 +1,6 @@
1
1
  module ActiveAdmin
2
2
  module ScopeChain
3
+ private
3
4
  # Scope an ActiveRecord::Relation chain
4
5
  #
5
6
  # Example:
@@ -19,7 +19,7 @@ module ActiveAdmin
19
19
  private
20
20
  def datepicker_options
21
21
  options = self.options.fetch(:datepicker_options, {})
22
- options = Hash[options.map{ |k, v| [k.to_s.camelcase(:lower), v] }]
22
+ options = Hash[options.map { |k, v| [k.to_s.camelcase(:lower), v] }]
23
23
  { datepicker_options: options }
24
24
  end
25
25
  end
@@ -57,8 +57,8 @@ module ActiveAdmin
57
57
 
58
58
  def current_filter
59
59
  @current_filter ||= begin
60
- methods = filters.map{ |f| "#{method}_#{f}" }
61
- methods.detect{ |m| @object.public_send m } || methods.first
60
+ methods = filters.map { |f| "#{method}_#{f}" }
61
+ methods.detect { |m| @object.public_send m } || methods.first
62
62
  end
63
63
  end
64
64
 
@@ -50,7 +50,7 @@ module ActiveAdmin
50
50
  @url = options[:url] || '#'
51
51
  @priority = options[:priority] || 10
52
52
  @html_options = options[:html_options] || {}
53
- @should_display = options[:if] || proc{true}
53
+ @should_display = options[:if] || proc { true }
54
54
  @parent = options[:parent]
55
55
 
56
56
  yield(self) if block_given? # Builder style syntax
@@ -150,8 +150,8 @@ module ActiveAdmin
150
150
  if logout_link_path
151
151
  html_options = html_options.reverse_merge(method: logout_link_method || :get)
152
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 },
153
+ label: -> { I18n.t 'active_admin.logout' },
154
+ url: -> { render_or_call_method_or_proc_on self, active_admin_namespace.logout_link_path },
155
155
  if: :current_active_admin_user?
156
156
  end
157
157
  end
@@ -17,16 +17,19 @@ module ActiveAdmin
17
17
  # Set the site title image displayed in the main layout (has precendence over :site_title)
18
18
  register :site_title_image, "", :string_symbol_or_proc
19
19
 
20
+ # Add to the site head
21
+ register :head, "", :string_symbol_or_proc
22
+
20
23
  # Set the site footer text (defaults to Powered by ActiveAdmin text with version)
21
24
  register :footer, "", :string_symbol_or_proc
22
25
 
23
26
  # Set a favicon
24
27
  register :favicon, false
25
28
 
26
- # Additional meta tags to place in head of logged in pages.
29
+ # Additional meta tags to place in head of logged in pages
27
30
  register :meta_tags, {}
28
31
 
29
- # Additional meta tags to place in head of logged out pages.
32
+ # Additional meta tags to place in head of logged out pages
30
33
  register :meta_tags_for_logged_out_pages, { robots: "noindex, nofollow" }
31
34
 
32
35
  # The view factory to use to generate all the view classes. Take
@@ -53,10 +56,10 @@ module ActiveAdmin
53
56
  # Whether filters are enabled
54
57
  register :filters, true
55
58
 
56
- # The namespace root.
59
+ # The namespace root
57
60
  register :root_to, 'dashboard#index'
58
61
 
59
- # Options that a passed to root_to.
62
+ # Options that are passed to root_to
60
63
  register :root_to_options, {}
61
64
 
62
65
  # Options passed to the routes, i.e. { path: '/custom' }
@@ -64,21 +64,21 @@ ActiveAdmin.after_load do |app|
64
64
  def create
65
65
  create! do |success, failure|
66
66
  success.html do
67
- ActiveAdmin::Dependency.rails.redirect_back self, active_admin_root
67
+ redirect_back fallback_location: active_admin_root
68
68
  end
69
69
  failure.html do
70
70
  flash[:error] = I18n.t 'active_admin.comments.errors.empty_text'
71
- ActiveAdmin::Dependency.rails.redirect_back self, active_admin_root
71
+ redirect_back fallback_location: active_admin_root
72
72
  end
73
73
  end
74
74
 
75
75
  def destroy
76
76
  destroy! do |success, failure|
77
77
  success.html do
78
- ActiveAdmin::Dependency.rails.redirect_back self, active_admin_root
78
+ redirect_back fallback_location: active_admin_root
79
79
  end
80
80
  failure.html do
81
- ActiveAdmin::Dependency.rails.redirect_back self, active_admin_root
81
+ redirect_back fallback_location: active_admin_root
82
82
  end
83
83
  end
84
84
  end
@@ -3,7 +3,7 @@ module ActiveAdmin
3
3
 
4
4
  self.table_name = "#{table_name_prefix}active_admin_comments#{table_name_suffix}"
5
5
 
6
- belongs_to :resource, { polymorphic: true }.merge(ActiveAdmin::Dependency.rails.optional_belongs_to_flag)
6
+ belongs_to :resource, polymorphic: true, optional: true
7
7
  belongs_to :author, polymorphic: true
8
8
 
9
9
  validates_presence_of :body, :namespace, :resource
@@ -18,7 +18,7 @@ module ActiveAdmin
18
18
  def self.find_for_resource_in_namespace(resource, namespace)
19
19
  where(
20
20
  resource_type: resource_type(resource),
21
- resource_id: resource,
21
+ resource_id: resource.id,
22
22
  namespace: namespace.to_s
23
23
  ).order(ActiveAdmin.application.namespaces[namespace.to_sym].comments_order)
24
24
  end
@@ -11,10 +11,12 @@ module ActiveAdmin
11
11
  attr_accessor :resource
12
12
 
13
13
  def build(resource)
14
- @resource = resource
15
- @comments = ActiveAdmin::Comment.find_for_resource_in_namespace(resource, active_admin_namespace.name).includes(:author).page(params[:page])
16
- super(title, for: resource)
17
- build_comments
14
+ if authorized?(ActiveAdmin::Auth::READ, ActiveAdmin::Comment)
15
+ @resource = resource
16
+ @comments = active_admin_authorization.scope_collection(ActiveAdmin::Comment.find_for_resource_in_namespace(resource, active_admin_namespace.name).includes(:author).page(params[:page]))
17
+ super(title, for: resource)
18
+ build_comments
19
+ end
18
20
  end
19
21
 
20
22
  protected
@@ -32,7 +34,10 @@ module ActiveAdmin
32
34
  end
33
35
 
34
36
  text_node paginate @comments
35
- build_comment_form
37
+
38
+ if authorized?(ActiveAdmin::Auth::CREATE, ActiveAdmin::Comment)
39
+ build_comment_form
40
+ end
36
41
  end
37
42
 
38
43
  def build_comment(comment)
@@ -21,7 +21,7 @@ module ActiveAdmin
21
21
  def page_action(name, options = {}, &block)
22
22
  config.page_actions << ControllerAction.new(name, options)
23
23
  controller do
24
- define_method(name, &block || Proc.new{})
24
+ define_method(name, &block || Proc.new {})
25
25
  end
26
26
  end
27
27
 
@@ -21,7 +21,8 @@ module ActiveAdmin
21
21
  delegate :has_key?, :fetch, to: :options
22
22
 
23
23
  def initialize(options = {}, &block)
24
- @options, @block = options, block
24
+ @options = options
25
+ @block = block
25
26
  end
26
27
 
27
28
  def [](key)
@@ -4,6 +4,7 @@ require 'pundit'
4
4
 
5
5
  # Add a setting to the application to configure the pundit default policy
6
6
  ActiveAdmin::Application.inheritable_setting :pundit_default_policy, nil
7
+ ActiveAdmin::Application.inheritable_setting :pundit_policy_namespace, nil
7
8
 
8
9
  module ActiveAdmin
9
10
 
@@ -19,7 +20,7 @@ module ActiveAdmin
19
20
  def scope_collection(collection, action = Auth::READ)
20
21
  # scoping is appliable only to read/index action
21
22
  # which means there is no way how to scope other actions
22
- Pundit.policy_scope!(user, collection)
23
+ Pundit.policy_scope!(user, namespace(collection))
23
24
  rescue Pundit::NotDefinedError => e
24
25
  if default_policy_class && default_policy_class.const_defined?(:Scope)
25
26
  default_policy_class::Scope.new(user, collection).resolve
@@ -30,9 +31,9 @@ module ActiveAdmin
30
31
 
31
32
  def retrieve_policy(subject)
32
33
  case subject
33
- when nil then Pundit.policy!(user, resource)
34
- when Class then Pundit.policy!(user, subject.new)
35
- else Pundit.policy!(user, 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))
36
37
  end
37
38
  rescue Pundit::NotDefinedError => e
38
39
  if default_policy_class
@@ -43,7 +44,7 @@ module ActiveAdmin
43
44
  end
44
45
 
45
46
  def format_action(action, subject)
46
- # https://github.com/elabs/pundit/blob/master/lib/generators/pundit/install/templates/application_policy.rb
47
+ # https://github.com/varvet/pundit/blob/master/lib/generators/pundit/install/templates/application_policy.rb
47
48
  case action
48
49
  when Auth::CREATE then :create?
49
50
  when Auth::UPDATE then :update?
@@ -55,6 +56,14 @@ module ActiveAdmin
55
56
 
56
57
  private
57
58
 
59
+ def namespace(object)
60
+ if default_policy_namespace && !object.class.to_s.include?(default_policy_namespace.to_s.camelize)
61
+ [default_policy_namespace.to_sym, object]
62
+ else
63
+ object
64
+ end
65
+ end
66
+
58
67
  def default_policy_class
59
68
  ActiveAdmin.application.pundit_default_policy && ActiveAdmin.application.pundit_default_policy.constantize
60
69
  end
@@ -63,6 +72,10 @@ module ActiveAdmin
63
72
  default_policy_class.new(user, subject)
64
73
  end
65
74
 
75
+ def default_policy_namespace
76
+ ActiveAdmin.application.pundit_policy_namespace
77
+ end
78
+
66
79
  end
67
80
 
68
81
  end
@@ -12,6 +12,7 @@ require 'active_admin/resource/scope_to'
12
12
  require 'active_admin/resource/sidebars'
13
13
  require 'active_admin/resource/belongs_to'
14
14
  require 'active_admin/resource/ordering'
15
+ require 'active_admin/resource/model'
15
16
 
16
17
  module ActiveAdmin
17
18
 
@@ -71,7 +72,8 @@ module ActiveAdmin
71
72
  @resource_class_name = "::#{resource_class.name}"
72
73
  @options = options
73
74
  @sort_order = options[:sort_order]
74
- @member_actions, @collection_actions = [], []
75
+ @member_actions = []
76
+ @collection_actions = []
75
77
  end
76
78
  end
77
79
 
@@ -103,6 +105,10 @@ module ActiveAdmin
103
105
  ActiveSupport::Dependencies.constantize(decorator_class_name) if decorator_class_name
104
106
  end
105
107
 
108
+ def resource_name_extension
109
+ @resource_name_extension ||= define_resource_name_extension(self)
110
+ end
111
+
106
112
  def resource_table_name
107
113
  resource_class.quoted_table_name
108
114
  end
@@ -132,6 +138,7 @@ module ActiveAdmin
132
138
  def belongs_to(target, options = {})
133
139
  @belongs_to = Resource::BelongsTo.new(self, target, options)
134
140
  self.menu_item_options = false if @belongs_to.required?
141
+ options[:class_name] ||= @belongs_to.resource.resource_class_name if @belongs_to.resource
135
142
  controller.send :belongs_to, target, options.dup
136
143
  end
137
144
 
@@ -181,11 +188,11 @@ module ActiveAdmin
181
188
  end
182
189
 
183
190
  def association_columns
184
- @association_columns ||= resource_attributes.select{ |key, value| key != value }.values
191
+ @association_columns ||= resource_attributes.select { |key, value| key != value }.values
185
192
  end
186
193
 
187
194
  def content_columns
188
- @content_columns ||= resource_attributes.select{ |key, value| key == value }.values
195
+ @content_columns ||= resource_attributes.select { |key, value| key == value }.values
189
196
  end
190
197
 
191
198
  private
@@ -202,5 +209,12 @@ module ActiveAdmin
202
209
  @default_csv_builder ||= CSVBuilder.default_for_resource(self)
203
210
  end
204
211
 
212
+ def define_resource_name_extension(resource)
213
+ Module.new do
214
+ define_method :model_name do
215
+ resource.resource_name
216
+ end
217
+ end
218
+ end
205
219
  end # class Resource
206
220
  end # module ActiveAdmin