activeadministration 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/.gitignore +47 -0
- data/.travis.yml +19 -0
- data/.yardopts +9 -0
- data/CHANGELOG.md +1074 -0
- data/CONTRIBUTING.md +139 -0
- data/Gemfile +52 -0
- data/Guardfile +7 -0
- data/LICENSE +25 -0
- data/README.md +8 -0
- data/Rakefile +33 -0
- data/activeadministration.gemspec +34 -0
- data/app/assets/images/active_admin/admin_notes_icon.png +0 -0
- data/app/assets/images/active_admin/datepicker/datepicker-header-bg.png +0 -0
- data/app/assets/images/active_admin/datepicker/datepicker-input-icon.png +0 -0
- data/app/assets/images/active_admin/datepicker/datepicker-next-link-icon.png +0 -0
- data/app/assets/images/active_admin/datepicker/datepicker-nipple.png +0 -0
- data/app/assets/images/active_admin/datepicker/datepicker-prev-link-icon.png +0 -0
- data/app/assets/images/active_admin/index_list_icons/block_icon.svg +10 -0
- data/app/assets/images/active_admin/index_list_icons/blog_icon.svg +4 -0
- data/app/assets/images/active_admin/index_list_icons/grid_icon.svg +13 -0
- data/app/assets/images/active_admin/index_list_icons/table_icon.svg +3 -0
- data/app/assets/images/active_admin/loading.gif +0 -0
- data/app/assets/images/active_admin/nested_menu_arrow.gif +0 -0
- data/app/assets/images/active_admin/nested_menu_arrow_dark.gif +0 -0
- data/app/assets/images/active_admin/orderable.png +0 -0
- data/app/assets/javascripts/active_admin/application.js.coffee +30 -0
- data/app/assets/javascripts/active_admin/base.js.coffee +14 -0
- data/app/assets/javascripts/active_admin/ext/jquery-ui.js.coffee +6 -0
- data/app/assets/javascripts/active_admin/ext/jquery.js.coffee +7 -0
- data/app/assets/javascripts/active_admin/lib/batch_actions.js.coffee +39 -0
- data/app/assets/javascripts/active_admin/lib/checkbox-toggler.js.coffee +36 -0
- data/app/assets/javascripts/active_admin/lib/dropdown-menu.js.coffee +85 -0
- data/app/assets/javascripts/active_admin/lib/has_many.js.coffee +75 -0
- data/app/assets/javascripts/active_admin/lib/modal_dialog.js.coffee +36 -0
- data/app/assets/javascripts/active_admin/lib/popover.js.coffee +68 -0
- data/app/assets/javascripts/active_admin/lib/table-checkbox-toggler.js.coffee +24 -0
- data/app/assets/stylesheets/active_admin/_base.css.scss +42 -0
- data/app/assets/stylesheets/active_admin/_forms.css.scss +329 -0
- data/app/assets/stylesheets/active_admin/_header.css.scss +156 -0
- data/app/assets/stylesheets/active_admin/_mixins.css.scss +1 -0
- data/app/assets/stylesheets/active_admin/_typography.css.scss +100 -0
- data/app/assets/stylesheets/active_admin/components/_batch_actions.css.scss +11 -0
- data/app/assets/stylesheets/active_admin/components/_blank_slates.scss +31 -0
- data/app/assets/stylesheets/active_admin/components/_breadcrumbs.scss +20 -0
- data/app/assets/stylesheets/active_admin/components/_buttons.scss +11 -0
- data/app/assets/stylesheets/active_admin/components/_columns.scss +3 -0
- data/app/assets/stylesheets/active_admin/components/_comments.css.scss +41 -0
- data/app/assets/stylesheets/active_admin/components/_date_picker.css.scss +127 -0
- data/app/assets/stylesheets/active_admin/components/_dropdown_menu.scss +151 -0
- data/app/assets/stylesheets/active_admin/components/_flash_messages.css.scss +39 -0
- data/app/assets/stylesheets/active_admin/components/_grid.scss +9 -0
- data/app/assets/stylesheets/active_admin/components/_index_list.scss +12 -0
- data/app/assets/stylesheets/active_admin/components/_links.scss +5 -0
- data/app/assets/stylesheets/active_admin/components/_modal_dialog.scss +31 -0
- data/app/assets/stylesheets/active_admin/components/_pagination.scss +34 -0
- data/app/assets/stylesheets/active_admin/components/_panels.scss +6 -0
- data/app/assets/stylesheets/active_admin/components/_popovers.css.scss +123 -0
- data/app/assets/stylesheets/active_admin/components/_scopes.scss +10 -0
- data/app/assets/stylesheets/active_admin/components/_status_tags.scss +16 -0
- data/app/assets/stylesheets/active_admin/components/_table_tools.css.scss +65 -0
- data/app/assets/stylesheets/active_admin/components/_tables.css.scss +111 -0
- data/app/assets/stylesheets/active_admin/mixins/_all.css.scss +11 -0
- data/app/assets/stylesheets/active_admin/mixins/_buttons.css.scss +66 -0
- data/app/assets/stylesheets/active_admin/mixins/_gradients.css.scss +38 -0
- data/app/assets/stylesheets/active_admin/mixins/_icons.css.scss +20 -0
- data/app/assets/stylesheets/active_admin/mixins/_reset.css.scss +165 -0
- data/app/assets/stylesheets/active_admin/mixins/_rounded.css.scss +43 -0
- data/app/assets/stylesheets/active_admin/mixins/_sections.css.scss +36 -0
- data/app/assets/stylesheets/active_admin/mixins/_shadows.css.scss +22 -0
- data/app/assets/stylesheets/active_admin/mixins/_typography.scss +3 -0
- data/app/assets/stylesheets/active_admin/mixins/_utilities.scss +26 -0
- data/app/assets/stylesheets/active_admin/mixins/_variables.css.scss +34 -0
- data/app/assets/stylesheets/active_admin/pages/_logged_out.scss +44 -0
- data/app/assets/stylesheets/active_admin/print.css.scss +284 -0
- data/app/assets/stylesheets/active_admin/structure/_footer.scss +14 -0
- data/app/assets/stylesheets/active_admin/structure/_main_structure.scss +29 -0
- data/app/assets/stylesheets/active_admin/structure/_title_bar.scss +46 -0
- data/app/views/active_admin/dashboard/index.html.arb +1 -0
- data/app/views/active_admin/devise/confirmations/new.html.erb +14 -0
- data/app/views/active_admin/devise/mailer/reset_password_instructions.html.erb +8 -0
- data/app/views/active_admin/devise/mailer/unlock_instructions.html.erb +7 -0
- data/app/views/active_admin/devise/passwords/edit.html.erb +19 -0
- data/app/views/active_admin/devise/passwords/new.html.erb +14 -0
- data/app/views/active_admin/devise/registrations/new.html.erb +22 -0
- data/app/views/active_admin/devise/sessions/new.html.erb +20 -0
- data/app/views/active_admin/devise/shared/_links.erb +27 -0
- data/app/views/active_admin/devise/unlocks/new.html.erb +14 -0
- data/app/views/active_admin/page/index.html.arb +1 -0
- data/app/views/active_admin/resource/edit.html.arb +1 -0
- data/app/views/active_admin/resource/index.csv.erb +17 -0
- data/app/views/active_admin/resource/index.html.arb +1 -0
- data/app/views/active_admin/resource/new.html.arb +1 -0
- data/app/views/active_admin/resource/show.html.arb +1 -0
- data/app/views/kaminari/active_admin/_first_page.html.erb +11 -0
- data/app/views/kaminari/active_admin/_gap.html.erb +8 -0
- data/app/views/kaminari/active_admin/_last_page.html.erb +11 -0
- data/app/views/kaminari/active_admin/_next_page.html.erb +11 -0
- data/app/views/kaminari/active_admin/_page.html.erb +12 -0
- data/app/views/kaminari/active_admin/_paginator.html.erb +23 -0
- data/app/views/kaminari/active_admin/_prev_page.html.erb +11 -0
- data/app/views/layouts/active_admin.html.arb +1 -0
- data/app/views/layouts/active_admin_logged_out.html.erb +37 -0
- data/config/locales/bg.yml +102 -0
- data/config/locales/bs.yml +121 -0
- data/config/locales/ca.yml +102 -0
- data/config/locales/cs.yml +106 -0
- data/config/locales/da.yml +103 -0
- data/config/locales/de-CH.yml +118 -0
- data/config/locales/de.yml +143 -0
- data/config/locales/el.yml +111 -0
- data/config/locales/en-GB.yml +95 -0
- data/config/locales/en.yml +117 -0
- data/config/locales/es.yml +127 -0
- data/config/locales/es_MX.yml +110 -0
- data/config/locales/fi.yml +110 -0
- data/config/locales/fr.yml +109 -0
- data/config/locales/he.yml +92 -0
- data/config/locales/hr.yml +121 -0
- data/config/locales/hu.yml +96 -0
- data/config/locales/it.yml +114 -0
- data/config/locales/ja.yml +114 -0
- data/config/locales/ko.yml +85 -0
- data/config/locales/lt.yml +118 -0
- data/config/locales/lv.yml +90 -0
- data/config/locales/nl.yml +94 -0
- data/config/locales/no-NB.yml +111 -0
- data/config/locales/pl.yml +100 -0
- data/config/locales/pt-BR.yml +117 -0
- data/config/locales/pt-PT.yml +90 -0
- data/config/locales/ro.yml +94 -0
- data/config/locales/ru.yml +121 -0
- data/config/locales/sv-SE.yml +90 -0
- data/config/locales/tr.yml +94 -0
- data/config/locales/uk.yml +121 -0
- data/config/locales/vi.yml +91 -0
- data/config/locales/zh-CN.yml +112 -0
- data/config/locales/zh-TW.yml +94 -0
- data/cucumber.yml +3 -0
- data/docs/0-installation.md +84 -0
- data/docs/1-general-configuration.md +138 -0
- data/docs/10-custom-pages.md +84 -0
- data/docs/11-decorators.md +50 -0
- data/docs/12-arbre-components.md +150 -0
- data/docs/13-authorization-adapter.md +239 -0
- data/docs/2-resource-customization.md +359 -0
- data/docs/3-index-pages.md +245 -0
- data/docs/3-index-pages/create-an-index.md +31 -0
- data/docs/3-index-pages/index-as-block.md +21 -0
- data/docs/3-index-pages/index-as-blog.md +71 -0
- data/docs/3-index-pages/index-as-grid.md +29 -0
- data/docs/3-index-pages/index-as-table.md +163 -0
- data/docs/4-csv-format.md +39 -0
- data/docs/5-forms.md +118 -0
- data/docs/6-show-pages.md +77 -0
- data/docs/7-sidebars.md +63 -0
- data/docs/8-custom-actions.md +159 -0
- data/docs/9-batch-actions.md +233 -0
- data/features/action_item.feature +73 -0
- data/features/authorization.feature +64 -0
- data/features/authorization_cancan.feature +52 -0
- data/features/authorization_pundit.feature +37 -0
- data/features/belongs_to.feature +66 -0
- data/features/breadcrumb.feature +75 -0
- data/features/comments/commenting.feature +159 -0
- data/features/comments/viewing_index.feature +19 -0
- data/features/dashboard.feature +16 -0
- data/features/decorators.feature +41 -0
- data/features/development_reloading.feature +31 -0
- data/features/edit_page.feature +114 -0
- data/features/favicon.feature +20 -0
- data/features/first_boot.feature +16 -0
- data/features/global_navigation.feature +29 -0
- data/features/i18n.feature +43 -0
- data/features/index/batch_actions.feature +123 -0
- data/features/index/filters.feature +138 -0
- data/features/index/format_as_csv.feature +117 -0
- data/features/index/formats.feature +66 -0
- data/features/index/index_as_block.feature +15 -0
- data/features/index/index_as_blog.feature +69 -0
- data/features/index/index_as_grid.feature +45 -0
- data/features/index/index_as_table.feature +208 -0
- data/features/index/index_blank_slate.feature +83 -0
- data/features/index/index_parameters.feature +75 -0
- data/features/index/index_scope_to.feature +56 -0
- data/features/index/index_scopes.feature +251 -0
- data/features/index/page_title.feature +41 -0
- data/features/index/pagination.feature +59 -0
- data/features/index/switch_index_view.feature +73 -0
- data/features/menu.feature +53 -0
- data/features/new_page.feature +106 -0
- data/features/registering_assets.feature +35 -0
- data/features/registering_pages.feature +148 -0
- data/features/registering_resources.feature +33 -0
- data/features/root_to.feature +17 -0
- data/features/show/default_content.feature +43 -0
- data/features/show/page_title.feature +58 -0
- data/features/sidebar_sections.feature +210 -0
- data/features/site_title.feature +47 -0
- data/features/specifying_actions.feature +93 -0
- data/features/step_definitions/action_item_steps.rb +7 -0
- data/features/step_definitions/action_link_steps.rb +7 -0
- data/features/step_definitions/additional_web_steps.rb +82 -0
- data/features/step_definitions/asset_steps.rb +15 -0
- data/features/step_definitions/attribute_steps.rb +18 -0
- data/features/step_definitions/batch_action_steps.rb +55 -0
- data/features/step_definitions/breadcrumb_steps.rb +3 -0
- data/features/step_definitions/comment_steps.rb +12 -0
- data/features/step_definitions/configuration_steps.rb +100 -0
- data/features/step_definitions/dashboard_steps.rb +15 -0
- data/features/step_definitions/factory_steps.rb +34 -0
- data/features/step_definitions/filter_steps.rb +17 -0
- data/features/step_definitions/flash_steps.rb +11 -0
- data/features/step_definitions/format_steps.rb +45 -0
- data/features/step_definitions/i18n_steps.rb +3 -0
- data/features/step_definitions/index_scope_steps.rb +21 -0
- data/features/step_definitions/index_views_steps.rb +3 -0
- data/features/step_definitions/layout_steps.rb +3 -0
- data/features/step_definitions/member_link_steps.rb +7 -0
- data/features/step_definitions/menu_steps.rb +11 -0
- data/features/step_definitions/pagination_steps.rb +8 -0
- data/features/step_definitions/sidebar_steps.rb +12 -0
- data/features/step_definitions/site_title_steps.rb +15 -0
- data/features/step_definitions/symbol_leak_steps.rb +3 -0
- data/features/step_definitions/tab_steps.rb +3 -0
- data/features/step_definitions/table_steps.rb +119 -0
- data/features/step_definitions/user_steps.rb +41 -0
- data/features/step_definitions/web_steps.rb +86 -0
- data/features/sti_resource.feature +65 -0
- data/features/strong_parameters.feature +72 -0
- data/features/support/env.rb +119 -0
- data/features/support/paths.rb +71 -0
- data/features/support/selectors.rb +45 -0
- data/features/symbol_leak.feature +35 -0
- data/features/users/logging_in.feature +34 -0
- data/features/users/logging_out.feature +13 -0
- data/features/users/resetting_password.feature +34 -0
- data/lib/active_admin.rb +135 -0
- data/lib/active_admin/abstract_view_factory.rb +86 -0
- data/lib/active_admin/application.rb +250 -0
- data/lib/active_admin/asset_registration.rb +29 -0
- data/lib/active_admin/authorization_adapter.rb +132 -0
- data/lib/active_admin/base_controller.rb +78 -0
- data/lib/active_admin/base_controller/authorization.rb +151 -0
- data/lib/active_admin/base_controller/menu.rb +34 -0
- data/lib/active_admin/batch_actions.rb +17 -0
- data/lib/active_admin/batch_actions/controller.rb +29 -0
- data/lib/active_admin/batch_actions/resource_extension.rb +154 -0
- data/lib/active_admin/batch_actions/views/batch_action_form.rb +38 -0
- data/lib/active_admin/batch_actions/views/batch_action_popover.rb +28 -0
- data/lib/active_admin/batch_actions/views/batch_action_selector.rb +57 -0
- data/lib/active_admin/batch_actions/views/selection_cells.rb +37 -0
- data/lib/active_admin/callbacks.rb +84 -0
- data/lib/active_admin/cancan_adapter.rb +40 -0
- data/lib/active_admin/component.rb +5 -0
- data/lib/active_admin/controller_action.rb +12 -0
- data/lib/active_admin/csv_builder.rb +70 -0
- data/lib/active_admin/dependencies.rb +38 -0
- data/lib/active_admin/deprecation.rb +35 -0
- data/lib/active_admin/devise.rb +80 -0
- data/lib/active_admin/dsl.rb +165 -0
- data/lib/active_admin/engine.rb +7 -0
- data/lib/active_admin/error.rb +22 -0
- data/lib/active_admin/event.rb +33 -0
- data/lib/active_admin/filters.rb +9 -0
- data/lib/active_admin/filters/dsl.rb +21 -0
- data/lib/active_admin/filters/forms.rb +87 -0
- data/lib/active_admin/filters/formtastic_addons.rb +73 -0
- data/lib/active_admin/filters/resource_extension.rb +135 -0
- data/lib/active_admin/form_builder.rb +185 -0
- data/lib/active_admin/helpers/collection.rb +23 -0
- data/lib/active_admin/helpers/i18n.rb +7 -0
- data/lib/active_admin/helpers/optional_display.rb +38 -0
- data/lib/active_admin/helpers/scope_chain.rb +23 -0
- data/lib/active_admin/helpers/settings.rb +106 -0
- data/lib/active_admin/iconic.rb +54 -0
- data/lib/active_admin/iconic/icons.rb +142 -0
- data/lib/active_admin/inputs.rb +15 -0
- data/lib/active_admin/inputs/datepicker_input.rb +20 -0
- data/lib/active_admin/inputs/filter_base.rb +40 -0
- data/lib/active_admin/inputs/filter_base/search_method_select.rb +73 -0
- data/lib/active_admin/inputs/filter_boolean_input.rb +32 -0
- data/lib/active_admin/inputs/filter_check_boxes_input.rb +48 -0
- data/lib/active_admin/inputs/filter_date_range_input.rb +34 -0
- data/lib/active_admin/inputs/filter_numeric_input.rb +10 -0
- data/lib/active_admin/inputs/filter_select_input.rb +53 -0
- data/lib/active_admin/inputs/filter_string_input.rb +24 -0
- data/lib/active_admin/menu.rb +107 -0
- data/lib/active_admin/menu_collection.rb +96 -0
- data/lib/active_admin/menu_item.rb +97 -0
- data/lib/active_admin/namespace.rb +231 -0
- data/lib/active_admin/order_clause.rb +26 -0
- data/lib/active_admin/orm/active_record.rb +3 -0
- data/lib/active_admin/orm/active_record/comments.rb +84 -0
- data/lib/active_admin/orm/active_record/comments/comment.rb +49 -0
- data/lib/active_admin/orm/active_record/comments/namespace_helper.rb +14 -0
- data/lib/active_admin/orm/active_record/comments/resource_helper.rb +17 -0
- data/lib/active_admin/orm/active_record/comments/show_page_helper.rb +23 -0
- data/lib/active_admin/orm/active_record/comments/views.rb +2 -0
- data/lib/active_admin/orm/active_record/comments/views/active_admin_comments.rb +75 -0
- data/lib/active_admin/orm/mongoid.rb +1 -0
- data/lib/active_admin/orm/mongoid/.gitkeep +0 -0
- data/lib/active_admin/page.rb +88 -0
- data/lib/active_admin/page_controller.rb +29 -0
- data/lib/active_admin/page_dsl.rb +28 -0
- data/lib/active_admin/page_presenter.rb +32 -0
- data/lib/active_admin/pundit_adapter.rb +42 -0
- data/lib/active_admin/resource.rb +156 -0
- data/lib/active_admin/resource/action_items.rb +91 -0
- data/lib/active_admin/resource/belongs_to.rb +36 -0
- data/lib/active_admin/resource/controllers.rb +18 -0
- data/lib/active_admin/resource/menu.rb +64 -0
- data/lib/active_admin/resource/naming.rb +84 -0
- data/lib/active_admin/resource/page_presenters.rb +82 -0
- data/lib/active_admin/resource/pagination.rb +19 -0
- data/lib/active_admin/resource/routes.rb +99 -0
- data/lib/active_admin/resource/scope_to.rb +74 -0
- data/lib/active_admin/resource/scopes.rb +50 -0
- data/lib/active_admin/resource/sidebars.rb +28 -0
- data/lib/active_admin/resource_collection.rb +70 -0
- data/lib/active_admin/resource_controller.rb +50 -0
- data/lib/active_admin/resource_controller/action_builder.rb +21 -0
- data/lib/active_admin/resource_controller/data_access.rb +284 -0
- data/lib/active_admin/resource_controller/decorators.rb +100 -0
- data/lib/active_admin/resource_controller/resource_class_methods.rb +24 -0
- data/lib/active_admin/resource_controller/scoping.rb +31 -0
- data/lib/active_admin/resource_controller/sidebars.rb +18 -0
- data/lib/active_admin/resource_dsl.rb +171 -0
- data/lib/active_admin/router.rb +106 -0
- data/lib/active_admin/scope.rb +57 -0
- data/lib/active_admin/sidebar_section.rb +45 -0
- data/lib/active_admin/version.rb +3 -0
- data/lib/active_admin/view_factory.rb +27 -0
- data/lib/active_admin/view_helpers.rb +21 -0
- data/lib/active_admin/view_helpers/active_admin_application_helper.rb +12 -0
- data/lib/active_admin/view_helpers/assigns_with_indifferent_access_helper.rb +7 -0
- data/lib/active_admin/view_helpers/auto_link_helper.rb +37 -0
- data/lib/active_admin/view_helpers/breadcrumb_helper.rb +27 -0
- data/lib/active_admin/view_helpers/display_helper.rb +64 -0
- data/lib/active_admin/view_helpers/download_format_links_helper.rb +49 -0
- data/lib/active_admin/view_helpers/fields_for.rb +50 -0
- data/lib/active_admin/view_helpers/flash_helper.rb +13 -0
- data/lib/active_admin/view_helpers/form_helper.rb +21 -0
- data/lib/active_admin/view_helpers/icon_helper.rb +12 -0
- data/lib/active_admin/view_helpers/method_or_proc_helper.rb +93 -0
- data/lib/active_admin/view_helpers/sidebar_helper.rb +15 -0
- data/lib/active_admin/view_helpers/title_helper.rb +11 -0
- data/lib/active_admin/view_helpers/view_factory_helper.rb +11 -0
- data/lib/active_admin/views.rb +8 -0
- data/lib/active_admin/views/action_items.rb +17 -0
- data/lib/active_admin/views/components/action_list_popover.rb +29 -0
- data/lib/active_admin/views/components/attributes_table.rb +105 -0
- data/lib/active_admin/views/components/blank_slate.rb +17 -0
- data/lib/active_admin/views/components/columns.rb +157 -0
- data/lib/active_admin/views/components/dropdown_menu.rb +73 -0
- data/lib/active_admin/views/components/index_list.rb +68 -0
- data/lib/active_admin/views/components/paginated_collection.rb +126 -0
- data/lib/active_admin/views/components/panel.rb +34 -0
- data/lib/active_admin/views/components/popover.rb +27 -0
- data/lib/active_admin/views/components/scopes.rb +66 -0
- data/lib/active_admin/views/components/sidebar_section.rb +29 -0
- data/lib/active_admin/views/components/site_title.rb +55 -0
- data/lib/active_admin/views/components/status_tag.rb +67 -0
- data/lib/active_admin/views/components/table_for.rb +212 -0
- data/lib/active_admin/views/footer.rb +20 -0
- data/lib/active_admin/views/header.rb +32 -0
- data/lib/active_admin/views/index_as_block.rb +36 -0
- data/lib/active_admin/views/index_as_blog.rb +156 -0
- data/lib/active_admin/views/index_as_grid.rb +80 -0
- data/lib/active_admin/views/index_as_table.rb +277 -0
- data/lib/active_admin/views/pages/base.rb +139 -0
- data/lib/active_admin/views/pages/form.rb +51 -0
- data/lib/active_admin/views/pages/index.rb +163 -0
- data/lib/active_admin/views/pages/layout.rb +26 -0
- data/lib/active_admin/views/pages/page.rb +30 -0
- data/lib/active_admin/views/pages/show.rb +59 -0
- data/lib/active_admin/views/tabbed_navigation.rb +62 -0
- data/lib/active_admin/views/title_bar.rb +55 -0
- data/lib/activeadmin.rb +1 -0
- data/lib/generators/active_admin/assets/assets_generator.rb +16 -0
- data/lib/generators/active_admin/assets/templates/active_admin.css.scss +17 -0
- data/lib/generators/active_admin/assets/templates/active_admin.js.coffee +1 -0
- data/lib/generators/active_admin/devise/devise_generator.rb +66 -0
- data/lib/generators/active_admin/install/install_generator.rb +46 -0
- data/lib/generators/active_admin/install/templates/active_admin.rb.erb +243 -0
- data/lib/generators/active_admin/install/templates/admin_user.rb.erb +30 -0
- data/lib/generators/active_admin/install/templates/dashboard.rb +33 -0
- data/lib/generators/active_admin/install/templates/migrations/create_active_admin_comments.rb +19 -0
- data/lib/generators/active_admin/resource/resource_generator.rb +16 -0
- data/lib/generators/active_admin/resource/templates/admin.rb +17 -0
- data/lib/ransack_ext.rb +12 -0
- data/script/local +44 -0
- data/script/use_rails +53 -0
- data/spec/integration/default_namespace_spec.rb +61 -0
- data/spec/integration/javascript_spec.rb +20 -0
- data/spec/integration/memory_spec.rb +29 -0
- data/spec/integration/stylesheets_spec.rb +18 -0
- data/spec/javascripts/coffeescripts/jquery.aa.checkbox-toggler-spec.js.coffee +50 -0
- data/spec/javascripts/coffeescripts/jquery.aa.popover-spec.js.coffee +82 -0
- data/spec/javascripts/coffeescripts/jquery.aa.table-checkbox-toggler-spec.js.coffee +34 -0
- data/spec/javascripts/compiled/jquery.aa.checkbox-toggler-spec.js +60 -0
- data/spec/javascripts/compiled/jquery.aa.popover-spec.js +106 -0
- data/spec/javascripts/compiled/jquery.aa.table-checkbox-toggler-spec.js +37 -0
- data/spec/javascripts/fixtures/checkboxes.html +9 -0
- data/spec/javascripts/fixtures/table_checkboxes.html +17 -0
- data/spec/javascripts/helpers/SpecHelper.js +3 -0
- data/spec/javascripts/helpers/vendor/jasmine-fixture-0.0.5.js +108 -0
- data/spec/javascripts/helpers/vendor/jasmine-jquery.js +288 -0
- data/spec/javascripts/helpers/vendor/sinon-1.2.0.js +2915 -0
- data/spec/javascripts/support/jasmine.yml +74 -0
- data/spec/javascripts/support/jasmine_config.rb +23 -0
- data/spec/javascripts/support/jasmine_runner.rb +32 -0
- data/spec/javascripts/support/jquery-ui-1.8.16.custom.min.js +34 -0
- data/spec/javascripts/support/jquery.min.js +4 -0
- data/spec/spec_helper.rb +182 -0
- data/spec/spec_helper_without_rails.rb +16 -0
- data/spec/support/deferred_garbage_collection.rb +19 -0
- data/spec/support/detect_rails_version.rb +42 -0
- data/spec/support/integration_example_group.rb +31 -0
- data/spec/support/jslint.yml +80 -0
- data/spec/support/rails_template.rb +117 -0
- data/spec/support/rails_template_with_data.rb +59 -0
- data/spec/support/templates/admin/stores.rb +11 -0
- data/spec/support/templates/cucumber.rb +24 -0
- data/spec/support/templates/cucumber_with_reloading.rb +5 -0
- data/spec/support/templates/en.yml +8 -0
- data/spec/support/templates/policies/active_admin/comment_policy.rb +9 -0
- data/spec/support/templates/policies/active_admin/page_policy.rb +18 -0
- data/spec/support/templates/policies/admin_user_policy.rb +11 -0
- data/spec/support/templates/policies/application_policy.rb +45 -0
- data/spec/support/templates/policies/category_policy.rb +7 -0
- data/spec/support/templates/policies/post_policy.rb +15 -0
- data/spec/support/templates/policies/store_policy.rb +11 -0
- data/spec/support/templates/policies/user_policy.rb +11 -0
- data/spec/support/templates/post_decorator.rb +11 -0
- data/spec/unit/abstract_view_factory_spec.rb +79 -0
- data/spec/unit/action_builder_spec.rb +126 -0
- data/spec/unit/active_admin_spec.rb +11 -0
- data/spec/unit/application_spec.rb +140 -0
- data/spec/unit/asset_registration_spec.rb +52 -0
- data/spec/unit/authorization/authorization_adapter_spec.rb +61 -0
- data/spec/unit/authorization/controller_authorization_spec.rb +39 -0
- data/spec/unit/auto_link_spec.rb +34 -0
- data/spec/unit/batch_actions/resource_spec.rb +92 -0
- data/spec/unit/batch_actions/settings_spec.rb +61 -0
- data/spec/unit/belongs_to_spec.rb +42 -0
- data/spec/unit/cancan_adapter_spec.rb +43 -0
- data/spec/unit/comments_spec.rb +144 -0
- data/spec/unit/component_spec.rb +18 -0
- data/spec/unit/config_shared_examples.rb +59 -0
- data/spec/unit/controller_filters_spec.rb +37 -0
- data/spec/unit/csv_builder_spec.rb +134 -0
- data/spec/unit/devise_spec.rb +116 -0
- data/spec/unit/dsl_spec.rb +61 -0
- data/spec/unit/event_spec.rb +47 -0
- data/spec/unit/filters/filter_form_builder_spec.rb +418 -0
- data/spec/unit/filters/resource_spec.rb +121 -0
- data/spec/unit/form_builder_spec.rb +576 -0
- data/spec/unit/generators/install_spec.rb +23 -0
- data/spec/unit/helpers/collection_spec.rb +65 -0
- data/spec/unit/helpers/scope_chain_spec.rb +36 -0
- data/spec/unit/helpers/settings_spec.rb +30 -0
- data/spec/unit/menu_collection_spec.rb +62 -0
- data/spec/unit/menu_item_spec.rb +143 -0
- data/spec/unit/menu_spec.rb +71 -0
- data/spec/unit/namespace/authorization_spec.rb +27 -0
- data/spec/unit/namespace/register_page_spec.rb +74 -0
- data/spec/unit/namespace/register_resource_spec.rb +163 -0
- data/spec/unit/namespace_spec.rb +103 -0
- data/spec/unit/order_clause_spec.rb +57 -0
- data/spec/unit/page_controller_spec.rb +5 -0
- data/spec/unit/page_spec.rb +72 -0
- data/spec/unit/pretty_format_spec.rb +63 -0
- data/spec/unit/pundit_adapter_spec.rb +36 -0
- data/spec/unit/resource/action_items_spec.rb +62 -0
- data/spec/unit/resource/menu_spec.rb +18 -0
- data/spec/unit/resource/naming_spec.rb +122 -0
- data/spec/unit/resource/page_presenters_spec.rb +44 -0
- data/spec/unit/resource/pagination_spec.rb +38 -0
- data/spec/unit/resource/routes_spec.rb +73 -0
- data/spec/unit/resource/scopes_spec.rb +50 -0
- data/spec/unit/resource/sidebars_spec.rb +43 -0
- data/spec/unit/resource_collection_spec.rb +158 -0
- data/spec/unit/resource_controller/data_access_spec.rb +73 -0
- data/spec/unit/resource_controller/decorators_spec.rb +86 -0
- data/spec/unit/resource_controller/sidebars_spec.rb +46 -0
- data/spec/unit/resource_controller_spec.rb +265 -0
- data/spec/unit/resource_registration_spec.rb +56 -0
- data/spec/unit/resource_spec.rb +263 -0
- data/spec/unit/routing_spec.rb +172 -0
- data/spec/unit/scope_spec.rb +114 -0
- data/spec/unit/settings_spec.rb +88 -0
- data/spec/unit/view_factory_spec.rb +21 -0
- data/spec/unit/view_helpers/breadcrumbs_spec.rb +180 -0
- data/spec/unit/view_helpers/display_name_spec.rb +68 -0
- data/spec/unit/view_helpers/download_format_links_helper_spec.rb +39 -0
- data/spec/unit/view_helpers/fields_for_spec.rb +50 -0
- data/spec/unit/view_helpers/form_helper_spec.rb +42 -0
- data/spec/unit/view_helpers/method_or_proc_helper_spec.rb +97 -0
- data/spec/unit/views/components/action_list_popover_spec.rb +29 -0
- data/spec/unit/views/components/attributes_table_spec.rb +259 -0
- data/spec/unit/views/components/batch_action_popover_spec.rb +33 -0
- data/spec/unit/views/components/blank_slate_spec.rb +17 -0
- data/spec/unit/views/components/columns_spec.rb +172 -0
- data/spec/unit/views/components/index_list_spec.rb +32 -0
- data/spec/unit/views/components/paginated_collection_spec.rb +229 -0
- data/spec/unit/views/components/panel_spec.rb +51 -0
- data/spec/unit/views/components/popover_spec.rb +33 -0
- data/spec/unit/views/components/sidebar_section_spec.rb +47 -0
- data/spec/unit/views/components/site_title_spec.rb +78 -0
- data/spec/unit/views/components/status_tag_spec.rb +102 -0
- data/spec/unit/views/components/table_for_spec.rb +242 -0
- data/spec/unit/views/pages/form_spec.rb +35 -0
- data/spec/unit/views/pages/layout_spec.rb +63 -0
- data/spec/unit/views/pages/show_spec.rb +20 -0
- data/spec/unit/views/tabbed_navigation_spec.rb +149 -0
- data/tasks/docs.rake +37 -0
- data/tasks/js.rake +32 -0
- data/tasks/parallel_tests.rake +60 -0
- data/tasks/test.rake +79 -0
- data/tasks/yard.rake +7 -0
- metadata +741 -0
|
@@ -0,0 +1,576 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
|
|
3
|
+
describe ActiveAdmin::FormBuilder do
|
|
4
|
+
|
|
5
|
+
# Setup an ActionView::Base object which can be used for
|
|
6
|
+
# generating the form for.
|
|
7
|
+
let(:helpers) do
|
|
8
|
+
view = action_view
|
|
9
|
+
def view.posts_path
|
|
10
|
+
"/posts"
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
def view.protect_against_forgery?
|
|
14
|
+
false
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
def view.url_for(*args)
|
|
18
|
+
if args.first == {action: "index"}
|
|
19
|
+
posts_path
|
|
20
|
+
else
|
|
21
|
+
super
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
def view.a_helper_method
|
|
26
|
+
"A Helper Method"
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
view
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
def build_form(options = {}, form_object = Post.new, &block)
|
|
33
|
+
options = {url: helpers.posts_path}.merge(options)
|
|
34
|
+
|
|
35
|
+
render_arbre_component({form_object: form_object, form_options: options, form_block: block}, helpers)do
|
|
36
|
+
text_node active_admin_form_for(assigns[:form_object], assigns[:form_options], &assigns[:form_block])
|
|
37
|
+
end.to_s
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
context "in general with actions" do
|
|
41
|
+
let :body do
|
|
42
|
+
build_form do |f|
|
|
43
|
+
f.inputs do
|
|
44
|
+
f.input :title
|
|
45
|
+
f.input :body
|
|
46
|
+
end
|
|
47
|
+
f.actions do
|
|
48
|
+
f.action :submit, label: "Submit Me"
|
|
49
|
+
f.action :submit, label: "Another Button"
|
|
50
|
+
end
|
|
51
|
+
end
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
it "should generate a text input" do
|
|
55
|
+
body.should have_tag("input", attributes: { type: "text",
|
|
56
|
+
name: "post[title]" })
|
|
57
|
+
end
|
|
58
|
+
it "should generate a textarea" do
|
|
59
|
+
body.should have_tag("textarea", attributes: { name: "post[body]" })
|
|
60
|
+
end
|
|
61
|
+
it "should only generate the form once" do
|
|
62
|
+
body.scan(/Title/).size.should == 1
|
|
63
|
+
end
|
|
64
|
+
it "should generate actions" do
|
|
65
|
+
body.should have_tag("input", attributes: { type: "submit",
|
|
66
|
+
value: "Submit Me" })
|
|
67
|
+
body.should have_tag("input", attributes: { type: "submit",
|
|
68
|
+
value: "Another Button" })
|
|
69
|
+
end
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
context "when polymorphic relationship" do
|
|
73
|
+
it "should raise error" do
|
|
74
|
+
expect {
|
|
75
|
+
comment = ActiveAdmin::Comment.new
|
|
76
|
+
build_form({url: "admins/comments"}, comment) do |f|
|
|
77
|
+
f.inputs :resource
|
|
78
|
+
end
|
|
79
|
+
}.to raise_error(Formtastic::PolymorphicInputWithoutCollectionError)
|
|
80
|
+
end
|
|
81
|
+
end
|
|
82
|
+
|
|
83
|
+
describe "passing in options with actions" do
|
|
84
|
+
let :body do
|
|
85
|
+
build_form html: { multipart: true } do |f|
|
|
86
|
+
f.inputs :title
|
|
87
|
+
f.actions
|
|
88
|
+
end
|
|
89
|
+
end
|
|
90
|
+
it "should pass the options on to the form" do
|
|
91
|
+
body.should have_tag("form", attributes: { enctype: "multipart/form-data" })
|
|
92
|
+
end
|
|
93
|
+
end
|
|
94
|
+
|
|
95
|
+
describe "passing in options with actions" do
|
|
96
|
+
let :body do
|
|
97
|
+
build_form html: { multipart: true } do |f|
|
|
98
|
+
f.inputs :title
|
|
99
|
+
f.actions
|
|
100
|
+
end
|
|
101
|
+
end
|
|
102
|
+
it "should pass the options on to the form" do
|
|
103
|
+
body.should have_tag("form", attributes: { enctype: "multipart/form-data" })
|
|
104
|
+
end
|
|
105
|
+
end
|
|
106
|
+
|
|
107
|
+
|
|
108
|
+
context "with actions" do
|
|
109
|
+
it "should generate the form once" do
|
|
110
|
+
body = build_form do |f|
|
|
111
|
+
f.inputs do
|
|
112
|
+
f.input :title
|
|
113
|
+
end
|
|
114
|
+
f.actions
|
|
115
|
+
end
|
|
116
|
+
body.scan(/id="post_title"/).size.should == 1
|
|
117
|
+
end
|
|
118
|
+
it "should generate one button and a cancel link" do
|
|
119
|
+
body = build_form do |f|
|
|
120
|
+
f.actions
|
|
121
|
+
end
|
|
122
|
+
body.scan(/type="submit"/).size.should == 1
|
|
123
|
+
body.scan(/class="cancel"/).size.should == 1
|
|
124
|
+
end
|
|
125
|
+
it "should generate multiple actions" do
|
|
126
|
+
body = build_form do |f|
|
|
127
|
+
f.actions do
|
|
128
|
+
f.action :submit, label: "Create & Continue"
|
|
129
|
+
f.action :submit, label: "Create & Edit"
|
|
130
|
+
end
|
|
131
|
+
end
|
|
132
|
+
body.scan(/type="submit"/).size.should == 2
|
|
133
|
+
body.scan(/class="cancel"/).size.should == 0
|
|
134
|
+
end
|
|
135
|
+
|
|
136
|
+
end
|
|
137
|
+
|
|
138
|
+
context "with actions" do
|
|
139
|
+
it "should generate the form once" do
|
|
140
|
+
body = build_form do |f|
|
|
141
|
+
f.inputs do
|
|
142
|
+
f.input :title
|
|
143
|
+
end
|
|
144
|
+
f.actions
|
|
145
|
+
end
|
|
146
|
+
body.scan(/id="post_title"/).size.should == 1
|
|
147
|
+
end
|
|
148
|
+
it "should generate one button and a cancel link" do
|
|
149
|
+
body = build_form do |f|
|
|
150
|
+
f.actions
|
|
151
|
+
end
|
|
152
|
+
body.scan(/type="submit"/).size.should == 1
|
|
153
|
+
body.scan(/class="cancel"/).size.should == 1
|
|
154
|
+
end
|
|
155
|
+
it "should generate multiple actions" do
|
|
156
|
+
body = build_form do |f|
|
|
157
|
+
f.actions do
|
|
158
|
+
f.action :submit, label: "Create & Continue"
|
|
159
|
+
f.action :submit, label: "Create & Edit"
|
|
160
|
+
end
|
|
161
|
+
end
|
|
162
|
+
body.scan(/type="submit"/).size.should == 2
|
|
163
|
+
body.scan(/class="cancel"/).size.should == 0
|
|
164
|
+
end
|
|
165
|
+
end
|
|
166
|
+
|
|
167
|
+
context "without passing a block to inputs" do
|
|
168
|
+
let :body do
|
|
169
|
+
build_form do |f|
|
|
170
|
+
f.inputs :title, :body
|
|
171
|
+
end
|
|
172
|
+
end
|
|
173
|
+
it "should have a title input" do
|
|
174
|
+
body.should have_tag("input", attributes: { type: "text",
|
|
175
|
+
name: "post[title]" })
|
|
176
|
+
end
|
|
177
|
+
it "should have a body textarea" do
|
|
178
|
+
body.should have_tag("textarea", attributes: { name: "post[body]" })
|
|
179
|
+
end
|
|
180
|
+
end
|
|
181
|
+
|
|
182
|
+
context "with semantic fields for" do
|
|
183
|
+
let :body do
|
|
184
|
+
build_form do |f|
|
|
185
|
+
f.inputs do
|
|
186
|
+
f.input :title
|
|
187
|
+
f.input :body
|
|
188
|
+
end
|
|
189
|
+
f.instance_eval do
|
|
190
|
+
@object.author = User.new
|
|
191
|
+
end
|
|
192
|
+
f.semantic_fields_for :author do |author|
|
|
193
|
+
author.inputs :first_name, :last_name
|
|
194
|
+
end
|
|
195
|
+
end
|
|
196
|
+
end
|
|
197
|
+
it "should generate a nested text input once" do
|
|
198
|
+
body.scan("post_author_attributes_first_name_input").size.should == 1
|
|
199
|
+
end
|
|
200
|
+
end
|
|
201
|
+
|
|
202
|
+
context "with collection inputs" do
|
|
203
|
+
before do
|
|
204
|
+
User.create first_name: "John", last_name: "Doe"
|
|
205
|
+
User.create first_name: "Jane", last_name: "Doe"
|
|
206
|
+
end
|
|
207
|
+
|
|
208
|
+
describe "as select" do
|
|
209
|
+
let :body do
|
|
210
|
+
build_form do |f|
|
|
211
|
+
f.input :author
|
|
212
|
+
end
|
|
213
|
+
end
|
|
214
|
+
it "should create 2 options" do
|
|
215
|
+
body.scan(/<option/).size.should == 3
|
|
216
|
+
end
|
|
217
|
+
end
|
|
218
|
+
|
|
219
|
+
describe "as radio buttons" do
|
|
220
|
+
let :body do
|
|
221
|
+
build_form do |f|
|
|
222
|
+
f.input :author, as: :radio
|
|
223
|
+
end
|
|
224
|
+
end
|
|
225
|
+
it "should create 2 radio buttons" do
|
|
226
|
+
body.scan(/type="radio"/).size.should == 2
|
|
227
|
+
end
|
|
228
|
+
end
|
|
229
|
+
|
|
230
|
+
end
|
|
231
|
+
|
|
232
|
+
context "with inputs 'for'" do
|
|
233
|
+
let :body do
|
|
234
|
+
build_form do |f|
|
|
235
|
+
f.inputs do
|
|
236
|
+
f.input :title
|
|
237
|
+
f.input :body
|
|
238
|
+
end
|
|
239
|
+
f.instance_eval do
|
|
240
|
+
@object.author = User.new
|
|
241
|
+
end
|
|
242
|
+
f.inputs name: 'Author', for: :author do |author|
|
|
243
|
+
author.inputs :first_name, :last_name
|
|
244
|
+
end
|
|
245
|
+
end
|
|
246
|
+
end
|
|
247
|
+
it "should generate a nested text input once" do
|
|
248
|
+
body.scan("post_author_attributes_first_name_input").size.should == 1
|
|
249
|
+
end
|
|
250
|
+
it "should add an author first name field" do
|
|
251
|
+
body.should have_tag("input", attributes: { name: "post[author_attributes][first_name]"})
|
|
252
|
+
end
|
|
253
|
+
end
|
|
254
|
+
|
|
255
|
+
context "with wrapper html" do
|
|
256
|
+
it "should set a class" do
|
|
257
|
+
body = build_form do |f|
|
|
258
|
+
f.input :title, wrapper_html: { class: "important" }
|
|
259
|
+
end
|
|
260
|
+
body.should have_tag("li", attributes: {class: "important string input optional stringish"})
|
|
261
|
+
end
|
|
262
|
+
end
|
|
263
|
+
|
|
264
|
+
context "with has many inputs" do
|
|
265
|
+
describe "with simple block" do
|
|
266
|
+
let :body do
|
|
267
|
+
build_form({url: '/categories'}, Category.new) do |f|
|
|
268
|
+
f.object.posts.build
|
|
269
|
+
f.has_many :posts do |p|
|
|
270
|
+
p.input :title
|
|
271
|
+
end
|
|
272
|
+
end
|
|
273
|
+
end
|
|
274
|
+
|
|
275
|
+
it "should translate the association name in header" do
|
|
276
|
+
with_translation activerecord: {models: {post: {one: 'Blog Post', other: 'Blog Posts'}}} do
|
|
277
|
+
body.should have_tag('h3', 'Blog Posts')
|
|
278
|
+
end
|
|
279
|
+
end
|
|
280
|
+
|
|
281
|
+
it "should use model name when there is no translation for given model in header" do
|
|
282
|
+
body.should have_tag('h3', 'Post')
|
|
283
|
+
end
|
|
284
|
+
|
|
285
|
+
it "should translate the association name in has many new button" do
|
|
286
|
+
with_translation activerecord: {models: {post: {one: 'Blog Post', other: 'Blog Posts'}}} do
|
|
287
|
+
body.should have_tag('a', 'Add New Blog Post')
|
|
288
|
+
end
|
|
289
|
+
end
|
|
290
|
+
|
|
291
|
+
it "should translate the attribute name" do
|
|
292
|
+
with_translation activerecord: {attributes: {post: {title: 'A very nice title'}}} do
|
|
293
|
+
body.should have_tag 'label', 'A very nice title'
|
|
294
|
+
end
|
|
295
|
+
end
|
|
296
|
+
|
|
297
|
+
it "should use model name when there is no translation for given model in has many new button" do
|
|
298
|
+
body.should have_tag('a', 'Add New Post')
|
|
299
|
+
end
|
|
300
|
+
|
|
301
|
+
it "should render the nested form" do
|
|
302
|
+
body.should have_tag("input", attributes: {name: "category[posts_attributes][0][title]"})
|
|
303
|
+
end
|
|
304
|
+
|
|
305
|
+
it "should add a link to remove new nested records" do
|
|
306
|
+
Capybara.string(body).should have_css '.has_many_container > fieldset > ol > li > a', href: '#',
|
|
307
|
+
content: 'Remove', class: 'button has_many_remove', data: {placeholder: 'NEW_POST_RECORD'}
|
|
308
|
+
end
|
|
309
|
+
|
|
310
|
+
it "should add a link to add new nested records" do
|
|
311
|
+
Capybara.string(body).should have_css(".has_many_container > fieldset > ol > li > a", class: "button", href: "#", content: "Add New Post")
|
|
312
|
+
end
|
|
313
|
+
end
|
|
314
|
+
|
|
315
|
+
describe "with complex block" do
|
|
316
|
+
let :body do
|
|
317
|
+
build_form({url: '/categories'}, Category.new) do |f|
|
|
318
|
+
f.object.posts.build
|
|
319
|
+
f.has_many :posts do |p,i|
|
|
320
|
+
p.input :title, label: "Title #{i}"
|
|
321
|
+
end
|
|
322
|
+
end
|
|
323
|
+
end
|
|
324
|
+
|
|
325
|
+
it "should accept a block with a second argument" do
|
|
326
|
+
body.should have_tag("label", "Title 1")
|
|
327
|
+
end
|
|
328
|
+
|
|
329
|
+
it "should add a custom header" do
|
|
330
|
+
body.should have_tag('h3', 'Post')
|
|
331
|
+
end
|
|
332
|
+
|
|
333
|
+
end
|
|
334
|
+
|
|
335
|
+
describe "without heading and new record link" do
|
|
336
|
+
let :body do
|
|
337
|
+
build_form({url: '/categories'}, Category.new) do |f|
|
|
338
|
+
f.object.posts.build
|
|
339
|
+
f.has_many :posts, heading: false, new_record: false do |p|
|
|
340
|
+
p.input :title
|
|
341
|
+
end
|
|
342
|
+
end
|
|
343
|
+
end
|
|
344
|
+
|
|
345
|
+
it "should not add a header" do
|
|
346
|
+
body.should_not have_tag('h3', 'Post')
|
|
347
|
+
end
|
|
348
|
+
|
|
349
|
+
it "should not add link to new nested records" do
|
|
350
|
+
body.should_not have_tag('a', 'Add New Post')
|
|
351
|
+
end
|
|
352
|
+
|
|
353
|
+
it "should render the nested form" do
|
|
354
|
+
body.should have_tag("input", attributes: {name: "category[posts_attributes][0][title]"})
|
|
355
|
+
end
|
|
356
|
+
end
|
|
357
|
+
|
|
358
|
+
describe "with custom heading" do
|
|
359
|
+
let :body do
|
|
360
|
+
build_form({url: '/categories'}, Category.new) do |f|
|
|
361
|
+
f.object.posts.build
|
|
362
|
+
f.has_many :posts, heading: "Test heading" do |p|
|
|
363
|
+
p.input :title
|
|
364
|
+
end
|
|
365
|
+
end
|
|
366
|
+
end
|
|
367
|
+
|
|
368
|
+
it "should add a custom header" do
|
|
369
|
+
body.should have_tag('h3', 'Test heading')
|
|
370
|
+
end
|
|
371
|
+
|
|
372
|
+
end
|
|
373
|
+
|
|
374
|
+
describe "with custom new record link" do
|
|
375
|
+
let :body do
|
|
376
|
+
build_form({url: '/categories'}, Category.new) do |f|
|
|
377
|
+
f.object.posts.build
|
|
378
|
+
f.has_many :posts, new_record: 'My Custom New Post' do |p|
|
|
379
|
+
p.input :title
|
|
380
|
+
end
|
|
381
|
+
end
|
|
382
|
+
end
|
|
383
|
+
|
|
384
|
+
it "should add a custom new record link" do
|
|
385
|
+
body.should have_tag('a', 'My Custom New Post')
|
|
386
|
+
end
|
|
387
|
+
|
|
388
|
+
end
|
|
389
|
+
|
|
390
|
+
describe "with allow destroy" do
|
|
391
|
+
context "with an existing post" do
|
|
392
|
+
let :body do
|
|
393
|
+
build_form({url: '/categories'}, Category.new) do |f|
|
|
394
|
+
f.object.posts.build.stub(:new_record? => false)
|
|
395
|
+
f.has_many :posts, allow_destroy: true do |p|
|
|
396
|
+
p.input :title
|
|
397
|
+
end
|
|
398
|
+
end
|
|
399
|
+
end
|
|
400
|
+
|
|
401
|
+
it "should include a boolean field for _destroy" do
|
|
402
|
+
body.should have_tag("input", attributes: {name: "category[posts_attributes][0][_destroy]"})
|
|
403
|
+
end
|
|
404
|
+
|
|
405
|
+
it "should have a check box with 'Remove' as its label" do
|
|
406
|
+
body.should have_tag("label", attributes: {for: "category_posts_attributes_0__destroy"}, content: "Delete")
|
|
407
|
+
end
|
|
408
|
+
|
|
409
|
+
it "should wrap the destroy field in an li with class 'has_many_delete'" do
|
|
410
|
+
Capybara.string(body).should have_css(".has_many_container > fieldset > ol > li.has_many_delete > input")
|
|
411
|
+
end
|
|
412
|
+
end
|
|
413
|
+
|
|
414
|
+
context "with a new post" do
|
|
415
|
+
let :body do
|
|
416
|
+
build_form({url: '/categories'}, Category.new) do |f|
|
|
417
|
+
f.object.posts.build
|
|
418
|
+
f.has_many :posts, allow_destroy: true do |p|
|
|
419
|
+
p.input :title
|
|
420
|
+
end
|
|
421
|
+
end
|
|
422
|
+
end
|
|
423
|
+
|
|
424
|
+
it "should not have a boolean field for _destroy" do
|
|
425
|
+
body.should_not have_tag("input", attributes: {name: "category[posts_attributes][0][_destroy]"})
|
|
426
|
+
end
|
|
427
|
+
|
|
428
|
+
it "should not have a check box with 'Remove' as its label" do
|
|
429
|
+
body.should_not have_tag("label", attributes: {for: "category_posts_attributes_0__destroy"}, content: "Remove")
|
|
430
|
+
end
|
|
431
|
+
end
|
|
432
|
+
end
|
|
433
|
+
|
|
434
|
+
describe "sortable" do
|
|
435
|
+
# TODO: it doesn't make any sense to use your foreign key as something that's sortable (and therefore editable)
|
|
436
|
+
context "with a new post" do
|
|
437
|
+
let :body do
|
|
438
|
+
build_form({url: '/categories'}, Category.new) do |f|
|
|
439
|
+
f.object.posts.build
|
|
440
|
+
f.has_many :posts, sortable: :custom_category_id do |p|
|
|
441
|
+
p.input :title
|
|
442
|
+
end
|
|
443
|
+
end
|
|
444
|
+
end
|
|
445
|
+
|
|
446
|
+
it "shows the nested fields for unsaved records" do
|
|
447
|
+
body.should have_tag("fieldset", attributes: {class: "inputs has_many_fields"})
|
|
448
|
+
end
|
|
449
|
+
|
|
450
|
+
end
|
|
451
|
+
end
|
|
452
|
+
|
|
453
|
+
describe "with nesting" do
|
|
454
|
+
context "in an inputs block" do
|
|
455
|
+
let :body do
|
|
456
|
+
build_form({url: '/categories'}, Category.new) do |f|
|
|
457
|
+
f.inputs "Field Wrapper" do
|
|
458
|
+
f.object.posts.build
|
|
459
|
+
f.has_many :posts do |p|
|
|
460
|
+
p.input :title
|
|
461
|
+
end
|
|
462
|
+
end
|
|
463
|
+
end
|
|
464
|
+
end
|
|
465
|
+
|
|
466
|
+
it "should wrap the has_many fieldset in an li" do
|
|
467
|
+
Capybara.string(body).should have_css("ol > li.has_many_container")
|
|
468
|
+
end
|
|
469
|
+
|
|
470
|
+
it "should have a direct fieldset child" do
|
|
471
|
+
Capybara.string(body).should have_css("li.has_many_container > fieldset")
|
|
472
|
+
end
|
|
473
|
+
|
|
474
|
+
it "should not contain invalid li children" do
|
|
475
|
+
Capybara.string(body).should_not have_css("div.has_many_container > li")
|
|
476
|
+
end
|
|
477
|
+
end
|
|
478
|
+
|
|
479
|
+
context "in another has_many block" do
|
|
480
|
+
let :body do
|
|
481
|
+
build_form({url: '/categories'}, Category.new) do |f|
|
|
482
|
+
f.object.posts.build
|
|
483
|
+
f.has_many :posts do |p|
|
|
484
|
+
p.object.taggings.build
|
|
485
|
+
p.has_many :taggings do |t|
|
|
486
|
+
t.input :tag
|
|
487
|
+
end
|
|
488
|
+
end
|
|
489
|
+
end
|
|
490
|
+
end
|
|
491
|
+
|
|
492
|
+
it "should wrap the inner has_many fieldset in an ol > li" do
|
|
493
|
+
Capybara.string(body).should have_css(".has_many_container ol > li.has_many_container > fieldset")
|
|
494
|
+
end
|
|
495
|
+
|
|
496
|
+
it "should not contain invalid li children" do
|
|
497
|
+
Capybara.string(body).should_not have_css(".has_many_container div.has_many_container > li")
|
|
498
|
+
end
|
|
499
|
+
end
|
|
500
|
+
end
|
|
501
|
+
|
|
502
|
+
pending "should render the block if it returns nil" do
|
|
503
|
+
body = build_form({url: '/categories'}, Category.new) do |f|
|
|
504
|
+
f.object.posts.build
|
|
505
|
+
f.has_many :posts do |p|
|
|
506
|
+
p.input :title
|
|
507
|
+
nil
|
|
508
|
+
end
|
|
509
|
+
end
|
|
510
|
+
|
|
511
|
+
body.should have_tag("input", attributes: {name: "category[posts_attributes][0][title]"})
|
|
512
|
+
end
|
|
513
|
+
end
|
|
514
|
+
|
|
515
|
+
{ # Testing that the same input can be used multiple times
|
|
516
|
+
"f.input :title, as: :string" => /id="post_title"/,
|
|
517
|
+
"f.input :title, as: :text" => /id="post_title"/,
|
|
518
|
+
"f.input :created_at, as: :time_select" => /id="post_created_at_2i"/,
|
|
519
|
+
"f.input :created_at, as: :datetime_select" => /id="post_created_at_2i"/,
|
|
520
|
+
"f.input :created_at, as: :date_select" => /id="post_created_at_2i"/,
|
|
521
|
+
# Testing that return values don't screw up the form
|
|
522
|
+
"f.input :title; nil" => /id="post_title"/,
|
|
523
|
+
"f.input :title; []" => /id="post_title"/,
|
|
524
|
+
"[:title].each{ |r| f.input r }" => /id="post_title"/,
|
|
525
|
+
"[:title].map { |r| f.input r }" => /id="post_title"/,
|
|
526
|
+
}.each do |source, regex|
|
|
527
|
+
it "should properly buffer `#{source}`" do
|
|
528
|
+
body = build_form do |f|
|
|
529
|
+
f.inputs do
|
|
530
|
+
eval source
|
|
531
|
+
eval source
|
|
532
|
+
end
|
|
533
|
+
end
|
|
534
|
+
body.scan(regex).size.should == 2
|
|
535
|
+
end
|
|
536
|
+
end
|
|
537
|
+
|
|
538
|
+
describe "datepicker input" do
|
|
539
|
+
context 'with default options' do
|
|
540
|
+
let :body do
|
|
541
|
+
build_form do |f|
|
|
542
|
+
f.inputs do
|
|
543
|
+
f.input :created_at, as: :datepicker
|
|
544
|
+
end
|
|
545
|
+
end
|
|
546
|
+
end
|
|
547
|
+
it "should generate a text input with the class of datepicker" do
|
|
548
|
+
body.should have_tag("input", attributes: { type: "text",
|
|
549
|
+
class: "datepicker",
|
|
550
|
+
name: "post[created_at]" })
|
|
551
|
+
end
|
|
552
|
+
end
|
|
553
|
+
|
|
554
|
+
context 'with date range options' do
|
|
555
|
+
let :body do
|
|
556
|
+
build_form do |f|
|
|
557
|
+
f.inputs do
|
|
558
|
+
f.input :created_at, as: :datepicker,
|
|
559
|
+
datepicker_options: {
|
|
560
|
+
min_date: Date.new(2013, 10, 18),
|
|
561
|
+
max_date: "2013-12-31" }
|
|
562
|
+
end
|
|
563
|
+
end
|
|
564
|
+
it 'should generate a datepicker text input with data min and max dates' do
|
|
565
|
+
body.should have_tag("input", attributes: { type: "text",
|
|
566
|
+
class: "datepicker",
|
|
567
|
+
name: "post[created_at]",
|
|
568
|
+
data: { datepicker_options: {
|
|
569
|
+
minDate: "2013-10-18",
|
|
570
|
+
maxDate: "2013-12-31" }.to_json }})
|
|
571
|
+
end
|
|
572
|
+
end
|
|
573
|
+
end
|
|
574
|
+
end
|
|
575
|
+
|
|
576
|
+
end
|