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,221 @@
|
|
|
1
|
+
module ActiveAdmin
|
|
2
|
+
# This is the class where all the register blocks are evaluated.
|
|
3
|
+
class ResourceDSL < DSL
|
|
4
|
+
|
|
5
|
+
private
|
|
6
|
+
|
|
7
|
+
# Redefine sort behaviour for column
|
|
8
|
+
#
|
|
9
|
+
# For example:
|
|
10
|
+
#
|
|
11
|
+
# # nulls last
|
|
12
|
+
# order_by(:age) do |order_clause|
|
|
13
|
+
# [order_clause.to_sql, 'NULLS LAST'].join(' ') if order_clause.order == 'desc'
|
|
14
|
+
# end
|
|
15
|
+
#
|
|
16
|
+
# # by last_name but in the case that there is no last name, by first_name.
|
|
17
|
+
# order_by(:full_name) do |order_clause|
|
|
18
|
+
# ['COALESCE(NULLIF(last_name, ''), first_name), first_name', order_clause.order].join(' ')
|
|
19
|
+
# end
|
|
20
|
+
#
|
|
21
|
+
#
|
|
22
|
+
def order_by(column, &block)
|
|
23
|
+
config.ordering[column] = block
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
def belongs_to(target, options = {})
|
|
27
|
+
config.belongs_to(target, options)
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
# Scope collection to a relation
|
|
31
|
+
def scope_to(*args, &block)
|
|
32
|
+
config.scope_to(*args, &block)
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
# Create a scope
|
|
36
|
+
def scope(*args, &block)
|
|
37
|
+
config.scope(*args, &block)
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
# Store relations that should be included
|
|
41
|
+
def includes(*args)
|
|
42
|
+
config.includes.push *args
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
#
|
|
46
|
+
# Keys included in the `permitted_params` setting are automatically whitelisted.
|
|
47
|
+
#
|
|
48
|
+
# Either
|
|
49
|
+
#
|
|
50
|
+
# permit_params :title, :author, :body, tags: []
|
|
51
|
+
#
|
|
52
|
+
# Or
|
|
53
|
+
#
|
|
54
|
+
# permit_params do
|
|
55
|
+
# defaults = [:title, :body]
|
|
56
|
+
# if current_user.admin?
|
|
57
|
+
# defaults + [:author]
|
|
58
|
+
# else
|
|
59
|
+
# defaults
|
|
60
|
+
# end
|
|
61
|
+
# end
|
|
62
|
+
#
|
|
63
|
+
def permit_params(*args, &block)
|
|
64
|
+
config.permitted_attr_names = block_given? ? block : args
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
# Configure the index page for the resource
|
|
68
|
+
def index(options = {}, &block)
|
|
69
|
+
if block_given?
|
|
70
|
+
options[:as] ||= :table
|
|
71
|
+
config.set_page_presenter :index, ActiveAdmin::PagePresenter.new(options, &block)
|
|
72
|
+
else
|
|
73
|
+
config.set_page_options :index, options
|
|
74
|
+
end
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
# Configure the show page for the resource
|
|
78
|
+
def show(options = {}, &block)
|
|
79
|
+
if block_given?
|
|
80
|
+
config.set_page_presenter :show, ActiveAdmin::PagePresenter.new(options, &block)
|
|
81
|
+
else
|
|
82
|
+
config.set_page_options :show, options
|
|
83
|
+
end
|
|
84
|
+
end
|
|
85
|
+
|
|
86
|
+
def form(options = {}, &block)
|
|
87
|
+
if block_given?
|
|
88
|
+
config.set_page_presenter :form, ActiveAdmin::PagePresenter.new(options, &block)
|
|
89
|
+
else
|
|
90
|
+
config.set_page_options :form, options
|
|
91
|
+
end
|
|
92
|
+
end
|
|
93
|
+
|
|
94
|
+
# Configure the CSV format
|
|
95
|
+
#
|
|
96
|
+
# For example:
|
|
97
|
+
#
|
|
98
|
+
# csv do
|
|
99
|
+
# column :name
|
|
100
|
+
# column("Author") { |post| post.author.full_name }
|
|
101
|
+
# end
|
|
102
|
+
#
|
|
103
|
+
# csv col_sep: ";", force_quotes: true do
|
|
104
|
+
# column :name
|
|
105
|
+
# end
|
|
106
|
+
#
|
|
107
|
+
def csv(options = {}, &block)
|
|
108
|
+
options[:resource] = config
|
|
109
|
+
|
|
110
|
+
config.csv_builder = CSVBuilder.new(options, &block)
|
|
111
|
+
end
|
|
112
|
+
|
|
113
|
+
# Member Actions give you the functionality of defining both the
|
|
114
|
+
# action and the route directly from your ActiveAdmin registration
|
|
115
|
+
# block.
|
|
116
|
+
#
|
|
117
|
+
# For example:
|
|
118
|
+
#
|
|
119
|
+
# ActiveAdmin.register Post do
|
|
120
|
+
# member_action :comments do
|
|
121
|
+
# @post = Post.find(params[:id]
|
|
122
|
+
# @comments = @post.comments
|
|
123
|
+
# end
|
|
124
|
+
# end
|
|
125
|
+
#
|
|
126
|
+
# Will create a new controller action comments and will hook it up to
|
|
127
|
+
# the named route (comments_admin_post_path) /admin/posts/:id/comments
|
|
128
|
+
#
|
|
129
|
+
# You can treat everything within the block as a standard Rails controller
|
|
130
|
+
# action.
|
|
131
|
+
#
|
|
132
|
+
def member_action(name, options = {}, &block)
|
|
133
|
+
if (title = options.delete(:title))
|
|
134
|
+
set_title_before_action(name, title)
|
|
135
|
+
end
|
|
136
|
+
|
|
137
|
+
define_controller_method(name, &block)
|
|
138
|
+
|
|
139
|
+
config.add_member_route(name, options)
|
|
140
|
+
end
|
|
141
|
+
|
|
142
|
+
def collection_action(name, options = {}, &block)
|
|
143
|
+
if (title = options.delete(:title))
|
|
144
|
+
set_title_before_action(name, title)
|
|
145
|
+
end
|
|
146
|
+
|
|
147
|
+
define_controller_method(name, &block)
|
|
148
|
+
|
|
149
|
+
config.add_collection_route(name, options)
|
|
150
|
+
end
|
|
151
|
+
|
|
152
|
+
def decorate_with(decorator_class)
|
|
153
|
+
# Force storage as a string. This will help us with reloading issues.
|
|
154
|
+
# Assuming decorator_class.to_s will return the name of the class allows
|
|
155
|
+
# us to handle a string or a class.
|
|
156
|
+
config.decorator_class_name = "::#{ decorator_class }"
|
|
157
|
+
end
|
|
158
|
+
|
|
159
|
+
# Defined Callbacks
|
|
160
|
+
#
|
|
161
|
+
# == After Build
|
|
162
|
+
# Called after the resource is built in the new and create actions.
|
|
163
|
+
#
|
|
164
|
+
# ActiveAdmin.register Post do
|
|
165
|
+
# after_build do |post|
|
|
166
|
+
# post.author = current_user
|
|
167
|
+
# end
|
|
168
|
+
# end
|
|
169
|
+
#
|
|
170
|
+
# == Before / After Create
|
|
171
|
+
# Called before and after a resource is saved to the db on the create action.
|
|
172
|
+
#
|
|
173
|
+
# == Before / After Update
|
|
174
|
+
# Called before and after a resource is saved to the db on the update action.
|
|
175
|
+
#
|
|
176
|
+
# == Before / After Save
|
|
177
|
+
# Called before and after the object is saved in the create and update action.
|
|
178
|
+
# Note: Gets called after the create and update callbacks
|
|
179
|
+
#
|
|
180
|
+
# == Before / After Destroy
|
|
181
|
+
# Called before and after the object is destroyed from the database.
|
|
182
|
+
#
|
|
183
|
+
delegate :before_build, :after_build, to: :controller
|
|
184
|
+
delegate :before_create, :after_create, to: :controller
|
|
185
|
+
delegate :before_update, :after_update, to: :controller
|
|
186
|
+
delegate :before_save, :after_save, to: :controller
|
|
187
|
+
delegate :before_destroy, :after_destroy, to: :controller
|
|
188
|
+
|
|
189
|
+
# This code defines both *_filter and *_action for Rails 5.0 and *_action for Rails >= 5.1
|
|
190
|
+
phases = [
|
|
191
|
+
:before, :skip_before,
|
|
192
|
+
:after, :skip_after,
|
|
193
|
+
:around, :skip
|
|
194
|
+
]
|
|
195
|
+
keywords = if Rails::VERSION::MAJOR == 5 && Rails::VERSION::MINOR >= 1
|
|
196
|
+
[:action]
|
|
197
|
+
else
|
|
198
|
+
[:action, :filter]
|
|
199
|
+
end
|
|
200
|
+
|
|
201
|
+
keywords.each do |name|
|
|
202
|
+
phases.each do |action|
|
|
203
|
+
define_method "#{action}_#{name}" do |*args, &block|
|
|
204
|
+
controller.public_send "#{action}_action", *args, &block
|
|
205
|
+
end
|
|
206
|
+
end
|
|
207
|
+
end
|
|
208
|
+
|
|
209
|
+
# Specify which actions to create in the controller
|
|
210
|
+
#
|
|
211
|
+
# Eg:
|
|
212
|
+
#
|
|
213
|
+
# ActiveAdmin.register Post do
|
|
214
|
+
# actions :index, :show
|
|
215
|
+
# end
|
|
216
|
+
#
|
|
217
|
+
# Will only create the index and show actions (no create, update or delete)
|
|
218
|
+
delegate :actions, to: :controller
|
|
219
|
+
|
|
220
|
+
end
|
|
221
|
+
end
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
module ActiveAdmin
|
|
2
|
+
# @private
|
|
3
|
+
class Router
|
|
4
|
+
attr_reader :namespaces, :router
|
|
5
|
+
|
|
6
|
+
def initialize(router:, namespaces:)
|
|
7
|
+
@router, @namespaces = router, namespaces
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
def apply
|
|
11
|
+
define_root_routes
|
|
12
|
+
define_resources_routes
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
private
|
|
16
|
+
|
|
17
|
+
def define_root_routes
|
|
18
|
+
namespaces.each do |namespace|
|
|
19
|
+
if namespace.root?
|
|
20
|
+
router.root namespace.root_to_options.merge(to: namespace.root_to, as: nil)
|
|
21
|
+
else
|
|
22
|
+
router.namespace namespace.name, namespace.route_options.dup do
|
|
23
|
+
router.root namespace.root_to_options.merge(to: namespace.root_to, as: :root)
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
# Defines the routes for each resource
|
|
30
|
+
def define_resources_routes
|
|
31
|
+
resources = namespaces.flat_map{ |n| n.resources.values }
|
|
32
|
+
resources.each do |config|
|
|
33
|
+
define_resource_routes(config)
|
|
34
|
+
end
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
def define_resource_routes(config)
|
|
38
|
+
if config.namespace.root?
|
|
39
|
+
define_routes(config)
|
|
40
|
+
else
|
|
41
|
+
# Add on the namespace if required
|
|
42
|
+
define_namespace(config)
|
|
43
|
+
end
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
def define_routes(config)
|
|
47
|
+
if config.belongs_to?
|
|
48
|
+
define_belongs_to_routes(config)
|
|
49
|
+
else
|
|
50
|
+
page_or_resource_routes(config)
|
|
51
|
+
end
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
def page_or_resource_routes(config)
|
|
55
|
+
config.is_a?(Page) ? page_routes(config) : resource_routes(config)
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
def resource_routes(config)
|
|
59
|
+
router.resources config.resource_name.route_key, only: config.defined_actions do
|
|
60
|
+
define_actions(config)
|
|
61
|
+
end
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
def page_routes(config)
|
|
65
|
+
page = config.underscored_resource_name
|
|
66
|
+
router.get "/#{page}" => "#{page}#index"
|
|
67
|
+
config.page_actions.each do |action|
|
|
68
|
+
Array.wrap(action.http_verb).each do |verb|
|
|
69
|
+
build_route(verb, "/#{page}/#{action.name}" => "#{page}##{action.name}")
|
|
70
|
+
end
|
|
71
|
+
end
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
# Defines member and collection actions
|
|
75
|
+
def define_actions(config)
|
|
76
|
+
router.member do
|
|
77
|
+
config.member_actions.each { |action| build_action(action) }
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
router.collection do
|
|
81
|
+
config.collection_actions.each { |action| build_action(action) }
|
|
82
|
+
router.post :batch_action if config.batch_actions_enabled?
|
|
83
|
+
end
|
|
84
|
+
end
|
|
85
|
+
|
|
86
|
+
# Deals with +ControllerAction+ instances
|
|
87
|
+
# Builds one route for each HTTP verb passed in
|
|
88
|
+
def build_action(action)
|
|
89
|
+
build_route(action.http_verb, action.name)
|
|
90
|
+
end
|
|
91
|
+
|
|
92
|
+
def build_route(verbs, *args)
|
|
93
|
+
Array.wrap(verbs).each { |verb| router.send(verb, *args) }
|
|
94
|
+
end
|
|
95
|
+
|
|
96
|
+
def define_belongs_to_routes(config)
|
|
97
|
+
# If it's optional, make the normal resource routes
|
|
98
|
+
page_or_resource_routes(config) if config.belongs_to_config.optional?
|
|
99
|
+
|
|
100
|
+
# Make the nested belongs_to routes
|
|
101
|
+
# :only is set to nothing so that we don't clobber any existing routes on the resource
|
|
102
|
+
router.resources config.belongs_to_config.target.resource_name.plural, only: [] do
|
|
103
|
+
page_or_resource_routes(config)
|
|
104
|
+
end
|
|
105
|
+
end
|
|
106
|
+
|
|
107
|
+
def define_namespace(config)
|
|
108
|
+
router.namespace config.namespace.name, config.namespace.route_options.dup do
|
|
109
|
+
define_routes(config)
|
|
110
|
+
end
|
|
111
|
+
end
|
|
112
|
+
end
|
|
113
|
+
end
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
module ActiveAdmin
|
|
2
|
+
class Scope
|
|
3
|
+
|
|
4
|
+
attr_reader :scope_method, :id, :scope_block, :display_if_block, :show_count, :default_block, :group
|
|
5
|
+
|
|
6
|
+
# Create a Scope
|
|
7
|
+
#
|
|
8
|
+
# Examples:
|
|
9
|
+
#
|
|
10
|
+
# Scope.new(:published)
|
|
11
|
+
# # => Scope with name 'Published' and scope method :published
|
|
12
|
+
#
|
|
13
|
+
# Scope.new('Published', :public)
|
|
14
|
+
# # => Scope with name 'Published' and scope method :public
|
|
15
|
+
#
|
|
16
|
+
# Scope.new 'Published', :public, if: proc { current_admin_user.can? :manage, resource_class } do |articles|
|
|
17
|
+
# articles.where published: true
|
|
18
|
+
# end
|
|
19
|
+
# # => Scope with name 'Published' and scope method :public, optionally displaying the scope per the :if block
|
|
20
|
+
#
|
|
21
|
+
# Scope.new('Published') { |articles| articles.where(published: true) }
|
|
22
|
+
# # => Scope with name 'Published' using a block to scope
|
|
23
|
+
#
|
|
24
|
+
# Scope.new ->{Date.today.strftime '%A'}, :published_today
|
|
25
|
+
# # => Scope with dynamic title using the :published_today scope method
|
|
26
|
+
#
|
|
27
|
+
# Scope.new :published, nil, group: :status
|
|
28
|
+
# # => Scope with the group :status
|
|
29
|
+
#
|
|
30
|
+
def initialize(name, method = nil, options = {}, &block)
|
|
31
|
+
@name, @scope_method = name, method.try(:to_sym)
|
|
32
|
+
|
|
33
|
+
if name.is_a? Proc
|
|
34
|
+
raise "A string/symbol is required as the second argument if your label is a proc." unless method
|
|
35
|
+
@id = method.to_s.parameterize(separator: "_")
|
|
36
|
+
else
|
|
37
|
+
@scope_method ||= name.to_sym
|
|
38
|
+
@id = name.to_s.parameterize(separator: "_")
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
@scope_method = nil if @scope_method == :all
|
|
42
|
+
@scope_method, @scope_block = nil, block if block_given?
|
|
43
|
+
|
|
44
|
+
@localizer = options[:localizer]
|
|
45
|
+
@show_count = options.fetch(:show_count, true)
|
|
46
|
+
@display_if_block = options[:if] || proc{ true }
|
|
47
|
+
@default_block = options[:default] || proc{ false }
|
|
48
|
+
@group = options[:group].try(:to_sym)
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
def name
|
|
52
|
+
case @name
|
|
53
|
+
when String then @name
|
|
54
|
+
when Symbol then @localizer ? @localizer.t(@name, scope: 'scopes') : @name.to_s.titleize
|
|
55
|
+
else @name
|
|
56
|
+
end
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
end
|
|
60
|
+
end
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
module ActiveAdmin
|
|
2
|
+
|
|
3
|
+
class SettingsNode
|
|
4
|
+
class << self
|
|
5
|
+
# Never instantiated. Variables are stored in the singleton_class.
|
|
6
|
+
private_class_method :new
|
|
7
|
+
|
|
8
|
+
# @returns anonymous class with same accessors as the superclass.
|
|
9
|
+
def build(superclass = self)
|
|
10
|
+
Class.new(superclass)
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
def register(name, value)
|
|
14
|
+
class_attribute name
|
|
15
|
+
send "#{name}=", value
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
end
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
module ActiveAdmin
|
|
2
|
+
|
|
3
|
+
class SidebarSection
|
|
4
|
+
include ActiveAdmin::OptionalDisplay
|
|
5
|
+
|
|
6
|
+
attr_accessor :name, :options, :block
|
|
7
|
+
|
|
8
|
+
def initialize(name, options = {}, &block)
|
|
9
|
+
@name, @options, @block = name.to_s, options, block
|
|
10
|
+
normalize_display_options!
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
# The id gets used for the div in the view
|
|
14
|
+
def id
|
|
15
|
+
"#{name.downcase.underscore}_sidebar_section".parameterize
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
# The title gets displayed within the section in the view
|
|
19
|
+
def title
|
|
20
|
+
I18n.t("active_admin.sidebars.#{name}", default: name.titlecase)
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
# If a block is not passed in, the name of the partial to render
|
|
24
|
+
def partial_name
|
|
25
|
+
options[:partial] || "#{name.downcase.tr(' ', '_')}_sidebar"
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
def custom_class
|
|
29
|
+
options[:class]
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
def priority
|
|
33
|
+
options[:priority] || 10
|
|
34
|
+
end
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
end
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
module ActiveAdmin
|
|
2
|
+
module ViewHelpers
|
|
3
|
+
module AutoLinkHelper
|
|
4
|
+
|
|
5
|
+
# Automatically links objects to their resource controllers. If
|
|
6
|
+
# the resource has not been registered, a string representation of
|
|
7
|
+
# the object is returned.
|
|
8
|
+
#
|
|
9
|
+
# The default content in the link is returned from ActiveAdmin::ViewHelpers::DisplayHelper#display_name
|
|
10
|
+
#
|
|
11
|
+
# You can pass in the content to display
|
|
12
|
+
# eg: auto_link(@post, "My Link")
|
|
13
|
+
#
|
|
14
|
+
def auto_link(resource, content = display_name(resource))
|
|
15
|
+
if url = auto_url_for(resource)
|
|
16
|
+
link_to content, url
|
|
17
|
+
else
|
|
18
|
+
content
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
# Like `auto_link`, except that it only returns a URL instead of a full <a> tag
|
|
23
|
+
def auto_url_for(resource)
|
|
24
|
+
config = active_admin_resource_for(resource.class)
|
|
25
|
+
return unless config
|
|
26
|
+
|
|
27
|
+
if config.controller.action_methods.include?("show") &&
|
|
28
|
+
authorized?(ActiveAdmin::Auth::READ, resource)
|
|
29
|
+
url_for config.route_instance_path resource, url_options
|
|
30
|
+
elsif config.controller.action_methods.include?("edit") &&
|
|
31
|
+
authorized?(ActiveAdmin::Auth::UPDATE, resource)
|
|
32
|
+
url_for config.route_edit_instance_path resource, url_options
|
|
33
|
+
end
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
# Returns the ActiveAdmin::Resource instance for a class
|
|
37
|
+
def active_admin_resource_for(klass)
|
|
38
|
+
if respond_to? :active_admin_namespace
|
|
39
|
+
active_admin_namespace.resource_for klass
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
end
|
|
44
|
+
end
|
|
45
|
+
end
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
module ActiveAdmin
|
|
2
|
+
module ViewHelpers
|
|
3
|
+
module BreadcrumbHelper
|
|
4
|
+
|
|
5
|
+
# Returns an array of links to use in a breadcrumb
|
|
6
|
+
def breadcrumb_links(path = request.path)
|
|
7
|
+
setting = active_admin_config.breadcrumb
|
|
8
|
+
|
|
9
|
+
if setting.blank?
|
|
10
|
+
nil
|
|
11
|
+
elsif setting.is_a?(Proc)
|
|
12
|
+
instance_exec(controller, &setting)
|
|
13
|
+
else
|
|
14
|
+
default_breadcrumb_links(path)
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
GUID_REGEX = '(?:[a-f0-9]{8}-(?:[a-f0-9]{4}-){3}[a-f0-9]{12})'
|
|
19
|
+
ID_REGEX = '\d+|[a-f0-9]{24}|' + GUID_REGEX
|
|
20
|
+
|
|
21
|
+
def default_breadcrumb_links(path)
|
|
22
|
+
# remove leading "/" and split up the URL
|
|
23
|
+
# and remove last since it's used as the page title
|
|
24
|
+
parts = path.split('/').select(&:present?)[0..-2]
|
|
25
|
+
|
|
26
|
+
parts.each_with_index.map do |part, index|
|
|
27
|
+
config = breadcrumb_part_config(parts[index-1]) if part.match?(/\A(#{ID_REGEX})\z/)
|
|
28
|
+
|
|
29
|
+
# 1. try using `display_name` if we can locate a DB object
|
|
30
|
+
# 2. try using the model name translation
|
|
31
|
+
# 3. default to calling `titlecase` on the URL fragment
|
|
32
|
+
name = config && display_name(config.find_resource part)
|
|
33
|
+
name ||= I18n.t "activerecord.models.#{part.singularize}", count: ::ActiveAdmin::Helpers::I18n::PLURAL_MANY_COUNT, default: part.titlecase
|
|
34
|
+
|
|
35
|
+
# Don't create a link if the resource's show action is disabled
|
|
36
|
+
if !config || config.defined_actions.include?(:show)
|
|
37
|
+
link_to name, '/' + parts[0..index].join('/')
|
|
38
|
+
else
|
|
39
|
+
name
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
def breadcrumb_part_config(parent_part)
|
|
45
|
+
config = active_admin_config
|
|
46
|
+
parent = config.belongs_to_config.try :target
|
|
47
|
+
parent && parent.resource_name.route_key == parent_part ? parent : config
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
end
|
|
51
|
+
end
|
|
52
|
+
end
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
module ActiveAdmin
|
|
2
|
+
module ViewHelpers
|
|
3
|
+
module DisplayHelper
|
|
4
|
+
|
|
5
|
+
DISPLAY_NAME_FALLBACK = ->{
|
|
6
|
+
name, klass = "", self.class
|
|
7
|
+
name << klass.model_name.human if klass.respond_to? :model_name
|
|
8
|
+
name << " ##{send(klass.primary_key)}" if klass.respond_to? :primary_key
|
|
9
|
+
name.present? ? name : to_s
|
|
10
|
+
}
|
|
11
|
+
def DISPLAY_NAME_FALLBACK.inspect
|
|
12
|
+
'DISPLAY_NAME_FALLBACK'
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
# Attempts to call any known display name methods on the resource.
|
|
16
|
+
# See the setting in `application.rb` for the list of methods and their priority.
|
|
17
|
+
def display_name(resource)
|
|
18
|
+
sanitize(render_in_context(resource, display_name_method_for(resource)).to_s) unless resource.nil?
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
# Looks up and caches the first available display name method.
|
|
22
|
+
# To prevent conflicts, we exclude any methods that happen to be associations.
|
|
23
|
+
# If no methods are available and we're about to use the Kernel's `to_s`, provide our own.
|
|
24
|
+
def display_name_method_for(resource)
|
|
25
|
+
@@display_name_methods_cache ||= {}
|
|
26
|
+
@@display_name_methods_cache[resource.class] ||= begin
|
|
27
|
+
methods = active_admin_application.display_name_methods - association_methods_for(resource)
|
|
28
|
+
method = methods.detect{ |method| resource.respond_to? method }
|
|
29
|
+
|
|
30
|
+
if method != :to_s || resource.method(method).source_location
|
|
31
|
+
method
|
|
32
|
+
else
|
|
33
|
+
DISPLAY_NAME_FALLBACK
|
|
34
|
+
end
|
|
35
|
+
end
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
def association_methods_for(resource)
|
|
39
|
+
return [] unless resource.class.respond_to? :reflect_on_all_associations
|
|
40
|
+
resource.class.reflect_on_all_associations.map(&:name)
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
def format_attribute(resource, attr)
|
|
44
|
+
value = find_value resource, attr
|
|
45
|
+
|
|
46
|
+
if value.is_a?(Arbo::Element)
|
|
47
|
+
value
|
|
48
|
+
elsif boolean_attr?(resource, attr, value)
|
|
49
|
+
Arbo::Context.new { status_tag value }
|
|
50
|
+
else
|
|
51
|
+
pretty_format value
|
|
52
|
+
end
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
def find_value(resource, attr)
|
|
56
|
+
if attr.is_a? Proc
|
|
57
|
+
attr.call resource
|
|
58
|
+
elsif resource.respond_to? attr
|
|
59
|
+
resource.public_send attr
|
|
60
|
+
elsif resource.respond_to? :[]
|
|
61
|
+
resource[attr]
|
|
62
|
+
end
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
# Attempts to create a human-readable string for any object
|
|
66
|
+
def pretty_format(object)
|
|
67
|
+
case object
|
|
68
|
+
when String, Numeric, Symbol, Arbo::Element
|
|
69
|
+
object.to_s
|
|
70
|
+
when Date, Time
|
|
71
|
+
I18n.localize object, format: active_admin_application.localize_format
|
|
72
|
+
else
|
|
73
|
+
if defined?(::ActiveRecord) && object.is_a?(ActiveRecord::Base) ||
|
|
74
|
+
defined?(::Mongoid) && object.class.include?(Mongoid::Document)
|
|
75
|
+
auto_link object
|
|
76
|
+
else
|
|
77
|
+
display_name object
|
|
78
|
+
end
|
|
79
|
+
end
|
|
80
|
+
end
|
|
81
|
+
|
|
82
|
+
def boolean_attr?(resource, attr, value)
|
|
83
|
+
case value
|
|
84
|
+
when TrueClass, FalseClass
|
|
85
|
+
true
|
|
86
|
+
else
|
|
87
|
+
if resource.class.respond_to? :columns_hash
|
|
88
|
+
column = resource.class.columns_hash[attr.to_s] and column.type == :boolean
|
|
89
|
+
end
|
|
90
|
+
end
|
|
91
|
+
end
|
|
92
|
+
|
|
93
|
+
end
|
|
94
|
+
end
|
|
95
|
+
end
|