activeadmin 0.1.1 → 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of activeadmin might be problematic. Click here for more details.
- data/CHANGELOG.rdoc +15 -1
- data/Gemfile +41 -11
- data/LICENSE +5 -0
- data/README.rdoc +202 -87
- data/Rakefile +51 -15
- data/activeadmin.gemspec +310 -131
- data/cucumber.yml +1 -0
- data/features/comments/commenting.feature +81 -0
- data/features/comments/viewing_index.feature +19 -0
- data/features/edit_page.feature +77 -0
- data/features/first_boot.feature +16 -0
- data/features/global_navigation.feature +30 -0
- data/features/index/formats.feature +10 -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 +79 -0
- data/features/index/index_scopes.feature +52 -0
- data/features/index/pagination.feature +23 -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 +128 -0
- data/features/specifying_actions.feature +16 -0
- data/features/step_definitions/action_item_steps.rb +7 -0
- data/features/step_definitions/additional_web_steps.rb +67 -0
- data/features/step_definitions/asset_steps.rb +7 -0
- data/features/step_definitions/attribute_steps.rb +15 -0
- data/features/step_definitions/comment_steps.rb +8 -0
- data/features/step_definitions/configuration_steps.rb +31 -0
- data/features/step_definitions/factory_steps.rb +28 -0
- data/features/step_definitions/flash_steps.rb +3 -0
- data/features/step_definitions/format_steps.rb +7 -0
- data/features/step_definitions/index_scope_steps.rb +20 -0
- data/features/step_definitions/pagination_steps.rb +8 -0
- data/features/step_definitions/sidebar_steps.rb +11 -0
- data/features/step_definitions/tab_steps.rb +3 -0
- data/features/step_definitions/user_steps.rb +20 -0
- data/features/step_definitions/web_steps.rb +219 -0
- data/features/support/env.rb +88 -0
- data/features/support/paths.rb +48 -0
- data/features/users/logging_in.feature +34 -0
- data/features/users/logging_out.feature +13 -0
- data/lib/active_admin.rb +155 -79
- data/lib/active_admin/abstract_view_factory.rb +95 -0
- data/lib/active_admin/action_items.rb +4 -15
- data/lib/active_admin/arbre.rb +23 -0
- data/lib/active_admin/arbre/attributes.rb +20 -0
- data/lib/active_admin/arbre/class_list.rb +28 -0
- data/lib/active_admin/arbre/collection.rb +27 -0
- data/lib/active_admin/arbre/context.rb +8 -0
- data/lib/active_admin/arbre/core_extensions.rb +5 -0
- data/lib/active_admin/arbre/document.rb +42 -0
- data/lib/active_admin/arbre/element.rb +151 -0
- data/lib/active_admin/arbre/html.rb +84 -0
- data/lib/active_admin/arbre/html5_elements.rb +47 -0
- data/lib/active_admin/arbre/tag.rb +129 -0
- data/lib/active_admin/arbre/text_node.rb +35 -0
- data/lib/active_admin/callbacks.rb +87 -0
- data/lib/active_admin/comments.rb +73 -0
- data/lib/active_admin/comments/comment.rb +15 -0
- data/lib/active_admin/comments/configuration.rb +16 -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/dashboards.rb +0 -2
- data/lib/active_admin/dashboards/dashboard_controller.rb +10 -5
- data/lib/active_admin/dashboards/section.rb +5 -14
- data/lib/active_admin/devise.rb +43 -0
- data/lib/active_admin/dsl.rb +202 -0
- data/lib/active_admin/event.rb +31 -0
- data/lib/active_admin/form_builder.rb +68 -50
- data/lib/active_admin/iconic.rb +51 -0
- data/lib/active_admin/iconic/icons.rb +142 -0
- data/lib/active_admin/namespace.rb +102 -16
- data/lib/active_admin/renderer.rb +18 -3
- data/lib/active_admin/resource.rb +110 -9
- data/lib/active_admin/resource/belongs_to.rb +31 -0
- data/lib/active_admin/resource_controller.rb +45 -260
- data/lib/active_admin/resource_controller/action_builder.rb +21 -0
- data/lib/active_admin/resource_controller/actions.rb +53 -0
- data/lib/active_admin/resource_controller/callbacks.rb +47 -0
- data/lib/active_admin/resource_controller/collection.rb +142 -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 +38 -0
- data/lib/active_admin/scope.rb +17 -0
- data/lib/active_admin/sidebar.rb +8 -47
- data/lib/active_admin/stylesheets/active_admin.scss +418 -0
- data/lib/active_admin/stylesheets/active_admin/_comments.scss +40 -0
- data/lib/active_admin/stylesheets/active_admin/_flash_messages.scss +13 -0
- data/lib/active_admin/stylesheets/active_admin/_forms.scss +168 -0
- data/lib/active_admin/stylesheets/active_admin/_header.scss +108 -0
- data/lib/active_admin/stylesheets/active_admin/_typography.scss +100 -0
- data/lib/active_admin/stylesheets/active_admin/mixins/_all.scss +8 -0
- data/lib/active_admin/stylesheets/active_admin/mixins/_buttons.scss +27 -0
- data/lib/active_admin/stylesheets/active_admin/mixins/_gradients.scss +21 -0
- data/lib/active_admin/stylesheets/active_admin/mixins/_icons.scss +20 -0
- data/lib/active_admin/stylesheets/active_admin/mixins/_reset.scss +165 -0
- data/lib/active_admin/stylesheets/active_admin/mixins/_rounded.scss +43 -0
- data/lib/active_admin/stylesheets/active_admin/mixins/_sections.scss +27 -0
- data/lib/active_admin/stylesheets/active_admin/mixins/_shadows.scss +21 -0
- data/lib/active_admin/stylesheets/active_admin/mixins/_variables.scss +12 -0
- data/lib/active_admin/version.rb +1 -1
- data/lib/active_admin/view_factory.rb +21 -0
- data/lib/active_admin/view_helpers.rb +17 -100
- data/lib/active_admin/view_helpers/assigns_with_indifferent_access_helper.rb +7 -0
- data/lib/active_admin/view_helpers/auto_link_helper.rb +41 -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 +174 -0
- data/lib/active_admin/view_helpers/form_helper.rb +12 -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/status_tag_helper.rb +13 -0
- data/lib/active_admin/view_helpers/table_helper.rb +12 -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/columns.rb +49 -0
- data/lib/active_admin/views/components/paginated_collection.rb +74 -0
- data/lib/active_admin/views/components/panel.rb +26 -0
- data/lib/active_admin/views/components/scopes.rb +64 -0
- data/lib/active_admin/views/components/sidebar_section.rb +30 -0
- data/lib/active_admin/views/components/table_for.rb +174 -0
- data/lib/active_admin/views/dashboard_section_renderer.rb +19 -0
- data/lib/active_admin/views/header_renderer.rb +37 -0
- data/lib/active_admin/views/index_as_block.rb +24 -0
- data/lib/active_admin/views/index_as_blog.rb +89 -0
- data/lib/active_admin/views/index_as_grid.rb +49 -0
- data/lib/active_admin/views/index_as_table.rb +73 -0
- data/lib/active_admin/views/pages/base.rb +138 -0
- data/lib/active_admin/views/pages/dashboard.rb +61 -0
- data/lib/active_admin/views/pages/edit.rb +27 -0
- data/lib/active_admin/views/pages/index.rb +64 -0
- data/lib/active_admin/views/pages/new.rb +27 -0
- data/lib/active_admin/views/pages/show.rb +56 -0
- data/lib/active_admin/views/tabs_renderer.rb +52 -0
- data/lib/active_admin/views/templates/active_admin/devise/mailer/reset_password_instructions.html.erb +8 -0
- data/lib/active_admin/views/templates/active_admin/devise/mailer/unlock_instructions.html.erb +7 -0
- data/lib/active_admin/views/templates/active_admin/devise/passwords/edit.html.erb +16 -0
- data/lib/active_admin/views/templates/active_admin/devise/passwords/new.html.erb +14 -0
- data/lib/active_admin/views/templates/active_admin/devise/sessions/new.html.erb +18 -0
- data/lib/active_admin/views/templates/active_admin/devise/shared/_links.erb +20 -0
- data/lib/active_admin/views/templates/active_admin/devise/unlocks/new.html.erb +12 -0
- data/lib/active_admin/views/templates/active_admin_dashboard/index.html.arb +1 -0
- data/lib/active_admin/views/templates/active_admin_default/edit.html.arb +1 -0
- data/lib/active_admin/views/{active_admin_default → templates/active_admin_default}/index.csv.erb +0 -0
- data/lib/active_admin/views/templates/active_admin_default/index.html.arb +1 -0
- data/lib/active_admin/views/templates/active_admin_default/new.html.arb +1 -0
- data/lib/active_admin/views/templates/active_admin_default/show.html.arb +1 -0
- data/lib/active_admin/views/{layouts → templates/layouts}/active_admin.html.erb +3 -4
- data/lib/active_admin/views/templates/layouts/active_admin_logged_out.html.erb +31 -0
- data/lib/generators/active_admin/devise/devise_generator.rb +45 -0
- data/lib/generators/active_admin/install/install_generator.rb +18 -3
- data/lib/generators/active_admin/install/templates/active_admin.js +41 -0
- data/lib/generators/active_admin/install/templates/{active_admin.rb → active_admin.rb.erb} +33 -3
- data/lib/generators/active_admin/install/templates/active_admin_vendor.js +1 -1
- data/lib/generators/active_admin/install/templates/dashboards.rb +3 -4
- data/lib/generators/active_admin/install/templates/images/admin_notes_icon.png +0 -0
- data/lib/generators/active_admin/install/templates/images/loading.gif +0 -0
- data/lib/generators/active_admin/install/templates/images/nested_menu_arrow.gif +0 -0
- data/lib/generators/active_admin/install/templates/images/nested_menu_arrow_dark.gif +0 -0
- data/lib/generators/active_admin/install/templates/images/orderable.png +0 -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/spec/integration/belongs_to_spec.rb +42 -0
- data/spec/integration/index_as_table_spec.rb +0 -119
- data/spec/integration/layout_spec.rb +3 -37
- data/spec/spec_helper.rb +89 -50
- data/spec/support/integration_example_group.rb +37 -0
- data/spec/support/rails_template.rb +21 -9
- data/spec/support/rails_template_with_data.rb +32 -0
- data/spec/support/templates/cucumber.rb +28 -0
- data/spec/unit/abstract_view_factory_spec.rb +79 -0
- data/spec/unit/action_builder_spec.rb +19 -7
- data/spec/unit/action_items_spec.rb +16 -30
- data/spec/unit/active_admin_spec.rb +10 -22
- data/spec/unit/arbre/html/element_finder_methods_spec.rb +54 -0
- data/spec/unit/arbre/html/element_spec.rb +224 -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 +185 -0
- data/spec/unit/auto_link_spec.rb +38 -0
- data/spec/unit/belongs_to_spec.rb +44 -0
- data/spec/unit/breadcrumbs_spec.rb +110 -0
- data/spec/unit/comments_spec.rb +53 -0
- data/spec/unit/component_spec.rb +18 -0
- data/spec/unit/components/attributes_table_spec.rb +100 -0
- data/spec/unit/components/columns_spec.rb +75 -0
- data/spec/unit/components/panel_spec.rb +31 -0
- data/spec/unit/components/sidebar_section_spec.rb +37 -0
- data/spec/unit/components/table_for_spec.rb +130 -0
- data/spec/unit/dashboard_controller_spec.rb +26 -0
- data/spec/unit/dashboard_section_spec.rb +10 -17
- 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 +99 -77
- data/spec/unit/form_builder_spec.rb +69 -69
- data/spec/unit/namespace_spec.rb +61 -3
- data/spec/unit/pretty_format_spec.rb +35 -0
- data/spec/unit/registration_spec.rb +40 -1
- data/spec/unit/renderer_spec.rb +8 -0
- data/spec/unit/resource_controller_spec.rb +105 -6
- data/spec/unit/resource_spec.rb +78 -11
- data/spec/unit/routing_spec.rb +82 -6
- data/spec/unit/scope_spec.rb +31 -0
- data/spec/unit/tabs_renderer_spec.rb +24 -2
- data/spec/unit/view_factory_spec.rb +16 -0
- metadata +268 -82
- data/.gitignore +0 -25
- data/active_admin.gemspec +0 -22
- data/lib/active_admin/action_builder.rb +0 -60
- data/lib/active_admin/breadcrumbs.rb +0 -26
- data/lib/active_admin/dashboards/renderer.rb +0 -45
- data/lib/active_admin/dashboards/section_renderer.rb +0 -28
- data/lib/active_admin/filters.rb +0 -189
- data/lib/active_admin/pages.rb +0 -11
- data/lib/active_admin/pages/base.rb +0 -92
- data/lib/active_admin/pages/edit.rb +0 -21
- data/lib/active_admin/pages/index.rb +0 -58
- data/lib/active_admin/pages/index/blog.rb +0 -65
- data/lib/active_admin/pages/index/table.rb +0 -48
- data/lib/active_admin/pages/index/thumbnails.rb +0 -40
- data/lib/active_admin/pages/new.rb +0 -21
- data/lib/active_admin/pages/show.rb +0 -54
- data/lib/active_admin/table_builder.rb +0 -162
- data/lib/active_admin/tabs_renderer.rb +0 -39
- data/lib/active_admin/views/active_admin_dashboard/index.html.erb +0 -1
- data/lib/active_admin/views/active_admin_default/edit.html.erb +0 -1
- data/lib/active_admin/views/active_admin_default/index.html.erb +0 -1
- data/lib/active_admin/views/active_admin_default/new.html.erb +0 -1
- data/lib/active_admin/views/active_admin_default/show.html.erb +0 -1
- data/lib/generators/active_admin/install/templates/active_admin.css +0 -325
- data/lib/generators/active_admin/install/templates/images/orderable.gif +0 -0
- data/spec/integration/index_as_blog_spec.rb +0 -65
- data/spec/integration/index_as_thumbnails_spec.rb +0 -43
- data/spec/integration/new_view_spec.rb +0 -52
- data/spec/integration/show_view_spec.rb +0 -91
- data/spec/unit/sidebar_spec.rb +0 -96
- data/spec/unit/table_builder_spec.rb +0 -162
@@ -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
|
@@ -1,157 +1,179 @@
|
|
1
1
|
require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
|
2
2
|
|
3
3
|
|
4
|
-
|
4
|
+
describe ActiveAdmin::ViewHelpers::FilterFormHelper do
|
5
|
+
include Arbre::HTML
|
6
|
+
let(:assigns){ {} }
|
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
|
5
15
|
|
6
|
-
|
7
|
-
|
8
|
-
|
16
|
+
def view.protect_against_forgery?
|
17
|
+
false
|
18
|
+
end
|
9
19
|
|
10
|
-
|
11
|
-
Admin::PostsController.filter *args
|
20
|
+
view
|
12
21
|
end
|
13
22
|
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
reset!
|
18
|
-
filter :title
|
19
|
-
filter :body
|
20
|
-
filter :created_at
|
21
|
-
filter :id
|
22
|
-
filter :author
|
23
|
-
get :index
|
23
|
+
def filter(name, options = {})
|
24
|
+
search = Post.search
|
25
|
+
active_admin_filters_form_for(search, [options.merge(:attribute => name)])
|
24
26
|
end
|
25
27
|
|
26
|
-
|
27
|
-
|
28
|
-
end
|
28
|
+
describe "the form in general" do
|
29
|
+
let(:body) { filter :title }
|
29
30
|
|
30
|
-
|
31
|
-
|
32
|
-
|
31
|
+
it "should generate a form which submits via get" do
|
32
|
+
body.should have_tag("form", :attributes => { :method => 'get' })
|
33
|
+
end
|
33
34
|
|
34
|
-
|
35
|
-
|
35
|
+
it "should generate a filter button" do
|
36
|
+
body.should have_tag("input", :attributes => { :type => "submit",
|
36
37
|
:value => "Filter" })
|
37
|
-
|
38
|
+
end
|
38
39
|
|
39
|
-
|
40
|
-
|
41
|
-
|
40
|
+
it "should only generate the form once" do
|
41
|
+
body.scan(/q\[title_contains\]/).size.should == 1
|
42
|
+
end
|
42
43
|
|
43
|
-
|
44
|
-
|
44
|
+
it "should generate a clear filters link" do
|
45
|
+
body.should have_tag("a", "Clear Filters", :attributes => { :class => "clear_filters_btn" })
|
46
|
+
end
|
45
47
|
end
|
46
48
|
|
47
|
-
|
48
|
-
|
49
|
-
|
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
|
50
55
|
|
51
|
-
|
52
|
-
|
56
|
+
it "should label a text field with search" do
|
57
|
+
body.should have_tag('label', 'Search Title')
|
58
|
+
end
|
53
59
|
end
|
54
60
|
|
55
|
-
|
56
|
-
|
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
|
57
71
|
end
|
58
72
|
|
59
|
-
|
73
|
+
describe "datetime attribute" do
|
74
|
+
let(:body) { filter :created_at }
|
75
|
+
|
60
76
|
it "should generate a date greater than" do
|
61
|
-
|
77
|
+
body.should have_tag("input", :attributes => { :name => "q[created_at_gte]", :class => "datepicker"})
|
62
78
|
end
|
63
79
|
it "should generate a date less than" do
|
64
|
-
|
80
|
+
body.should have_tag("input", :attributes => { :name => "q[created_at_lte]", :class => "datepicker"})
|
65
81
|
end
|
66
82
|
end
|
67
83
|
|
68
|
-
|
84
|
+
describe "integer attribute" do
|
85
|
+
let(:body) { filter :id }
|
86
|
+
|
69
87
|
it "should generate a select option for equal to" do
|
70
|
-
|
88
|
+
body.should have_tag("option", "Equal To", :attributes => { :value => 'id_eq' })
|
71
89
|
end
|
72
90
|
it "should generate a select option for greater than" do
|
73
|
-
|
91
|
+
body.should have_tag("option", "Greater Than")
|
74
92
|
end
|
75
93
|
it "should generate a select option for less than" do
|
76
|
-
|
94
|
+
body.should have_tag("option", "Less Than")
|
77
95
|
end
|
78
96
|
it "should generate a text field for input" do
|
79
|
-
|
80
|
-
:name =>
|
97
|
+
body.should have_tag("input", :attributes => {
|
98
|
+
:name => /q\[(id_eq|id_equals)\]/ })
|
81
99
|
end
|
82
100
|
it "should select the option which is currently being filtered"
|
83
101
|
end
|
84
102
|
|
85
|
-
|
103
|
+
describe "belong to" do
|
104
|
+
before do
|
105
|
+
@john = User.create :first_name => "John", :last_name => "Doe", :username => "john_doe"
|
106
|
+
@jane = User.create :first_name => "Jane", :last_name => "Doe", :username => "jane_doe"
|
107
|
+
end
|
86
108
|
|
87
109
|
context "when given as the _id attribute name" do
|
88
|
-
|
89
|
-
|
90
|
-
get :index
|
91
|
-
end
|
110
|
+
let(:body) { filter :author_id }
|
111
|
+
|
92
112
|
it "should not render as an integer" do
|
93
|
-
|
113
|
+
body.should_not have_tag("input", :attributes => {
|
94
114
|
:name => "q[author_id_eq]"})
|
95
115
|
end
|
96
116
|
it "should render as belongs to select" do
|
97
|
-
|
117
|
+
body.should have_tag("select", :attributes => {
|
98
118
|
:name => "q[author_id_eq]"})
|
99
|
-
|
119
|
+
body.should have_tag("option", "jane_doe", :attributes => {
|
100
120
|
:value => @jane.id })
|
101
121
|
end
|
102
122
|
end
|
103
123
|
|
104
|
-
context "as
|
124
|
+
context "when given as the name of the relationship" do
|
125
|
+
let(:body) { filter :author }
|
126
|
+
|
105
127
|
it "should generate a select" do
|
106
|
-
|
128
|
+
body.should have_tag("select", :attributes => {
|
107
129
|
:name => "q[author_id_eq]"})
|
108
130
|
end
|
109
131
|
it "should set the default text to 'Any'" do
|
110
|
-
|
132
|
+
body.should have_tag("option", "Any", :attributes => {
|
111
133
|
:value => "" })
|
112
134
|
end
|
113
135
|
it "should create an option for each related object" do
|
114
|
-
|
136
|
+
body.should have_tag("option", "john_doe", :attributes => {
|
115
137
|
:value => @john.id })
|
116
|
-
|
138
|
+
body.should have_tag("option", "jane_doe", :attributes => {
|
117
139
|
:value => @jane.id })
|
118
140
|
end
|
141
|
+
|
119
142
|
context "with a proc" do
|
120
|
-
|
121
|
-
reset!
|
143
|
+
let :body do
|
122
144
|
filter :title, :as => :select, :collection => proc{ ['Title One', 'Title Two'] }
|
123
|
-
get :index
|
124
145
|
end
|
146
|
+
|
125
147
|
it "should use call the proc as the collection" do
|
126
|
-
|
127
|
-
|
148
|
+
body.should have_tag("option", "Title One")
|
149
|
+
body.should have_tag("option", "Title Two")
|
128
150
|
end
|
129
151
|
end
|
130
152
|
end
|
131
153
|
|
132
154
|
context "as check boxes" do
|
133
|
-
|
134
|
-
|
135
|
-
get :index
|
136
|
-
end
|
155
|
+
let(:body) { filter :author, :as => :check_boxes }
|
156
|
+
|
137
157
|
it "should create a check box for each related object" do
|
138
|
-
|
158
|
+
body.should have_tag("input", :attributes => {
|
139
159
|
:name => "q[author_id_in][]",
|
140
160
|
:type => "checkbox",
|
141
161
|
:value => @john.id })
|
142
|
-
|
162
|
+
body.should have_tag("input", :attributes => {
|
143
163
|
:name => "q[author_id_in][]",
|
144
164
|
:type => "checkbox",
|
145
165
|
:value => @jane.id })
|
146
166
|
end
|
147
167
|
end
|
148
|
-
end # belongs to
|
149
168
|
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
|
169
|
+
context "when polymorphic relationship" do
|
170
|
+
let(:body) do
|
171
|
+
search = ActiveAdmin::Comment.search
|
172
|
+
active_admin_filters_form_for(search, [{ :attribute => :resource}])
|
173
|
+
end
|
174
|
+
it "should not generate any field" do
|
175
|
+
body.should have_tag("form", :attributes => { :method => 'get' })
|
176
|
+
end
|
154
177
|
end
|
155
|
-
end
|
156
|
-
|
178
|
+
end # belongs to
|
157
179
|
end
|
@@ -1,118 +1,127 @@
|
|
1
1
|
require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
|
2
2
|
|
3
|
-
|
3
|
+
describe ActiveAdmin::FormBuilder do
|
4
|
+
include Arbre::HTML
|
5
|
+
let(:assigns){ {} }
|
4
6
|
|
5
|
-
|
6
|
-
|
7
|
-
|
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
|
+
active_admin_form_for Post.new, options, &block
|
8
32
|
end
|
9
33
|
|
10
34
|
context "in general" do
|
11
|
-
|
35
|
+
let :body do
|
12
36
|
build_form do |f|
|
13
37
|
f.inputs do
|
14
38
|
f.input :title
|
15
39
|
f.input :body
|
16
40
|
end
|
17
|
-
f.label :title, "My Super Title"
|
18
|
-
f.text_field :title
|
19
41
|
f.buttons do
|
20
|
-
f.submit "My Submit Button"
|
21
42
|
f.commit_button "Submit Me"
|
22
43
|
f.commit_button "Another Button"
|
23
44
|
end
|
24
45
|
end
|
25
46
|
end
|
47
|
+
|
26
48
|
it "should generate a text input" do
|
27
|
-
|
49
|
+
body.should have_tag("input", :attributes => { :type => "text",
|
28
50
|
:name => "post[title]" })
|
29
51
|
end
|
30
|
-
it "should generate a label using the default form methods" do
|
31
|
-
response.should have_tag("label", "My Super Title")
|
32
|
-
end
|
33
52
|
it "should generate a textarea" do
|
34
|
-
|
53
|
+
body.should have_tag("textarea", :attributes => { :name => "post[body]" })
|
35
54
|
end
|
36
55
|
it "should only generate the form once" do
|
37
|
-
|
56
|
+
body.scan(/Title/).size.should == 1
|
38
57
|
end
|
39
58
|
it "should generate buttons" do
|
40
|
-
|
59
|
+
body.should have_tag("input", :attributes => { :type => "submit",
|
41
60
|
:value => "Submit Me" })
|
42
|
-
|
61
|
+
body.should have_tag("input", :attributes => { :type => "submit",
|
43
62
|
:value => "Another Button" })
|
44
63
|
end
|
45
64
|
end
|
46
65
|
|
47
66
|
describe "passing in options" do
|
48
|
-
|
49
|
-
|
67
|
+
let :body do
|
68
|
+
build_form :html => { :multipart => true } do |f|
|
50
69
|
f.inputs :title
|
51
70
|
f.buttons
|
52
71
|
end
|
53
|
-
get :new
|
54
72
|
end
|
55
73
|
it "should pass the options on to the form" do
|
56
|
-
|
57
|
-
end
|
58
|
-
end
|
59
|
-
|
60
|
-
context "with default settings" do
|
61
|
-
before do
|
62
|
-
Admin::PostsController.reset_form_config!
|
63
|
-
get :new
|
64
|
-
end
|
65
|
-
it "should generate one post title field" do
|
66
|
-
response.body.scan('id="post_title"').size.should == 1
|
74
|
+
body.should have_tag("form", :attributes => { :enctype => "multipart/form-data" })
|
67
75
|
end
|
68
76
|
end
|
69
77
|
|
70
78
|
context "with buttons" do
|
71
79
|
it "should generate the form once" do
|
72
|
-
build_form do |f|
|
80
|
+
body = build_form do |f|
|
73
81
|
f.inputs do
|
74
82
|
f.input :title
|
75
83
|
end
|
76
84
|
f.buttons
|
77
85
|
end
|
78
|
-
|
86
|
+
body.scan(/id=\"post_title\"/).size.should == 1
|
79
87
|
end
|
80
|
-
it "should generate one button" do
|
81
|
-
build_form do |f|
|
88
|
+
it "should generate one button and a cancel link" do
|
89
|
+
body = build_form do |f|
|
82
90
|
f.buttons
|
83
91
|
end
|
84
|
-
|
92
|
+
body.scan(/type=\"submit\"/).size.should == 1
|
93
|
+
body.scan(/class=\"cancel\"/).size.should == 1
|
85
94
|
end
|
86
95
|
it "should generate multiple buttons" do
|
87
|
-
build_form do |f|
|
96
|
+
body = build_form do |f|
|
88
97
|
f.buttons do
|
89
|
-
f.submit "Create"
|
90
98
|
f.commit_button "Create & Continue"
|
91
99
|
f.commit_button "Create & Edit"
|
92
100
|
end
|
93
101
|
end
|
94
|
-
|
102
|
+
body.scan(/type=\"submit\"/).size.should == 2
|
103
|
+
body.scan(/class=\"cancel\"/).size.should == 0
|
95
104
|
end
|
96
105
|
|
97
106
|
end
|
98
107
|
|
99
108
|
context "without passing a block to inputs" do
|
100
|
-
|
109
|
+
let :body do
|
101
110
|
build_form do |f|
|
102
111
|
f.inputs :title, :body
|
103
112
|
end
|
104
113
|
end
|
105
114
|
it "should have a title input" do
|
106
|
-
|
115
|
+
body.should have_tag("input", :attributes => { :type => "text",
|
107
116
|
:name => "post[title]" })
|
108
117
|
end
|
109
118
|
it "should have a body textarea" do
|
110
|
-
|
119
|
+
body.should have_tag("textarea", :attributes => { :name => "post[body]" })
|
111
120
|
end
|
112
121
|
end
|
113
122
|
|
114
123
|
context "with semantic fields for" do
|
115
|
-
|
124
|
+
let :body do
|
116
125
|
build_form do |f|
|
117
126
|
f.inputs do
|
118
127
|
f.input :title
|
@@ -127,7 +136,7 @@ describe_with_render ActiveAdmin::FormBuilder do
|
|
127
136
|
end
|
128
137
|
end
|
129
138
|
it "should generate a nested text input once" do
|
130
|
-
|
139
|
+
body.scan("post_author_attributes_first_name_input").size.should == 1
|
131
140
|
end
|
132
141
|
end
|
133
142
|
|
@@ -138,30 +147,30 @@ describe_with_render ActiveAdmin::FormBuilder do
|
|
138
147
|
end
|
139
148
|
|
140
149
|
describe "as select" do
|
141
|
-
|
150
|
+
let :body do
|
142
151
|
build_form do |f|
|
143
152
|
f.input :author
|
144
153
|
end
|
145
154
|
end
|
146
155
|
it "should create 2 options" do
|
147
|
-
|
156
|
+
body.scan(/\<option/).size.should == 3
|
148
157
|
end
|
149
158
|
end
|
150
159
|
|
151
160
|
describe "as radio buttons" do
|
152
|
-
|
161
|
+
let :body do
|
153
162
|
build_form do |f|
|
154
163
|
f.input :author, :as => :radio
|
155
164
|
end
|
156
165
|
end
|
157
166
|
it "should create 2 radio buttons" do
|
158
|
-
|
167
|
+
body.scan(/type=\"radio\"/).size.should == 2
|
159
168
|
end
|
160
169
|
end
|
161
170
|
end
|
162
171
|
|
163
172
|
context "with inputs 'for'" do
|
164
|
-
|
173
|
+
let :body do
|
165
174
|
build_form do |f|
|
166
175
|
f.inputs do
|
167
176
|
f.input :title
|
@@ -176,52 +185,43 @@ describe_with_render ActiveAdmin::FormBuilder do
|
|
176
185
|
end
|
177
186
|
end
|
178
187
|
it "should generate a nested text input once" do
|
179
|
-
|
188
|
+
body.scan("post_author_attributes_first_name_input").size.should == 1
|
180
189
|
end
|
181
190
|
it "should add an author first name field" do
|
182
|
-
|
191
|
+
body.should have_tag("input", :attributes => { :name => "post[author_attributes][first_name]"})
|
183
192
|
end
|
184
193
|
end
|
185
194
|
|
186
195
|
context "with wrapper html" do
|
187
196
|
it "should set a class" do
|
188
|
-
build_form do |f|
|
197
|
+
body = build_form do |f|
|
189
198
|
f.input :title, :wrapper_html => { :class => "important" }
|
190
199
|
end
|
191
|
-
|
200
|
+
body.should have_tag("li", :attributes => {:class => "string optional important"})
|
192
201
|
end
|
193
202
|
end
|
194
203
|
|
195
204
|
|
196
|
-
# This checks that each input can be added via the standard
|
197
|
-
# rails method as well as using the form builder's #input method.
|
198
205
|
{
|
199
206
|
"input :title, :as => :string" => /id\=\"post_title\"/,
|
200
|
-
"text_field :title" => /id\=\"post_title\"/,
|
201
207
|
"input :title, :as => :text" => /id\=\"post_title\"/,
|
202
|
-
"text_area :title" => /id\=\"post_title\"/,
|
203
208
|
"input :created_at, :as => :time" => /id\=\"post_created_at_2i\"/,
|
204
|
-
"time_select :created_at" => /id\=\"post_created_at_2i\"/,
|
205
209
|
"input :created_at, :as => :datetime" => /id\=\"post_created_at_2i\"/,
|
206
|
-
"datetime_select :created_at" => /id\=\"post_created_at_2i\"/,
|
207
210
|
"input :created_at, :as => :date" => /id\=\"post_created_at_2i\"/,
|
208
|
-
"date_select :created_at" => /id\=\"post_created_at_2i\"/,
|
209
|
-
"radio_button :title, 'title'" => /id\=\"post_title_title\"/,
|
210
|
-
"file_field :title" => /id\=\"post_title\"/,
|
211
|
-
"hidden_field :title" => /id\=\"post_title\"/,
|
212
|
-
"label :title" => /for\=\"post_title\"/,
|
213
211
|
}.each do |source, regex|
|
214
212
|
it "should properly buffer #{source}" do
|
215
|
-
build_form do |f|
|
216
|
-
f.
|
217
|
-
|
213
|
+
body = build_form do |f|
|
214
|
+
f.inputs do
|
215
|
+
f.instance_eval(source)
|
216
|
+
f.instance_eval(source)
|
217
|
+
end
|
218
218
|
end
|
219
|
-
|
219
|
+
body.scan(regex).size.should == 2
|
220
220
|
end
|
221
221
|
end
|
222
222
|
|
223
223
|
describe "datepicker input" do
|
224
|
-
|
224
|
+
let :body do
|
225
225
|
build_form do |f|
|
226
226
|
f.inputs do
|
227
227
|
f.input :created_at, :as => :datepicker
|
@@ -229,7 +229,7 @@ describe_with_render ActiveAdmin::FormBuilder do
|
|
229
229
|
end
|
230
230
|
end
|
231
231
|
it "should generate a text input with the class of datepicker" do
|
232
|
-
|
232
|
+
body.should have_tag("input", :attributes => { :type => "text",
|
233
233
|
:class => "datepicker",
|
234
234
|
:name => "post[created_at]" })
|
235
235
|
end
|