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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +306 -144
- data/CONTRIBUTING.md +21 -16
- data/README.md +44 -11
- data/app/assets/javascripts/active_admin/base.es6 +23 -0
- data/app/assets/javascripts/active_admin/ext/jquery-ui.es6 +7 -0
- data/app/assets/javascripts/active_admin/ext/jquery.es6 +9 -0
- data/app/assets/javascripts/active_admin/initializers/datepicker.es6 +16 -0
- data/app/assets/javascripts/active_admin/initializers/filters.es6 +45 -0
- data/app/assets/javascripts/active_admin/initializers/tabs.es6 +6 -0
- data/app/assets/javascripts/active_admin/lib/active_admin.es6 +41 -0
- data/app/assets/javascripts/active_admin/lib/batch_actions.es6 +59 -0
- data/app/assets/javascripts/active_admin/lib/checkbox-toggler.es6 +49 -0
- data/app/assets/javascripts/active_admin/lib/dropdown-menu.es6 +123 -0
- data/app/assets/javascripts/active_admin/lib/has_many.es6 +95 -0
- data/app/assets/javascripts/active_admin/lib/modal_dialog.es6 +61 -0
- data/app/assets/javascripts/active_admin/lib/per_page.es6 +47 -0
- data/app/assets/javascripts/active_admin/lib/table-checkbox-toggler.es6 +36 -0
- data/app/assets/stylesheets/active_admin/_forms.scss +2 -14
- data/app/assets/stylesheets/active_admin/components/_status_tags.scss +0 -5
- data/app/assets/stylesheets/active_admin/components/_tabs.scss +1 -1
- data/app/assets/stylesheets/active_admin/mixins/_gradients.scss +1 -1
- data/app/views/active_admin/devise/confirmations/new.html.erb +1 -1
- data/app/views/active_admin/devise/passwords/edit.html.erb +1 -1
- data/app/views/active_admin/devise/passwords/new.html.erb +1 -1
- data/app/views/active_admin/devise/registrations/new.html.erb +1 -2
- data/app/views/active_admin/devise/shared/_error_messages.html.erb +15 -0
- data/app/views/active_admin/devise/unlocks/new.html.erb +1 -1
- data/app/views/kaminari/active_admin_countless/_first_page.html.erb +11 -0
- data/app/views/kaminari/active_admin_countless/_gap.html.erb +8 -0
- data/app/views/kaminari/active_admin_countless/_next_page.html.erb +11 -0
- data/app/views/kaminari/active_admin_countless/_page.html.erb +12 -0
- data/app/views/kaminari/active_admin_countless/_paginator.html.erb +24 -0
- data/app/views/kaminari/active_admin_countless/_prev_page.html.erb +11 -0
- data/app/views/layouts/active_admin_logged_out.html.erb +1 -1
- data/config/locales/ar.yml +3 -2
- data/config/locales/bg.yml +1 -1
- data/config/locales/bs.yml +1 -0
- data/config/locales/ca.yml +1 -1
- data/config/locales/cs.yml +1 -0
- data/config/locales/da.yml +1 -0
- data/config/locales/de-CH.yml +1 -0
- data/config/locales/de.yml +1 -0
- data/config/locales/el.yml +1 -0
- data/config/locales/en-CA.yml +1 -0
- data/config/locales/en-GB.yml +1 -0
- data/config/locales/en.yml +1 -0
- data/config/locales/eo.yml +1 -0
- data/config/locales/es-MX.yml +1 -0
- data/config/locales/es.yml +1 -0
- data/config/locales/fa.yml +1 -0
- data/config/locales/fi.yml +1 -0
- data/config/locales/fr.yml +2 -1
- data/config/locales/he.yml +1 -1
- data/config/locales/hr.yml +1 -0
- data/config/locales/hu.yml +5 -0
- data/config/locales/id.yml +1 -0
- data/config/locales/it.yml +1 -0
- data/config/locales/ja.yml +1 -0
- data/config/locales/ko.yml +1 -0
- data/config/locales/lt.yml +3 -2
- data/config/locales/lv.yml +1 -0
- data/config/locales/mk.yml +134 -0
- data/config/locales/nb.yml +1 -0
- data/config/locales/nl.yml +1 -0
- data/config/locales/pl.yml +1 -0
- data/config/locales/pt-BR.yml +1 -0
- data/config/locales/pt-PT.yml +1 -0
- data/config/locales/ro.yml +1 -0
- data/config/locales/ru.yml +1 -0
- data/config/locales/sk.yml +1 -0
- data/config/locales/sv-SE.yml +1 -0
- data/config/locales/tr.yml +1 -0
- data/config/locales/uk.yml +3 -0
- data/config/locales/vi.yml +1 -0
- data/config/locales/zh-CN.yml +1 -0
- data/config/locales/zh-TW.yml +1 -0
- data/docs/0-installation.md +2 -2
- data/docs/12-arbre-components.md +13 -0
- data/docs/13-authorization-adapter.md +6 -6
- data/docs/2-resource-customization.md +1 -1
- data/docs/3-index-pages/index-as-table.md +7 -0
- data/docs/CNAME +1 -1
- data/docs/Gemfile +0 -1
- data/docs/Gemfile.lock +3 -4
- data/docs/_config.yml +2 -0
- data/docs/_includes/top-menu.html +2 -2
- data/docs/index.html +109 -8
- data/docs/stylesheets/main.css +29 -0
- data/lib/active_admin.rb +10 -4
- data/lib/active_admin/application.rb +11 -18
- data/lib/active_admin/application_settings.rb +3 -0
- data/lib/active_admin/asset_registration.rb +0 -8
- data/lib/active_admin/base_controller.rb +6 -6
- data/lib/active_admin/base_controller/authorization.rb +3 -4
- data/lib/active_admin/batch_actions/controller.rb +2 -2
- data/lib/active_admin/batch_actions/resource_extension.rb +9 -5
- data/lib/active_admin/callbacks.rb +1 -1
- data/lib/active_admin/controller_action.rb +2 -1
- data/lib/active_admin/csv_builder.rb +4 -3
- data/lib/active_admin/dependency.rb +3 -75
- data/lib/active_admin/dsl.rb +1 -8
- data/lib/active_admin/error.rb +4 -2
- data/lib/active_admin/filters/active_filter.rb +5 -4
- data/lib/active_admin/filters/active_sidebar.rb +5 -1
- data/lib/active_admin/filters/forms.rb +2 -2
- data/lib/active_admin/filters/formtastic_addons.rb +1 -1
- data/lib/active_admin/filters/resource_extension.rb +3 -3
- data/lib/active_admin/form_builder.rb +3 -3
- data/lib/active_admin/generators/boilerplate.rb +12 -4
- data/lib/active_admin/helpers/scope_chain.rb +1 -0
- data/lib/active_admin/inputs/datepicker_input.rb +1 -1
- data/lib/active_admin/inputs/filters/base/search_method_select.rb +2 -2
- data/lib/active_admin/menu_item.rb +1 -1
- data/lib/active_admin/namespace.rb +2 -2
- data/lib/active_admin/namespace_settings.rb +7 -4
- data/lib/active_admin/orm/active_record/comments.rb +4 -4
- data/lib/active_admin/orm/active_record/comments/comment.rb +2 -2
- data/lib/active_admin/orm/active_record/comments/views/active_admin_comments.rb +10 -5
- data/lib/active_admin/page_dsl.rb +1 -1
- data/lib/active_admin/page_presenter.rb +2 -1
- data/lib/active_admin/pundit_adapter.rb +18 -5
- data/lib/active_admin/resource.rb +17 -3
- data/lib/active_admin/resource/action_items.rb +1 -1
- data/lib/active_admin/resource/attributes.rb +7 -4
- data/lib/active_admin/resource/belongs_to.rb +6 -1
- data/lib/active_admin/resource/menu.rb +3 -3
- data/lib/active_admin/resource/model.rb +15 -0
- data/lib/active_admin/resource/naming.rb +3 -3
- data/lib/active_admin/resource/routes.rb +20 -7
- data/lib/active_admin/resource/scopes.rb +3 -3
- data/lib/active_admin/resource/sidebars.rb +1 -1
- data/lib/active_admin/resource_collection.rb +2 -2
- data/lib/active_admin/resource_controller.rb +2 -0
- data/lib/active_admin/resource_controller/action_builder.rb +10 -0
- data/lib/active_admin/resource_controller/polymorphic_routes.rb +36 -0
- data/lib/active_admin/resource_controller/resource_class_methods.rb +2 -0
- data/lib/active_admin/resource_controller/scoping.rb +1 -1
- data/lib/active_admin/resource_dsl.rb +6 -4
- data/lib/active_admin/router.rb +3 -2
- data/lib/active_admin/scope.rb +11 -7
- data/lib/active_admin/settings_node.rb +1 -1
- data/lib/active_admin/sidebar_section.rb +3 -1
- data/lib/active_admin/version.rb +1 -1
- data/lib/active_admin/view_helpers.rb +1 -1
- data/lib/active_admin/view_helpers/breadcrumb_helper.rb +2 -2
- data/lib/active_admin/view_helpers/display_helper.rb +13 -4
- data/lib/active_admin/view_helpers/download_format_links_helper.rb +1 -0
- data/lib/active_admin/view_helpers/method_or_proc_helper.rb +3 -0
- data/lib/active_admin/views.rb +1 -1
- data/lib/active_admin/views/components/active_admin_form.rb +7 -1
- data/lib/active_admin/views/components/attributes_table.rb +3 -3
- data/lib/active_admin/views/components/paginated_collection.rb +2 -2
- data/lib/active_admin/views/components/sidebar_section.rb +0 -3
- data/lib/active_admin/views/components/status_tag.rb +6 -19
- data/lib/active_admin/views/components/table_for.rb +2 -2
- data/lib/active_admin/views/components/tabs.rb +11 -2
- data/lib/active_admin/views/footer.rb +1 -1
- data/lib/active_admin/views/index_as_table.rb +12 -4
- data/lib/active_admin/views/pages/base.rb +3 -0
- data/lib/generators/active_admin/assets/assets_generator.rb +2 -2
- data/lib/generators/active_admin/assets/templates/active_admin.js +1 -0
- data/lib/generators/active_admin/install/install_generator.rb +6 -2
- data/lib/generators/active_admin/install/templates/active_admin.rb.erb +24 -2
- data/lib/generators/active_admin/install/templates/dashboard.rb +2 -3
- data/lib/generators/active_admin/install/templates/migrations/create_active_admin_comments.rb.erb +1 -15
- data/lib/generators/active_admin/page/page_generator.rb +1 -1
- data/lib/generators/active_admin/resource/resource_generator.rb +1 -1
- data/lib/generators/active_admin/resource/templates/admin.rb.erb +40 -37
- data/lib/ransack_ext.rb +3 -3
- data/vendor/assets/javascripts/jquery-ui/form-reset-mixin.js +80 -0
- data/vendor/assets/javascripts/jquery-ui/form.js +22 -0
- data/vendor/assets/javascripts/jquery-ui/labels.js +65 -0
- data/vendor/assets/javascripts/jquery-ui/widgets/checkboxradio.js +274 -283
- metadata +113 -100
- data/.circleci/config.yml +0 -467
- data/.github/ISSUE_TEMPLATE.md +0 -20
- data/.gitignore +0 -46
- data/.mdlrc +0 -1
- data/.rspec +0 -1
- data/.rspec_parallel +0 -2
- data/.rubocop.yml +0 -94
- data/.simplecov +0 -11
- data/.yardopts +0 -7
- data/Gemfile +0 -10
- data/Gemfile.common +0 -53
- data/Gemfile.lock +0 -431
- data/Rakefile +0 -23
- data/activeadmin.gemspec +0 -32
- data/app/assets/javascripts/active_admin/base.js.coffee +0 -13
- data/app/assets/javascripts/active_admin/ext/jquery-ui.js.coffee +0 -6
- data/app/assets/javascripts/active_admin/ext/jquery.js.coffee +0 -7
- data/app/assets/javascripts/active_admin/initializers/batch_actions.js.coffee +0 -11
- data/app/assets/javascripts/active_admin/initializers/datepicker.js.coffee +0 -14
- data/app/assets/javascripts/active_admin/initializers/filters.js.coffee +0 -26
- data/app/assets/javascripts/active_admin/initializers/tabs.js.coffee +0 -7
- data/app/assets/javascripts/active_admin/lib/batch_actions.js.coffee +0 -42
- data/app/assets/javascripts/active_admin/lib/checkbox-toggler.js.coffee +0 -46
- data/app/assets/javascripts/active_admin/lib/dropdown-menu.js.coffee +0 -104
- data/app/assets/javascripts/active_admin/lib/flash.js.coffee +0 -19
- data/app/assets/javascripts/active_admin/lib/has_many.js.coffee +0 -79
- data/app/assets/javascripts/active_admin/lib/modal_dialog.js.coffee +0 -45
- data/app/assets/javascripts/active_admin/lib/per_page.js.coffee +0 -46
- data/app/assets/javascripts/active_admin/lib/table-checkbox-toggler.js.coffee +0 -22
- data/bin/install_chromedriver.sh +0 -17
- data/codecov.yml +0 -25
- data/config/i18n-tasks.yml +0 -26
- data/config/mdl_style.rb +0 -11
- data/cucumber.yml +0 -7
- data/gemfiles/rails_42.gemfile +0 -10
- data/gemfiles/rails_42.gemfile.lock +0 -410
- data/gemfiles/rails_50.gemfile +0 -10
- data/gemfiles/rails_50.gemfile.lock +0 -424
- data/gemfiles/rails_51.gemfile +0 -10
- data/gemfiles/rails_51.gemfile.lock +0 -423
- data/lib/active_admin/event.rb +0 -24
- data/lib/active_admin/helpers/output_safety_helper.rb +0 -35
- data/lib/active_admin/reloader.rb +0 -25
- data/lib/bug_report_templates/active_admin_master.rb +0 -111
- data/lib/generators/active_admin/assets/templates/active_admin.js.coffee +0 -1
- data/tasks/application_generator.rb +0 -48
- data/tasks/docs.rake +0 -64
- data/tasks/gemfiles.rake +0 -8
- data/tasks/lint.rake +0 -110
- data/tasks/local.rake +0 -27
- data/tasks/test.rake +0 -43
data/lib/active_admin/dsl.rb
CHANGED
@@ -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
|
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
|
|
data/lib/active_admin/error.rb
CHANGED
@@ -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
|
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
|
-
|
30
|
-
|
31
|
-
|
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
|
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
|
-
|
45
|
+
assignable_attributes.map { |a| form_input(a) }.join("\n ")
|
38
46
|
end
|
39
47
|
|
40
48
|
def form_input(name)
|
@@ -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
|
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
|
-
|
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
|
-
|
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
|
-
|
78
|
+
redirect_back fallback_location: active_admin_root
|
79
79
|
end
|
80
80
|
failure.html do
|
81
|
-
|
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,
|
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
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
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
|
-
|
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)
|
@@ -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/
|
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
|
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
|