activeadministration 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/.gitignore +47 -0
- data/.travis.yml +19 -0
- data/.yardopts +9 -0
- data/CHANGELOG.md +1074 -0
- data/CONTRIBUTING.md +139 -0
- data/Gemfile +52 -0
- data/Guardfile +7 -0
- data/LICENSE +25 -0
- data/README.md +8 -0
- data/Rakefile +33 -0
- data/activeadministration.gemspec +34 -0
- data/app/assets/images/active_admin/admin_notes_icon.png +0 -0
- data/app/assets/images/active_admin/datepicker/datepicker-header-bg.png +0 -0
- data/app/assets/images/active_admin/datepicker/datepicker-input-icon.png +0 -0
- data/app/assets/images/active_admin/datepicker/datepicker-next-link-icon.png +0 -0
- data/app/assets/images/active_admin/datepicker/datepicker-nipple.png +0 -0
- data/app/assets/images/active_admin/datepicker/datepicker-prev-link-icon.png +0 -0
- data/app/assets/images/active_admin/index_list_icons/block_icon.svg +10 -0
- data/app/assets/images/active_admin/index_list_icons/blog_icon.svg +4 -0
- data/app/assets/images/active_admin/index_list_icons/grid_icon.svg +13 -0
- data/app/assets/images/active_admin/index_list_icons/table_icon.svg +3 -0
- data/app/assets/images/active_admin/loading.gif +0 -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/application.js.coffee +30 -0
- data/app/assets/javascripts/active_admin/base.js.coffee +14 -0
- data/app/assets/javascripts/active_admin/ext/jquery-ui.js.coffee +6 -0
- data/app/assets/javascripts/active_admin/ext/jquery.js.coffee +7 -0
- data/app/assets/javascripts/active_admin/lib/batch_actions.js.coffee +39 -0
- data/app/assets/javascripts/active_admin/lib/checkbox-toggler.js.coffee +36 -0
- data/app/assets/javascripts/active_admin/lib/dropdown-menu.js.coffee +85 -0
- data/app/assets/javascripts/active_admin/lib/has_many.js.coffee +75 -0
- data/app/assets/javascripts/active_admin/lib/modal_dialog.js.coffee +36 -0
- data/app/assets/javascripts/active_admin/lib/popover.js.coffee +68 -0
- data/app/assets/javascripts/active_admin/lib/table-checkbox-toggler.js.coffee +24 -0
- data/app/assets/stylesheets/active_admin/_base.css.scss +42 -0
- data/app/assets/stylesheets/active_admin/_forms.css.scss +329 -0
- data/app/assets/stylesheets/active_admin/_header.css.scss +156 -0
- data/app/assets/stylesheets/active_admin/_mixins.css.scss +1 -0
- data/app/assets/stylesheets/active_admin/_typography.css.scss +100 -0
- data/app/assets/stylesheets/active_admin/components/_batch_actions.css.scss +11 -0
- data/app/assets/stylesheets/active_admin/components/_blank_slates.scss +31 -0
- data/app/assets/stylesheets/active_admin/components/_breadcrumbs.scss +20 -0
- data/app/assets/stylesheets/active_admin/components/_buttons.scss +11 -0
- data/app/assets/stylesheets/active_admin/components/_columns.scss +3 -0
- data/app/assets/stylesheets/active_admin/components/_comments.css.scss +41 -0
- data/app/assets/stylesheets/active_admin/components/_date_picker.css.scss +127 -0
- data/app/assets/stylesheets/active_admin/components/_dropdown_menu.scss +151 -0
- data/app/assets/stylesheets/active_admin/components/_flash_messages.css.scss +39 -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 +31 -0
- data/app/assets/stylesheets/active_admin/components/_pagination.scss +34 -0
- data/app/assets/stylesheets/active_admin/components/_panels.scss +6 -0
- data/app/assets/stylesheets/active_admin/components/_popovers.css.scss +123 -0
- data/app/assets/stylesheets/active_admin/components/_scopes.scss +10 -0
- data/app/assets/stylesheets/active_admin/components/_status_tags.scss +16 -0
- data/app/assets/stylesheets/active_admin/components/_table_tools.css.scss +65 -0
- data/app/assets/stylesheets/active_admin/components/_tables.css.scss +111 -0
- data/app/assets/stylesheets/active_admin/mixins/_all.css.scss +11 -0
- data/app/assets/stylesheets/active_admin/mixins/_buttons.css.scss +66 -0
- data/app/assets/stylesheets/active_admin/mixins/_gradients.css.scss +38 -0
- data/app/assets/stylesheets/active_admin/mixins/_icons.css.scss +20 -0
- data/app/assets/stylesheets/active_admin/mixins/_reset.css.scss +165 -0
- data/app/assets/stylesheets/active_admin/mixins/_rounded.css.scss +43 -0
- data/app/assets/stylesheets/active_admin/mixins/_sections.css.scss +36 -0
- data/app/assets/stylesheets/active_admin/mixins/_shadows.css.scss +22 -0
- data/app/assets/stylesheets/active_admin/mixins/_typography.scss +3 -0
- data/app/assets/stylesheets/active_admin/mixins/_utilities.scss +26 -0
- data/app/assets/stylesheets/active_admin/mixins/_variables.css.scss +34 -0
- data/app/assets/stylesheets/active_admin/pages/_logged_out.scss +44 -0
- data/app/assets/stylesheets/active_admin/print.css.scss +284 -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 +46 -0
- data/app/views/active_admin/dashboard/index.html.arb +1 -0
- data/app/views/active_admin/devise/confirmations/new.html.erb +14 -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 +19 -0
- data/app/views/active_admin/devise/passwords/new.html.erb +14 -0
- data/app/views/active_admin/devise/registrations/new.html.erb +22 -0
- data/app/views/active_admin/devise/sessions/new.html.erb +20 -0
- data/app/views/active_admin/devise/shared/_links.erb +27 -0
- data/app/views/active_admin/devise/unlocks/new.html.erb +14 -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.csv.erb +17 -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 +23 -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 +37 -0
- data/config/locales/bg.yml +102 -0
- data/config/locales/bs.yml +121 -0
- data/config/locales/ca.yml +102 -0
- data/config/locales/cs.yml +106 -0
- data/config/locales/da.yml +103 -0
- data/config/locales/de-CH.yml +118 -0
- data/config/locales/de.yml +143 -0
- data/config/locales/el.yml +111 -0
- data/config/locales/en-GB.yml +95 -0
- data/config/locales/en.yml +117 -0
- data/config/locales/es.yml +127 -0
- data/config/locales/es_MX.yml +110 -0
- data/config/locales/fi.yml +110 -0
- data/config/locales/fr.yml +109 -0
- data/config/locales/he.yml +92 -0
- data/config/locales/hr.yml +121 -0
- data/config/locales/hu.yml +96 -0
- data/config/locales/it.yml +114 -0
- data/config/locales/ja.yml +114 -0
- data/config/locales/ko.yml +85 -0
- data/config/locales/lt.yml +118 -0
- data/config/locales/lv.yml +90 -0
- data/config/locales/nl.yml +94 -0
- data/config/locales/no-NB.yml +111 -0
- data/config/locales/pl.yml +100 -0
- data/config/locales/pt-BR.yml +117 -0
- data/config/locales/pt-PT.yml +90 -0
- data/config/locales/ro.yml +94 -0
- data/config/locales/ru.yml +121 -0
- data/config/locales/sv-SE.yml +90 -0
- data/config/locales/tr.yml +94 -0
- data/config/locales/uk.yml +121 -0
- data/config/locales/vi.yml +91 -0
- data/config/locales/zh-CN.yml +112 -0
- data/config/locales/zh-TW.yml +94 -0
- data/cucumber.yml +3 -0
- data/docs/0-installation.md +84 -0
- data/docs/1-general-configuration.md +138 -0
- data/docs/10-custom-pages.md +84 -0
- data/docs/11-decorators.md +50 -0
- data/docs/12-arbre-components.md +150 -0
- data/docs/13-authorization-adapter.md +239 -0
- data/docs/2-resource-customization.md +359 -0
- data/docs/3-index-pages.md +245 -0
- data/docs/3-index-pages/create-an-index.md +31 -0
- data/docs/3-index-pages/index-as-block.md +21 -0
- data/docs/3-index-pages/index-as-blog.md +71 -0
- data/docs/3-index-pages/index-as-grid.md +29 -0
- data/docs/3-index-pages/index-as-table.md +163 -0
- data/docs/4-csv-format.md +39 -0
- data/docs/5-forms.md +118 -0
- data/docs/6-show-pages.md +77 -0
- data/docs/7-sidebars.md +63 -0
- data/docs/8-custom-actions.md +159 -0
- data/docs/9-batch-actions.md +233 -0
- data/features/action_item.feature +73 -0
- data/features/authorization.feature +64 -0
- data/features/authorization_cancan.feature +52 -0
- data/features/authorization_pundit.feature +37 -0
- data/features/belongs_to.feature +66 -0
- data/features/breadcrumb.feature +75 -0
- data/features/comments/commenting.feature +159 -0
- data/features/comments/viewing_index.feature +19 -0
- data/features/dashboard.feature +16 -0
- data/features/decorators.feature +41 -0
- data/features/development_reloading.feature +31 -0
- data/features/edit_page.feature +114 -0
- data/features/favicon.feature +20 -0
- data/features/first_boot.feature +16 -0
- data/features/global_navigation.feature +29 -0
- data/features/i18n.feature +43 -0
- data/features/index/batch_actions.feature +123 -0
- data/features/index/filters.feature +138 -0
- data/features/index/format_as_csv.feature +117 -0
- data/features/index/formats.feature +66 -0
- data/features/index/index_as_block.feature +15 -0
- data/features/index/index_as_blog.feature +69 -0
- data/features/index/index_as_grid.feature +45 -0
- data/features/index/index_as_table.feature +208 -0
- data/features/index/index_blank_slate.feature +83 -0
- data/features/index/index_parameters.feature +75 -0
- data/features/index/index_scope_to.feature +56 -0
- data/features/index/index_scopes.feature +251 -0
- data/features/index/page_title.feature +41 -0
- data/features/index/pagination.feature +59 -0
- data/features/index/switch_index_view.feature +73 -0
- data/features/menu.feature +53 -0
- data/features/new_page.feature +106 -0
- data/features/registering_assets.feature +35 -0
- data/features/registering_pages.feature +148 -0
- data/features/registering_resources.feature +33 -0
- data/features/root_to.feature +17 -0
- data/features/show/default_content.feature +43 -0
- data/features/show/page_title.feature +58 -0
- data/features/sidebar_sections.feature +210 -0
- data/features/site_title.feature +47 -0
- data/features/specifying_actions.feature +93 -0
- data/features/step_definitions/action_item_steps.rb +7 -0
- data/features/step_definitions/action_link_steps.rb +7 -0
- data/features/step_definitions/additional_web_steps.rb +82 -0
- data/features/step_definitions/asset_steps.rb +15 -0
- data/features/step_definitions/attribute_steps.rb +18 -0
- data/features/step_definitions/batch_action_steps.rb +55 -0
- data/features/step_definitions/breadcrumb_steps.rb +3 -0
- data/features/step_definitions/comment_steps.rb +12 -0
- data/features/step_definitions/configuration_steps.rb +100 -0
- data/features/step_definitions/dashboard_steps.rb +15 -0
- data/features/step_definitions/factory_steps.rb +34 -0
- data/features/step_definitions/filter_steps.rb +17 -0
- data/features/step_definitions/flash_steps.rb +11 -0
- data/features/step_definitions/format_steps.rb +45 -0
- data/features/step_definitions/i18n_steps.rb +3 -0
- data/features/step_definitions/index_scope_steps.rb +21 -0
- data/features/step_definitions/index_views_steps.rb +3 -0
- data/features/step_definitions/layout_steps.rb +3 -0
- data/features/step_definitions/member_link_steps.rb +7 -0
- data/features/step_definitions/menu_steps.rb +11 -0
- data/features/step_definitions/pagination_steps.rb +8 -0
- data/features/step_definitions/sidebar_steps.rb +12 -0
- data/features/step_definitions/site_title_steps.rb +15 -0
- data/features/step_definitions/symbol_leak_steps.rb +3 -0
- data/features/step_definitions/tab_steps.rb +3 -0
- data/features/step_definitions/table_steps.rb +119 -0
- data/features/step_definitions/user_steps.rb +41 -0
- data/features/step_definitions/web_steps.rb +86 -0
- data/features/sti_resource.feature +65 -0
- data/features/strong_parameters.feature +72 -0
- data/features/support/env.rb +119 -0
- data/features/support/paths.rb +71 -0
- data/features/support/selectors.rb +45 -0
- data/features/symbol_leak.feature +35 -0
- data/features/users/logging_in.feature +34 -0
- data/features/users/logging_out.feature +13 -0
- data/features/users/resetting_password.feature +34 -0
- data/lib/active_admin.rb +135 -0
- data/lib/active_admin/abstract_view_factory.rb +86 -0
- data/lib/active_admin/application.rb +250 -0
- data/lib/active_admin/asset_registration.rb +29 -0
- data/lib/active_admin/authorization_adapter.rb +132 -0
- data/lib/active_admin/base_controller.rb +78 -0
- data/lib/active_admin/base_controller/authorization.rb +151 -0
- data/lib/active_admin/base_controller/menu.rb +34 -0
- data/lib/active_admin/batch_actions.rb +17 -0
- data/lib/active_admin/batch_actions/controller.rb +29 -0
- data/lib/active_admin/batch_actions/resource_extension.rb +154 -0
- data/lib/active_admin/batch_actions/views/batch_action_form.rb +38 -0
- data/lib/active_admin/batch_actions/views/batch_action_popover.rb +28 -0
- data/lib/active_admin/batch_actions/views/batch_action_selector.rb +57 -0
- data/lib/active_admin/batch_actions/views/selection_cells.rb +37 -0
- data/lib/active_admin/callbacks.rb +84 -0
- data/lib/active_admin/cancan_adapter.rb +40 -0
- data/lib/active_admin/component.rb +5 -0
- data/lib/active_admin/controller_action.rb +12 -0
- data/lib/active_admin/csv_builder.rb +70 -0
- data/lib/active_admin/dependencies.rb +38 -0
- data/lib/active_admin/deprecation.rb +35 -0
- data/lib/active_admin/devise.rb +80 -0
- data/lib/active_admin/dsl.rb +165 -0
- data/lib/active_admin/engine.rb +7 -0
- data/lib/active_admin/error.rb +22 -0
- data/lib/active_admin/event.rb +33 -0
- data/lib/active_admin/filters.rb +9 -0
- data/lib/active_admin/filters/dsl.rb +21 -0
- data/lib/active_admin/filters/forms.rb +87 -0
- data/lib/active_admin/filters/formtastic_addons.rb +73 -0
- data/lib/active_admin/filters/resource_extension.rb +135 -0
- data/lib/active_admin/form_builder.rb +185 -0
- data/lib/active_admin/helpers/collection.rb +23 -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/scope_chain.rb +23 -0
- data/lib/active_admin/helpers/settings.rb +106 -0
- data/lib/active_admin/iconic.rb +54 -0
- data/lib/active_admin/iconic/icons.rb +142 -0
- data/lib/active_admin/inputs.rb +15 -0
- data/lib/active_admin/inputs/datepicker_input.rb +20 -0
- data/lib/active_admin/inputs/filter_base.rb +40 -0
- data/lib/active_admin/inputs/filter_base/search_method_select.rb +73 -0
- data/lib/active_admin/inputs/filter_boolean_input.rb +32 -0
- data/lib/active_admin/inputs/filter_check_boxes_input.rb +48 -0
- data/lib/active_admin/inputs/filter_date_range_input.rb +34 -0
- data/lib/active_admin/inputs/filter_numeric_input.rb +10 -0
- data/lib/active_admin/inputs/filter_select_input.rb +53 -0
- data/lib/active_admin/inputs/filter_string_input.rb +24 -0
- data/lib/active_admin/menu.rb +107 -0
- data/lib/active_admin/menu_collection.rb +96 -0
- data/lib/active_admin/menu_item.rb +97 -0
- data/lib/active_admin/namespace.rb +231 -0
- data/lib/active_admin/order_clause.rb +26 -0
- data/lib/active_admin/orm/active_record.rb +3 -0
- data/lib/active_admin/orm/active_record/comments.rb +84 -0
- data/lib/active_admin/orm/active_record/comments/comment.rb +49 -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 +75 -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 +88 -0
- data/lib/active_admin/page_controller.rb +29 -0
- data/lib/active_admin/page_dsl.rb +28 -0
- data/lib/active_admin/page_presenter.rb +32 -0
- data/lib/active_admin/pundit_adapter.rb +42 -0
- data/lib/active_admin/resource.rb +156 -0
- data/lib/active_admin/resource/action_items.rb +91 -0
- data/lib/active_admin/resource/belongs_to.rb +36 -0
- data/lib/active_admin/resource/controllers.rb +18 -0
- data/lib/active_admin/resource/menu.rb +64 -0
- data/lib/active_admin/resource/naming.rb +84 -0
- data/lib/active_admin/resource/page_presenters.rb +82 -0
- data/lib/active_admin/resource/pagination.rb +19 -0
- data/lib/active_admin/resource/routes.rb +99 -0
- data/lib/active_admin/resource/scope_to.rb +74 -0
- data/lib/active_admin/resource/scopes.rb +50 -0
- data/lib/active_admin/resource/sidebars.rb +28 -0
- data/lib/active_admin/resource_collection.rb +70 -0
- data/lib/active_admin/resource_controller.rb +50 -0
- data/lib/active_admin/resource_controller/action_builder.rb +21 -0
- data/lib/active_admin/resource_controller/data_access.rb +284 -0
- data/lib/active_admin/resource_controller/decorators.rb +100 -0
- data/lib/active_admin/resource_controller/resource_class_methods.rb +24 -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_dsl.rb +171 -0
- data/lib/active_admin/router.rb +106 -0
- data/lib/active_admin/scope.rb +57 -0
- data/lib/active_admin/sidebar_section.rb +45 -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 +21 -0
- data/lib/active_admin/view_helpers/active_admin_application_helper.rb +12 -0
- data/lib/active_admin/view_helpers/assigns_with_indifferent_access_helper.rb +7 -0
- data/lib/active_admin/view_helpers/auto_link_helper.rb +37 -0
- data/lib/active_admin/view_helpers/breadcrumb_helper.rb +27 -0
- data/lib/active_admin/view_helpers/display_helper.rb +64 -0
- data/lib/active_admin/view_helpers/download_format_links_helper.rb +49 -0
- data/lib/active_admin/view_helpers/fields_for.rb +50 -0
- data/lib/active_admin/view_helpers/flash_helper.rb +13 -0
- data/lib/active_admin/view_helpers/form_helper.rb +21 -0
- data/lib/active_admin/view_helpers/icon_helper.rb +12 -0
- data/lib/active_admin/view_helpers/method_or_proc_helper.rb +93 -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/action_list_popover.rb +29 -0
- data/lib/active_admin/views/components/attributes_table.rb +105 -0
- data/lib/active_admin/views/components/blank_slate.rb +17 -0
- data/lib/active_admin/views/components/columns.rb +157 -0
- data/lib/active_admin/views/components/dropdown_menu.rb +73 -0
- data/lib/active_admin/views/components/index_list.rb +68 -0
- data/lib/active_admin/views/components/paginated_collection.rb +126 -0
- data/lib/active_admin/views/components/panel.rb +34 -0
- data/lib/active_admin/views/components/popover.rb +27 -0
- data/lib/active_admin/views/components/scopes.rb +66 -0
- data/lib/active_admin/views/components/sidebar_section.rb +29 -0
- data/lib/active_admin/views/components/site_title.rb +55 -0
- data/lib/active_admin/views/components/status_tag.rb +67 -0
- data/lib/active_admin/views/components/table_for.rb +212 -0
- data/lib/active_admin/views/footer.rb +20 -0
- data/lib/active_admin/views/header.rb +32 -0
- data/lib/active_admin/views/index_as_block.rb +36 -0
- data/lib/active_admin/views/index_as_blog.rb +156 -0
- data/lib/active_admin/views/index_as_grid.rb +80 -0
- data/lib/active_admin/views/index_as_table.rb +277 -0
- data/lib/active_admin/views/pages/base.rb +139 -0
- data/lib/active_admin/views/pages/form.rb +51 -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 +59 -0
- data/lib/active_admin/views/tabbed_navigation.rb +62 -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 +16 -0
- data/lib/generators/active_admin/assets/templates/active_admin.css.scss +17 -0
- data/lib/generators/active_admin/assets/templates/active_admin.js.coffee +1 -0
- data/lib/generators/active_admin/devise/devise_generator.rb +66 -0
- data/lib/generators/active_admin/install/install_generator.rb +46 -0
- data/lib/generators/active_admin/install/templates/active_admin.rb.erb +243 -0
- data/lib/generators/active_admin/install/templates/admin_user.rb.erb +30 -0
- data/lib/generators/active_admin/install/templates/dashboard.rb +33 -0
- data/lib/generators/active_admin/install/templates/migrations/create_active_admin_comments.rb +19 -0
- data/lib/generators/active_admin/resource/resource_generator.rb +16 -0
- data/lib/generators/active_admin/resource/templates/admin.rb +17 -0
- data/lib/ransack_ext.rb +12 -0
- data/script/local +44 -0
- data/script/use_rails +53 -0
- data/spec/integration/default_namespace_spec.rb +61 -0
- data/spec/integration/javascript_spec.rb +20 -0
- data/spec/integration/memory_spec.rb +29 -0
- data/spec/integration/stylesheets_spec.rb +18 -0
- data/spec/javascripts/coffeescripts/jquery.aa.checkbox-toggler-spec.js.coffee +50 -0
- data/spec/javascripts/coffeescripts/jquery.aa.popover-spec.js.coffee +82 -0
- data/spec/javascripts/coffeescripts/jquery.aa.table-checkbox-toggler-spec.js.coffee +34 -0
- data/spec/javascripts/compiled/jquery.aa.checkbox-toggler-spec.js +60 -0
- data/spec/javascripts/compiled/jquery.aa.popover-spec.js +106 -0
- data/spec/javascripts/compiled/jquery.aa.table-checkbox-toggler-spec.js +37 -0
- data/spec/javascripts/fixtures/checkboxes.html +9 -0
- data/spec/javascripts/fixtures/table_checkboxes.html +17 -0
- data/spec/javascripts/helpers/SpecHelper.js +3 -0
- data/spec/javascripts/helpers/vendor/jasmine-fixture-0.0.5.js +108 -0
- data/spec/javascripts/helpers/vendor/jasmine-jquery.js +288 -0
- data/spec/javascripts/helpers/vendor/sinon-1.2.0.js +2915 -0
- data/spec/javascripts/support/jasmine.yml +74 -0
- data/spec/javascripts/support/jasmine_config.rb +23 -0
- data/spec/javascripts/support/jasmine_runner.rb +32 -0
- data/spec/javascripts/support/jquery-ui-1.8.16.custom.min.js +34 -0
- data/spec/javascripts/support/jquery.min.js +4 -0
- data/spec/spec_helper.rb +182 -0
- data/spec/spec_helper_without_rails.rb +16 -0
- data/spec/support/deferred_garbage_collection.rb +19 -0
- data/spec/support/detect_rails_version.rb +42 -0
- data/spec/support/integration_example_group.rb +31 -0
- data/spec/support/jslint.yml +80 -0
- data/spec/support/rails_template.rb +117 -0
- data/spec/support/rails_template_with_data.rb +59 -0
- data/spec/support/templates/admin/stores.rb +11 -0
- data/spec/support/templates/cucumber.rb +24 -0
- data/spec/support/templates/cucumber_with_reloading.rb +5 -0
- data/spec/support/templates/en.yml +8 -0
- data/spec/support/templates/policies/active_admin/comment_policy.rb +9 -0
- data/spec/support/templates/policies/active_admin/page_policy.rb +18 -0
- data/spec/support/templates/policies/admin_user_policy.rb +11 -0
- data/spec/support/templates/policies/application_policy.rb +45 -0
- data/spec/support/templates/policies/category_policy.rb +7 -0
- data/spec/support/templates/policies/post_policy.rb +15 -0
- data/spec/support/templates/policies/store_policy.rb +11 -0
- data/spec/support/templates/policies/user_policy.rb +11 -0
- data/spec/support/templates/post_decorator.rb +11 -0
- data/spec/unit/abstract_view_factory_spec.rb +79 -0
- data/spec/unit/action_builder_spec.rb +126 -0
- data/spec/unit/active_admin_spec.rb +11 -0
- data/spec/unit/application_spec.rb +140 -0
- data/spec/unit/asset_registration_spec.rb +52 -0
- data/spec/unit/authorization/authorization_adapter_spec.rb +61 -0
- data/spec/unit/authorization/controller_authorization_spec.rb +39 -0
- data/spec/unit/auto_link_spec.rb +34 -0
- data/spec/unit/batch_actions/resource_spec.rb +92 -0
- data/spec/unit/batch_actions/settings_spec.rb +61 -0
- data/spec/unit/belongs_to_spec.rb +42 -0
- data/spec/unit/cancan_adapter_spec.rb +43 -0
- data/spec/unit/comments_spec.rb +144 -0
- data/spec/unit/component_spec.rb +18 -0
- data/spec/unit/config_shared_examples.rb +59 -0
- data/spec/unit/controller_filters_spec.rb +37 -0
- data/spec/unit/csv_builder_spec.rb +134 -0
- data/spec/unit/devise_spec.rb +116 -0
- data/spec/unit/dsl_spec.rb +61 -0
- data/spec/unit/event_spec.rb +47 -0
- data/spec/unit/filters/filter_form_builder_spec.rb +418 -0
- data/spec/unit/filters/resource_spec.rb +121 -0
- data/spec/unit/form_builder_spec.rb +576 -0
- data/spec/unit/generators/install_spec.rb +23 -0
- data/spec/unit/helpers/collection_spec.rb +65 -0
- data/spec/unit/helpers/scope_chain_spec.rb +36 -0
- data/spec/unit/helpers/settings_spec.rb +30 -0
- data/spec/unit/menu_collection_spec.rb +62 -0
- data/spec/unit/menu_item_spec.rb +143 -0
- data/spec/unit/menu_spec.rb +71 -0
- data/spec/unit/namespace/authorization_spec.rb +27 -0
- data/spec/unit/namespace/register_page_spec.rb +74 -0
- data/spec/unit/namespace/register_resource_spec.rb +163 -0
- data/spec/unit/namespace_spec.rb +103 -0
- data/spec/unit/order_clause_spec.rb +57 -0
- data/spec/unit/page_controller_spec.rb +5 -0
- data/spec/unit/page_spec.rb +72 -0
- data/spec/unit/pretty_format_spec.rb +63 -0
- data/spec/unit/pundit_adapter_spec.rb +36 -0
- data/spec/unit/resource/action_items_spec.rb +62 -0
- data/spec/unit/resource/menu_spec.rb +18 -0
- data/spec/unit/resource/naming_spec.rb +122 -0
- data/spec/unit/resource/page_presenters_spec.rb +44 -0
- data/spec/unit/resource/pagination_spec.rb +38 -0
- data/spec/unit/resource/routes_spec.rb +73 -0
- data/spec/unit/resource/scopes_spec.rb +50 -0
- data/spec/unit/resource/sidebars_spec.rb +43 -0
- data/spec/unit/resource_collection_spec.rb +158 -0
- data/spec/unit/resource_controller/data_access_spec.rb +73 -0
- data/spec/unit/resource_controller/decorators_spec.rb +86 -0
- data/spec/unit/resource_controller/sidebars_spec.rb +46 -0
- data/spec/unit/resource_controller_spec.rb +265 -0
- data/spec/unit/resource_registration_spec.rb +56 -0
- data/spec/unit/resource_spec.rb +263 -0
- data/spec/unit/routing_spec.rb +172 -0
- data/spec/unit/scope_spec.rb +114 -0
- data/spec/unit/settings_spec.rb +88 -0
- data/spec/unit/view_factory_spec.rb +21 -0
- data/spec/unit/view_helpers/breadcrumbs_spec.rb +180 -0
- data/spec/unit/view_helpers/display_name_spec.rb +68 -0
- data/spec/unit/view_helpers/download_format_links_helper_spec.rb +39 -0
- data/spec/unit/view_helpers/fields_for_spec.rb +50 -0
- data/spec/unit/view_helpers/form_helper_spec.rb +42 -0
- data/spec/unit/view_helpers/method_or_proc_helper_spec.rb +97 -0
- data/spec/unit/views/components/action_list_popover_spec.rb +29 -0
- data/spec/unit/views/components/attributes_table_spec.rb +259 -0
- data/spec/unit/views/components/batch_action_popover_spec.rb +33 -0
- data/spec/unit/views/components/blank_slate_spec.rb +17 -0
- data/spec/unit/views/components/columns_spec.rb +172 -0
- data/spec/unit/views/components/index_list_spec.rb +32 -0
- data/spec/unit/views/components/paginated_collection_spec.rb +229 -0
- data/spec/unit/views/components/panel_spec.rb +51 -0
- data/spec/unit/views/components/popover_spec.rb +33 -0
- data/spec/unit/views/components/sidebar_section_spec.rb +47 -0
- data/spec/unit/views/components/site_title_spec.rb +78 -0
- data/spec/unit/views/components/status_tag_spec.rb +102 -0
- data/spec/unit/views/components/table_for_spec.rb +242 -0
- data/spec/unit/views/pages/form_spec.rb +35 -0
- data/spec/unit/views/pages/layout_spec.rb +63 -0
- data/spec/unit/views/pages/show_spec.rb +20 -0
- data/spec/unit/views/tabbed_navigation_spec.rb +149 -0
- data/tasks/docs.rake +37 -0
- data/tasks/js.rake +32 -0
- data/tasks/parallel_tests.rake +60 -0
- data/tasks/test.rake +79 -0
- data/tasks/yard.rake +7 -0
- metadata +741 -0
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
require 'inherited_resources'
|
|
2
|
+
|
|
3
|
+
require 'active_admin/base_controller/authorization'
|
|
4
|
+
require 'active_admin/base_controller/menu'
|
|
5
|
+
|
|
6
|
+
module ActiveAdmin
|
|
7
|
+
# BaseController for ActiveAdmin.
|
|
8
|
+
# It implements ActiveAdmin controllers core features.
|
|
9
|
+
class BaseController < ::InheritedResources::Base
|
|
10
|
+
helper ::ActiveAdmin::ViewHelpers
|
|
11
|
+
|
|
12
|
+
layout :determine_active_admin_layout
|
|
13
|
+
|
|
14
|
+
before_filter :only_render_implemented_actions
|
|
15
|
+
before_filter :authenticate_active_admin_user
|
|
16
|
+
|
|
17
|
+
class << self
|
|
18
|
+
# Ensure that this method is available for the DSL
|
|
19
|
+
public :actions
|
|
20
|
+
|
|
21
|
+
# Reference to the Resource object which initialized
|
|
22
|
+
# this controller
|
|
23
|
+
attr_accessor :active_admin_config
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
# By default Rails will render un-implemented actions when the view exists. Becuase Active
|
|
27
|
+
# Admin allows you to not render any of the actions by using the #actions method, we need
|
|
28
|
+
# to check if they are implemented.
|
|
29
|
+
def only_render_implemented_actions
|
|
30
|
+
raise AbstractController::ActionNotFound unless action_methods.include?(params[:action])
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
include Menu
|
|
34
|
+
include Authorization
|
|
35
|
+
|
|
36
|
+
private
|
|
37
|
+
|
|
38
|
+
# Calls the authentication method as defined in ActiveAdmin.authentication_method
|
|
39
|
+
def authenticate_active_admin_user
|
|
40
|
+
send(active_admin_namespace.authentication_method) if active_admin_namespace.authentication_method
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
def current_active_admin_user
|
|
44
|
+
send(active_admin_namespace.current_user_method) if active_admin_namespace.current_user_method
|
|
45
|
+
end
|
|
46
|
+
helper_method :current_active_admin_user
|
|
47
|
+
|
|
48
|
+
def current_active_admin_user?
|
|
49
|
+
!!current_active_admin_user
|
|
50
|
+
end
|
|
51
|
+
helper_method :current_active_admin_user?
|
|
52
|
+
|
|
53
|
+
def active_admin_config
|
|
54
|
+
self.class.active_admin_config
|
|
55
|
+
end
|
|
56
|
+
helper_method :active_admin_config
|
|
57
|
+
|
|
58
|
+
def active_admin_namespace
|
|
59
|
+
active_admin_config.namespace
|
|
60
|
+
end
|
|
61
|
+
helper_method :active_admin_namespace
|
|
62
|
+
|
|
63
|
+
|
|
64
|
+
ACTIVE_ADMIN_ACTIONS = [:index, :show, :new, :create, :edit, :update, :destroy]
|
|
65
|
+
|
|
66
|
+
# Determine which layout to use.
|
|
67
|
+
#
|
|
68
|
+
# 1. If we're rendering a standard Active Admin action, we want layout(false)
|
|
69
|
+
# because these actions are subclasses of the Base page (which implements
|
|
70
|
+
# all the required layout code)
|
|
71
|
+
# 2. If we're rendering a custom action, we'll use the active_admin layout so
|
|
72
|
+
# that users can render any template inside Active Admin.
|
|
73
|
+
def determine_active_admin_layout
|
|
74
|
+
ACTIVE_ADMIN_ACTIONS.include?(params[:action].to_sym) ? false : 'active_admin'
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
end
|
|
78
|
+
end
|
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
module ActiveAdmin
|
|
2
|
+
|
|
3
|
+
# Exception class to raise when there is an authorized access
|
|
4
|
+
# exception thrown. The exception has a few goodies that may
|
|
5
|
+
# be useful for capturing / recognizing security issues.
|
|
6
|
+
class AccessDenied < StandardError
|
|
7
|
+
attr_reader :user, :action, :subject
|
|
8
|
+
|
|
9
|
+
def initialize(user, action, subject)
|
|
10
|
+
@user, @action, @subject = user, action, subject
|
|
11
|
+
|
|
12
|
+
super()
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
def message
|
|
16
|
+
I18n.t("active_admin.access_denied.message")
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
class BaseController < ::InheritedResources::Base
|
|
21
|
+
module Authorization
|
|
22
|
+
include MethodOrProcHelper
|
|
23
|
+
extend ActiveSupport::Concern
|
|
24
|
+
|
|
25
|
+
ACTIONS_DICTIONARY = {
|
|
26
|
+
index: ActiveAdmin::Authorization::READ,
|
|
27
|
+
show: ActiveAdmin::Authorization::READ,
|
|
28
|
+
new: ActiveAdmin::Authorization::CREATE,
|
|
29
|
+
create: ActiveAdmin::Authorization::CREATE,
|
|
30
|
+
edit: ActiveAdmin::Authorization::UPDATE,
|
|
31
|
+
update: ActiveAdmin::Authorization::UPDATE,
|
|
32
|
+
destroy: ActiveAdmin::Authorization::DESTROY
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
included do
|
|
36
|
+
rescue_from ActiveAdmin::AccessDenied, with: :dispatch_active_admin_access_denied
|
|
37
|
+
|
|
38
|
+
helper_method :authorized?
|
|
39
|
+
helper_method :authorize!
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
protected
|
|
43
|
+
|
|
44
|
+
# Authorize the action and subject. Available in the controller
|
|
45
|
+
# as well as all the views.
|
|
46
|
+
#
|
|
47
|
+
# @param [Symbol] action The action to check if the user has permission
|
|
48
|
+
# to perform on the subject.
|
|
49
|
+
#
|
|
50
|
+
# @param [any] subject The subject that the user is trying to perform
|
|
51
|
+
# the action on.
|
|
52
|
+
#
|
|
53
|
+
# @returns [Boolean]
|
|
54
|
+
#
|
|
55
|
+
def authorized?(action, subject = nil)
|
|
56
|
+
active_admin_authorization.authorized?(action, subject)
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
|
|
60
|
+
# Authorize the action and subject. Available in the controller
|
|
61
|
+
# as well as all the views. If the action is not allowd, it raises
|
|
62
|
+
# an ActiveAdmin::AccessDenied exception.
|
|
63
|
+
#
|
|
64
|
+
# @param [Symbol] action The action to check if the user has permission
|
|
65
|
+
# to perform on the subject.
|
|
66
|
+
#
|
|
67
|
+
# @param [any] subject The subject that the user is trying to perform
|
|
68
|
+
# the action on.
|
|
69
|
+
#
|
|
70
|
+
# @returns [Boolean] True if authorized, otherwise raises
|
|
71
|
+
# an ActiveAdmin::AccessDenied.
|
|
72
|
+
def authorize!(action, subject = nil)
|
|
73
|
+
unless authorized? action, subject
|
|
74
|
+
raise ActiveAdmin::AccessDenied.new(current_active_admin_user,
|
|
75
|
+
action,
|
|
76
|
+
subject)
|
|
77
|
+
end
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
# Performs authorization on the resource using the current controller
|
|
81
|
+
# action as the permission action.
|
|
82
|
+
#
|
|
83
|
+
def authorize_resource!(resource)
|
|
84
|
+
permission = action_to_permission(params[:action])
|
|
85
|
+
authorize! permission, resource
|
|
86
|
+
end
|
|
87
|
+
|
|
88
|
+
# Retrieve or instantiate the authorization instance for this resource
|
|
89
|
+
#
|
|
90
|
+
# @returns [ActiveAdmin::AuthorizationAdapter]
|
|
91
|
+
def active_admin_authorization
|
|
92
|
+
@active_admin_authorization ||=
|
|
93
|
+
active_admin_authorization_adapter.new active_admin_config, current_active_admin_user
|
|
94
|
+
end
|
|
95
|
+
|
|
96
|
+
# Returns the class to be used as the authorization adapter
|
|
97
|
+
#
|
|
98
|
+
# @returns [Class]
|
|
99
|
+
def active_admin_authorization_adapter
|
|
100
|
+
adapter = active_admin_namespace.authorization_adapter
|
|
101
|
+
if adapter.is_a? String
|
|
102
|
+
ActiveSupport::Dependencies.constantize adapter
|
|
103
|
+
else
|
|
104
|
+
adapter
|
|
105
|
+
end
|
|
106
|
+
end
|
|
107
|
+
|
|
108
|
+
# Converts a controller action into one of the correct Active Admin
|
|
109
|
+
# authorization names. Uses the ACTIONS_DICTIONARY to convert the
|
|
110
|
+
# action name to permission.
|
|
111
|
+
#
|
|
112
|
+
# @param [String, Symbol] action The controller action name.
|
|
113
|
+
#
|
|
114
|
+
# @returns [Symbol] The permission name to use.
|
|
115
|
+
def action_to_permission(action)
|
|
116
|
+
if action && action = action.to_sym
|
|
117
|
+
Authorization::ACTIONS_DICTIONARY[action] || action
|
|
118
|
+
end
|
|
119
|
+
end
|
|
120
|
+
|
|
121
|
+
def dispatch_active_admin_access_denied(exception)
|
|
122
|
+
call_method_or_exec_proc active_admin_namespace.on_unauthorized_access, exception
|
|
123
|
+
end
|
|
124
|
+
|
|
125
|
+
def rescue_active_admin_access_denied(exception)
|
|
126
|
+
error = exception.message
|
|
127
|
+
|
|
128
|
+
respond_to do |format|
|
|
129
|
+
format.html do
|
|
130
|
+
flash[:error] = error
|
|
131
|
+
redirect_backwards_or_to_root
|
|
132
|
+
end
|
|
133
|
+
|
|
134
|
+
format.csv { render text: error, status: :unauthorized }
|
|
135
|
+
format.json { render json: { error: error }, status: :unauthorized }
|
|
136
|
+
format.xml { render xml: "<error>#{error}</error>", status: :unauthorized }
|
|
137
|
+
end
|
|
138
|
+
end
|
|
139
|
+
|
|
140
|
+
def redirect_backwards_or_to_root
|
|
141
|
+
if request.headers.key? "HTTP_REFERER"
|
|
142
|
+
redirect_to :back
|
|
143
|
+
else
|
|
144
|
+
controller, action = active_admin_namespace.root_to.split '#'
|
|
145
|
+
redirect_to controller: controller, action: action
|
|
146
|
+
end
|
|
147
|
+
end
|
|
148
|
+
|
|
149
|
+
end
|
|
150
|
+
end
|
|
151
|
+
end
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
module ActiveAdmin
|
|
2
|
+
class BaseController < ::InheritedResources::Base
|
|
3
|
+
module Menu
|
|
4
|
+
extend ActiveSupport::Concern
|
|
5
|
+
|
|
6
|
+
included do
|
|
7
|
+
before_filter :set_current_tab
|
|
8
|
+
helper_method :current_menu
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
protected
|
|
12
|
+
|
|
13
|
+
def current_menu
|
|
14
|
+
active_admin_config.navigation_menu
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
# Set's @current_tab to be name of the tab to mark as current
|
|
18
|
+
# Get's called through a before filter
|
|
19
|
+
def set_current_tab
|
|
20
|
+
@current_tab = if current_menu && active_admin_config.belongs_to? && parent?
|
|
21
|
+
parent_item = active_admin_config.belongs_to_config.target.menu_item
|
|
22
|
+
if current_menu.include? parent_item
|
|
23
|
+
parent_item
|
|
24
|
+
else
|
|
25
|
+
active_admin_config.menu_item
|
|
26
|
+
end
|
|
27
|
+
else
|
|
28
|
+
active_admin_config.menu_item
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
end
|
|
33
|
+
end
|
|
34
|
+
end
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
ActiveAdmin.before_load do |app|
|
|
2
|
+
require "active_admin/batch_actions/resource_extension"
|
|
3
|
+
require "active_admin/batch_actions/controller"
|
|
4
|
+
|
|
5
|
+
# Add our Extensions
|
|
6
|
+
ActiveAdmin::Resource.send :include, ActiveAdmin::BatchActions::ResourceExtension
|
|
7
|
+
ActiveAdmin::ResourceController.send :include, ActiveAdmin::BatchActions::Controller
|
|
8
|
+
|
|
9
|
+
# Require all the views
|
|
10
|
+
require "active_admin/batch_actions/views/batch_action_form"
|
|
11
|
+
require "active_admin/batch_actions/views/batch_action_popover"
|
|
12
|
+
require "active_admin/batch_actions/views/selection_cells"
|
|
13
|
+
require "active_admin/batch_actions/views/batch_action_selector"
|
|
14
|
+
|
|
15
|
+
# Register the views with the view factory
|
|
16
|
+
app.view_factory.register batch_action_selector: ActiveAdmin::BatchActions::BatchActionSelector
|
|
17
|
+
end
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
module ActiveAdmin
|
|
2
|
+
module BatchActions
|
|
3
|
+
module Controller
|
|
4
|
+
|
|
5
|
+
# Controller action that is called when submitting the batch action form
|
|
6
|
+
def batch_action
|
|
7
|
+
if action_present?
|
|
8
|
+
selection = params[:collection_selection] || []
|
|
9
|
+
inputs = JSON.parse params[:batch_action_inputs] || '{}'
|
|
10
|
+
inputs = inputs.with_indifferent_access.slice *current_batch_action.inputs.keys
|
|
11
|
+
instance_exec selection, inputs, ¤t_batch_action.block
|
|
12
|
+
else
|
|
13
|
+
raise "Couldn't find batch action \"#{params[:batch_action]}\""
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
protected
|
|
18
|
+
|
|
19
|
+
def action_present?
|
|
20
|
+
params[:batch_action].present? && current_batch_action
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
def current_batch_action
|
|
24
|
+
active_admin_config.batch_actions.detect{ |action| action.sym.to_s == params[:batch_action] }
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
end
|
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
module ActiveAdmin
|
|
2
|
+
|
|
3
|
+
module BatchActions
|
|
4
|
+
module ResourceExtension
|
|
5
|
+
def initialize(*)
|
|
6
|
+
super
|
|
7
|
+
@batch_actions = {}
|
|
8
|
+
add_default_batch_action
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
# @return [Array] The set of batch actions for this resource
|
|
12
|
+
def batch_actions
|
|
13
|
+
batch_actions_enabled? ? @batch_actions.values.sort : []
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
# @return [Boolean] If batch actions are enabled for this resource
|
|
17
|
+
def batch_actions_enabled?
|
|
18
|
+
# If the resource config has been set, use it. Otherwise
|
|
19
|
+
# return the namespace setting
|
|
20
|
+
@batch_actions_enabled.nil? ? namespace.batch_actions : @batch_actions_enabled
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
# Disable or Enable batch actions for this resource
|
|
24
|
+
# Set to `nil` to inherit the setting from the namespace
|
|
25
|
+
def batch_actions=(bool)
|
|
26
|
+
@batch_actions_enabled = bool
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
# Add a new batch item to a resource
|
|
30
|
+
# @param [String] title
|
|
31
|
+
# @param [Hash] options
|
|
32
|
+
# => :if is a proc that will be called to determine if the BatchAction should be displayed
|
|
33
|
+
# => :sort_order is used to sort the batch actions ascending
|
|
34
|
+
# => :confirm is a string to prompt the user with (or a boolean to use the default message)
|
|
35
|
+
# => :form is a Hash of form fields you want the user to fill out
|
|
36
|
+
#
|
|
37
|
+
def add_batch_action(sym, title, options = {}, &block)
|
|
38
|
+
@batch_actions[sym] = ActiveAdmin::BatchAction.new(sym, title, options, &block)
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
# Remove a batch action
|
|
42
|
+
# @param [Symbol] sym
|
|
43
|
+
# @returns [ActiveAdmin::BatchAction] the batch action, if it was present
|
|
44
|
+
#
|
|
45
|
+
def remove_batch_action(sym)
|
|
46
|
+
@batch_actions.delete(sym.to_sym)
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
# Clears all the existing batch actions for this resource
|
|
50
|
+
def clear_batch_actions!
|
|
51
|
+
@batch_actions = {}
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
# Path to the batch action itself
|
|
55
|
+
def batch_action_path(params = {})
|
|
56
|
+
[route_collection_path(params), "batch_action"].join("/")
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
private
|
|
60
|
+
|
|
61
|
+
# @return [ActiveAdmin::BatchAction] The default "delete" action
|
|
62
|
+
def add_default_batch_action
|
|
63
|
+
destroy_options = {
|
|
64
|
+
priority: 100,
|
|
65
|
+
confirm: proc{ I18n.t('active_admin.batch_actions.delete_confirmation', plural_model: active_admin_config.plural_resource_label.downcase) },
|
|
66
|
+
if: proc{ controller.action_methods.include?('destroy') && authorized?(ActiveAdmin::Auth::DESTROY, active_admin_config.resource_class) }
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
add_batch_action :destroy, proc { I18n.t('active_admin.delete') }, destroy_options do |selected_ids|
|
|
70
|
+
active_admin_config.resource_class.find(selected_ids).each { |r| r.destroy }
|
|
71
|
+
|
|
72
|
+
redirect_to active_admin_config.route_collection_path(params),
|
|
73
|
+
notice: I18n.t("active_admin.batch_actions.succesfully_destroyed",
|
|
74
|
+
count: selected_ids.count,
|
|
75
|
+
model: active_admin_config.resource_label.downcase,
|
|
76
|
+
plural_model: active_admin_config.plural_resource_label(count: selected_ids.count).downcase)
|
|
77
|
+
end
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
end
|
|
81
|
+
end
|
|
82
|
+
|
|
83
|
+
class BatchAction
|
|
84
|
+
|
|
85
|
+
include Comparable
|
|
86
|
+
|
|
87
|
+
attr_reader :block, :title, :sym
|
|
88
|
+
|
|
89
|
+
DEFAULT_CONFIRM_MESSAGE = proc{ I18n.t 'active_admin.batch_actions.default_confirmation' }
|
|
90
|
+
|
|
91
|
+
# Create a Batch Action
|
|
92
|
+
#
|
|
93
|
+
# Examples:
|
|
94
|
+
#
|
|
95
|
+
# BatchAction.new :flag
|
|
96
|
+
# => Will create an action that appears in the action list popover
|
|
97
|
+
#
|
|
98
|
+
# BatchAction.new(:flag) { |selection| redirect_to collection_path, notice: "#{selection.length} users flagged" }
|
|
99
|
+
# => Will create an action that uses a block to process the request (which receives one paramater of the selected objects)
|
|
100
|
+
#
|
|
101
|
+
# BatchAction.new("Perform Long Operation on") { |selection| }
|
|
102
|
+
# => You can create batch actions with a title instead of a Symbol
|
|
103
|
+
#
|
|
104
|
+
# BatchAction.new(:flag, if: proc{ can? :flag, AdminUser }) { |selection| }
|
|
105
|
+
# => You can provide an `:if` proc to choose when the batch action should be displayed
|
|
106
|
+
#
|
|
107
|
+
# BatchAction.new :flag, confirm: true
|
|
108
|
+
# => You can pass `true` to `:confirm` to use the default confirm message.
|
|
109
|
+
#
|
|
110
|
+
# BatchAction.new(:flag, confirm: "Are you sure?") { |selection| }
|
|
111
|
+
# => You can pass a custom confirmation message through `:confirm`
|
|
112
|
+
#
|
|
113
|
+
# BatchAction.new(:flag, form: {foo: :text, bar: :checkbox}) { |selection, inputs| }
|
|
114
|
+
# => You can pass a hash of options to `:form` that will be rendered as form input fields for the user to fill out.
|
|
115
|
+
#
|
|
116
|
+
def initialize(sym, title, options = {}, &block)
|
|
117
|
+
@sym, @title, @options, @block, @confirm = sym, title, options, block, options[:confirm]
|
|
118
|
+
@block ||= proc {}
|
|
119
|
+
end
|
|
120
|
+
|
|
121
|
+
def confirm
|
|
122
|
+
if @confirm == true
|
|
123
|
+
DEFAULT_CONFIRM_MESSAGE
|
|
124
|
+
elsif !@confirm && @options[:form]
|
|
125
|
+
DEFAULT_CONFIRM_MESSAGE
|
|
126
|
+
else
|
|
127
|
+
@confirm
|
|
128
|
+
end
|
|
129
|
+
end
|
|
130
|
+
|
|
131
|
+
def inputs
|
|
132
|
+
HashWithIndifferentAccess.new \
|
|
133
|
+
@options[:form].is_a?(Proc) ? @options[:form].call : @options[:form]
|
|
134
|
+
end
|
|
135
|
+
|
|
136
|
+
# Returns the display if block. If the block was not explicitly defined
|
|
137
|
+
# a default block always returning true will be returned.
|
|
138
|
+
def display_if_block
|
|
139
|
+
@options[:if] || proc{ true }
|
|
140
|
+
end
|
|
141
|
+
|
|
142
|
+
# Used for sorting
|
|
143
|
+
def priority
|
|
144
|
+
@options[:priority] || 10
|
|
145
|
+
end
|
|
146
|
+
|
|
147
|
+
# sort operator
|
|
148
|
+
def <=>(other)
|
|
149
|
+
self.priority <=> other.priority
|
|
150
|
+
end
|
|
151
|
+
|
|
152
|
+
end
|
|
153
|
+
|
|
154
|
+
end
|