activeadmin 2.2.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 +7 -0
- data/CHANGELOG.md +546 -0
- data/CODE_OF_CONDUCT.md +74 -0
- data/CONTRIBUTING.md +217 -0
- data/LICENSE +20 -0
- data/README.md +110 -0
- 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 +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 +55 -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/_base.scss +41 -0
- data/app/assets/stylesheets/active_admin/_forms.scss +326 -0
- data/app/assets/stylesheets/active_admin/_header.scss +156 -0
- data/app/assets/stylesheets/active_admin/_mixins.scss +1 -0
- data/app/assets/stylesheets/active_admin/_typography.scss +100 -0
- data/app/assets/stylesheets/active_admin/components/_batch_actions.scss +6 -0
- data/app/assets/stylesheets/active_admin/components/_blank_slates.scss +30 -0
- data/app/assets/stylesheets/active_admin/components/_breadcrumbs.scss +20 -0
- data/app/assets/stylesheets/active_admin/components/_buttons.scss +6 -0
- data/app/assets/stylesheets/active_admin/components/_columns.scss +3 -0
- data/app/assets/stylesheets/active_admin/components/_comments.scss +41 -0
- data/app/assets/stylesheets/active_admin/components/_date_picker.scss +149 -0
- data/app/assets/stylesheets/active_admin/components/_dropdown_menu.scss +152 -0
- data/app/assets/stylesheets/active_admin/components/_flash_messages.scss +37 -0
- data/app/assets/stylesheets/active_admin/components/_grid.scss +9 -0
- data/app/assets/stylesheets/active_admin/components/_index_list.scss +12 -0
- data/app/assets/stylesheets/active_admin/components/_links.scss +5 -0
- data/app/assets/stylesheets/active_admin/components/_modal_dialog.scss +34 -0
- data/app/assets/stylesheets/active_admin/components/_pagination.scss +55 -0
- data/app/assets/stylesheets/active_admin/components/_panels.scss +6 -0
- data/app/assets/stylesheets/active_admin/components/_scopes.scss +13 -0
- data/app/assets/stylesheets/active_admin/components/_status_tags.scss +12 -0
- data/app/assets/stylesheets/active_admin/components/_table_tools.scss +67 -0
- data/app/assets/stylesheets/active_admin/components/_tables.scss +113 -0
- data/app/assets/stylesheets/active_admin/components/_tabs.scss +65 -0
- data/app/assets/stylesheets/active_admin/components/_unsupported_browser.scss +16 -0
- data/app/assets/stylesheets/active_admin/mixins/_all.scss +8 -0
- data/app/assets/stylesheets/active_admin/mixins/_buttons.scss +65 -0
- data/app/assets/stylesheets/active_admin/mixins/_gradients.scss +28 -0
- data/app/assets/stylesheets/active_admin/mixins/_rounded.scss +22 -0
- data/app/assets/stylesheets/active_admin/mixins/_sections.scss +41 -0
- data/app/assets/stylesheets/active_admin/mixins/_shadows.scss +15 -0
- data/app/assets/stylesheets/active_admin/mixins/_typography.scss +3 -0
- data/app/assets/stylesheets/active_admin/mixins/_utilities.scss +17 -0
- data/app/assets/stylesheets/active_admin/mixins/_variables.scss +34 -0
- data/app/assets/stylesheets/active_admin/pages/_logged_out.scss +44 -0
- data/app/assets/stylesheets/active_admin/print.scss +287 -0
- data/app/assets/stylesheets/active_admin/structure/_footer.scss +14 -0
- data/app/assets/stylesheets/active_admin/structure/_main_structure.scss +29 -0
- data/app/assets/stylesheets/active_admin/structure/_title_bar.scss +41 -0
- data/app/views/active_admin/devise/confirmations/new.html.erb +15 -0
- data/app/views/active_admin/devise/mailer/reset_password_instructions.html.erb +8 -0
- data/app/views/active_admin/devise/mailer/unlock_instructions.html.erb +7 -0
- data/app/views/active_admin/devise/passwords/edit.html.erb +18 -0
- data/app/views/active_admin/devise/passwords/new.html.erb +15 -0
- data/app/views/active_admin/devise/registrations/new.html.erb +21 -0
- data/app/views/active_admin/devise/sessions/new.html.erb +20 -0
- data/app/views/active_admin/devise/shared/_error_messages.html.erb +15 -0
- data/app/views/active_admin/devise/shared/_links.erb +33 -0
- data/app/views/active_admin/devise/unlocks/new.html.erb +15 -0
- 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/_first_page.html.erb +11 -0
- data/app/views/kaminari/active_admin/_gap.html.erb +8 -0
- data/app/views/kaminari/active_admin/_last_page.html.erb +11 -0
- data/app/views/kaminari/active_admin/_next_page.html.erb +11 -0
- data/app/views/kaminari/active_admin/_page.html.erb +12 -0
- data/app/views/kaminari/active_admin/_paginator.html.erb +25 -0
- data/app/views/kaminari/active_admin/_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 +39 -0
- data/config/locales/ar.yml +135 -0
- data/config/locales/bg.yml +119 -0
- data/config/locales/bs.yml +121 -0
- data/config/locales/ca.yml +106 -0
- data/config/locales/cs.yml +109 -0
- data/config/locales/da.yml +137 -0
- data/config/locales/de-CH.yml +101 -0
- data/config/locales/de.yml +144 -0
- data/config/locales/el.yml +126 -0
- data/config/locales/en-CA.yml +139 -0
- data/config/locales/en-GB.yml +139 -0
- data/config/locales/en.yml +162 -0
- data/config/locales/eo.yml +145 -0
- data/config/locales/es-MX.yml +96 -0
- data/config/locales/es.yml +162 -0
- data/config/locales/fa.yml +119 -0
- data/config/locales/fi.yml +112 -0
- data/config/locales/fr.yml +141 -0
- data/config/locales/he.yml +141 -0
- data/config/locales/hr.yml +123 -0
- data/config/locales/hu.yml +102 -0
- data/config/locales/id.yml +135 -0
- data/config/locales/it.yml +144 -0
- data/config/locales/ja.yml +141 -0
- data/config/locales/ko.yml +120 -0
- data/config/locales/lt.yml +142 -0
- data/config/locales/lv.yml +92 -0
- data/config/locales/mk.yml +134 -0
- data/config/locales/nb.yml +130 -0
- data/config/locales/nl.yml +144 -0
- data/config/locales/pl.yml +168 -0
- data/config/locales/pt-BR.yml +143 -0
- data/config/locales/pt-PT.yml +92 -0
- data/config/locales/ro.yml +96 -0
- data/config/locales/ru.yml +141 -0
- data/config/locales/sk.yml +109 -0
- data/config/locales/sv-SE.yml +135 -0
- data/config/locales/tr.yml +144 -0
- data/config/locales/uk.yml +138 -0
- data/config/locales/vi.yml +134 -0
- data/config/locales/zh-CN.yml +143 -0
- data/config/locales/zh-TW.yml +135 -0
- data/docs/.gitignore +1 -0
- data/docs/0-installation.md +118 -0
- data/docs/1-general-configuration.md +204 -0
- data/docs/10-custom-pages.md +150 -0
- data/docs/11-decorators.md +59 -0
- data/docs/12-arbre-components.md +214 -0
- data/docs/13-authorization-adapter.md +285 -0
- data/docs/14-gotchas.md +138 -0
- data/docs/2-resource-customization.md +466 -0
- data/docs/3-index-pages.md +328 -0
- data/docs/3-index-pages/custom-index.md +35 -0
- data/docs/3-index-pages/index-as-block.md +19 -0
- data/docs/3-index-pages/index-as-blog.md +69 -0
- data/docs/3-index-pages/index-as-grid.md +27 -0
- data/docs/3-index-pages/index-as-table.md +227 -0
- data/docs/4-csv-format.md +74 -0
- data/docs/5-forms.md +232 -0
- data/docs/6-show-pages.md +81 -0
- data/docs/7-sidebars.md +75 -0
- data/docs/8-custom-actions.md +177 -0
- data/docs/9-batch-actions.md +237 -0
- data/docs/CNAME +1 -0
- data/docs/Gemfile +4 -0
- data/docs/Gemfile.lock +249 -0
- data/docs/README.md +24 -0
- data/docs/_config.yml +2 -0
- data/docs/_includes/footer.html +8 -0
- data/docs/_includes/google-analytics.html +16 -0
- data/docs/_includes/head.html +7 -0
- data/docs/_includes/toc.html +98 -0
- data/docs/_includes/top-menu.html +17 -0
- data/docs/_layouts/default.html +21 -0
- data/docs/documentation.md +60 -0
- 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 +14 -0
- data/docs/index.html +125 -0
- data/docs/stylesheets/main.css +1176 -0
- data/lib/active_admin.rb +134 -0
- data/lib/active_admin/abstract_view_factory.rb +47 -0
- data/lib/active_admin/application.rb +234 -0
- data/lib/active_admin/application_settings.rb +42 -0
- data/lib/active_admin/asset_registration.rb +29 -0
- data/lib/active_admin/authorization_adapter.rb +129 -0
- data/lib/active_admin/base_controller.rb +81 -0
- data/lib/active_admin/base_controller/authorization.rb +127 -0
- data/lib/active_admin/base_controller/menu.rb +34 -0
- data/lib/active_admin/batch_actions.rb +16 -0
- data/lib/active_admin/batch_actions/controller.rb +40 -0
- data/lib/active_admin/batch_actions/resource_extension.rb +155 -0
- data/lib/active_admin/batch_actions/views/batch_action_form.rb +38 -0
- data/lib/active_admin/batch_actions/views/batch_action_selector.rb +58 -0
- data/lib/active_admin/batch_actions/views/selection_cells.rb +38 -0
- data/lib/active_admin/callbacks.rb +88 -0
- data/lib/active_admin/cancan_adapter.rb +36 -0
- data/lib/active_admin/component.rb +5 -0
- data/lib/active_admin/controller_action.rb +13 -0
- data/lib/active_admin/csv_builder.rb +133 -0
- data/lib/active_admin/dependency.rb +100 -0
- data/lib/active_admin/deprecation.rb +10 -0
- data/lib/active_admin/devise.rb +80 -0
- data/lib/active_admin/dsl.rb +160 -0
- data/lib/active_admin/dynamic_setting.rb +38 -0
- data/lib/active_admin/dynamic_settings_node.rb +28 -0
- data/lib/active_admin/engine.rb +21 -0
- data/lib/active_admin/error.rb +64 -0
- data/lib/active_admin/filters.rb +11 -0
- data/lib/active_admin/filters/active.rb +29 -0
- data/lib/active_admin/filters/active_filter.rb +124 -0
- data/lib/active_admin/filters/active_sidebar.rb +54 -0
- data/lib/active_admin/filters/dsl.rb +21 -0
- data/lib/active_admin/filters/forms.rb +85 -0
- data/lib/active_admin/filters/formtastic_addons.rb +79 -0
- data/lib/active_admin/filters/resource_extension.rb +155 -0
- data/lib/active_admin/form_builder.rb +182 -0
- data/lib/active_admin/generators/boilerplate.rb +45 -0
- data/lib/active_admin/helpers/collection.rb +19 -0
- data/lib/active_admin/helpers/i18n.rb +7 -0
- data/lib/active_admin/helpers/optional_display.rb +38 -0
- data/lib/active_admin/helpers/routes/url_helpers.rb +15 -0
- data/lib/active_admin/helpers/scope_chain.rb +24 -0
- data/lib/active_admin/inputs.rb +21 -0
- data/lib/active_admin/inputs/datepicker_input.rb +27 -0
- data/lib/active_admin/inputs/filters/base.rb +44 -0
- data/lib/active_admin/inputs/filters/base/search_method_select.rb +75 -0
- data/lib/active_admin/inputs/filters/boolean_input.rb +24 -0
- data/lib/active_admin/inputs/filters/check_boxes_input.rb +50 -0
- data/lib/active_admin/inputs/filters/date_picker_input.rb +13 -0
- data/lib/active_admin/inputs/filters/date_range_input.rb +49 -0
- data/lib/active_admin/inputs/filters/numeric_input.rb +12 -0
- data/lib/active_admin/inputs/filters/select_input.rb +58 -0
- data/lib/active_admin/inputs/filters/string_input.rb +26 -0
- data/lib/active_admin/inputs/filters/text_input.rb +25 -0
- data/lib/active_admin/localizers.rb +11 -0
- data/lib/active_admin/localizers/resource_localizer.rb +35 -0
- data/lib/active_admin/menu.rb +102 -0
- data/lib/active_admin/menu_collection.rb +91 -0
- data/lib/active_admin/menu_item.rb +69 -0
- data/lib/active_admin/namespace.rb +266 -0
- data/lib/active_admin/namespace_settings.rb +110 -0
- data/lib/active_admin/order_clause.rb +48 -0
- data/lib/active_admin/orm/active_record.rb +5 -0
- data/lib/active_admin/orm/active_record/comments.rb +101 -0
- data/lib/active_admin/orm/active_record/comments/comment.rb +31 -0
- data/lib/active_admin/orm/active_record/comments/namespace_helper.rb +14 -0
- data/lib/active_admin/orm/active_record/comments/resource_helper.rb +17 -0
- data/lib/active_admin/orm/active_record/comments/show_page_helper.rb +23 -0
- data/lib/active_admin/orm/active_record/comments/views.rb +2 -0
- data/lib/active_admin/orm/active_record/comments/views/active_admin_comments.rb +100 -0
- data/lib/active_admin/orm/mongoid.rb +1 -0
- data/lib/active_admin/orm/mongoid/.gitkeep +0 -0
- data/lib/active_admin/page.rb +111 -0
- data/lib/active_admin/page_controller.rb +29 -0
- data/lib/active_admin/page_dsl.rb +32 -0
- data/lib/active_admin/page_presenter.rb +33 -0
- data/lib/active_admin/pundit_adapter.rb +81 -0
- data/lib/active_admin/resource.rb +207 -0
- data/lib/active_admin/resource/action_items.rb +120 -0
- data/lib/active_admin/resource/attributes.rb +47 -0
- data/lib/active_admin/resource/belongs_to.rb +50 -0
- data/lib/active_admin/resource/controllers.rb +19 -0
- data/lib/active_admin/resource/includes.rb +12 -0
- data/lib/active_admin/resource/menu.rb +67 -0
- data/lib/active_admin/resource/naming.rb +62 -0
- data/lib/active_admin/resource/ordering.rb +11 -0
- data/lib/active_admin/resource/page_presenters.rb +82 -0
- data/lib/active_admin/resource/pagination.rb +23 -0
- data/lib/active_admin/resource/routes.rb +139 -0
- data/lib/active_admin/resource/scope_to.rb +74 -0
- data/lib/active_admin/resource/scopes.rb +52 -0
- data/lib/active_admin/resource/sidebars.rb +28 -0
- data/lib/active_admin/resource_collection.rb +72 -0
- data/lib/active_admin/resource_controller.rb +64 -0
- data/lib/active_admin/resource_controller/action_builder.rb +31 -0
- data/lib/active_admin/resource_controller/data_access.rb +322 -0
- data/lib/active_admin/resource_controller/decorators.rb +102 -0
- data/lib/active_admin/resource_controller/resource_class_methods.rb +26 -0
- data/lib/active_admin/resource_controller/scoping.rb +31 -0
- data/lib/active_admin/resource_controller/sidebars.rb +18 -0
- data/lib/active_admin/resource_controller/streaming.rb +43 -0
- data/lib/active_admin/resource_dsl.rb +224 -0
- data/lib/active_admin/router.rb +114 -0
- data/lib/active_admin/scope.rb +64 -0
- data/lib/active_admin/settings_node.rb +19 -0
- data/lib/active_admin/sidebar_section.rb +39 -0
- data/lib/active_admin/version.rb +3 -0
- data/lib/active_admin/view_factory.rb +27 -0
- data/lib/active_admin/view_helpers.rb +20 -0
- data/lib/active_admin/view_helpers/active_admin_application_helper.rb +12 -0
- data/lib/active_admin/view_helpers/auto_link_helper.rb +45 -0
- data/lib/active_admin/view_helpers/breadcrumb_helper.rb +33 -0
- data/lib/active_admin/view_helpers/display_helper.rb +104 -0
- data/lib/active_admin/view_helpers/download_format_links_helper.rb +59 -0
- data/lib/active_admin/view_helpers/fields_for.rb +50 -0
- data/lib/active_admin/view_helpers/flash_helper.rb +14 -0
- data/lib/active_admin/view_helpers/form_helper.rb +20 -0
- data/lib/active_admin/view_helpers/method_or_proc_helper.rb +100 -0
- data/lib/active_admin/view_helpers/scope_name_helper.rb +16 -0
- data/lib/active_admin/view_helpers/sidebar_helper.rb +15 -0
- data/lib/active_admin/view_helpers/title_helper.rb +11 -0
- data/lib/active_admin/view_helpers/view_factory_helper.rb +11 -0
- data/lib/active_admin/views.rb +8 -0
- data/lib/active_admin/views/action_items.rb +17 -0
- data/lib/active_admin/views/components/active_admin_form.rb +155 -0
- data/lib/active_admin/views/components/attributes_table.rb +94 -0
- data/lib/active_admin/views/components/blank_slate.rb +17 -0
- data/lib/active_admin/views/components/columns.rb +161 -0
- data/lib/active_admin/views/components/dropdown_menu.rb +71 -0
- data/lib/active_admin/views/components/index_list.rb +69 -0
- data/lib/active_admin/views/components/menu.rb +32 -0
- data/lib/active_admin/views/components/menu_item.rb +58 -0
- data/lib/active_admin/views/components/paginated_collection.rb +159 -0
- data/lib/active_admin/views/components/panel.rb +38 -0
- data/lib/active_admin/views/components/scopes.rb +72 -0
- data/lib/active_admin/views/components/sidebar.rb +13 -0
- data/lib/active_admin/views/components/sidebar_section.rb +34 -0
- data/lib/active_admin/views/components/site_title.rb +54 -0
- data/lib/active_admin/views/components/status_tag.rb +75 -0
- data/lib/active_admin/views/components/table_for.rb +209 -0
- data/lib/active_admin/views/components/tabs.rb +40 -0
- data/lib/active_admin/views/components/unsupported_browser.rb +11 -0
- data/lib/active_admin/views/footer.rb +30 -0
- data/lib/active_admin/views/header.rb +19 -0
- data/lib/active_admin/views/index_as_block.rb +36 -0
- data/lib/active_admin/views/index_as_blog.rb +155 -0
- data/lib/active_admin/views/index_as_grid.rb +80 -0
- data/lib/active_admin/views/index_as_table.rb +392 -0
- data/lib/active_admin/views/pages/base.rb +126 -0
- data/lib/active_admin/views/pages/form.rb +64 -0
- data/lib/active_admin/views/pages/index.rb +163 -0
- data/lib/active_admin/views/pages/layout.rb +26 -0
- data/lib/active_admin/views/pages/page.rb +30 -0
- data/lib/active_admin/views/pages/show.rb +65 -0
- data/lib/active_admin/views/tabbed_navigation.rb +11 -0
- data/lib/active_admin/views/title_bar.rb +55 -0
- data/lib/activeadmin.rb +1 -0
- data/lib/generators/active_admin/assets/assets_generator.rb +14 -0
- data/lib/generators/active_admin/assets/templates/active_admin.js +1 -0
- data/lib/generators/active_admin/assets/templates/active_admin.scss +17 -0
- data/lib/generators/active_admin/devise/devise_generator.rb +68 -0
- data/lib/generators/active_admin/install/install_generator.rb +49 -0
- data/lib/generators/active_admin/install/templates/active_admin.rb.erb +315 -0
- data/lib/generators/active_admin/install/templates/admin_users.rb.erb +28 -0
- data/lib/generators/active_admin/install/templates/dashboard.rb +32 -0
- data/lib/generators/active_admin/install/templates/migrations/create_active_admin_comments.rb.erb +16 -0
- data/lib/generators/active_admin/page/USAGE +8 -0
- data/lib/generators/active_admin/page/page_generator.rb +12 -0
- data/lib/generators/active_admin/page/templates/page.rb +5 -0
- data/lib/generators/active_admin/resource/resource_generator.rb +20 -0
- data/lib/generators/active_admin/resource/templates/admin.rb.erb +44 -0
- data/lib/ransack_ext.rb +20 -0
- data/vendor/assets/javascripts/jquery-ui/data.js +41 -0
- data/vendor/assets/javascripts/jquery-ui/disable-selection.js +48 -0
- data/vendor/assets/javascripts/jquery-ui/escape-selector.js +23 -0
- data/vendor/assets/javascripts/jquery-ui/focusable.js +86 -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/ie.js +17 -0
- data/vendor/assets/javascripts/jquery-ui/keycode.js +47 -0
- data/vendor/assets/javascripts/jquery-ui/labels.js +65 -0
- data/vendor/assets/javascripts/jquery-ui/plugin.js +46 -0
- data/vendor/assets/javascripts/jquery-ui/position.js +500 -0
- data/vendor/assets/javascripts/jquery-ui/safe-active-element.js +42 -0
- data/vendor/assets/javascripts/jquery-ui/safe-blur.js +23 -0
- data/vendor/assets/javascripts/jquery-ui/scroll-parent.js +47 -0
- data/vendor/assets/javascripts/jquery-ui/tabbable.js +38 -0
- data/vendor/assets/javascripts/jquery-ui/unique-id.js +51 -0
- data/vendor/assets/javascripts/jquery-ui/version.js +17 -0
- data/vendor/assets/javascripts/jquery-ui/widget.js +735 -0
- data/vendor/assets/javascripts/jquery-ui/widgets/button.js +391 -0
- data/vendor/assets/javascripts/jquery-ui/widgets/checkboxradio.js +291 -0
- data/vendor/assets/javascripts/jquery-ui/widgets/controlgroup.js +300 -0
- data/vendor/assets/javascripts/jquery-ui/widgets/datepicker.js +2123 -0
- data/vendor/assets/javascripts/jquery-ui/widgets/dialog.js +954 -0
- data/vendor/assets/javascripts/jquery-ui/widgets/draggable.js +1259 -0
- data/vendor/assets/javascripts/jquery-ui/widgets/mouse.js +230 -0
- data/vendor/assets/javascripts/jquery-ui/widgets/resizable.js +1207 -0
- data/vendor/assets/javascripts/jquery-ui/widgets/sortable.js +1561 -0
- data/vendor/assets/javascripts/jquery-ui/widgets/tabs.js +931 -0
- data/vendor/assets/stylesheets/active_admin/_normalize.scss +447 -0
- metadata +616 -0
@@ -0,0 +1,74 @@
|
|
1
|
+
module ActiveAdmin
|
2
|
+
class Resource
|
3
|
+
module ScopeTo
|
4
|
+
|
5
|
+
# Scope this controller to some object which has a relation
|
6
|
+
# to the resource. Can either accept a block or a symbol
|
7
|
+
# of a method to call.
|
8
|
+
#
|
9
|
+
# Eg:
|
10
|
+
#
|
11
|
+
# ActiveAdmin.register Post do
|
12
|
+
# scope_to :current_user
|
13
|
+
# end
|
14
|
+
#
|
15
|
+
# Then every time we instantiate and object, it would call
|
16
|
+
#
|
17
|
+
# current_user.posts.build
|
18
|
+
#
|
19
|
+
# By default Active Admin will use the resource name to build a
|
20
|
+
# method to call as the association. If its different, you can
|
21
|
+
# pass in the association_method as an option.
|
22
|
+
#
|
23
|
+
# scope_to :current_user, association_method: :blog_posts
|
24
|
+
#
|
25
|
+
# will result in the following
|
26
|
+
#
|
27
|
+
# current_user.blog_posts.build
|
28
|
+
#
|
29
|
+
# To conditionally use this scope, you can use conditional procs
|
30
|
+
#
|
31
|
+
# scope_to :current_user, if: proc{ admin_user_signed_in? }
|
32
|
+
#
|
33
|
+
# or
|
34
|
+
#
|
35
|
+
# scope_to :current_user, unless: proc{ current_user.admin? }
|
36
|
+
#
|
37
|
+
def scope_to(*args, &block)
|
38
|
+
options = args.extract_options!
|
39
|
+
method = args.first
|
40
|
+
|
41
|
+
scope_to_config[:method] = block || method
|
42
|
+
scope_to_config[:association_method] = options[:association_method]
|
43
|
+
scope_to_config[:if] = options[:if]
|
44
|
+
scope_to_config[:unless] = options[:unless]
|
45
|
+
|
46
|
+
end
|
47
|
+
|
48
|
+
def scope_to_association_method
|
49
|
+
scope_to_config[:association_method]
|
50
|
+
end
|
51
|
+
|
52
|
+
def scope_to_method
|
53
|
+
scope_to_config[:method]
|
54
|
+
end
|
55
|
+
|
56
|
+
def scope_to_config
|
57
|
+
@scope_to_config ||= {
|
58
|
+
method: nil,
|
59
|
+
association_method: nil,
|
60
|
+
if: nil,
|
61
|
+
unless: nil
|
62
|
+
}
|
63
|
+
end
|
64
|
+
|
65
|
+
def scope_to?(context = nil)
|
66
|
+
return false if scope_to_method.nil?
|
67
|
+
return render_in_context(context, scope_to_config[:if]) unless scope_to_config[:if].nil?
|
68
|
+
return !render_in_context(context, scope_to_config[:unless]) unless scope_to_config[:unless].nil?
|
69
|
+
true
|
70
|
+
end
|
71
|
+
|
72
|
+
end
|
73
|
+
end
|
74
|
+
end
|
@@ -0,0 +1,52 @@
|
|
1
|
+
module ActiveAdmin
|
2
|
+
class Resource
|
3
|
+
module Scopes
|
4
|
+
|
5
|
+
# Return an array of scopes for this resource
|
6
|
+
def scopes
|
7
|
+
@scopes ||= []
|
8
|
+
end
|
9
|
+
|
10
|
+
# Returns a scope for this object by its identifier
|
11
|
+
def get_scope_by_id(id)
|
12
|
+
id = id.to_s
|
13
|
+
scopes.find { |s| s.id == id }
|
14
|
+
end
|
15
|
+
|
16
|
+
def default_scope(context = nil)
|
17
|
+
scopes.detect do |scope|
|
18
|
+
if scope.default_block.is_a?(Proc)
|
19
|
+
render_in_context(context, scope.default_block)
|
20
|
+
else
|
21
|
+
scope.default_block
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
# Create a new scope object for this resource.
|
27
|
+
# If you want to internationalize the scope name, you can add
|
28
|
+
# to your i18n files a key like "active_admin.scopes.scope_method".
|
29
|
+
def scope(*args, &block)
|
30
|
+
default_options = { show_count: namespace.scopes_show_count }
|
31
|
+
options = default_options.merge(args.extract_options!)
|
32
|
+
title = args[0] rescue nil
|
33
|
+
method = args[1] rescue nil
|
34
|
+
|
35
|
+
options[:localizer] ||= ActiveAdmin::Localizers.resource(self)
|
36
|
+
scope = ActiveAdmin::Scope.new(title, method, options, &block)
|
37
|
+
|
38
|
+
# 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
|
+
if existing_scope_index
|
41
|
+
scopes.delete_at(existing_scope_index)
|
42
|
+
scopes.insert(existing_scope_index, scope)
|
43
|
+
else
|
44
|
+
self.scopes << scope
|
45
|
+
end
|
46
|
+
|
47
|
+
scope
|
48
|
+
end
|
49
|
+
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
require 'active_admin/helpers/optional_display'
|
2
|
+
|
3
|
+
module ActiveAdmin
|
4
|
+
|
5
|
+
class Resource
|
6
|
+
module Sidebars
|
7
|
+
|
8
|
+
def sidebar_sections
|
9
|
+
@sidebar_sections ||= []
|
10
|
+
end
|
11
|
+
|
12
|
+
def clear_sidebar_sections!
|
13
|
+
@sidebar_sections = []
|
14
|
+
end
|
15
|
+
|
16
|
+
def sidebar_sections_for(action, render_context = nil)
|
17
|
+
sidebar_sections.select { |section| section.display_on?(action, render_context) }
|
18
|
+
.sort_by(&:priority)
|
19
|
+
end
|
20
|
+
|
21
|
+
def sidebar_sections?
|
22
|
+
!!@sidebar_sections && @sidebar_sections.any?
|
23
|
+
end
|
24
|
+
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
end
|
@@ -0,0 +1,72 @@
|
|
1
|
+
module ActiveAdmin
|
2
|
+
# This is a container for resources, which acts much like a Hash.
|
3
|
+
# It's assumed that an added resource responds to `resource_name`.
|
4
|
+
class ResourceCollection
|
5
|
+
include Enumerable
|
6
|
+
extend Forwardable
|
7
|
+
def_delegators :@collection, :empty?, :has_key?, :keys, :values, :size
|
8
|
+
|
9
|
+
def initialize
|
10
|
+
@collection = {}
|
11
|
+
end
|
12
|
+
|
13
|
+
def add(resource)
|
14
|
+
if match = @collection[resource.resource_name]
|
15
|
+
raise_if_mismatched! match, resource
|
16
|
+
match
|
17
|
+
else
|
18
|
+
@collection[resource.resource_name] = resource
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
# Changes `each` to pass in the value, instead of both the key and value.
|
23
|
+
def each(&block)
|
24
|
+
values.each &block
|
25
|
+
end
|
26
|
+
|
27
|
+
def [](obj)
|
28
|
+
@collection[obj] || find_resource(obj)
|
29
|
+
end
|
30
|
+
|
31
|
+
private
|
32
|
+
|
33
|
+
# Finds a resource based on the resource name, resource class, or base class.
|
34
|
+
def find_resource(obj)
|
35
|
+
resources.detect do |r|
|
36
|
+
r.resource_name.to_s == obj.to_s
|
37
|
+
end || resources.detect do |r|
|
38
|
+
r.resource_class.to_s == obj.to_s
|
39
|
+
end ||
|
40
|
+
if obj.respond_to? :base_class
|
41
|
+
resources.detect { |r| r.resource_class.to_s == obj.base_class.to_s }
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
def resources
|
46
|
+
select { |r| r.class <= Resource } # can otherwise be a Page
|
47
|
+
end
|
48
|
+
|
49
|
+
def raise_if_mismatched!(existing, given)
|
50
|
+
if existing.class != given.class
|
51
|
+
raise IncorrectClass.new existing, given
|
52
|
+
elsif given.class <= Resource && existing.resource_class != given.resource_class
|
53
|
+
raise ConfigMismatch.new existing, given
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
class IncorrectClass < StandardError
|
58
|
+
def initialize(existing, given)
|
59
|
+
super "You're trying to register #{given.resource_name} which is a #{given.class}, " +
|
60
|
+
"but #{existing.resource_name}, a #{existing.class} has already claimed that name."
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
class ConfigMismatch < StandardError
|
65
|
+
def initialize(existing, given)
|
66
|
+
super "You're trying to register #{given.resource_class} as #{given.resource_name}, " +
|
67
|
+
"but the existing #{existing.class} config was built for #{existing.resource_class}!"
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
end
|
72
|
+
end
|
@@ -0,0 +1,64 @@
|
|
1
|
+
require 'active_admin/resource_controller/action_builder'
|
2
|
+
require 'active_admin/resource_controller/data_access'
|
3
|
+
require 'active_admin/resource_controller/decorators'
|
4
|
+
require 'active_admin/resource_controller/scoping'
|
5
|
+
require 'active_admin/resource_controller/streaming'
|
6
|
+
require 'active_admin/resource_controller/sidebars'
|
7
|
+
require 'active_admin/resource_controller/resource_class_methods'
|
8
|
+
|
9
|
+
module ActiveAdmin
|
10
|
+
# All Resources Controller inherits from this controller.
|
11
|
+
# It implements actions and helpers for resources.
|
12
|
+
class ResourceController < BaseController
|
13
|
+
layout :determine_active_admin_layout
|
14
|
+
|
15
|
+
respond_to :html, :xml, :json
|
16
|
+
respond_to :csv, only: :index
|
17
|
+
|
18
|
+
include ActionBuilder
|
19
|
+
include Decorators
|
20
|
+
include DataAccess
|
21
|
+
include Scoping
|
22
|
+
include Streaming
|
23
|
+
include Sidebars
|
24
|
+
include ViewHelpers::DownloadFormatLinksHelper
|
25
|
+
extend ResourceClassMethods
|
26
|
+
|
27
|
+
def self.active_admin_config=(config)
|
28
|
+
if @active_admin_config = config
|
29
|
+
defaults resource_class: config.resource_class,
|
30
|
+
route_prefix: config.route_prefix,
|
31
|
+
instance_name: config.resource_name.singular
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
# Inherited Resources uses the `self.inherited(base)` hook to add
|
36
|
+
# in `self.resource_class`. To override it, we need to install
|
37
|
+
# our resource_class method each time we're inherited from.
|
38
|
+
def self.inherited(base)
|
39
|
+
super(base)
|
40
|
+
base.override_resource_class_methods!
|
41
|
+
end
|
42
|
+
|
43
|
+
private
|
44
|
+
|
45
|
+
# Returns the renderer class to use for the given action.
|
46
|
+
def renderer_for(action)
|
47
|
+
active_admin_namespace.view_factory["#{action}_page"]
|
48
|
+
end
|
49
|
+
|
50
|
+
helper_method :renderer_for
|
51
|
+
|
52
|
+
def restrict_format_access!
|
53
|
+
unless request.format.html?
|
54
|
+
presenter = active_admin_config.get_page_presenter(:index)
|
55
|
+
download_formats = (presenter || {}).fetch(:download_links, active_admin_config.namespace.download_links)
|
56
|
+
unless build_download_formats(download_formats).include?(request.format.symbol)
|
57
|
+
raise ActiveAdmin::AccessDenied.new(current_active_admin_user, :index)
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
before_action :restrict_format_access!, only: [:index, :show]
|
63
|
+
end
|
64
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
module ActiveAdmin
|
2
|
+
class ResourceController < BaseController
|
3
|
+
|
4
|
+
module ActionBuilder
|
5
|
+
extend ActiveSupport::Concern
|
6
|
+
|
7
|
+
module ClassMethods
|
8
|
+
|
9
|
+
def clear_member_actions!
|
10
|
+
remove_action_methods(:member)
|
11
|
+
active_admin_config.clear_member_actions!
|
12
|
+
end
|
13
|
+
|
14
|
+
def clear_collection_actions!
|
15
|
+
remove_action_methods(:collection)
|
16
|
+
active_admin_config.clear_collection_actions!
|
17
|
+
end
|
18
|
+
|
19
|
+
private
|
20
|
+
|
21
|
+
def remove_action_methods(actions_type)
|
22
|
+
active_admin_config.public_send("#{actions_type}_actions").each do |action|
|
23
|
+
remove_method action.name
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
end
|
29
|
+
|
30
|
+
end
|
31
|
+
end
|
@@ -0,0 +1,322 @@
|
|
1
|
+
module ActiveAdmin
|
2
|
+
class ResourceController < BaseController
|
3
|
+
|
4
|
+
# This module overrides most of the data access methods in Inherited
|
5
|
+
# Resources to provide Active Admin with it's data.
|
6
|
+
#
|
7
|
+
# The module also deals with authorization and resource callbacks.
|
8
|
+
#
|
9
|
+
module DataAccess
|
10
|
+
|
11
|
+
def self.included(base)
|
12
|
+
base.class_exec do
|
13
|
+
include Callbacks
|
14
|
+
include ScopeChain
|
15
|
+
|
16
|
+
define_active_admin_callbacks :build, :create, :update, :save, :destroy
|
17
|
+
|
18
|
+
helper_method :current_scope
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
protected
|
23
|
+
|
24
|
+
COLLECTION_APPLIES = [
|
25
|
+
:authorization_scope,
|
26
|
+
:sorting,
|
27
|
+
:filtering,
|
28
|
+
:scoping,
|
29
|
+
:includes,
|
30
|
+
:pagination,
|
31
|
+
:collection_decorator
|
32
|
+
].freeze
|
33
|
+
|
34
|
+
# Retrieve, memoize and authorize the current collection from the db. This
|
35
|
+
# method delegates the finding of the collection to #find_collection.
|
36
|
+
#
|
37
|
+
# Once #collection has been called, the collection is available using
|
38
|
+
# either the @collection instance variable or an instance variable named
|
39
|
+
# after the resource that the collection is for. eg: Post => @post.
|
40
|
+
#
|
41
|
+
# @return [ActiveRecord::Relation] The collection for the index
|
42
|
+
def collection
|
43
|
+
get_collection_ivar || begin
|
44
|
+
collection = find_collection
|
45
|
+
authorize! Authorization::READ, active_admin_config.resource_class
|
46
|
+
set_collection_ivar collection
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
# Does the actual work of retrieving the current collection from the db.
|
51
|
+
# This is a great method to override if you would like to perform
|
52
|
+
# some additional db # work before your controller returns and
|
53
|
+
# authorizes the collection.
|
54
|
+
#
|
55
|
+
# @return [ActiveRecord::Relation] The collection for the index
|
56
|
+
def find_collection(options = {})
|
57
|
+
collection = scoped_collection
|
58
|
+
collection_applies(options).each do |applyer|
|
59
|
+
collection = send("apply_#{applyer}", collection)
|
60
|
+
end
|
61
|
+
collection
|
62
|
+
end
|
63
|
+
|
64
|
+
# Override this method in your controllers to modify the start point
|
65
|
+
# of our searches and index.
|
66
|
+
#
|
67
|
+
# This method should return an ActiveRecord::Relation object so that
|
68
|
+
# the searching and filtering can be applied on top
|
69
|
+
#
|
70
|
+
# Note, unless you are doing something special, you should use the
|
71
|
+
# scope_to method from the Scoping module instead of overriding this
|
72
|
+
# method.
|
73
|
+
def scoped_collection
|
74
|
+
end_of_association_chain
|
75
|
+
end
|
76
|
+
|
77
|
+
# Retrieve, memoize and authorize a resource based on params[:id]. The
|
78
|
+
# actual work of finding the resource is done in #find_resource.
|
79
|
+
#
|
80
|
+
# This method is used on all the member actions:
|
81
|
+
#
|
82
|
+
# * show
|
83
|
+
# * edit
|
84
|
+
# * update
|
85
|
+
# * destroy
|
86
|
+
#
|
87
|
+
# @return [ActiveRecord::Base] An active record object
|
88
|
+
def resource
|
89
|
+
get_resource_ivar || begin
|
90
|
+
resource = find_resource
|
91
|
+
resource = apply_decorations(resource)
|
92
|
+
authorize_resource! resource
|
93
|
+
|
94
|
+
set_resource_ivar resource
|
95
|
+
end
|
96
|
+
end
|
97
|
+
|
98
|
+
# Does the actual work of finding a resource in the database. This
|
99
|
+
# method uses the finder method as defined in InheritedResources.
|
100
|
+
#
|
101
|
+
# @return [ActiveRecord::Base] An active record object.
|
102
|
+
def find_resource
|
103
|
+
scoped_collection.send method_for_find, params[:id]
|
104
|
+
end
|
105
|
+
|
106
|
+
# Builds, memoize and authorize a new instance of the resource. The
|
107
|
+
# actual work of building the new instance is delegated to the
|
108
|
+
# #build_new_resource method.
|
109
|
+
#
|
110
|
+
# This method is used to instantiate and authorize new resources in the
|
111
|
+
# new and create controller actions.
|
112
|
+
#
|
113
|
+
# @return [ActiveRecord::Base] An un-saved active record base object
|
114
|
+
def build_resource
|
115
|
+
get_resource_ivar || begin
|
116
|
+
resource = build_new_resource
|
117
|
+
resource = apply_decorations(resource)
|
118
|
+
resource = assign_attributes(resource, resource_params)
|
119
|
+
run_build_callbacks resource
|
120
|
+
authorize_resource! resource
|
121
|
+
|
122
|
+
set_resource_ivar resource
|
123
|
+
end
|
124
|
+
end
|
125
|
+
|
126
|
+
# Builds a new resource. This method uses the method_for_build provided
|
127
|
+
# by Inherited Resources.
|
128
|
+
#
|
129
|
+
# @return [ActiveRecord::Base] An un-saved active record base object
|
130
|
+
def build_new_resource
|
131
|
+
scoped_collection.send(
|
132
|
+
method_for_build,
|
133
|
+
*resource_params.map { |params| params.slice(active_admin_config.resource_class.inheritance_column) }
|
134
|
+
)
|
135
|
+
end
|
136
|
+
|
137
|
+
# Calls all the appropriate callbacks and then creates the new resource.
|
138
|
+
#
|
139
|
+
# @param [ActiveRecord::Base] object The new resource to create
|
140
|
+
#
|
141
|
+
# @return [void]
|
142
|
+
def create_resource(object)
|
143
|
+
run_create_callbacks object do
|
144
|
+
save_resource(object)
|
145
|
+
end
|
146
|
+
end
|
147
|
+
|
148
|
+
# Calls all the appropriate callbacks and then saves the new resource.
|
149
|
+
#
|
150
|
+
# @param [ActiveRecord::Base] object The new resource to save
|
151
|
+
#
|
152
|
+
# @return [void]
|
153
|
+
def save_resource(object)
|
154
|
+
run_save_callbacks object do
|
155
|
+
object.save
|
156
|
+
end
|
157
|
+
end
|
158
|
+
|
159
|
+
# Update an object with the given attributes. Also calls the appropriate
|
160
|
+
# callbacks for update action.
|
161
|
+
#
|
162
|
+
# @param [ActiveRecord::Base] object The instance to update
|
163
|
+
#
|
164
|
+
# @param [Array] attributes An array with the attributes in the first position
|
165
|
+
# and the Active Record "role" in the second. The role
|
166
|
+
# may be set to nil.
|
167
|
+
#
|
168
|
+
# @return [void]
|
169
|
+
def update_resource(object, attributes)
|
170
|
+
object = assign_attributes(object, attributes)
|
171
|
+
|
172
|
+
run_update_callbacks object do
|
173
|
+
save_resource(object)
|
174
|
+
end
|
175
|
+
end
|
176
|
+
|
177
|
+
# Destroys an object from the database and calls appropriate callbacks.
|
178
|
+
#
|
179
|
+
# @return [void]
|
180
|
+
def destroy_resource(object)
|
181
|
+
run_destroy_callbacks object do
|
182
|
+
object.destroy
|
183
|
+
end
|
184
|
+
end
|
185
|
+
|
186
|
+
#
|
187
|
+
# Collection Helper Methods
|
188
|
+
#
|
189
|
+
|
190
|
+
# Gives the authorization library a change to pre-scope the collection.
|
191
|
+
#
|
192
|
+
# In the case of the CanCan adapter, it calls `#accessible_by` on
|
193
|
+
# the collection.
|
194
|
+
#
|
195
|
+
# @param [ActiveRecord::Relation] collection The collection to scope
|
196
|
+
#
|
197
|
+
# @return [ActiveRecord::Relation] a scoped collection of query
|
198
|
+
def apply_authorization_scope(collection)
|
199
|
+
action_name = action_to_permission(params[:action])
|
200
|
+
active_admin_authorization.scope_collection(collection, action_name)
|
201
|
+
end
|
202
|
+
|
203
|
+
def apply_sorting(chain)
|
204
|
+
params[:order] ||= active_admin_config.sort_order
|
205
|
+
order_clause = active_admin_config.order_clause.new(active_admin_config, params[:order])
|
206
|
+
|
207
|
+
if order_clause.valid?
|
208
|
+
order_clause.apply(chain)
|
209
|
+
else
|
210
|
+
chain # just return the chain
|
211
|
+
end
|
212
|
+
end
|
213
|
+
|
214
|
+
# Applies any Ransack search methods to the currently scoped collection.
|
215
|
+
# Both `search` and `ransack` are provided, but we use `ransack` to prevent conflicts.
|
216
|
+
def apply_filtering(chain)
|
217
|
+
@search = chain.ransack(params[:q] || {})
|
218
|
+
@search.result
|
219
|
+
end
|
220
|
+
|
221
|
+
def apply_scoping(chain)
|
222
|
+
@collection_before_scope = chain
|
223
|
+
|
224
|
+
if current_scope
|
225
|
+
scope_chain(current_scope, chain)
|
226
|
+
else
|
227
|
+
chain
|
228
|
+
end
|
229
|
+
end
|
230
|
+
|
231
|
+
def apply_includes(chain)
|
232
|
+
if active_admin_config.includes.any?
|
233
|
+
chain.includes *active_admin_config.includes
|
234
|
+
else
|
235
|
+
chain
|
236
|
+
end
|
237
|
+
end
|
238
|
+
|
239
|
+
def collection_before_scope
|
240
|
+
@collection_before_scope
|
241
|
+
end
|
242
|
+
|
243
|
+
def current_scope
|
244
|
+
@current_scope ||= if params[:scope]
|
245
|
+
active_admin_config.get_scope_by_id(params[:scope])
|
246
|
+
else
|
247
|
+
active_admin_config.default_scope(self)
|
248
|
+
end
|
249
|
+
end
|
250
|
+
|
251
|
+
def apply_pagination(chain)
|
252
|
+
# skip pagination if already was paginated by scope
|
253
|
+
return chain if chain.respond_to?(:total_pages)
|
254
|
+
page_method_name = Kaminari.config.page_method_name
|
255
|
+
page = params[Kaminari.config.param_name]
|
256
|
+
|
257
|
+
chain.public_send(page_method_name, page).per(per_page)
|
258
|
+
end
|
259
|
+
|
260
|
+
def collection_applies(options = {})
|
261
|
+
only = Array(options.fetch(:only, COLLECTION_APPLIES))
|
262
|
+
except = Array(options.fetch(:except, []))
|
263
|
+
|
264
|
+
COLLECTION_APPLIES & only - except
|
265
|
+
end
|
266
|
+
|
267
|
+
def per_page
|
268
|
+
if active_admin_config.paginate
|
269
|
+
dynamic_per_page || configured_per_page
|
270
|
+
else
|
271
|
+
active_admin_config.max_per_page
|
272
|
+
end
|
273
|
+
end
|
274
|
+
|
275
|
+
def dynamic_per_page
|
276
|
+
params[:per_page] || @per_page
|
277
|
+
end
|
278
|
+
|
279
|
+
def configured_per_page
|
280
|
+
Array(active_admin_config.per_page).first
|
281
|
+
end
|
282
|
+
|
283
|
+
# @param resource [ActiveRecord::Base]
|
284
|
+
# @param attributes [Array<Hash]
|
285
|
+
# @return [ActiveRecord::Base] resource
|
286
|
+
#
|
287
|
+
def assign_attributes(resource, attributes)
|
288
|
+
if resource.respond_to?(:assign_attributes)
|
289
|
+
resource.assign_attributes(*attributes)
|
290
|
+
else
|
291
|
+
resource.attributes = attributes[0]
|
292
|
+
end
|
293
|
+
|
294
|
+
resource
|
295
|
+
end
|
296
|
+
|
297
|
+
# @param resource [ActiveRecord::Base]
|
298
|
+
# @return [ActiveRecord::Base] resource
|
299
|
+
#
|
300
|
+
def apply_decorations(resource)
|
301
|
+
apply_decorator(resource)
|
302
|
+
end
|
303
|
+
|
304
|
+
# @return [String]
|
305
|
+
def smart_resource_url
|
306
|
+
if create_another?
|
307
|
+
new_resource_url(create_another: params[:create_another])
|
308
|
+
else
|
309
|
+
super
|
310
|
+
end
|
311
|
+
end
|
312
|
+
|
313
|
+
private
|
314
|
+
|
315
|
+
# @return [Boolean] true if user requested to create one more
|
316
|
+
# resource after creating this one.
|
317
|
+
def create_another?
|
318
|
+
params[:create_another].present?
|
319
|
+
end
|
320
|
+
end
|
321
|
+
end
|
322
|
+
end
|