activeadmin-rails 1.7.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/.codeclimate.yml +64 -0
- data/.github/ISSUE_TEMPLATE.md +20 -0
- data/.github/workflows/ci.yaml +64 -0
- data/.github/workflows/daily.yaml +64 -0
- data/.github/workflows/pages.yml +72 -0
- data/.gitignore +23 -0
- data/.mdlrc +1 -0
- data/.rubocop.yml +84 -0
- data/.simplecov +13 -0
- data/.yardopts +7 -0
- data/CHANGELOG.md +514 -0
- data/CODE_OF_CONDUCT.md +22 -0
- data/CONTRIBUTING.md +190 -0
- data/Gemfile +51 -0
- data/LICENSE +20 -0
- data/README.md +84 -0
- data/Rakefile +56 -0
- data/activeadmin-rails.gemspec +39 -0
- data/app/assets/images/active_admin/nested_menu_arrow.gif +0 -0
- data/app/assets/images/active_admin/nested_menu_arrow_dark.gif +0 -0
- data/app/assets/images/active_admin/orderable.png +0 -0
- data/app/assets/javascripts/active_admin/base.es6 +23 -0
- data/app/assets/javascripts/active_admin/ext/jquery-ui.es6 +7 -0
- data/app/assets/javascripts/active_admin/ext/jquery.es6 +9 -0
- data/app/assets/javascripts/active_admin/initializers/datepicker.es6 +16 -0
- data/app/assets/javascripts/active_admin/initializers/filters.es6 +45 -0
- data/app/assets/javascripts/active_admin/initializers/tabs.es6 +6 -0
- data/app/assets/javascripts/active_admin/lib/active_admin.es6 +41 -0
- data/app/assets/javascripts/active_admin/lib/batch_actions.es6 +59 -0
- data/app/assets/javascripts/active_admin/lib/checkbox-toggler.es6 +49 -0
- data/app/assets/javascripts/active_admin/lib/dropdown-menu.es6 +123 -0
- data/app/assets/javascripts/active_admin/lib/has_many.es6 +89 -0
- data/app/assets/javascripts/active_admin/lib/modal_dialog.es6 +61 -0
- data/app/assets/javascripts/active_admin/lib/per_page.es6 +47 -0
- data/app/assets/javascripts/active_admin/lib/table-checkbox-toggler.es6 +36 -0
- data/app/assets/stylesheets/active_admin/_base.scss +41 -0
- data/app/assets/stylesheets/active_admin/_forms.scss +338 -0
- data/app/assets/stylesheets/active_admin/_header.scss +156 -0
- data/app/assets/stylesheets/active_admin/_mixins.scss +1 -0
- data/app/assets/stylesheets/active_admin/_typography.scss +100 -0
- data/app/assets/stylesheets/active_admin/components/_batch_actions.scss +6 -0
- data/app/assets/stylesheets/active_admin/components/_blank_slates.scss +30 -0
- data/app/assets/stylesheets/active_admin/components/_breadcrumbs.scss +20 -0
- data/app/assets/stylesheets/active_admin/components/_buttons.scss +6 -0
- data/app/assets/stylesheets/active_admin/components/_columns.scss +3 -0
- data/app/assets/stylesheets/active_admin/components/_comments.scss +41 -0
- data/app/assets/stylesheets/active_admin/components/_date_picker.scss +149 -0
- data/app/assets/stylesheets/active_admin/components/_dropdown_menu.scss +152 -0
- data/app/assets/stylesheets/active_admin/components/_flash_messages.scss +37 -0
- data/app/assets/stylesheets/active_admin/components/_grid.scss +9 -0
- data/app/assets/stylesheets/active_admin/components/_index_list.scss +12 -0
- data/app/assets/stylesheets/active_admin/components/_links.scss +5 -0
- data/app/assets/stylesheets/active_admin/components/_modal_dialog.scss +34 -0
- data/app/assets/stylesheets/active_admin/components/_pagination.scss +55 -0
- data/app/assets/stylesheets/active_admin/components/_panels.scss +6 -0
- data/app/assets/stylesheets/active_admin/components/_scopes.scss +13 -0
- data/app/assets/stylesheets/active_admin/components/_status_tags.scss +17 -0
- data/app/assets/stylesheets/active_admin/components/_table_tools.scss +67 -0
- data/app/assets/stylesheets/active_admin/components/_tables.scss +113 -0
- data/app/assets/stylesheets/active_admin/components/_tabs.scss +65 -0
- data/app/assets/stylesheets/active_admin/components/_unsupported_browser.scss +16 -0
- data/app/assets/stylesheets/active_admin/mixins/_all.scss +8 -0
- data/app/assets/stylesheets/active_admin/mixins/_buttons.scss +65 -0
- data/app/assets/stylesheets/active_admin/mixins/_gradients.scss +28 -0
- data/app/assets/stylesheets/active_admin/mixins/_rounded.scss +22 -0
- data/app/assets/stylesheets/active_admin/mixins/_sections.scss +41 -0
- data/app/assets/stylesheets/active_admin/mixins/_shadows.scss +15 -0
- data/app/assets/stylesheets/active_admin/mixins/_typography.scss +3 -0
- data/app/assets/stylesheets/active_admin/mixins/_utilities.scss +17 -0
- data/app/assets/stylesheets/active_admin/mixins/_variables.scss +34 -0
- data/app/assets/stylesheets/active_admin/pages/_logged_out.scss +44 -0
- data/app/assets/stylesheets/active_admin/print.scss +287 -0
- data/app/assets/stylesheets/active_admin/structure/_footer.scss +14 -0
- data/app/assets/stylesheets/active_admin/structure/_main_structure.scss +29 -0
- data/app/assets/stylesheets/active_admin/structure/_title_bar.scss +41 -0
- data/app/views/active_admin/_head.html.erb +14 -0
- data/app/views/active_admin/base/_action_items.html.arb +7 -0
- data/app/views/active_admin/base/_breadcrumbs.html.arb +8 -0
- data/app/views/active_admin/base/_footer.html.arb +11 -0
- data/app/views/active_admin/base/_header.html.arb +5 -0
- data/app/views/active_admin/base/_sidebar.html.arb +3 -0
- data/app/views/active_admin/base/_title_bar.html.arb +9 -0
- data/app/views/active_admin/base/_unsupported_browser.html.erb +5 -0
- data/app/views/active_admin/devise/confirmations/new.html.erb +15 -0
- data/app/views/active_admin/devise/mailer/reset_password_instructions.html.erb +8 -0
- data/app/views/active_admin/devise/mailer/unlock_instructions.html.erb +7 -0
- data/app/views/active_admin/devise/passwords/edit.html.erb +18 -0
- data/app/views/active_admin/devise/passwords/new.html.erb +15 -0
- data/app/views/active_admin/devise/registrations/new.html.erb +22 -0
- data/app/views/active_admin/devise/sessions/new.html.erb +20 -0
- data/app/views/active_admin/devise/shared/_error_messages.html.erb +15 -0
- data/app/views/active_admin/devise/shared/_links.erb +33 -0
- data/app/views/active_admin/devise/unlocks/new.html.erb +15 -0
- data/app/views/active_admin/page/_content.html.arb +1 -0
- data/app/views/active_admin/page/index.html.arb +8 -0
- data/app/views/active_admin/resource/_filters_form.html.erb +1 -0
- data/app/views/active_admin/resource/_form.html.arb +11 -0
- data/app/views/active_admin/resource/_index_as_table.html.arb +8 -0
- data/app/views/active_admin/resource/_show.html.arb +1 -0
- data/app/views/active_admin/resource/edit.html.arb +13 -0
- data/app/views/active_admin/resource/index.html.arb +101 -0
- data/app/views/active_admin/resource/new.html.arb +13 -0
- data/app/views/active_admin/resource/show.html.arb +22 -0
- data/app/views/kaminari/active_admin/_first_page.html.erb +11 -0
- data/app/views/kaminari/active_admin/_gap.html.erb +8 -0
- data/app/views/kaminari/active_admin/_last_page.html.erb +11 -0
- data/app/views/kaminari/active_admin/_next_page.html.erb +11 -0
- data/app/views/kaminari/active_admin/_page.html.erb +12 -0
- data/app/views/kaminari/active_admin/_paginator.html.erb +25 -0
- data/app/views/kaminari/active_admin/_prev_page.html.erb +11 -0
- data/app/views/layouts/active_admin.html.erb +33 -0
- data/app/views/layouts/active_admin_logged_out.html.erb +39 -0
- data/codecov.yml +25 -0
- data/config/i18n-tasks.yml +26 -0
- data/config/locales/ar.yml +133 -0
- data/config/locales/bg.yml +118 -0
- data/config/locales/bs.yml +119 -0
- data/config/locales/ca.yml +104 -0
- data/config/locales/cs.yml +107 -0
- data/config/locales/da.yml +135 -0
- data/config/locales/de-CH.yml +99 -0
- data/config/locales/de.yml +142 -0
- data/config/locales/el.yml +124 -0
- data/config/locales/en-CA.yml +137 -0
- data/config/locales/en-GB.yml +137 -0
- data/config/locales/en.yml +160 -0
- data/config/locales/eo.yml +143 -0
- data/config/locales/es-MX.yml +94 -0
- data/config/locales/es.yml +160 -0
- data/config/locales/fa.yml +117 -0
- data/config/locales/fi.yml +110 -0
- data/config/locales/fr.yml +139 -0
- data/config/locales/he.yml +140 -0
- data/config/locales/hr.yml +121 -0
- data/config/locales/hu.yml +96 -0
- data/config/locales/id.yml +133 -0
- data/config/locales/it.yml +142 -0
- data/config/locales/ja.yml +139 -0
- data/config/locales/ko.yml +118 -0
- data/config/locales/lt.yml +140 -0
- data/config/locales/lv.yml +90 -0
- data/config/locales/nb.yml +128 -0
- data/config/locales/nl.yml +142 -0
- data/config/locales/pl.yml +166 -0
- data/config/locales/pt-BR.yml +141 -0
- data/config/locales/pt-PT.yml +90 -0
- data/config/locales/ro.yml +94 -0
- data/config/locales/ru.yml +139 -0
- data/config/locales/sk.yml +107 -0
- data/config/locales/sv-SE.yml +133 -0
- data/config/locales/tr.yml +142 -0
- data/config/locales/uk.yml +134 -0
- data/config/locales/vi.yml +132 -0
- data/config/locales/zh-CN.yml +141 -0
- data/config/locales/zh-TW.yml +133 -0
- data/config/mdl_style.rb +9 -0
- data/cucumber.yml +6 -0
- data/docs/0-installation.md +121 -0
- data/docs/1-general-configuration.md +207 -0
- data/docs/10-custom-pages.md +148 -0
- data/docs/11-decorators.md +66 -0
- data/docs/12-arbo-components.md +200 -0
- data/docs/13-authorization-adapter.md +288 -0
- data/docs/14-gotchas.md +141 -0
- data/docs/2-resource-customization.md +480 -0
- data/docs/3-index-pages/custom-index.md +39 -0
- data/docs/3-index-pages/index-as-block.md +23 -0
- data/docs/3-index-pages/index-as-blog.md +73 -0
- data/docs/3-index-pages/index-as-grid.md +31 -0
- data/docs/3-index-pages/index-as-table.md +259 -0
- data/docs/3-index-pages.md +349 -0
- data/docs/4-csv-format.md +86 -0
- data/docs/5-forms.md +233 -0
- data/docs/6-show-pages.md +61 -0
- data/docs/7-sidebars.md +63 -0
- data/docs/8-custom-actions.md +160 -0
- data/docs/9-batch-actions.md +248 -0
- data/docs/CNAME +1 -0
- data/docs/Gemfile +7 -0
- data/docs/README.md +24 -0
- data/docs/_config.yml +15 -0
- data/docs/_includes/nav_footer_custom.html +3 -0
- data/docs/documentation.md +61 -0
- data/docs/images/activeadmin.png +0 -0
- data/docs/images/divider.png +0 -0
- data/docs/images/features.png +0 -0
- data/docs/index.css +835 -0
- data/docs/index.html +105 -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 +124 -0
- data/features/breadcrumb.feature +76 -0
- data/features/comments/commenting.feature +178 -0
- data/features/comments/viewing_index.feature +18 -0
- data/features/create_another.feature +55 -0
- data/features/dashboard.feature +16 -0
- data/features/decorators.feature +43 -0
- data/features/development_reloading.feature +28 -0
- data/features/edit_page.feature +116 -0
- data/features/favicon.feature +20 -0
- data/features/filter_attributes.feature +46 -0
- data/features/first_boot.feature +16 -0
- data/features/footer.feature +29 -0
- data/features/global_navigation.feature +29 -0
- data/features/i18n.feature +55 -0
- data/features/index/batch_actions.feature +218 -0
- data/features/index/filters.feature +251 -0
- data/features/index/format_as_csv.feature +273 -0
- data/features/index/formats.feature +88 -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 +291 -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 +325 -0
- data/features/index/page_title.feature +41 -0
- data/features/index/pagination.feature +63 -0
- data/features/index/switch_index_view.feature +73 -0
- data/features/menu.feature +85 -0
- data/features/meta_tags.feature +21 -0
- data/features/new_page.feature +136 -0
- data/features/registering_assets.feature +34 -0
- data/features/registering_pages.feature +237 -0
- data/features/registering_resources.feature +33 -0
- data/features/renamed_resource.feature +29 -0
- data/features/root_to.feature +18 -0
- data/features/show/attributes_table_title.feature +54 -0
- data/features/show/columns.feature +40 -0
- data/features/show/default_content.feature +44 -0
- data/features/show/page_title.feature +58 -0
- data/features/show/tabs.feature +47 -0
- data/features/sidebar_sections.feature +210 -0
- data/features/site_title.feature +47 -0
- data/features/specifying_actions.feature +118 -0
- data/features/step_definitions/action_item_steps.rb +7 -0
- data/features/step_definitions/action_link_steps.rb +19 -0
- data/features/step_definitions/additional_web_steps.rb +81 -0
- data/features/step_definitions/asset_steps.rb +15 -0
- data/features/step_definitions/attribute_steps.rb +18 -0
- data/features/step_definitions/attributes_table_title_steps.rb +11 -0
- data/features/step_definitions/batch_action_steps.rb +78 -0
- data/features/step_definitions/blog_steps.rb +3 -0
- data/features/step_definitions/breadcrumb_steps.rb +13 -0
- data/features/step_definitions/column_steps.rb +8 -0
- data/features/step_definitions/comment_steps.rb +32 -0
- data/features/step_definitions/configuration_steps.rb +102 -0
- data/features/step_definitions/dashboard_steps.rb +15 -0
- data/features/step_definitions/factory_steps.rb +35 -0
- data/features/step_definitions/filter_steps.rb +57 -0
- data/features/step_definitions/flash_steps.rb +11 -0
- data/features/step_definitions/footer_steps.rb +21 -0
- data/features/step_definitions/format_steps.rb +60 -0
- data/features/step_definitions/i18n_steps.rb +11 -0
- data/features/step_definitions/index_scope_steps.rb +42 -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/meta_tag_steps.rb +3 -0
- data/features/step_definitions/pagination_steps.rb +15 -0
- data/features/step_definitions/root_steps.rb +9 -0
- data/features/step_definitions/sidebar_steps.rb +11 -0
- data/features/step_definitions/site_title_steps.rb +31 -0
- data/features/step_definitions/tab_steps.rb +17 -0
- data/features/step_definitions/table_steps.rb +116 -0
- data/features/step_definitions/user_steps.rb +52 -0
- data/features/step_definitions/web_steps.rb +86 -0
- data/features/sti_resource.feature +65 -0
- data/features/strong_parameters.feature +69 -0
- data/features/support/env.rb +129 -0
- data/features/support/paths.rb +75 -0
- data/features/support/regular_env.rb +7 -0
- data/features/support/reload_env.rb +7 -0
- data/features/support/selectors.rb +45 -0
- data/features/users/logging_in.feature +32 -0
- data/features/users/logging_out.feature +29 -0
- data/features/users/resetting_password.feature +30 -0
- data/gemfiles/rails_42.gemfile +12 -0
- data/gemfiles/rails_52.gemfile +15 -0
- data/gemfiles/rails_60.gemfile +16 -0
- data/gemfiles/rails_61.gemfile +15 -0
- data/gemfiles/rails_61_turbolinks.gemfile +15 -0
- data/gemfiles/rails_70.gemfile +15 -0
- data/gemfiles/rails_70_hotwire.gemfile +15 -0
- data/gemfiles/rails_71.gemfile +17 -0
- data/lib/active_admin/abstract_view_factory.rb +47 -0
- data/lib/active_admin/application.rb +255 -0
- data/lib/active_admin/application_settings.rb +42 -0
- data/lib/active_admin/asset_registration.rb +29 -0
- data/lib/active_admin/authorization_adapter.rb +129 -0
- data/lib/active_admin/base_controller/authorization.rb +126 -0
- data/lib/active_admin/base_controller/menu.rb +34 -0
- data/lib/active_admin/base_controller.rb +91 -0
- data/lib/active_admin/batch_actions/controller.rb +45 -0
- data/lib/active_admin/batch_actions/resource_extension.rb +151 -0
- data/lib/active_admin/batch_actions/views/batch_action_form.rb +45 -0
- data/lib/active_admin/batch_actions/views/batch_action_selector.rb +58 -0
- data/lib/active_admin/batch_actions/views/selection_cells.rb +38 -0
- data/lib/active_admin/batch_actions.rb +16 -0
- data/lib/active_admin/callbacks.rb +88 -0
- data/lib/active_admin/cancan_adapter.rb +36 -0
- data/lib/active_admin/component.rb +5 -0
- data/lib/active_admin/controller_action.rb +12 -0
- data/lib/active_admin/csv_builder.rb +136 -0
- data/lib/active_admin/dependency.rb +96 -0
- data/lib/active_admin/deprecation.rb +10 -0
- data/lib/active_admin/devise.rb +80 -0
- data/lib/active_admin/dsl.rb +193 -0
- data/lib/active_admin/dynamic_setting.rb +38 -0
- data/lib/active_admin/dynamic_settings_node.rb +28 -0
- data/lib/active_admin/engine.rb +22 -0
- data/lib/active_admin/error.rb +62 -0
- data/lib/active_admin/event.rb +24 -0
- data/lib/active_admin/filters/active.rb +29 -0
- data/lib/active_admin/filters/active_filter.rb +123 -0
- data/lib/active_admin/filters/active_sidebar.rb +50 -0
- data/lib/active_admin/filters/dsl.rb +21 -0
- data/lib/active_admin/filters/forms.rb +85 -0
- data/lib/active_admin/filters/formtastic_addons.rb +79 -0
- data/lib/active_admin/filters/resource_extension.rb +153 -0
- data/lib/active_admin/filters.rb +11 -0
- data/lib/active_admin/form_builder.rb +182 -0
- data/lib/active_admin/generators/boilerplate.rb +45 -0
- data/lib/active_admin/helpers/collection.rb +19 -0
- data/lib/active_admin/helpers/i18n.rb +7 -0
- data/lib/active_admin/helpers/optional_display.rb +38 -0
- data/lib/active_admin/helpers/routes/url_helpers.rb +15 -0
- data/lib/active_admin/helpers/scope_chain.rb +23 -0
- data/lib/active_admin/inputs/datepicker_input.rb +27 -0
- data/lib/active_admin/inputs/filters/base/search_method_select.rb +75 -0
- data/lib/active_admin/inputs/filters/base.rb +44 -0
- data/lib/active_admin/inputs/filters/boolean_input.rb +24 -0
- data/lib/active_admin/inputs/filters/check_boxes_input.rb +50 -0
- data/lib/active_admin/inputs/filters/date_picker_input.rb +13 -0
- data/lib/active_admin/inputs/filters/date_range_input.rb +49 -0
- data/lib/active_admin/inputs/filters/numeric_input.rb +12 -0
- data/lib/active_admin/inputs/filters/select_input.rb +58 -0
- data/lib/active_admin/inputs/filters/string_input.rb +26 -0
- data/lib/active_admin/inputs/filters/text_input.rb +25 -0
- data/lib/active_admin/inputs.rb +21 -0
- data/lib/active_admin/localizers/resource_localizer.rb +35 -0
- data/lib/active_admin/localizers.rb +11 -0
- data/lib/active_admin/menu.rb +106 -0
- data/lib/active_admin/menu_collection.rb +55 -0
- data/lib/active_admin/menu_item.rb +79 -0
- data/lib/active_admin/namespace.rb +325 -0
- data/lib/active_admin/namespace_settings.rb +107 -0
- data/lib/active_admin/order_clause.rb +48 -0
- data/lib/active_admin/orm/active_record/comments/comment.rb +35 -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/views/active_admin_comments.rb +95 -0
- data/lib/active_admin/orm/active_record/comments/views.rb +2 -0
- data/lib/active_admin/orm/active_record/comments.rb +99 -0
- data/lib/active_admin/orm/active_record.rb +5 -0
- data/lib/active_admin/orm/mongoid/.gitkeep +0 -0
- data/lib/active_admin/orm/mongoid.rb +1 -0
- data/lib/active_admin/page.rb +114 -0
- data/lib/active_admin/page_controller.rb +29 -0
- data/lib/active_admin/page_dsl.rb +35 -0
- data/lib/active_admin/page_presenter.rb +32 -0
- data/lib/active_admin/pundit_adapter.rb +68 -0
- data/lib/active_admin/resource/action_items.rb +120 -0
- data/lib/active_admin/resource/attributes.rb +47 -0
- data/lib/active_admin/resource/belongs_to.rb +48 -0
- data/lib/active_admin/resource/controllers.rb +19 -0
- data/lib/active_admin/resource/includes.rb +12 -0
- data/lib/active_admin/resource/menu.rb +65 -0
- data/lib/active_admin/resource/naming.rb +62 -0
- data/lib/active_admin/resource/ordering.rb +11 -0
- data/lib/active_admin/resource/page_presenters.rb +90 -0
- data/lib/active_admin/resource/pagination.rb +23 -0
- data/lib/active_admin/resource/routes.rb +134 -0
- data/lib/active_admin/resource/scope_to.rb +74 -0
- data/lib/active_admin/resource/scopes.rb +52 -0
- data/lib/active_admin/resource/sidebars.rb +32 -0
- data/lib/active_admin/resource.rb +215 -0
- data/lib/active_admin/resource_collection.rb +72 -0
- data/lib/active_admin/resource_controller/action_builder.rb +21 -0
- data/lib/active_admin/resource_controller/data_access.rb +341 -0
- data/lib/active_admin/resource_controller/decorators.rb +102 -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_controller/streaming.rb +47 -0
- data/lib/active_admin/resource_controller.rb +116 -0
- data/lib/active_admin/resource_dsl.rb +221 -0
- data/lib/active_admin/router.rb +113 -0
- data/lib/active_admin/scope.rb +60 -0
- data/lib/active_admin/settings_node.rb +19 -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 +10 -0
- data/lib/active_admin/view_helpers/active_admin_application_helper.rb +12 -0
- data/lib/active_admin/view_helpers/auto_link_helper.rb +45 -0
- data/lib/active_admin/view_helpers/breadcrumb_helper.rb +52 -0
- data/lib/active_admin/view_helpers/display_helper.rb +95 -0
- data/lib/active_admin/view_helpers/download_format_links_helper.rb +58 -0
- data/lib/active_admin/view_helpers/fields_for.rb +50 -0
- data/lib/active_admin/view_helpers/flash_helper.rb +14 -0
- data/lib/active_admin/view_helpers/form_helper.rb +20 -0
- data/lib/active_admin/view_helpers/layout_helper.rb +32 -0
- data/lib/active_admin/view_helpers/method_or_proc_helper.rb +97 -0
- data/lib/active_admin/view_helpers/scope_name_helper.rb +16 -0
- data/lib/active_admin/view_helpers/sidebar_helper.rb +15 -0
- data/lib/active_admin/view_helpers/title_helper.rb +11 -0
- data/lib/active_admin/view_helpers/view_factory_helper.rb +11 -0
- data/lib/active_admin/view_helpers.rb +21 -0
- data/lib/active_admin/views/components/action_link.rb +13 -0
- data/lib/active_admin/views/components/active_admin_form.rb +163 -0
- data/lib/active_admin/views/components/attributes_panel.rb +23 -0
- data/lib/active_admin/views/components/attributes_table.rb +94 -0
- data/lib/active_admin/views/components/blank_slate.rb +17 -0
- data/lib/active_admin/views/components/columns.rb +161 -0
- data/lib/active_admin/views/components/dropdown_menu.rb +71 -0
- data/lib/active_admin/views/components/index_list.rb +69 -0
- data/lib/active_admin/views/components/menu.rb +32 -0
- data/lib/active_admin/views/components/menu_item.rb +58 -0
- data/lib/active_admin/views/components/paginated_collection.rb +159 -0
- data/lib/active_admin/views/components/panel.rb +38 -0
- data/lib/active_admin/views/components/scopes.rb +72 -0
- data/lib/active_admin/views/components/sidebar_section.rb +34 -0
- data/lib/active_admin/views/components/site_title.rb +28 -0
- data/lib/active_admin/views/components/status_tag.rb +88 -0
- data/lib/active_admin/views/components/table_for.rb +209 -0
- data/lib/active_admin/views/components/tabs.rb +40 -0
- data/lib/active_admin/views/index_as_block.rb +36 -0
- data/lib/active_admin/views/index_as_blog.rb +155 -0
- data/lib/active_admin/views/index_as_grid.rb +80 -0
- data/lib/active_admin/views/index_as_table.rb +377 -0
- data/lib/active_admin/views.rb +8 -0
- data/lib/active_admin.rb +132 -0
- data/lib/activeadmin-rails.rb +1 -0
- data/lib/bug_report_templates/active_admin_main.rb +110 -0
- data/lib/generators/active_admin/assets/assets_generator.rb +14 -0
- data/lib/generators/active_admin/assets/templates/active_admin.js +1 -0
- data/lib/generators/active_admin/assets/templates/active_admin.scss +17 -0
- data/lib/generators/active_admin/devise/devise_generator.rb +68 -0
- data/lib/generators/active_admin/install/install_generator.rb +45 -0
- data/lib/generators/active_admin/install/templates/active_admin.rb.erb +300 -0
- data/lib/generators/active_admin/install/templates/admin_users.rb.erb +28 -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.erb +16 -0
- data/lib/generators/active_admin/page/USAGE +8 -0
- data/lib/generators/active_admin/page/page_generator.rb +12 -0
- data/lib/generators/active_admin/page/templates/page.rb +5 -0
- data/lib/generators/active_admin/resource/resource_generator.rb +20 -0
- data/lib/generators/active_admin/resource/templates/admin.rb.erb +6 -0
- data/lib/ransack_ext.rb +20 -0
- data/spec/bug_report_templates_spec.rb +28 -0
- data/spec/changelog_spec.rb +15 -0
- data/spec/javascripts/coffeescripts/jquery.aa.checkbox-toggler-spec.js.coffee +50 -0
- data/spec/javascripts/coffeescripts/jquery.aa.table-checkbox-toggler-spec.js.coffee +34 -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/support/jasmine.yml +74 -0
- data/spec/javascripts/support/jasmine_runner.rb +19 -0
- data/spec/rails_helper.rb +67 -0
- data/spec/requests/default_namespace_spec.rb +81 -0
- data/spec/requests/memory_spec.rb +25 -0
- data/spec/requests/pages/form_spec.rb +73 -0
- data/spec/requests/pages/index_spec.rb +96 -0
- data/spec/requests/pages/layout_spec.rb +59 -0
- data/spec/requests/pages/show_spec.rb +38 -0
- data/spec/requests/stylesheets_spec.rb +18 -0
- data/spec/spec_helper.rb +1 -0
- data/spec/support/active_admin_integration_spec_helper.rb +79 -0
- data/spec/support/active_admin_request_helpers.rb +39 -0
- data/spec/support/rails_template.rb +224 -0
- data/spec/support/rails_template_with_data.rb +328 -0
- data/spec/support/templates/admin/stores.rb +7 -0
- data/spec/support/templates/en.yml +8 -0
- data/spec/support/templates/manifest.js +3 -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 +44 -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 +24 -0
- data/spec/unit/abstract_view_factory_spec.rb +78 -0
- data/spec/unit/action_builder_spec.rb +160 -0
- data/spec/unit/active_admin_spec.rb +11 -0
- data/spec/unit/application_spec.rb +180 -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 +43 -0
- data/spec/unit/authorization/index_overriding_spec.rb +23 -0
- data/spec/unit/auto_link_spec.rb +103 -0
- data/spec/unit/batch_actions/resource_spec.rb +84 -0
- data/spec/unit/batch_actions/settings_spec.rb +61 -0
- data/spec/unit/belongs_to_spec.rb +76 -0
- data/spec/unit/cancan_adapter_spec.rb +43 -0
- data/spec/unit/comments_spec.rb +204 -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 +41 -0
- data/spec/unit/csv_builder_spec.rb +321 -0
- data/spec/unit/dependency_spec.rb +135 -0
- data/spec/unit/devise_spec.rb +110 -0
- data/spec/unit/dsl_spec.rb +120 -0
- data/spec/unit/dynamic_settings_spec.rb +28 -0
- data/spec/unit/filters/active_filter_spec.rb +222 -0
- data/spec/unit/filters/active_spec.rb +24 -0
- data/spec/unit/filters/filter_form_builder_spec.rb +524 -0
- data/spec/unit/filters/resource_spec.rb +128 -0
- data/spec/unit/form_builder_spec.rb +1013 -0
- data/spec/unit/generators/install_spec.rb +31 -0
- data/spec/unit/helpers/collection_spec.rb +68 -0
- data/spec/unit/helpers/scope_chain_spec.rb +35 -0
- data/spec/unit/i18n_spec.rb +29 -0
- data/spec/unit/localizers/resource_localizer_spec.rb +36 -0
- data/spec/unit/menu_collection_spec.rb +40 -0
- data/spec/unit/menu_item_spec.rb +82 -0
- data/spec/unit/menu_spec.rb +60 -0
- data/spec/unit/namespace/authorization_spec.rb +27 -0
- data/spec/unit/namespace/register_page_spec.rb +99 -0
- data/spec/unit/namespace/register_resource_spec.rb +162 -0
- data/spec/unit/namespace_spec.rb +132 -0
- data/spec/unit/order_clause_spec.rb +81 -0
- data/spec/unit/page_controller_spec.rb +5 -0
- data/spec/unit/page_spec.rb +128 -0
- data/spec/unit/pretty_format_spec.rb +133 -0
- data/spec/unit/pundit_adapter_spec.rb +98 -0
- data/spec/unit/resource/action_items_spec.rb +83 -0
- data/spec/unit/resource/attributes_spec.rb +56 -0
- data/spec/unit/resource/includes_spec.rb +21 -0
- data/spec/unit/resource/menu_spec.rb +18 -0
- data/spec/unit/resource/naming_spec.rb +120 -0
- data/spec/unit/resource/ordering_spec.rb +35 -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 +125 -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 +175 -0
- data/spec/unit/resource_controller/data_access_spec.rb +234 -0
- data/spec/unit/resource_controller/decorators_spec.rb +94 -0
- data/spec/unit/resource_controller/sidebars_spec.rb +37 -0
- data/spec/unit/resource_controller_spec.rb +290 -0
- data/spec/unit/resource_registration_spec.rb +61 -0
- data/spec/unit/resource_spec.rb +320 -0
- data/spec/unit/routing_spec.rb +211 -0
- data/spec/unit/scope_spec.rb +225 -0
- data/spec/unit/settings_node_spec.rb +26 -0
- data/spec/unit/view_factory_spec.rb +13 -0
- data/spec/unit/view_helpers/breadcrumbs_spec.rb +255 -0
- data/spec/unit/view_helpers/display_helper_spec.rb +203 -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/flash_helper_spec.rb +24 -0
- data/spec/unit/view_helpers/form_helper_spec.rb +42 -0
- data/spec/unit/view_helpers/method_or_proc_helper_spec.rb +138 -0
- data/spec/unit/views/components/attributes_table_spec.rb +271 -0
- data/spec/unit/views/components/batch_action_selector_spec.rb +43 -0
- data/spec/unit/views/components/blank_slate_spec.rb +27 -0
- data/spec/unit/views/components/columns_spec.rb +187 -0
- data/spec/unit/views/components/index_list_spec.rb +49 -0
- data/spec/unit/views/components/index_table_for_spec.rb +127 -0
- data/spec/unit/views/components/menu_item_spec.rb +29 -0
- data/spec/unit/views/components/menu_spec.rb +168 -0
- data/spec/unit/views/components/paginated_collection_spec.rb +249 -0
- data/spec/unit/views/components/panel_spec.rb +58 -0
- data/spec/unit/views/components/sidebar_section_spec.rb +68 -0
- data/spec/unit/views/components/site_title_spec.rb +82 -0
- data/spec/unit/views/components/status_tag_spec.rb +265 -0
- data/spec/unit/views/components/table_for_spec.rb +441 -0
- data/spec/unit/views/components/tabs_spec.rb +99 -0
- data/spec/unit/views/index_as_blog_spec.rb +76 -0
- data/tasks/docs.rake +64 -0
- data/tasks/lint.rake +21 -0
- data/tasks/local.rake +25 -0
- data/tasks/parallel_tests.rake +66 -0
- data/tasks/test.rake +24 -0
- data/vendor/assets/stylesheets/active_admin/_normalize.scss +447 -0
- metadata +1012 -0
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
module ActiveAdmin
|
|
2
|
+
class Resource
|
|
3
|
+
module Routes
|
|
4
|
+
# @param params [Hash] of params: { study_id: 3 }
|
|
5
|
+
# @return [String] the path to this resource collection page
|
|
6
|
+
# @example "/admin/posts"
|
|
7
|
+
def route_collection_path(params = {}, additional_params = {})
|
|
8
|
+
route_builder.collection_path(params, additional_params)
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
def route_batch_action_path(params = {}, additional_params = {})
|
|
12
|
+
route_builder.batch_action_path(params, additional_params)
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
# @param resource [ActiveRecord::Base] the instance we want the path of
|
|
16
|
+
# @return [String] the path to this resource collection page
|
|
17
|
+
# @example "/admin/posts/1"
|
|
18
|
+
def route_instance_path(resource, additional_params = {})
|
|
19
|
+
route_builder.instance_path(resource, additional_params)
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
def route_edit_instance_path(resource, additional_params = {})
|
|
23
|
+
route_builder.edit_instance_path(resource, additional_params)
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
# Returns the routes prefix for this config
|
|
27
|
+
def route_prefix
|
|
28
|
+
namespace.route_prefix
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
def route_builder
|
|
32
|
+
@route_builder ||= RouteBuilder.new(self)
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
def route_uncountable?
|
|
36
|
+
config = resources_configuration[:self]
|
|
37
|
+
|
|
38
|
+
config[:route_collection_name] == config[:route_instance_name]
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
private
|
|
42
|
+
|
|
43
|
+
class RouteBuilder
|
|
44
|
+
def initialize(resource)
|
|
45
|
+
@resource = resource
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
def collection_path(params, additional_params = {})
|
|
49
|
+
route_name = route_name(
|
|
50
|
+
resource.resources_configuration[:self][:route_collection_name],
|
|
51
|
+
suffix: (resource.route_uncountable? ? "index_path" : "path")
|
|
52
|
+
)
|
|
53
|
+
|
|
54
|
+
routes.public_send route_name, *route_collection_params(params), additional_params
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
def batch_action_path(params, additional_params = {})
|
|
58
|
+
route_name = route_name(
|
|
59
|
+
resource.resources_configuration[:self][:route_collection_name],
|
|
60
|
+
action: :batch_action,
|
|
61
|
+
suffix: (resource.route_uncountable? ? "index_path" : "path")
|
|
62
|
+
)
|
|
63
|
+
|
|
64
|
+
query = params.slice(:q, :scope)
|
|
65
|
+
query = query.permit!.to_h
|
|
66
|
+
routes.public_send route_name, *route_collection_params(params), additional_params.merge(query)
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
# @return [String] the path to this resource collection page
|
|
70
|
+
# @param instance [ActiveRecord::Base] the instance we want the path of
|
|
71
|
+
# @example "/admin/posts/1"
|
|
72
|
+
def instance_path(instance, additional_params = {})
|
|
73
|
+
route_name = route_name(resource.resources_configuration[:self][:route_instance_name])
|
|
74
|
+
|
|
75
|
+
routes.public_send route_name, *route_instance_params(instance), additional_params
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
# @return [String] the path to the edit page of this resource
|
|
79
|
+
# @param instance [ActiveRecord::Base] the instance we want the path of
|
|
80
|
+
# @example "/admin/posts/1/edit"
|
|
81
|
+
def edit_instance_path(instance, additional_params = {})
|
|
82
|
+
path = resource.resources_configuration[:self][:route_instance_name]
|
|
83
|
+
route_name = route_name(path, action: :edit)
|
|
84
|
+
|
|
85
|
+
routes.public_send route_name, *route_instance_params(instance), additional_params
|
|
86
|
+
end
|
|
87
|
+
|
|
88
|
+
private
|
|
89
|
+
|
|
90
|
+
attr_reader :resource
|
|
91
|
+
|
|
92
|
+
def route_name(resource_path_name, options = {})
|
|
93
|
+
suffix = options[:suffix] || "path"
|
|
94
|
+
route = []
|
|
95
|
+
|
|
96
|
+
route << options[:action] # "batch_action", "edit" or "new"
|
|
97
|
+
route << resource.route_prefix # "admin"
|
|
98
|
+
route << belongs_to_name if nested? # "category"
|
|
99
|
+
route << resource_path_name # "posts" or "post"
|
|
100
|
+
route << suffix # "path" or "index path"
|
|
101
|
+
|
|
102
|
+
route.compact.join('_').to_sym # :admin_category_posts_path
|
|
103
|
+
end
|
|
104
|
+
|
|
105
|
+
# @return params to pass to instance path
|
|
106
|
+
def route_instance_params(instance)
|
|
107
|
+
if nested?
|
|
108
|
+
[instance.public_send(belongs_to_name).to_param, instance.to_param]
|
|
109
|
+
else
|
|
110
|
+
instance.to_param
|
|
111
|
+
end
|
|
112
|
+
end
|
|
113
|
+
|
|
114
|
+
def route_collection_params(params)
|
|
115
|
+
if nested?
|
|
116
|
+
params[:"#{belongs_to_name}_id"]
|
|
117
|
+
end
|
|
118
|
+
end
|
|
119
|
+
|
|
120
|
+
def nested?
|
|
121
|
+
resource.belongs_to? && resource.belongs_to_config.required?
|
|
122
|
+
end
|
|
123
|
+
|
|
124
|
+
def belongs_to_name
|
|
125
|
+
resource.belongs_to_config.target.resource_name.singular if nested?
|
|
126
|
+
end
|
|
127
|
+
|
|
128
|
+
def routes
|
|
129
|
+
Helpers::Routes
|
|
130
|
+
end
|
|
131
|
+
end
|
|
132
|
+
end
|
|
133
|
+
end
|
|
134
|
+
end
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
module ActiveAdmin
|
|
2
|
+
class Resource
|
|
3
|
+
module ScopeTo
|
|
4
|
+
|
|
5
|
+
# Scope this controller to some object which has a relation
|
|
6
|
+
# to the resource. Can either accept a block or a symbol
|
|
7
|
+
# of a method to call.
|
|
8
|
+
#
|
|
9
|
+
# Eg:
|
|
10
|
+
#
|
|
11
|
+
# ActiveAdmin.register Post do
|
|
12
|
+
# scope_to :current_user
|
|
13
|
+
# end
|
|
14
|
+
#
|
|
15
|
+
# Then every time we instantiate and object, it would call
|
|
16
|
+
#
|
|
17
|
+
# current_user.posts.build
|
|
18
|
+
#
|
|
19
|
+
# By default Active Admin will use the resource name to build a
|
|
20
|
+
# method to call as the association. If its different, you can
|
|
21
|
+
# pass in the association_method as an option.
|
|
22
|
+
#
|
|
23
|
+
# scope_to :current_user, association_method: :blog_posts
|
|
24
|
+
#
|
|
25
|
+
# will result in the following
|
|
26
|
+
#
|
|
27
|
+
# current_user.blog_posts.build
|
|
28
|
+
#
|
|
29
|
+
# To conditionally use this scope, you can use conditional procs
|
|
30
|
+
#
|
|
31
|
+
# scope_to :current_user, if: proc{ admin_user_signed_in? }
|
|
32
|
+
#
|
|
33
|
+
# or
|
|
34
|
+
#
|
|
35
|
+
# scope_to :current_user, unless: proc{ current_user.admin? }
|
|
36
|
+
#
|
|
37
|
+
def scope_to(*args, &block)
|
|
38
|
+
options = args.extract_options!
|
|
39
|
+
method = args.first
|
|
40
|
+
|
|
41
|
+
scope_to_config[:method] = block || method
|
|
42
|
+
scope_to_config[:association_method] = options[:association_method]
|
|
43
|
+
scope_to_config[:if] = options[:if]
|
|
44
|
+
scope_to_config[:unless] = options[:unless]
|
|
45
|
+
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
def scope_to_association_method
|
|
49
|
+
scope_to_config[:association_method]
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
def scope_to_method
|
|
53
|
+
scope_to_config[:method]
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
def scope_to_config
|
|
57
|
+
@scope_to_config ||= {
|
|
58
|
+
method: nil,
|
|
59
|
+
association_method: nil,
|
|
60
|
+
if: nil,
|
|
61
|
+
unless: nil
|
|
62
|
+
}
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
def scope_to?(context = nil)
|
|
66
|
+
return false if scope_to_method.nil?
|
|
67
|
+
return render_in_context(context, scope_to_config[:if]) unless scope_to_config[:if].nil?
|
|
68
|
+
return !render_in_context(context, scope_to_config[:unless]) unless scope_to_config[:unless].nil?
|
|
69
|
+
true
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
end
|
|
73
|
+
end
|
|
74
|
+
end
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
module ActiveAdmin
|
|
2
|
+
class Resource
|
|
3
|
+
module Scopes
|
|
4
|
+
|
|
5
|
+
# Return an array of scopes for this resource
|
|
6
|
+
def scopes
|
|
7
|
+
@scopes ||= []
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
# Returns a scope for this object by its identifier
|
|
11
|
+
def get_scope_by_id(id)
|
|
12
|
+
id = id.to_s
|
|
13
|
+
scopes.find{|s| s.id == id }
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def default_scope(context = nil)
|
|
17
|
+
scopes.detect do |scope|
|
|
18
|
+
if scope.default_block.is_a?(Proc)
|
|
19
|
+
render_in_context(context, scope.default_block)
|
|
20
|
+
else
|
|
21
|
+
scope.default_block
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
# Create a new scope object for this resource.
|
|
27
|
+
# If you want to internationalize the scope name, you can add
|
|
28
|
+
# to your i18n files a key like "active_admin.scopes.scope_method".
|
|
29
|
+
def scope(*args, &block)
|
|
30
|
+
default_options = {show_count: namespace.scopes_show_count}
|
|
31
|
+
options = default_options.merge(args.extract_options!)
|
|
32
|
+
title = args[0] rescue nil
|
|
33
|
+
method = args[1] rescue nil
|
|
34
|
+
|
|
35
|
+
options[:localizer] ||= ActiveAdmin::Localizers.resource(self)
|
|
36
|
+
scope = ActiveAdmin::Scope.new(title, method, options, &block)
|
|
37
|
+
|
|
38
|
+
# Finds and replaces a scope by the same name if it already exists
|
|
39
|
+
existing_scope_index = scopes.index{|existing_scope| existing_scope.id == scope.id }
|
|
40
|
+
if existing_scope_index
|
|
41
|
+
scopes.delete_at(existing_scope_index)
|
|
42
|
+
scopes.insert(existing_scope_index, scope)
|
|
43
|
+
else
|
|
44
|
+
self.scopes << scope
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
scope
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
end
|
|
51
|
+
end
|
|
52
|
+
end
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
require 'active_admin/helpers/optional_display'
|
|
2
|
+
|
|
3
|
+
module ActiveAdmin
|
|
4
|
+
|
|
5
|
+
class Resource
|
|
6
|
+
module Sidebars
|
|
7
|
+
|
|
8
|
+
def add_sidebar_section(name, options)
|
|
9
|
+
sidebar_sections << SidebarSection.new(name, options)
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
def sidebar_sections
|
|
13
|
+
@sidebar_sections ||= []
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def clear_sidebar_sections!
|
|
17
|
+
@sidebar_sections = []
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
def sidebar_sections_for(action, render_context = nil)
|
|
21
|
+
sidebar_sections.select{|section| section.display_on?(action, render_context) }
|
|
22
|
+
.sort_by(&:priority)
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
def sidebar_sections?
|
|
26
|
+
!!@sidebar_sections && @sidebar_sections.any?
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
end
|
|
@@ -0,0 +1,215 @@
|
|
|
1
|
+
require 'active_admin/resource/action_items'
|
|
2
|
+
require 'active_admin/resource/attributes'
|
|
3
|
+
require 'active_admin/resource/controllers'
|
|
4
|
+
require 'active_admin/resource/menu'
|
|
5
|
+
require 'active_admin/resource/page_presenters'
|
|
6
|
+
require 'active_admin/resource/pagination'
|
|
7
|
+
require 'active_admin/resource/routes'
|
|
8
|
+
require 'active_admin/resource/naming'
|
|
9
|
+
require 'active_admin/resource/scopes'
|
|
10
|
+
require 'active_admin/resource/includes'
|
|
11
|
+
require 'active_admin/resource/scope_to'
|
|
12
|
+
require 'active_admin/resource/sidebars'
|
|
13
|
+
require 'active_admin/resource/belongs_to'
|
|
14
|
+
require 'active_admin/resource/ordering'
|
|
15
|
+
|
|
16
|
+
module ActiveAdmin
|
|
17
|
+
|
|
18
|
+
# Resource is the primary data storage for resource configuration in Active Admin
|
|
19
|
+
#
|
|
20
|
+
# When you register a resource (ActiveAdmin.register Post) you are actually creating
|
|
21
|
+
# a new Resource instance within the given Namespace.
|
|
22
|
+
#
|
|
23
|
+
# The instance of the current resource is available in ResourceController and views
|
|
24
|
+
# by calling the #active_admin_config method.
|
|
25
|
+
#
|
|
26
|
+
class Resource
|
|
27
|
+
|
|
28
|
+
# Event dispatched when a new resource is registered
|
|
29
|
+
RegisterEvent = 'active_admin.resource.register'.freeze
|
|
30
|
+
|
|
31
|
+
# The namespace this config belongs to
|
|
32
|
+
attr_reader :namespace
|
|
33
|
+
|
|
34
|
+
# The name of the resource class
|
|
35
|
+
attr_reader :resource_class_name
|
|
36
|
+
|
|
37
|
+
# An array of member actions defined for this resource
|
|
38
|
+
attr_reader :member_actions
|
|
39
|
+
def add_member_route(name, options)
|
|
40
|
+
member_actions << ControllerAction.new(name, options)
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
# An array of collection actions defined for this resource
|
|
44
|
+
attr_reader :collection_actions
|
|
45
|
+
def add_collection_route(name, options)
|
|
46
|
+
collection_actions << ControllerAction.new(name, options)
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
# The default sort order to use in the controller
|
|
50
|
+
attr_writer :sort_order
|
|
51
|
+
def sort_order
|
|
52
|
+
@sort_order ||= (resource_class.respond_to?(:primary_key) ? resource_class.primary_key.to_s : 'id') + '_desc'
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
# Set the configuration for the CSV
|
|
56
|
+
attr_writer :csv_builder
|
|
57
|
+
|
|
58
|
+
# Set breadcrumb builder
|
|
59
|
+
attr_writer :breadcrumb
|
|
60
|
+
|
|
61
|
+
#Set order clause
|
|
62
|
+
attr_writer :order_clause
|
|
63
|
+
# Display create another checkbox on a new page
|
|
64
|
+
# @return [Boolean]
|
|
65
|
+
attr_writer :create_another
|
|
66
|
+
|
|
67
|
+
# Store a reference to the DSL so that we can dereference it during garbage collection.
|
|
68
|
+
attr_accessor :dsl
|
|
69
|
+
|
|
70
|
+
# The string identifying a class to decorate our resource with for the view.
|
|
71
|
+
# nil to not decorate.
|
|
72
|
+
attr_accessor :decorator_class_name
|
|
73
|
+
|
|
74
|
+
# An array or proc returning whitelisted resource attribute names.
|
|
75
|
+
attr_accessor :permitted_attr_names
|
|
76
|
+
|
|
77
|
+
module Base
|
|
78
|
+
def initialize(namespace, resource_class, options = {})
|
|
79
|
+
@namespace = namespace
|
|
80
|
+
@resource_class_name = "::#{resource_class.name}"
|
|
81
|
+
@options = options
|
|
82
|
+
@sort_order = options[:sort_order]
|
|
83
|
+
@member_actions, @collection_actions = [], []
|
|
84
|
+
end
|
|
85
|
+
end
|
|
86
|
+
|
|
87
|
+
include MethodOrProcHelper
|
|
88
|
+
|
|
89
|
+
include Base
|
|
90
|
+
include ActionItems
|
|
91
|
+
include Authorization
|
|
92
|
+
include Controllers
|
|
93
|
+
include Menu
|
|
94
|
+
include Naming
|
|
95
|
+
include PagePresenters
|
|
96
|
+
include Pagination
|
|
97
|
+
include Scopes
|
|
98
|
+
include Includes
|
|
99
|
+
include ScopeTo
|
|
100
|
+
include Sidebars
|
|
101
|
+
include Routes
|
|
102
|
+
include Ordering
|
|
103
|
+
include Attributes
|
|
104
|
+
|
|
105
|
+
# The class this resource wraps. If you register the Post model, Resource#resource_class
|
|
106
|
+
# will point to the Post class
|
|
107
|
+
def resource_class
|
|
108
|
+
resource_class_name.constantize
|
|
109
|
+
end
|
|
110
|
+
|
|
111
|
+
def decorator_class
|
|
112
|
+
decorator_class_name&.constantize
|
|
113
|
+
end
|
|
114
|
+
|
|
115
|
+
def resource_table_name
|
|
116
|
+
resource_class.quoted_table_name
|
|
117
|
+
end
|
|
118
|
+
|
|
119
|
+
def resource_column_names
|
|
120
|
+
resource_class.column_names
|
|
121
|
+
end
|
|
122
|
+
|
|
123
|
+
def resource_quoted_column_name(column)
|
|
124
|
+
resource_class.connection.quote_column_name(column)
|
|
125
|
+
end
|
|
126
|
+
|
|
127
|
+
# Clears all the member actions this resource knows about
|
|
128
|
+
def clear_member_actions!
|
|
129
|
+
@member_actions = []
|
|
130
|
+
end
|
|
131
|
+
|
|
132
|
+
def clear_collection_actions!
|
|
133
|
+
@collection_actions = []
|
|
134
|
+
end
|
|
135
|
+
|
|
136
|
+
# Return only defined resource actions
|
|
137
|
+
def defined_actions
|
|
138
|
+
controller.instance_methods.map(&:to_sym) & ResourceController::ACTIVE_ADMIN_ACTIONS
|
|
139
|
+
end
|
|
140
|
+
|
|
141
|
+
def belongs_to(target, options = {})
|
|
142
|
+
@belongs_to = Resource::BelongsTo.new(self, target, options)
|
|
143
|
+
self.menu_item_options = false if @belongs_to.required?
|
|
144
|
+
controller.send :belongs_to, target, options.dup
|
|
145
|
+
end
|
|
146
|
+
|
|
147
|
+
def belongs_to_config
|
|
148
|
+
@belongs_to
|
|
149
|
+
end
|
|
150
|
+
|
|
151
|
+
def belongs_to_param
|
|
152
|
+
if belongs_to? && belongs_to_config.required?
|
|
153
|
+
belongs_to_config.to_param
|
|
154
|
+
end
|
|
155
|
+
end
|
|
156
|
+
|
|
157
|
+
# Do we belong to another resource?
|
|
158
|
+
def belongs_to?
|
|
159
|
+
!!belongs_to_config
|
|
160
|
+
end
|
|
161
|
+
|
|
162
|
+
# The csv builder for this resource
|
|
163
|
+
def csv_builder
|
|
164
|
+
@csv_builder || default_csv_builder
|
|
165
|
+
end
|
|
166
|
+
|
|
167
|
+
def breadcrumb
|
|
168
|
+
instance_variable_defined?(:@breadcrumb) ? @breadcrumb : namespace.breadcrumb
|
|
169
|
+
end
|
|
170
|
+
|
|
171
|
+
def order_clause
|
|
172
|
+
@order_clause || namespace.order_clause
|
|
173
|
+
end
|
|
174
|
+
|
|
175
|
+
def create_another
|
|
176
|
+
instance_variable_defined?(:@create_another) ? @create_another : namespace.create_another
|
|
177
|
+
end
|
|
178
|
+
|
|
179
|
+
def find_resource(id)
|
|
180
|
+
resource = resource_class.public_send *method_for_find(id)
|
|
181
|
+
(decorator_class && resource) ? decorator_class.new(resource) : resource
|
|
182
|
+
end
|
|
183
|
+
|
|
184
|
+
def resource_columns
|
|
185
|
+
resource_attributes.values
|
|
186
|
+
end
|
|
187
|
+
|
|
188
|
+
def resource_attributes
|
|
189
|
+
@resource_attributes ||= default_attributes
|
|
190
|
+
end
|
|
191
|
+
|
|
192
|
+
def association_columns
|
|
193
|
+
@association_columns ||= resource_attributes.select{ |key, value| key != value }.values
|
|
194
|
+
end
|
|
195
|
+
|
|
196
|
+
def content_columns
|
|
197
|
+
@content_columns ||= resource_attributes.select{ |key, value| key == value }.values
|
|
198
|
+
end
|
|
199
|
+
|
|
200
|
+
private
|
|
201
|
+
|
|
202
|
+
def method_for_find(id)
|
|
203
|
+
if finder = resources_configuration[:self][:finder]
|
|
204
|
+
[finder, id]
|
|
205
|
+
else
|
|
206
|
+
[:find_by, { resource_class.primary_key => id }]
|
|
207
|
+
end
|
|
208
|
+
end
|
|
209
|
+
|
|
210
|
+
def default_csv_builder
|
|
211
|
+
@default_csv_builder ||= CSVBuilder.default_for_resource(self)
|
|
212
|
+
end
|
|
213
|
+
|
|
214
|
+
end # class Resource
|
|
215
|
+
end # module ActiveAdmin
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
module ActiveAdmin
|
|
2
|
+
# This is a container for resources, which acts much like a Hash.
|
|
3
|
+
# It's assumed that an added resource responds to `resource_name`.
|
|
4
|
+
class ResourceCollection
|
|
5
|
+
include Enumerable
|
|
6
|
+
extend Forwardable
|
|
7
|
+
def_delegators :@collection, :empty?, :has_key?, :keys, :values, :size
|
|
8
|
+
|
|
9
|
+
def initialize
|
|
10
|
+
@collection = {}
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
def add(resource)
|
|
14
|
+
if match = @collection[resource.resource_name]
|
|
15
|
+
raise_if_mismatched! match, resource
|
|
16
|
+
match
|
|
17
|
+
else
|
|
18
|
+
@collection[resource.resource_name] = resource
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
# Changes `each` to pass in the value, instead of both the key and value.
|
|
23
|
+
def each(&block)
|
|
24
|
+
values.each &block
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
def [](obj)
|
|
28
|
+
@collection[obj] || find_resource(obj)
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
private
|
|
32
|
+
|
|
33
|
+
# Finds a resource based on the resource name, resource class, or base class.
|
|
34
|
+
def find_resource(obj)
|
|
35
|
+
resources.detect do |r|
|
|
36
|
+
r.resource_name.to_s == obj.to_s
|
|
37
|
+
end || resources.detect do |r|
|
|
38
|
+
r.resource_class.to_s == obj.to_s
|
|
39
|
+
end ||
|
|
40
|
+
if obj.respond_to? :base_class
|
|
41
|
+
resources.detect{ |r| r.resource_class.to_s == obj.base_class.to_s }
|
|
42
|
+
end
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
def resources
|
|
46
|
+
select{ |r| r.class <= Resource } # can otherwise be a Page
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
def raise_if_mismatched!(existing, given)
|
|
50
|
+
if existing.class != given.class
|
|
51
|
+
raise IncorrectClass.new existing, given
|
|
52
|
+
elsif given.class <= Resource && existing.resource_class != given.resource_class
|
|
53
|
+
raise ConfigMismatch.new existing, given
|
|
54
|
+
end
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
class IncorrectClass < StandardError
|
|
58
|
+
def initialize(existing, given)
|
|
59
|
+
super "You're trying to register #{given.resource_name} which is a #{given.class}, " +
|
|
60
|
+
"but #{existing.resource_name}, a #{existing.class} has already claimed that name."
|
|
61
|
+
end
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
class ConfigMismatch < StandardError
|
|
65
|
+
def initialize(existing, given)
|
|
66
|
+
super "You're trying to register #{given.resource_class} as #{given.resource_name}, " +
|
|
67
|
+
"but the existing #{existing.class} config was built for #{existing.resource_class}!"
|
|
68
|
+
end
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
end
|
|
72
|
+
end
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
module ActiveAdmin
|
|
2
|
+
class ResourceController < BaseController
|
|
3
|
+
|
|
4
|
+
module ActionBuilder
|
|
5
|
+
extend ActiveSupport::Concern
|
|
6
|
+
|
|
7
|
+
module ClassMethods
|
|
8
|
+
|
|
9
|
+
def clear_member_actions!
|
|
10
|
+
active_admin_config.clear_member_actions!
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
def clear_collection_actions!
|
|
14
|
+
active_admin_config.clear_collection_actions!
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
end
|
|
21
|
+
end
|