activeadmin 1.4.3 → 3.0.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 +609 -26
- data/CONTRIBUTING.md +54 -76
- data/README.md +46 -13
- data/app/assets/javascripts/active_admin/base.js +521 -0
- data/app/assets/stylesheets/active_admin/_base.scss +53 -37
- data/app/assets/stylesheets/active_admin/_forms.scss +3 -25
- 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/_status_tags.scss +0 -5
- data/app/assets/stylesheets/active_admin/components/_tables.scss +1 -2
- data/app/assets/stylesheets/active_admin/components/_tabs.scss +1 -1
- data/app/assets/stylesheets/active_admin/mixins/_all.scss +8 -8
- data/app/assets/stylesheets/active_admin/mixins/_gradients.scss +1 -1
- data/app/assets/stylesheets/active_admin/mixins/_variables.scss +17 -0
- data/app/assets/stylesheets/active_admin/structure/_footer.scss +6 -1
- 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/javascript/active_admin/ext/jquery-ui.js +7 -0
- data/app/javascript/active_admin/ext/jquery.js +9 -0
- data/app/javascript/active_admin/initializers/batch-actions.js +61 -0
- data/app/javascript/active_admin/initializers/checkbox-toggler.js +3 -0
- data/app/javascript/active_admin/initializers/datepicker.js +16 -0
- data/app/javascript/active_admin/initializers/dropdown-menu.js +9 -0
- data/app/javascript/active_admin/initializers/filters.js +10 -0
- data/app/javascript/active_admin/initializers/has-many.js +98 -0
- 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/javascript/active_admin/initializers/tabs.js +6 -0
- data/app/javascript/active_admin/lib/checkbox-toggler.js +49 -0
- data/app/javascript/active_admin/lib/dropdown-menu.js +116 -0
- data/app/javascript/active_admin/lib/filters.js +39 -0
- data/app/javascript/active_admin/lib/modal-dialog.js +63 -0
- data/app/javascript/active_admin/lib/per-page.js +38 -0
- data/app/javascript/active_admin/lib/table-checkbox-toggler.js +38 -0
- data/app/javascript/active_admin/lib/utils.js +40 -0
- data/app/views/active_admin/devise/confirmations/new.html.erb +1 -1
- 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/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/shared/_links.erb +1 -1
- data/app/views/active_admin/devise/unlocks/new.html.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 +19 -8
- data/config/locales/ar.yml +9 -15
- data/config/locales/az.yml +131 -0
- data/config/locales/bg.yml +1 -8
- data/config/locales/bs.yml +1 -7
- data/config/locales/ca.yml +1 -8
- data/config/locales/cs.yml +1 -7
- data/config/locales/da.yml +1 -7
- data/config/locales/de-CH.yml +1 -7
- data/config/locales/de.yml +19 -8
- data/config/locales/el.yml +1 -7
- data/config/locales/en-CA.yml +4 -10
- data/config/locales/en-GB.yml +4 -10
- data/config/locales/en.yml +4 -11
- data/config/locales/eo.yml +1 -8
- data/config/locales/es-MX.yml +3 -8
- data/config/locales/es.yml +6 -13
- data/config/locales/fa.yml +1 -7
- data/config/locales/fi.yml +1 -7
- data/config/locales/fr.yml +9 -16
- data/config/locales/he.yml +1 -10
- data/config/locales/hr.yml +1 -7
- data/config/locales/hu.yml +3 -6
- data/config/locales/id.yml +1 -7
- data/config/locales/it.yml +19 -8
- data/config/locales/ja.yml +3 -10
- data/config/locales/ko.yml +2 -8
- data/config/locales/lt.yml +3 -10
- data/config/locales/lv.yml +3 -9
- data/config/locales/mk.yml +126 -0
- data/config/locales/nb.yml +1 -8
- data/config/locales/nl.yml +2 -9
- data/config/locales/pl.yml +1 -8
- data/config/locales/pt-BR.yml +1 -8
- data/config/locales/pt-PT.yml +1 -7
- data/config/locales/ro.yml +4 -9
- data/config/locales/ru.yml +1 -6
- data/config/locales/sk.yml +58 -6
- data/config/locales/sv-SE.yml +59 -39
- data/config/locales/tr.yml +1 -11
- data/config/locales/uk.yml +3 -6
- data/config/locales/vi.yml +40 -19
- data/config/locales/zh-CN.yml +35 -23
- data/config/locales/zh-TW.yml +1 -7
- data/lib/active_admin/abstract_view_factory.rb +1 -0
- data/lib/active_admin/application.rb +26 -33
- data/lib/active_admin/application_settings.rb +7 -3
- data/lib/active_admin/asset_registration.rb +4 -11
- data/lib/active_admin/authorization_adapter.rb +6 -3
- data/lib/active_admin/base_controller/authorization.rb +17 -16
- data/lib/active_admin/base_controller/menu.rb +1 -0
- data/lib/active_admin/base_controller.rb +12 -11
- data/lib/active_admin/batch_actions/controller.rb +5 -4
- data/lib/active_admin/batch_actions/resource_extension.rb +16 -10
- 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 +2 -1
- 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 +3 -1
- data/lib/active_admin/csv_builder.rb +15 -23
- data/lib/active_admin/dependency.rb +12 -87
- data/lib/active_admin/deprecation.rb +1 -0
- data/lib/active_admin/devise.rb +16 -5
- data/lib/active_admin/dsl.rb +3 -9
- 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 +5 -4
- data/lib/active_admin/filters/active.rb +2 -1
- data/lib/active_admin/filters/active_filter.rb +11 -10
- data/lib/active_admin/filters/active_sidebar.rb +8 -30
- data/lib/active_admin/filters/dsl.rb +1 -0
- data/lib/active_admin/filters/forms.rb +9 -8
- data/lib/active_admin/filters/formtastic_addons.rb +3 -7
- data/lib/active_admin/filters/resource_extension.rb +33 -8
- data/lib/active_admin/filters.rb +8 -7
- data/lib/active_admin/form_builder.rb +27 -22
- 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 +2 -0
- data/lib/active_admin/inputs/datepicker_input.rb +3 -2
- data/lib/active_admin/inputs/filters/base/search_method_select.rb +9 -8
- 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 +18 -14
- data/lib/active_admin/inputs/filters/numeric_input.rb +2 -1
- data/lib/active_admin/inputs/filters/select_input.rb +3 -2
- data/lib/active_admin/inputs/filters/string_input.rb +2 -1
- 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 +15 -14
- data/lib/active_admin/namespace_settings.rb +28 -8
- data/lib/active_admin/order_clause.rb +3 -2
- data/lib/active_admin/orm/active_record/comments/comment.rb +13 -4
- 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 +30 -24
- data/lib/active_admin/orm/active_record/comments/views.rb +3 -2
- data/lib/active_admin/orm/active_record/comments.rb +30 -29
- 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 +2 -1
- data/lib/active_admin/page_presenter.rb +3 -1
- data/lib/active_admin/pundit_adapter.rb +71 -16
- data/lib/active_admin/resource/action_items.rb +6 -5
- data/lib/active_admin/resource/attributes.rb +9 -5
- data/lib/active_admin/resource/belongs_to.rb +9 -3
- 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 +6 -5
- 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 +26 -14
- data/lib/active_admin/resource/scope_to.rb +8 -7
- data/lib/active_admin/resource/scopes.rb +4 -3
- data/lib/active_admin/resource/sidebars.rb +3 -2
- data/lib/active_admin/resource.rb +37 -22
- data/lib/active_admin/resource_collection.rb +3 -2
- data/lib/active_admin/resource_controller/action_builder.rb +11 -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 +3 -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 +16 -28
- data/lib/active_admin/router.rb +4 -2
- data/lib/active_admin/scope.rb +16 -11
- data/lib/active_admin/settings_node.rb +2 -1
- data/lib/active_admin/sidebar_section.rb +4 -1
- 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 +2 -1
- data/lib/active_admin/view_helpers/breadcrumb_helper.rb +6 -5
- data/lib/active_admin/view_helpers/display_helper.rb +32 -8
- data/lib/active_admin/view_helpers/download_format_links_helper.rb +3 -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 +3 -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 +14 -11
- data/lib/active_admin/views/components/active_filters_sidebar_content.rb +59 -0
- data/lib/active_admin/views/components/attributes_table.rb +9 -8
- 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 +22 -20
- 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 -3
- data/lib/active_admin/views/components/site_title.rb +2 -1
- data/lib/active_admin/views/components/status_tag.rb +14 -26
- data/lib/active_admin/views/components/table_for.rb +21 -19
- data/lib/active_admin/views/components/tabs.rb +14 -4
- data/lib/active_admin/views/components/unsupported_browser.rb +1 -0
- data/lib/active_admin/views/footer.rb +4 -2
- 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 +27 -22
- data/lib/active_admin/views/pages/base.rb +25 -14
- 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 +2 -7
- 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 +67 -63
- 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.js +1 -0
- 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 +19 -8
- data/lib/generators/active_admin/install/templates/active_admin.rb.erb +62 -3
- data/lib/generators/active_admin/install/templates/dashboard.rb +3 -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 +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 +40 -37
- 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/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 +115 -173
- data/.circleci/config.yml +0 -572
- data/.github/ISSUE_TEMPLATE.md +0 -20
- data/.gitignore +0 -16
- data/.mdlrc +0 -1
- data/.rspec +0 -1
- data/.rspec_parallel +0 -2
- data/.rubocop.yml +0 -99
- data/.simplecov +0 -9
- data/.yardopts +0 -7
- data/Gemfile +0 -30
- data/Gemfile.common +0 -26
- data/Gemfile.lock +0 -433
- data/Rakefile +0 -24
- data/activeadmin.gemspec +0 -32
- 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.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/config/i18n-tasks.yml +0 -26
- data/config/mdl_style.rb +0 -11
- data/cucumber.yml +0 -7
- data/docs/.gitignore +0 -1
- data/docs/0-installation.md +0 -118
- data/docs/1-general-configuration.md +0 -204
- data/docs/10-custom-pages.md +0 -150
- data/docs/11-decorators.md +0 -59
- data/docs/12-arbre-components.md +0 -201
- data/docs/13-authorization-adapter.md +0 -285
- data/docs/14-gotchas.md +0 -138
- data/docs/2-resource-customization.md +0 -466
- data/docs/3-index-pages/custom-index.md +0 -35
- data/docs/3-index-pages/index-as-block.md +0 -19
- data/docs/3-index-pages/index-as-blog.md +0 -69
- data/docs/3-index-pages/index-as-grid.md +0 -27
- data/docs/3-index-pages/index-as-table.md +0 -227
- data/docs/3-index-pages.md +0 -328
- data/docs/4-csv-format.md +0 -74
- data/docs/5-forms.md +0 -232
- data/docs/6-show-pages.md +0 -81
- data/docs/7-sidebars.md +0 -75
- data/docs/8-custom-actions.md +0 -177
- data/docs/9-batch-actions.md +0 -237
- data/docs/CNAME +0 -1
- data/docs/Gemfile +0 -4
- data/docs/Gemfile.lock +0 -249
- data/docs/README.md +0 -24
- data/docs/_config.yml +0 -2
- data/docs/_includes/footer.html +0 -8
- data/docs/_includes/google-analytics.html +0 -16
- data/docs/_includes/head.html +0 -7
- data/docs/_includes/toc.html +0 -98
- data/docs/_includes/top-menu.html +0 -17
- data/docs/_layouts/default.html +0 -21
- data/docs/documentation.md +0 -60
- data/docs/images/activeadmin.png +0 -0
- data/docs/images/code-header.png +0 -0
- data/docs/images/divider.png +0 -0
- data/docs/images/features.png +0 -0
- data/docs/images/tidelift.svg +0 -14
- data/docs/index.html +0 -125
- data/docs/stylesheets/main.css +0 -1176
- data/gemfiles/rails_42.gemfile +0 -10
- data/gemfiles/rails_42.gemfile.lock +0 -339
- data/gemfiles/rails_50.gemfile +0 -10
- data/gemfiles/rails_50.gemfile.lock +0 -353
- data/gemfiles/rails_51.gemfile +0 -10
- data/gemfiles/rails_51.gemfile.lock +0 -353
- 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/lib/ransack_ext.rb +0 -20
- data/tasks/application_generator.rb +0 -50
- 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/release.rake +0 -6
- data/tasks/test.rake +0 -42
@@ -1,9 +1,11 @@
|
|
1
|
+
# frozen_string_literal: true
|
1
2
|
ActiveAdmin::Dependency.pundit!
|
2
3
|
|
3
|
-
require
|
4
|
+
require "pundit"
|
4
5
|
|
5
6
|
# Add a setting to the application to configure the pundit default policy
|
6
7
|
ActiveAdmin::Application.inheritable_setting :pundit_default_policy, nil
|
8
|
+
ActiveAdmin::Application.inheritable_setting :pundit_policy_namespace, nil
|
7
9
|
|
8
10
|
module ActiveAdmin
|
9
11
|
|
@@ -19,7 +21,7 @@ module ActiveAdmin
|
|
19
21
|
def scope_collection(collection, action = Auth::READ)
|
20
22
|
# scoping is appliable only to read/index action
|
21
23
|
# which means there is no way how to scope other actions
|
22
|
-
Pundit.policy_scope!(user, collection)
|
24
|
+
Pundit.policy_scope!(user, namespace(collection))
|
23
25
|
rescue Pundit::NotDefinedError => e
|
24
26
|
if default_policy_class && default_policy_class.const_defined?(:Scope)
|
25
27
|
default_policy_class::Scope.new(user, collection).resolve
|
@@ -29,25 +31,20 @@ module ActiveAdmin
|
|
29
31
|
end
|
30
32
|
|
31
33
|
def retrieve_policy(subject)
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
rescue Pundit::NotDefinedError => e
|
38
|
-
if default_policy_class
|
39
|
-
default_policy(user, subject)
|
34
|
+
target = policy_target(subject)
|
35
|
+
if (policy = policy(namespace(target)) || compat_policy(subject))
|
36
|
+
policy
|
37
|
+
elsif default_policy_class
|
38
|
+
default_policy(subject)
|
40
39
|
else
|
41
|
-
raise
|
40
|
+
raise Pundit::NotDefinedError, "unable to find a compatible policy for `#{target}`"
|
42
41
|
end
|
43
42
|
end
|
44
43
|
|
45
44
|
def format_action(action, subject)
|
46
|
-
# https://github.com/
|
45
|
+
# https://github.com/varvet/pundit/blob/master/lib/generators/pundit/install/templates/application_policy.rb
|
47
46
|
case action
|
48
|
-
when Auth::
|
49
|
-
when Auth::UPDATE then :update?
|
50
|
-
when Auth::READ then subject.is_a?(Class) ? :index? : :show?
|
47
|
+
when Auth::READ then subject.is_a?(Class) ? :index? : :show?
|
51
48
|
when Auth::DESTROY then subject.is_a?(Class) ? :destroy_all? : :destroy?
|
52
49
|
else "#{action}?"
|
53
50
|
end
|
@@ -55,14 +52,72 @@ module ActiveAdmin
|
|
55
52
|
|
56
53
|
private
|
57
54
|
|
55
|
+
def policy_target(subject)
|
56
|
+
case subject
|
57
|
+
when nil then resource
|
58
|
+
when Class then subject.new
|
59
|
+
else subject
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
# This method is needed to fallback to our previous policy searching logic.
|
64
|
+
# I.e.: when class name contains `default_policy_namespace` (eg: ShopAdmin)
|
65
|
+
# we should try to search it without namespace. This is because that's
|
66
|
+
# the only thing that worked in this case before we fixed our buggy namespace
|
67
|
+
# detection, so people are probably relying on it.
|
68
|
+
# This fallback might be removed in future versions of ActiveAdmin, so
|
69
|
+
# pundit_adapter search will work consistently with provided namespaces
|
70
|
+
def compat_policy(subject)
|
71
|
+
return unless default_policy_namespace
|
72
|
+
|
73
|
+
target = policy_target(subject)
|
74
|
+
|
75
|
+
return unless target.class.to_s.include?(default_policy_module) &&
|
76
|
+
(policy = policy(target))
|
77
|
+
|
78
|
+
policy_name = policy.class.to_s
|
79
|
+
|
80
|
+
Deprecation.warn "You have `pundit_policy_namespace` configured as `#{default_policy_namespace}`, " \
|
81
|
+
"but ActiveAdmin was unable to find policy #{default_policy_module}::#{policy_name}. " \
|
82
|
+
"#{policy_name} will be used instead. " \
|
83
|
+
"This behavior will be removed in future versions of ActiveAdmin. " \
|
84
|
+
"To fix this warning, move your #{policy_name} policy to the #{default_policy_module} namespace"
|
85
|
+
|
86
|
+
policy
|
87
|
+
end
|
88
|
+
|
89
|
+
def namespace(object)
|
90
|
+
if default_policy_namespace && !object.class.to_s.start_with?("#{default_policy_module}::")
|
91
|
+
[default_policy_namespace.to_sym, object]
|
92
|
+
else
|
93
|
+
object
|
94
|
+
end
|
95
|
+
end
|
96
|
+
|
58
97
|
def default_policy_class
|
59
98
|
ActiveAdmin.application.pundit_default_policy && ActiveAdmin.application.pundit_default_policy.constantize
|
60
99
|
end
|
61
100
|
|
62
|
-
def default_policy(
|
101
|
+
def default_policy(subject)
|
63
102
|
default_policy_class.new(user, subject)
|
64
103
|
end
|
65
104
|
|
105
|
+
def default_policy_namespace
|
106
|
+
ActiveAdmin.application.pundit_policy_namespace
|
107
|
+
end
|
108
|
+
|
109
|
+
def default_policy_module
|
110
|
+
default_policy_namespace.to_s.camelize
|
111
|
+
end
|
112
|
+
|
113
|
+
def policy(target)
|
114
|
+
policies[target] ||= Pundit.policy(user, target)
|
115
|
+
end
|
116
|
+
|
117
|
+
def policies
|
118
|
+
@policies ||= {}
|
119
|
+
end
|
120
|
+
|
66
121
|
end
|
67
122
|
|
68
123
|
end
|
@@ -1,4 +1,5 @@
|
|
1
|
-
|
1
|
+
# frozen_string_literal: true
|
2
|
+
require "active_admin/helpers/optional_display"
|
2
3
|
|
3
4
|
module ActiveAdmin
|
4
5
|
|
@@ -64,7 +65,7 @@ module ActiveAdmin
|
|
64
65
|
# Adds the default New link on index
|
65
66
|
def add_default_new_action_item
|
66
67
|
add_action_item :new, only: :index do
|
67
|
-
if controller.action_methods.include?(
|
68
|
+
if controller.action_methods.include?("new") && authorized?(ActiveAdmin::Auth::NEW, active_admin_config.resource_class)
|
68
69
|
localizer = ActiveAdmin::Localizers.resource(active_admin_config)
|
69
70
|
link_to localizer.t(:new_model), new_resource_path
|
70
71
|
end
|
@@ -74,7 +75,7 @@ module ActiveAdmin
|
|
74
75
|
# Adds the default Edit link on show
|
75
76
|
def add_default_edit_action_item
|
76
77
|
add_action_item :edit, only: :show do
|
77
|
-
if controller.action_methods.include?(
|
78
|
+
if controller.action_methods.include?("edit") && authorized?(ActiveAdmin::Auth::EDIT, resource)
|
78
79
|
localizer = ActiveAdmin::Localizers.resource(active_admin_config)
|
79
80
|
link_to localizer.t(:edit_model), edit_resource_path(resource)
|
80
81
|
end
|
@@ -84,10 +85,10 @@ module ActiveAdmin
|
|
84
85
|
# Adds the default Destroy link on show
|
85
86
|
def add_default_show_action_item
|
86
87
|
add_action_item :destroy, only: :show do
|
87
|
-
if controller.action_methods.include?(
|
88
|
+
if controller.action_methods.include?("destroy") && authorized?(ActiveAdmin::Auth::DESTROY, resource)
|
88
89
|
localizer = ActiveAdmin::Localizers.resource(active_admin_config)
|
89
90
|
link_to localizer.t(:delete_model), resource_path(resource), method: :delete,
|
90
|
-
|
91
|
+
data: { confirm: localizer.t(:delete_confirmation) }
|
91
92
|
end
|
92
93
|
end
|
93
94
|
end
|
@@ -1,3 +1,4 @@
|
|
1
|
+
# frozen_string_literal: true
|
1
2
|
module ActiveAdmin
|
2
3
|
|
3
4
|
class Resource
|
@@ -18,13 +19,13 @@ module ActiveAdmin
|
|
18
19
|
|
19
20
|
def foreign_methods
|
20
21
|
@foreign_methods ||= resource_class.reflect_on_all_associations.
|
21
|
-
select{ |r| r.macro == :belongs_to }.
|
22
|
-
reject{ |r| r.chain.length > 2 && !r.options[:polymorphic] }.
|
23
|
-
index_by{ |r| r.foreign_key.to_sym }
|
22
|
+
select { |r| r.macro == :belongs_to }.
|
23
|
+
reject { |r| r.chain.length > 2 && !r.options[:polymorphic] }.
|
24
|
+
index_by { |r| r.foreign_key.to_sym }
|
24
25
|
end
|
25
26
|
|
26
27
|
def reject_col?(c)
|
27
|
-
primary_col?(c) || sti_col?(c) || counter_cache_col?(c)
|
28
|
+
primary_col?(c) || sti_col?(c) || counter_cache_col?(c) || filtered_col?(c)
|
28
29
|
end
|
29
30
|
|
30
31
|
def primary_col?(c)
|
@@ -36,9 +37,12 @@ module ActiveAdmin
|
|
36
37
|
end
|
37
38
|
|
38
39
|
def counter_cache_col?(c)
|
39
|
-
c.name.end_with?(
|
40
|
+
c.name.end_with?("_count")
|
40
41
|
end
|
41
42
|
|
43
|
+
def filtered_col?(c)
|
44
|
+
ActiveAdmin.application.filter_attributes.include?(c.name.to_sym)
|
45
|
+
end
|
42
46
|
end
|
43
47
|
end
|
44
48
|
end
|
@@ -1,4 +1,5 @@
|
|
1
|
-
|
1
|
+
# frozen_string_literal: true
|
2
|
+
require "active_admin/resource"
|
2
3
|
|
3
4
|
module ActiveAdmin
|
4
5
|
class Resource
|
@@ -14,8 +15,13 @@ module ActiveAdmin
|
|
14
15
|
# The resource which initiated this relationship
|
15
16
|
attr_reader :owner
|
16
17
|
|
18
|
+
# The name of the relation
|
19
|
+
attr_reader :target_name
|
20
|
+
|
17
21
|
def initialize(owner, target_name, options = {})
|
18
|
-
@owner
|
22
|
+
@owner = owner
|
23
|
+
@target_name = target_name
|
24
|
+
@options = options
|
19
25
|
end
|
20
26
|
|
21
27
|
# Returns the target resource class or raises an exception if it doesn't exist
|
@@ -41,7 +47,7 @@ module ActiveAdmin
|
|
41
47
|
end
|
42
48
|
|
43
49
|
def to_param
|
44
|
-
:"#{@target_name}_id"
|
50
|
+
(@options[:param] || "#{@target_name}_id").to_sym
|
45
51
|
end
|
46
52
|
end
|
47
53
|
end
|
@@ -1,3 +1,4 @@
|
|
1
|
+
# frozen_string_literal: true
|
1
2
|
module ActiveAdmin
|
2
3
|
class Resource
|
3
4
|
module Controllers
|
@@ -6,7 +7,7 @@ module ActiveAdmin
|
|
6
7
|
# Returns a properly formatted controller name for this
|
7
8
|
# config within its namespace
|
8
9
|
def controller_name
|
9
|
-
[namespace.module_name, resource_name.plural.camelize + "Controller"].compact.join(
|
10
|
+
[namespace.module_name, resource_name.plural.camelize + "Controller"].compact.join("::")
|
10
11
|
end
|
11
12
|
|
12
13
|
# Returns the controller for this config
|
@@ -1,3 +1,4 @@
|
|
1
|
+
# frozen_string_literal: true
|
1
2
|
module ActiveAdmin
|
2
3
|
class Resource
|
3
4
|
|
@@ -7,12 +8,12 @@ module ActiveAdmin
|
|
7
8
|
# To disable this menu item, call `menu(false)` from the DSL
|
8
9
|
def menu_item_options=(options)
|
9
10
|
if options == false
|
10
|
-
@include_in_menu
|
11
|
+
@include_in_menu = false
|
11
12
|
@menu_item_options = {}
|
12
13
|
else
|
13
14
|
@include_in_menu = true
|
14
15
|
@navigation_menu_name = options[:menu_name]
|
15
|
-
@menu_item_options
|
16
|
+
@menu_item_options = default_menu_options.merge options
|
16
17
|
end
|
17
18
|
end
|
18
19
|
|
@@ -26,9 +27,9 @@ module ActiveAdmin
|
|
26
27
|
resource = self
|
27
28
|
{
|
28
29
|
id: resource_name.plural,
|
29
|
-
label: proc{ resource.plural_resource_label },
|
30
|
-
url:
|
31
|
-
if:
|
30
|
+
label: proc { resource.plural_resource_label },
|
31
|
+
url: proc { resource.route_collection_path(params, url_options) },
|
32
|
+
if: proc { authorized?(Auth::READ, menu_resource_class) }
|
32
33
|
}
|
33
34
|
end
|
34
35
|
|
@@ -0,0 +1,16 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
module ActiveAdmin
|
3
|
+
class Model
|
4
|
+
def initialize(resource, record)
|
5
|
+
@record = record
|
6
|
+
|
7
|
+
if resource
|
8
|
+
@record.extend(resource.resource_name_extension)
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
def to_model
|
13
|
+
@record
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
@@ -1,10 +1,11 @@
|
|
1
|
+
# frozen_string_literal: true
|
1
2
|
module ActiveAdmin
|
2
3
|
class Resource
|
3
4
|
|
4
5
|
module Naming
|
5
6
|
def resource_name
|
6
7
|
@resource_name ||= begin
|
7
|
-
as = @options[:as].gsub /\s/,
|
8
|
+
as = @options[:as].gsub /\s/, "" if @options[:as]
|
8
9
|
|
9
10
|
if as || !resource_class.respond_to?(:model_name)
|
10
11
|
Name.new resource_class, as
|
@@ -17,13 +18,13 @@ module ActiveAdmin
|
|
17
18
|
# Returns the name to call this resource such as "Bank Account"
|
18
19
|
def resource_label
|
19
20
|
resource_name.translate count: 1,
|
20
|
-
|
21
|
+
default: resource_name.to_s.gsub("::", " ").titleize
|
21
22
|
end
|
22
23
|
|
23
24
|
# Returns the plural version of this resource such as "Bank Accounts"
|
24
25
|
def plural_resource_label(options = {})
|
25
|
-
defaults = {count:
|
26
|
-
|
26
|
+
defaults = { count: Helpers::I18n::PLURAL_MANY_COUNT,
|
27
|
+
default: resource_label.pluralize.titleize }
|
27
28
|
resource_name.translate defaults.merge options
|
28
29
|
end
|
29
30
|
|
@@ -46,7 +47,7 @@ module ActiveAdmin
|
|
46
47
|
end
|
47
48
|
|
48
49
|
def translate(options = {})
|
49
|
-
I18n.t i18n_key, {scope: [:activerecord, :models]}.merge(options)
|
50
|
+
I18n.t i18n_key, **{ scope: [:activerecord, :models] }.merge(options)
|
50
51
|
end
|
51
52
|
|
52
53
|
def route_key
|
@@ -1,3 +1,4 @@
|
|
1
|
+
# frozen_string_literal: true
|
1
2
|
module ActiveAdmin
|
2
3
|
class Resource
|
3
4
|
module Routes
|
@@ -20,7 +21,11 @@ module ActiveAdmin
|
|
20
21
|
end
|
21
22
|
|
22
23
|
def route_edit_instance_path(resource, additional_params = {})
|
23
|
-
route_builder.
|
24
|
+
route_builder.member_action_path(:edit, resource, additional_params)
|
25
|
+
end
|
26
|
+
|
27
|
+
def route_member_action_path(action, resource, additional_params = {})
|
28
|
+
route_builder.member_action_path(action, resource, additional_params)
|
24
29
|
end
|
25
30
|
|
26
31
|
# Returns the routes prefix for this config
|
@@ -38,8 +43,6 @@ module ActiveAdmin
|
|
38
43
|
config[:route_collection_name] == config[:route_instance_name]
|
39
44
|
end
|
40
45
|
|
41
|
-
private
|
42
|
-
|
43
46
|
class RouteBuilder
|
44
47
|
def initialize(resource)
|
45
48
|
@resource = resource
|
@@ -75,12 +78,13 @@ module ActiveAdmin
|
|
75
78
|
routes.public_send route_name, *route_instance_params(instance), additional_params
|
76
79
|
end
|
77
80
|
|
78
|
-
# @return [String] the path to the
|
81
|
+
# @return [String] the path to the member action of this resource
|
82
|
+
# @param action [Symbol]
|
79
83
|
# @param instance [ActiveRecord::Base] the instance we want the path of
|
80
84
|
# @example "/admin/posts/1/edit"
|
81
|
-
def
|
85
|
+
def member_action_path(action, instance, additional_params = {})
|
82
86
|
path = resource.resources_configuration[:self][:route_instance_name]
|
83
|
-
route_name = route_name(path, action:
|
87
|
+
route_name = route_name(path, action: action)
|
84
88
|
|
85
89
|
routes.public_send route_name, *route_instance_params(instance), additional_params
|
86
90
|
end
|
@@ -93,19 +97,19 @@ module ActiveAdmin
|
|
93
97
|
suffix = options[:suffix] || "path"
|
94
98
|
route = []
|
95
99
|
|
96
|
-
route << options[:action]
|
97
|
-
route << resource.route_prefix
|
100
|
+
route << options[:action] # "batch_action", "edit" or "new"
|
101
|
+
route << resource.route_prefix # "admin"
|
98
102
|
route << belongs_to_name if nested? # "category"
|
99
|
-
route << resource_path_name
|
100
|
-
route << suffix
|
103
|
+
route << resource_path_name # "posts" or "post"
|
104
|
+
route << suffix # "path" or "index path"
|
101
105
|
|
102
|
-
route.compact.join(
|
106
|
+
route.compact.join("_").to_sym # :admin_category_posts_path
|
103
107
|
end
|
104
108
|
|
105
109
|
# @return params to pass to instance path
|
106
110
|
def route_instance_params(instance)
|
107
111
|
if nested?
|
108
|
-
[instance.public_send(
|
112
|
+
[instance.public_send(belongs_to_target_name).to_param, instance.to_param]
|
109
113
|
else
|
110
114
|
instance.to_param
|
111
115
|
end
|
@@ -118,11 +122,19 @@ module ActiveAdmin
|
|
118
122
|
end
|
119
123
|
|
120
124
|
def nested?
|
121
|
-
resource.belongs_to? &&
|
125
|
+
resource.belongs_to? && belongs_to_config.required?
|
126
|
+
end
|
127
|
+
|
128
|
+
def belongs_to_target_name
|
129
|
+
belongs_to_config.target_name
|
122
130
|
end
|
123
131
|
|
124
132
|
def belongs_to_name
|
125
|
-
|
133
|
+
belongs_to_config.target.resource_name.singular
|
134
|
+
end
|
135
|
+
|
136
|
+
def belongs_to_config
|
137
|
+
resource.belongs_to_config
|
126
138
|
end
|
127
139
|
|
128
140
|
def routes
|
@@ -1,3 +1,4 @@
|
|
1
|
+
# frozen_string_literal: true
|
1
2
|
module ActiveAdmin
|
2
3
|
class Resource
|
3
4
|
module ScopeTo
|
@@ -38,10 +39,10 @@ module ActiveAdmin
|
|
38
39
|
options = args.extract_options!
|
39
40
|
method = args.first
|
40
41
|
|
41
|
-
scope_to_config[:method]
|
42
|
-
scope_to_config[:association_method]
|
43
|
-
scope_to_config[:if]
|
44
|
-
scope_to_config[:unless]
|
42
|
+
scope_to_config[:method] = block || method
|
43
|
+
scope_to_config[:association_method] = options[:association_method]
|
44
|
+
scope_to_config[:if] = options[:if]
|
45
|
+
scope_to_config[:unless] = options[:unless]
|
45
46
|
|
46
47
|
end
|
47
48
|
|
@@ -55,10 +56,10 @@ module ActiveAdmin
|
|
55
56
|
|
56
57
|
def scope_to_config
|
57
58
|
@scope_to_config ||= {
|
58
|
-
method:
|
59
|
+
method: nil,
|
59
60
|
association_method: nil,
|
60
|
-
if:
|
61
|
-
unless:
|
61
|
+
if: nil,
|
62
|
+
unless: nil
|
62
63
|
}
|
63
64
|
end
|
64
65
|
|
@@ -1,3 +1,4 @@
|
|
1
|
+
# frozen_string_literal: true
|
1
2
|
module ActiveAdmin
|
2
3
|
class Resource
|
3
4
|
module Scopes
|
@@ -10,7 +11,7 @@ module ActiveAdmin
|
|
10
11
|
# Returns a scope for this object by its identifier
|
11
12
|
def get_scope_by_id(id)
|
12
13
|
id = id.to_s
|
13
|
-
scopes.find{|s| s.id == id }
|
14
|
+
scopes.find { |s| s.id == id }
|
14
15
|
end
|
15
16
|
|
16
17
|
def default_scope(context = nil)
|
@@ -27,7 +28,7 @@ module ActiveAdmin
|
|
27
28
|
# If you want to internationalize the scope name, you can add
|
28
29
|
# to your i18n files a key like "active_admin.scopes.scope_method".
|
29
30
|
def scope(*args, &block)
|
30
|
-
default_options = {show_count: namespace.scopes_show_count}
|
31
|
+
default_options = { show_count: namespace.scopes_show_count }
|
31
32
|
options = default_options.merge(args.extract_options!)
|
32
33
|
title = args[0] rescue nil
|
33
34
|
method = args[1] rescue nil
|
@@ -36,7 +37,7 @@ module ActiveAdmin
|
|
36
37
|
scope = ActiveAdmin::Scope.new(title, method, options, &block)
|
37
38
|
|
38
39
|
# Finds and replaces a scope by the same name if it already exists
|
39
|
-
existing_scope_index = scopes.index{|existing_scope| existing_scope.id == scope.id }
|
40
|
+
existing_scope_index = scopes.index { |existing_scope| existing_scope.id == scope.id }
|
40
41
|
if existing_scope_index
|
41
42
|
scopes.delete_at(existing_scope_index)
|
42
43
|
scopes.insert(existing_scope_index, scope)
|
@@ -1,4 +1,5 @@
|
|
1
|
-
|
1
|
+
# frozen_string_literal: true
|
2
|
+
require "active_admin/helpers/optional_display"
|
2
3
|
|
3
4
|
module ActiveAdmin
|
4
5
|
|
@@ -14,7 +15,7 @@ module ActiveAdmin
|
|
14
15
|
end
|
15
16
|
|
16
17
|
def sidebar_sections_for(action, render_context = nil)
|
17
|
-
sidebar_sections.select{|section| section.display_on?(action, render_context) }
|
18
|
+
sidebar_sections.select { |section| section.display_on?(action, render_context) }
|
18
19
|
.sort_by(&:priority)
|
19
20
|
end
|
20
21
|
|
@@ -1,17 +1,19 @@
|
|
1
|
-
|
2
|
-
require
|
3
|
-
require
|
4
|
-
require
|
5
|
-
require
|
6
|
-
require
|
7
|
-
require
|
8
|
-
require
|
9
|
-
require
|
10
|
-
require
|
11
|
-
require
|
12
|
-
require
|
13
|
-
require
|
14
|
-
require
|
1
|
+
# frozen_string_literal: true
|
2
|
+
require "active_admin/resource/action_items"
|
3
|
+
require "active_admin/resource/attributes"
|
4
|
+
require "active_admin/resource/controllers"
|
5
|
+
require "active_admin/resource/menu"
|
6
|
+
require "active_admin/resource/page_presenters"
|
7
|
+
require "active_admin/resource/pagination"
|
8
|
+
require "active_admin/resource/routes"
|
9
|
+
require "active_admin/resource/naming"
|
10
|
+
require "active_admin/resource/scopes"
|
11
|
+
require "active_admin/resource/includes"
|
12
|
+
require "active_admin/resource/scope_to"
|
13
|
+
require "active_admin/resource/sidebars"
|
14
|
+
require "active_admin/resource/belongs_to"
|
15
|
+
require "active_admin/resource/ordering"
|
16
|
+
require "active_admin/resource/model"
|
15
17
|
|
16
18
|
module ActiveAdmin
|
17
19
|
|
@@ -26,7 +28,7 @@ module ActiveAdmin
|
|
26
28
|
class Resource
|
27
29
|
|
28
30
|
# Event dispatched when a new resource is registered
|
29
|
-
RegisterEvent =
|
31
|
+
RegisterEvent = "active_admin.resource.register".freeze
|
30
32
|
|
31
33
|
# The namespace this config belongs to
|
32
34
|
attr_reader :namespace
|
@@ -43,7 +45,7 @@ module ActiveAdmin
|
|
43
45
|
# The default sort order to use in the controller
|
44
46
|
attr_writer :sort_order
|
45
47
|
def sort_order
|
46
|
-
@sort_order ||= (resource_class.respond_to?(:primary_key) ? resource_class.primary_key.to_s :
|
48
|
+
@sort_order ||= (resource_class.respond_to?(:primary_key) ? resource_class.primary_key.to_s : "id") + "_desc"
|
47
49
|
end
|
48
50
|
|
49
51
|
# Set the configuration for the CSV
|
@@ -69,9 +71,10 @@ module ActiveAdmin
|
|
69
71
|
def initialize(namespace, resource_class, options = {})
|
70
72
|
@namespace = namespace
|
71
73
|
@resource_class_name = "::#{resource_class.name}"
|
72
|
-
@options
|
74
|
+
@options = options
|
73
75
|
@sort_order = options[:sort_order]
|
74
|
-
@member_actions
|
76
|
+
@member_actions = []
|
77
|
+
@collection_actions = []
|
75
78
|
end
|
76
79
|
end
|
77
80
|
|
@@ -96,11 +99,15 @@ module ActiveAdmin
|
|
96
99
|
# The class this resource wraps. If you register the Post model, Resource#resource_class
|
97
100
|
# will point to the Post class
|
98
101
|
def resource_class
|
99
|
-
|
102
|
+
resource_class_name.constantize
|
100
103
|
end
|
101
104
|
|
102
105
|
def decorator_class
|
103
|
-
|
106
|
+
decorator_class_name&.constantize
|
107
|
+
end
|
108
|
+
|
109
|
+
def resource_name_extension
|
110
|
+
@resource_name_extension ||= define_resource_name_extension(self)
|
104
111
|
end
|
105
112
|
|
106
113
|
def resource_table_name
|
@@ -132,6 +139,7 @@ module ActiveAdmin
|
|
132
139
|
def belongs_to(target, options = {})
|
133
140
|
@belongs_to = Resource::BelongsTo.new(self, target, options)
|
134
141
|
self.menu_item_options = false if @belongs_to.required?
|
142
|
+
options[:class_name] ||= @belongs_to.resource.resource_class_name if @belongs_to.resource
|
135
143
|
controller.send :belongs_to, target, options.dup
|
136
144
|
end
|
137
145
|
|
@@ -181,11 +189,11 @@ module ActiveAdmin
|
|
181
189
|
end
|
182
190
|
|
183
191
|
def association_columns
|
184
|
-
@association_columns ||= resource_attributes.select{ |key, value| key != value }.values
|
192
|
+
@association_columns ||= resource_attributes.select { |key, value| key != value }.values
|
185
193
|
end
|
186
194
|
|
187
195
|
def content_columns
|
188
|
-
@content_columns ||= resource_attributes.select{ |key, value| key == value }.values
|
196
|
+
@content_columns ||= resource_attributes.select { |key, value| key == value }.values
|
189
197
|
end
|
190
198
|
|
191
199
|
private
|
@@ -202,5 +210,12 @@ module ActiveAdmin
|
|
202
210
|
@default_csv_builder ||= CSVBuilder.default_for_resource(self)
|
203
211
|
end
|
204
212
|
|
213
|
+
def define_resource_name_extension(resource)
|
214
|
+
Module.new do
|
215
|
+
define_method :model_name do
|
216
|
+
resource.resource_name
|
217
|
+
end
|
218
|
+
end
|
219
|
+
end
|
205
220
|
end # class Resource
|
206
221
|
end # module ActiveAdmin
|
@@ -1,3 +1,4 @@
|
|
1
|
+
# frozen_string_literal: true
|
1
2
|
module ActiveAdmin
|
2
3
|
# This is a container for resources, which acts much like a Hash.
|
3
4
|
# It's assumed that an added resource responds to `resource_name`.
|
@@ -38,12 +39,12 @@ module ActiveAdmin
|
|
38
39
|
r.resource_class.to_s == obj.to_s
|
39
40
|
end ||
|
40
41
|
if obj.respond_to? :base_class
|
41
|
-
resources.detect{ |r| r.resource_class.to_s == obj.base_class.to_s }
|
42
|
+
resources.detect { |r| r.resource_class.to_s == obj.base_class.to_s }
|
42
43
|
end
|
43
44
|
end
|
44
45
|
|
45
46
|
def resources
|
46
|
-
select{ |r| r.class <= Resource } # can otherwise be a Page
|
47
|
+
select { |r| r.class <= Resource } # can otherwise be a Page
|
47
48
|
end
|
48
49
|
|
49
50
|
def raise_if_mismatched!(existing, given)
|