yousty-activeadmin 1.0.4.pre → 1.0.5.pre
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 +4 -4
- data/CHANGELOG.md +261 -211
- data/CONTRIBUTING.md +73 -39
- data/Gemfile +38 -20
- data/Guardfile +1 -0
- data/LICENSE +1 -1
- data/README.md +48 -24
- data/Rakefile +12 -4
- data/activeadmin.gemspec +21 -26
- data/app/assets/javascripts/active_admin/application.js.coffee +34 -5
- data/app/assets/javascripts/active_admin/base.js.coffee +11 -2
- 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 +3 -4
- data/app/assets/javascripts/active_admin/lib/dropdown-menu.js.coffee +51 -55
- 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 +29 -58
- data/app/assets/javascripts/active_admin/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} +51 -15
- 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/_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 -12
- data/app/assets/stylesheets/active_admin/components/_dropdown_menu.scss +3 -1
- 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} +0 -0
- 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} +1 -0
- data/app/assets/stylesheets/active_admin/components/_tabs.scss +65 -0
- data/app/assets/stylesheets/active_admin/components/_unsupported_browser.scss +16 -0
- data/app/assets/stylesheets/active_admin/mixins/{_all.css.scss → _all.scss} +0 -0
- data/app/assets/stylesheets/active_admin/mixins/{_buttons.css.scss → _buttons.scss} +0 -0
- data/app/assets/stylesheets/active_admin/mixins/{_gradients.css.scss → _gradients.scss} +1 -1
- 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.css.scss → _rounded.scss} +0 -0
- data/app/assets/stylesheets/active_admin/mixins/{_sections.css.scss → _sections.scss} +7 -1
- data/app/assets/stylesheets/active_admin/mixins/{_shadows.css.scss → _shadows.scss} +0 -0
- 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/_title_bar.scss +10 -7
- 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 +8 -8
- 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 +127 -0
- data/config/locales/en-GB.yml +11 -4
- data/config/locales/en.yml +21 -4
- data/config/locales/{es_MX.yml → es-MX.yml} +14 -24
- data/config/locales/es.yml +32 -25
- data/config/locales/fa.yml +120 -0
- data/config/locales/fi.yml +9 -5
- data/config/locales/fr.yml +28 -12
- 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 +17 -4
- 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 +36 -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 +14 -6
- data/docs/1-general-configuration.md +8 -5
- data/docs/10-custom-pages.md +68 -70
- data/docs/11-decorators.md +48 -59
- data/docs/12-arbre-components.md +79 -73
- data/docs/13-authorization-adapter.md +128 -107
- data/docs/14-gotchas.md +90 -0
- data/docs/2-resource-customization.md +82 -15
- data/docs/3-index-pages.md +71 -12
- data/docs/3-index-pages/custom-index.md +31 -0
- data/docs/3-index-pages/index-as-table.md +45 -2
- data/docs/4-csv-format.md +1 -1
- data/docs/5-forms.md +78 -29
- data/docs/6-show-pages.md +31 -3
- data/docs/7-sidebars.md +46 -25
- data/docs/8-custom-actions.md +98 -77
- data/docs/9-batch-actions.md +211 -133
- data/docs/README.md +24 -0
- data/features/action_item.feature +3 -3
- data/features/authorization_pundit.feature +37 -0
- data/features/belongs_to.feature +3 -0
- data/features/breadcrumb.feature +48 -0
- data/features/comments/commenting.feature +44 -13
- data/features/development_reloading.feature +3 -4
- data/features/edit_page.feature +9 -19
- data/features/favicon.feature +3 -3
- data/features/i18n.feature +5 -0
- data/features/index/batch_actions.feature +41 -0
- data/features/index/filters.feature +23 -0
- data/features/index/format_as_csv.feature +90 -4
- 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 +10 -20
- 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/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 +17 -18
- 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 +1 -1
- data/features/step_definitions/dashboard_steps.rb +2 -2
- data/features/step_definitions/factory_steps.rb +6 -6
- 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 +17 -10
- 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 +1 -1
- 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 +15 -9
- data/features/step_definitions/web_steps.rb +10 -11
- data/features/sti_resource.feature +2 -10
- data/features/strong_parameters.feature +73 -0
- data/features/support/env.rb +35 -2
- data/features/support/paths.rb +2 -2
- data/features/support/selectors.rb +1 -1
- data/features/users/resetting_password.feature +7 -7
- data/lib/active_admin.rb +18 -13
- data/lib/active_admin/abstract_view_factory.rb +7 -17
- data/lib/active_admin/application.rb +50 -25
- 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 +13 -7
- data/lib/active_admin/batch_actions/resource_extension.rb +43 -17
- 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 +26 -14
- data/lib/active_admin/dsl.rb +18 -11
- data/lib/active_admin/engine.rb +7 -2
- data/lib/active_admin/error.rb +59 -0
- data/lib/active_admin/filters/dsl.rb +2 -2
- data/lib/active_admin/filters/forms.rb +19 -30
- data/lib/active_admin/filters/formtastic_addons.rb +20 -11
- data/lib/active_admin/filters/resource_extension.rb +16 -9
- data/lib/active_admin/form_builder.rb +94 -105
- 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/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 +1 -1
- 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 +3 -3
- data/lib/active_admin/menu_collection.rb +1 -4
- data/lib/active_admin/namespace.rb +52 -29
- data/lib/active_admin/order_clause.rb +26 -0
- data/lib/active_admin/orm/active_record.rb +2 -0
- data/lib/active_admin/orm/active_record/comments.rb +48 -51
- data/lib/active_admin/orm/active_record/comments/comment.rb +16 -10
- data/lib/active_admin/orm/active_record/comments/namespace_helper.rb +1 -1
- data/lib/active_admin/orm/active_record/comments/resource_helper.rb +1 -1
- data/lib/active_admin/orm/active_record/comments/views/active_admin_comments.rb +15 -13
- data/lib/active_admin/page.rb +5 -1
- 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 +12 -3
- data/lib/active_admin/resource/action_items.rb +15 -8
- 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 +25 -47
- data/lib/active_admin/resource/page_presenters.rb +1 -1
- data/lib/active_admin/resource/routes.rb +26 -10
- data/lib/active_admin/resource/scope_to.rb +7 -7
- data/lib/active_admin/resource/sidebars.rb +1 -0
- data/lib/active_admin/resource_collection.rb +44 -16
- data/lib/active_admin/resource_controller.rb +6 -5
- data/lib/active_admin/resource_controller/data_access.rb +87 -82
- 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 +54 -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 -16
- 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 +13 -6
- data/lib/active_admin/view_helpers/display_helper.rb +30 -17
- data/lib/active_admin/view_helpers/download_format_links_helper.rb +21 -24
- data/lib/active_admin/view_helpers/fields_for.rb +2 -2
- 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 +22 -13
- 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 +33 -17
- 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 +1 -1
- 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 +67 -22
- 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_blog.rb +6 -6
- data/lib/active_admin/views/index_as_grid.rb +2 -2
- data/lib/active_admin/views/index_as_table.rb +127 -40
- data/lib/active_admin/views/pages/base.rb +22 -18
- data/lib/active_admin/views/pages/form.rb +16 -6
- data/lib/active_admin/views/pages/index.rb +36 -20
- 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 +1 -3
- data/lib/generators/active_admin/devise/devise_generator.rb +20 -28
- data/lib/generators/active_admin/install/install_generator.rb +8 -9
- data/lib/generators/active_admin/install/templates/active_admin.rb.erb +20 -22
- data/lib/generators/active_admin/install/templates/admin_user.rb.erb +12 -9
- 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 +2 -4
- data/lib/generators/active_admin/resource/templates/admin.rb +15 -0
- data/lib/ransack_ext.rb +4 -4
- 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 -170
- data/spec/support/detect_rails_version.rb +31 -39
- data/spec/support/rails_template.rb +61 -34
- data/spec/support/rails_template_with_data.rb +14 -14
- data/spec/support/templates/admin/stores.rb +3 -5
- 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 +11 -11
- data/spec/unit/action_builder_spec.rb +24 -18
- data/spec/unit/active_admin_spec.rb +2 -2
- data/spec/unit/application_spec.rb +30 -31
- data/spec/unit/asset_registration_spec.rb +11 -11
- data/spec/unit/authorization/authorization_adapter_spec.rb +7 -7
- 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 +42 -5
- 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 +26 -17
- data/spec/unit/cancan_adapter_spec.rb +4 -4
- data/spec/unit/comments_spec.rb +99 -39
- data/spec/unit/component_spec.rb +3 -3
- data/spec/unit/config_shared_examples.rb +8 -8
- data/spec/unit/controller_filters_spec.rb +26 -14
- data/spec/unit/csv_builder_spec.rb +152 -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 +9 -9
- data/spec/unit/filters/filter_form_builder_spec.rb +167 -157
- data/spec/unit/filters/resource_spec.rb +35 -33
- data/spec/unit/form_builder_spec.rb +383 -145
- data/spec/unit/generators/install_spec.rb +5 -5
- data/spec/unit/helpers/collection_spec.rb +18 -18
- data/spec/unit/helpers/scope_chain_spec.rb +5 -5
- 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 +5 -5
- data/spec/unit/namespace/register_page_spec.rb +9 -9
- data/spec/unit/namespace/register_resource_spec.rb +26 -28
- 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 +13 -10
- 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 +23 -23
- 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 +66 -68
- data/spec/unit/resource_controller/data_access_spec.rb +39 -21
- 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 +66 -62
- data/spec/unit/resource_registration_spec.rb +12 -12
- data/spec/unit/resource_spec.rb +75 -40
- 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 -2
- data/spec/unit/view_helpers/breadcrumbs_spec.rb +137 -69
- 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 +9 -22
- data/spec/unit/view_helpers/method_or_proc_helper_spec.rb +59 -21
- data/spec/unit/views/components/action_list_popover_spec.rb +16 -6
- data/spec/unit/views/components/attributes_table_spec.rb +94 -52
- 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 +68 -59
- 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 +8 -8
- data/spec/unit/views/components/status_tag_spec.rb +178 -38
- data/spec/unit/views/components/table_for_spec.rb +227 -44
- 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 +16 -3
- data/spec/unit/views/tabbed_navigation_spec.rb +61 -52
- data/tasks/docs.rake +1 -1
- data/tasks/parallel_tests.rake +8 -2
- data/tasks/test.rake +8 -4
- data/tasks/yard.rake +7 -5
- metadata +180 -101
- 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/components/application.js.coffee +0 -23
- data/app/assets/javascripts/active_admin/components/batch_actions.js.coffee +0 -26
- data/app/assets/javascripts/active_admin/components/has_many.js.coffee +0 -41
- 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 -39
- data/app/assets/stylesheets/active_admin/components/_table_tools.css.scss +0 -95
- data/app/views/active_admin/dashboard/index.html.arb +0 -1
- data/app/views/active_admin/resource/index.csv.erb +0 -17
- data/docs/3-index-pages/create-an-index.md +0 -29
- 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 -32
- data/lib/active_admin/inputs/filter_check_boxes_input.rb +0 -51
- 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 -61
- data/lib/active_admin/inputs/filter_string_input.rb +0 -24
- data/lib/active_admin/view_helpers/assigns_with_indifferent_access_helper.rb +0 -7
- 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 -16
- data/tasks/js.rake +0 -32
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){ double }
|
|
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,15 +7,15 @@ 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
|
|
@@ -29,19 +29,19 @@ describe ActiveAdmin::EventDispatcher 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,4 +1,4 @@
|
|
|
1
|
-
require '
|
|
1
|
+
require 'rails_helper'
|
|
2
2
|
|
|
3
3
|
class Post
|
|
4
4
|
ransacker :custom_searcher do
|
|
@@ -30,7 +30,7 @@ describe ActiveAdmin::Filters::ViewHelper do
|
|
|
30
30
|
def render_filter(search, filters)
|
|
31
31
|
render_arbre_component({filter_args: [search, filters]}, helpers) do
|
|
32
32
|
text_node active_admin_filters_form_for *assigns[:filter_args]
|
|
33
|
-
end
|
|
33
|
+
end.to_s
|
|
34
34
|
end
|
|
35
35
|
|
|
36
36
|
def filter(name, options = {})
|
|
@@ -40,125 +40,111 @@ describe ActiveAdmin::Filters::ViewHelper do
|
|
|
40
40
|
let(:scope) { Post.search }
|
|
41
41
|
|
|
42
42
|
describe "the form in general" do
|
|
43
|
-
let(:body) { filter :title }
|
|
43
|
+
let(:body) { Capybara.string(filter :title) }
|
|
44
44
|
|
|
45
45
|
it "should generate a form which submits via get" do
|
|
46
|
-
body.
|
|
46
|
+
expect(body).to have_selector("form.filter_form[method=get]")
|
|
47
47
|
end
|
|
48
48
|
|
|
49
49
|
it "should generate a filter button" do
|
|
50
|
-
body.
|
|
51
|
-
:value => "Filter" })
|
|
50
|
+
expect(body).to have_selector("input[type=submit][value=Filter]")
|
|
52
51
|
end
|
|
53
52
|
|
|
54
53
|
it "should only generate the form once" do
|
|
55
|
-
body
|
|
54
|
+
expect(body).to have_selector("form", count: 1)
|
|
56
55
|
end
|
|
57
56
|
|
|
58
57
|
it "should generate a clear filters link" do
|
|
59
|
-
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
|
|
60
67
|
end
|
|
61
68
|
end
|
|
62
69
|
|
|
63
70
|
describe "string attribute" do
|
|
64
|
-
let(:body) { filter :title }
|
|
71
|
+
let(:body) { Capybara.string(filter :title) }
|
|
65
72
|
|
|
66
73
|
it "should generate a select option for starts with" do
|
|
67
|
-
body.
|
|
74
|
+
expect(body).to have_selector("option[value=title_starts_with]", text: "Starts with")
|
|
68
75
|
end
|
|
69
76
|
|
|
70
77
|
it "should generate a select option for ends with" do
|
|
71
|
-
body.
|
|
78
|
+
expect(body).to have_selector("option[value=title_ends_with]", text: "Ends with")
|
|
72
79
|
end
|
|
73
80
|
|
|
74
81
|
it "should generate a select option for contains" do
|
|
75
|
-
body.
|
|
82
|
+
expect(body).to have_selector("option[value=title_contains]", text: "Contains")
|
|
76
83
|
end
|
|
77
84
|
|
|
78
85
|
it "should generate a text field for input" do
|
|
79
|
-
body.
|
|
86
|
+
expect(body).to have_selector("input[name='q[title_contains]']")
|
|
80
87
|
end
|
|
81
|
-
|
|
88
|
+
|
|
82
89
|
it "should have a proper label" do
|
|
83
|
-
body.
|
|
90
|
+
expect(body).to have_selector("label", text: "Title")
|
|
84
91
|
end
|
|
85
92
|
|
|
86
93
|
it "should translate the label for text field" do
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
body.should have_tag('label', 'Name')
|
|
90
|
-
ensure
|
|
91
|
-
I18n.backend.reload!
|
|
94
|
+
with_translation activerecord: {attributes: {post: {title: 'Name'}}} do
|
|
95
|
+
expect(body).to have_selector("label", text: "Name")
|
|
92
96
|
end
|
|
93
97
|
end
|
|
94
98
|
|
|
95
|
-
it "should select the option which is currently being filtered"
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
describe "string attribute with sub filters" do
|
|
100
|
-
let(:body) { filter :title_contains }
|
|
101
|
-
|
|
102
|
-
it "should generate a search field for a string attribute with query contains" do
|
|
103
|
-
body.should have_tag("input", :attributes => { :name => "q[title_contains]"})
|
|
104
|
-
body.should have_tag('label', 'Title contains')
|
|
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")
|
|
105
103
|
end
|
|
106
104
|
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
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}") }
|
|
110
109
|
|
|
111
|
-
|
|
112
|
-
|
|
110
|
+
it "shouldn't include a select field" do
|
|
111
|
+
expect(body).not_to have_selector("select")
|
|
112
|
+
end
|
|
113
113
|
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
context "using ends_with and as" do
|
|
120
|
-
let(:body) { filter :title_ends_with }
|
|
121
|
-
|
|
122
|
-
it "should generate a search field for a string attribute with query ends_with" do
|
|
123
|
-
body.should have_tag("input", :attributes => { :name => "q[title_ends_with]" })
|
|
124
|
-
end
|
|
125
|
-
end
|
|
126
|
-
|
|
127
|
-
context "using contains and NO AS defined" do
|
|
128
|
-
let(:body) { filter :title_contains }
|
|
129
|
-
|
|
130
|
-
it "should generate a search field for a string attribute with query contains" do
|
|
131
|
-
body.should have_tag("input", :attributes => { :name => "q[title_contains]" })
|
|
114
|
+
it "should build correctly" do
|
|
115
|
+
expect(body).to have_selector("input[name='q[title_#{predicate}]']")
|
|
116
|
+
end
|
|
117
|
+
end
|
|
132
118
|
end
|
|
133
119
|
end
|
|
134
120
|
end
|
|
135
|
-
|
|
121
|
+
|
|
136
122
|
describe "text attribute" do
|
|
137
|
-
let(:body) { filter :body }
|
|
123
|
+
let(:body) { Capybara.string(filter :body) }
|
|
138
124
|
|
|
139
125
|
it "should generate a search field for a text attribute" do
|
|
140
|
-
body.
|
|
126
|
+
expect(body).to have_selector("input[name='q[body_contains]']")
|
|
141
127
|
end
|
|
142
128
|
|
|
143
129
|
it "should have a proper label" do
|
|
144
|
-
body.
|
|
130
|
+
expect(body).to have_selector("label", text: "Body")
|
|
145
131
|
end
|
|
146
132
|
end
|
|
147
133
|
|
|
148
134
|
describe "string attribute, as a select" do
|
|
149
135
|
let(:body) { filter :title, as: :select }
|
|
150
|
-
let(:builder) { ActiveAdmin::Inputs::
|
|
136
|
+
let(:builder) { ActiveAdmin::Inputs::Filters::SelectInput }
|
|
151
137
|
|
|
152
138
|
context "when loading collection from DB" do
|
|
153
139
|
it "should use pluck for efficiency" do
|
|
154
|
-
builder.
|
|
140
|
+
expect_any_instance_of(builder).to receive(:pluck_column) { [] }
|
|
155
141
|
body
|
|
156
142
|
end
|
|
157
143
|
|
|
158
144
|
it "should remove original ordering to prevent PostgreSQL error" do
|
|
159
|
-
scope.object.klass.
|
|
145
|
+
expect(scope.object.klass).to receive(:reorder).with('title asc') {
|
|
160
146
|
m = double uniq: double(pluck: ['A Title'])
|
|
161
|
-
m.uniq.
|
|
147
|
+
expect(m.uniq).to receive(:pluck).with :title
|
|
162
148
|
m
|
|
163
149
|
}
|
|
164
150
|
body
|
|
@@ -167,127 +153,132 @@ describe ActiveAdmin::Filters::ViewHelper do
|
|
|
167
153
|
end
|
|
168
154
|
|
|
169
155
|
describe "datetime attribute" do
|
|
170
|
-
let(:body) { filter :created_at }
|
|
156
|
+
let(:body) { Capybara.string(filter :created_at) }
|
|
171
157
|
|
|
172
158
|
it "should generate a date greater than" do
|
|
173
|
-
body.
|
|
159
|
+
expect(body).to have_selector("input.datepicker[name='q[created_at_gteq]']")
|
|
174
160
|
end
|
|
175
161
|
it "should generate a seperator" do
|
|
176
|
-
body.
|
|
162
|
+
expect(body).to have_selector("span.seperator")
|
|
177
163
|
end
|
|
178
164
|
it "should generate a date less than" do
|
|
179
|
-
body.
|
|
165
|
+
expect(body).to have_selector("input.datepicker[name='q[created_at_lteq]']")
|
|
180
166
|
end
|
|
181
167
|
end
|
|
182
168
|
|
|
183
169
|
describe "integer attribute" do
|
|
184
|
-
let(:body) { filter :id }
|
|
170
|
+
let(:body) { Capybara.string(filter :id) }
|
|
185
171
|
|
|
186
172
|
it "should generate a select option for equal to" do
|
|
187
|
-
body.
|
|
173
|
+
expect(body).to have_selector("option[value=id_equals]", text: "Equals")
|
|
188
174
|
end
|
|
189
175
|
it "should generate a select option for greater than" do
|
|
190
|
-
body.
|
|
176
|
+
expect(body).to have_selector("option", text: "Greater than")
|
|
191
177
|
end
|
|
192
178
|
it "should generate a select option for less than" do
|
|
193
|
-
body.
|
|
179
|
+
expect(body).to have_selector("option", text: "Less than")
|
|
194
180
|
end
|
|
195
181
|
it "should generate a text field for input" do
|
|
196
|
-
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")
|
|
197
188
|
end
|
|
198
|
-
it "should select the option which is currently being filtered"
|
|
199
189
|
end
|
|
200
190
|
|
|
201
191
|
describe "boolean attribute" do
|
|
202
192
|
context "boolean datatypes" do
|
|
203
|
-
let(:body) { filter :starred }
|
|
193
|
+
let(:body) { Capybara.string(filter :starred) }
|
|
204
194
|
|
|
205
|
-
it "should
|
|
206
|
-
body.
|
|
207
|
-
|
|
208
|
-
|
|
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")
|
|
209
204
|
end
|
|
210
205
|
|
|
211
206
|
it "should translate the label for boolean field" do
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
body.should have_tag('label', 'Faved')
|
|
215
|
-
ensure
|
|
216
|
-
I18n.backend.reload!
|
|
207
|
+
with_translation activerecord: {attributes: {post: {starred: 'Faved'}}} do
|
|
208
|
+
expect(body).to have_selector("label", text: "Faved")
|
|
217
209
|
end
|
|
218
210
|
end
|
|
219
211
|
end
|
|
220
212
|
|
|
221
213
|
context "non-boolean data types" do
|
|
222
|
-
let(:body) { filter :title_present, :
|
|
214
|
+
let(:body) { Capybara.string(filter :title_present, as: :boolean) }
|
|
223
215
|
|
|
224
|
-
it "should
|
|
225
|
-
body.
|
|
226
|
-
|
|
227
|
-
|
|
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")
|
|
228
225
|
end
|
|
229
226
|
end
|
|
230
227
|
end
|
|
231
228
|
|
|
232
229
|
describe "belongs_to" do
|
|
233
230
|
before do
|
|
234
|
-
@john = User.create :
|
|
235
|
-
@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"
|
|
236
233
|
end
|
|
237
234
|
|
|
238
235
|
context "when given as the _id attribute name" do
|
|
239
|
-
let(:body) { filter :author_id }
|
|
236
|
+
let(:body) { Capybara.string(filter :author_id) }
|
|
240
237
|
|
|
241
238
|
it "should generate a numeric filter" do
|
|
242
|
-
body.
|
|
243
|
-
body.
|
|
244
|
-
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]']")
|
|
245
242
|
end
|
|
246
243
|
end
|
|
247
244
|
|
|
248
245
|
context "when given as the name of the relationship" do
|
|
249
|
-
let(:body) { filter :author }
|
|
246
|
+
let(:body) { Capybara.string(filter :author) }
|
|
250
247
|
|
|
251
248
|
it "should generate a select" do
|
|
252
|
-
body.
|
|
249
|
+
expect(body).to have_selector("select[name='q[author_id_eq]']")
|
|
253
250
|
end
|
|
254
251
|
it "should set the default text to 'Any'" do
|
|
255
|
-
body.
|
|
252
|
+
expect(body).to have_selector("option[value='']", text: "Any")
|
|
256
253
|
end
|
|
257
254
|
it "should create an option for each related object" do
|
|
258
|
-
body.
|
|
259
|
-
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")
|
|
260
257
|
end
|
|
261
258
|
|
|
262
259
|
context "with a proc" do
|
|
263
260
|
let :body do
|
|
264
|
-
filter :title, :
|
|
261
|
+
Capybara.string(filter :title, as: :select, collection: proc{ ['Title One', 'Title Two'] })
|
|
265
262
|
end
|
|
266
263
|
|
|
267
264
|
it "should use call the proc as the collection" do
|
|
268
|
-
body.
|
|
269
|
-
body.
|
|
265
|
+
expect(body).to have_selector("option", text: "Title One")
|
|
266
|
+
expect(body).to have_selector("option", text: "Title Two")
|
|
270
267
|
end
|
|
271
268
|
|
|
272
269
|
it "should render the collection in the context of the view" do
|
|
273
|
-
body = filter(:title, :
|
|
274
|
-
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")
|
|
275
272
|
end
|
|
276
273
|
end
|
|
277
274
|
end
|
|
278
275
|
|
|
279
276
|
context "as check boxes" do
|
|
280
|
-
let(:body) { filter :author, :
|
|
277
|
+
let(:body) { Capybara.string(filter :author, as: :check_boxes) }
|
|
281
278
|
|
|
282
279
|
it "should create a check box for each related object" do
|
|
283
|
-
body.
|
|
284
|
-
|
|
285
|
-
:type => "checkbox",
|
|
286
|
-
:value => @john.id })
|
|
287
|
-
body.should have_tag("input", :attributes => {
|
|
288
|
-
:name => "q[author_id_in][]",
|
|
289
|
-
:type => "checkbox",
|
|
290
|
-
: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}']")
|
|
291
282
|
end
|
|
292
283
|
end
|
|
293
284
|
|
|
@@ -298,10 +289,19 @@ describe ActiveAdmin::Filters::ViewHelper do
|
|
|
298
289
|
Formtastic::PolymorphicInputWithoutCollectionError
|
|
299
290
|
end
|
|
300
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]']")
|
|
299
|
+
end
|
|
300
|
+
end
|
|
301
301
|
end # belongs to
|
|
302
302
|
|
|
303
303
|
describe "has_and_belongs_to_many" do
|
|
304
|
-
|
|
304
|
+
skip "add HABTM models so this can be tested"
|
|
305
305
|
end
|
|
306
306
|
|
|
307
307
|
describe "has_many :through" do
|
|
@@ -325,64 +325,63 @@ describe ActiveAdmin::Filters::ViewHelper do
|
|
|
325
325
|
end
|
|
326
326
|
let(:scope) { Category.search }
|
|
327
327
|
|
|
328
|
-
let!(:john) { User.create :
|
|
329
|
-
let!(:jane) { User.create :
|
|
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
330
|
|
|
331
331
|
context "when given as the name of the relationship" do
|
|
332
|
-
let(:body) { filter :authors }
|
|
332
|
+
let(:body) { Capybara.string(filter :authors) }
|
|
333
333
|
|
|
334
334
|
it "should generate a select" do
|
|
335
|
-
body.
|
|
335
|
+
expect(body).to have_selector("select[name='q[posts_author_id_eq]']")
|
|
336
336
|
end
|
|
337
337
|
|
|
338
338
|
it "should set the default text to 'Any'" do
|
|
339
|
-
body.
|
|
339
|
+
expect(body).to have_selector("option[value='']", text: "Any")
|
|
340
340
|
end
|
|
341
341
|
|
|
342
342
|
it "should create an option for each related object" do
|
|
343
|
-
body.
|
|
344
|
-
body.
|
|
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
345
|
end
|
|
346
346
|
end
|
|
347
347
|
|
|
348
348
|
context "as check boxes" do
|
|
349
|
-
let(:body) { filter :authors, :
|
|
349
|
+
let(:body) { Capybara.string(filter :authors, as: :check_boxes) }
|
|
350
350
|
|
|
351
351
|
it "should create a check box for each related object" do
|
|
352
|
-
body.
|
|
353
|
-
|
|
354
|
-
:type => "checkbox",
|
|
355
|
-
:value => john.id })
|
|
356
|
-
body.should have_tag("input", :attributes => {
|
|
357
|
-
:name => "q[posts_author_id_in][]",
|
|
358
|
-
:type => "checkbox",
|
|
359
|
-
:value => jane.id })
|
|
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}']")
|
|
360
354
|
end
|
|
361
355
|
end
|
|
362
356
|
end
|
|
363
357
|
|
|
364
358
|
describe "conditional display" do
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
359
|
+
[:if, :unless].each do |verb|
|
|
360
|
+
should = verb == :if ? "should" : "shouldn't"
|
|
361
|
+
if_true = verb == :if ? :to : :to_not
|
|
362
|
+
if_false = verb == :if ? :to_not : :to
|
|
363
|
+
context "with #{verb.inspect} proc" do
|
|
364
|
+
it "#{should} be displayed if true" do
|
|
365
|
+
body = Capybara.string(filter :body, verb => proc{ true })
|
|
366
|
+
expect(body).send if_true, have_selector("input[name='q[body_contains]']")
|
|
367
|
+
end
|
|
368
|
+
it "#{should} be displayed if false" do
|
|
369
|
+
body = Capybara.string(filter :body, verb => proc{ false })
|
|
370
|
+
expect(body).send if_false, have_selector("input[name='q[body_contains]']")
|
|
371
|
+
end
|
|
372
|
+
it "should still be hidden on the second render" do
|
|
373
|
+
filters = {body: { verb => proc{ verb == :unless }}}
|
|
374
|
+
2.times do
|
|
375
|
+
body = Capybara.string(render_filter scope, filters)
|
|
376
|
+
expect(body).not_to have_selector("input[name='q[body_contains]']")
|
|
377
|
+
end
|
|
378
|
+
end
|
|
379
|
+
it "should successfully keep rendering other filters after one is hidden" do
|
|
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]']")
|
|
384
|
+
end
|
|
386
385
|
end
|
|
387
386
|
end
|
|
388
387
|
end
|
|
@@ -390,32 +389,43 @@ describe ActiveAdmin::Filters::ViewHelper do
|
|
|
390
389
|
describe "custom search methods" do
|
|
391
390
|
|
|
392
391
|
it "should work as select" do
|
|
393
|
-
body = filter :custom_searcher, as: :select, collection: ['foo']
|
|
394
|
-
body.
|
|
392
|
+
body = Capybara.string(filter :custom_searcher, as: :select, collection: ['foo'])
|
|
393
|
+
expect(body).to have_selector("select[name='q[custom_searcher]']")
|
|
395
394
|
end
|
|
396
395
|
|
|
397
396
|
it "should work as string" do
|
|
398
|
-
body = filter :custom_searcher, as: :string
|
|
399
|
-
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]']")
|
|
400
406
|
end
|
|
401
407
|
end
|
|
402
408
|
|
|
403
409
|
describe "blank option" do
|
|
404
410
|
context "for a select filter" do
|
|
405
411
|
it "should be there by default" do
|
|
406
|
-
filter(:author)
|
|
412
|
+
body = Capybara.string(filter(:author))
|
|
413
|
+
expect(body).to have_selector("option", text: "Any")
|
|
407
414
|
end
|
|
408
415
|
it "should be able to be disabled" do
|
|
409
|
-
filter(:author, include_blank: false)
|
|
416
|
+
body = Capybara.string(filter(:author, include_blank: false))
|
|
417
|
+
expect(body).to_not have_selector("option", text: "Any")
|
|
410
418
|
end
|
|
411
419
|
end
|
|
412
420
|
|
|
413
421
|
context "for a multi-select filter" do
|
|
414
422
|
it "should not be there by default" do
|
|
415
|
-
filter(:author, multiple: true)
|
|
423
|
+
body = Capybara.string(filter(:author, multiple: true))
|
|
424
|
+
expect(body).to_not have_selector("option", text: "Any")
|
|
416
425
|
end
|
|
417
426
|
it "should be able to be enabled" do
|
|
418
|
-
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")
|
|
419
429
|
end
|
|
420
430
|
end
|
|
421
431
|
end
|