aa-rails4 0.6.0
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/.document +5 -0
- data/.gitignore +43 -0
- data/.travis.yml +8 -0
- data/.yardopts +7 -0
- data/CHANGELOG.md +894 -0
- data/CONTRIBUTING.md +121 -0
- data/Gemfile +40 -0
- data/Guardfile +7 -0
- data/LICENSE +25 -0
- data/README.rdoc +118 -0
- data/Rakefile +26 -0
- data/activeadmin.gemspec +33 -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 +3 -0
- data/app/assets/javascripts/active_admin/base.js +5 -0
- data/app/assets/javascripts/active_admin/components/jquery.aa.checkbox-toggler.js.coffee +37 -0
- data/app/assets/javascripts/active_admin/components/jquery.aa.dropdown-menu.js.coffee +105 -0
- data/app/assets/javascripts/active_admin/components/jquery.aa.popover.js.coffee +97 -0
- data/app/assets/javascripts/active_admin/components/jquery.aa.table-checkbox-toggler.js.coffee +25 -0
- data/app/assets/javascripts/active_admin/lib/namespace.js.coffee +3 -0
- data/app/assets/javascripts/active_admin/pages/application.js.coffee +21 -0
- data/app/assets/javascripts/active_admin/pages/batch_actions.js.coffee +26 -0
- data/app/assets/stylesheets/active_admin/_base.css.scss +41 -0
- data/app/assets/stylesheets/active_admin/_forms.css.scss +281 -0
- data/app/assets/stylesheets/active_admin/_header.css.scss +152 -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 +123 -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/_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 +12 -0
- data/app/assets/stylesheets/active_admin/components/_table_tools.css.scss +95 -0
- data/app/assets/stylesheets/active_admin/components/_tables.css.scss +108 -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 +21 -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 +24 -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 +26 -0
- data/app/assets/stylesheets/active_admin/structure/_title_bar.scss +44 -0
- data/app/views/active_admin/dashboard/index.html.arb +1 -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/sessions/new.html.erb +18 -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/layouts/active_admin.html.arb +1 -0
- data/app/views/layouts/active_admin_logged_out.html.erb +37 -0
- data/config/locales/bg.yml +101 -0
- data/config/locales/ca.yml +98 -0
- data/config/locales/cs.yml +92 -0
- data/config/locales/da.yml +102 -0
- data/config/locales/de-CH.yml +117 -0
- data/config/locales/de.yml +119 -0
- data/config/locales/en-GB.yml +90 -0
- data/config/locales/en.yml +101 -0
- data/config/locales/es.yml +106 -0
- data/config/locales/es_MX.yml +104 -0
- data/config/locales/fr.yml +89 -0
- data/config/locales/he.yml +91 -0
- data/config/locales/hr.yml +93 -0
- data/config/locales/hu.yml +92 -0
- data/config/locales/it.yml +89 -0
- data/config/locales/ja.yml +87 -0
- data/config/locales/ko.yml +84 -0
- data/config/locales/lt.yml +90 -0
- data/config/locales/lv.yml +89 -0
- data/config/locales/nl.yml +90 -0
- data/config/locales/no-NB.yml +85 -0
- data/config/locales/pl.yml +93 -0
- data/config/locales/pt-BR.yml +89 -0
- data/config/locales/pt-PT.yml +89 -0
- data/config/locales/ro.yml +93 -0
- data/config/locales/ru.yml +103 -0
- data/config/locales/sv-SE.yml +89 -0
- data/config/locales/tr.yml +90 -0
- data/config/locales/uk.yml +100 -0
- data/config/locales/vi.yml +90 -0
- data/config/locales/zh-CN.yml +90 -0
- data/config/locales/zh-TW.yml +90 -0
- data/cucumber.yml +3 -0
- data/docs/0-installation.md +56 -0
- data/docs/1-general-configuration.md +129 -0
- data/docs/10-custom-pages.md +96 -0
- data/docs/11-decorators.md +66 -0
- data/docs/12-arbre-components.md +144 -0
- data/docs/13-authorization-adapter.md +206 -0
- data/docs/2-resource-customization.md +292 -0
- data/docs/3-index-pages.md +191 -0
- data/docs/3-index-pages/create-an-index.md +29 -0
- data/docs/3-index-pages/index-as-block.md +16 -0
- data/docs/3-index-pages/index-as-blog.md +61 -0
- data/docs/3-index-pages/index-as-grid.md +21 -0
- data/docs/3-index-pages/index-as-table.md +120 -0
- data/docs/4-csv-format.md +32 -0
- data/docs/5-forms.md +72 -0
- data/docs/6-show-pages.md +43 -0
- data/docs/7-sidebars.md +42 -0
- data/docs/8-custom-actions.md +139 -0
- data/docs/9-batch-actions.md +161 -0
- data/features/action_item.feature +73 -0
- data/features/authorization.feature +64 -0
- data/features/authorization_cancan.feature +52 -0
- data/features/belongs_to.feature +63 -0
- data/features/breadcrumb.feature +27 -0
- data/features/comments/commenting.feature +128 -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 +127 -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 +38 -0
- data/features/index/batch_actions.feature +123 -0
- data/features/index/filters.feature +94 -0
- data/features/index/format_as_csv.feature +117 -0
- data/features/index/formats.feature +39 -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 +195 -0
- data/features/index/index_blank_slate.feature +61 -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 +30 -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 +119 -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 +47 -0
- data/features/sidebar_sections.feature +198 -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 +13 -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 +93 -0
- data/features/step_definitions/dashboard_steps.rb +15 -0
- data/features/step_definitions/factory_steps.rb +33 -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 +46 -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 +8 -0
- data/features/step_definitions/site_title_steps.rb +15 -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 +39 -0
- data/features/step_definitions/web_steps.rb +82 -0
- data/features/sti_resource.feature +73 -0
- data/features/support/env.rb +118 -0
- data/features/support/paths.rb +63 -0
- data/features/support/selectors.rb +45 -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 +120 -0
- data/lib/active_admin/abstract_view_factory.rb +95 -0
- data/lib/active_admin/application.rb +245 -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 +153 -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 +25 -0
- data/lib/active_admin/batch_actions/resource_extension.rb +127 -0
- data/lib/active_admin/batch_actions/views/batch_action_form.rb +35 -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 +66 -0
- data/lib/active_admin/batch_actions/views/selection_cells.rb +37 -0
- data/lib/active_admin/callbacks.rb +87 -0
- data/lib/active_admin/cancan_adapter.rb +40 -0
- data/lib/active_admin/comments.rb +83 -0
- data/lib/active_admin/comments/comment.rb +49 -0
- data/lib/active_admin/comments/namespace_helper.rb +14 -0
- data/lib/active_admin/comments/resource_helper.rb +17 -0
- data/lib/active_admin/comments/show_page_helper.rb +23 -0
- data/lib/active_admin/comments/views.rb +2 -0
- data/lib/active_admin/comments/views/active_admin_comments.rb +75 -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 +49 -0
- data/lib/active_admin/deprecation.rb +36 -0
- data/lib/active_admin/devise.rb +70 -0
- data/lib/active_admin/dsl.rb +166 -0
- data/lib/active_admin/engine.rb +7 -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 +89 -0
- data/lib/active_admin/filters/formtastic_addons.rb +50 -0
- data/lib/active_admin/filters/resource_extension.rb +129 -0
- data/lib/active_admin/form_builder.rb +189 -0
- data/lib/active_admin/helpers/collection.rb +23 -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 +108 -0
- data/lib/active_admin/iconic.rb +51 -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 +11 -0
- data/lib/active_admin/inputs/filter_base.rb +33 -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 +40 -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 +45 -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 +221 -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/resource.rb +160 -0
- data/lib/active_admin/resource/action_items.rb +93 -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 +78 -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 +27 -0
- data/lib/active_admin/resource_collection.rb +42 -0
- data/lib/active_admin/resource_controller.rb +51 -0
- data/lib/active_admin/resource_controller/action_builder.rb +21 -0
- data/lib/active_admin/resource_controller/actions.rb +81 -0
- data/lib/active_admin/resource_controller/data_access.rb +303 -0
- data/lib/active_admin/resource_controller/decorators.rb +20 -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 +134 -0
- data/lib/active_admin/router.rb +106 -0
- data/lib/active_admin/scope.rb +57 -0
- data/lib/active_admin/sidebar_section.rb +37 -0
- data/lib/active_admin/version.rb +3 -0
- data/lib/active_admin/view_factory.rb +28 -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 +34 -0
- data/lib/active_admin/view_helpers/breadcrumb_helper.rb +26 -0
- data/lib/active_admin/view_helpers/display_helper.rb +47 -0
- data/lib/active_admin/view_helpers/download_format_links_helper.rb +50 -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 +24 -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 +70 -0
- data/lib/active_admin/views/components/blank_slate.rb +17 -0
- data/lib/active_admin/views/components/columns.rb +150 -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 +123 -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 +65 -0
- data/lib/active_admin/views/components/sidebar_section.rb +28 -0
- data/lib/active_admin/views/components/site_title.rb +55 -0
- data/lib/active_admin/views/components/status_tag.rb +56 -0
- data/lib/active_admin/views/components/table_for.rb +191 -0
- data/lib/active_admin/views/dashboard_section_renderer.rb +19 -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 +150 -0
- data/lib/active_admin/views/index_as_grid.rb +76 -0
- data/lib/active_admin/views/index_as_table.rb +238 -0
- data/lib/active_admin/views/pages/base.rb +139 -0
- data/lib/active_admin/views/pages/dashboard.rb +62 -0
- data/lib/active_admin/views/pages/form.rb +51 -0
- data/lib/active_admin/views/pages/index.rb +158 -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 +53 -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 +78 -0
- data/lib/generators/active_admin/install/install_generator.rb +46 -0
- data/lib/generators/active_admin/install/templates/active_admin.rb.erb +214 -0
- data/lib/generators/active_admin/install/templates/admin_user.rb.erb +27 -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 +3 -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 +41 -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 +175 -0
- data/spec/spec_helper_without_rails.rb +11 -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 +104 -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/post_decorator.rb +53 -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 +141 -0
- data/spec/unit/asset_registration_spec.rb +56 -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 +39 -0
- data/spec/unit/batch_actions/resource_spec.rb +91 -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 +106 -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 +27 -0
- data/spec/unit/csv_builder_spec.rb +103 -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 +338 -0
- data/spec/unit/filters/resource_spec.rb +87 -0
- data/spec/unit/form_builder_spec.rb +478 -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/page_controller_spec.rb +5 -0
- data/spec/unit/page_spec.rb +72 -0
- data/spec/unit/pretty_format_spec.rb +35 -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 +108 -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 +43 -0
- data/spec/unit/resource/sidebars_spec.rb +43 -0
- data/spec/unit/resource_collection_spec.rb +79 -0
- data/spec/unit/resource_controller/data_access_spec.rb +73 -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 +243 -0
- data/spec/unit/routing_spec.rb +172 -0
- data/spec/unit/scope_spec.rb +108 -0
- data/spec/unit/settings_spec.rb +88 -0
- data/spec/unit/view_factory_spec.rb +22 -0
- data/spec/unit/view_helpers/breadcrumbs_spec.rb +152 -0
- data/spec/unit/view_helpers/display_name_spec.rb +41 -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 +56 -0
- data/spec/unit/view_helpers/method_or_proc_helper_spec.rb +97 -0
- data/spec/unit/views/components/action_list_popover_spec.rb +30 -0
- data/spec/unit/views/components/attributes_table_spec.rb +131 -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 +142 -0
- data/spec/unit/views/components/index_list_spec.rb +32 -0
- data/spec/unit/views/components/paginated_collection_spec.rb +247 -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 +37 -0
- data/spec/unit/views/components/site_title_spec.rb +78 -0
- data/spec/unit/views/components/status_tag_spec.rb +95 -0
- data/spec/unit/views/components/table_for_spec.rb +182 -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 +39 -0
- data/tasks/js.rake +32 -0
- data/tasks/parallel_tests.rake +60 -0
- data/tasks/test.rake +79 -0
- data/tasks/yard.rake +6 -0
- metadata +883 -0
|
@@ -0,0 +1,206 @@
|
|
|
1
|
+
# Authorization Adapter
|
|
2
|
+
|
|
3
|
+
Active Admin offers the ability to define and use your own authorization
|
|
4
|
+
adapter. If implemented, the '#authorized?' will be called when an action is
|
|
5
|
+
taken. By default, '#authorized?' returns true.
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
## Setting up your own AuthorizationAdapter
|
|
9
|
+
|
|
10
|
+
Setting up your own `AuthorizationAdapter` is easy! The following example shows
|
|
11
|
+
how to set up and tie your authorization adapter class to Active Admin:
|
|
12
|
+
|
|
13
|
+
# app/models/only_authors_authorization.rb
|
|
14
|
+
class OnlyAuthorsAuthorization < ActiveAdmin::AuthorizationAdapter
|
|
15
|
+
|
|
16
|
+
def authorized?(action, subject = nil)
|
|
17
|
+
case subject
|
|
18
|
+
when normalized(Post)
|
|
19
|
+
|
|
20
|
+
# Only let the author update and delete posts
|
|
21
|
+
if action == :update || action == :destroy
|
|
22
|
+
subject.author == user
|
|
23
|
+
|
|
24
|
+
# If it's not an update or destroy, anyone can view it
|
|
25
|
+
else
|
|
26
|
+
true
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
else
|
|
30
|
+
true
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
In order to hook up `OnlyAuthorsAuthorization` to Active Admin, go to your
|
|
37
|
+
application's `config/initializers/active_admin.rb` and add/modify the line:
|
|
38
|
+
|
|
39
|
+
config.authorization_adapter = "OnlyAuthorsAuthorization"
|
|
40
|
+
|
|
41
|
+
Authorization adapters can be configured per ActiveAdmin namespace as well, for example:
|
|
42
|
+
|
|
43
|
+
ActiveAdmin.setup do |config|
|
|
44
|
+
config.namespace :admin do |ns|
|
|
45
|
+
ns.authorization_adapter = "AdminAuthorization"
|
|
46
|
+
end
|
|
47
|
+
config.namespace :my do |ns|
|
|
48
|
+
ns.authorization_adapter = "DashboardAuthorization"
|
|
49
|
+
end
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
Now, whenever a controller action is performed, the `OnlyAuthorsAuthorization`'s
|
|
53
|
+
`#authorized?` method will be called.
|
|
54
|
+
|
|
55
|
+
|
|
56
|
+
## Getting Access to the Current User
|
|
57
|
+
|
|
58
|
+
From within your authorization adapter, you can call the `#user` method to
|
|
59
|
+
retrieve the current user.
|
|
60
|
+
|
|
61
|
+
class OnlyAdmins < ActiveAdmin::AuthorizationAdapter
|
|
62
|
+
|
|
63
|
+
def authorized?(action, subject = nil)
|
|
64
|
+
user.admin?
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
|
|
70
|
+
## Scoping Collections in Authorization Adapters
|
|
71
|
+
|
|
72
|
+
`ActiveAdmin::AuthorizationAdapter` also provides a hook method (`#scope_collection`)
|
|
73
|
+
for the adapter to scope the resource's collection. For example, you may want to
|
|
74
|
+
centralize the scoping:
|
|
75
|
+
|
|
76
|
+
class OnlyMyAccount < ActiveAdmin::AuthorizationAdapter
|
|
77
|
+
|
|
78
|
+
def authorized?(action, subject = nil)
|
|
79
|
+
subject.account == user.account
|
|
80
|
+
end
|
|
81
|
+
|
|
82
|
+
def scope_collection(collection)
|
|
83
|
+
collection.where(:account_id => user.account_id)
|
|
84
|
+
end
|
|
85
|
+
|
|
86
|
+
end
|
|
87
|
+
|
|
88
|
+
All collections presented on Index Screens will be passed through this method
|
|
89
|
+
and will be scoped accordingly.
|
|
90
|
+
|
|
91
|
+
|
|
92
|
+
## Managing Access to Pages
|
|
93
|
+
|
|
94
|
+
Pages, just like resources, get authorized also. When authorization a page, the
|
|
95
|
+
subject will be an instance of `ActiveAdmin::Page`.
|
|
96
|
+
|
|
97
|
+
class OnlyDashboard < ActiveAdmin::AuthorizationAdapter
|
|
98
|
+
def authorized?(action, subject = nil)
|
|
99
|
+
case subject
|
|
100
|
+
when ActiveAdmin::Page
|
|
101
|
+
if action == :read && subject.name == "Dashboard"
|
|
102
|
+
true
|
|
103
|
+
else
|
|
104
|
+
false
|
|
105
|
+
end
|
|
106
|
+
else
|
|
107
|
+
false
|
|
108
|
+
end
|
|
109
|
+
end
|
|
110
|
+
end
|
|
111
|
+
|
|
112
|
+
|
|
113
|
+
## Action Types
|
|
114
|
+
|
|
115
|
+
By default Active Admin simplifies the controller actions into 4 actions:
|
|
116
|
+
|
|
117
|
+
* `:read` - This controls if the user can view the menu item as well as the
|
|
118
|
+
index and show screens.
|
|
119
|
+
* `:create` - This controls if the user can view the new screen and submit
|
|
120
|
+
the form to the create action.
|
|
121
|
+
* `:update` - This controls if the user can view the edit screen and submit
|
|
122
|
+
the form to the update action.
|
|
123
|
+
* `:destroy` - This controls if the user can delete a resource.
|
|
124
|
+
|
|
125
|
+
Each of these actions is available as a constant. Eg: `:read` is available as
|
|
126
|
+
`ActiveAdmin::Authorization::READ`.
|
|
127
|
+
|
|
128
|
+
|
|
129
|
+
## Checking for Authorization in Controllers and Views
|
|
130
|
+
|
|
131
|
+
Active Admin provides a helper method to check if the current user is
|
|
132
|
+
authorized to perform an action on a subject.
|
|
133
|
+
|
|
134
|
+
Simply use the `#authorized?(action, subject) method to check.
|
|
135
|
+
|
|
136
|
+
ActiveAdmin.register Post do
|
|
137
|
+
|
|
138
|
+
index do
|
|
139
|
+
column :title
|
|
140
|
+
column "" do |post|
|
|
141
|
+
if authorized?(:update, post)
|
|
142
|
+
link_to("Edit", admin_post_path(post))
|
|
143
|
+
end
|
|
144
|
+
end
|
|
145
|
+
|
|
146
|
+
end
|
|
147
|
+
|
|
148
|
+
end
|
|
149
|
+
|
|
150
|
+
If you are implementing a custom controller action, you can use the
|
|
151
|
+
`#authorize!` method to raise an `ActiveAdmin::AccessDenied` exception.
|
|
152
|
+
|
|
153
|
+
ActiveAdmin.register Post do
|
|
154
|
+
|
|
155
|
+
member_action :publish, :method => :post do
|
|
156
|
+
post = Post.find(params[:id])
|
|
157
|
+
|
|
158
|
+
authorize! :publish, post
|
|
159
|
+
post.publish!
|
|
160
|
+
|
|
161
|
+
flash[:notice] = "Post has been published"
|
|
162
|
+
redirect_to [:admin, post]
|
|
163
|
+
end
|
|
164
|
+
|
|
165
|
+
action_item :only => :show do
|
|
166
|
+
if !post.published? && authorized?(:publish, post)
|
|
167
|
+
link_to("Publish", publish_admin_post_path(post), :method => :post)
|
|
168
|
+
end
|
|
169
|
+
end
|
|
170
|
+
|
|
171
|
+
end
|
|
172
|
+
|
|
173
|
+
|
|
174
|
+
## Using the CanCan Adapter
|
|
175
|
+
|
|
176
|
+
Sub-classing `ActiveAdmin::AuthorizationAdapter` is fairly low level. Many times
|
|
177
|
+
it's nicer to have a simpler DSL for managing authorization. Active Admin
|
|
178
|
+
provides an adapter out of the box for [CanCan](https://github.com/ryanb/cancan).
|
|
179
|
+
|
|
180
|
+
To use the CanCan adapter, simply update the configuration in the Active Admin
|
|
181
|
+
initializer:
|
|
182
|
+
|
|
183
|
+
config.authorization_adapter = ActiveAdmin::CanCanAdapter
|
|
184
|
+
|
|
185
|
+
By default this will use the ability class named "Ability". This can also be
|
|
186
|
+
changed from the initializer:
|
|
187
|
+
|
|
188
|
+
config.cancan_ability_class = "MyCustomAbility"
|
|
189
|
+
|
|
190
|
+
Now you can simply use CanCan the way that you would expect and Active Admin
|
|
191
|
+
will use it for authorization:
|
|
192
|
+
|
|
193
|
+
# app/models/ability.rb
|
|
194
|
+
class Ability
|
|
195
|
+
include CanCan::Ability
|
|
196
|
+
|
|
197
|
+
def initialize(user)
|
|
198
|
+
can :manage, Post
|
|
199
|
+
can :read, User
|
|
200
|
+
can :manage, User, :id => user.id
|
|
201
|
+
can :read, ActiveAdmin::Page, :name => "Dashboard"
|
|
202
|
+
end
|
|
203
|
+
|
|
204
|
+
end
|
|
205
|
+
|
|
206
|
+
To view more details about the CanCan API, visit [https://github.com/ryanb/cancan](https://github.com/ryanb/cancan).
|
|
@@ -0,0 +1,292 @@
|
|
|
1
|
+
# Customize The Resource
|
|
2
|
+
|
|
3
|
+
## Rename the Resource
|
|
4
|
+
|
|
5
|
+
By default, any references to the resource (menu, routes, buttons, etc) in the
|
|
6
|
+
interface will use the name of the class. You can rename the resource by using
|
|
7
|
+
the <tt>:as</tt> option.
|
|
8
|
+
|
|
9
|
+
ActiveAdmin.register Post, :as => "Article"
|
|
10
|
+
|
|
11
|
+
The resource will then be available as /admin/articles
|
|
12
|
+
|
|
13
|
+
## Customize the Namespace
|
|
14
|
+
|
|
15
|
+
By default, resources live in the "admin" namespace.
|
|
16
|
+
|
|
17
|
+
You can register resources in different namespaces:
|
|
18
|
+
|
|
19
|
+
# Available at /today/posts
|
|
20
|
+
ActiveAdmin.register Post, :namespace => "today"
|
|
21
|
+
|
|
22
|
+
# Available at /posts
|
|
23
|
+
ActiveAdmin.register Post, :namespace => false
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
## Customize the Menu
|
|
27
|
+
|
|
28
|
+
The resource will be displayed in the global navigation by default. To disable
|
|
29
|
+
the resource from being displayed in the global navigation, pass `false` to the
|
|
30
|
+
`menu` method:
|
|
31
|
+
|
|
32
|
+
ActiveAdmin.register Post do
|
|
33
|
+
menu false
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
The menu method accepts a hash with the following options:
|
|
37
|
+
|
|
38
|
+
* `:label` - The string or proc label to display in the menu. If it's a proc, it
|
|
39
|
+
will be called each time the menu is rendered.
|
|
40
|
+
* `:parent` - The string label of the parent to set for this menu
|
|
41
|
+
* `:if` - A block or a symbol of a method to call to decide if the menu item
|
|
42
|
+
should be displayed
|
|
43
|
+
* `:priority` - The integer value of the priority. Defaults to 10
|
|
44
|
+
|
|
45
|
+
### Labels
|
|
46
|
+
|
|
47
|
+
To change the name of the label in the menu:
|
|
48
|
+
|
|
49
|
+
ActiveAdmin.register Post do
|
|
50
|
+
menu :label => "My Posts"
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
By default the menu uses a pluralized version of your resource name.
|
|
54
|
+
|
|
55
|
+
If you wish to translate your label at runtime, store the label as a proc
|
|
56
|
+
instead of a string. The proc will be called each time the menu is rendered.
|
|
57
|
+
|
|
58
|
+
ActiveAdmin.register Post do
|
|
59
|
+
menu :label => proc{ I18n.t("mypost") }
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
### Menu Priority
|
|
63
|
+
|
|
64
|
+
By default Active Admin sorts menus alphabetically. Some times you want specific
|
|
65
|
+
resources to show up at the beginning or the end of your menu.
|
|
66
|
+
|
|
67
|
+
Each menu item is given an integer priority value (default 10). You can set it
|
|
68
|
+
to edit the location of the menu item.
|
|
69
|
+
|
|
70
|
+
ActiveAdmin.register Post do
|
|
71
|
+
menu :priority => 1
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
This would ensure that the Post menu item, is at the beginning of the menu.
|
|
75
|
+
|
|
76
|
+
### Conditionally Showing / Hiding Menu Items
|
|
77
|
+
|
|
78
|
+
Menu items can be shown or hidden at runtime using the `:if` option.
|
|
79
|
+
|
|
80
|
+
ActiveAdmin.register Post do
|
|
81
|
+
menu :if => proc{ current_admin_user.can_edit_posts? }
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
The `proc` will be called in the context of the view, so you have access to all
|
|
85
|
+
your helpers and current user session information.
|
|
86
|
+
|
|
87
|
+
### Drop Down Menus
|
|
88
|
+
|
|
89
|
+
In many cases, a single level navigation will not be enough for the
|
|
90
|
+
administration of a production application. In that case, you can categorize
|
|
91
|
+
your resources and creating drop down menus to access them.
|
|
92
|
+
|
|
93
|
+
To add the menu as a child of another menu:
|
|
94
|
+
|
|
95
|
+
ActiveAdmin.register Post do
|
|
96
|
+
menu :parent => "Blog"
|
|
97
|
+
end
|
|
98
|
+
|
|
99
|
+
Note, the "Blog" menu does not even have to exist yet. It will be generated on
|
|
100
|
+
the fly as a drop down list for you.
|
|
101
|
+
|
|
102
|
+
### Customizing Parent Menu Items
|
|
103
|
+
|
|
104
|
+
All of the options given to a standard menu item are also available to the
|
|
105
|
+
parent menu items. You can customize their attributes in the Active Admin
|
|
106
|
+
initializer.
|
|
107
|
+
|
|
108
|
+
# config/initializers/active_admin.rb
|
|
109
|
+
ActiveAdmin.setup do |config|
|
|
110
|
+
config.namespace :admin do |admin|
|
|
111
|
+
|
|
112
|
+
# This block will edit the default menu
|
|
113
|
+
admin.build_menu do |menu|
|
|
114
|
+
menu.add :label => "Blog", :priority => 0
|
|
115
|
+
end
|
|
116
|
+
|
|
117
|
+
end
|
|
118
|
+
end
|
|
119
|
+
|
|
120
|
+
Now, if you use `menu :parent => "Blog"`, your resource menu item will be a
|
|
121
|
+
child of the Blog menu item with the priority of 0.
|
|
122
|
+
|
|
123
|
+
### Adding Custom Menu Items
|
|
124
|
+
|
|
125
|
+
Sometimes it's not enough to just customize the menu label. In this case, you
|
|
126
|
+
can customize the menu for the namespace within the Active Admin initializer.
|
|
127
|
+
|
|
128
|
+
# config/initializers/active_admin.rb
|
|
129
|
+
ActiveAdmin.setup do |config|
|
|
130
|
+
config.namespace :admin do |admin|
|
|
131
|
+
admin.build_menu do |menu|
|
|
132
|
+
menu.add :label => "The Application", :url => "/", :priority => 0
|
|
133
|
+
|
|
134
|
+
menu.add :label => "Sites" do |sites|
|
|
135
|
+
sites.add :label => "Google", :url => "http://google.com", :html_options => { :target => :blank }
|
|
136
|
+
sites.add :label => "Facebook", :url => "http://facebook.com"
|
|
137
|
+
sites.add :label => "Github", :url => "http://github.com"
|
|
138
|
+
end
|
|
139
|
+
end
|
|
140
|
+
end
|
|
141
|
+
end
|
|
142
|
+
|
|
143
|
+
This block will be run once on application startup to build the menu before each
|
|
144
|
+
of the resources are added to it.
|
|
145
|
+
|
|
146
|
+
## Scoping the queries
|
|
147
|
+
|
|
148
|
+
If your administrators have different access levels, you may sometimes want to
|
|
149
|
+
scope what they have access to. Assuming your User model has the proper
|
|
150
|
+
has_many relationships, you can simply scope the listings and finders like so:
|
|
151
|
+
|
|
152
|
+
ActiveAdmin.register Post do
|
|
153
|
+
scope_to :current_user
|
|
154
|
+
|
|
155
|
+
# or if the association doesn't have the default name.
|
|
156
|
+
# scope_to :current_user, :association_method => :blog_posts
|
|
157
|
+
end
|
|
158
|
+
|
|
159
|
+
That approach limits the posts an admin can access to ```current_user.posts```.
|
|
160
|
+
|
|
161
|
+
If you want to conditionally apply the scope, then there are options for that as well:
|
|
162
|
+
|
|
163
|
+
ActiveAdmin.register Post do
|
|
164
|
+
# Only scope the query if there is a user to scope to, helper provided via Devise
|
|
165
|
+
scope_to :current_user, :if => proc{ admin_user_signed_in? }
|
|
166
|
+
|
|
167
|
+
# Don't scope the query if the user is an admin
|
|
168
|
+
scope_to :current_user, :unless => proc{ current_admin_user.admin? }
|
|
169
|
+
|
|
170
|
+
# Get fancy and can combine with block syntax
|
|
171
|
+
scope_to :if => proc{ admin_user_signed_in? } do
|
|
172
|
+
User.most_popular
|
|
173
|
+
end
|
|
174
|
+
end
|
|
175
|
+
|
|
176
|
+
If you want to do something fancier, for example override a default scope, you can
|
|
177
|
+
also use :association_method parameter with a normal method on your User model.
|
|
178
|
+
The only requirement is that your method returns an instance of ActiveRecord::Relation.
|
|
179
|
+
|
|
180
|
+
class Ad < ActiveRecord::Base
|
|
181
|
+
default_scope lambda { where :published => true }
|
|
182
|
+
end
|
|
183
|
+
|
|
184
|
+
class User < ActiveRecord::Base
|
|
185
|
+
def managed_ads
|
|
186
|
+
# Overrides Ad's default_scope
|
|
187
|
+
Ad.unscoped
|
|
188
|
+
end
|
|
189
|
+
end
|
|
190
|
+
|
|
191
|
+
ActiveAdmin.register Ad do
|
|
192
|
+
scope_to :current_user, :association_method => :managed_ads
|
|
193
|
+
end
|
|
194
|
+
|
|
195
|
+
In case you just need to customize the query independently of the current user, you can
|
|
196
|
+
override the `scoped_collection` method on the controller:
|
|
197
|
+
|
|
198
|
+
ActiveAdmin.register Post do
|
|
199
|
+
controller do
|
|
200
|
+
def scoped_collection
|
|
201
|
+
Post.includes(:author)
|
|
202
|
+
end
|
|
203
|
+
end
|
|
204
|
+
end
|
|
205
|
+
|
|
206
|
+
## Customizing resource retrieval
|
|
207
|
+
|
|
208
|
+
If you need to completely replace the record retrieving code (e.g., you have a custom
|
|
209
|
+
`to_param` implementation in your models), override the `resource` method on the controller:
|
|
210
|
+
|
|
211
|
+
ActiveAdmin.register Post do
|
|
212
|
+
controller do
|
|
213
|
+
def resource
|
|
214
|
+
Post.where(id: params[:id]).first!
|
|
215
|
+
end
|
|
216
|
+
end
|
|
217
|
+
end
|
|
218
|
+
|
|
219
|
+
In fact, the controllers use [Inherited Resource](https://github.com/josevalim/inherited_resources),
|
|
220
|
+
so you can use all the
|
|
221
|
+
[customization features in Inherited Resource](https://github.com/josevalim/inherited_resources#overwriting-defaults).
|
|
222
|
+
|
|
223
|
+
|
|
224
|
+
## Belongs To
|
|
225
|
+
|
|
226
|
+
It's common to want to scope a series of resources to a relationship. For
|
|
227
|
+
example a Project may have many Milestones and Tickets. To nest the resource
|
|
228
|
+
within another, you can use the `belongs_to` method:
|
|
229
|
+
|
|
230
|
+
ActiveAdmin.register Project do
|
|
231
|
+
end
|
|
232
|
+
|
|
233
|
+
ActiveAdmin.register Ticket do
|
|
234
|
+
belongs_to :project
|
|
235
|
+
end
|
|
236
|
+
|
|
237
|
+
Projects will be available as usual and tickets will be availble by visiting
|
|
238
|
+
"/admin/projects/1/tickets" assuming that a Project with the id of 1 exists.
|
|
239
|
+
Active Admin does not add "Tickets" to the global navigation because the routes
|
|
240
|
+
can only be generated when there is a project id.
|
|
241
|
+
|
|
242
|
+
To create links to the resource, you can add them to a sidebar (one of the many
|
|
243
|
+
possibilities for how you may with to handle your user interface):
|
|
244
|
+
|
|
245
|
+
ActiveAdmin.register Project do
|
|
246
|
+
|
|
247
|
+
sidebar "Project Details" do
|
|
248
|
+
ul do
|
|
249
|
+
li link_to("Tickets", admin_project_tickets_path(project))
|
|
250
|
+
li link_to("Milestones", admin_project_milestones_path(project))
|
|
251
|
+
end
|
|
252
|
+
end
|
|
253
|
+
|
|
254
|
+
end
|
|
255
|
+
|
|
256
|
+
ActiveAdmin.register Ticket do
|
|
257
|
+
belongs_to :project
|
|
258
|
+
end
|
|
259
|
+
|
|
260
|
+
ActiveAdmin.register Milestone do
|
|
261
|
+
belongs_to :project
|
|
262
|
+
end
|
|
263
|
+
|
|
264
|
+
|
|
265
|
+
In some cases (like Projects), there are many sub resources and you would
|
|
266
|
+
actually like the global navigation to switch when the user navigates "into" a
|
|
267
|
+
project. To accomplish this, Active Admin stores the `belongs_to` resources in a
|
|
268
|
+
seperate menu which you can use if you so wish. To use:
|
|
269
|
+
|
|
270
|
+
ActiveAdmin.register Ticket do
|
|
271
|
+
belongs_to :project
|
|
272
|
+
navigation_menu :project
|
|
273
|
+
end
|
|
274
|
+
|
|
275
|
+
ActiveAdmin.register Milestone do
|
|
276
|
+
belongs_to :project
|
|
277
|
+
navigation_menu :project
|
|
278
|
+
end
|
|
279
|
+
|
|
280
|
+
Now, when you navigate to the tickets section, the global navigation will
|
|
281
|
+
only display "Tickets" and "Milestones". When you navigate back to a
|
|
282
|
+
non-belongs_to resource, it will switch back to the default menu.
|
|
283
|
+
|
|
284
|
+
You can also defer the menu lookup until runtime so that you can dynamically show
|
|
285
|
+
different menus, say perhaps on user permissions or level. For example:
|
|
286
|
+
|
|
287
|
+
ActiveAdmin.register Ticket do
|
|
288
|
+
belongs_to: :project
|
|
289
|
+
navigation_menu do
|
|
290
|
+
authorized?(:manage, SomeResource) ? :project : :restricted_menu
|
|
291
|
+
end
|
|
292
|
+
end
|