activeadministration 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/.gitignore +47 -0
- data/.travis.yml +19 -0
- data/.yardopts +9 -0
- data/CHANGELOG.md +1074 -0
- data/CONTRIBUTING.md +139 -0
- data/Gemfile +52 -0
- data/Guardfile +7 -0
- data/LICENSE +25 -0
- data/README.md +8 -0
- data/Rakefile +33 -0
- data/activeadministration.gemspec +34 -0
- data/app/assets/images/active_admin/admin_notes_icon.png +0 -0
- data/app/assets/images/active_admin/datepicker/datepicker-header-bg.png +0 -0
- data/app/assets/images/active_admin/datepicker/datepicker-input-icon.png +0 -0
- data/app/assets/images/active_admin/datepicker/datepicker-next-link-icon.png +0 -0
- data/app/assets/images/active_admin/datepicker/datepicker-nipple.png +0 -0
- data/app/assets/images/active_admin/datepicker/datepicker-prev-link-icon.png +0 -0
- data/app/assets/images/active_admin/index_list_icons/block_icon.svg +10 -0
- data/app/assets/images/active_admin/index_list_icons/blog_icon.svg +4 -0
- data/app/assets/images/active_admin/index_list_icons/grid_icon.svg +13 -0
- data/app/assets/images/active_admin/index_list_icons/table_icon.svg +3 -0
- data/app/assets/images/active_admin/loading.gif +0 -0
- data/app/assets/images/active_admin/nested_menu_arrow.gif +0 -0
- data/app/assets/images/active_admin/nested_menu_arrow_dark.gif +0 -0
- data/app/assets/images/active_admin/orderable.png +0 -0
- data/app/assets/javascripts/active_admin/application.js.coffee +30 -0
- data/app/assets/javascripts/active_admin/base.js.coffee +14 -0
- data/app/assets/javascripts/active_admin/ext/jquery-ui.js.coffee +6 -0
- data/app/assets/javascripts/active_admin/ext/jquery.js.coffee +7 -0
- data/app/assets/javascripts/active_admin/lib/batch_actions.js.coffee +39 -0
- data/app/assets/javascripts/active_admin/lib/checkbox-toggler.js.coffee +36 -0
- data/app/assets/javascripts/active_admin/lib/dropdown-menu.js.coffee +85 -0
- data/app/assets/javascripts/active_admin/lib/has_many.js.coffee +75 -0
- data/app/assets/javascripts/active_admin/lib/modal_dialog.js.coffee +36 -0
- data/app/assets/javascripts/active_admin/lib/popover.js.coffee +68 -0
- data/app/assets/javascripts/active_admin/lib/table-checkbox-toggler.js.coffee +24 -0
- data/app/assets/stylesheets/active_admin/_base.css.scss +42 -0
- data/app/assets/stylesheets/active_admin/_forms.css.scss +329 -0
- data/app/assets/stylesheets/active_admin/_header.css.scss +156 -0
- data/app/assets/stylesheets/active_admin/_mixins.css.scss +1 -0
- data/app/assets/stylesheets/active_admin/_typography.css.scss +100 -0
- data/app/assets/stylesheets/active_admin/components/_batch_actions.css.scss +11 -0
- data/app/assets/stylesheets/active_admin/components/_blank_slates.scss +31 -0
- data/app/assets/stylesheets/active_admin/components/_breadcrumbs.scss +20 -0
- data/app/assets/stylesheets/active_admin/components/_buttons.scss +11 -0
- data/app/assets/stylesheets/active_admin/components/_columns.scss +3 -0
- data/app/assets/stylesheets/active_admin/components/_comments.css.scss +41 -0
- data/app/assets/stylesheets/active_admin/components/_date_picker.css.scss +127 -0
- data/app/assets/stylesheets/active_admin/components/_dropdown_menu.scss +151 -0
- data/app/assets/stylesheets/active_admin/components/_flash_messages.css.scss +39 -0
- data/app/assets/stylesheets/active_admin/components/_grid.scss +9 -0
- data/app/assets/stylesheets/active_admin/components/_index_list.scss +12 -0
- data/app/assets/stylesheets/active_admin/components/_links.scss +5 -0
- data/app/assets/stylesheets/active_admin/components/_modal_dialog.scss +31 -0
- data/app/assets/stylesheets/active_admin/components/_pagination.scss +34 -0
- data/app/assets/stylesheets/active_admin/components/_panels.scss +6 -0
- data/app/assets/stylesheets/active_admin/components/_popovers.css.scss +123 -0
- data/app/assets/stylesheets/active_admin/components/_scopes.scss +10 -0
- data/app/assets/stylesheets/active_admin/components/_status_tags.scss +16 -0
- data/app/assets/stylesheets/active_admin/components/_table_tools.css.scss +65 -0
- data/app/assets/stylesheets/active_admin/components/_tables.css.scss +111 -0
- data/app/assets/stylesheets/active_admin/mixins/_all.css.scss +11 -0
- data/app/assets/stylesheets/active_admin/mixins/_buttons.css.scss +66 -0
- data/app/assets/stylesheets/active_admin/mixins/_gradients.css.scss +38 -0
- data/app/assets/stylesheets/active_admin/mixins/_icons.css.scss +20 -0
- data/app/assets/stylesheets/active_admin/mixins/_reset.css.scss +165 -0
- data/app/assets/stylesheets/active_admin/mixins/_rounded.css.scss +43 -0
- data/app/assets/stylesheets/active_admin/mixins/_sections.css.scss +36 -0
- data/app/assets/stylesheets/active_admin/mixins/_shadows.css.scss +22 -0
- data/app/assets/stylesheets/active_admin/mixins/_typography.scss +3 -0
- data/app/assets/stylesheets/active_admin/mixins/_utilities.scss +26 -0
- data/app/assets/stylesheets/active_admin/mixins/_variables.css.scss +34 -0
- data/app/assets/stylesheets/active_admin/pages/_logged_out.scss +44 -0
- data/app/assets/stylesheets/active_admin/print.css.scss +284 -0
- data/app/assets/stylesheets/active_admin/structure/_footer.scss +14 -0
- data/app/assets/stylesheets/active_admin/structure/_main_structure.scss +29 -0
- data/app/assets/stylesheets/active_admin/structure/_title_bar.scss +46 -0
- data/app/views/active_admin/dashboard/index.html.arb +1 -0
- data/app/views/active_admin/devise/confirmations/new.html.erb +14 -0
- data/app/views/active_admin/devise/mailer/reset_password_instructions.html.erb +8 -0
- data/app/views/active_admin/devise/mailer/unlock_instructions.html.erb +7 -0
- data/app/views/active_admin/devise/passwords/edit.html.erb +19 -0
- data/app/views/active_admin/devise/passwords/new.html.erb +14 -0
- data/app/views/active_admin/devise/registrations/new.html.erb +22 -0
- data/app/views/active_admin/devise/sessions/new.html.erb +20 -0
- data/app/views/active_admin/devise/shared/_links.erb +27 -0
- data/app/views/active_admin/devise/unlocks/new.html.erb +14 -0
- data/app/views/active_admin/page/index.html.arb +1 -0
- data/app/views/active_admin/resource/edit.html.arb +1 -0
- data/app/views/active_admin/resource/index.csv.erb +17 -0
- data/app/views/active_admin/resource/index.html.arb +1 -0
- data/app/views/active_admin/resource/new.html.arb +1 -0
- data/app/views/active_admin/resource/show.html.arb +1 -0
- data/app/views/kaminari/active_admin/_first_page.html.erb +11 -0
- data/app/views/kaminari/active_admin/_gap.html.erb +8 -0
- data/app/views/kaminari/active_admin/_last_page.html.erb +11 -0
- data/app/views/kaminari/active_admin/_next_page.html.erb +11 -0
- data/app/views/kaminari/active_admin/_page.html.erb +12 -0
- data/app/views/kaminari/active_admin/_paginator.html.erb +23 -0
- data/app/views/kaminari/active_admin/_prev_page.html.erb +11 -0
- data/app/views/layouts/active_admin.html.arb +1 -0
- data/app/views/layouts/active_admin_logged_out.html.erb +37 -0
- data/config/locales/bg.yml +102 -0
- data/config/locales/bs.yml +121 -0
- data/config/locales/ca.yml +102 -0
- data/config/locales/cs.yml +106 -0
- data/config/locales/da.yml +103 -0
- data/config/locales/de-CH.yml +118 -0
- data/config/locales/de.yml +143 -0
- data/config/locales/el.yml +111 -0
- data/config/locales/en-GB.yml +95 -0
- data/config/locales/en.yml +117 -0
- data/config/locales/es.yml +127 -0
- data/config/locales/es_MX.yml +110 -0
- data/config/locales/fi.yml +110 -0
- data/config/locales/fr.yml +109 -0
- data/config/locales/he.yml +92 -0
- data/config/locales/hr.yml +121 -0
- data/config/locales/hu.yml +96 -0
- data/config/locales/it.yml +114 -0
- data/config/locales/ja.yml +114 -0
- data/config/locales/ko.yml +85 -0
- data/config/locales/lt.yml +118 -0
- data/config/locales/lv.yml +90 -0
- data/config/locales/nl.yml +94 -0
- data/config/locales/no-NB.yml +111 -0
- data/config/locales/pl.yml +100 -0
- data/config/locales/pt-BR.yml +117 -0
- data/config/locales/pt-PT.yml +90 -0
- data/config/locales/ro.yml +94 -0
- data/config/locales/ru.yml +121 -0
- data/config/locales/sv-SE.yml +90 -0
- data/config/locales/tr.yml +94 -0
- data/config/locales/uk.yml +121 -0
- data/config/locales/vi.yml +91 -0
- data/config/locales/zh-CN.yml +112 -0
- data/config/locales/zh-TW.yml +94 -0
- data/cucumber.yml +3 -0
- data/docs/0-installation.md +84 -0
- data/docs/1-general-configuration.md +138 -0
- data/docs/10-custom-pages.md +84 -0
- data/docs/11-decorators.md +50 -0
- data/docs/12-arbre-components.md +150 -0
- data/docs/13-authorization-adapter.md +239 -0
- data/docs/2-resource-customization.md +359 -0
- data/docs/3-index-pages.md +245 -0
- data/docs/3-index-pages/create-an-index.md +31 -0
- data/docs/3-index-pages/index-as-block.md +21 -0
- data/docs/3-index-pages/index-as-blog.md +71 -0
- data/docs/3-index-pages/index-as-grid.md +29 -0
- data/docs/3-index-pages/index-as-table.md +163 -0
- data/docs/4-csv-format.md +39 -0
- data/docs/5-forms.md +118 -0
- data/docs/6-show-pages.md +77 -0
- data/docs/7-sidebars.md +63 -0
- data/docs/8-custom-actions.md +159 -0
- data/docs/9-batch-actions.md +233 -0
- data/features/action_item.feature +73 -0
- data/features/authorization.feature +64 -0
- data/features/authorization_cancan.feature +52 -0
- data/features/authorization_pundit.feature +37 -0
- data/features/belongs_to.feature +66 -0
- data/features/breadcrumb.feature +75 -0
- data/features/comments/commenting.feature +159 -0
- data/features/comments/viewing_index.feature +19 -0
- data/features/dashboard.feature +16 -0
- data/features/decorators.feature +41 -0
- data/features/development_reloading.feature +31 -0
- data/features/edit_page.feature +114 -0
- data/features/favicon.feature +20 -0
- data/features/first_boot.feature +16 -0
- data/features/global_navigation.feature +29 -0
- data/features/i18n.feature +43 -0
- data/features/index/batch_actions.feature +123 -0
- data/features/index/filters.feature +138 -0
- data/features/index/format_as_csv.feature +117 -0
- data/features/index/formats.feature +66 -0
- data/features/index/index_as_block.feature +15 -0
- data/features/index/index_as_blog.feature +69 -0
- data/features/index/index_as_grid.feature +45 -0
- data/features/index/index_as_table.feature +208 -0
- data/features/index/index_blank_slate.feature +83 -0
- data/features/index/index_parameters.feature +75 -0
- data/features/index/index_scope_to.feature +56 -0
- data/features/index/index_scopes.feature +251 -0
- data/features/index/page_title.feature +41 -0
- data/features/index/pagination.feature +59 -0
- data/features/index/switch_index_view.feature +73 -0
- data/features/menu.feature +53 -0
- data/features/new_page.feature +106 -0
- data/features/registering_assets.feature +35 -0
- data/features/registering_pages.feature +148 -0
- data/features/registering_resources.feature +33 -0
- data/features/root_to.feature +17 -0
- data/features/show/default_content.feature +43 -0
- data/features/show/page_title.feature +58 -0
- data/features/sidebar_sections.feature +210 -0
- data/features/site_title.feature +47 -0
- data/features/specifying_actions.feature +93 -0
- data/features/step_definitions/action_item_steps.rb +7 -0
- data/features/step_definitions/action_link_steps.rb +7 -0
- data/features/step_definitions/additional_web_steps.rb +82 -0
- data/features/step_definitions/asset_steps.rb +15 -0
- data/features/step_definitions/attribute_steps.rb +18 -0
- data/features/step_definitions/batch_action_steps.rb +55 -0
- data/features/step_definitions/breadcrumb_steps.rb +3 -0
- data/features/step_definitions/comment_steps.rb +12 -0
- data/features/step_definitions/configuration_steps.rb +100 -0
- data/features/step_definitions/dashboard_steps.rb +15 -0
- data/features/step_definitions/factory_steps.rb +34 -0
- data/features/step_definitions/filter_steps.rb +17 -0
- data/features/step_definitions/flash_steps.rb +11 -0
- data/features/step_definitions/format_steps.rb +45 -0
- data/features/step_definitions/i18n_steps.rb +3 -0
- data/features/step_definitions/index_scope_steps.rb +21 -0
- data/features/step_definitions/index_views_steps.rb +3 -0
- data/features/step_definitions/layout_steps.rb +3 -0
- data/features/step_definitions/member_link_steps.rb +7 -0
- data/features/step_definitions/menu_steps.rb +11 -0
- data/features/step_definitions/pagination_steps.rb +8 -0
- data/features/step_definitions/sidebar_steps.rb +12 -0
- data/features/step_definitions/site_title_steps.rb +15 -0
- data/features/step_definitions/symbol_leak_steps.rb +3 -0
- data/features/step_definitions/tab_steps.rb +3 -0
- data/features/step_definitions/table_steps.rb +119 -0
- data/features/step_definitions/user_steps.rb +41 -0
- data/features/step_definitions/web_steps.rb +86 -0
- data/features/sti_resource.feature +65 -0
- data/features/strong_parameters.feature +72 -0
- data/features/support/env.rb +119 -0
- data/features/support/paths.rb +71 -0
- data/features/support/selectors.rb +45 -0
- data/features/symbol_leak.feature +35 -0
- data/features/users/logging_in.feature +34 -0
- data/features/users/logging_out.feature +13 -0
- data/features/users/resetting_password.feature +34 -0
- data/lib/active_admin.rb +135 -0
- data/lib/active_admin/abstract_view_factory.rb +86 -0
- data/lib/active_admin/application.rb +250 -0
- data/lib/active_admin/asset_registration.rb +29 -0
- data/lib/active_admin/authorization_adapter.rb +132 -0
- data/lib/active_admin/base_controller.rb +78 -0
- data/lib/active_admin/base_controller/authorization.rb +151 -0
- data/lib/active_admin/base_controller/menu.rb +34 -0
- data/lib/active_admin/batch_actions.rb +17 -0
- data/lib/active_admin/batch_actions/controller.rb +29 -0
- data/lib/active_admin/batch_actions/resource_extension.rb +154 -0
- data/lib/active_admin/batch_actions/views/batch_action_form.rb +38 -0
- data/lib/active_admin/batch_actions/views/batch_action_popover.rb +28 -0
- data/lib/active_admin/batch_actions/views/batch_action_selector.rb +57 -0
- data/lib/active_admin/batch_actions/views/selection_cells.rb +37 -0
- data/lib/active_admin/callbacks.rb +84 -0
- data/lib/active_admin/cancan_adapter.rb +40 -0
- data/lib/active_admin/component.rb +5 -0
- data/lib/active_admin/controller_action.rb +12 -0
- data/lib/active_admin/csv_builder.rb +70 -0
- data/lib/active_admin/dependencies.rb +38 -0
- data/lib/active_admin/deprecation.rb +35 -0
- data/lib/active_admin/devise.rb +80 -0
- data/lib/active_admin/dsl.rb +165 -0
- data/lib/active_admin/engine.rb +7 -0
- data/lib/active_admin/error.rb +22 -0
- data/lib/active_admin/event.rb +33 -0
- data/lib/active_admin/filters.rb +9 -0
- data/lib/active_admin/filters/dsl.rb +21 -0
- data/lib/active_admin/filters/forms.rb +87 -0
- data/lib/active_admin/filters/formtastic_addons.rb +73 -0
- data/lib/active_admin/filters/resource_extension.rb +135 -0
- data/lib/active_admin/form_builder.rb +185 -0
- data/lib/active_admin/helpers/collection.rb +23 -0
- data/lib/active_admin/helpers/i18n.rb +7 -0
- data/lib/active_admin/helpers/optional_display.rb +38 -0
- data/lib/active_admin/helpers/scope_chain.rb +23 -0
- data/lib/active_admin/helpers/settings.rb +106 -0
- data/lib/active_admin/iconic.rb +54 -0
- data/lib/active_admin/iconic/icons.rb +142 -0
- data/lib/active_admin/inputs.rb +15 -0
- data/lib/active_admin/inputs/datepicker_input.rb +20 -0
- data/lib/active_admin/inputs/filter_base.rb +40 -0
- data/lib/active_admin/inputs/filter_base/search_method_select.rb +73 -0
- data/lib/active_admin/inputs/filter_boolean_input.rb +32 -0
- data/lib/active_admin/inputs/filter_check_boxes_input.rb +48 -0
- data/lib/active_admin/inputs/filter_date_range_input.rb +34 -0
- data/lib/active_admin/inputs/filter_numeric_input.rb +10 -0
- data/lib/active_admin/inputs/filter_select_input.rb +53 -0
- data/lib/active_admin/inputs/filter_string_input.rb +24 -0
- data/lib/active_admin/menu.rb +107 -0
- data/lib/active_admin/menu_collection.rb +96 -0
- data/lib/active_admin/menu_item.rb +97 -0
- data/lib/active_admin/namespace.rb +231 -0
- data/lib/active_admin/order_clause.rb +26 -0
- data/lib/active_admin/orm/active_record.rb +3 -0
- data/lib/active_admin/orm/active_record/comments.rb +84 -0
- data/lib/active_admin/orm/active_record/comments/comment.rb +49 -0
- data/lib/active_admin/orm/active_record/comments/namespace_helper.rb +14 -0
- data/lib/active_admin/orm/active_record/comments/resource_helper.rb +17 -0
- data/lib/active_admin/orm/active_record/comments/show_page_helper.rb +23 -0
- data/lib/active_admin/orm/active_record/comments/views.rb +2 -0
- data/lib/active_admin/orm/active_record/comments/views/active_admin_comments.rb +75 -0
- data/lib/active_admin/orm/mongoid.rb +1 -0
- data/lib/active_admin/orm/mongoid/.gitkeep +0 -0
- data/lib/active_admin/page.rb +88 -0
- data/lib/active_admin/page_controller.rb +29 -0
- data/lib/active_admin/page_dsl.rb +28 -0
- data/lib/active_admin/page_presenter.rb +32 -0
- data/lib/active_admin/pundit_adapter.rb +42 -0
- data/lib/active_admin/resource.rb +156 -0
- data/lib/active_admin/resource/action_items.rb +91 -0
- data/lib/active_admin/resource/belongs_to.rb +36 -0
- data/lib/active_admin/resource/controllers.rb +18 -0
- data/lib/active_admin/resource/menu.rb +64 -0
- data/lib/active_admin/resource/naming.rb +84 -0
- data/lib/active_admin/resource/page_presenters.rb +82 -0
- data/lib/active_admin/resource/pagination.rb +19 -0
- data/lib/active_admin/resource/routes.rb +99 -0
- data/lib/active_admin/resource/scope_to.rb +74 -0
- data/lib/active_admin/resource/scopes.rb +50 -0
- data/lib/active_admin/resource/sidebars.rb +28 -0
- data/lib/active_admin/resource_collection.rb +70 -0
- data/lib/active_admin/resource_controller.rb +50 -0
- data/lib/active_admin/resource_controller/action_builder.rb +21 -0
- data/lib/active_admin/resource_controller/data_access.rb +284 -0
- data/lib/active_admin/resource_controller/decorators.rb +100 -0
- data/lib/active_admin/resource_controller/resource_class_methods.rb +24 -0
- data/lib/active_admin/resource_controller/scoping.rb +31 -0
- data/lib/active_admin/resource_controller/sidebars.rb +18 -0
- data/lib/active_admin/resource_dsl.rb +171 -0
- data/lib/active_admin/router.rb +106 -0
- data/lib/active_admin/scope.rb +57 -0
- data/lib/active_admin/sidebar_section.rb +45 -0
- data/lib/active_admin/version.rb +3 -0
- data/lib/active_admin/view_factory.rb +27 -0
- data/lib/active_admin/view_helpers.rb +21 -0
- data/lib/active_admin/view_helpers/active_admin_application_helper.rb +12 -0
- data/lib/active_admin/view_helpers/assigns_with_indifferent_access_helper.rb +7 -0
- data/lib/active_admin/view_helpers/auto_link_helper.rb +37 -0
- data/lib/active_admin/view_helpers/breadcrumb_helper.rb +27 -0
- data/lib/active_admin/view_helpers/display_helper.rb +64 -0
- data/lib/active_admin/view_helpers/download_format_links_helper.rb +49 -0
- data/lib/active_admin/view_helpers/fields_for.rb +50 -0
- data/lib/active_admin/view_helpers/flash_helper.rb +13 -0
- data/lib/active_admin/view_helpers/form_helper.rb +21 -0
- data/lib/active_admin/view_helpers/icon_helper.rb +12 -0
- data/lib/active_admin/view_helpers/method_or_proc_helper.rb +93 -0
- data/lib/active_admin/view_helpers/sidebar_helper.rb +15 -0
- data/lib/active_admin/view_helpers/title_helper.rb +11 -0
- data/lib/active_admin/view_helpers/view_factory_helper.rb +11 -0
- data/lib/active_admin/views.rb +8 -0
- data/lib/active_admin/views/action_items.rb +17 -0
- data/lib/active_admin/views/components/action_list_popover.rb +29 -0
- data/lib/active_admin/views/components/attributes_table.rb +105 -0
- data/lib/active_admin/views/components/blank_slate.rb +17 -0
- data/lib/active_admin/views/components/columns.rb +157 -0
- data/lib/active_admin/views/components/dropdown_menu.rb +73 -0
- data/lib/active_admin/views/components/index_list.rb +68 -0
- data/lib/active_admin/views/components/paginated_collection.rb +126 -0
- data/lib/active_admin/views/components/panel.rb +34 -0
- data/lib/active_admin/views/components/popover.rb +27 -0
- data/lib/active_admin/views/components/scopes.rb +66 -0
- data/lib/active_admin/views/components/sidebar_section.rb +29 -0
- data/lib/active_admin/views/components/site_title.rb +55 -0
- data/lib/active_admin/views/components/status_tag.rb +67 -0
- data/lib/active_admin/views/components/table_for.rb +212 -0
- data/lib/active_admin/views/footer.rb +20 -0
- data/lib/active_admin/views/header.rb +32 -0
- data/lib/active_admin/views/index_as_block.rb +36 -0
- data/lib/active_admin/views/index_as_blog.rb +156 -0
- data/lib/active_admin/views/index_as_grid.rb +80 -0
- data/lib/active_admin/views/index_as_table.rb +277 -0
- data/lib/active_admin/views/pages/base.rb +139 -0
- data/lib/active_admin/views/pages/form.rb +51 -0
- data/lib/active_admin/views/pages/index.rb +163 -0
- data/lib/active_admin/views/pages/layout.rb +26 -0
- data/lib/active_admin/views/pages/page.rb +30 -0
- data/lib/active_admin/views/pages/show.rb +59 -0
- data/lib/active_admin/views/tabbed_navigation.rb +62 -0
- data/lib/active_admin/views/title_bar.rb +55 -0
- data/lib/activeadmin.rb +1 -0
- data/lib/generators/active_admin/assets/assets_generator.rb +16 -0
- data/lib/generators/active_admin/assets/templates/active_admin.css.scss +17 -0
- data/lib/generators/active_admin/assets/templates/active_admin.js.coffee +1 -0
- data/lib/generators/active_admin/devise/devise_generator.rb +66 -0
- data/lib/generators/active_admin/install/install_generator.rb +46 -0
- data/lib/generators/active_admin/install/templates/active_admin.rb.erb +243 -0
- data/lib/generators/active_admin/install/templates/admin_user.rb.erb +30 -0
- data/lib/generators/active_admin/install/templates/dashboard.rb +33 -0
- data/lib/generators/active_admin/install/templates/migrations/create_active_admin_comments.rb +19 -0
- data/lib/generators/active_admin/resource/resource_generator.rb +16 -0
- data/lib/generators/active_admin/resource/templates/admin.rb +17 -0
- data/lib/ransack_ext.rb +12 -0
- data/script/local +44 -0
- data/script/use_rails +53 -0
- data/spec/integration/default_namespace_spec.rb +61 -0
- data/spec/integration/javascript_spec.rb +20 -0
- data/spec/integration/memory_spec.rb +29 -0
- data/spec/integration/stylesheets_spec.rb +18 -0
- data/spec/javascripts/coffeescripts/jquery.aa.checkbox-toggler-spec.js.coffee +50 -0
- data/spec/javascripts/coffeescripts/jquery.aa.popover-spec.js.coffee +82 -0
- data/spec/javascripts/coffeescripts/jquery.aa.table-checkbox-toggler-spec.js.coffee +34 -0
- data/spec/javascripts/compiled/jquery.aa.checkbox-toggler-spec.js +60 -0
- data/spec/javascripts/compiled/jquery.aa.popover-spec.js +106 -0
- data/spec/javascripts/compiled/jquery.aa.table-checkbox-toggler-spec.js +37 -0
- data/spec/javascripts/fixtures/checkboxes.html +9 -0
- data/spec/javascripts/fixtures/table_checkboxes.html +17 -0
- data/spec/javascripts/helpers/SpecHelper.js +3 -0
- data/spec/javascripts/helpers/vendor/jasmine-fixture-0.0.5.js +108 -0
- data/spec/javascripts/helpers/vendor/jasmine-jquery.js +288 -0
- data/spec/javascripts/helpers/vendor/sinon-1.2.0.js +2915 -0
- data/spec/javascripts/support/jasmine.yml +74 -0
- data/spec/javascripts/support/jasmine_config.rb +23 -0
- data/spec/javascripts/support/jasmine_runner.rb +32 -0
- data/spec/javascripts/support/jquery-ui-1.8.16.custom.min.js +34 -0
- data/spec/javascripts/support/jquery.min.js +4 -0
- data/spec/spec_helper.rb +182 -0
- data/spec/spec_helper_without_rails.rb +16 -0
- data/spec/support/deferred_garbage_collection.rb +19 -0
- data/spec/support/detect_rails_version.rb +42 -0
- data/spec/support/integration_example_group.rb +31 -0
- data/spec/support/jslint.yml +80 -0
- data/spec/support/rails_template.rb +117 -0
- data/spec/support/rails_template_with_data.rb +59 -0
- data/spec/support/templates/admin/stores.rb +11 -0
- data/spec/support/templates/cucumber.rb +24 -0
- data/spec/support/templates/cucumber_with_reloading.rb +5 -0
- data/spec/support/templates/en.yml +8 -0
- data/spec/support/templates/policies/active_admin/comment_policy.rb +9 -0
- data/spec/support/templates/policies/active_admin/page_policy.rb +18 -0
- data/spec/support/templates/policies/admin_user_policy.rb +11 -0
- data/spec/support/templates/policies/application_policy.rb +45 -0
- data/spec/support/templates/policies/category_policy.rb +7 -0
- data/spec/support/templates/policies/post_policy.rb +15 -0
- data/spec/support/templates/policies/store_policy.rb +11 -0
- data/spec/support/templates/policies/user_policy.rb +11 -0
- data/spec/support/templates/post_decorator.rb +11 -0
- data/spec/unit/abstract_view_factory_spec.rb +79 -0
- data/spec/unit/action_builder_spec.rb +126 -0
- data/spec/unit/active_admin_spec.rb +11 -0
- data/spec/unit/application_spec.rb +140 -0
- data/spec/unit/asset_registration_spec.rb +52 -0
- data/spec/unit/authorization/authorization_adapter_spec.rb +61 -0
- data/spec/unit/authorization/controller_authorization_spec.rb +39 -0
- data/spec/unit/auto_link_spec.rb +34 -0
- data/spec/unit/batch_actions/resource_spec.rb +92 -0
- data/spec/unit/batch_actions/settings_spec.rb +61 -0
- data/spec/unit/belongs_to_spec.rb +42 -0
- data/spec/unit/cancan_adapter_spec.rb +43 -0
- data/spec/unit/comments_spec.rb +144 -0
- data/spec/unit/component_spec.rb +18 -0
- data/spec/unit/config_shared_examples.rb +59 -0
- data/spec/unit/controller_filters_spec.rb +37 -0
- data/spec/unit/csv_builder_spec.rb +134 -0
- data/spec/unit/devise_spec.rb +116 -0
- data/spec/unit/dsl_spec.rb +61 -0
- data/spec/unit/event_spec.rb +47 -0
- data/spec/unit/filters/filter_form_builder_spec.rb +418 -0
- data/spec/unit/filters/resource_spec.rb +121 -0
- data/spec/unit/form_builder_spec.rb +576 -0
- data/spec/unit/generators/install_spec.rb +23 -0
- data/spec/unit/helpers/collection_spec.rb +65 -0
- data/spec/unit/helpers/scope_chain_spec.rb +36 -0
- data/spec/unit/helpers/settings_spec.rb +30 -0
- data/spec/unit/menu_collection_spec.rb +62 -0
- data/spec/unit/menu_item_spec.rb +143 -0
- data/spec/unit/menu_spec.rb +71 -0
- data/spec/unit/namespace/authorization_spec.rb +27 -0
- data/spec/unit/namespace/register_page_spec.rb +74 -0
- data/spec/unit/namespace/register_resource_spec.rb +163 -0
- data/spec/unit/namespace_spec.rb +103 -0
- data/spec/unit/order_clause_spec.rb +57 -0
- data/spec/unit/page_controller_spec.rb +5 -0
- data/spec/unit/page_spec.rb +72 -0
- data/spec/unit/pretty_format_spec.rb +63 -0
- data/spec/unit/pundit_adapter_spec.rb +36 -0
- data/spec/unit/resource/action_items_spec.rb +62 -0
- data/spec/unit/resource/menu_spec.rb +18 -0
- data/spec/unit/resource/naming_spec.rb +122 -0
- data/spec/unit/resource/page_presenters_spec.rb +44 -0
- data/spec/unit/resource/pagination_spec.rb +38 -0
- data/spec/unit/resource/routes_spec.rb +73 -0
- data/spec/unit/resource/scopes_spec.rb +50 -0
- data/spec/unit/resource/sidebars_spec.rb +43 -0
- data/spec/unit/resource_collection_spec.rb +158 -0
- data/spec/unit/resource_controller/data_access_spec.rb +73 -0
- data/spec/unit/resource_controller/decorators_spec.rb +86 -0
- data/spec/unit/resource_controller/sidebars_spec.rb +46 -0
- data/spec/unit/resource_controller_spec.rb +265 -0
- data/spec/unit/resource_registration_spec.rb +56 -0
- data/spec/unit/resource_spec.rb +263 -0
- data/spec/unit/routing_spec.rb +172 -0
- data/spec/unit/scope_spec.rb +114 -0
- data/spec/unit/settings_spec.rb +88 -0
- data/spec/unit/view_factory_spec.rb +21 -0
- data/spec/unit/view_helpers/breadcrumbs_spec.rb +180 -0
- data/spec/unit/view_helpers/display_name_spec.rb +68 -0
- data/spec/unit/view_helpers/download_format_links_helper_spec.rb +39 -0
- data/spec/unit/view_helpers/fields_for_spec.rb +50 -0
- data/spec/unit/view_helpers/form_helper_spec.rb +42 -0
- data/spec/unit/view_helpers/method_or_proc_helper_spec.rb +97 -0
- data/spec/unit/views/components/action_list_popover_spec.rb +29 -0
- data/spec/unit/views/components/attributes_table_spec.rb +259 -0
- data/spec/unit/views/components/batch_action_popover_spec.rb +33 -0
- data/spec/unit/views/components/blank_slate_spec.rb +17 -0
- data/spec/unit/views/components/columns_spec.rb +172 -0
- data/spec/unit/views/components/index_list_spec.rb +32 -0
- data/spec/unit/views/components/paginated_collection_spec.rb +229 -0
- data/spec/unit/views/components/panel_spec.rb +51 -0
- data/spec/unit/views/components/popover_spec.rb +33 -0
- data/spec/unit/views/components/sidebar_section_spec.rb +47 -0
- data/spec/unit/views/components/site_title_spec.rb +78 -0
- data/spec/unit/views/components/status_tag_spec.rb +102 -0
- data/spec/unit/views/components/table_for_spec.rb +242 -0
- data/spec/unit/views/pages/form_spec.rb +35 -0
- data/spec/unit/views/pages/layout_spec.rb +63 -0
- data/spec/unit/views/pages/show_spec.rb +20 -0
- data/spec/unit/views/tabbed_navigation_spec.rb +149 -0
- data/tasks/docs.rake +37 -0
- data/tasks/js.rake +32 -0
- data/tasks/parallel_tests.rake +60 -0
- data/tasks/test.rake +79 -0
- data/tasks/yard.rake +7 -0
- metadata +741 -0
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
module ActiveAdmin
|
|
2
|
+
module Filters
|
|
3
|
+
|
|
4
|
+
class Disabled < RuntimeError
|
|
5
|
+
def initialize
|
|
6
|
+
super "Can't remove a filter when filters are disabled. Enable filters with 'config.filters = true'"
|
|
7
|
+
end
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
module ResourceExtension
|
|
11
|
+
|
|
12
|
+
def initialize(*)
|
|
13
|
+
super
|
|
14
|
+
add_filters_sidebar_section
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
# Returns the filters for this resource. If filters are not enabled,
|
|
18
|
+
# it will always return an empty array.
|
|
19
|
+
#
|
|
20
|
+
# @return [Hash] Filters that apply for this resource
|
|
21
|
+
def filters
|
|
22
|
+
filters_enabled? ? filter_lookup : {}
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
# Setter to enable / disable filters on this resource.
|
|
26
|
+
#
|
|
27
|
+
# Set to `nil` to inherit the setting from the namespace
|
|
28
|
+
def filters=(bool)
|
|
29
|
+
@filters_enabled = bool
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
# @return [Boolean] If filters are enabled for this resource
|
|
33
|
+
def filters_enabled?
|
|
34
|
+
@filters_enabled.nil? ? namespace.filters : @filters_enabled
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
def preserve_default_filters!
|
|
38
|
+
@preserve_default_filters = true
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
def preserve_default_filters?
|
|
42
|
+
@preserve_default_filters == true
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
# Remove a filter for this resource. If filters are not enabled, this method
|
|
46
|
+
# will raise a RuntimeError
|
|
47
|
+
#
|
|
48
|
+
# @param [Symbol] attribute The attribute to not filter on
|
|
49
|
+
def remove_filter(*attributes)
|
|
50
|
+
raise Disabled unless filters_enabled?
|
|
51
|
+
|
|
52
|
+
attributes.each { |attribute| (@filters_to_remove ||= []) << attribute.to_sym }
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
# Add a filter for this resource. If filters are not enabled, this method
|
|
56
|
+
# will raise a RuntimeError
|
|
57
|
+
#
|
|
58
|
+
# @param [Symbol] attribute The attribute to filter on
|
|
59
|
+
# @param [Hash] options The set of options that are passed through to
|
|
60
|
+
# ransack for the field definition.
|
|
61
|
+
def add_filter(attribute, options = {})
|
|
62
|
+
raise Disabled unless filters_enabled?
|
|
63
|
+
|
|
64
|
+
(@filters ||= {})[attribute.to_sym] = options
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
# Reset the filters to use defaults
|
|
68
|
+
def reset_filters!
|
|
69
|
+
@filters = nil
|
|
70
|
+
@filters_to_remove = nil
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
private
|
|
74
|
+
|
|
75
|
+
# Collapses the waveform, if you will, of which filters should be displayed.
|
|
76
|
+
# Removes filters and adds in default filters as desired.
|
|
77
|
+
def filter_lookup
|
|
78
|
+
filters = @filters.try(:dup) || {}
|
|
79
|
+
|
|
80
|
+
if filters.empty? || preserve_default_filters?
|
|
81
|
+
default_filters.each do |f|
|
|
82
|
+
filters[f] ||= {}
|
|
83
|
+
end
|
|
84
|
+
end
|
|
85
|
+
|
|
86
|
+
if @filters_to_remove
|
|
87
|
+
@filters_to_remove.each &filters.method(:delete)
|
|
88
|
+
end
|
|
89
|
+
|
|
90
|
+
filters
|
|
91
|
+
end
|
|
92
|
+
|
|
93
|
+
# @return [Array] The array of default filters for this resource
|
|
94
|
+
def default_filters
|
|
95
|
+
default_association_filters + default_content_filters
|
|
96
|
+
end
|
|
97
|
+
|
|
98
|
+
# Returns a default set of filters for the associations
|
|
99
|
+
def default_association_filters
|
|
100
|
+
if resource_class.respond_to?(:reflect_on_all_associations)
|
|
101
|
+
poly, not_poly = resource_class.reflect_on_all_associations.partition{ |r| r.macro == :belongs_to && r.options[:polymorphic] }
|
|
102
|
+
|
|
103
|
+
# remove deeply nested associations
|
|
104
|
+
not_poly.reject!{ |r| r.chain.length > 2 }
|
|
105
|
+
|
|
106
|
+
filters = poly.map(&:foreign_type) + not_poly.map(&:name)
|
|
107
|
+
filters.map &:to_sym
|
|
108
|
+
else
|
|
109
|
+
[]
|
|
110
|
+
end
|
|
111
|
+
end
|
|
112
|
+
|
|
113
|
+
# Returns a default set of filters for the content columns
|
|
114
|
+
def default_content_filters
|
|
115
|
+
if resource_class.respond_to? :content_columns
|
|
116
|
+
resource_class.content_columns.map{ |c| c.name.to_sym }
|
|
117
|
+
else
|
|
118
|
+
[]
|
|
119
|
+
end
|
|
120
|
+
end
|
|
121
|
+
|
|
122
|
+
def add_filters_sidebar_section
|
|
123
|
+
self.sidebar_sections << filters_sidebar_section
|
|
124
|
+
end
|
|
125
|
+
|
|
126
|
+
def filters_sidebar_section
|
|
127
|
+
ActiveAdmin::SidebarSection.new :filters, only: :index, if: ->{ active_admin_config.filters.any? } do
|
|
128
|
+
active_admin_filters_form_for assigns[:search], active_admin_config.filters
|
|
129
|
+
end
|
|
130
|
+
end
|
|
131
|
+
|
|
132
|
+
end
|
|
133
|
+
|
|
134
|
+
end
|
|
135
|
+
end
|
|
@@ -0,0 +1,185 @@
|
|
|
1
|
+
# Note for posterity:
|
|
2
|
+
#
|
|
3
|
+
# Here we have two core customizations on top of Formtastic. First, this allows
|
|
4
|
+
# you to build forms in the AA DSL without dealing with the HTML return value of
|
|
5
|
+
# individual form methods (hence the +form_buffers+ object). Second, this provides
|
|
6
|
+
# an intuitive way to build has_many associated records in the same form.
|
|
7
|
+
#
|
|
8
|
+
module ActiveAdmin
|
|
9
|
+
class FormBuilder < ::Formtastic::FormBuilder
|
|
10
|
+
|
|
11
|
+
attr_reader :form_buffers
|
|
12
|
+
|
|
13
|
+
def initialize(*args)
|
|
14
|
+
@form_buffers = ["".html_safe]
|
|
15
|
+
super
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
def inputs(*args, &block)
|
|
19
|
+
@use_form_buffer = block_given?
|
|
20
|
+
form_buffers.last << with_new_form_buffer{ super }
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
# If this `input` call is inside a `inputs` block, add the content
|
|
24
|
+
# to the form buffer. Else, return it directly.
|
|
25
|
+
def input(method, *args)
|
|
26
|
+
content = with_new_form_buffer{ super }
|
|
27
|
+
@use_form_buffer ? form_buffers.last << content : content
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
def cancel_link(url = {action: "index"}, html_options = {}, li_attrs = {})
|
|
31
|
+
li_attrs[:class] ||= "cancel"
|
|
32
|
+
li_content = template.link_to I18n.t('active_admin.cancel'), url, html_options
|
|
33
|
+
form_buffers.last << template.content_tag(:li, li_content, li_attrs)
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
def actions(*args, &block)
|
|
37
|
+
form_buffers.last << with_new_form_buffer do
|
|
38
|
+
block_given? ? super : super{ commit_action_with_cancel_link }
|
|
39
|
+
end
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
def action(*args)
|
|
43
|
+
form_buffers.last << with_new_form_buffer{ super }
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
def commit_action_with_cancel_link
|
|
47
|
+
action(:submit)
|
|
48
|
+
cancel_link
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
def has_many(assoc, options = {}, &block)
|
|
52
|
+
# remove options that should not render as attributes
|
|
53
|
+
custom_settings = :new_record, :allow_destroy, :heading, :sortable
|
|
54
|
+
builder_options = {new_record: true}.merge! options.slice *custom_settings
|
|
55
|
+
options = {for: assoc }.merge! options.except *custom_settings
|
|
56
|
+
options[:class] = [options[:class], "inputs has_many_fields"].compact.join(' ')
|
|
57
|
+
|
|
58
|
+
# Add Delete Links
|
|
59
|
+
form_block = proc do |has_many_form|
|
|
60
|
+
index = parent_child_index options[:parent] if options[:parent]
|
|
61
|
+
contents = block.call has_many_form, index
|
|
62
|
+
|
|
63
|
+
if has_many_form.object.new_record?
|
|
64
|
+
contents << template.content_tag(:li) do
|
|
65
|
+
template.link_to I18n.t('active_admin.has_many_remove'), "#", class: 'button has_many_remove'
|
|
66
|
+
end
|
|
67
|
+
elsif builder_options[:allow_destroy]
|
|
68
|
+
has_many_form.input :_destroy, as: :boolean, wrapper_html: {class: 'has_many_delete'},
|
|
69
|
+
label: I18n.t('active_admin.has_many_delete')
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
if builder_options[:sortable]
|
|
73
|
+
has_many_form.input builder_options[:sortable], as: :hidden
|
|
74
|
+
|
|
75
|
+
contents << template.content_tag(:li, class: 'handle') do
|
|
76
|
+
Iconic.icon :move_vertical
|
|
77
|
+
end
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
contents
|
|
81
|
+
end
|
|
82
|
+
|
|
83
|
+
# make sure that the sortable children sorted in stable ascending order
|
|
84
|
+
if column = builder_options[:sortable]
|
|
85
|
+
children = object.send(assoc)
|
|
86
|
+
children = children.sort_by {|o| [o.send(column), o.id]}
|
|
87
|
+
options[:for] = [assoc, children]
|
|
88
|
+
end
|
|
89
|
+
|
|
90
|
+
html = without_wrapper do
|
|
91
|
+
unless builder_options.key?(:heading) && !builder_options[:heading]
|
|
92
|
+
form_buffers.last << template.content_tag(:h3) do
|
|
93
|
+
builder_options[:heading] || object.class.reflect_on_association(assoc).klass.model_name.human(count: ::ActiveAdmin::Helpers::I18n::PLURAL_MANY_COUNT)
|
|
94
|
+
end
|
|
95
|
+
end
|
|
96
|
+
|
|
97
|
+
inputs options, &form_block
|
|
98
|
+
|
|
99
|
+
form_buffers.last << js_for_has_many(assoc, form_block, template, builder_options[:new_record], options[:class]) if builder_options[:new_record]
|
|
100
|
+
form_buffers.last
|
|
101
|
+
end
|
|
102
|
+
|
|
103
|
+
form_buffers.last << if @already_in_an_inputs_block
|
|
104
|
+
template.content_tag :li, html, class: "has_many_container #{assoc}", 'data-sortable' => builder_options[:sortable]
|
|
105
|
+
else
|
|
106
|
+
template.content_tag :div, html, class: "has_many_container #{assoc}", 'data-sortable' => builder_options[:sortable]
|
|
107
|
+
end
|
|
108
|
+
end
|
|
109
|
+
|
|
110
|
+
def semantic_errors(*args)
|
|
111
|
+
form_buffers.last << with_new_form_buffer{ super }
|
|
112
|
+
end
|
|
113
|
+
|
|
114
|
+
protected
|
|
115
|
+
|
|
116
|
+
def active_admin_input_class_name(as)
|
|
117
|
+
"ActiveAdmin::Inputs::#{as.to_s.camelize}Input"
|
|
118
|
+
end
|
|
119
|
+
|
|
120
|
+
def input_class(as)
|
|
121
|
+
@input_classes_cache ||= {}
|
|
122
|
+
@input_classes_cache[as] ||= begin
|
|
123
|
+
begin
|
|
124
|
+
custom_input_class_name(as).constantize
|
|
125
|
+
rescue NameError
|
|
126
|
+
begin
|
|
127
|
+
active_admin_input_class_name(as).constantize
|
|
128
|
+
rescue NameError
|
|
129
|
+
standard_input_class_name(as).constantize
|
|
130
|
+
end
|
|
131
|
+
end
|
|
132
|
+
rescue NameError
|
|
133
|
+
raise Formtastic::UnknownInputError, "Unable to find input class for #{as}"
|
|
134
|
+
end
|
|
135
|
+
end
|
|
136
|
+
|
|
137
|
+
# This method calls the block it's passed (in our case, the `f.inputs` block)
|
|
138
|
+
# and wraps the resulting HTML in a fieldset. If your block doesn't have a
|
|
139
|
+
# valid return value but it was otherwise built correctly, we instead use
|
|
140
|
+
# the most recent part of the Active Admin form buffer.
|
|
141
|
+
def field_set_and_list_wrapping(*args, &block)
|
|
142
|
+
block_given? ? super{
|
|
143
|
+
(val = yield).is_a?(String) ? val : form_buffers.last
|
|
144
|
+
} : super
|
|
145
|
+
end
|
|
146
|
+
|
|
147
|
+
private
|
|
148
|
+
|
|
149
|
+
def with_new_form_buffer
|
|
150
|
+
form_buffers << ''.html_safe
|
|
151
|
+
return_value = (yield || '').html_safe
|
|
152
|
+
form_buffers.pop
|
|
153
|
+
return_value
|
|
154
|
+
end
|
|
155
|
+
|
|
156
|
+
def without_wrapper
|
|
157
|
+
is_being_wrapped = @already_in_an_inputs_block
|
|
158
|
+
@already_in_an_inputs_block = false
|
|
159
|
+
|
|
160
|
+
html = with_new_form_buffer{ yield }
|
|
161
|
+
|
|
162
|
+
@already_in_an_inputs_block = is_being_wrapped
|
|
163
|
+
html
|
|
164
|
+
end
|
|
165
|
+
|
|
166
|
+
# Capture the ADD JS
|
|
167
|
+
def js_for_has_many(assoc, form_block, template, new_record, class_string)
|
|
168
|
+
assoc_reflection = object.class.reflect_on_association assoc
|
|
169
|
+
assoc_name = assoc_reflection.klass.model_name
|
|
170
|
+
placeholder = "NEW_#{assoc_name.to_s.upcase.split(' ').join('_')}_RECORD"
|
|
171
|
+
opts = {
|
|
172
|
+
for: [assoc, assoc_reflection.klass.new],
|
|
173
|
+
class: class_string,
|
|
174
|
+
for_options: { child_index: placeholder }
|
|
175
|
+
}
|
|
176
|
+
html = with_new_form_buffer{ inputs_for_nested_attributes opts, &form_block }
|
|
177
|
+
text = new_record.is_a?(String) ? new_record : I18n.t('active_admin.has_many_new', model: assoc_name.human)
|
|
178
|
+
|
|
179
|
+
template.link_to text, '#', class: "button has_many_add", data: {
|
|
180
|
+
html: CGI.escapeHTML(html).html_safe, placeholder: placeholder
|
|
181
|
+
}
|
|
182
|
+
end
|
|
183
|
+
|
|
184
|
+
end
|
|
185
|
+
end
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
module ActiveAdmin
|
|
2
|
+
module Helpers
|
|
3
|
+
module Collection
|
|
4
|
+
# Works around this issue: https://github.com/rails/rails/issues/7121
|
|
5
|
+
#
|
|
6
|
+
# GROUP BY + COUNT drops SELECT statement. This leads to SQL error when
|
|
7
|
+
# the ORDER statement mentions a column defined in the SELECT statement.
|
|
8
|
+
#
|
|
9
|
+
# We remove the ORDER statement to work around this issue.
|
|
10
|
+
def collection_size(collection=collection)
|
|
11
|
+
if collection.group_values.present?
|
|
12
|
+
collection.reorder("").count # is a Hash
|
|
13
|
+
else
|
|
14
|
+
collection
|
|
15
|
+
end.count
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
def collection_is_empty?(collection=collection)
|
|
19
|
+
collection_size(collection) == 0
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
end
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
module ActiveAdmin
|
|
2
|
+
|
|
3
|
+
# Shareable module to give a #display_on?(action) method
|
|
4
|
+
# which returns true or false depending on an options hash.
|
|
5
|
+
#
|
|
6
|
+
# The options hash accepts:
|
|
7
|
+
#
|
|
8
|
+
# only: :index
|
|
9
|
+
# only: [:index, :show]
|
|
10
|
+
# except: :index
|
|
11
|
+
# except: [:index, :show]
|
|
12
|
+
#
|
|
13
|
+
# call #normalize_display_options! after @options has been set
|
|
14
|
+
# to ensure that the display options are setup correctly
|
|
15
|
+
|
|
16
|
+
module OptionalDisplay
|
|
17
|
+
def display_on?(action, render_context = self)
|
|
18
|
+
return false if @options[:only] && !@options[:only].include?(action.to_sym)
|
|
19
|
+
return false if @options[:except] && @options[:except].include?(action.to_sym)
|
|
20
|
+
|
|
21
|
+
case condition = @options[:if]
|
|
22
|
+
when Symbol, String
|
|
23
|
+
render_context.send condition
|
|
24
|
+
when Proc
|
|
25
|
+
render_context.instance_exec &condition
|
|
26
|
+
else
|
|
27
|
+
true
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
private
|
|
32
|
+
|
|
33
|
+
def normalize_display_options!
|
|
34
|
+
@options[:only] = Array(@options[:only]) if @options[:only]
|
|
35
|
+
@options[:except] = Array(@options[:except]) if @options[:except]
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
end
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
module ActiveAdmin
|
|
2
|
+
module ScopeChain
|
|
3
|
+
# Scope an ActiveRecord::Relation chain
|
|
4
|
+
#
|
|
5
|
+
# Example:
|
|
6
|
+
# scope_chain(Scope.new(:published), Article)
|
|
7
|
+
# # => Article.published
|
|
8
|
+
#
|
|
9
|
+
# @param scope The <ActiveAdmin::Scope> we want to scope on
|
|
10
|
+
# @param chain The ActiveRecord::Relation chain or ActiveRecord::Base class to scope
|
|
11
|
+
# @return <ActiveRecord::Relation or ActiveRecord::Base> The scoped relation chain
|
|
12
|
+
#
|
|
13
|
+
def scope_chain(scope, chain)
|
|
14
|
+
if scope.scope_method
|
|
15
|
+
chain.send(scope.scope_method)
|
|
16
|
+
elsif scope.scope_block
|
|
17
|
+
instance_exec chain, &scope.scope_block
|
|
18
|
+
else
|
|
19
|
+
chain
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
end
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
module ActiveAdmin
|
|
2
|
+
|
|
3
|
+
# Adds a class method to a class to create settings with default values.
|
|
4
|
+
#
|
|
5
|
+
# Example:
|
|
6
|
+
#
|
|
7
|
+
# class Configuration
|
|
8
|
+
# include ActiveAdmin::Settings
|
|
9
|
+
#
|
|
10
|
+
# setting :site_title, "Default Site Title"
|
|
11
|
+
# end
|
|
12
|
+
#
|
|
13
|
+
# conf = Configuration.new
|
|
14
|
+
# conf.site_title #=> "Default Site Title"
|
|
15
|
+
# conf.site_title = "Override Default"
|
|
16
|
+
# conf.site_title #=> "Override Default"
|
|
17
|
+
#
|
|
18
|
+
module Settings
|
|
19
|
+
|
|
20
|
+
def self.included(base)
|
|
21
|
+
base.extend ClassMethods
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
def read_default_setting(name)
|
|
25
|
+
default_settings[name]
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
private
|
|
29
|
+
|
|
30
|
+
def default_settings
|
|
31
|
+
self.class.default_settings
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
module ClassMethods
|
|
35
|
+
|
|
36
|
+
def setting(name, default)
|
|
37
|
+
default_settings[name] = default
|
|
38
|
+
attr_writer name
|
|
39
|
+
|
|
40
|
+
# Create an accessor that looks up the default value if none is set.
|
|
41
|
+
define_method name do
|
|
42
|
+
if instance_variable_defined? "@#{name}"
|
|
43
|
+
instance_variable_get "@#{name}"
|
|
44
|
+
else
|
|
45
|
+
read_default_setting name.to_sym
|
|
46
|
+
end
|
|
47
|
+
end
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
def deprecated_setting(name, default, message = nil)
|
|
51
|
+
setting(name, default)
|
|
52
|
+
|
|
53
|
+
message ||= "The #{name} setting is deprecated and will be removed."
|
|
54
|
+
ActiveAdmin::Deprecation.deprecate self, name, message
|
|
55
|
+
ActiveAdmin::Deprecation.deprecate self, :"#{name}=", message
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
def default_settings
|
|
59
|
+
@default_settings ||= {}
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
|
|
65
|
+
# Allows you to define child classes that should receive the same
|
|
66
|
+
# settings, as well as the same default values.
|
|
67
|
+
#
|
|
68
|
+
# Example from the codebase:
|
|
69
|
+
#
|
|
70
|
+
# class Application
|
|
71
|
+
# include Settings
|
|
72
|
+
# include Settings::Inheritance
|
|
73
|
+
#
|
|
74
|
+
# settings_inherited_by :Namespace
|
|
75
|
+
#
|
|
76
|
+
# inheritable_setting :root_to, 'dashboard#index'
|
|
77
|
+
# end
|
|
78
|
+
#
|
|
79
|
+
module Inheritance
|
|
80
|
+
|
|
81
|
+
def self.included(base)
|
|
82
|
+
base.extend ClassMethods
|
|
83
|
+
end
|
|
84
|
+
|
|
85
|
+
module ClassMethods
|
|
86
|
+
|
|
87
|
+
def settings_inherited_by(heir)
|
|
88
|
+
(@setting_heirs ||= []) << heir
|
|
89
|
+
heir.send :include, ActiveAdmin::Settings
|
|
90
|
+
end
|
|
91
|
+
|
|
92
|
+
def inheritable_setting(name, default)
|
|
93
|
+
setting name, default
|
|
94
|
+
@setting_heirs.each{ |c| c.setting name, default }
|
|
95
|
+
end
|
|
96
|
+
|
|
97
|
+
def deprecated_inheritable_setting(name, default)
|
|
98
|
+
deprecated_setting name, default
|
|
99
|
+
@setting_heirs.each{ |c| c.deprecated_setting name, default }
|
|
100
|
+
end
|
|
101
|
+
|
|
102
|
+
end
|
|
103
|
+
end
|
|
104
|
+
|
|
105
|
+
end
|
|
106
|
+
end
|