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