activeadmin 0.6.6 → 1.0.0.pre1
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of activeadmin might be problematic. Click here for more details.
- checksums.yaml +4 -4
- data/.gitignore +11 -8
- data/.hound.yml +11 -0
- data/.travis.yml +36 -10
- data/.yardopts +2 -1
- data/CHANGELOG.md +118 -67
- data/CONTRIBUTING.md +96 -73
- data/Gemfile +35 -35
- data/Guardfile +1 -0
- data/LICENSE +1 -1
- data/README.md +98 -0
- data/Rakefile +12 -4
- data/activeadmin.gemspec +21 -24
- data/app/assets/javascripts/active_admin/application.js.coffee +32 -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/{components/jquery.aa.checkbox-toggler.js.coffee → lib/checkbox-toggler.js.coffee} +3 -4
- data/app/assets/javascripts/active_admin/lib/dropdown-menu.js.coffee +101 -0
- data/app/assets/javascripts/active_admin/lib/flash.js.coffee +19 -0
- data/app/assets/javascripts/active_admin/lib/has_many.js.coffee +79 -0
- data/app/assets/javascripts/active_admin/lib/modal_dialog.js.coffee +37 -0
- data/app/assets/javascripts/active_admin/lib/per_page.js.coffee +27 -0
- data/app/assets/javascripts/active_admin/lib/popover.js.coffee +68 -0
- data/app/assets/javascripts/active_admin/{components/jquery.aa.table-checkbox-toggler.js.coffee → lib/table-checkbox-toggler.js.coffee} +2 -3
- data/app/assets/stylesheets/active_admin/{_base.css.scss → _base.scss} +3 -0
- data/app/assets/stylesheets/active_admin/{_forms.css.scss → _forms.scss} +61 -17
- data/app/assets/stylesheets/active_admin/{_header.css.scss → _header.scss} +9 -5
- data/app/assets/stylesheets/active_admin/{_mixins.css.scss → _mixins.scss} +0 -0
- data/app/assets/stylesheets/active_admin/{_typography.css.scss → _typography.scss} +0 -0
- data/app/assets/stylesheets/active_admin/components/_batch_actions.scss +11 -0
- data/app/assets/stylesheets/active_admin/components/_blank_slates.scss +0 -1
- data/app/assets/stylesheets/active_admin/components/_buttons.scss +1 -1
- data/app/assets/stylesheets/active_admin/components/{_comments.css.scss → _comments.scss} +0 -0
- data/app/assets/stylesheets/active_admin/components/{_date_picker.css.scss → _date_picker.scss} +40 -14
- data/app/assets/stylesheets/active_admin/components/_dropdown_menu.scss +5 -4
- data/app/assets/stylesheets/active_admin/components/_flash_messages.scss +37 -0
- data/app/assets/stylesheets/active_admin/components/_modal_dialog.scss +34 -0
- data/app/assets/stylesheets/active_admin/components/_pagination.scss +10 -0
- data/app/assets/stylesheets/active_admin/components/{_popovers.css.scss → _popovers.scss} +2 -3
- data/app/assets/stylesheets/active_admin/components/_status_tags.scss +4 -0
- data/app/assets/stylesheets/active_admin/components/_table_tools.scss +67 -0
- data/app/assets/stylesheets/active_admin/components/{_tables.css.scss → _tables.scss} +4 -2
- 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.css.scss → _all.scss} +0 -0
- data/app/assets/stylesheets/active_admin/mixins/{_buttons.css.scss → _buttons.scss} +0 -1
- data/app/assets/stylesheets/active_admin/mixins/_gradients.scss +28 -0
- data/app/assets/stylesheets/active_admin/mixins/{_icons.css.scss → _icons.scss} +1 -2
- data/app/assets/stylesheets/active_admin/mixins/{_reset.css.scss → _reset.scss} +0 -0
- data/app/assets/stylesheets/active_admin/mixins/_rounded.scss +22 -0
- data/app/assets/stylesheets/active_admin/mixins/{_sections.css.scss → _sections.scss} +8 -2
- data/app/assets/stylesheets/active_admin/mixins/{_shadows.css.scss → _shadows.scss} +0 -7
- data/app/assets/stylesheets/active_admin/mixins/_utilities.scss +0 -9
- data/app/assets/stylesheets/active_admin/mixins/{_variables.css.scss → _variables.scss} +10 -8
- data/app/assets/stylesheets/active_admin/{print.css.scss → print.scss} +4 -0
- data/app/assets/stylesheets/active_admin/structure/_main_structure.scss +5 -2
- data/app/assets/stylesheets/active_admin/structure/_title_bar.scss +11 -9
- data/app/views/active_admin/devise/confirmations/new.html.erb +15 -0
- data/app/views/active_admin/devise/mailer/reset_password_instructions.html.erb +1 -1
- data/app/views/active_admin/devise/mailer/unlock_instructions.html.erb +1 -1
- data/app/views/active_admin/devise/passwords/edit.html.erb +9 -10
- data/app/views/active_admin/devise/passwords/new.html.erb +5 -4
- data/app/views/active_admin/devise/registrations/new.html.erb +22 -0
- data/app/views/active_admin/devise/sessions/new.html.erb +9 -7
- data/app/views/active_admin/devise/shared/_links.erb +1 -1
- data/app/views/active_admin/devise/unlocks/new.html.erb +5 -4
- data/app/views/layouts/active_admin_logged_out.html.erb +3 -5
- data/config/locales/ar.yml +120 -0
- data/config/locales/bg.yml +26 -6
- data/config/locales/bs.yml +122 -0
- data/config/locales/ca.yml +10 -1
- data/config/locales/cs.yml +7 -2
- data/config/locales/da.yml +7 -3
- data/config/locales/de-CH.yml +14 -31
- data/config/locales/de.yml +33 -33
- data/config/locales/el.yml +28 -2
- data/config/locales/en-GB.yml +12 -4
- data/config/locales/en.yml +29 -3
- data/config/locales/{es_MX.yml → es-MX.yml} +9 -24
- data/config/locales/es.yml +32 -25
- data/config/locales/fa.yml +120 -0
- data/config/locales/fi.yml +113 -0
- data/config/locales/fr.yml +21 -11
- data/config/locales/he.yml +7 -3
- data/config/locales/hr.yml +42 -11
- data/config/locales/hu.yml +10 -3
- data/config/locales/it.yml +31 -3
- data/config/locales/ja.yml +8 -3
- data/config/locales/ko.yml +7 -1
- data/config/locales/lt.yml +42 -11
- data/config/locales/lv.yml +7 -3
- data/config/locales/{no-NB.yml → nb.yml} +46 -15
- data/config/locales/nl.yml +36 -5
- data/config/locales/pl.yml +13 -8
- data/config/locales/pt-BR.yml +37 -5
- data/config/locales/pt-PT.yml +8 -4
- data/config/locales/ro.yml +7 -3
- data/config/locales/ru.yml +26 -5
- data/config/locales/sv-SE.yml +9 -5
- data/config/locales/tr.yml +10 -3
- data/config/locales/uk.yml +36 -12
- data/config/locales/vi.yml +7 -3
- data/config/locales/zh-CN.yml +26 -10
- data/config/locales/zh-TW.yml +19 -13
- data/docs/0-installation.md +65 -29
- data/docs/1-general-configuration.md +92 -81
- data/docs/10-custom-pages.md +68 -68
- data/docs/11-decorators.md +48 -59
- data/docs/12-arbre-components.md +80 -74
- data/docs/13-authorization-adapter.md +128 -107
- data/docs/14-gotchas.md +92 -0
- data/docs/2-resource-customization.md +293 -178
- data/docs/3-index-pages.md +160 -86
- data/docs/3-index-pages/custom-index.md +31 -0
- data/docs/3-index-pages/index-as-block.md +14 -9
- data/docs/3-index-pages/index-as-blog.md +41 -31
- data/docs/3-index-pages/index-as-grid.md +16 -8
- data/docs/3-index-pages/index-as-table.md +129 -52
- data/docs/4-csv-format.md +31 -24
- data/docs/5-forms.md +133 -56
- data/docs/6-show-pages.md +89 -27
- data/docs/7-sidebars.md +48 -27
- data/docs/8-custom-actions.md +98 -77
- data/docs/9-batch-actions.md +210 -146
- data/docs/README.md +24 -0
- data/features/action_item.feature +3 -3
- data/features/authorization_pundit.feature +37 -0
- data/features/breadcrumb.feature +48 -0
- data/features/comments/commenting.feature +56 -13
- data/features/development_reloading.feature +17 -30
- data/features/edit_page.feature +12 -1
- data/features/favicon.feature +3 -3
- data/features/i18n.feature +5 -4
- data/features/index/batch_actions.feature +41 -0
- data/features/index/filters.feature +67 -0
- data/features/index/format_as_csv.feature +90 -4
- data/features/index/formats.feature +27 -0
- data/features/index/index_as_blog.feature +4 -4
- data/features/index/index_as_table.feature +102 -6
- data/features/index/index_blank_slate.feature +22 -0
- data/features/index/index_scope_to.feature +16 -16
- data/features/index/page_title.feature +11 -0
- data/features/index/pagination.feature +1 -1
- data/features/index/switch_index_view.feature +14 -14
- data/features/new_page.feature +13 -2
- data/features/registering_pages.feature +1 -1
- data/features/renamed_resource.feature +32 -0
- data/features/show/page_title.feature +11 -0
- data/features/show/tabs.feature +27 -0
- data/features/sidebar_sections.feature +12 -0
- data/features/site_title.feature +2 -2
- data/features/specifying_actions.feature +3 -3
- data/features/step_definitions/action_item_steps.rb +2 -2
- data/features/step_definitions/action_link_steps.rb +14 -1
- data/features/step_definitions/additional_web_steps.rb +19 -20
- data/features/step_definitions/asset_steps.rb +3 -3
- data/features/step_definitions/attribute_steps.rb +8 -3
- data/features/step_definitions/batch_action_steps.rb +26 -9
- data/features/step_definitions/blog_steps.rb +3 -0
- data/features/step_definitions/breadcrumb_steps.rb +1 -1
- data/features/step_definitions/comment_steps.rb +1 -1
- data/features/step_definitions/configuration_steps.rb +9 -2
- data/features/step_definitions/dashboard_steps.rb +2 -2
- data/features/step_definitions/factory_steps.rb +9 -8
- data/features/step_definitions/filter_steps.rb +25 -3
- data/features/step_definitions/flash_steps.rb +3 -3
- data/features/step_definitions/format_steps.rb +18 -18
- data/features/step_definitions/index_scope_steps.rb +5 -5
- data/features/step_definitions/layout_steps.rb +1 -1
- data/features/step_definitions/member_link_steps.rb +2 -2
- data/features/step_definitions/menu_steps.rb +3 -3
- data/features/step_definitions/pagination_steps.rb +2 -3
- data/features/step_definitions/sidebar_steps.rb +8 -3
- data/features/step_definitions/site_title_steps.rb +6 -4
- data/features/step_definitions/symbol_leak_steps.rb +3 -0
- data/features/step_definitions/tab_steps.rb +5 -0
- data/features/step_definitions/table_steps.rb +4 -4
- data/features/step_definitions/user_steps.rb +10 -7
- data/features/step_definitions/web_steps.rb +14 -11
- data/features/sti_resource.feature +6 -2
- data/features/strong_parameters.feature +73 -0
- data/features/support/env.rb +34 -9
- data/features/support/paths.rb +14 -6
- data/features/support/selectors.rb +1 -1
- data/features/symbol_leak.feature +35 -0
- data/features/users/resetting_password.feature +5 -6
- data/lib/active_admin.rb +26 -25
- data/lib/active_admin/abstract_view_factory.rb +7 -17
- data/lib/active_admin/application.rb +72 -59
- data/lib/active_admin/asset_registration.rb +2 -2
- data/lib/active_admin/authorization_adapter.rb +2 -2
- data/lib/active_admin/base_controller.rb +2 -3
- data/lib/active_admin/base_controller/authorization.rb +13 -31
- data/lib/active_admin/batch_actions.rb +1 -1
- data/lib/active_admin/batch_actions/controller.rb +24 -8
- data/lib/active_admin/batch_actions/resource_extension.rb +47 -18
- data/lib/active_admin/batch_actions/views/batch_action_form.rb +7 -4
- data/lib/active_admin/batch_actions/views/batch_action_popover.rb +3 -3
- data/lib/active_admin/batch_actions/views/batch_action_selector.rb +8 -17
- data/lib/active_admin/batch_actions/views/selection_cells.rb +4 -4
- data/lib/active_admin/callbacks.rb +25 -24
- data/lib/active_admin/cancan_adapter.rb +7 -11
- data/lib/active_admin/csv_builder.rb +92 -15
- data/lib/active_admin/dependency.rb +93 -0
- data/lib/active_admin/deprecation.rb +6 -7
- data/lib/active_admin/devise.rb +28 -18
- data/lib/active_admin/dsl.rb +18 -11
- data/lib/active_admin/engine.rb +10 -8
- data/lib/active_admin/error.rb +62 -0
- data/lib/active_admin/filters/dsl.rb +2 -2
- data/lib/active_admin/filters/forms.rb +17 -27
- data/lib/active_admin/filters/formtastic_addons.rb +49 -15
- data/lib/active_admin/filters/resource_extension.rb +43 -34
- data/lib/active_admin/form_builder.rb +93 -154
- data/lib/active_admin/helpers/collection.rb +7 -13
- data/lib/active_admin/helpers/i18n.rb +7 -0
- data/lib/active_admin/helpers/optional_display.rb +5 -5
- data/lib/active_admin/helpers/routes/url_helpers.rb +15 -0
- data/lib/active_admin/helpers/scope_chain.rb +1 -1
- data/lib/active_admin/helpers/settings.rb +16 -9
- data/lib/active_admin/iconic.rb +17 -15
- data/lib/active_admin/iconic/icons.rb +136 -136
- data/lib/active_admin/inputs.rb +11 -7
- data/lib/active_admin/inputs/datepicker_input.rb +12 -3
- data/lib/active_admin/inputs/filters/base.rb +42 -0
- data/lib/active_admin/inputs/filters/base/search_method_select.rb +75 -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_range_input.rb +36 -0
- data/lib/active_admin/inputs/filters/numeric_input.rb +12 -0
- data/lib/active_admin/inputs/filters/select_input.rb +54 -0
- data/lib/active_admin/inputs/filters/string_input.rb +26 -0
- data/lib/active_admin/menu.rb +6 -4
- data/lib/active_admin/menu_collection.rb +1 -4
- data/lib/active_admin/namespace.rb +55 -29
- data/lib/active_admin/order_clause.rb +26 -0
- data/lib/active_admin/orm/active_record.rb +5 -0
- data/lib/active_admin/orm/active_record/comments.rb +81 -0
- data/lib/active_admin/orm/active_record/comments/comment.rb +45 -0
- data/lib/active_admin/{comments → orm/active_record/comments}/namespace_helper.rb +2 -2
- data/lib/active_admin/{comments → orm/active_record/comments}/resource_helper.rb +1 -1
- data/lib/active_admin/{comments → orm/active_record/comments}/show_page_helper.rb +0 -0
- data/lib/active_admin/orm/active_record/comments/views.rb +2 -0
- data/lib/active_admin/{comments → orm/active_record/comments}/views/active_admin_comments.rb +16 -14
- data/lib/active_admin/orm/mongoid.rb +1 -0
- data/lib/active_admin/orm/mongoid/.gitkeep +0 -0
- data/lib/active_admin/page.rb +7 -3
- data/lib/active_admin/page_dsl.rb +1 -1
- data/lib/active_admin/page_presenter.rb +2 -2
- data/lib/active_admin/pundit_adapter.rb +68 -0
- data/lib/active_admin/resource.rb +16 -17
- data/lib/active_admin/resource/action_items.rb +23 -18
- data/lib/active_admin/resource/belongs_to.rb +7 -3
- data/lib/active_admin/resource/controllers.rb +1 -0
- data/lib/active_admin/resource/includes.rb +12 -0
- data/lib/active_admin/resource/menu.rb +5 -5
- data/lib/active_admin/resource/naming.rb +27 -43
- data/lib/active_admin/resource/page_presenters.rb +1 -1
- data/lib/active_admin/resource/routes.rb +27 -11
- data/lib/active_admin/resource/scope_to.rb +7 -7
- data/lib/active_admin/resource/sidebars.rb +1 -0
- data/lib/active_admin/resource_controller.rb +6 -7
- data/lib/active_admin/resource_controller/data_access.rb +101 -93
- data/lib/active_admin/resource_controller/decorators.rb +91 -9
- data/lib/active_admin/resource_controller/streaming.rb +37 -0
- data/lib/active_admin/resource_dsl.rb +53 -10
- data/lib/active_admin/router.rb +7 -7
- data/lib/active_admin/scope.rb +6 -6
- data/lib/active_admin/sidebar_section.rb +10 -2
- data/lib/active_admin/version.rb +1 -1
- data/lib/active_admin/view_factory.rb +17 -17
- data/lib/active_admin/view_helpers.rb +0 -1
- data/lib/active_admin/view_helpers/auto_link_helper.rb +23 -12
- data/lib/active_admin/view_helpers/breadcrumb_helper.rb +4 -3
- data/lib/active_admin/view_helpers/display_helper.rb +30 -15
- data/lib/active_admin/view_helpers/download_format_links_helper.rb +21 -25
- data/lib/active_admin/view_helpers/fields_for.rb +4 -4
- data/lib/active_admin/view_helpers/flash_helper.rb +4 -3
- data/lib/active_admin/view_helpers/form_helper.rb +5 -9
- data/lib/active_admin/view_helpers/method_or_proc_helper.rb +6 -6
- data/lib/active_admin/views/action_items.rb +2 -2
- data/lib/active_admin/views/components/action_list_popover.rb +1 -1
- data/lib/active_admin/views/components/active_admin_form.rb +123 -0
- data/lib/active_admin/views/components/attributes_table.rb +63 -21
- data/lib/active_admin/views/components/blank_slate.rb +1 -1
- data/lib/active_admin/views/components/columns.rb +13 -7
- data/lib/active_admin/views/components/dropdown_menu.rb +6 -6
- data/lib/active_admin/views/components/index_list.rb +7 -7
- data/lib/active_admin/views/components/paginated_collection.rb +38 -20
- data/lib/active_admin/views/components/panel.rb +8 -2
- data/lib/active_admin/views/components/popover.rb +1 -1
- data/lib/active_admin/views/components/scopes.rb +5 -4
- data/lib/active_admin/views/components/sidebar_section.rb +3 -2
- data/lib/active_admin/views/components/site_title.rb +2 -2
- data/lib/active_admin/views/components/status_tag.rb +34 -11
- data/lib/active_admin/views/components/table_for.rb +90 -45
- data/lib/active_admin/views/components/tabs.rb +28 -0
- data/lib/active_admin/views/components/unsupported_browser.rb +11 -0
- data/lib/active_admin/views/footer.rb +3 -3
- data/lib/active_admin/views/header.rb +3 -3
- data/lib/active_admin/views/index_as_block.rb +10 -10
- data/lib/active_admin/views/index_as_blog.rb +45 -39
- data/lib/active_admin/views/index_as_grid.rb +14 -10
- data/lib/active_admin/views/index_as_table.rb +242 -129
- data/lib/active_admin/views/pages/base.rb +22 -18
- data/lib/active_admin/views/pages/form.rb +21 -11
- data/lib/active_admin/views/pages/index.rb +40 -35
- data/lib/active_admin/views/pages/layout.rb +1 -1
- data/lib/active_admin/views/pages/show.rb +4 -4
- data/lib/active_admin/views/tabbed_navigation.rb +7 -3
- data/lib/active_admin/views/title_bar.rb +10 -8
- data/lib/generators/active_admin/assets/assets_generator.rb +3 -28
- data/lib/generators/active_admin/assets/templates/{3.1/active_admin.css.scss → active_admin.css.scss} +0 -0
- data/lib/generators/active_admin/assets/templates/active_admin.js.coffee +1 -0
- data/lib/generators/active_admin/devise/devise_generator.rb +24 -26
- data/lib/generators/active_admin/install/install_generator.rb +8 -9
- data/lib/generators/active_admin/install/templates/active_admin.rb.erb +28 -26
- data/lib/generators/active_admin/install/templates/admin_user.rb.erb +12 -2
- data/lib/generators/active_admin/install/templates/dashboard.rb +4 -4
- data/lib/generators/active_admin/install/templates/migrations/create_active_admin_comments.rb +3 -3
- 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 +3 -5
- data/lib/generators/active_admin/resource/templates/admin.rb +15 -0
- data/lib/ransack_ext.rb +12 -0
- data/script/local +2 -2
- data/script/travis_cache +107 -0
- data/spec/javascripts/coffeescripts/jquery.aa.flash.js.coffee +25 -0
- data/spec/javascripts/fixtures/flashes.html +2 -0
- data/spec/rails_helper.rb +154 -0
- data/spec/{integration → requests}/default_namespace_spec.rb +6 -6
- data/spec/{integration → requests}/javascript_spec.rb +5 -5
- data/spec/requests/memory_spec.rb +23 -0
- data/spec/requests/stylesheets_spec.rb +18 -0
- data/spec/spec_helper.rb +12 -173
- data/spec/support/detect_rails_version.rb +9 -17
- data/spec/support/rails_template.rb +64 -35
- data/spec/support/rails_template_with_data.rb +14 -14
- data/spec/support/templates/admin/stores.rb +5 -1
- 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 +4 -46
- data/spec/unit/abstract_view_factory_spec.rb +16 -16
- data/spec/unit/action_builder_spec.rb +24 -18
- data/spec/unit/active_admin_spec.rb +2 -2
- data/spec/unit/application_spec.rb +33 -34
- data/spec/unit/asset_registration_spec.rb +25 -29
- data/spec/unit/authorization/authorization_adapter_spec.rb +10 -10
- data/spec/unit/authorization/controller_authorization_spec.rb +11 -11
- data/spec/unit/authorization/index_overriding_spec.rb +22 -0
- data/spec/unit/auto_link_spec.rb +43 -13
- data/spec/unit/batch_actions/resource_spec.rb +15 -14
- data/spec/unit/batch_actions/settings_spec.rb +18 -18
- data/spec/unit/belongs_to_spec.rb +28 -19
- data/spec/unit/cancan_adapter_spec.rb +8 -8
- data/spec/unit/comments_spec.rb +99 -39
- data/spec/unit/component_spec.rb +3 -3
- data/spec/unit/config_shared_examples.rb +10 -10
- data/spec/unit/controller_filters_spec.rb +23 -16
- data/spec/unit/csv_builder_spec.rb +165 -24
- data/spec/unit/dependency_spec.rb +135 -0
- data/spec/unit/devise_spec.rb +17 -37
- data/spec/unit/dsl_spec.rb +70 -9
- data/spec/unit/event_spec.rb +11 -11
- data/spec/unit/filters/filter_form_builder_spec.rb +207 -148
- data/spec/unit/filters/resource_spec.rb +60 -26
- data/spec/unit/form_builder_spec.rb +419 -145
- data/spec/unit/generators/install_spec.rb +23 -0
- data/spec/unit/helpers/collection_spec.rb +18 -18
- data/spec/unit/helpers/scope_chain_spec.rb +6 -6
- data/spec/unit/helpers/settings_spec.rb +4 -4
- data/spec/unit/i18n_spec.rb +12 -0
- data/spec/unit/menu_collection_spec.rb +14 -14
- data/spec/unit/menu_item_spec.rb +42 -42
- data/spec/unit/menu_spec.rb +20 -20
- data/spec/unit/namespace/authorization_spec.rb +8 -8
- data/spec/unit/namespace/register_page_spec.rb +11 -11
- data/spec/unit/namespace/register_resource_spec.rb +28 -30
- data/spec/unit/namespace_spec.rb +20 -20
- data/spec/unit/order_clause_spec.rb +81 -0
- data/spec/unit/page_controller_spec.rb +1 -1
- data/spec/unit/page_spec.rb +18 -12
- data/spec/unit/pretty_format_spec.rb +42 -14
- data/spec/unit/pundit_adapter_spec.rb +98 -0
- data/spec/unit/resource/action_items_spec.rb +15 -12
- data/spec/unit/resource/includes_spec.rb +21 -0
- data/spec/unit/resource/menu_spec.rb +1 -1
- data/spec/unit/resource/naming_spec.rb +35 -21
- data/spec/unit/resource/page_presenters_spec.rb +8 -8
- data/spec/unit/resource/pagination_spec.rb +6 -6
- data/spec/unit/resource/routes_spec.rb +10 -10
- data/spec/unit/resource/scopes_spec.rb +14 -7
- data/spec/unit/resource/sidebars_spec.rb +6 -6
- data/spec/unit/resource_collection_spec.rb +31 -38
- data/spec/unit/resource_controller/data_access_spec.rb +96 -30
- data/spec/unit/resource_controller/decorators_spec.rb +83 -0
- data/spec/unit/resource_controller/sidebars_spec.rb +7 -8
- data/spec/unit/resource_controller_spec.rb +73 -70
- data/spec/unit/resource_registration_spec.rb +12 -12
- data/spec/unit/resource_spec.rb +77 -42
- data/spec/unit/routing_spec.rb +39 -31
- data/spec/unit/scope_spec.rb +112 -30
- data/spec/unit/settings_spec.rb +51 -21
- data/spec/unit/view_factory_spec.rb +2 -3
- data/spec/unit/view_helpers/breadcrumbs_spec.rb +71 -60
- data/spec/unit/view_helpers/display_name_spec.rb +49 -21
- data/spec/unit/view_helpers/download_format_links_helper_spec.rb +5 -5
- data/spec/unit/view_helpers/fields_for_spec.rb +18 -18
- data/spec/unit/view_helpers/flash_helper_spec.rb +25 -0
- data/spec/unit/view_helpers/form_helper_spec.rb +10 -23
- data/spec/unit/view_helpers/method_or_proc_helper_spec.rb +64 -22
- data/spec/unit/views/components/action_list_popover_spec.rb +16 -6
- data/spec/unit/views/components/attributes_table_spec.rb +171 -30
- data/spec/unit/views/components/batch_action_popover_spec.rb +20 -6
- data/spec/unit/views/components/blank_slate_spec.rb +14 -4
- data/spec/unit/views/components/columns_spec.rb +52 -22
- data/spec/unit/views/components/index_list_spec.rb +11 -8
- data/spec/unit/views/components/index_table_for_spec.rb +46 -0
- data/spec/unit/views/components/paginated_collection_spec.rb +79 -90
- data/spec/unit/views/components/panel_spec.rb +32 -21
- data/spec/unit/views/components/popover_spec.rb +7 -7
- data/spec/unit/views/components/sidebar_section_spec.rb +18 -8
- data/spec/unit/views/components/site_title_spec.rb +26 -26
- data/spec/unit/views/components/status_tag_spec.rb +178 -38
- data/spec/unit/views/components/table_for_spec.rb +237 -35
- data/spec/unit/views/components/tabs_spec.rb +39 -0
- data/spec/unit/views/components/unsupported_browser_spec.rb +47 -0
- data/spec/unit/views/pages/form_spec.rb +17 -10
- data/spec/unit/views/pages/index_spec.rb +60 -0
- data/spec/unit/views/pages/layout_spec.rb +17 -21
- data/spec/unit/views/pages/show_spec.rb +18 -6
- data/spec/unit/views/tabbed_navigation_spec.rb +61 -52
- data/tasks/docs.rake +9 -11
- data/tasks/parallel_tests.rake +8 -2
- data/tasks/test.rake +13 -9
- data/tasks/yard.rake +7 -4
- metadata +219 -163
- data/.document +0 -5
- data/README.rdoc +0 -88
- 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-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 +0 -10
- data/app/assets/images/active_admin/index_list_icons/blog_icon.svg +0 -4
- data/app/assets/images/active_admin/index_list_icons/grid_icon.svg +0 -13
- data/app/assets/images/active_admin/index_list_icons/table_icon.svg +0 -3
- data/app/assets/images/active_admin/loading.gif +0 -0
- data/app/assets/javascripts/active_admin/application.js +0 -3
- data/app/assets/javascripts/active_admin/base.js +0 -5
- data/app/assets/javascripts/active_admin/components/jquery.aa.dropdown-menu.js.coffee +0 -105
- data/app/assets/javascripts/active_admin/components/jquery.aa.popover.js.coffee +0 -97
- data/app/assets/javascripts/active_admin/lib/namespace.js.coffee +0 -4
- data/app/assets/javascripts/active_admin/pages/application.js.coffee +0 -21
- data/app/assets/javascripts/active_admin/pages/batch_actions.js.coffee +0 -26
- data/app/assets/stylesheets/active_admin/components/_batch_actions.css.scss +0 -11
- data/app/assets/stylesheets/active_admin/components/_flash_messages.css.scss +0 -41
- data/app/assets/stylesheets/active_admin/components/_table_tools.css.scss +0 -95
- data/app/assets/stylesheets/active_admin/mixins/_gradients.css.scss +0 -38
- data/app/assets/stylesheets/active_admin/mixins/_rounded.css.scss +0 -43
- data/app/views/active_admin/dashboard/index.html.arb +0 -1
- data/app/views/active_admin/resource/index.csv.erb +0 -23
- data/docs/3-index-pages/create-an-index.md +0 -29
- data/lib/active_admin/comments.rb +0 -83
- data/lib/active_admin/comments/comment.rb +0 -42
- data/lib/active_admin/comments/views.rb +0 -2
- data/lib/active_admin/dependency_checker.rb +0 -46
- data/lib/active_admin/inputs/filter_base.rb +0 -33
- data/lib/active_admin/inputs/filter_base/search_method_select.rb +0 -73
- data/lib/active_admin/inputs/filter_boolean_input.rb +0 -36
- data/lib/active_admin/inputs/filter_check_boxes_input.rb +0 -40
- data/lib/active_admin/inputs/filter_date_range_input.rb +0 -34
- data/lib/active_admin/inputs/filter_numeric_input.rb +0 -10
- data/lib/active_admin/inputs/filter_select_input.rb +0 -49
- data/lib/active_admin/inputs/filter_string_input.rb +0 -24
- data/lib/active_admin/reloader.rb +0 -130
- data/lib/active_admin/resource_controller/actions.rb +0 -81
- data/lib/active_admin/sass/active_admin.scss +0 -3
- data/lib/active_admin/sass/css_loader.rb +0 -16
- data/lib/active_admin/sass/helpers.rb +0 -45
- data/lib/active_admin/view_helpers/assigns_with_indifferent_access_helper.rb +0 -7
- data/lib/active_admin/views/dashboard_section_renderer.rb +0 -19
- data/lib/active_admin/views/pages/dashboard.rb +0 -62
- data/lib/generators/active_admin/assets/templates/3.0/active_admin.js +0 -1
- data/lib/generators/active_admin/assets/templates/3.1/active_admin.js +0 -1
- data/lib/meta_search_ext.rb +0 -10
- data/spec/integration/memory_spec.rb +0 -29
- data/spec/integration/stylesheets_spec.rb +0 -41
- data/spec/javascripts/compiled/jquery.aa.checkbox-toggler-spec.js +0 -60
- data/spec/javascripts/compiled/jquery.aa.popover-spec.js +0 -106
- data/spec/javascripts/compiled/jquery.aa.table-checkbox-toggler-spec.js +0 -37
- data/spec/javascripts/helpers/vendor/jasmine-fixture-0.0.5.js +0 -108
- data/spec/javascripts/helpers/vendor/jasmine-jquery.js +0 -288
- data/spec/javascripts/helpers/vendor/sinon-1.2.0.js +0 -2915
- data/spec/javascripts/support/jquery-ui-1.8.16.custom.min.js +0 -34
- data/spec/javascripts/support/jquery.min.js +0 -4
- data/spec/spec_helper_without_rails.rb +0 -11
- data/spec/unit/generators/install_rails_3_1_spec.rb +0 -16
- data/spec/unit/rails_spec.rb +0 -43
- data/spec/unit/reloader_spec.rb +0 -124
- data/spec/unit/sass/helpers_spec.rb +0 -47
- data/tasks/js.rake +0 -32
@@ -0,0 +1,135 @@
|
|
1
|
+
require 'rails_helper'
|
2
|
+
|
3
|
+
describe ActiveAdmin::Dependency do
|
4
|
+
|
5
|
+
k = ActiveAdmin::Dependency
|
6
|
+
|
7
|
+
describe 'method_missing' do
|
8
|
+
before do
|
9
|
+
allow(Gem).to receive(:loaded_specs)
|
10
|
+
.and_return 'foo' => Gem::Specification.new('foo', '1.2.3')
|
11
|
+
end
|
12
|
+
|
13
|
+
it 'returns a Matcher' do
|
14
|
+
expect(k.foo).to be_a ActiveAdmin::Dependency::Matcher
|
15
|
+
expect(k.foo.inspect).to eq '<ActiveAdmin::Dependency::Matcher for foo 1.2.3>'
|
16
|
+
expect(k.bar.inspect).to eq '<ActiveAdmin::Dependency::Matcher for (missing)>'
|
17
|
+
end
|
18
|
+
|
19
|
+
describe '`?`' do
|
20
|
+
it 'base' do
|
21
|
+
expect(k.foo?).to eq true
|
22
|
+
expect(k.bar?).to eq false
|
23
|
+
end
|
24
|
+
it '=' do
|
25
|
+
expect(k.foo? '= 1.2.3').to eq true
|
26
|
+
expect(k.foo? '= 1' ).to eq false
|
27
|
+
end
|
28
|
+
it '>' do
|
29
|
+
expect(k.foo? '> 1').to eq true
|
30
|
+
expect(k.foo? '> 2').to eq false
|
31
|
+
end
|
32
|
+
it '<' do
|
33
|
+
expect(k.foo? '< 2').to eq true
|
34
|
+
expect(k.foo? '< 1').to eq false
|
35
|
+
end
|
36
|
+
it '>=' do
|
37
|
+
expect(k.foo? '>= 1.2.3').to eq true
|
38
|
+
expect(k.foo? '>= 1.2.2').to eq true
|
39
|
+
expect(k.foo? '>= 1.2.4').to eq false
|
40
|
+
end
|
41
|
+
it '<=' do
|
42
|
+
expect(k.foo? '<= 1.2.3').to eq true
|
43
|
+
expect(k.foo? '<= 1.2.4').to eq true
|
44
|
+
expect(k.foo? '<= 1.2.2').to eq false
|
45
|
+
end
|
46
|
+
it '~>' do
|
47
|
+
expect(k.foo? '~> 1.2.0').to eq true
|
48
|
+
expect(k.foo? '~> 1.1' ).to eq true
|
49
|
+
expect(k.foo? '~> 1.2.4').to eq false
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
describe '`!`' do
|
54
|
+
it 'raises an error if requirement not met' do
|
55
|
+
expect{ k.foo! '5' }.to raise_error ActiveAdmin::DependencyError,
|
56
|
+
'You provided foo 1.2.3 but we need: 5.'
|
57
|
+
end
|
58
|
+
it 'accepts multiple arguments' do
|
59
|
+
expect{ k.foo! '> 1', '< 1.2' }.to raise_error ActiveAdmin::DependencyError,
|
60
|
+
'You provided foo 1.2.3 but we need: > 1, < 1.2.'
|
61
|
+
end
|
62
|
+
it 'raises an error if not provided' do
|
63
|
+
expect{ k.bar! }.to raise_error ActiveAdmin::DependencyError,
|
64
|
+
'To use bar you need to specify it in your Gemfile.'
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
describe '[]' do
|
70
|
+
before do
|
71
|
+
allow(Gem).to receive(:loaded_specs)
|
72
|
+
.and_return 'a-b' => Gem::Specification.new('a-b', '1.2.3')
|
73
|
+
end
|
74
|
+
|
75
|
+
it 'allows access to gems with an arbitrary name' do
|
76
|
+
expect(k['a-b']).to be_a ActiveAdmin::Dependency::Matcher
|
77
|
+
expect(k['a-b'].inspect).to eq '<ActiveAdmin::Dependency::Matcher for a-b 1.2.3>'
|
78
|
+
expect(k['c-d'].inspect).to eq '<ActiveAdmin::Dependency::Matcher for (missing)>'
|
79
|
+
end
|
80
|
+
|
81
|
+
# Note: more extensive tests for match? and match! are above.
|
82
|
+
|
83
|
+
it 'match?' do
|
84
|
+
expect(k['a-b'].match? ).to eq true
|
85
|
+
expect(k['a-b'].match? '1.2.3').to eq true
|
86
|
+
expect(k['b-c'].match? ).to eq false
|
87
|
+
end
|
88
|
+
|
89
|
+
it 'match!' do
|
90
|
+
expect(k['a-b'].match! ).to eq nil
|
91
|
+
expect(k['a-b'].match! '1.2.3').to eq nil
|
92
|
+
|
93
|
+
expect{ k['a-b'].match! '2.5' }.to raise_error ActiveAdmin::DependencyError,
|
94
|
+
'You provided a-b 1.2.3 but we need: 2.5.'
|
95
|
+
|
96
|
+
expect{ k['b-c'].match! }.to raise_error ActiveAdmin::DependencyError,
|
97
|
+
'To use b-c you need to specify it in your Gemfile.'
|
98
|
+
end
|
99
|
+
|
100
|
+
# Note: Ruby comparison operators are separate from the `foo? '> 1'` syntax
|
101
|
+
|
102
|
+
describe 'Ruby comparison syntax' do
|
103
|
+
|
104
|
+
it '==' do
|
105
|
+
expect(k['a-b'] == '1.2.3').to eq true
|
106
|
+
expect(k['a-b'] == '1.2' ).to eq false
|
107
|
+
expect(k['a-b'] == 1 ).to eq false
|
108
|
+
end
|
109
|
+
it '>' do
|
110
|
+
expect(k['a-b'] > 1).to eq true
|
111
|
+
expect(k['a-b'] > 2).to eq false
|
112
|
+
end
|
113
|
+
it '<' do
|
114
|
+
expect(k['a-b'] < 2).to eq true
|
115
|
+
expect(k['a-b'] < 1).to eq false
|
116
|
+
end
|
117
|
+
it '>=' do
|
118
|
+
expect(k['a-b'] >= '1.2.3').to eq true
|
119
|
+
expect(k['a-b'] >= '1.2.2').to eq true
|
120
|
+
expect(k['a-b'] >= '1.2.4').to eq false
|
121
|
+
end
|
122
|
+
it '<=' do
|
123
|
+
expect(k['a-b'] <= '1.2.3').to eq true
|
124
|
+
expect(k['a-b'] <= '1.2.4').to eq true
|
125
|
+
expect(k['a-b'] <= '1.2.2').to eq false
|
126
|
+
end
|
127
|
+
|
128
|
+
it 'throws a custom error if the gem is missing' do
|
129
|
+
expect{ k['b-c'] < 23 }.to raise_error ActiveAdmin::DependencyError,
|
130
|
+
'To use b-c you need to specify it in your Gemfile.'
|
131
|
+
end
|
132
|
+
end
|
133
|
+
end
|
134
|
+
|
135
|
+
end
|
data/spec/unit/devise_spec.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
require '
|
1
|
+
require 'rails_helper'
|
2
2
|
|
3
3
|
describe ActiveAdmin::Devise::Controller do
|
4
4
|
|
@@ -18,12 +18,12 @@ describe ActiveAdmin::Devise::Controller do
|
|
18
18
|
before { Rails.configuration.action_controller[:relative_url_root] = '/foo' }
|
19
19
|
|
20
20
|
it "should set the root path to the default namespace" do
|
21
|
-
controller.root_path.
|
21
|
+
expect(controller.root_path).to eq "/foo/admin"
|
22
22
|
end
|
23
23
|
|
24
24
|
it "should set the root path to '/' when no default namespace" do
|
25
|
-
ActiveAdmin.application.
|
26
|
-
controller.root_path.
|
25
|
+
allow(ActiveAdmin.application).to receive(:default_namespace).and_return(false)
|
26
|
+
expect(controller.root_path).to eq "/foo/"
|
27
27
|
end
|
28
28
|
|
29
29
|
end
|
@@ -33,12 +33,12 @@ describe ActiveAdmin::Devise::Controller do
|
|
33
33
|
before { Rails.configuration.action_controller[:relative_url_root] = nil }
|
34
34
|
|
35
35
|
it "should set the root path to the default namespace" do
|
36
|
-
controller.root_path.
|
36
|
+
expect(controller.root_path).to eq "/admin"
|
37
37
|
end
|
38
38
|
|
39
39
|
it "should set the root path to '/' when no default namespace" do
|
40
|
-
ActiveAdmin.application.
|
41
|
-
controller.root_path.
|
40
|
+
allow(ActiveAdmin.application).to receive(:default_namespace).and_return(false)
|
41
|
+
expect(controller.root_path).to eq "/"
|
42
42
|
end
|
43
43
|
|
44
44
|
end
|
@@ -54,7 +54,7 @@ describe ActiveAdmin::Devise::Controller do
|
|
54
54
|
|
55
55
|
# Add scoped routes
|
56
56
|
routes.draw do
|
57
|
-
scope :
|
57
|
+
scope path: SCOPE do
|
58
58
|
ActiveAdmin.routes(self)
|
59
59
|
devise_for :admin_users, ActiveAdmin::Devise.config
|
60
60
|
end
|
@@ -67,7 +67,7 @@ describe ActiveAdmin::Devise::Controller do
|
|
67
67
|
end
|
68
68
|
|
69
69
|
it "should include scope path in root_path" do
|
70
|
-
controller.root_path.
|
70
|
+
expect(controller.root_path).to eq "#{SCOPE}/admin"
|
71
71
|
end
|
72
72
|
|
73
73
|
end
|
@@ -76,38 +76,18 @@ describe ActiveAdmin::Devise::Controller do
|
|
76
76
|
let(:config) { ActiveAdmin::Devise.config }
|
77
77
|
|
78
78
|
describe ":sign_out_via option" do
|
79
|
+
it "should contain the application.logout_link_method" do
|
80
|
+
expect(::Devise).to receive(:sign_out_via).and_return(:delete)
|
81
|
+
expect(ActiveAdmin.application).to receive(:logout_link_method).and_return(:get)
|
79
82
|
|
80
|
-
|
81
|
-
|
82
|
-
context "when Devise does not implement sign_out_via (version < 1.2)" do
|
83
|
-
before do
|
84
|
-
::Devise.should_receive(:respond_to?).with(:sign_out_via).and_return(false)
|
85
|
-
end
|
86
|
-
|
87
|
-
it "should not contain any customization for sign_out_via" do
|
88
|
-
config.should_not have_key(:sign_out_via)
|
89
|
-
end
|
83
|
+
expect(config[:sign_out_via]).to include(:get)
|
90
84
|
end
|
91
85
|
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
::Devise.stub!(:sign_out_via) { :delete }
|
96
|
-
end
|
97
|
-
|
98
|
-
it "should contain the application.logout_link_method" do
|
99
|
-
::Devise.should_receive(:sign_out_via).and_return(:delete)
|
100
|
-
ActiveAdmin.application.should_receive(:logout_link_method).and_return(:get)
|
101
|
-
|
102
|
-
config[:sign_out_via].should include(:get)
|
103
|
-
end
|
86
|
+
it "should contain Devise's logout_via_method(s)" do
|
87
|
+
expect(::Devise).to receive(:sign_out_via).and_return([:delete, :post])
|
88
|
+
expect(ActiveAdmin.application).to receive(:logout_link_method).and_return(:get)
|
104
89
|
|
105
|
-
|
106
|
-
::Devise.should_receive(:sign_out_via).and_return([:delete, :post])
|
107
|
-
ActiveAdmin.application.should_receive(:logout_link_method).and_return(:get)
|
108
|
-
|
109
|
-
config[:sign_out_via].should == [:delete, :post, :get]
|
110
|
-
end
|
90
|
+
expect(config[:sign_out_via]).to eq [:delete, :post, :get]
|
111
91
|
end
|
112
92
|
|
113
93
|
end # describe ":sign_out_via option"
|
data/spec/unit/dsl_spec.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
require '
|
1
|
+
require 'rails_helper'
|
2
2
|
|
3
3
|
|
4
4
|
module MockModuleToInclude
|
@@ -8,16 +8,15 @@ end
|
|
8
8
|
|
9
9
|
describe ActiveAdmin::DSL do
|
10
10
|
|
11
|
-
let(:config){ mock }
|
12
11
|
let(:application) { ActiveAdmin::Application.new }
|
13
12
|
let(:namespace) { ActiveAdmin::Namespace.new application, :admin }
|
14
13
|
let(:resource_config) { ActiveAdmin::Resource.new namespace, Post }
|
15
|
-
let(:dsl){ ActiveAdmin::DSL.new(
|
14
|
+
let(:dsl){ ActiveAdmin::DSL.new(resource_config) }
|
16
15
|
|
17
16
|
describe "#include" do
|
18
17
|
|
19
18
|
it "should call the included class method on the module that is included" do
|
20
|
-
MockModuleToInclude.
|
19
|
+
expect(MockModuleToInclude).to receive(:included).with(dsl)
|
21
20
|
dsl.run_registration_block do
|
22
21
|
include MockModuleToInclude
|
23
22
|
end
|
@@ -25,12 +24,45 @@ describe ActiveAdmin::DSL do
|
|
25
24
|
|
26
25
|
end
|
27
26
|
|
27
|
+
|
28
|
+
describe '#action_item' do
|
29
|
+
before do
|
30
|
+
@default_items_count = resource_config.action_items.size
|
31
|
+
|
32
|
+
dsl.run_registration_block do
|
33
|
+
action_item :awesome, only: :show do
|
34
|
+
"Awesome ActionItem"
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
it "adds action_item to the action_items of config" do
|
40
|
+
expect(resource_config.action_items.size).to eq(@default_items_count + 1)
|
41
|
+
end
|
42
|
+
|
43
|
+
context 'DEPRECATED: when used without a name' do
|
44
|
+
it "is configured for only the show action" do
|
45
|
+
expect(ActiveAdmin::Deprecation).to receive(:warn).with(instance_of(String))
|
46
|
+
|
47
|
+
dsl.run_registration_block do
|
48
|
+
action_item only: :edit do
|
49
|
+
"Awesome ActionItem"
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
item = resource_config.action_items.last
|
54
|
+
expect(item.display_on?(:edit)).to be true
|
55
|
+
expect(item.display_on?(:index)).to be false
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
28
60
|
describe "#menu" do
|
29
61
|
|
30
62
|
it "should set the menu_item_options on the configuration" do
|
31
|
-
|
63
|
+
expect(resource_config).to receive(:menu_item_options=).with({parent: "Admin"})
|
32
64
|
dsl.run_registration_block do
|
33
|
-
menu :
|
65
|
+
menu parent: "Admin"
|
34
66
|
end
|
35
67
|
end
|
36
68
|
|
@@ -39,23 +71,52 @@ describe ActiveAdmin::DSL do
|
|
39
71
|
describe "#navigation_menu" do
|
40
72
|
|
41
73
|
it "should set the navigation_menu_name on the configuration" do
|
42
|
-
|
74
|
+
expect(resource_config).to receive(:navigation_menu_name=).with(:admin)
|
43
75
|
dsl.run_registration_block do
|
44
76
|
navigation_menu :admin
|
45
77
|
end
|
46
78
|
end
|
47
79
|
|
48
80
|
it "should accept a block" do
|
49
|
-
|
50
81
|
dsl = ActiveAdmin::DSL.new(resource_config)
|
51
82
|
dsl.run_registration_block do
|
52
83
|
navigation_menu { :dynamic_menu }
|
53
84
|
end
|
85
|
+
expect(resource_config.navigation_menu_name).to eq :dynamic_menu
|
86
|
+
end
|
87
|
+
|
88
|
+
end
|
89
|
+
|
90
|
+
describe "#sidebar" do
|
54
91
|
|
55
|
-
|
92
|
+
before do
|
93
|
+
dsl.config.sidebar_sections << ActiveAdmin::SidebarSection.new(:email)
|
94
|
+
end
|
56
95
|
|
96
|
+
it "add sidebar_section to the sidebar_sections of config" do
|
97
|
+
dsl.run_registration_block do
|
98
|
+
sidebar :help
|
99
|
+
end
|
100
|
+
expect(dsl.config.sidebar_sections.map(&:name)).to match_array([:filters, :email, :help])
|
57
101
|
end
|
58
102
|
|
59
103
|
end
|
60
104
|
|
105
|
+
describe "#batch_action" do
|
106
|
+
it "should add a batch action by symbol" do
|
107
|
+
dsl.run_registration_block do
|
108
|
+
config.batch_actions = true
|
109
|
+
batch_action :foo
|
110
|
+
end
|
111
|
+
expect(resource_config.batch_actions.map(&:sym)).to eq [:foo, :destroy]
|
112
|
+
end
|
113
|
+
|
114
|
+
it "should add a batch action by title" do
|
115
|
+
dsl.run_registration_block do
|
116
|
+
config.batch_actions = true
|
117
|
+
batch_action "foo bar"
|
118
|
+
end
|
119
|
+
expect(resource_config.batch_actions.map(&:sym)).to eq [:foo_bar, :destroy]
|
120
|
+
end
|
121
|
+
end
|
61
122
|
end
|
data/spec/unit/event_spec.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
require '
|
1
|
+
require 'rails_helper'
|
2
2
|
require 'active_admin/event'
|
3
3
|
|
4
4
|
describe ActiveAdmin::EventDispatcher do
|
@@ -7,41 +7,41 @@ describe ActiveAdmin::EventDispatcher do
|
|
7
7
|
let(:dispatcher){ ActiveAdmin::EventDispatcher.new }
|
8
8
|
|
9
9
|
it "should add a subscriber for an event" do
|
10
|
-
dispatcher.subscribers(test_event).size.
|
10
|
+
expect(dispatcher.subscribers(test_event).size).to eq 0
|
11
11
|
dispatcher.subscribe(test_event){ true }
|
12
|
-
dispatcher.subscribers(test_event).size.
|
12
|
+
expect(dispatcher.subscribers(test_event).size).to eq 1
|
13
13
|
end
|
14
14
|
|
15
15
|
it "should add a subscriber for multiple events" do
|
16
16
|
dispatcher.subscribe(test_event, test_event + "1"){ true }
|
17
|
-
dispatcher.subscribers(test_event).size.
|
18
|
-
dispatcher.subscribers(test_event + "1").size.
|
17
|
+
expect(dispatcher.subscribers(test_event).size).to eq 1
|
18
|
+
expect(dispatcher.subscribers(test_event + "1").size).to eq 1
|
19
19
|
end
|
20
20
|
|
21
21
|
it "should call the dispatch block with no arguments" do
|
22
22
|
dispatcher.subscribe(test_event){ raise StandardError, "From Event Handler" }
|
23
|
-
|
23
|
+
expect {
|
24
24
|
dispatcher.dispatch(test_event)
|
25
|
-
}.
|
25
|
+
}.to raise_error(StandardError, "From Event Handler")
|
26
26
|
end
|
27
27
|
|
28
28
|
it "should call the dispatch block with one argument" do
|
29
29
|
arg = nil
|
30
30
|
dispatcher.subscribe(test_event){|passed_in| arg = passed_in }
|
31
31
|
dispatcher.dispatch(test_event, "My Arg")
|
32
|
-
arg.
|
32
|
+
expect(arg).to eq "My Arg"
|
33
33
|
end
|
34
34
|
|
35
35
|
it "should clear all subscribers" do
|
36
36
|
dispatcher.subscribe(test_event){ false }
|
37
37
|
dispatcher.subscribe(test_event + "_2"){ false }
|
38
38
|
dispatcher.clear_all_subscribers!
|
39
|
-
dispatcher.subscribers(test_event).size.
|
40
|
-
dispatcher.subscribers(test_event + "_2").size.
|
39
|
+
expect(dispatcher.subscribers(test_event).size).to eq 0
|
40
|
+
expect(dispatcher.subscribers(test_event + "_2").size).to eq 0
|
41
41
|
end
|
42
42
|
|
43
43
|
it "should have a dispatcher available from ActiveAdmin::Event" do
|
44
|
-
ActiveAdmin::Event.
|
44
|
+
expect(ActiveAdmin::Event).to be_an_instance_of(ActiveAdmin::EventDispatcher)
|
45
45
|
end
|
46
46
|
|
47
47
|
end
|
@@ -1,8 +1,9 @@
|
|
1
|
-
require '
|
1
|
+
require 'rails_helper'
|
2
2
|
|
3
3
|
class Post
|
4
|
-
|
5
|
-
|
4
|
+
ransacker :custom_searcher do
|
5
|
+
# nothing to see here
|
6
|
+
end
|
6
7
|
end
|
7
8
|
|
8
9
|
describe ActiveAdmin::Filters::ViewHelper do
|
@@ -27,312 +28,359 @@ describe ActiveAdmin::Filters::ViewHelper do
|
|
27
28
|
end
|
28
29
|
|
29
30
|
def render_filter(search, filters)
|
30
|
-
render_arbre_component({:
|
31
|
-
text_node active_admin_filters_form_for
|
32
|
-
end
|
31
|
+
render_arbre_component({filter_args: [search, filters]}, helpers) do
|
32
|
+
text_node active_admin_filters_form_for *assigns[:filter_args]
|
33
|
+
end.to_s
|
33
34
|
end
|
34
35
|
|
35
36
|
def filter(name, options = {})
|
36
|
-
render_filter scope,
|
37
|
+
render_filter scope, name => options
|
37
38
|
end
|
38
39
|
|
39
40
|
let(:scope) { Post.search }
|
40
41
|
|
41
|
-
before(:each) { @filters = [] }
|
42
|
-
|
43
|
-
|
44
42
|
describe "the form in general" do
|
45
|
-
let(:body) { filter :title }
|
43
|
+
let(:body) { Capybara.string(filter :title) }
|
46
44
|
|
47
45
|
it "should generate a form which submits via get" do
|
48
|
-
body.
|
46
|
+
expect(body).to have_selector("form.filter_form[method=get]")
|
49
47
|
end
|
50
48
|
|
51
49
|
it "should generate a filter button" do
|
52
|
-
body.
|
53
|
-
:value => "Filter" })
|
50
|
+
expect(body).to have_selector("input[type=submit][value=Filter]")
|
54
51
|
end
|
55
52
|
|
56
53
|
it "should only generate the form once" do
|
57
|
-
body
|
54
|
+
expect(body).to have_selector("form", count: 1)
|
58
55
|
end
|
59
56
|
|
60
57
|
it "should generate a clear filters link" do
|
61
|
-
body.
|
58
|
+
expect(body).to have_selector("a.clear_filters_btn", text: "Clear Filters")
|
59
|
+
end
|
60
|
+
|
61
|
+
describe "label as proc" do
|
62
|
+
let(:body) { Capybara.string(filter :title, label: proc { 'Title from proc' }) }
|
63
|
+
|
64
|
+
it "should render proper label" do
|
65
|
+
expect(body).to have_selector("label", text: "Title from proc")
|
66
|
+
end
|
62
67
|
end
|
63
68
|
end
|
64
69
|
|
65
70
|
describe "string attribute" do
|
66
|
-
let(:body) { filter :title }
|
71
|
+
let(:body) { Capybara.string(filter :title) }
|
67
72
|
|
68
73
|
it "should generate a select option for starts with" do
|
69
|
-
body.
|
74
|
+
expect(body).to have_selector("option[value=title_starts_with]", text: "Starts with")
|
70
75
|
end
|
71
76
|
|
72
77
|
it "should generate a select option for ends with" do
|
73
|
-
body.
|
78
|
+
expect(body).to have_selector("option[value=title_ends_with]", text: "Ends with")
|
74
79
|
end
|
75
80
|
|
76
81
|
it "should generate a select option for contains" do
|
77
|
-
body.
|
82
|
+
expect(body).to have_selector("option[value=title_contains]", text: "Contains")
|
78
83
|
end
|
79
84
|
|
80
85
|
it "should generate a text field for input" do
|
81
|
-
body.
|
86
|
+
expect(body).to have_selector("input[name='q[title_contains]']")
|
82
87
|
end
|
83
|
-
|
88
|
+
|
84
89
|
it "should have a proper label" do
|
85
|
-
body.
|
90
|
+
expect(body).to have_selector("label", text: "Title")
|
86
91
|
end
|
87
92
|
|
88
93
|
it "should translate the label for text field" do
|
89
|
-
|
90
|
-
|
91
|
-
body.should have_tag('label', 'Name')
|
92
|
-
ensure
|
93
|
-
I18n.backend.reload!
|
94
|
+
with_translation activerecord: {attributes: {post: {title: 'Name'}}} do
|
95
|
+
expect(body).to have_selector("label", text: "Name")
|
94
96
|
end
|
95
97
|
end
|
96
98
|
|
97
|
-
it "should select the option which is currently being filtered"
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
describe "string attribute with sub filters" do
|
102
|
-
let(:body) { filter :title_contains }
|
103
|
-
|
104
|
-
it "should generate a search field for a string attribute with query contains" do
|
105
|
-
body.should have_tag("input", :attributes => { :name => "q[title_contains]"})
|
106
|
-
body.should have_tag('label', 'Title contains')
|
107
|
-
end
|
108
|
-
|
109
|
-
it "should NOT generate a select option for contains" do
|
110
|
-
body.should_not have_tag("option", "Contains", :attributes => { :value => 'title_contains' })
|
111
|
-
end
|
112
|
-
|
113
|
-
context "using starts_with and as" do
|
114
|
-
let(:body) { filter :title_starts_with }
|
115
|
-
|
116
|
-
it "should generate a search field for a string attribute with query starts_with" do
|
117
|
-
body.should have_tag("input", :attributes => { :name => "q[title_starts_with]" })
|
118
|
-
end
|
99
|
+
it "should select the option which is currently being filtered" do
|
100
|
+
scope = Post.search title_starts_with: "foo"
|
101
|
+
body = Capybara.string(render_filter scope, title: {})
|
102
|
+
expect(body).to have_selector("option[value=title_starts_with][selected=selected]", text: "Starts with")
|
119
103
|
end
|
120
104
|
|
121
|
-
context "
|
122
|
-
|
105
|
+
context "with predicate" do
|
106
|
+
%w[eq equals cont contains start starts_with end ends_with].each do |predicate|
|
107
|
+
describe "'#{predicate}'" do
|
108
|
+
let(:body) { Capybara.string(filter :"title_#{predicate}") }
|
123
109
|
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
end
|
128
|
-
|
129
|
-
context "using contains and NO AS defined" do
|
130
|
-
let(:body) { filter :title_contains }
|
110
|
+
it "shouldn't include a select field" do
|
111
|
+
expect(body).not_to have_selector("select")
|
112
|
+
end
|
131
113
|
|
132
|
-
|
133
|
-
|
114
|
+
it "should build correctly" do
|
115
|
+
expect(body).to have_selector("input[name='q[title_#{predicate}]']")
|
116
|
+
end
|
117
|
+
end
|
134
118
|
end
|
135
119
|
end
|
136
120
|
end
|
137
|
-
|
121
|
+
|
138
122
|
describe "text attribute" do
|
139
|
-
let(:body) { filter :body }
|
123
|
+
let(:body) { Capybara.string(filter :body) }
|
140
124
|
|
141
125
|
it "should generate a search field for a text attribute" do
|
142
|
-
body.
|
126
|
+
expect(body).to have_selector("input[name='q[body_contains]']")
|
143
127
|
end
|
144
128
|
|
145
129
|
it "should have a proper label" do
|
146
|
-
body.
|
130
|
+
expect(body).to have_selector("label", text: "Body")
|
147
131
|
end
|
148
132
|
end
|
149
133
|
|
150
134
|
describe "string attribute, as a select" do
|
151
135
|
let(:body) { filter :title, as: :select }
|
152
|
-
let(:builder) { ActiveAdmin::Inputs::
|
136
|
+
let(:builder) { ActiveAdmin::Inputs::Filters::SelectInput }
|
153
137
|
|
154
138
|
context "when loading collection from DB" do
|
155
139
|
it "should use pluck for efficiency" do
|
156
|
-
builder.
|
140
|
+
expect_any_instance_of(builder).to receive(:pluck_column) { [] }
|
157
141
|
body
|
158
142
|
end
|
159
143
|
|
160
144
|
it "should remove original ordering to prevent PostgreSQL error" do
|
161
|
-
scope.
|
162
|
-
m =
|
163
|
-
m.uniq.
|
145
|
+
expect(scope.object.klass).to receive(:reorder).with('title asc') {
|
146
|
+
m = double uniq: double(pluck: ['A Title'])
|
147
|
+
expect(m.uniq).to receive(:pluck).with :title
|
164
148
|
m
|
165
149
|
}
|
166
150
|
body
|
167
151
|
end
|
168
152
|
end
|
169
|
-
end
|
153
|
+
end
|
170
154
|
|
171
155
|
describe "datetime attribute" do
|
172
|
-
let(:body) { filter :created_at }
|
156
|
+
let(:body) { Capybara.string(filter :created_at) }
|
173
157
|
|
174
158
|
it "should generate a date greater than" do
|
175
|
-
body.
|
159
|
+
expect(body).to have_selector("input.datepicker[name='q[created_at_gteq]']")
|
176
160
|
end
|
177
161
|
it "should generate a seperator" do
|
178
|
-
body.
|
162
|
+
expect(body).to have_selector("span.seperator")
|
179
163
|
end
|
180
164
|
it "should generate a date less than" do
|
181
|
-
body.
|
165
|
+
expect(body).to have_selector("input.datepicker[name='q[created_at_lteq]']")
|
182
166
|
end
|
183
167
|
end
|
184
168
|
|
185
169
|
describe "integer attribute" do
|
186
|
-
let(:body) { filter :id }
|
170
|
+
let(:body) { Capybara.string(filter :id) }
|
187
171
|
|
188
172
|
it "should generate a select option for equal to" do
|
189
|
-
body.
|
173
|
+
expect(body).to have_selector("option[value=id_equals]", text: "Equals")
|
190
174
|
end
|
191
175
|
it "should generate a select option for greater than" do
|
192
|
-
body.
|
176
|
+
expect(body).to have_selector("option", text: "Greater than")
|
193
177
|
end
|
194
178
|
it "should generate a select option for less than" do
|
195
|
-
body.
|
179
|
+
expect(body).to have_selector("option", text: "Less than")
|
196
180
|
end
|
197
181
|
it "should generate a text field for input" do
|
198
|
-
body.
|
182
|
+
expect(body).to have_selector("input[name='q[id_equals]']")
|
183
|
+
end
|
184
|
+
it "should select the option which is currently being filtered" do
|
185
|
+
scope = Post.search id_greater_than: 1
|
186
|
+
body = Capybara.string(render_filter scope, id: {})
|
187
|
+
expect(body).to have_selector("option[value=id_greater_than][selected=selected]", text: "Greater than")
|
199
188
|
end
|
200
|
-
it "should select the option which is currently being filtered"
|
201
189
|
end
|
202
190
|
|
203
191
|
describe "boolean attribute" do
|
204
192
|
context "boolean datatypes" do
|
205
|
-
let(:body) { filter :starred }
|
193
|
+
let(:body) { Capybara.string(filter :starred) }
|
206
194
|
|
207
|
-
it "should
|
208
|
-
body.
|
209
|
-
|
210
|
-
|
195
|
+
it "should generate a select" do
|
196
|
+
expect(body).to have_selector("select[name='q[starred_eq]']")
|
197
|
+
end
|
198
|
+
it "should set the default text to 'Any'" do
|
199
|
+
expect(body).to have_selector("option[value='']", text: "Any")
|
200
|
+
end
|
201
|
+
it "should create an option for true and false" do
|
202
|
+
expect(body).to have_selector("option[value=true]", text: "Yes")
|
203
|
+
expect(body).to have_selector("option[value=false]", text: "No")
|
211
204
|
end
|
212
205
|
|
213
206
|
it "should translate the label for boolean field" do
|
214
|
-
|
215
|
-
|
216
|
-
body.should have_tag('label', 'Faved')
|
217
|
-
ensure
|
218
|
-
I18n.backend.reload!
|
207
|
+
with_translation activerecord: {attributes: {post: {starred: 'Faved'}}} do
|
208
|
+
expect(body).to have_selector("label", text: "Faved")
|
219
209
|
end
|
220
210
|
end
|
221
211
|
end
|
222
212
|
|
223
213
|
context "non-boolean data types" do
|
224
|
-
let(:body) { filter :
|
214
|
+
let(:body) { Capybara.string(filter :title_present, as: :boolean) }
|
225
215
|
|
226
|
-
it "should
|
227
|
-
body.
|
228
|
-
|
229
|
-
|
216
|
+
it "should generate a select" do
|
217
|
+
expect(body).to have_selector("select[name='q[title_present]']")
|
218
|
+
end
|
219
|
+
it "should set the default text to 'Any'" do
|
220
|
+
expect(body).to have_selector("option[value='']", text: "Any")
|
221
|
+
end
|
222
|
+
it "should create an option for true and false" do
|
223
|
+
expect(body).to have_selector("option[value=true]", text: "Yes")
|
224
|
+
expect(body).to have_selector("option[value=false]", text: "No")
|
230
225
|
end
|
231
226
|
end
|
232
227
|
end
|
233
228
|
|
234
229
|
describe "belongs_to" do
|
235
230
|
before do
|
236
|
-
@john = User.create :
|
237
|
-
@jane = User.create :
|
231
|
+
@john = User.create first_name: "John", last_name: "Doe", username: "john_doe"
|
232
|
+
@jane = User.create first_name: "Jane", last_name: "Doe", username: "jane_doe"
|
238
233
|
end
|
239
234
|
|
240
235
|
context "when given as the _id attribute name" do
|
241
|
-
let(:body) { filter :author_id }
|
236
|
+
let(:body) { Capybara.string(filter :author_id) }
|
242
237
|
|
243
238
|
it "should generate a numeric filter" do
|
244
|
-
body.
|
245
|
-
body.
|
246
|
-
body.
|
239
|
+
expect(body).to have_selector("label", text: "Author") # really this should be Author ID :/)
|
240
|
+
expect(body).to have_selector("option[value=author_id_less_than]")
|
241
|
+
expect(body).to have_selector("input#q_author_id[name='q[author_id_equals]']")
|
247
242
|
end
|
248
243
|
end
|
249
244
|
|
250
245
|
context "when given as the name of the relationship" do
|
251
|
-
let(:body) { filter :author }
|
246
|
+
let(:body) { Capybara.string(filter :author) }
|
252
247
|
|
253
248
|
it "should generate a select" do
|
254
|
-
body.
|
249
|
+
expect(body).to have_selector("select[name='q[author_id_eq]']")
|
255
250
|
end
|
256
251
|
it "should set the default text to 'Any'" do
|
257
|
-
body.
|
252
|
+
expect(body).to have_selector("option[value='']", text: "Any")
|
258
253
|
end
|
259
254
|
it "should create an option for each related object" do
|
260
|
-
body.
|
261
|
-
body.
|
255
|
+
expect(body).to have_selector("option[value='#{@john.id}']", text: "John Doe")
|
256
|
+
expect(body).to have_selector("option[value='#{@jane.id}']", text: "Jane Doe")
|
262
257
|
end
|
263
258
|
|
264
259
|
context "with a proc" do
|
265
260
|
let :body do
|
266
|
-
filter :title, :
|
261
|
+
Capybara.string(filter :title, as: :select, collection: proc{ ['Title One', 'Title Two'] })
|
267
262
|
end
|
268
263
|
|
269
264
|
it "should use call the proc as the collection" do
|
270
|
-
body.
|
271
|
-
body.
|
265
|
+
expect(body).to have_selector("option", text: "Title One")
|
266
|
+
expect(body).to have_selector("option", text: "Title Two")
|
272
267
|
end
|
273
268
|
|
274
269
|
it "should render the collection in the context of the view" do
|
275
|
-
body = filter(:title, :
|
276
|
-
body.
|
270
|
+
body = Capybara.string(filter(:title, as: :select, collection: proc{[a_helper_method]}))
|
271
|
+
expect(body).to have_selector("option", text: "A Helper Method")
|
277
272
|
end
|
278
273
|
end
|
279
274
|
end
|
280
275
|
|
281
276
|
context "as check boxes" do
|
282
|
-
let(:body) { filter :author, :
|
277
|
+
let(:body) { Capybara.string(filter :author, as: :check_boxes) }
|
283
278
|
|
284
279
|
it "should create a check box for each related object" do
|
285
|
-
body.
|
286
|
-
|
287
|
-
:type => "checkbox",
|
288
|
-
:value => @john.id })
|
289
|
-
body.should have_tag("input", :attributes => {
|
290
|
-
:name => "q[author_id_in][]",
|
291
|
-
:type => "checkbox",
|
292
|
-
:value => @jane.id })
|
280
|
+
expect(body).to have_selector("input[type=checkbox][name='q[author_id_in][]'][value='#{@jane.id}']")
|
281
|
+
expect(body).to have_selector("input[type=checkbox][name='q[author_id_in][]'][value='#{@jane.id}']")
|
293
282
|
end
|
294
283
|
end
|
295
284
|
|
296
285
|
context "when polymorphic relationship" do
|
286
|
+
let(:scope) { ActiveAdmin::Comment.search }
|
297
287
|
it "should raise an error if a collection isn't provided" do
|
298
|
-
expect {
|
299
|
-
|
300
|
-
|
301
|
-
|
288
|
+
expect { filter :resource }.to raise_error \
|
289
|
+
Formtastic::PolymorphicInputWithoutCollectionError
|
290
|
+
end
|
291
|
+
end
|
292
|
+
|
293
|
+
context "when using a custom foreign key" do
|
294
|
+
let(:scope) { Post.search }
|
295
|
+
let(:body) { Capybara.string(filter :category) }
|
296
|
+
it "should ignore that foreign key and let Ransack handle it" do
|
297
|
+
expect(Post.reflect_on_association(:category).foreign_key).to eq :custom_category_id
|
298
|
+
expect(body).to have_selector("select[name='q[category_id_eq]']")
|
302
299
|
end
|
303
300
|
end
|
304
301
|
end # belongs to
|
305
302
|
|
306
303
|
describe "has_and_belongs_to_many" do
|
307
|
-
|
304
|
+
skip "add HABTM models so this can be tested"
|
305
|
+
end
|
306
|
+
|
307
|
+
describe "has_many :through" do
|
308
|
+
# Setup an ActionView::Base object which can be used for
|
309
|
+
# generating the form for.
|
310
|
+
let(:helpers) do
|
311
|
+
view = action_view
|
312
|
+
def view.collection_path
|
313
|
+
"/categories"
|
314
|
+
end
|
315
|
+
|
316
|
+
def view.protect_against_forgery?
|
317
|
+
false
|
318
|
+
end
|
319
|
+
|
320
|
+
def view.a_helper_method
|
321
|
+
"A Helper Method"
|
322
|
+
end
|
323
|
+
|
324
|
+
view
|
325
|
+
end
|
326
|
+
let(:scope) { Category.search }
|
327
|
+
|
328
|
+
let!(:john) { User.create first_name: "John", last_name: "Doe", username: "john_doe" }
|
329
|
+
let!(:jane) { User.create first_name: "Jane", last_name: "Doe", username: "jane_doe" }
|
330
|
+
|
331
|
+
context "when given as the name of the relationship" do
|
332
|
+
let(:body) { Capybara.string(filter :authors) }
|
333
|
+
|
334
|
+
it "should generate a select" do
|
335
|
+
expect(body).to have_selector("select[name='q[posts_author_id_eq]']")
|
336
|
+
end
|
337
|
+
|
338
|
+
it "should set the default text to 'Any'" do
|
339
|
+
expect(body).to have_selector("option[value='']", text: "Any")
|
340
|
+
end
|
341
|
+
|
342
|
+
it "should create an option for each related object" do
|
343
|
+
expect(body).to have_selector("option[value='#{john.id}']", text: "John Doe")
|
344
|
+
expect(body).to have_selector("option[value='#{jane.id}']", text: "Jane Doe")
|
345
|
+
end
|
346
|
+
end
|
347
|
+
|
348
|
+
context "as check boxes" do
|
349
|
+
let(:body) { Capybara.string(filter :authors, as: :check_boxes) }
|
350
|
+
|
351
|
+
it "should create a check box for each related object" do
|
352
|
+
expect(body).to have_selector("input[name='q[posts_author_id_in][]'][type=checkbox][value='#{john.id}']")
|
353
|
+
expect(body).to have_selector("input[name='q[posts_author_id_in][]'][type=checkbox][value='#{jane.id}']")
|
354
|
+
end
|
355
|
+
end
|
308
356
|
end
|
309
357
|
|
310
358
|
describe "conditional display" do
|
311
359
|
[:if, :unless].each do |verb|
|
312
|
-
should = verb == :if ? "should"
|
313
|
-
if_true = verb == :if ? :
|
314
|
-
if_false = verb == :if ? :
|
360
|
+
should = verb == :if ? "should" : "shouldn't"
|
361
|
+
if_true = verb == :if ? :to : :to_not
|
362
|
+
if_false = verb == :if ? :to_not : :to
|
315
363
|
context "with #{verb.inspect} proc" do
|
316
364
|
it "#{should} be displayed if true" do
|
317
|
-
body = filter :body, verb => proc{ true }
|
318
|
-
body.send if_true,
|
365
|
+
body = Capybara.string(filter :body, verb => proc{ true })
|
366
|
+
expect(body).send if_true, have_selector("input[name='q[body_contains]']")
|
319
367
|
end
|
320
368
|
it "#{should} be displayed if false" do
|
321
|
-
body = filter :body, verb => proc{ false }
|
322
|
-
body.send if_false,
|
369
|
+
body = Capybara.string(filter :body, verb => proc{ false })
|
370
|
+
expect(body).send if_false, have_selector("input[name='q[body_contains]']")
|
323
371
|
end
|
324
372
|
it "should still be hidden on the second render" do
|
325
|
-
filters =
|
373
|
+
filters = {body: { verb => proc{ verb == :unless }}}
|
326
374
|
2.times do
|
327
|
-
body = render_filter scope, filters
|
328
|
-
body.
|
375
|
+
body = Capybara.string(render_filter scope, filters)
|
376
|
+
expect(body).not_to have_selector("input[name='q[body_contains]']")
|
329
377
|
end
|
330
378
|
end
|
331
379
|
it "should successfully keep rendering other filters after one is hidden" do
|
332
|
-
filters =
|
333
|
-
body = render_filter scope, filters
|
334
|
-
body.
|
335
|
-
body.
|
380
|
+
filters = {body: { verb => proc{ verb == :unless }}, author: {}}
|
381
|
+
body = Capybara.string(render_filter scope, filters)
|
382
|
+
expect(body).not_to have_selector("input[name='q[body_contains]']")
|
383
|
+
expect(body).to have_selector("select[name='q[author_id_eq]']")
|
336
384
|
end
|
337
385
|
end
|
338
386
|
end
|
@@ -341,32 +389,43 @@ describe ActiveAdmin::Filters::ViewHelper do
|
|
341
389
|
describe "custom search methods" do
|
342
390
|
|
343
391
|
it "should work as select" do
|
344
|
-
body = filter :custom_searcher, as: :select, collection: ['foo']
|
345
|
-
body.
|
392
|
+
body = Capybara.string(filter :custom_searcher, as: :select, collection: ['foo'])
|
393
|
+
expect(body).to have_selector("select[name='q[custom_searcher]']")
|
346
394
|
end
|
347
395
|
|
348
396
|
it "should work as string" do
|
349
|
-
body = filter :custom_searcher, as: :string
|
350
|
-
body.
|
397
|
+
body = Capybara.string(filter :custom_searcher, as: :string)
|
398
|
+
expect(body).to have_selector("input[name='q[custom_searcher]']")
|
399
|
+
end
|
400
|
+
end
|
401
|
+
|
402
|
+
describe "does not support some filter inputs" do
|
403
|
+
it "should fallback to use formtastic inputs" do
|
404
|
+
body = Capybara.string(filter :custom_searcher, as: :text)
|
405
|
+
expect(body).to have_selector("textarea[name='q[custom_searcher]']")
|
351
406
|
end
|
352
407
|
end
|
353
408
|
|
354
409
|
describe "blank option" do
|
355
410
|
context "for a select filter" do
|
356
411
|
it "should be there by default" do
|
357
|
-
filter(:author)
|
412
|
+
body = Capybara.string(filter(:author))
|
413
|
+
expect(body).to have_selector("option", text: "Any")
|
358
414
|
end
|
359
415
|
it "should be able to be disabled" do
|
360
|
-
filter(:author, include_blank: false)
|
416
|
+
body = Capybara.string(filter(:author, include_blank: false))
|
417
|
+
expect(body).to_not have_selector("option", text: "Any")
|
361
418
|
end
|
362
419
|
end
|
363
420
|
|
364
421
|
context "for a multi-select filter" do
|
365
422
|
it "should not be there by default" do
|
366
|
-
filter(:author, multiple: true)
|
423
|
+
body = Capybara.string(filter(:author, multiple: true))
|
424
|
+
expect(body).to_not have_selector("option", text: "Any")
|
367
425
|
end
|
368
426
|
it "should be able to be enabled" do
|
369
|
-
filter(:author, multiple: true, include_blank: true)
|
427
|
+
body = Capybara.string(filter(:author, multiple: true, include_blank: true))
|
428
|
+
expect(body).to have_selector("option", text: "Any")
|
370
429
|
end
|
371
430
|
end
|
372
431
|
end
|