andrewroth_activeadmin 0.3.4
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.
- data/.document +5 -0
- data/.gitignore +35 -0
- data/.travis.yml +4 -0
- data/.yardopts +8 -0
- data/CHANGELOG.md +301 -0
- data/Gemfile +40 -0
- data/Guardfile +8 -0
- data/LICENSE +25 -0
- data/README.rdoc +113 -0
- data/Rakefile +18 -0
- data/activeadmin.gemspec +28 -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/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/base.js +12 -0
- data/app/assets/javascripts/active_admin/vendor.js +382 -0
- data/app/assets/stylesheets/active_admin/_base.css.scss +363 -0
- data/app/assets/stylesheets/active_admin/_forms.css.scss +259 -0
- data/app/assets/stylesheets/active_admin/_header.css.scss +121 -0
- data/app/assets/stylesheets/active_admin/_mixins.css.scss +1 -0
- data/app/assets/stylesheets/active_admin/_typography.css.scss +102 -0
- data/app/assets/stylesheets/active_admin/components/_comments.css.scss +43 -0
- data/app/assets/stylesheets/active_admin/components/_date_picker.css.scss +125 -0
- data/app/assets/stylesheets/active_admin/components/_flash_messages.css.scss +39 -0
- data/app/assets/stylesheets/active_admin/components/_tables.css.scss +68 -0
- data/app/assets/stylesheets/active_admin/mixins/_all.css.scss +10 -0
- data/app/assets/stylesheets/active_admin/mixins/_buttons.css.scss +27 -0
- data/app/assets/stylesheets/active_admin/mixins/_gradients.css.scss +29 -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 +34 -0
- data/app/assets/stylesheets/active_admin/mixins/_shadows.css.scss +21 -0
- data/app/assets/stylesheets/active_admin/mixins/_utilities.scss +17 -0
- data/app/assets/stylesheets/active_admin/mixins/_variables.css.scss +21 -0
- data/app/views/active_admin/dashboard/index.html.arb +1 -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 +16 -0
- data/app/views/active_admin/devise/passwords/new.html.erb +14 -0
- data/app/views/active_admin/devise/sessions/new.html.erb +18 -0
- data/app/views/active_admin/devise/shared/_links.erb +20 -0
- data/app/views/active_admin/devise/unlocks/new.html.erb +12 -0
- data/app/views/active_admin/resource/edit.html.arb +1 -0
- data/app/views/active_admin/resource/index.csv.erb +20 -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/layouts/active_admin.html.arb +1 -0
- data/app/views/layouts/active_admin_logged_out.html.erb +35 -0
- data/cucumber.yml +2 -0
- data/docs/0-installation.md +50 -0
- data/docs/1-general-configuration.md +43 -0
- data/docs/2-resource-customization.md +114 -0
- data/docs/3-index-pages.md +55 -0
- data/docs/3-index-pages/index-as-block.md +16 -0
- data/docs/3-index-pages/index-as-blog.md +61 -0
- data/docs/3-index-pages/index-as-grid.md +21 -0
- data/docs/3-index-pages/index-as-table.md +90 -0
- data/docs/4-csv-format.md +14 -0
- data/docs/5-forms.md +39 -0
- data/docs/6-show-screens.md +36 -0
- data/docs/7-sidebars.md +35 -0
- data/docs/8-custom-actions.md +123 -0
- data/features/comments/commenting.feature +112 -0
- data/features/comments/viewing_index.feature +19 -0
- data/features/dashboard.feature +26 -0
- data/features/edit_page.feature +106 -0
- data/features/first_boot.feature +16 -0
- data/features/global_navigation.feature +30 -0
- data/features/index/filters.feature +35 -0
- data/features/index/format_as_csv.feature +46 -0
- data/features/index/formats.feature +12 -0
- data/features/index/index_as_block.feature +15 -0
- data/features/index/index_as_blog.feature +50 -0
- data/features/index/index_as_grid.feature +45 -0
- data/features/index/index_as_table.feature +81 -0
- data/features/index/index_blank_slate.feature +56 -0
- data/features/index/index_scopes.feature +52 -0
- data/features/index/pagination.feature +17 -0
- data/features/menu.feature +37 -0
- data/features/new_page.feature +75 -0
- data/features/registering_assets.feature +35 -0
- data/features/registering_resources.feature +33 -0
- data/features/show/default_content.feature +43 -0
- data/features/show/page_title.feature +33 -0
- data/features/sidebar_sections.feature +127 -0
- data/features/specifying_actions.feature +87 -0
- data/features/step_definitions/action_item_steps.rb +7 -0
- data/features/step_definitions/additional_web_steps.rb +77 -0
- data/features/step_definitions/asset_steps.rb +7 -0
- data/features/step_definitions/attribute_steps.rb +13 -0
- data/features/step_definitions/comment_steps.rb +8 -0
- data/features/step_definitions/configuration_steps.rb +31 -0
- data/features/step_definitions/dashboard_steps.rb +11 -0
- data/features/step_definitions/factory_steps.rb +29 -0
- data/features/step_definitions/flash_steps.rb +3 -0
- data/features/step_definitions/format_steps.rb +35 -0
- data/features/step_definitions/index_scope_steps.rb +20 -0
- data/features/step_definitions/layout_steps.rb +3 -0
- data/features/step_definitions/menu_steps.rb +7 -0
- data/features/step_definitions/pagination_steps.rb +8 -0
- data/features/step_definitions/sidebar_steps.rb +7 -0
- data/features/step_definitions/tab_steps.rb +3 -0
- data/features/step_definitions/user_steps.rb +26 -0
- data/features/step_definitions/web_steps.rb +211 -0
- data/features/sti_resource.feature +61 -0
- data/features/support/env.rb +96 -0
- data/features/support/paths.rb +50 -0
- data/features/support/selectors.rb +45 -0
- data/features/users/logging_in.feature +34 -0
- data/features/users/logging_out.feature +13 -0
- data/lib/active_admin.rb +82 -0
- data/lib/active_admin/abstract_view_factory.rb +95 -0
- data/lib/active_admin/application.rb +231 -0
- data/lib/active_admin/arbre.rb +23 -0
- data/lib/active_admin/arbre/builder.rb +111 -0
- data/lib/active_admin/arbre/context.rb +45 -0
- data/lib/active_admin/arbre/core_extensions.rb +5 -0
- data/lib/active_admin/arbre/html/attributes.rb +20 -0
- data/lib/active_admin/arbre/html/class_list.rb +28 -0
- data/lib/active_admin/arbre/html/collection.rb +27 -0
- data/lib/active_admin/arbre/html/document.rb +42 -0
- data/lib/active_admin/arbre/html/element.rb +151 -0
- data/lib/active_admin/arbre/html/html5_elements.rb +47 -0
- data/lib/active_admin/arbre/html/tag.rb +137 -0
- data/lib/active_admin/arbre/html/text_node.rb +35 -0
- data/lib/active_admin/asset_registration.rb +34 -0
- data/lib/active_admin/callbacks.rb +89 -0
- data/lib/active_admin/comments.rb +88 -0
- data/lib/active_admin/comments/comment.rb +21 -0
- data/lib/active_admin/comments/configuration.rb +18 -0
- data/lib/active_admin/comments/namespace_helper.rb +14 -0
- data/lib/active_admin/comments/resource_helper.rb +17 -0
- data/lib/active_admin/comments/show_page_helper.rb +23 -0
- data/lib/active_admin/comments/views.rb +3 -0
- data/lib/active_admin/comments/views/active_admin_comment.rb +0 -0
- data/lib/active_admin/comments/views/active_admin_comments.rb +82 -0
- data/lib/active_admin/component.rb +22 -0
- data/lib/active_admin/controller_action.rb +12 -0
- data/lib/active_admin/csv_builder.rb +45 -0
- data/lib/active_admin/dashboards.rb +48 -0
- data/lib/active_admin/dashboards/dashboard_controller.rb +38 -0
- data/lib/active_admin/dashboards/section.rb +34 -0
- data/lib/active_admin/dependency_checker.rb +30 -0
- data/lib/active_admin/deprecation.rb +36 -0
- data/lib/active_admin/devise.rb +54 -0
- data/lib/active_admin/dsl.rb +224 -0
- data/lib/active_admin/engine.rb +4 -0
- data/lib/active_admin/event.rb +31 -0
- data/lib/active_admin/form_builder.rb +118 -0
- data/lib/active_admin/helpers/optional_display.rb +34 -0
- data/lib/active_admin/helpers/scope_chain.rb +23 -0
- data/lib/active_admin/helpers/settings.rb +70 -0
- data/lib/active_admin/iconic.rb +51 -0
- data/lib/active_admin/iconic/icons.rb +142 -0
- data/lib/active_admin/locales/bg.yml +40 -0
- data/lib/active_admin/locales/cs.yml +34 -0
- data/lib/active_admin/locales/da.yml +28 -0
- data/lib/active_admin/locales/en.yml +40 -0
- data/lib/active_admin/locales/es.yml +40 -0
- data/lib/active_admin/locales/fr.yml +40 -0
- data/lib/active_admin/locales/it.yml +40 -0
- data/lib/active_admin/locales/ja.yml +40 -0
- data/lib/active_admin/locales/pl.yml +34 -0
- data/lib/active_admin/locales/pt-BR.yml +41 -0
- data/lib/active_admin/locales/ru.yml +40 -0
- data/lib/active_admin/locales/sv-SE.yml +40 -0
- data/lib/active_admin/locales/zh_cn.yml +40 -0
- data/lib/active_admin/menu.rb +42 -0
- data/lib/active_admin/menu_item.rb +73 -0
- data/lib/active_admin/namespace.rb +206 -0
- data/lib/active_admin/page_config.rb +15 -0
- data/lib/active_admin/reloader.rb +64 -0
- data/lib/active_admin/renderer.rb +87 -0
- data/lib/active_admin/resource.rb +159 -0
- data/lib/active_admin/resource/action_items.rb +88 -0
- data/lib/active_admin/resource/belongs_to.rb +31 -0
- data/lib/active_admin/resource/menu.rb +45 -0
- data/lib/active_admin/resource/naming.rb +50 -0
- data/lib/active_admin/resource/scopes.rb +33 -0
- data/lib/active_admin/resource/sidebars.rb +36 -0
- data/lib/active_admin/resource_controller.rb +105 -0
- data/lib/active_admin/resource_controller/action_builder.rb +21 -0
- data/lib/active_admin/resource_controller/actions.rb +79 -0
- data/lib/active_admin/resource_controller/callbacks.rb +47 -0
- data/lib/active_admin/resource_controller/collection.rb +138 -0
- data/lib/active_admin/resource_controller/filters.rb +58 -0
- data/lib/active_admin/resource_controller/form.rb +42 -0
- data/lib/active_admin/resource_controller/menu.rb +29 -0
- data/lib/active_admin/resource_controller/page_configurations.rb +53 -0
- data/lib/active_admin/resource_controller/scoping.rb +36 -0
- data/lib/active_admin/resource_controller/sidebars.rb +18 -0
- data/lib/active_admin/router.rb +85 -0
- data/lib/active_admin/sass/active_admin.scss +3 -0
- data/lib/active_admin/sass/css_loader.rb +16 -0
- data/lib/active_admin/sass/helpers.rb +45 -0
- data/lib/active_admin/scope.rb +31 -0
- data/lib/active_admin/sidebar_section.rb +41 -0
- data/lib/active_admin/stylesheets/active_admin/mixins/_utilities.scss +0 -0
- data/lib/active_admin/version.rb +3 -0
- data/lib/active_admin/view_factory.rb +23 -0
- data/lib/active_admin/view_helpers.rb +22 -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 +42 -0
- data/lib/active_admin/view_helpers/breadcrumb_helper.rb +29 -0
- data/lib/active_admin/view_helpers/display_helper.rb +38 -0
- data/lib/active_admin/view_helpers/filter_form_helper.rb +186 -0
- data/lib/active_admin/view_helpers/form_helper.rb +13 -0
- data/lib/active_admin/view_helpers/icon_helper.rb +12 -0
- data/lib/active_admin/view_helpers/method_or_proc_helper.rb +26 -0
- data/lib/active_admin/view_helpers/renderer_helper.rb +29 -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/attributes_table.rb +66 -0
- data/lib/active_admin/views/components/blank_slate.rb +17 -0
- data/lib/active_admin/views/components/columns.rb +47 -0
- data/lib/active_admin/views/components/paginated_collection.rb +92 -0
- data/lib/active_admin/views/components/panel.rb +26 -0
- data/lib/active_admin/views/components/scopes.rb +69 -0
- data/lib/active_admin/views/components/sidebar_section.rb +28 -0
- data/lib/active_admin/views/components/status_tag.rb +55 -0
- data/lib/active_admin/views/components/table_for.rb +193 -0
- data/lib/active_admin/views/dashboard_section_renderer.rb +19 -0
- data/lib/active_admin/views/header_renderer.rb +57 -0
- data/lib/active_admin/views/index_as_block.rb +29 -0
- data/lib/active_admin/views/index_as_blog.rb +129 -0
- data/lib/active_admin/views/index_as_grid.rb +70 -0
- data/lib/active_admin/views/index_as_table.rb +164 -0
- data/lib/active_admin/views/pages/base.rb +167 -0
- data/lib/active_admin/views/pages/dashboard.rb +62 -0
- data/lib/active_admin/views/pages/edit.rb +28 -0
- data/lib/active_admin/views/pages/index.rb +91 -0
- data/lib/active_admin/views/pages/layout.rb +26 -0
- data/lib/active_admin/views/pages/new.rb +28 -0
- data/lib/active_admin/views/pages/show.rb +56 -0
- data/lib/active_admin/views/tabbed_navigation.rb +94 -0
- data/lib/activeadmin.rb +1 -0
- data/lib/generators/active_admin/assets/assets_generator.rb +21 -0
- data/lib/generators/active_admin/assets/templates/3.0/active_admin.js +427 -0
- data/lib/generators/active_admin/assets/templates/3.1/active_admin.css.scss +6 -0
- data/lib/generators/active_admin/assets/templates/3.1/active_admin.js +1 -0
- data/lib/generators/active_admin/assets/templates/dashboards.rb +36 -0
- data/lib/generators/active_admin/devise/devise_generator.rb +49 -0
- data/lib/generators/active_admin/install/install_generator.rb +44 -0
- data/lib/generators/active_admin/install/templates/active_admin.rb.erb +103 -0
- data/lib/generators/active_admin/install/templates/dashboards.rb +38 -0
- data/lib/generators/active_admin/install/templates/migrations/1_create_admin_notes.rb +16 -0
- data/lib/generators/active_admin/install/templates/migrations/2_move_admin_notes_to_comments.rb +25 -0
- data/lib/generators/active_admin/resource/resource_generator.rb +16 -0
- data/lib/generators/active_admin/resource/templates/admin.rb +3 -0
- data/script/local +44 -0
- data/script/use_rails +46 -0
- data/spec/integration/belongs_to_spec.rb +42 -0
- data/spec/integration/default_namespace.rb +77 -0
- data/spec/integration/javascript_spec.rb +20 -0
- data/spec/integration/memory_spec.rb +38 -0
- data/spec/integration/stylesheets_spec.rb +41 -0
- data/spec/spec_helper.rb +167 -0
- data/spec/support/detect_rails_version.rb +10 -0
- data/spec/support/integration_example_group.rb +33 -0
- data/spec/support/jslint.yml +80 -0
- data/spec/support/rails_template.rb +32 -0
- data/spec/support/rails_template_with_data.rb +33 -0
- data/spec/support/templates/cucumber.rb +24 -0
- data/spec/unit/abstract_view_factory_spec.rb +79 -0
- data/spec/unit/action_builder_spec.rb +88 -0
- data/spec/unit/active_admin_spec.rb +17 -0
- data/spec/unit/application_spec.rb +87 -0
- data/spec/unit/arbre/context_spec.rb +35 -0
- data/spec/unit/arbre/html/element_finder_methods_spec.rb +54 -0
- data/spec/unit/arbre/html/element_spec.rb +223 -0
- data/spec/unit/arbre/html/tag_attributes_spec.rb +61 -0
- data/spec/unit/arbre/html/tag_spec.rb +63 -0
- data/spec/unit/arbre/html_spec.rb +209 -0
- data/spec/unit/asset_registration_spec.rb +37 -0
- data/spec/unit/auto_link_spec.rb +39 -0
- data/spec/unit/belongs_to_spec.rb +45 -0
- data/spec/unit/breadcrumbs_spec.rb +110 -0
- data/spec/unit/comments_spec.rb +57 -0
- data/spec/unit/component_spec.rb +18 -0
- data/spec/unit/controller_filters_spec.rb +34 -0
- data/spec/unit/csv_builder_spec.rb +83 -0
- data/spec/unit/dashboard_controller_spec.rb +26 -0
- data/spec/unit/dashboard_section_spec.rb +56 -0
- data/spec/unit/dashboards_spec.rb +59 -0
- data/spec/unit/devise_spec.rb +66 -0
- data/spec/unit/display_name_spec.rb +29 -0
- data/spec/unit/event_spec.rb +41 -0
- data/spec/unit/filter_form_builder_spec.rb +182 -0
- data/spec/unit/form_builder_spec.rb +256 -0
- data/spec/unit/generators/install_rails_3_1_spec.rb +16 -0
- data/spec/unit/helpers/scope_chain_spec.rb +36 -0
- data/spec/unit/helpers/settings_spec.rb +30 -0
- data/spec/unit/menu_item_spec.rb +143 -0
- data/spec/unit/menu_spec.rb +53 -0
- data/spec/unit/namespace_spec.rb +214 -0
- data/spec/unit/pretty_format_spec.rb +35 -0
- data/spec/unit/rails_spec.rb +43 -0
- data/spec/unit/registration_spec.rb +76 -0
- data/spec/unit/reloader_spec.rb +80 -0
- data/spec/unit/renderer_spec.rb +108 -0
- data/spec/unit/resource/action_items_spec.rb +62 -0
- data/spec/unit/resource/menu_spec.rb +80 -0
- data/spec/unit/resource/naming_spec.rb +75 -0
- data/spec/unit/resource/scopes_spec.rb +30 -0
- data/spec/unit/resource/sidebars_spec.rb +50 -0
- data/spec/unit/resource_controller/collection_spec.rb +34 -0
- data/spec/unit/resource_controller_spec.rb +152 -0
- data/spec/unit/resource_spec.rb +269 -0
- data/spec/unit/routing_spec.rb +88 -0
- data/spec/unit/sass/helpers_spec.rb +47 -0
- data/spec/unit/scope_spec.rb +41 -0
- data/spec/unit/view_factory_spec.rb +19 -0
- data/spec/unit/views/components/attributes_table_spec.rb +100 -0
- data/spec/unit/views/components/blank_slate_spec.rb +15 -0
- data/spec/unit/views/components/columns_spec.rb +75 -0
- data/spec/unit/views/components/panel_spec.rb +29 -0
- data/spec/unit/views/components/sidebar_section_spec.rb +37 -0
- data/spec/unit/views/components/status_tag_spec.rb +79 -0
- data/spec/unit/views/components/table_for_spec.rb +131 -0
- data/spec/unit/views/pages/layout_spec.rb +22 -0
- data/spec/unit/views/tabbed_navigation_spec.rb +125 -0
- data/tasks/docs.rake +39 -0
- data/tasks/test.rake +57 -0
- data/tasks/yard.rake +6 -0
- metadata +646 -0
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
|
|
3
|
+
describe ActiveAdmin::Dashboards::Section do
|
|
4
|
+
|
|
5
|
+
def section(options = {})
|
|
6
|
+
name = options.delete(:name) || "Recent Posts"
|
|
7
|
+
ActiveAdmin::Dashboards::Section.new(:admin, name, options){ }
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
describe "accessors" do
|
|
11
|
+
it "should have a namespace" do
|
|
12
|
+
section.namespace.should == :admin
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
it "should have a block" do
|
|
16
|
+
section.block.class.should == Proc
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
it "should have a name" do
|
|
20
|
+
section.name.should == 'Recent Posts'
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
describe "priority" do
|
|
25
|
+
context "when not set" do
|
|
26
|
+
subject{ section.priority }
|
|
27
|
+
it { should == ActiveAdmin::Dashboards::Section::DEFAULT_PRIORITY }
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
context "when set" do
|
|
31
|
+
subject{ section(:priority => 1).priority }
|
|
32
|
+
it { should == 1 }
|
|
33
|
+
end
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
describe "icon" do
|
|
37
|
+
it "should set the icon" do
|
|
38
|
+
s = section(:icon => :my_icon)
|
|
39
|
+
s.icon.should == :my_icon
|
|
40
|
+
end
|
|
41
|
+
it "should be nil by default" do
|
|
42
|
+
section.icon.should be_nil
|
|
43
|
+
end
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
describe "sorting sections" do
|
|
47
|
+
it "should sort by priority then alpha" do
|
|
48
|
+
s1 = section :name => "Woot"
|
|
49
|
+
s2 = section :name => :Alpha
|
|
50
|
+
s3 = section :name => "Zulu", :priority => 1
|
|
51
|
+
s4 = section :name => "Beta", :priority => 100
|
|
52
|
+
[s1,s2,s3,s4].sort.should == [s3, s2, s1, s4]
|
|
53
|
+
end
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
end
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
|
|
3
|
+
describe ActiveAdmin::Dashboards do
|
|
4
|
+
|
|
5
|
+
after(:each) do
|
|
6
|
+
ActiveAdmin::Dashboards.clear_all_sections!
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
describe "adding sections" do
|
|
10
|
+
before do
|
|
11
|
+
ActiveAdmin::Dashboards.clear_all_sections!
|
|
12
|
+
ActiveAdmin::Dashboards.add_section('Recent Posts')
|
|
13
|
+
end
|
|
14
|
+
it "should add a new section namespaced" do
|
|
15
|
+
ActiveAdmin::Dashboards.sections[:admin].first.should be_an_instance_of(ActiveAdmin::Dashboards::Section)
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
describe "adding sections using the build syntax" do
|
|
20
|
+
before do
|
|
21
|
+
ActiveAdmin::Dashboards.clear_all_sections!
|
|
22
|
+
ActiveAdmin::Dashboards.build do
|
|
23
|
+
section "Recent Posts" do
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
it "should add a new section" do
|
|
29
|
+
ActiveAdmin::Dashboards.sections[:admin].first.should be_an_instance_of(ActiveAdmin::Dashboards::Section)
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
describe "clearing all sections" do
|
|
34
|
+
before do
|
|
35
|
+
ActiveAdmin::Dashboards.add_section('Recent Posts')
|
|
36
|
+
end
|
|
37
|
+
it "should clear all sections" do
|
|
38
|
+
ActiveAdmin::Dashboards.clear_all_sections!
|
|
39
|
+
ActiveAdmin::Dashboards.sections.keys.should be_empty
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
describe "finding namespaced sections" do
|
|
44
|
+
context "when the namespace exists" do
|
|
45
|
+
before do
|
|
46
|
+
ActiveAdmin::Dashboards.add_section('Recent Posts')
|
|
47
|
+
end
|
|
48
|
+
it "should return an array of sections" do
|
|
49
|
+
ActiveAdmin::Dashboards.sections_for_namespace(:admin).should_not be_empty
|
|
50
|
+
end
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
context "when the namespace does not exists" do
|
|
54
|
+
it "should return an empty array" do
|
|
55
|
+
ActiveAdmin::Dashboards.sections_for_namespace(:not_a_namespace).should be_empty
|
|
56
|
+
end
|
|
57
|
+
end
|
|
58
|
+
end
|
|
59
|
+
end
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
|
|
3
|
+
describe ActiveAdmin::Devise::Controller do
|
|
4
|
+
|
|
5
|
+
let(:controller_class) do
|
|
6
|
+
klass = Class.new do
|
|
7
|
+
def self.layout(*); end
|
|
8
|
+
def self.helper(*); end
|
|
9
|
+
end
|
|
10
|
+
klass.send(:include, ActiveAdmin::Devise::Controller)
|
|
11
|
+
klass
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
let(:controller) { controller_class.new }
|
|
15
|
+
|
|
16
|
+
it "should set the root path to the default namespace" do
|
|
17
|
+
controller.root_path.should == "/admin"
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
it "should set the root path to '/' when no default namespace" do
|
|
21
|
+
ActiveAdmin.application.stub!(:default_namespace => false)
|
|
22
|
+
controller.root_path.should == "/"
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
describe "#config" do
|
|
26
|
+
let(:config) { ActiveAdmin::Devise.config }
|
|
27
|
+
|
|
28
|
+
describe ":sign_out_via option" do
|
|
29
|
+
|
|
30
|
+
subject { config[:sign_out_via] }
|
|
31
|
+
|
|
32
|
+
context "when Devise does not implement sign_out_via (version < 1.2)" do
|
|
33
|
+
before do
|
|
34
|
+
::Devise.should_receive(:respond_to?).with(:sign_out_via).and_return(false)
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
it "should not contain any customization for sign_out_via" do
|
|
38
|
+
config.should_not have_key(:sign_out_via)
|
|
39
|
+
end
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
context "when Devise implements sign_out_via (version >= 1.2)" do
|
|
43
|
+
before do
|
|
44
|
+
::Devise.should_receive(:respond_to?).with(:sign_out_via).and_return(true)
|
|
45
|
+
::Devise.stub!(:sign_out_via) { :delete }
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
it "should contain the application.logout_link_method" do
|
|
49
|
+
::Devise.should_receive(:sign_out_via).and_return(:delete)
|
|
50
|
+
ActiveAdmin.application.should_receive(:logout_link_method).and_return(:get)
|
|
51
|
+
|
|
52
|
+
config[:sign_out_via].should include(:get)
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
it "should contain Devise's logout_via_method(s)" do
|
|
56
|
+
::Devise.should_receive(:sign_out_via).and_return([:delete, :post])
|
|
57
|
+
ActiveAdmin.application.should_receive(:logout_link_method).and_return(:get)
|
|
58
|
+
|
|
59
|
+
config[:sign_out_via].should == [:delete, :post, :get]
|
|
60
|
+
end
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
end # describe ":sign_out_via option"
|
|
64
|
+
end # describe "#config"
|
|
65
|
+
|
|
66
|
+
end
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
|
|
3
|
+
describe "display names" do
|
|
4
|
+
|
|
5
|
+
include ActiveAdmin::ViewHelpers
|
|
6
|
+
|
|
7
|
+
[:display_name, :full_name, :name, :username, :login, :title, :email, :to_s].each do |m|
|
|
8
|
+
it "should return #{m} if defined" do
|
|
9
|
+
r = Class.new do
|
|
10
|
+
define_method m do
|
|
11
|
+
m.to_s
|
|
12
|
+
end
|
|
13
|
+
end.new
|
|
14
|
+
display_name(r).should == m.to_s
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
it "should memeoize the result for the class" do
|
|
19
|
+
c = Class.new do
|
|
20
|
+
def name
|
|
21
|
+
"My Name"
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
display_name(c.new).should == "My Name"
|
|
25
|
+
ActiveAdmin.application.should_not_receive(:display_name_methods)
|
|
26
|
+
display_name(c.new).should == "My Name"
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
end
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
require 'active_admin/event'
|
|
3
|
+
|
|
4
|
+
describe ActiveAdmin::EventDispatcher do
|
|
5
|
+
|
|
6
|
+
let(:test_event){ 'active_admin.test_event' }
|
|
7
|
+
let(:dispatcher){ ActiveAdmin::EventDispatcher.new }
|
|
8
|
+
|
|
9
|
+
it "should add a subscriber for an event" do
|
|
10
|
+
dispatcher.subscribers(test_event).size.should == 0
|
|
11
|
+
dispatcher.subscribe(test_event){ true }
|
|
12
|
+
dispatcher.subscribers(test_event).size.should == 1
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
it "should call the dispatch block with no arguments" do
|
|
16
|
+
dispatcher.subscribe(test_event){ raise StandardError, "From Event Handler" }
|
|
17
|
+
lambda {
|
|
18
|
+
dispatcher.dispatch(test_event)
|
|
19
|
+
}.should raise_error(StandardError, "From Event Handler")
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
it "should call the dispatch block with one argument" do
|
|
23
|
+
arg = nil
|
|
24
|
+
dispatcher.subscribe(test_event){|passed_in| arg = passed_in }
|
|
25
|
+
dispatcher.dispatch(test_event, "My Arg")
|
|
26
|
+
arg.should == "My Arg"
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
it "should clear all subscribers" do
|
|
30
|
+
dispatcher.subscribe(test_event){ false }
|
|
31
|
+
dispatcher.subscribe(test_event + "_2"){ false }
|
|
32
|
+
dispatcher.clear_all_subscribers!
|
|
33
|
+
dispatcher.subscribers(test_event).size.should == 0
|
|
34
|
+
dispatcher.subscribers(test_event + "_2").size.should == 0
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
it "should have a dispatcher available from ActiveAdmin::Event" do
|
|
38
|
+
ActiveAdmin::Event.should be_an_instance_of(ActiveAdmin::EventDispatcher)
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
end
|
|
@@ -0,0 +1,182 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
describe ActiveAdmin::ViewHelpers::FilterFormHelper do
|
|
5
|
+
|
|
6
|
+
setup_arbre_context!
|
|
7
|
+
|
|
8
|
+
# Setup an ActionView::Base object which can be used for
|
|
9
|
+
# generating the form for.
|
|
10
|
+
let(:helpers) do
|
|
11
|
+
view = action_view
|
|
12
|
+
def view.collection_path
|
|
13
|
+
"/posts"
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def view.protect_against_forgery?
|
|
17
|
+
false
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
view
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
def filter(name, options = {})
|
|
24
|
+
search = Post.search
|
|
25
|
+
active_admin_filters_form_for(search, [options.merge(:attribute => name)])
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
describe "the form in general" do
|
|
29
|
+
let(:body) { filter :title }
|
|
30
|
+
|
|
31
|
+
it "should generate a form which submits via get" do
|
|
32
|
+
body.should have_tag("form", :attributes => { :method => 'get', :class => 'filter_form' })
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
it "should generate a filter button" do
|
|
36
|
+
body.should have_tag("input", :attributes => { :type => "submit",
|
|
37
|
+
:value => "Filter" })
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
it "should only generate the form once" do
|
|
41
|
+
body.scan(/q\[title_contains\]/).size.should == 1
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
it "should generate a clear filters link" do
|
|
45
|
+
body.should have_tag("a", "Clear Filters", :attributes => { :class => "clear_filters_btn" })
|
|
46
|
+
end
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
describe "string attribute" do
|
|
50
|
+
let(:body) { filter :title }
|
|
51
|
+
|
|
52
|
+
it "should generate a search field for a string attribute" do
|
|
53
|
+
body.should have_tag("input", :attributes => { :name => "q[title_contains]"})
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
it "should label a text field with search" do
|
|
57
|
+
body.should have_tag('label', 'Search Title')
|
|
58
|
+
end
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
describe "text attribute" do
|
|
62
|
+
let(:body) { filter :body }
|
|
63
|
+
|
|
64
|
+
it "should generate a search field for a text attribute" do
|
|
65
|
+
body.should have_tag("input", :attributes => { :name => "q[body_contains]"})
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
it "should label a text field with search" do
|
|
69
|
+
body.should have_tag('label', 'Search Body')
|
|
70
|
+
end
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
describe "datetime attribute" do
|
|
74
|
+
let(:body) { filter :created_at }
|
|
75
|
+
|
|
76
|
+
it "should generate a date greater than" do
|
|
77
|
+
body.should have_tag("input", :attributes => { :name => "q[created_at_gte]", :class => "datepicker"})
|
|
78
|
+
end
|
|
79
|
+
it "should generate a seperator" do
|
|
80
|
+
body.should have_tag("span", :attributes => { :class => "seperator"})
|
|
81
|
+
end
|
|
82
|
+
it "should generate a date less than" do
|
|
83
|
+
body.should have_tag("input", :attributes => { :name => "q[created_at_lte]", :class => "datepicker"})
|
|
84
|
+
end
|
|
85
|
+
end
|
|
86
|
+
|
|
87
|
+
describe "integer attribute" do
|
|
88
|
+
let(:body) { filter :id }
|
|
89
|
+
|
|
90
|
+
it "should generate a select option for equal to" do
|
|
91
|
+
body.should have_tag("option", "Equal To", :attributes => { :value => 'id_eq' })
|
|
92
|
+
end
|
|
93
|
+
it "should generate a select option for greater than" do
|
|
94
|
+
body.should have_tag("option", "Greater Than")
|
|
95
|
+
end
|
|
96
|
+
it "should generate a select option for less than" do
|
|
97
|
+
body.should have_tag("option", "Less Than")
|
|
98
|
+
end
|
|
99
|
+
it "should generate a text field for input" do
|
|
100
|
+
body.should have_tag("input", :attributes => {
|
|
101
|
+
:name => /q\[(id_eq|id_equals)\]/ })
|
|
102
|
+
end
|
|
103
|
+
it "should select the option which is currently being filtered"
|
|
104
|
+
end
|
|
105
|
+
|
|
106
|
+
describe "belong to" do
|
|
107
|
+
before do
|
|
108
|
+
@john = User.create :first_name => "John", :last_name => "Doe", :username => "john_doe"
|
|
109
|
+
@jane = User.create :first_name => "Jane", :last_name => "Doe", :username => "jane_doe"
|
|
110
|
+
end
|
|
111
|
+
|
|
112
|
+
context "when given as the _id attribute name" do
|
|
113
|
+
let(:body) { filter :author_id }
|
|
114
|
+
|
|
115
|
+
it "should not render as an integer" do
|
|
116
|
+
body.should_not have_tag("input", :attributes => {
|
|
117
|
+
:name => "q[author_id_eq]"})
|
|
118
|
+
end
|
|
119
|
+
it "should render as belongs to select" do
|
|
120
|
+
body.should have_tag("select", :attributes => {
|
|
121
|
+
:name => "q[author_id_eq]"})
|
|
122
|
+
body.should have_tag("option", "jane_doe", :attributes => {
|
|
123
|
+
:value => @jane.id })
|
|
124
|
+
end
|
|
125
|
+
end
|
|
126
|
+
|
|
127
|
+
context "when given as the name of the relationship" do
|
|
128
|
+
let(:body) { filter :author }
|
|
129
|
+
|
|
130
|
+
it "should generate a select" do
|
|
131
|
+
body.should have_tag("select", :attributes => {
|
|
132
|
+
:name => "q[author_id_eq]"})
|
|
133
|
+
end
|
|
134
|
+
it "should set the default text to 'Any'" do
|
|
135
|
+
body.should have_tag("option", "Any", :attributes => {
|
|
136
|
+
:value => "" })
|
|
137
|
+
end
|
|
138
|
+
it "should create an option for each related object" do
|
|
139
|
+
body.should have_tag("option", "john_doe", :attributes => {
|
|
140
|
+
:value => @john.id })
|
|
141
|
+
body.should have_tag("option", "jane_doe", :attributes => {
|
|
142
|
+
:value => @jane.id })
|
|
143
|
+
end
|
|
144
|
+
|
|
145
|
+
context "with a proc" do
|
|
146
|
+
let :body do
|
|
147
|
+
filter :title, :as => :select, :collection => proc{ ['Title One', 'Title Two'] }
|
|
148
|
+
end
|
|
149
|
+
|
|
150
|
+
it "should use call the proc as the collection" do
|
|
151
|
+
body.should have_tag("option", "Title One")
|
|
152
|
+
body.should have_tag("option", "Title Two")
|
|
153
|
+
end
|
|
154
|
+
end
|
|
155
|
+
end
|
|
156
|
+
|
|
157
|
+
context "as check boxes" do
|
|
158
|
+
let(:body) { filter :author, :as => :check_boxes }
|
|
159
|
+
|
|
160
|
+
it "should create a check box for each related object" do
|
|
161
|
+
body.should have_tag("input", :attributes => {
|
|
162
|
+
:name => "q[author_id_in][]",
|
|
163
|
+
:type => "checkbox",
|
|
164
|
+
:value => @john.id })
|
|
165
|
+
body.should have_tag("input", :attributes => {
|
|
166
|
+
:name => "q[author_id_in][]",
|
|
167
|
+
:type => "checkbox",
|
|
168
|
+
:value => @jane.id })
|
|
169
|
+
end
|
|
170
|
+
end
|
|
171
|
+
|
|
172
|
+
context "when polymorphic relationship" do
|
|
173
|
+
let(:body) do
|
|
174
|
+
search = ActiveAdmin::Comment.search
|
|
175
|
+
active_admin_filters_form_for(search, [{ :attribute => :resource}])
|
|
176
|
+
end
|
|
177
|
+
it "should not generate any field" do
|
|
178
|
+
body.should have_tag("form", :attributes => { :method => 'get' })
|
|
179
|
+
end
|
|
180
|
+
end
|
|
181
|
+
end # belongs to
|
|
182
|
+
end
|
|
@@ -0,0 +1,256 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
|
|
3
|
+
describe ActiveAdmin::FormBuilder do
|
|
4
|
+
|
|
5
|
+
setup_arbre_context!
|
|
6
|
+
|
|
7
|
+
# Setup an ActionView::Base object which can be used for
|
|
8
|
+
# generating the form for.
|
|
9
|
+
let(:helpers) do
|
|
10
|
+
view = action_view
|
|
11
|
+
def view.posts_path
|
|
12
|
+
"/posts"
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
def view.protect_against_forgery?
|
|
16
|
+
false
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
def view.url_for(*args)
|
|
20
|
+
if args.first == {:action => "index"}
|
|
21
|
+
posts_path
|
|
22
|
+
else
|
|
23
|
+
super
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
view
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
def build_form(options = {}, &block)
|
|
31
|
+
options.merge!({:url => posts_path})
|
|
32
|
+
active_admin_form_for Post.new, options, &block
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
context "in general" do
|
|
36
|
+
let :body do
|
|
37
|
+
build_form do |f|
|
|
38
|
+
f.inputs do
|
|
39
|
+
f.input :title
|
|
40
|
+
f.input :body
|
|
41
|
+
end
|
|
42
|
+
f.buttons do
|
|
43
|
+
f.commit_button "Submit Me"
|
|
44
|
+
f.commit_button "Another Button"
|
|
45
|
+
end
|
|
46
|
+
end
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
it "should generate a text input" do
|
|
50
|
+
body.should have_tag("input", :attributes => { :type => "text",
|
|
51
|
+
:name => "post[title]" })
|
|
52
|
+
end
|
|
53
|
+
it "should generate a textarea" do
|
|
54
|
+
body.should have_tag("textarea", :attributes => { :name => "post[body]" })
|
|
55
|
+
end
|
|
56
|
+
it "should only generate the form once" do
|
|
57
|
+
body.scan(/Title/).size.should == 1
|
|
58
|
+
end
|
|
59
|
+
it "should generate buttons" do
|
|
60
|
+
body.should have_tag("input", :attributes => { :type => "submit",
|
|
61
|
+
:value => "Submit Me" })
|
|
62
|
+
body.should have_tag("input", :attributes => { :type => "submit",
|
|
63
|
+
:value => "Another Button" })
|
|
64
|
+
end
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
context "when polymorphic relationship" do
|
|
68
|
+
|
|
69
|
+
let(:body) do
|
|
70
|
+
comment = ActiveAdmin::Comment.new
|
|
71
|
+
|
|
72
|
+
active_admin_form_for comment, :url => "admins/comments" do |f|
|
|
73
|
+
f.inputs :resource
|
|
74
|
+
end
|
|
75
|
+
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
it "should not generate any field" do
|
|
79
|
+
body.should have_tag("form", :attributes => { :method => 'post' })
|
|
80
|
+
body.should_not have_tag("select")
|
|
81
|
+
end
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
describe "passing in options" do
|
|
85
|
+
let :body do
|
|
86
|
+
build_form :html => { :multipart => true } do |f|
|
|
87
|
+
f.inputs :title
|
|
88
|
+
f.buttons
|
|
89
|
+
end
|
|
90
|
+
end
|
|
91
|
+
it "should pass the options on to the form" do
|
|
92
|
+
body.should have_tag("form", :attributes => { :enctype => "multipart/form-data" })
|
|
93
|
+
end
|
|
94
|
+
end
|
|
95
|
+
|
|
96
|
+
context "with buttons" do
|
|
97
|
+
it "should generate the form once" do
|
|
98
|
+
body = build_form do |f|
|
|
99
|
+
f.inputs do
|
|
100
|
+
f.input :title
|
|
101
|
+
end
|
|
102
|
+
f.buttons
|
|
103
|
+
end
|
|
104
|
+
body.scan(/id=\"post_title\"/).size.should == 1
|
|
105
|
+
end
|
|
106
|
+
it "should generate one button and a cancel link" do
|
|
107
|
+
body = build_form do |f|
|
|
108
|
+
f.buttons
|
|
109
|
+
end
|
|
110
|
+
body.scan(/type=\"submit\"/).size.should == 1
|
|
111
|
+
body.scan(/class=\"cancel\"/).size.should == 1
|
|
112
|
+
end
|
|
113
|
+
it "should generate multiple buttons" do
|
|
114
|
+
body = build_form do |f|
|
|
115
|
+
f.buttons do
|
|
116
|
+
f.commit_button "Create & Continue"
|
|
117
|
+
f.commit_button "Create & Edit"
|
|
118
|
+
end
|
|
119
|
+
end
|
|
120
|
+
body.scan(/type=\"submit\"/).size.should == 2
|
|
121
|
+
body.scan(/class=\"cancel\"/).size.should == 0
|
|
122
|
+
end
|
|
123
|
+
|
|
124
|
+
end
|
|
125
|
+
|
|
126
|
+
context "without passing a block to inputs" do
|
|
127
|
+
let :body do
|
|
128
|
+
build_form do |f|
|
|
129
|
+
f.inputs :title, :body
|
|
130
|
+
end
|
|
131
|
+
end
|
|
132
|
+
it "should have a title input" do
|
|
133
|
+
body.should have_tag("input", :attributes => { :type => "text",
|
|
134
|
+
:name => "post[title]" })
|
|
135
|
+
end
|
|
136
|
+
it "should have a body textarea" do
|
|
137
|
+
body.should have_tag("textarea", :attributes => { :name => "post[body]" })
|
|
138
|
+
end
|
|
139
|
+
end
|
|
140
|
+
|
|
141
|
+
context "with semantic fields for" do
|
|
142
|
+
let :body do
|
|
143
|
+
build_form do |f|
|
|
144
|
+
f.inputs do
|
|
145
|
+
f.input :title
|
|
146
|
+
f.input :body
|
|
147
|
+
end
|
|
148
|
+
f.instance_eval do
|
|
149
|
+
@object.author = User.new
|
|
150
|
+
end
|
|
151
|
+
f.semantic_fields_for :author do |author|
|
|
152
|
+
author.inputs :first_name, :last_name
|
|
153
|
+
end
|
|
154
|
+
end
|
|
155
|
+
end
|
|
156
|
+
it "should generate a nested text input once" do
|
|
157
|
+
body.scan("post_author_attributes_first_name_input").size.should == 1
|
|
158
|
+
end
|
|
159
|
+
end
|
|
160
|
+
|
|
161
|
+
context "with collection inputs" do
|
|
162
|
+
before do
|
|
163
|
+
User.create :first_name => "John", :last_name => "Doe"
|
|
164
|
+
User.create :first_name => "Jane", :last_name => "Doe"
|
|
165
|
+
end
|
|
166
|
+
|
|
167
|
+
describe "as select" do
|
|
168
|
+
let :body do
|
|
169
|
+
build_form do |f|
|
|
170
|
+
f.input :author
|
|
171
|
+
end
|
|
172
|
+
end
|
|
173
|
+
it "should create 2 options" do
|
|
174
|
+
body.scan(/\<option/).size.should == 3
|
|
175
|
+
end
|
|
176
|
+
end
|
|
177
|
+
|
|
178
|
+
describe "as radio buttons" do
|
|
179
|
+
let :body do
|
|
180
|
+
build_form do |f|
|
|
181
|
+
f.input :author, :as => :radio
|
|
182
|
+
end
|
|
183
|
+
end
|
|
184
|
+
it "should create 2 radio buttons" do
|
|
185
|
+
body.scan(/type=\"radio\"/).size.should == 2
|
|
186
|
+
end
|
|
187
|
+
end
|
|
188
|
+
end
|
|
189
|
+
|
|
190
|
+
context "with inputs 'for'" do
|
|
191
|
+
let :body do
|
|
192
|
+
build_form do |f|
|
|
193
|
+
f.inputs do
|
|
194
|
+
f.input :title
|
|
195
|
+
f.input :body
|
|
196
|
+
end
|
|
197
|
+
f.instance_eval do
|
|
198
|
+
@object.author = User.new
|
|
199
|
+
end
|
|
200
|
+
f.inputs :name => 'Author', :for => :author do |author|
|
|
201
|
+
author.inputs :first_name, :last_name
|
|
202
|
+
end
|
|
203
|
+
end
|
|
204
|
+
end
|
|
205
|
+
it "should generate a nested text input once" do
|
|
206
|
+
body.scan("post_author_attributes_first_name_input").size.should == 1
|
|
207
|
+
end
|
|
208
|
+
it "should add an author first name field" do
|
|
209
|
+
body.should have_tag("input", :attributes => { :name => "post[author_attributes][first_name]"})
|
|
210
|
+
end
|
|
211
|
+
end
|
|
212
|
+
|
|
213
|
+
context "with wrapper html" do
|
|
214
|
+
it "should set a class" do
|
|
215
|
+
body = build_form do |f|
|
|
216
|
+
f.input :title, :wrapper_html => { :class => "important" }
|
|
217
|
+
end
|
|
218
|
+
body.should have_tag("li", :attributes => {:class => "string optional important"})
|
|
219
|
+
end
|
|
220
|
+
end
|
|
221
|
+
|
|
222
|
+
|
|
223
|
+
{
|
|
224
|
+
"input :title, :as => :string" => /id\=\"post_title\"/,
|
|
225
|
+
"input :title, :as => :text" => /id\=\"post_title\"/,
|
|
226
|
+
"input :created_at, :as => :time" => /id\=\"post_created_at_2i\"/,
|
|
227
|
+
"input :created_at, :as => :datetime" => /id\=\"post_created_at_2i\"/,
|
|
228
|
+
"input :created_at, :as => :date" => /id\=\"post_created_at_2i\"/,
|
|
229
|
+
}.each do |source, regex|
|
|
230
|
+
it "should properly buffer #{source}" do
|
|
231
|
+
body = build_form do |f|
|
|
232
|
+
f.inputs do
|
|
233
|
+
f.instance_eval(source)
|
|
234
|
+
f.instance_eval(source)
|
|
235
|
+
end
|
|
236
|
+
end
|
|
237
|
+
body.scan(regex).size.should == 2
|
|
238
|
+
end
|
|
239
|
+
end
|
|
240
|
+
|
|
241
|
+
describe "datepicker input" do
|
|
242
|
+
let :body do
|
|
243
|
+
build_form do |f|
|
|
244
|
+
f.inputs do
|
|
245
|
+
f.input :created_at, :as => :datepicker
|
|
246
|
+
end
|
|
247
|
+
end
|
|
248
|
+
end
|
|
249
|
+
it "should generate a text input with the class of datepicker" do
|
|
250
|
+
body.should have_tag("input", :attributes => { :type => "text",
|
|
251
|
+
:class => "datepicker",
|
|
252
|
+
:name => "post[created_at]" })
|
|
253
|
+
end
|
|
254
|
+
end
|
|
255
|
+
|
|
256
|
+
end
|