activeadmin 1.0.0.pre4 → 2.4.0
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 +5 -5
- data/CHANGELOG.md +529 -52
- data/CODE_OF_CONDUCT.md +64 -12
- data/CONTRIBUTING.md +129 -58
- data/README.md +80 -79
- data/app/assets/javascripts/active_admin/base.es6 +23 -0
- data/app/assets/javascripts/active_admin/ext/jquery-ui.es6 +7 -0
- data/app/assets/javascripts/active_admin/ext/jquery.es6 +9 -0
- data/app/assets/javascripts/active_admin/initializers/datepicker.es6 +16 -0
- data/app/assets/javascripts/active_admin/initializers/filters.es6 +45 -0
- data/app/assets/javascripts/active_admin/initializers/tabs.es6 +6 -0
- data/app/assets/javascripts/active_admin/lib/active_admin.es6 +41 -0
- data/app/assets/javascripts/active_admin/lib/batch_actions.es6 +59 -0
- data/app/assets/javascripts/active_admin/lib/checkbox-toggler.es6 +49 -0
- data/app/assets/javascripts/active_admin/lib/dropdown-menu.es6 +123 -0
- data/app/assets/javascripts/active_admin/lib/has_many.es6 +95 -0
- data/app/assets/javascripts/active_admin/lib/modal_dialog.es6 +61 -0
- data/app/assets/javascripts/active_admin/lib/per_page.es6 +47 -0
- data/app/assets/javascripts/active_admin/lib/table-checkbox-toggler.es6 +36 -0
- data/app/assets/stylesheets/active_admin/_base.scss +2 -2
- data/app/assets/stylesheets/active_admin/_forms.scss +19 -26
- data/app/assets/stylesheets/active_admin/components/_batch_actions.scss +0 -5
- data/app/assets/stylesheets/active_admin/components/_pagination.scss +11 -0
- data/app/assets/stylesheets/active_admin/components/_scopes.scss +3 -0
- data/app/assets/stylesheets/active_admin/components/_status_tags.scss +0 -4
- data/app/assets/stylesheets/active_admin/components/_tables.scss +4 -1
- data/app/assets/stylesheets/active_admin/components/_tabs.scss +1 -1
- data/app/assets/stylesheets/active_admin/mixins/_all.scss +0 -2
- data/app/assets/stylesheets/active_admin/mixins/_gradients.scss +1 -1
- data/app/assets/stylesheets/active_admin/print.scss +2 -3
- data/app/views/active_admin/devise/confirmations/new.html.erb +2 -2
- data/app/views/active_admin/devise/passwords/edit.html.erb +2 -2
- data/app/views/active_admin/devise/passwords/new.html.erb +2 -2
- data/app/views/active_admin/devise/registrations/new.html.erb +3 -4
- data/app/views/active_admin/devise/sessions/new.html.erb +2 -2
- data/app/views/active_admin/devise/shared/_error_messages.html.erb +15 -0
- data/app/views/active_admin/devise/shared/_links.erb +12 -6
- data/app/views/active_admin/devise/unlocks/new.html.erb +2 -2
- data/app/views/kaminari/active_admin/_first_page.html.erb +11 -0
- data/app/views/kaminari/active_admin/_gap.html.erb +8 -0
- data/app/views/kaminari/active_admin/_last_page.html.erb +11 -0
- data/app/views/kaminari/active_admin/_next_page.html.erb +11 -0
- data/app/views/kaminari/active_admin/_page.html.erb +12 -0
- data/app/views/kaminari/active_admin/_paginator.html.erb +25 -0
- data/app/views/kaminari/active_admin/_prev_page.html.erb +11 -0
- data/app/views/kaminari/active_admin_countless/_first_page.html.erb +11 -0
- data/app/views/kaminari/active_admin_countless/_gap.html.erb +8 -0
- data/app/views/kaminari/active_admin_countless/_next_page.html.erb +11 -0
- data/app/views/kaminari/active_admin_countless/_page.html.erb +12 -0
- data/app/views/kaminari/active_admin_countless/_paginator.html.erb +24 -0
- data/app/views/kaminari/active_admin_countless/_prev_page.html.erb +11 -0
- data/app/views/layouts/active_admin_logged_out.html.erb +2 -2
- data/config/locales/ar.yml +4 -5
- data/config/locales/bg.yml +1 -3
- data/config/locales/bs.yml +1 -2
- data/config/locales/ca.yml +2 -4
- data/config/locales/cs.yml +1 -2
- data/config/locales/da.yml +45 -14
- data/config/locales/de-CH.yml +2 -3
- data/config/locales/de.yml +30 -3
- data/config/locales/el.yml +3 -4
- data/config/locales/en-CA.yml +139 -0
- data/config/locales/en-GB.yml +44 -3
- data/config/locales/en.yml +31 -5
- data/config/locales/eo.yml +145 -0
- data/config/locales/es-MX.yml +5 -3
- data/config/locales/es.yml +32 -6
- data/config/locales/fa.yml +1 -2
- data/config/locales/fi.yml +2 -3
- data/config/locales/fr.yml +27 -5
- data/config/locales/he.yml +53 -7
- data/config/locales/hr.yml +1 -2
- data/config/locales/hu.yml +5 -2
- data/config/locales/id.yml +2 -3
- data/config/locales/it.yml +15 -7
- data/config/locales/ja.yml +8 -3
- data/config/locales/ko.yml +1 -2
- data/config/locales/lt.yml +27 -6
- data/config/locales/lv.yml +1 -2
- data/config/locales/mk.yml +134 -0
- data/config/locales/nb.yml +16 -7
- data/config/locales/nl.yml +13 -3
- data/config/locales/pl.yml +75 -5
- data/config/locales/pt-BR.yml +10 -3
- data/config/locales/pt-PT.yml +1 -2
- data/config/locales/ro.yml +1 -2
- data/config/locales/ru.yml +5 -3
- data/config/locales/sk.yml +168 -0
- data/config/locales/sv-SE.yml +4 -3
- data/config/locales/tr.yml +10 -2
- data/config/locales/uk.yml +4 -3
- data/config/locales/vi.yml +48 -8
- data/config/locales/zh-CN.yml +38 -7
- data/config/locales/zh-TW.yml +2 -3
- data/docs/.gitignore +1 -0
- data/docs/0-installation.md +19 -13
- data/docs/1-general-configuration.md +37 -4
- data/docs/10-custom-pages.md +47 -3
- data/docs/11-decorators.md +4 -0
- data/docs/12-arbre-components.md +73 -9
- data/docs/13-authorization-adapter.md +72 -35
- data/docs/14-gotchas.md +57 -19
- data/docs/2-resource-customization.md +64 -20
- data/docs/3-index-pages/custom-index.md +5 -1
- data/docs/3-index-pages/index-as-block.md +3 -5
- data/docs/3-index-pages/index-as-blog.md +4 -6
- data/docs/3-index-pages/index-as-grid.md +3 -5
- data/docs/3-index-pages/index-as-table.md +33 -12
- data/docs/3-index-pages.md +65 -9
- data/docs/4-csv-format.md +16 -0
- data/docs/5-forms.md +78 -17
- data/docs/6-show-pages.md +5 -29
- data/docs/7-sidebars.md +5 -1
- data/docs/8-custom-actions.md +18 -1
- data/docs/9-batch-actions.md +8 -4
- data/docs/CNAME +1 -0
- data/docs/Gemfile +3 -0
- data/docs/Gemfile.lock +248 -0
- data/docs/_config.yml +4 -0
- data/docs/_includes/footer.html +8 -0
- data/docs/_includes/google-analytics.html +16 -0
- data/docs/_includes/head.html +7 -0
- data/docs/_includes/toc.html +98 -0
- data/docs/_includes/top-menu.html +17 -0
- data/docs/_layouts/default.html +21 -0
- data/docs/documentation.md +60 -0
- data/docs/images/activeadmin.png +0 -0
- data/docs/images/code-header.png +0 -0
- data/docs/images/divider.png +0 -0
- data/docs/images/features.png +0 -0
- data/docs/images/tidelift.svg +14 -0
- data/docs/index.html +226 -0
- data/docs/stylesheets/main.css +1205 -0
- data/lib/active_admin/abstract_view_factory.rb +13 -51
- data/lib/active_admin/application.rb +50 -140
- data/lib/active_admin/application_settings.rb +42 -0
- data/lib/active_admin/authorization_adapter.rb +0 -3
- data/lib/active_admin/base_controller/authorization.rb +4 -7
- data/lib/active_admin/base_controller/menu.rb +10 -14
- data/lib/active_admin/base_controller.rb +8 -14
- data/lib/active_admin/batch_actions/controller.rb +3 -3
- data/lib/active_admin/batch_actions/resource_extension.rb +9 -13
- data/lib/active_admin/batch_actions/views/batch_action_form.rb +1 -1
- data/lib/active_admin/batch_actions/views/batch_action_selector.rb +1 -1
- data/lib/active_admin/batch_actions/views/selection_cells.rb +6 -5
- data/lib/active_admin/callbacks.rb +1 -1
- data/lib/active_admin/controller_action.rb +2 -1
- data/lib/active_admin/csv_builder.rb +15 -12
- data/lib/active_admin/dependency.rb +8 -76
- data/lib/active_admin/deprecation.rb +0 -25
- data/lib/active_admin/devise.rb +3 -3
- data/lib/active_admin/dsl.rb +3 -16
- data/lib/active_admin/dynamic_setting.rb +38 -0
- data/lib/active_admin/dynamic_settings_node.rb +28 -0
- data/lib/active_admin/engine.rb +5 -0
- data/lib/active_admin/error.rb +5 -3
- data/lib/active_admin/filters/active.rb +13 -14
- data/lib/active_admin/filters/active_filter.rb +124 -0
- data/lib/active_admin/filters/active_sidebar.rb +54 -0
- data/lib/active_admin/filters/forms.rb +6 -4
- data/lib/active_admin/filters/formtastic_addons.rb +2 -2
- data/lib/active_admin/filters/resource_extension.rb +28 -43
- data/lib/active_admin/filters.rb +2 -0
- data/lib/active_admin/form_builder.rb +100 -59
- data/lib/active_admin/generators/boilerplate.rb +12 -4
- data/lib/active_admin/helpers/collection.rb +2 -0
- data/lib/active_admin/helpers/scope_chain.rb +1 -0
- data/lib/active_admin/inputs/datepicker_input.rb +12 -5
- data/lib/active_admin/inputs/filters/base/search_method_select.rb +2 -2
- data/lib/active_admin/inputs/filters/date_range_input.rb +21 -8
- data/lib/active_admin/inputs/filters/select_input.rb +6 -3
- data/lib/active_admin/inputs/filters/text_input.rb +25 -0
- data/lib/active_admin/inputs.rb +1 -0
- data/lib/active_admin/localizers/resource_localizer.rb +35 -0
- data/lib/active_admin/localizers.rb +11 -0
- data/lib/active_admin/menu.rb +6 -12
- data/lib/active_admin/menu_collection.rb +0 -2
- data/lib/active_admin/menu_item.rb +4 -32
- data/lib/active_admin/namespace.rb +36 -17
- data/lib/active_admin/namespace_settings.rb +123 -0
- data/lib/active_admin/order_clause.rb +30 -8
- data/lib/active_admin/orm/active_record/comments/comment.rb +3 -17
- data/lib/active_admin/orm/active_record/comments/views/active_admin_comments.rb +19 -7
- data/lib/active_admin/orm/active_record/comments.rb +17 -11
- data/lib/active_admin/page.rb +23 -4
- data/lib/active_admin/page_controller.rb +2 -6
- data/lib/active_admin/page_dsl.rb +5 -1
- data/lib/active_admin/page_presenter.rb +2 -1
- data/lib/active_admin/pundit_adapter.rb +18 -5
- data/lib/active_admin/resource/action_items.rb +17 -5
- data/lib/active_admin/resource/attributes.rb +47 -0
- data/lib/active_admin/resource/belongs_to.rb +10 -1
- data/lib/active_admin/resource/menu.rb +7 -4
- data/lib/active_admin/resource/model.rb +15 -0
- data/lib/active_admin/resource/naming.rb +3 -3
- data/lib/active_admin/resource/ordering.rb +11 -0
- data/lib/active_admin/resource/page_presenters.rb +1 -1
- data/lib/active_admin/resource/routes.rb +52 -20
- data/lib/active_admin/resource/scopes.rb +5 -3
- data/lib/active_admin/resource/sidebars.rb +1 -1
- data/lib/active_admin/resource.rb +59 -7
- data/lib/active_admin/resource_collection.rb +2 -2
- data/lib/active_admin/resource_controller/action_builder.rb +10 -0
- data/lib/active_admin/resource_controller/data_access.rb +32 -27
- data/lib/active_admin/resource_controller/decorators.rb +5 -5
- data/lib/active_admin/resource_controller/polymorphic_routes.rb +36 -0
- data/lib/active_admin/resource_controller/resource_class_methods.rb +2 -0
- data/lib/active_admin/resource_controller/scoping.rb +1 -1
- data/lib/active_admin/resource_controller.rb +15 -0
- data/lib/active_admin/resource_dsl.rb +58 -24
- data/lib/active_admin/router.rb +90 -82
- data/lib/active_admin/scope.rb +20 -12
- data/lib/active_admin/settings_node.rb +19 -0
- data/lib/active_admin/sidebar_section.rb +3 -1
- data/lib/active_admin/version.rb +1 -1
- data/lib/active_admin/view_helpers/auto_link_helper.rb +2 -2
- data/lib/active_admin/view_helpers/breadcrumb_helper.rb +2 -2
- data/lib/active_admin/view_helpers/display_helper.rb +28 -16
- data/lib/active_admin/view_helpers/download_format_links_helper.rb +13 -0
- data/lib/active_admin/view_helpers/fields_for.rb +1 -2
- data/lib/active_admin/view_helpers/form_helper.rb +2 -2
- data/lib/active_admin/view_helpers/method_or_proc_helper.rb +8 -1
- data/lib/active_admin/view_helpers/scope_name_helper.rb +16 -0
- data/lib/active_admin/view_helpers.rb +2 -1
- data/lib/active_admin/views/action_items.rb +1 -1
- data/lib/active_admin/views/components/active_admin_form.rb +43 -11
- data/lib/active_admin/views/components/attributes_table.rb +4 -4
- data/lib/active_admin/views/components/columns.rb +3 -3
- data/lib/active_admin/views/components/dropdown_menu.rb +4 -4
- data/lib/active_admin/views/components/index_list.rb +4 -3
- data/lib/active_admin/views/components/menu.rb +32 -0
- data/lib/active_admin/views/components/menu_item.rb +58 -0
- data/lib/active_admin/views/components/paginated_collection.rb +7 -11
- data/lib/active_admin/views/components/scopes.rb +14 -8
- data/lib/active_admin/views/components/sidebar.rb +13 -0
- data/lib/active_admin/views/components/site_title.rb +5 -6
- data/lib/active_admin/views/components/status_tag.rb +11 -16
- data/lib/active_admin/views/components/table_for.rb +7 -16
- data/lib/active_admin/views/components/tabs.rb +15 -3
- data/lib/active_admin/views/footer.rb +14 -4
- data/lib/active_admin/views/header.rb +3 -16
- data/lib/active_admin/views/index_as_blog.rb +2 -3
- data/lib/active_admin/views/index_as_grid.rb +25 -25
- data/lib/active_admin/views/index_as_table.rb +39 -13
- data/lib/active_admin/views/pages/base.rb +36 -57
- data/lib/active_admin/views/pages/form.rb +2 -3
- data/lib/active_admin/views/pages/layout.rb +1 -1
- data/lib/active_admin/views/pages/show.rb +8 -2
- data/lib/active_admin/views/tabbed_navigation.rb +4 -59
- data/lib/active_admin/views/title_bar.rb +4 -4
- data/lib/active_admin/views.rb +1 -1
- data/lib/active_admin.rb +11 -7
- data/lib/generators/active_admin/assets/assets_generator.rb +2 -2
- data/lib/generators/active_admin/assets/templates/active_admin.js +1 -0
- data/lib/generators/active_admin/devise/devise_generator.rb +8 -5
- data/lib/generators/active_admin/install/install_generator.rb +7 -3
- data/lib/generators/active_admin/install/templates/active_admin.rb.erb +60 -4
- data/lib/generators/active_admin/install/templates/{admin_user.rb.erb → admin_users.rb.erb} +1 -3
- data/lib/generators/active_admin/install/templates/dashboard.rb +2 -3
- data/lib/generators/active_admin/install/templates/migrations/{create_active_admin_comments.rb → create_active_admin_comments.rb.erb} +2 -5
- data/lib/generators/active_admin/page/page_generator.rb +1 -1
- data/lib/generators/active_admin/resource/resource_generator.rb +2 -2
- data/lib/generators/active_admin/resource/templates/admin.rb.erb +46 -0
- data/lib/ransack_ext.rb +5 -5
- data/vendor/assets/javascripts/jquery-ui/data.js +41 -0
- data/vendor/assets/javascripts/jquery-ui/disable-selection.js +48 -0
- data/vendor/assets/javascripts/jquery-ui/escape-selector.js +23 -0
- data/vendor/assets/javascripts/jquery-ui/focusable.js +86 -0
- data/vendor/assets/javascripts/jquery-ui/form-reset-mixin.js +80 -0
- data/vendor/assets/javascripts/jquery-ui/form.js +22 -0
- data/vendor/assets/javascripts/jquery-ui/ie.js +17 -0
- data/vendor/assets/javascripts/jquery-ui/keycode.js +47 -0
- data/vendor/assets/javascripts/jquery-ui/labels.js +65 -0
- data/vendor/assets/javascripts/jquery-ui/plugin.js +46 -0
- data/vendor/assets/javascripts/jquery-ui/position.js +500 -0
- data/vendor/assets/javascripts/jquery-ui/safe-active-element.js +42 -0
- data/vendor/assets/javascripts/jquery-ui/safe-blur.js +23 -0
- data/vendor/assets/javascripts/jquery-ui/scroll-parent.js +47 -0
- data/vendor/assets/javascripts/jquery-ui/tabbable.js +38 -0
- data/vendor/assets/javascripts/jquery-ui/unique-id.js +51 -0
- data/vendor/assets/javascripts/jquery-ui/version.js +17 -0
- data/vendor/assets/javascripts/jquery-ui/widget.js +735 -0
- data/vendor/assets/javascripts/jquery-ui/widgets/button.js +391 -0
- data/vendor/assets/javascripts/jquery-ui/widgets/checkboxradio.js +291 -0
- data/vendor/assets/javascripts/jquery-ui/widgets/controlgroup.js +300 -0
- data/vendor/assets/javascripts/jquery-ui/widgets/datepicker.js +2123 -0
- data/vendor/assets/javascripts/jquery-ui/widgets/dialog.js +954 -0
- data/vendor/assets/javascripts/jquery-ui/widgets/draggable.js +1259 -0
- data/vendor/assets/javascripts/jquery-ui/widgets/mouse.js +230 -0
- data/vendor/assets/javascripts/jquery-ui/widgets/resizable.js +1207 -0
- data/vendor/assets/javascripts/jquery-ui/widgets/sortable.js +1561 -0
- data/vendor/assets/javascripts/jquery-ui/widgets/tabs.js +931 -0
- data/vendor/assets/stylesheets/active_admin/_normalize.scss +447 -0
- metadata +190 -539
- data/.gitignore +0 -49
- data/.hound.yml +0 -14
- data/.travis.yml +0 -46
- data/.yardopts +0 -8
- data/Gemfile +0 -75
- data/Guardfile +0 -8
- data/Rakefile +0 -33
- data/activeadmin.gemspec +0 -31
- data/app/assets/images/active_admin/datepicker/datepicker-input-icon.png +0 -0
- data/app/assets/javascripts/active_admin/base.js.coffee +0 -9
- data/app/assets/javascripts/active_admin/ext/jquery-ui.js.coffee +0 -6
- data/app/assets/javascripts/active_admin/ext/jquery.js.coffee +0 -7
- data/app/assets/javascripts/active_admin/initializers/batch_actions.js.coffee +0 -7
- data/app/assets/javascripts/active_admin/initializers/datepicker.js.coffee +0 -10
- data/app/assets/javascripts/active_admin/initializers/filters.js.coffee +0 -15
- data/app/assets/javascripts/active_admin/initializers/tabs.js.coffee +0 -3
- data/app/assets/javascripts/active_admin/jquery_ui.js.erb +0 -11
- data/app/assets/javascripts/active_admin/lib/batch_actions.js.coffee +0 -39
- data/app/assets/javascripts/active_admin/lib/checkbox-toggler.js.coffee +0 -36
- data/app/assets/javascripts/active_admin/lib/dropdown-menu.js.coffee +0 -101
- data/app/assets/javascripts/active_admin/lib/flash.js.coffee +0 -19
- data/app/assets/javascripts/active_admin/lib/has_many.js.coffee +0 -79
- data/app/assets/javascripts/active_admin/lib/modal_dialog.js.coffee +0 -45
- data/app/assets/javascripts/active_admin/lib/per_page.js.coffee +0 -31
- data/app/assets/javascripts/active_admin/lib/table-checkbox-toggler.js.coffee +0 -24
- data/app/assets/stylesheets/active_admin/mixins/_reset.scss +0 -165
- data/cucumber.yml +0 -3
- data/features/action_item.feature +0 -73
- data/features/authorization.feature +0 -64
- data/features/authorization_cancan.feature +0 -52
- data/features/authorization_pundit.feature +0 -37
- data/features/belongs_to.feature +0 -66
- data/features/breadcrumb.feature +0 -75
- data/features/comments/commenting.feature +0 -171
- data/features/comments/viewing_index.feature +0 -19
- data/features/dashboard.feature +0 -16
- data/features/decorators.feature +0 -43
- data/features/development_reloading.feature +0 -30
- data/features/edit_page.feature +0 -117
- data/features/favicon.feature +0 -20
- data/features/first_boot.feature +0 -16
- data/features/global_navigation.feature +0 -29
- data/features/i18n.feature +0 -43
- data/features/index/batch_actions.feature +0 -196
- data/features/index/filters.feature +0 -161
- data/features/index/format_as_csv.feature +0 -203
- data/features/index/formats.feature +0 -66
- data/features/index/index_as_block.feature +0 -15
- data/features/index/index_as_blog.feature +0 -69
- data/features/index/index_as_grid.feature +0 -45
- data/features/index/index_as_table.feature +0 -291
- data/features/index/index_blank_slate.feature +0 -83
- data/features/index/index_parameters.feature +0 -75
- data/features/index/index_scope_to.feature +0 -56
- data/features/index/index_scopes.feature +0 -251
- data/features/index/page_title.feature +0 -42
- data/features/index/pagination.feature +0 -63
- data/features/index/switch_index_view.feature +0 -73
- data/features/menu.feature +0 -53
- data/features/meta_tags.feature +0 -21
- data/features/new_page.feature +0 -109
- data/features/registering_assets.feature +0 -34
- data/features/registering_pages.feature +0 -148
- data/features/registering_resources.feature +0 -33
- data/features/renamed_resource.feature +0 -32
- data/features/root_to.feature +0 -17
- data/features/show/columns.feature +0 -40
- data/features/show/default_content.feature +0 -44
- data/features/show/page_title.feature +0 -59
- data/features/show/tabs.feature +0 -27
- data/features/sidebar_sections.feature +0 -210
- data/features/site_title.feature +0 -47
- data/features/specifying_actions.feature +0 -93
- data/features/step_definitions/action_item_steps.rb +0 -7
- data/features/step_definitions/action_link_steps.rb +0 -20
- data/features/step_definitions/additional_web_steps.rb +0 -81
- data/features/step_definitions/asset_steps.rb +0 -15
- data/features/step_definitions/attribute_steps.rb +0 -18
- data/features/step_definitions/batch_action_steps.rb +0 -81
- data/features/step_definitions/blog_steps.rb +0 -3
- data/features/step_definitions/breadcrumb_steps.rb +0 -3
- data/features/step_definitions/column_steps.rb +0 -8
- data/features/step_definitions/comment_steps.rb +0 -12
- data/features/step_definitions/configuration_steps.rb +0 -100
- data/features/step_definitions/dashboard_steps.rb +0 -15
- data/features/step_definitions/factory_steps.rb +0 -35
- data/features/step_definitions/filter_steps.rb +0 -39
- data/features/step_definitions/flash_steps.rb +0 -11
- data/features/step_definitions/format_steps.rb +0 -52
- data/features/step_definitions/i18n_steps.rb +0 -3
- data/features/step_definitions/index_scope_steps.rb +0 -21
- data/features/step_definitions/index_views_steps.rb +0 -3
- data/features/step_definitions/layout_steps.rb +0 -3
- data/features/step_definitions/member_link_steps.rb +0 -7
- data/features/step_definitions/menu_steps.rb +0 -11
- data/features/step_definitions/meta_tag_steps.rb +0 -3
- data/features/step_definitions/pagination_steps.rb +0 -15
- data/features/step_definitions/sidebar_steps.rb +0 -13
- data/features/step_definitions/site_title_steps.rb +0 -17
- data/features/step_definitions/symbol_leak_steps.rb +0 -3
- data/features/step_definitions/tab_steps.rb +0 -8
- data/features/step_definitions/table_steps.rb +0 -120
- data/features/step_definitions/user_steps.rb +0 -45
- data/features/step_definitions/web_steps.rb +0 -85
- data/features/sti_resource.feature +0 -65
- data/features/strong_parameters.feature +0 -73
- data/features/support/env.rb +0 -162
- data/features/support/paths.rb +0 -71
- data/features/support/selectors.rb +0 -45
- data/features/symbol_leak.feature +0 -35
- data/features/users/logging_in.feature +0 -34
- data/features/users/logging_out.feature +0 -13
- data/features/users/resetting_password.feature +0 -34
- data/lib/active_admin/event.rb +0 -24
- data/lib/active_admin/filters/humanized.rb +0 -68
- data/lib/active_admin/helpers/settings.rb +0 -115
- data/lib/active_admin/reloader.rb +0 -25
- data/lib/generators/active_admin/assets/templates/active_admin.js.coffee +0 -1
- data/lib/generators/active_admin/resource/templates/admin.rb +0 -45
- data/script/local +0 -53
- data/script/travis_cache +0 -107
- data/script/use_rails +0 -53
- data/spec/javascripts/coffeescripts/jquery.aa.checkbox-toggler-spec.js.coffee +0 -50
- data/spec/javascripts/coffeescripts/jquery.aa.flash.js.coffee +0 -25
- data/spec/javascripts/coffeescripts/jquery.aa.table-checkbox-toggler-spec.js.coffee +0 -34
- data/spec/javascripts/fixtures/checkboxes.html +0 -9
- data/spec/javascripts/fixtures/flashes.html +0 -2
- data/spec/javascripts/fixtures/table_checkboxes.html +0 -17
- data/spec/javascripts/helpers/SpecHelper.js +0 -3
- data/spec/javascripts/support/jasmine.yml +0 -74
- data/spec/javascripts/support/jasmine_config.rb +0 -23
- data/spec/javascripts/support/jasmine_runner.rb +0 -32
- data/spec/rails_helper.rb +0 -169
- data/spec/requests/default_namespace_spec.rb +0 -61
- data/spec/requests/javascript_spec.rb +0 -22
- data/spec/requests/memory_spec.rb +0 -21
- data/spec/requests/stylesheets_spec.rb +0 -18
- data/spec/spec_helper.rb +0 -17
- data/spec/support/active_admin_request_helpers.rb +0 -27
- data/spec/support/deferred_garbage_collection.rb +0 -19
- data/spec/support/detect_rails_version.rb +0 -34
- data/spec/support/jslint.yml +0 -80
- data/spec/support/rails_template.rb +0 -158
- data/spec/support/rails_template_with_data.rb +0 -55
- data/spec/support/templates/admin/stores.rb +0 -9
- data/spec/support/templates/en.yml +0 -8
- data/spec/support/templates/policies/active_admin/comment_policy.rb +0 -9
- data/spec/support/templates/policies/active_admin/page_policy.rb +0 -18
- data/spec/support/templates/policies/admin_user_policy.rb +0 -11
- data/spec/support/templates/policies/application_policy.rb +0 -45
- data/spec/support/templates/policies/category_policy.rb +0 -7
- data/spec/support/templates/policies/post_policy.rb +0 -15
- data/spec/support/templates/policies/store_policy.rb +0 -11
- data/spec/support/templates/policies/user_policy.rb +0 -11
- data/spec/support/templates/post_decorator.rb +0 -11
- data/spec/unit/abstract_view_factory_spec.rb +0 -79
- data/spec/unit/action_builder_spec.rb +0 -134
- data/spec/unit/active_admin_spec.rb +0 -11
- data/spec/unit/application_spec.rb +0 -165
- data/spec/unit/asset_registration_spec.rb +0 -52
- data/spec/unit/authorization/authorization_adapter_spec.rb +0 -61
- data/spec/unit/authorization/controller_authorization_spec.rb +0 -39
- data/spec/unit/authorization/index_overriding_spec.rb +0 -23
- data/spec/unit/auto_link_spec.rb +0 -69
- data/spec/unit/batch_actions/resource_spec.rb +0 -97
- data/spec/unit/batch_actions/settings_spec.rb +0 -61
- data/spec/unit/belongs_to_spec.rb +0 -65
- data/spec/unit/cancan_adapter_spec.rb +0 -43
- data/spec/unit/comments_spec.rb +0 -188
- data/spec/unit/component_spec.rb +0 -18
- data/spec/unit/config_shared_examples.rb +0 -59
- data/spec/unit/controller_filters_spec.rb +0 -41
- data/spec/unit/csv_builder_spec.rb +0 -303
- data/spec/unit/dependency_spec.rb +0 -135
- data/spec/unit/devise_spec.rb +0 -96
- data/spec/unit/dsl_spec.rb +0 -122
- data/spec/unit/filters/filter_form_builder_spec.rb +0 -434
- data/spec/unit/filters/humanized_spec.rb +0 -56
- data/spec/unit/filters/resource_spec.rb +0 -128
- data/spec/unit/form_builder_spec.rb +0 -815
- data/spec/unit/generators/install_spec.rb +0 -24
- data/spec/unit/helpers/collection_spec.rb +0 -65
- data/spec/unit/helpers/scope_chain_spec.rb +0 -36
- data/spec/unit/helpers/settings_spec.rb +0 -30
- data/spec/unit/i18n_spec.rb +0 -12
- data/spec/unit/menu_collection_spec.rb +0 -62
- data/spec/unit/menu_item_spec.rb +0 -143
- data/spec/unit/menu_spec.rb +0 -71
- data/spec/unit/namespace/authorization_spec.rb +0 -27
- data/spec/unit/namespace/register_page_spec.rb +0 -73
- data/spec/unit/namespace/register_resource_spec.rb +0 -160
- data/spec/unit/namespace_spec.rb +0 -103
- data/spec/unit/order_clause_spec.rb +0 -81
- data/spec/unit/page_controller_spec.rb +0 -5
- data/spec/unit/page_spec.rb +0 -78
- data/spec/unit/pretty_format_spec.rb +0 -77
- data/spec/unit/pundit_adapter_spec.rb +0 -98
- data/spec/unit/resource/action_items_spec.rb +0 -65
- data/spec/unit/resource/includes_spec.rb +0 -21
- data/spec/unit/resource/menu_spec.rb +0 -18
- data/spec/unit/resource/naming_spec.rb +0 -122
- data/spec/unit/resource/page_presenters_spec.rb +0 -44
- data/spec/unit/resource/pagination_spec.rb +0 -38
- data/spec/unit/resource/routes_spec.rb +0 -77
- data/spec/unit/resource/scopes_spec.rb +0 -50
- data/spec/unit/resource/sidebars_spec.rb +0 -43
- data/spec/unit/resource_collection_spec.rb +0 -175
- data/spec/unit/resource_controller/data_access_spec.rb +0 -140
- data/spec/unit/resource_controller/decorators_spec.rb +0 -94
- data/spec/unit/resource_controller/sidebars_spec.rb +0 -38
- data/spec/unit/resource_controller_spec.rb +0 -269
- data/spec/unit/resource_registration_spec.rb +0 -56
- data/spec/unit/resource_spec.rb +0 -331
- data/spec/unit/routing_spec.rb +0 -185
- data/spec/unit/scope_spec.rb +0 -185
- data/spec/unit/settings_spec.rb +0 -118
- data/spec/unit/view_factory_spec.rb +0 -19
- data/spec/unit/view_helpers/breadcrumbs_spec.rb +0 -217
- data/spec/unit/view_helpers/display_helper_spec.rb +0 -165
- data/spec/unit/view_helpers/download_format_links_helper_spec.rb +0 -39
- data/spec/unit/view_helpers/fields_for_spec.rb +0 -50
- data/spec/unit/view_helpers/flash_helper_spec.rb +0 -25
- data/spec/unit/view_helpers/form_helper_spec.rb +0 -43
- data/spec/unit/view_helpers/method_or_proc_helper_spec.rb +0 -139
- data/spec/unit/views/components/attributes_table_spec.rb +0 -272
- data/spec/unit/views/components/batch_action_selector_spec.rb +0 -43
- data/spec/unit/views/components/blank_slate_spec.rb +0 -27
- data/spec/unit/views/components/columns_spec.rb +0 -189
- data/spec/unit/views/components/index_list_spec.rb +0 -35
- data/spec/unit/views/components/index_table_for_spec.rb +0 -127
- data/spec/unit/views/components/paginated_collection_spec.rb +0 -249
- data/spec/unit/views/components/panel_spec.rb +0 -58
- data/spec/unit/views/components/sidebar_section_spec.rb +0 -68
- data/spec/unit/views/components/site_title_spec.rb +0 -78
- data/spec/unit/views/components/status_tag_spec.rb +0 -249
- data/spec/unit/views/components/table_for_spec.rb +0 -434
- data/spec/unit/views/components/tabs_spec.rb +0 -39
- data/spec/unit/views/components/unsupported_browser_spec.rb +0 -41
- data/spec/unit/views/index_as_blog_spec.rb +0 -76
- data/spec/unit/views/pages/form_spec.rb +0 -51
- data/spec/unit/views/pages/index_spec.rb +0 -60
- data/spec/unit/views/pages/layout_spec.rb +0 -59
- data/spec/unit/views/pages/show_spec.rb +0 -33
- data/spec/unit/views/tabbed_navigation_spec.rb +0 -158
- data/tasks/docs.rake +0 -37
- data/tasks/parallel_tests.rake +0 -66
- data/tasks/test.rake +0 -91
- data/tasks/yard.rake +0 -9
@@ -1,815 +0,0 @@
|
|
1
|
-
require 'rails_helper'
|
2
|
-
require "rspec/mocks/standalone"
|
3
|
-
|
4
|
-
describe ActiveAdmin::FormBuilder do
|
5
|
-
|
6
|
-
# Setup an ActionView::Base object which can be used for
|
7
|
-
# generating the form for.
|
8
|
-
let(:helpers) do
|
9
|
-
view = action_view
|
10
|
-
def view.posts_path
|
11
|
-
"/posts"
|
12
|
-
end
|
13
|
-
|
14
|
-
def view.protect_against_forgery?
|
15
|
-
false
|
16
|
-
end
|
17
|
-
|
18
|
-
def view.url_for(*args)
|
19
|
-
if args.first == {action: "index"}
|
20
|
-
posts_path
|
21
|
-
else
|
22
|
-
super
|
23
|
-
end
|
24
|
-
end
|
25
|
-
|
26
|
-
def view.a_helper_method
|
27
|
-
"A Helper Method"
|
28
|
-
end
|
29
|
-
|
30
|
-
def view.fa_icon(*args)
|
31
|
-
args.inspect
|
32
|
-
end
|
33
|
-
|
34
|
-
view
|
35
|
-
end
|
36
|
-
|
37
|
-
def build_form(options = {}, form_object = Post.new, &block)
|
38
|
-
options = {url: helpers.posts_path}.merge(options)
|
39
|
-
|
40
|
-
form = render_arbre_component({form_object: form_object, form_options: options, form_block: block}, helpers) do
|
41
|
-
active_admin_form_for(assigns[:form_object], assigns[:form_options], &assigns[:form_block])
|
42
|
-
end.to_s
|
43
|
-
|
44
|
-
Capybara.string(form)
|
45
|
-
end
|
46
|
-
|
47
|
-
context "in general" do
|
48
|
-
context "it without custom settings" do
|
49
|
-
let :body do
|
50
|
-
build_form do |f|
|
51
|
-
f.inputs do
|
52
|
-
f.input :title
|
53
|
-
f.input :body
|
54
|
-
end
|
55
|
-
end
|
56
|
-
end
|
57
|
-
|
58
|
-
it "should generate a fieldset with a inputs class" do
|
59
|
-
expect(body).to have_selector("fieldset.inputs")
|
60
|
-
end
|
61
|
-
end
|
62
|
-
|
63
|
-
context "it with custom settings" do
|
64
|
-
let :body do
|
65
|
-
build_form do |f|
|
66
|
-
f.inputs class: "custom_class" do
|
67
|
-
f.input :title
|
68
|
-
f.input :body
|
69
|
-
end
|
70
|
-
end
|
71
|
-
end
|
72
|
-
|
73
|
-
it "should generate a fieldset with a inputs and custom class" do
|
74
|
-
expect(body).to have_selector("fieldset.inputs.custom_class")
|
75
|
-
end
|
76
|
-
end
|
77
|
-
end
|
78
|
-
|
79
|
-
context "in general with actions" do
|
80
|
-
let :body do
|
81
|
-
build_form do |f|
|
82
|
-
f.inputs do
|
83
|
-
f.input :title
|
84
|
-
f.input :body
|
85
|
-
end
|
86
|
-
f.actions do
|
87
|
-
f.action :submit, label: "Submit Me"
|
88
|
-
f.action :submit, label: "Another Button"
|
89
|
-
end
|
90
|
-
end
|
91
|
-
end
|
92
|
-
|
93
|
-
it "should generate a text input" do
|
94
|
-
expect(body).to have_selector("input[type=text][name='post[title]']")
|
95
|
-
end
|
96
|
-
it "should generate a textarea" do
|
97
|
-
expect(body).to have_selector("textarea[name='post[body]']")
|
98
|
-
end
|
99
|
-
it "should only generate the form once" do
|
100
|
-
expect(body).to have_selector("form", count: 1)
|
101
|
-
end
|
102
|
-
it "should generate actions" do
|
103
|
-
expect(body).to have_selector("input[type=submit][value='Submit Me']")
|
104
|
-
expect(body).to have_selector("input[type=submit][value='Another Button']")
|
105
|
-
end
|
106
|
-
end
|
107
|
-
|
108
|
-
context "when polymorphic relationship" do
|
109
|
-
it "should raise error" do
|
110
|
-
expect {
|
111
|
-
comment = ActiveAdmin::Comment.new
|
112
|
-
build_form({url: "admins/comments"}, comment) do |f|
|
113
|
-
f.inputs :resource
|
114
|
-
end
|
115
|
-
}.to raise_error(Formtastic::PolymorphicInputWithoutCollectionError)
|
116
|
-
end
|
117
|
-
end
|
118
|
-
|
119
|
-
describe "passing in options with actions" do
|
120
|
-
let :body do
|
121
|
-
build_form html: { multipart: true } do |f|
|
122
|
-
f.inputs :title
|
123
|
-
f.actions
|
124
|
-
end
|
125
|
-
end
|
126
|
-
it "should pass the options on to the form" do
|
127
|
-
expect(body).to have_selector("form[enctype='multipart/form-data']")
|
128
|
-
end
|
129
|
-
end
|
130
|
-
|
131
|
-
if Rails::VERSION::MAJOR > 3
|
132
|
-
context "file input present" do
|
133
|
-
let :body do
|
134
|
-
build_form do |f|
|
135
|
-
f.input :body, as: :file
|
136
|
-
end
|
137
|
-
end
|
138
|
-
|
139
|
-
it "adds multipart attribute automatically" do
|
140
|
-
expect(body).to have_selector("form[enctype='multipart/form-data']")
|
141
|
-
end
|
142
|
-
end
|
143
|
-
end
|
144
|
-
|
145
|
-
context "with actions" do
|
146
|
-
it "should generate the form once" do
|
147
|
-
body = build_form do |f|
|
148
|
-
f.inputs do
|
149
|
-
f.input :title
|
150
|
-
end
|
151
|
-
f.actions
|
152
|
-
end
|
153
|
-
expect(body).to have_selector("[id=post_title]", count: 1)
|
154
|
-
end
|
155
|
-
it "should generate one button and a cancel link" do
|
156
|
-
body = build_form do |f|
|
157
|
-
f.actions
|
158
|
-
end
|
159
|
-
expect(body).to have_selector("[type=submit]", count: 1)
|
160
|
-
expect(body).to have_selector("[class=cancel]", count: 1)
|
161
|
-
end
|
162
|
-
it "should generate multiple actions" do
|
163
|
-
body = build_form do |f|
|
164
|
-
f.actions do
|
165
|
-
f.action :submit, label: "Create & Continue"
|
166
|
-
f.action :submit, label: "Create & Edit"
|
167
|
-
end
|
168
|
-
end
|
169
|
-
expect(body).to have_selector("[type=submit]", count: 2)
|
170
|
-
expect(body).to have_selector("[class=cancel]", count: 0)
|
171
|
-
end
|
172
|
-
|
173
|
-
end
|
174
|
-
|
175
|
-
context "with Arbre inside" do
|
176
|
-
it "should render the Arbre in the expected place" do
|
177
|
-
body = build_form do |f|
|
178
|
-
div do
|
179
|
-
h1 'Heading'
|
180
|
-
end
|
181
|
-
f.inputs do
|
182
|
-
span 'Top note'
|
183
|
-
f.input :title
|
184
|
-
span 'Bottom note'
|
185
|
-
end
|
186
|
-
h3 'Footer'
|
187
|
-
f.actions
|
188
|
-
end
|
189
|
-
|
190
|
-
expect(body).to have_selector("div > h1")
|
191
|
-
expect(body).to have_selector("h1", count: 1)
|
192
|
-
expect(body).to have_selector(".inputs > ol > span")
|
193
|
-
expect(body).to have_selector("span", count: 2)
|
194
|
-
end
|
195
|
-
it "should allow a simplified syntax" do
|
196
|
-
body = build_form do |f|
|
197
|
-
div do
|
198
|
-
h1 'Heading'
|
199
|
-
end
|
200
|
-
inputs do
|
201
|
-
span 'Top note'
|
202
|
-
input :title
|
203
|
-
span 'Bottom note'
|
204
|
-
end
|
205
|
-
h3 'Footer'
|
206
|
-
actions
|
207
|
-
end
|
208
|
-
|
209
|
-
expect(body).to have_selector("div > h1")
|
210
|
-
expect(body).to have_selector("h1", count: 1)
|
211
|
-
expect(body).to have_selector(".inputs > ol > span")
|
212
|
-
expect(body).to have_selector("span", count: 2)
|
213
|
-
end
|
214
|
-
end
|
215
|
-
|
216
|
-
context "without passing a block to inputs" do
|
217
|
-
let :body do
|
218
|
-
build_form do |f|
|
219
|
-
f.inputs :title, :body
|
220
|
-
end
|
221
|
-
end
|
222
|
-
it "should have a title input" do
|
223
|
-
expect(body).to have_selector("input[type=text][name='post[title]']")
|
224
|
-
end
|
225
|
-
it "should have a body textarea" do
|
226
|
-
expect(body).to have_selector("textarea[name='post[body]']")
|
227
|
-
end
|
228
|
-
end
|
229
|
-
|
230
|
-
context "with semantic fields for" do
|
231
|
-
let :body do
|
232
|
-
build_form do |f|
|
233
|
-
f.inputs do
|
234
|
-
f.input :title
|
235
|
-
f.input :body
|
236
|
-
end
|
237
|
-
f.form_builder.instance_eval do
|
238
|
-
@object.author = User.new
|
239
|
-
end
|
240
|
-
f.semantic_fields_for :author do |author|
|
241
|
-
author.inputs :first_name, :last_name
|
242
|
-
end
|
243
|
-
end
|
244
|
-
end
|
245
|
-
it "should generate a nested text input once" do
|
246
|
-
expect(body).to have_selector("[id=post_author_attributes_first_name_input]", count: 1)
|
247
|
-
end
|
248
|
-
end
|
249
|
-
|
250
|
-
context "with collection inputs" do
|
251
|
-
before do
|
252
|
-
User.create first_name: "John", last_name: "Doe"
|
253
|
-
User.create first_name: "Jane", last_name: "Doe"
|
254
|
-
end
|
255
|
-
|
256
|
-
describe "as select" do
|
257
|
-
let :body do
|
258
|
-
build_form do |f|
|
259
|
-
f.input :author, include_blank: false
|
260
|
-
end
|
261
|
-
end
|
262
|
-
it "should create 2 options" do
|
263
|
-
expect(body).to have_selector("option", count: 2)
|
264
|
-
end
|
265
|
-
end
|
266
|
-
|
267
|
-
describe "as radio buttons" do
|
268
|
-
let :body do
|
269
|
-
build_form do |f|
|
270
|
-
f.input :author, as: :radio
|
271
|
-
end
|
272
|
-
end
|
273
|
-
it "should create 2 radio buttons" do
|
274
|
-
expect(body).to have_selector("[type=radio]", count: 2)
|
275
|
-
end
|
276
|
-
end
|
277
|
-
|
278
|
-
end
|
279
|
-
|
280
|
-
context "with a has_one relation on an author's profile" do
|
281
|
-
let :body do
|
282
|
-
author = user()
|
283
|
-
build_form do |f|
|
284
|
-
f.inputs do
|
285
|
-
f.input :title
|
286
|
-
f.input :body
|
287
|
-
end
|
288
|
-
f.form_builder.instance_eval do
|
289
|
-
@object.author = author
|
290
|
-
end
|
291
|
-
f.inputs name: 'Author', for: :author do |author|
|
292
|
-
author.has_many :profile, allow_destroy: true do |profile|
|
293
|
-
profile.input :bio
|
294
|
-
end
|
295
|
-
end
|
296
|
-
end
|
297
|
-
end
|
298
|
-
|
299
|
-
it "should see the button to add profile" do
|
300
|
-
def user
|
301
|
-
User.new
|
302
|
-
end
|
303
|
-
expect(body).to have_selector("a[contains(data-html,'post[author_attributes][profile_attributes][bio]')]")
|
304
|
-
end
|
305
|
-
|
306
|
-
it "should see the profile fields for an existing profile" do
|
307
|
-
def user
|
308
|
-
u = User.new
|
309
|
-
u.profile = Profile.new
|
310
|
-
u
|
311
|
-
end
|
312
|
-
expect(body).to have_selector("[id='post_author_attributes_profile_attributes_bio']", count: 1)
|
313
|
-
expect(body).to have_selector("textarea[name='post[author_attributes][profile_attributes][bio]']")
|
314
|
-
end
|
315
|
-
end
|
316
|
-
|
317
|
-
shared_examples :inputs_with_for_expectation do
|
318
|
-
it "should generate a nested text input once" do
|
319
|
-
expect(body).to have_selector("[id=post_author_attributes_first_name_input]", count: 1)
|
320
|
-
expect(body).to have_selector("[id=post_author_attributes_last_name_input]", count: 1)
|
321
|
-
end
|
322
|
-
it "should add author first and last name fields" do
|
323
|
-
expect(body).to have_selector("input[name='post[author_attributes][first_name]']")
|
324
|
-
expect(body).to have_selector("input[name='post[author_attributes][last_name]']")
|
325
|
-
end
|
326
|
-
end
|
327
|
-
|
328
|
-
context "with inputs 'for'" do
|
329
|
-
let :body do
|
330
|
-
build_form do |f|
|
331
|
-
f.inputs do
|
332
|
-
f.input :title
|
333
|
-
f.input :body
|
334
|
-
end
|
335
|
-
f.form_builder.instance_eval do
|
336
|
-
@object.author = User.new
|
337
|
-
end
|
338
|
-
f.inputs name: 'Author', for: :author do |author|
|
339
|
-
author.inputs :first_name, :last_name
|
340
|
-
end
|
341
|
-
end
|
342
|
-
end
|
343
|
-
|
344
|
-
include_examples :inputs_with_for_expectation
|
345
|
-
end
|
346
|
-
|
347
|
-
context "with two input fields 'for' at the end of block" do
|
348
|
-
let :body do
|
349
|
-
build_form do |f|
|
350
|
-
f.inputs do
|
351
|
-
f.input :title
|
352
|
-
f.input :body
|
353
|
-
end
|
354
|
-
f.form_builder.instance_eval do
|
355
|
-
@object.author = User.new
|
356
|
-
end
|
357
|
-
f.inputs name: 'Author', for: :author do |author|
|
358
|
-
author.input :first_name
|
359
|
-
author.input :last_name
|
360
|
-
end
|
361
|
-
end
|
362
|
-
end
|
363
|
-
|
364
|
-
include_examples :inputs_with_for_expectation
|
365
|
-
end
|
366
|
-
|
367
|
-
context "with two input fields 'for' at the beginning of block" do
|
368
|
-
let :body do
|
369
|
-
build_form do |f|
|
370
|
-
f.form_builder.instance_eval do
|
371
|
-
@object.author = User.new
|
372
|
-
end
|
373
|
-
f.inputs name: 'Author', for: :author do |author|
|
374
|
-
author.input :first_name
|
375
|
-
author.input :last_name
|
376
|
-
end
|
377
|
-
f.inputs do
|
378
|
-
f.input :title
|
379
|
-
f.input :body
|
380
|
-
end
|
381
|
-
end
|
382
|
-
end
|
383
|
-
|
384
|
-
include_examples :inputs_with_for_expectation
|
385
|
-
end
|
386
|
-
|
387
|
-
context "with wrapper html" do
|
388
|
-
it "should set a class" do
|
389
|
-
body = build_form do |f|
|
390
|
-
f.input :title, wrapper_html: { class: "important" }
|
391
|
-
end
|
392
|
-
expect(body).to have_selector("li[class='important string input optional stringish']")
|
393
|
-
end
|
394
|
-
end
|
395
|
-
|
396
|
-
context "with inputs twice" do
|
397
|
-
let :body do
|
398
|
-
build_form do |f|
|
399
|
-
f.inputs do
|
400
|
-
f.input :title
|
401
|
-
f.input :body
|
402
|
-
end
|
403
|
-
f.inputs do
|
404
|
-
f.input :author
|
405
|
-
f.input :published_at
|
406
|
-
end
|
407
|
-
end
|
408
|
-
end
|
409
|
-
it "should render four inputs" do
|
410
|
-
expect(body).to have_selector("input[name='post[title]']", count: 1)
|
411
|
-
expect(body).to have_selector("textarea[name='post[body]']", count: 1)
|
412
|
-
expect(body).to have_selector("select[name='post[author_id]']", count: 1)
|
413
|
-
expect(body).to have_selector("select[name='post[published_at(1i)]']", count: 1)
|
414
|
-
expect(body).to have_selector("select[name='post[published_at(2i)]']", count: 1)
|
415
|
-
expect(body).to have_selector("select[name='post[published_at(3i)]']", count: 1)
|
416
|
-
expect(body).to have_selector("select[name='post[published_at(4i)]']", count: 1)
|
417
|
-
end
|
418
|
-
end
|
419
|
-
|
420
|
-
context "with has many inputs" do
|
421
|
-
describe "with simple block" do
|
422
|
-
let :body do
|
423
|
-
build_form({url: '/categories'}, Category.new) do |f|
|
424
|
-
f.object.posts.build
|
425
|
-
f.has_many :posts do |p|
|
426
|
-
p.input :title
|
427
|
-
p.input :body
|
428
|
-
end
|
429
|
-
f.inputs
|
430
|
-
end
|
431
|
-
end
|
432
|
-
|
433
|
-
let(:valid_html_id) { /^[A-Za-z]+[\w\-\:\.]*$/ }
|
434
|
-
|
435
|
-
it "should translate the association name in header" do
|
436
|
-
with_translation activerecord: {models: {post: {one: 'Blog Post', other: 'Blog Posts'}}} do
|
437
|
-
expect(body).to have_selector("h3", text: "Blog Posts")
|
438
|
-
end
|
439
|
-
end
|
440
|
-
|
441
|
-
it "should use model name when there is no translation for given model in header" do
|
442
|
-
expect(body).to have_selector("h3", text: "Post")
|
443
|
-
end
|
444
|
-
|
445
|
-
it "should translate the association name in has many new button" do
|
446
|
-
with_translation activerecord: {models: {post: {one: 'Blog Post', other: 'Blog Posts'}}} do
|
447
|
-
expect(body).to have_selector("a", text: "Add New Blog Post")
|
448
|
-
end
|
449
|
-
end
|
450
|
-
|
451
|
-
it "should translate the attribute name" do
|
452
|
-
with_translation activerecord: {attributes: {post: {title: 'A very nice title'}}} do
|
453
|
-
expect(body).to have_selector("label", text: "A very nice title")
|
454
|
-
end
|
455
|
-
end
|
456
|
-
|
457
|
-
it "should use model name when there is no translation for given model in has many new button" do
|
458
|
-
expect(body).to have_selector("a", text: "Add New Post")
|
459
|
-
end
|
460
|
-
|
461
|
-
it "should render the nested form" do
|
462
|
-
expect(body).to have_selector("input[name='category[posts_attributes][0][title]']")
|
463
|
-
expect(body).to have_selector("textarea[name='category[posts_attributes][0][body]']")
|
464
|
-
end
|
465
|
-
|
466
|
-
it "should add a link to remove new nested records" do
|
467
|
-
expect(body).to have_selector(".has_many_container > fieldset > ol > li > a.button.has_many_remove[href='#']", text: "Remove")
|
468
|
-
end
|
469
|
-
|
470
|
-
it "should add a link to add new nested records" do
|
471
|
-
expect(body).to have_selector(".has_many_container > a.button.has_many_add[href='#']", text: "Add New Post")
|
472
|
-
end
|
473
|
-
|
474
|
-
it "should set an HTML-id valid placeholder" do
|
475
|
-
link = body.find('.has_many_container > a.button.has_many_add')
|
476
|
-
expect(link[:'data-placeholder']).to match valid_html_id
|
477
|
-
end
|
478
|
-
|
479
|
-
describe "with namespaced model" do
|
480
|
-
it "should set an HTML-id valid placeholder" do
|
481
|
-
allow(Post).to receive(:name).and_return "ActiveAdmin::Post"
|
482
|
-
link = body.find('.has_many_container > a.button.has_many_add')
|
483
|
-
expect(link[:'data-placeholder']).to match valid_html_id
|
484
|
-
end
|
485
|
-
end
|
486
|
-
end
|
487
|
-
|
488
|
-
describe "with complex block" do
|
489
|
-
let :body do
|
490
|
-
build_form({url: '/categories'}, Category.new) do |f|
|
491
|
-
f.object.posts.build
|
492
|
-
f.has_many :posts do |p,i|
|
493
|
-
p.input :title, label: "Title #{i}"
|
494
|
-
end
|
495
|
-
end
|
496
|
-
end
|
497
|
-
|
498
|
-
it "should accept a block with a second argument" do
|
499
|
-
expect(body).to have_selector("label", text: "Title 1")
|
500
|
-
end
|
501
|
-
|
502
|
-
it "should add a custom header" do
|
503
|
-
expect(body).to have_selector("h3", text: "Post")
|
504
|
-
end
|
505
|
-
|
506
|
-
end
|
507
|
-
|
508
|
-
describe "without heading and new record link" do
|
509
|
-
let :body do
|
510
|
-
build_form({url: '/categories'}, Category.new) do |f|
|
511
|
-
f.object.posts.build
|
512
|
-
f.has_many :posts, heading: false, new_record: false do |p|
|
513
|
-
p.input :title
|
514
|
-
end
|
515
|
-
end
|
516
|
-
end
|
517
|
-
|
518
|
-
it "should not add a header" do
|
519
|
-
expect(body).not_to have_selector("h3", text: "Post")
|
520
|
-
end
|
521
|
-
|
522
|
-
it "should not add link to new nested records" do
|
523
|
-
expect(body).not_to have_selector("a", text: "Add New Post")
|
524
|
-
end
|
525
|
-
|
526
|
-
it "should render the nested form" do
|
527
|
-
expect(body).to have_selector("input[name='category[posts_attributes][0][title]']")
|
528
|
-
end
|
529
|
-
end
|
530
|
-
|
531
|
-
describe "with custom heading" do
|
532
|
-
let :body do
|
533
|
-
build_form({url: '/categories'}, Category.new) do |f|
|
534
|
-
f.object.posts.build
|
535
|
-
f.has_many :posts, heading: "Test heading" do |p|
|
536
|
-
p.input :title
|
537
|
-
end
|
538
|
-
end
|
539
|
-
end
|
540
|
-
|
541
|
-
it "should add a custom header" do
|
542
|
-
expect(body).to have_selector("h3", "Test heading")
|
543
|
-
end
|
544
|
-
|
545
|
-
end
|
546
|
-
|
547
|
-
describe "with custom new record link" do
|
548
|
-
let :body do
|
549
|
-
build_form({url: '/categories'}, Category.new) do |f|
|
550
|
-
f.object.posts.build
|
551
|
-
f.has_many :posts, new_record: 'My Custom New Post' do |p|
|
552
|
-
p.input :title
|
553
|
-
end
|
554
|
-
end
|
555
|
-
end
|
556
|
-
|
557
|
-
it "should add a custom new record link" do
|
558
|
-
expect(body).to have_selector("a", text: "My Custom New Post")
|
559
|
-
end
|
560
|
-
|
561
|
-
end
|
562
|
-
|
563
|
-
describe "with allow destroy" do
|
564
|
-
context "with an existing post" do
|
565
|
-
let :body do
|
566
|
-
s = self
|
567
|
-
build_form({url: '/categories'}, Category.new) do |f|
|
568
|
-
s.instance_exec do
|
569
|
-
allow(f.object.posts.build).to receive(:new_record?).and_return(false)
|
570
|
-
end
|
571
|
-
f.has_many :posts, allow_destroy: true do |p|
|
572
|
-
p.input :title
|
573
|
-
end
|
574
|
-
end
|
575
|
-
end
|
576
|
-
|
577
|
-
it "should include a boolean field for _destroy" do
|
578
|
-
expect(body).to have_selector("input[name='category[posts_attributes][0][_destroy]']")
|
579
|
-
end
|
580
|
-
|
581
|
-
it "should have a check box with 'Remove' as its label" do
|
582
|
-
expect(body).to have_selector("label[for=category_posts_attributes_0__destroy]", text: "Delete")
|
583
|
-
end
|
584
|
-
|
585
|
-
it "should wrap the destroy field in an li with class 'has_many_delete'" do
|
586
|
-
expect(body).to have_selector(".has_many_container > fieldset > ol > li.has_many_delete > input", count: 1)
|
587
|
-
end
|
588
|
-
end
|
589
|
-
|
590
|
-
context "with a new post" do
|
591
|
-
let :body do
|
592
|
-
build_form({url: '/categories'}, Category.new) do |f|
|
593
|
-
f.object.posts.build
|
594
|
-
f.has_many :posts, allow_destroy: true do |p|
|
595
|
-
p.input :title
|
596
|
-
end
|
597
|
-
end
|
598
|
-
end
|
599
|
-
|
600
|
-
it "should not have a boolean field for _destroy" do
|
601
|
-
expect(body).not_to have_selector("input[name='category[posts_attributes][0][_destroy]']")
|
602
|
-
end
|
603
|
-
|
604
|
-
it "should not have a check box with 'Remove' as its label" do
|
605
|
-
expect(body).not_to have_selector("label[for=category_posts_attributes_0__destroy]", text: "Remove")
|
606
|
-
end
|
607
|
-
end
|
608
|
-
end
|
609
|
-
|
610
|
-
describe "sortable" do
|
611
|
-
# TODO: it doesn't make any sense to use your foreign key as something that's sortable (and therefore editable)
|
612
|
-
context "with a new post" do
|
613
|
-
let :body do
|
614
|
-
build_form({url: '/categories'}, Category.new) do |f|
|
615
|
-
f.object.posts.build
|
616
|
-
f.has_many :posts, sortable: :position do |p|
|
617
|
-
p.input :title
|
618
|
-
end
|
619
|
-
end
|
620
|
-
end
|
621
|
-
|
622
|
-
it "shows the nested fields for unsaved records" do
|
623
|
-
expect(body).to have_selector("fieldset.inputs.has_many_fields")
|
624
|
-
end
|
625
|
-
|
626
|
-
end
|
627
|
-
|
628
|
-
context "with post returning nil for the sortable attribute" do
|
629
|
-
let :body do
|
630
|
-
build_form({url: '/categories'}, Category.new) do |f|
|
631
|
-
f.object.posts.build position: 3
|
632
|
-
f.object.posts.build
|
633
|
-
f.has_many :posts, sortable: :position do |p|
|
634
|
-
p.input :title
|
635
|
-
end
|
636
|
-
end
|
637
|
-
end
|
638
|
-
|
639
|
-
it "shows the nested fields for unsaved records" do
|
640
|
-
expect(body).to have_selector("fieldset.inputs.has_many_fields")
|
641
|
-
end
|
642
|
-
|
643
|
-
end
|
644
|
-
|
645
|
-
context "with existing and new posts" do
|
646
|
-
let! :category do
|
647
|
-
Category.create name: 'Name'
|
648
|
-
end
|
649
|
-
let! :post do
|
650
|
-
category.posts.create
|
651
|
-
end
|
652
|
-
let :body do
|
653
|
-
build_form({url: '/categories'}, category) do |f|
|
654
|
-
f.object.posts.build
|
655
|
-
f.has_many :posts, sortable: :position do |p|
|
656
|
-
p.input :title
|
657
|
-
end
|
658
|
-
end
|
659
|
-
end
|
660
|
-
|
661
|
-
it "shows the nested fields for saved and unsaved records" do
|
662
|
-
expect(body).to have_selector("fieldset.inputs.has_many_fields")
|
663
|
-
end
|
664
|
-
end
|
665
|
-
|
666
|
-
context "without sortable_start set" do
|
667
|
-
let :body do
|
668
|
-
build_form({url: '/categories'}, Category.new) do |f|
|
669
|
-
f.object.posts.build
|
670
|
-
f.has_many :posts, sortable: :position do |p|
|
671
|
-
p.input :title
|
672
|
-
end
|
673
|
-
end
|
674
|
-
end
|
675
|
-
|
676
|
-
it "defaults to 0" do
|
677
|
-
expect(body).to have_selector("div.has_many_container[data-sortable-start='0']")
|
678
|
-
end
|
679
|
-
end
|
680
|
-
|
681
|
-
context "with sortable_start set" do
|
682
|
-
let :body do
|
683
|
-
build_form({url: '/categories'}, Category.new) do |f|
|
684
|
-
f.object.posts.build
|
685
|
-
f.has_many :posts, sortable: :position, sortable_start: 15 do |p|
|
686
|
-
p.input :title
|
687
|
-
end
|
688
|
-
end
|
689
|
-
end
|
690
|
-
|
691
|
-
it "sets the data attribute" do
|
692
|
-
expect(body).to have_selector("div.has_many_container[data-sortable-start='15']")
|
693
|
-
end
|
694
|
-
end
|
695
|
-
end
|
696
|
-
|
697
|
-
describe "with nesting" do
|
698
|
-
context "in an inputs block" do
|
699
|
-
let :body do
|
700
|
-
build_form({url: '/categories'}, Category.new) do |f|
|
701
|
-
f.inputs "Field Wrapper" do
|
702
|
-
f.object.posts.build
|
703
|
-
f.has_many :posts do |p|
|
704
|
-
p.input :title
|
705
|
-
end
|
706
|
-
end
|
707
|
-
end
|
708
|
-
end
|
709
|
-
|
710
|
-
it "should wrap the has_many fieldset in an li" do
|
711
|
-
expect(body).to have_selector("ol > li.has_many_container")
|
712
|
-
end
|
713
|
-
|
714
|
-
it "should have a direct fieldset child" do
|
715
|
-
expect(body).to have_selector("li.has_many_container > fieldset")
|
716
|
-
end
|
717
|
-
|
718
|
-
it "should not contain invalid li children" do
|
719
|
-
expect(body).not_to have_selector("div.has_many_container > li")
|
720
|
-
end
|
721
|
-
end
|
722
|
-
|
723
|
-
context "in another has_many block" do
|
724
|
-
let :body do
|
725
|
-
build_form({url: '/categories'}, Category.new) do |f|
|
726
|
-
f.object.posts.build
|
727
|
-
f.has_many :posts do |p|
|
728
|
-
p.object.taggings.build
|
729
|
-
p.has_many :taggings do |t|
|
730
|
-
t.input :tag
|
731
|
-
end
|
732
|
-
end
|
733
|
-
end
|
734
|
-
end
|
735
|
-
|
736
|
-
it "should wrap the inner has_many fieldset in an ol > li" do
|
737
|
-
expect(body).to have_selector(".has_many_container ol > li.has_many_container > fieldset")
|
738
|
-
end
|
739
|
-
|
740
|
-
it "should not contain invalid li children" do
|
741
|
-
expect(body).not_to have_selector(".has_many_container div.has_many_container > li")
|
742
|
-
end
|
743
|
-
end
|
744
|
-
end
|
745
|
-
|
746
|
-
it "should render the block if it returns nil" do
|
747
|
-
body = build_form({url: '/categories'}, Category.new) do |f|
|
748
|
-
f.object.posts.build
|
749
|
-
f.has_many :posts do |p|
|
750
|
-
p.input :title
|
751
|
-
nil
|
752
|
-
end
|
753
|
-
end
|
754
|
-
|
755
|
-
expect(body).to have_selector("input[name='category[posts_attributes][0][title]']")
|
756
|
-
end
|
757
|
-
end
|
758
|
-
|
759
|
-
{ # Testing that the same input can be used multiple times
|
760
|
-
"f.input :title, as: :string" => "post_title",
|
761
|
-
"f.input :title, as: :text" => "post_title",
|
762
|
-
"f.input :created_at, as: :time_select" => "post_created_at_2i",
|
763
|
-
"f.input :created_at, as: :datetime_select" => "post_created_at_2i",
|
764
|
-
"f.input :created_at, as: :date_select" => "post_created_at_2i",
|
765
|
-
# Testing that return values don't screw up the form
|
766
|
-
"f.input :title; nil" => "post_title",
|
767
|
-
"f.input :title; []" => "post_title",
|
768
|
-
"[:title].each{ |r| f.input r }" => "post_title",
|
769
|
-
"[:title].map { |r| f.input r }" => "post_title",
|
770
|
-
}.each do |source, selector|
|
771
|
-
it "should properly buffer `#{source}`" do
|
772
|
-
body = build_form do |f|
|
773
|
-
f.inputs do
|
774
|
-
eval source
|
775
|
-
eval source
|
776
|
-
end
|
777
|
-
end
|
778
|
-
expect(body).to have_selector("[id=#{selector}]", count: 2)
|
779
|
-
end
|
780
|
-
end
|
781
|
-
|
782
|
-
describe "datepicker input" do
|
783
|
-
context 'with default options' do
|
784
|
-
let :body do
|
785
|
-
build_form do |f|
|
786
|
-
f.inputs do
|
787
|
-
f.input :created_at, as: :datepicker
|
788
|
-
end
|
789
|
-
end
|
790
|
-
end
|
791
|
-
it "should generate a text input with the class of datepicker" do
|
792
|
-
expect(body).to have_selector("input.datepicker[type=text][name='post[created_at]']")
|
793
|
-
end
|
794
|
-
end
|
795
|
-
|
796
|
-
context 'with date range options' do
|
797
|
-
let :body do
|
798
|
-
build_form do |f|
|
799
|
-
f.inputs do
|
800
|
-
f.input :created_at, as: :datepicker,
|
801
|
-
datepicker_options: {
|
802
|
-
min_date: Date.new(2013, 10, 18),
|
803
|
-
max_date: "2013-12-31" }
|
804
|
-
end
|
805
|
-
end
|
806
|
-
end
|
807
|
-
|
808
|
-
it 'should generate a datepicker text input with data min and max dates' do
|
809
|
-
selector = "input.datepicker[type=text][name='post[created_at]']"
|
810
|
-
expect(body).to have_selector(selector)
|
811
|
-
expect(body.find(selector)["data-datepicker-options"]).to eq({ minDate: '2013-10-18', maxDate: '2013-12-31' }.to_json)
|
812
|
-
end
|
813
|
-
end
|
814
|
-
end
|
815
|
-
end
|