saulolso-activeadmin 0.2.2
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 +32 -0
- data/.travis.yml +4 -0
- data/CHANGELOG.rdoc +76 -0
- data/Gemfile +26 -0
- data/LICENSE +25 -0
- data/README.rdoc +450 -0
- data/Rakefile +100 -0
- data/activeadmin.gemspec +28 -0
- data/cucumber.yml +2 -0
- data/features/comments/commenting.feature +99 -0
- data/features/comments/viewing_index.feature +19 -0
- data/features/dashboard.feature +26 -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/format_as_csv.feature +45 -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/menu.feature +26 -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 +60 -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/dashboard_steps.rb +11 -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 +34 -0
- data/features/step_definitions/index_scope_steps.rb +20 -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 +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/sti_resource.feature +49 -0
- data/features/support/env.rb +92 -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/abstract_view_factory.rb +95 -0
- data/lib/active_admin/action_items.rb +37 -0
- data/lib/active_admin/application.rb +204 -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 +137 -0
- data/lib/active_admin/arbre/text_node.rb +35 -0
- data/lib/active_admin/arbre.rb +23 -0
- data/lib/active_admin/asset_registration.rb +34 -0
- data/lib/active_admin/callbacks.rb +87 -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/active_admin_comment.rb +0 -0
- data/lib/active_admin/comments/views/active_admin_comments.rb +82 -0
- data/lib/active_admin/comments/views.rb +3 -0
- data/lib/active_admin/comments.rb +88 -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/dashboard_controller.rb +47 -0
- data/lib/active_admin/dashboards/section.rb +34 -0
- data/lib/active_admin/dashboards.rb +48 -0
- data/lib/active_admin/devise.rb +43 -0
- data/lib/active_admin/dsl.rb +215 -0
- data/lib/active_admin/event.rb +31 -0
- data/lib/active_admin/form_builder.rb +109 -0
- data/lib/active_admin/helpers/optional_display.rb +34 -0
- data/lib/active_admin/iconic/icons.rb +142 -0
- data/lib/active_admin/iconic.rb +51 -0
- data/lib/active_admin/locales/da.yml +26 -0
- data/lib/active_admin/locales/en.yml +34 -0
- data/lib/active_admin/locales/es.yml +34 -0
- data/lib/active_admin/locales/pt.yml +34 -0
- data/lib/active_admin/menu.rb +42 -0
- data/lib/active_admin/menu_item.rb +73 -0
- data/lib/active_admin/namespace.rb +198 -0
- data/lib/active_admin/page_config.rb +15 -0
- data/lib/active_admin/renderer.rb +87 -0
- data/lib/active_admin/resource/belongs_to.rb +31 -0
- data/lib/active_admin/resource.rb +229 -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 +144 -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/resource_controller.rb +119 -0
- data/lib/active_admin/router.rb +85 -0
- data/lib/active_admin/scope.rb +17 -0
- data/lib/active_admin/sidebar.rb +43 -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/stylesheets/active_admin.scss +429 -0
- data/lib/active_admin/version.rb +3 -0
- data/lib/active_admin/view_factory.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 +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 +185 -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/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/view_helpers.rb +23 -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 +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 +70 -0
- data/lib/active_admin/views/components/sidebar_section.rb +30 -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 +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 +75 -0
- data/lib/active_admin/views/pages/base.rb +144 -0
- data/lib/active_admin/views/pages/dashboard.rb +59 -0
- data/lib/active_admin/views/pages/edit.rb +27 -0
- data/lib/active_admin/views/pages/index.rb +66 -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 +58 -0
- data/lib/active_admin/views/templates/active_admin/dashboard/index.html.arb +1 -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/resource/edit.html.arb +1 -0
- data/lib/active_admin/views/templates/active_admin/resource/index.csv.erb +20 -0
- data/lib/active_admin/views/templates/active_admin/resource/index.html.arb +1 -0
- data/lib/active_admin/views/templates/active_admin/resource/new.html.arb +1 -0
- data/lib/active_admin/views/templates/active_admin/resource/show.html.arb +1 -0
- data/lib/active_admin/views/templates/layouts/active_admin.html.erb +39 -0
- data/lib/active_admin/views/templates/layouts/active_admin_logged_out.html.erb +31 -0
- data/lib/active_admin/views.rb +8 -0
- data/lib/active_admin.rb +71 -0
- data/lib/activeadmin.rb +1 -0
- data/lib/generators/active_admin/devise/devise_generator.rb +49 -0
- data/lib/generators/active_admin/install/install_generator.rb +46 -0
- data/lib/generators/active_admin/install/templates/active_admin.js +51 -0
- data/lib/generators/active_admin/install/templates/active_admin.rb.erb +78 -0
- data/lib/generators/active_admin/install/templates/active_admin_vendor.js +382 -0
- data/lib/generators/active_admin/install/templates/dashboards.rb +38 -0
- 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/lib/generators/active_admin/resource/resource_generator.rb +16 -0
- data/lib/generators/active_admin/resource/templates/admin.rb +3 -0
- data/spec/integration/belongs_to_spec.rb +42 -0
- data/spec/spec_helper.rb +156 -0
- data/spec/support/integration_example_group.rb +33 -0
- data/spec/support/rails_template.rb +32 -0
- data/spec/support/rails_template_with_data.rb +32 -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/action_items_spec.rb +27 -0
- data/spec/unit/application_spec.rb +67 -0
- 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 +210 -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/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/status_tag_spec.rb +81 -0
- data/spec/unit/components/table_for_spec.rb +130 -0
- data/spec/unit/controller_filters_spec.rb +27 -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/display_name_spec.rb +29 -0
- data/spec/unit/event_spec.rb +41 -0
- data/spec/unit/filter_form_builder_spec.rb +179 -0
- data/spec/unit/form_builder_spec.rb +238 -0
- data/spec/unit/menu_item_spec.rb +143 -0
- data/spec/unit/menu_spec.rb +53 -0
- data/spec/unit/namespace_spec.rb +203 -0
- data/spec/unit/pretty_format_spec.rb +35 -0
- data/spec/unit/registration_spec.rb +76 -0
- data/spec/unit/renderer_spec.rb +108 -0
- data/spec/unit/resource_controller/collection_spec.rb +34 -0
- data/spec/unit/resource_controller_spec.rb +147 -0
- data/spec/unit/resource_spec.rb +290 -0
- data/spec/unit/routing_spec.rb +88 -0
- data/spec/unit/scope_spec.rb +31 -0
- data/spec/unit/tabs_renderer_spec.rb +85 -0
- data/spec/unit/view_factory_spec.rb +16 -0
- metadata +482 -0
|
@@ -0,0 +1,238 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
|
|
3
|
+
describe ActiveAdmin::FormBuilder do
|
|
4
|
+
include Arbre::HTML
|
|
5
|
+
let(:assigns){ {} }
|
|
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
|
+
active_admin_form_for Post.new, options, &block
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
context "in general" do
|
|
35
|
+
let :body do
|
|
36
|
+
build_form do |f|
|
|
37
|
+
f.inputs do
|
|
38
|
+
f.input :title
|
|
39
|
+
f.input :body
|
|
40
|
+
end
|
|
41
|
+
f.buttons do
|
|
42
|
+
f.commit_button "Submit Me"
|
|
43
|
+
f.commit_button "Another Button"
|
|
44
|
+
end
|
|
45
|
+
end
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
it "should generate a text input" do
|
|
49
|
+
body.should have_tag("input", :attributes => { :type => "text",
|
|
50
|
+
:name => "post[title]" })
|
|
51
|
+
end
|
|
52
|
+
it "should generate a textarea" do
|
|
53
|
+
body.should have_tag("textarea", :attributes => { :name => "post[body]" })
|
|
54
|
+
end
|
|
55
|
+
it "should only generate the form once" do
|
|
56
|
+
body.scan(/Title/).size.should == 1
|
|
57
|
+
end
|
|
58
|
+
it "should generate buttons" do
|
|
59
|
+
body.should have_tag("input", :attributes => { :type => "submit",
|
|
60
|
+
:value => "Submit Me" })
|
|
61
|
+
body.should have_tag("input", :attributes => { :type => "submit",
|
|
62
|
+
:value => "Another Button" })
|
|
63
|
+
end
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
describe "passing in options" do
|
|
67
|
+
let :body do
|
|
68
|
+
build_form :html => { :multipart => true } do |f|
|
|
69
|
+
f.inputs :title
|
|
70
|
+
f.buttons
|
|
71
|
+
end
|
|
72
|
+
end
|
|
73
|
+
it "should pass the options on to the form" do
|
|
74
|
+
body.should have_tag("form", :attributes => { :enctype => "multipart/form-data" })
|
|
75
|
+
end
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
context "with buttons" do
|
|
79
|
+
it "should generate the form once" do
|
|
80
|
+
body = build_form do |f|
|
|
81
|
+
f.inputs do
|
|
82
|
+
f.input :title
|
|
83
|
+
end
|
|
84
|
+
f.buttons
|
|
85
|
+
end
|
|
86
|
+
body.scan(/id=\"post_title\"/).size.should == 1
|
|
87
|
+
end
|
|
88
|
+
it "should generate one button and a cancel link" do
|
|
89
|
+
body = build_form do |f|
|
|
90
|
+
f.buttons
|
|
91
|
+
end
|
|
92
|
+
body.scan(/type=\"submit\"/).size.should == 1
|
|
93
|
+
body.scan(/class=\"cancel\"/).size.should == 1
|
|
94
|
+
end
|
|
95
|
+
it "should generate multiple buttons" do
|
|
96
|
+
body = build_form do |f|
|
|
97
|
+
f.buttons do
|
|
98
|
+
f.commit_button "Create & Continue"
|
|
99
|
+
f.commit_button "Create & Edit"
|
|
100
|
+
end
|
|
101
|
+
end
|
|
102
|
+
body.scan(/type=\"submit\"/).size.should == 2
|
|
103
|
+
body.scan(/class=\"cancel\"/).size.should == 0
|
|
104
|
+
end
|
|
105
|
+
|
|
106
|
+
end
|
|
107
|
+
|
|
108
|
+
context "without passing a block to inputs" do
|
|
109
|
+
let :body do
|
|
110
|
+
build_form do |f|
|
|
111
|
+
f.inputs :title, :body
|
|
112
|
+
end
|
|
113
|
+
end
|
|
114
|
+
it "should have a title input" do
|
|
115
|
+
body.should have_tag("input", :attributes => { :type => "text",
|
|
116
|
+
:name => "post[title]" })
|
|
117
|
+
end
|
|
118
|
+
it "should have a body textarea" do
|
|
119
|
+
body.should have_tag("textarea", :attributes => { :name => "post[body]" })
|
|
120
|
+
end
|
|
121
|
+
end
|
|
122
|
+
|
|
123
|
+
context "with semantic fields for" do
|
|
124
|
+
let :body do
|
|
125
|
+
build_form do |f|
|
|
126
|
+
f.inputs do
|
|
127
|
+
f.input :title
|
|
128
|
+
f.input :body
|
|
129
|
+
end
|
|
130
|
+
f.instance_eval do
|
|
131
|
+
@object.author = User.new
|
|
132
|
+
end
|
|
133
|
+
f.semantic_fields_for :author do |author|
|
|
134
|
+
author.inputs :first_name, :last_name
|
|
135
|
+
end
|
|
136
|
+
end
|
|
137
|
+
end
|
|
138
|
+
it "should generate a nested text input once" do
|
|
139
|
+
body.scan("post_author_attributes_first_name_input").size.should == 1
|
|
140
|
+
end
|
|
141
|
+
end
|
|
142
|
+
|
|
143
|
+
context "with collection inputs" do
|
|
144
|
+
before do
|
|
145
|
+
User.create :first_name => "John", :last_name => "Doe"
|
|
146
|
+
User.create :first_name => "Jane", :last_name => "Doe"
|
|
147
|
+
end
|
|
148
|
+
|
|
149
|
+
describe "as select" do
|
|
150
|
+
let :body do
|
|
151
|
+
build_form do |f|
|
|
152
|
+
f.input :author
|
|
153
|
+
end
|
|
154
|
+
end
|
|
155
|
+
it "should create 2 options" do
|
|
156
|
+
body.scan(/\<option/).size.should == 3
|
|
157
|
+
end
|
|
158
|
+
end
|
|
159
|
+
|
|
160
|
+
describe "as radio buttons" do
|
|
161
|
+
let :body do
|
|
162
|
+
build_form do |f|
|
|
163
|
+
f.input :author, :as => :radio
|
|
164
|
+
end
|
|
165
|
+
end
|
|
166
|
+
it "should create 2 radio buttons" do
|
|
167
|
+
body.scan(/type=\"radio\"/).size.should == 2
|
|
168
|
+
end
|
|
169
|
+
end
|
|
170
|
+
end
|
|
171
|
+
|
|
172
|
+
context "with inputs 'for'" do
|
|
173
|
+
let :body do
|
|
174
|
+
build_form do |f|
|
|
175
|
+
f.inputs do
|
|
176
|
+
f.input :title
|
|
177
|
+
f.input :body
|
|
178
|
+
end
|
|
179
|
+
f.instance_eval do
|
|
180
|
+
@object.author = User.new
|
|
181
|
+
end
|
|
182
|
+
f.inputs :name => 'Author', :for => :author do |author|
|
|
183
|
+
author.inputs :first_name, :last_name
|
|
184
|
+
end
|
|
185
|
+
end
|
|
186
|
+
end
|
|
187
|
+
it "should generate a nested text input once" do
|
|
188
|
+
body.scan("post_author_attributes_first_name_input").size.should == 1
|
|
189
|
+
end
|
|
190
|
+
it "should add an author first name field" do
|
|
191
|
+
body.should have_tag("input", :attributes => { :name => "post[author_attributes][first_name]"})
|
|
192
|
+
end
|
|
193
|
+
end
|
|
194
|
+
|
|
195
|
+
context "with wrapper html" do
|
|
196
|
+
it "should set a class" do
|
|
197
|
+
body = build_form do |f|
|
|
198
|
+
f.input :title, :wrapper_html => { :class => "important" }
|
|
199
|
+
end
|
|
200
|
+
body.should have_tag("li", :attributes => {:class => "string optional important"})
|
|
201
|
+
end
|
|
202
|
+
end
|
|
203
|
+
|
|
204
|
+
|
|
205
|
+
{
|
|
206
|
+
"input :title, :as => :string" => /id\=\"post_title\"/,
|
|
207
|
+
"input :title, :as => :text" => /id\=\"post_title\"/,
|
|
208
|
+
"input :created_at, :as => :time" => /id\=\"post_created_at_2i\"/,
|
|
209
|
+
"input :created_at, :as => :datetime" => /id\=\"post_created_at_2i\"/,
|
|
210
|
+
"input :created_at, :as => :date" => /id\=\"post_created_at_2i\"/,
|
|
211
|
+
}.each do |source, regex|
|
|
212
|
+
it "should properly buffer #{source}" do
|
|
213
|
+
body = build_form do |f|
|
|
214
|
+
f.inputs do
|
|
215
|
+
f.instance_eval(source)
|
|
216
|
+
f.instance_eval(source)
|
|
217
|
+
end
|
|
218
|
+
end
|
|
219
|
+
body.scan(regex).size.should == 2
|
|
220
|
+
end
|
|
221
|
+
end
|
|
222
|
+
|
|
223
|
+
describe "datepicker input" do
|
|
224
|
+
let :body do
|
|
225
|
+
build_form do |f|
|
|
226
|
+
f.inputs do
|
|
227
|
+
f.input :created_at, :as => :datepicker
|
|
228
|
+
end
|
|
229
|
+
end
|
|
230
|
+
end
|
|
231
|
+
it "should generate a text input with the class of datepicker" do
|
|
232
|
+
body.should have_tag("input", :attributes => { :type => "text",
|
|
233
|
+
:class => "datepicker",
|
|
234
|
+
:name => "post[created_at]" })
|
|
235
|
+
end
|
|
236
|
+
end
|
|
237
|
+
|
|
238
|
+
end
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
|
|
3
|
+
module ActiveAdmin
|
|
4
|
+
describe MenuItem do
|
|
5
|
+
|
|
6
|
+
it "should have a name" do
|
|
7
|
+
item = MenuItem.new("Dashboard", "/admin")
|
|
8
|
+
item.name.should == "Dashboard"
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
it "should have a url" do
|
|
12
|
+
item = MenuItem.new("Dashboard", "/admin")
|
|
13
|
+
item.url.should == "/admin"
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
it "should have a priority of 10 by default" do
|
|
17
|
+
item = MenuItem.new("Dashboard", "/admin")
|
|
18
|
+
item.priority.should == 10
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
it "should accept an optional options hash" do
|
|
22
|
+
item = MenuItem.new("Dashboard", "/admin", 10, :if => lambda{ logged_in? } )
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
it "should have a display if block" do
|
|
26
|
+
block = lambda{ logged_in? }
|
|
27
|
+
item = MenuItem.new("Dashboard", "/admin", 10, :if => block )
|
|
28
|
+
item.display_if_block.should == block
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
it "should have a default display if block always returning true" do
|
|
32
|
+
item = MenuItem.new("Dashboard", "/admin")
|
|
33
|
+
item.display_if_block.should be_instance_of(Proc)
|
|
34
|
+
item.display_if_block.call(self).should == true
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
describe "url generation and caching" do
|
|
38
|
+
it "should generate a url if it is a symbol" do
|
|
39
|
+
MenuItem.new("Posts", :admin_posts_path).url.should == "/admin/posts"
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
it "should generate a url if it is a string" do
|
|
43
|
+
MenuItem.new("Posts", "/admin/posts").url.should == "/admin/posts"
|
|
44
|
+
end
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
context "with no children" do
|
|
48
|
+
it "should be empty" do
|
|
49
|
+
item = MenuItem.new("Blog", "/admin/blog")
|
|
50
|
+
item.children.should == []
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
it "should accept new children" do
|
|
54
|
+
item = MenuItem.new("Blog", "/admin/blog")
|
|
55
|
+
item.add "Dashboard", "/admin"
|
|
56
|
+
item.children.first.should be_an_instance_of(MenuItem)
|
|
57
|
+
item.children.first.name.should == "Dashboard"
|
|
58
|
+
end
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
context "with many children" do
|
|
62
|
+
let(:item) do
|
|
63
|
+
i = MenuItem.new("Dashboard", "/admin")
|
|
64
|
+
i.add "Blog", "/"
|
|
65
|
+
i.add "Cars", "/"
|
|
66
|
+
i.add "Users", "/", 1
|
|
67
|
+
i.add "Settings", "/", 2
|
|
68
|
+
i.add "Analytics", "/", 44
|
|
69
|
+
i
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
it "should give access to the menu item as an array" do
|
|
73
|
+
item['Blog'].name.should == 'Blog'
|
|
74
|
+
end
|
|
75
|
+
|
|
76
|
+
it "should sort items based on priority and name" do
|
|
77
|
+
item.children[0].name.should == 'Users'
|
|
78
|
+
item.children[1].name.should == 'Settings'
|
|
79
|
+
item.children[2].name.should == 'Blog'
|
|
80
|
+
item.children[3].name.should == 'Cars'
|
|
81
|
+
item.children[4].name.should == 'Analytics'
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
it "children should hold a reference to their parent" do
|
|
85
|
+
item["Blog"].parent.should == item
|
|
86
|
+
end
|
|
87
|
+
end
|
|
88
|
+
|
|
89
|
+
describe "building children using block syntax" do
|
|
90
|
+
let(:item) do
|
|
91
|
+
MenuItem.new("Blog", "/") do |blog|
|
|
92
|
+
blog.add "Create New", "/blog/new"
|
|
93
|
+
blog.add("Comments", "/blog/comments") do |comments|
|
|
94
|
+
comments.add "Approved", "/blog/comments?status=approved"
|
|
95
|
+
end
|
|
96
|
+
end
|
|
97
|
+
end
|
|
98
|
+
|
|
99
|
+
it "should have 2 children" do
|
|
100
|
+
item.children.size.should == 2
|
|
101
|
+
end
|
|
102
|
+
|
|
103
|
+
it "should have sub-sub items" do
|
|
104
|
+
item["Comments"]["Approved"].name.should == 'Approved'
|
|
105
|
+
end
|
|
106
|
+
end
|
|
107
|
+
|
|
108
|
+
describe "accessing ancestory" do
|
|
109
|
+
let(:item){ MenuItem.new "Blog", "/blog" }
|
|
110
|
+
|
|
111
|
+
context "with no parent" do
|
|
112
|
+
it "should return an empty array" do
|
|
113
|
+
item.ancestors.should == []
|
|
114
|
+
end
|
|
115
|
+
end
|
|
116
|
+
|
|
117
|
+
context "with one parent" do
|
|
118
|
+
let(:sub_item) do
|
|
119
|
+
item.add "Create New", "/blog/new"
|
|
120
|
+
item["Create New"]
|
|
121
|
+
end
|
|
122
|
+
it "should return an array with the parent" do
|
|
123
|
+
sub_item.ancestors.should == [item]
|
|
124
|
+
end
|
|
125
|
+
end
|
|
126
|
+
|
|
127
|
+
context "with many parents" do
|
|
128
|
+
before(:each) do
|
|
129
|
+
item.add "C1", "/c1" do |c1|
|
|
130
|
+
c1.add "C2", "/c2" do |c2|
|
|
131
|
+
c2.add "C3", "/c3"
|
|
132
|
+
end
|
|
133
|
+
end
|
|
134
|
+
end
|
|
135
|
+
let(:sub_item){ item["C1"]["C2"]["C3"] }
|
|
136
|
+
it "should return an array with the parents in reverse order" do
|
|
137
|
+
sub_item.ancestors.should == [item["C1"]["C2"], item["C1"], item]
|
|
138
|
+
end
|
|
139
|
+
end
|
|
140
|
+
end # accessing ancestory
|
|
141
|
+
|
|
142
|
+
end
|
|
143
|
+
end
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
|
|
3
|
+
describe ActiveAdmin::Menu do
|
|
4
|
+
|
|
5
|
+
context "with no items" do
|
|
6
|
+
it "should be empty" do
|
|
7
|
+
ActiveAdmin::Menu.new.items.should == []
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
it "should accept new items" do
|
|
11
|
+
menu = ActiveAdmin::Menu.new
|
|
12
|
+
menu.add "Dashboard", "/admin"
|
|
13
|
+
menu.items.first.should be_an_instance_of(ActiveAdmin::MenuItem)
|
|
14
|
+
menu.items.first.name.should == "Dashboard"
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
it "should default new items to the priority of 10" do
|
|
18
|
+
menu = ActiveAdmin::Menu.new
|
|
19
|
+
menu.add "Dashboard", "/admin"
|
|
20
|
+
menu.items.first.priority.should == 10
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
context "with many item" do
|
|
25
|
+
let(:menu) do
|
|
26
|
+
ActiveAdmin::Menu.new do |m|
|
|
27
|
+
m.add "Dashboard", "/admin"
|
|
28
|
+
m.add "Blog", "/admin/blog"
|
|
29
|
+
m.add "Users", "/admin/users"
|
|
30
|
+
m.add "Settings", "/admin/settings" do |s|
|
|
31
|
+
s.add "Admin Settings", "/admin/settings/admin" do |as|
|
|
32
|
+
s.add "User Settings", "/admin/settings/users"
|
|
33
|
+
end
|
|
34
|
+
end
|
|
35
|
+
end
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
it "should give access to the menu item as an array" do
|
|
39
|
+
menu['Dashboard'].name.should == 'Dashboard'
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
it "should find the item by a url on the top level" do
|
|
43
|
+
menu.find_by_url("/admin").name.should == "Dashboard"
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
it "should find the item deep in the tree" do
|
|
47
|
+
menu.find_by_url("/admin/settings/users").name.should == "User Settings"
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
end
|
|
53
|
+
|
|
@@ -0,0 +1,203 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
|
|
3
|
+
describe ActiveAdmin::Namespace do
|
|
4
|
+
|
|
5
|
+
let(:application){ ActiveAdmin::Application.new }
|
|
6
|
+
|
|
7
|
+
context "when new" do
|
|
8
|
+
let(:namespace){ ActiveAdmin::Namespace.new(application, :admin) }
|
|
9
|
+
|
|
10
|
+
it "should have an application instance" do
|
|
11
|
+
namespace.application.should == application
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
it "should have a name" do
|
|
15
|
+
namespace.name.should == :admin
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
it "should have no resources" do
|
|
19
|
+
namespace.resources.should == {}
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
it "should have an empty menu" do
|
|
23
|
+
namespace.menu.items.should be_empty
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
describe "registering a resource" do
|
|
28
|
+
|
|
29
|
+
let(:namespace){ ActiveAdmin::Namespace.new(application, :admin) }
|
|
30
|
+
|
|
31
|
+
context "with no configuration" do
|
|
32
|
+
before do
|
|
33
|
+
namespace.register Category
|
|
34
|
+
end
|
|
35
|
+
it "should store the namespaced registered configuration" do
|
|
36
|
+
namespace.resources.keys.should include('Category')
|
|
37
|
+
end
|
|
38
|
+
it "should create a new controller in the default namespace" do
|
|
39
|
+
defined?(Admin::CategoriesController).should be_true
|
|
40
|
+
end
|
|
41
|
+
it "should create the dashboard controller" do
|
|
42
|
+
defined?(Admin::DashboardController).should be_true
|
|
43
|
+
end
|
|
44
|
+
it "should create a menu item" do
|
|
45
|
+
namespace.load_menu!
|
|
46
|
+
namespace.menu["Categories"].should be_an_instance_of(ActiveAdmin::MenuItem)
|
|
47
|
+
namespace.menu["Categories"].url.should == "/admin/categories"
|
|
48
|
+
end
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
context "with a block configuration" do
|
|
52
|
+
it "should be evaluated in the dsl" do
|
|
53
|
+
lambda {
|
|
54
|
+
namespace.register Category do
|
|
55
|
+
raise "Hello World"
|
|
56
|
+
end
|
|
57
|
+
}.should raise_error
|
|
58
|
+
end
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
context "with a resource that's namespaced" do
|
|
62
|
+
before do
|
|
63
|
+
module ::Mock; class Resource; def self.has_many(arg1, arg2); end; end; end
|
|
64
|
+
namespace.register Mock::Resource
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
it "should store the namespaced registered configuration" do
|
|
68
|
+
namespace.resources.keys.should include('MockResource')
|
|
69
|
+
end
|
|
70
|
+
it "should create a new controller in the default namespace" do
|
|
71
|
+
defined?(Admin::MockResourcesController).should be_true
|
|
72
|
+
end
|
|
73
|
+
it "should create a menu item" do
|
|
74
|
+
namespace.load_menu!
|
|
75
|
+
namespace.menu["Mock Resources"].should be_an_instance_of(ActiveAdmin::MenuItem)
|
|
76
|
+
end
|
|
77
|
+
it "should use the resource as the model in the controller" do
|
|
78
|
+
Admin::MockResourcesController.resource_class.should == Mock::Resource
|
|
79
|
+
end
|
|
80
|
+
end
|
|
81
|
+
|
|
82
|
+
describe "finding resource instances" do
|
|
83
|
+
let(:namespace){ ActiveAdmin::Namespace.new(application, :admin) }
|
|
84
|
+
context "when registered" do
|
|
85
|
+
before do
|
|
86
|
+
@post_resource = namespace.register Post
|
|
87
|
+
end
|
|
88
|
+
it "should return the resource instance" do
|
|
89
|
+
namespace.resource_for(Post).should == @post_resource
|
|
90
|
+
end
|
|
91
|
+
end
|
|
92
|
+
context "when not registered" do
|
|
93
|
+
it "should be nil" do
|
|
94
|
+
namespace.resource_for(Post).should == nil
|
|
95
|
+
end
|
|
96
|
+
end
|
|
97
|
+
end
|
|
98
|
+
|
|
99
|
+
describe "adding to the menu" do
|
|
100
|
+
|
|
101
|
+
describe "adding as a top level item" do
|
|
102
|
+
before do
|
|
103
|
+
namespace.register Category
|
|
104
|
+
namespace.load_menu!
|
|
105
|
+
end
|
|
106
|
+
it "should add a new menu item" do
|
|
107
|
+
namespace.menu['Categories'].should_not be_nil
|
|
108
|
+
end
|
|
109
|
+
end
|
|
110
|
+
|
|
111
|
+
describe "adding as a child" do
|
|
112
|
+
before do
|
|
113
|
+
namespace.register Category do
|
|
114
|
+
menu :parent => 'Blog'
|
|
115
|
+
end
|
|
116
|
+
namespace.load_menu!
|
|
117
|
+
end
|
|
118
|
+
it "should generate the parent menu item" do
|
|
119
|
+
namespace.menu['Blog'].should_not be_nil
|
|
120
|
+
end
|
|
121
|
+
it "should generate its own child item" do
|
|
122
|
+
namespace.menu['Blog']['Categories'].should_not be_nil
|
|
123
|
+
end
|
|
124
|
+
end
|
|
125
|
+
|
|
126
|
+
describe "disabling the menu" do
|
|
127
|
+
before do
|
|
128
|
+
namespace.register Category do
|
|
129
|
+
menu false
|
|
130
|
+
end
|
|
131
|
+
namespace.load_menu!
|
|
132
|
+
end
|
|
133
|
+
it "should not create a menu item" do
|
|
134
|
+
namespace.menu["Categories"].should be_nil
|
|
135
|
+
end
|
|
136
|
+
end
|
|
137
|
+
|
|
138
|
+
describe "setting menu priority" do
|
|
139
|
+
before do
|
|
140
|
+
namespace.register Category do
|
|
141
|
+
menu :priority => 2
|
|
142
|
+
end
|
|
143
|
+
namespace.load_menu!
|
|
144
|
+
end
|
|
145
|
+
it "should have a custom priority of 2" do
|
|
146
|
+
namespace.menu["Categories"].priority.should == 2
|
|
147
|
+
end
|
|
148
|
+
end
|
|
149
|
+
|
|
150
|
+
describe "setting a condition for displaying" do
|
|
151
|
+
before do
|
|
152
|
+
namespace.register Category do
|
|
153
|
+
menu :if => proc { false }
|
|
154
|
+
end
|
|
155
|
+
namespace.load_menu!
|
|
156
|
+
end
|
|
157
|
+
it "should have a proc returning false" do
|
|
158
|
+
namespace.menu["Categories"].display_if_block.should be_instance_of(Proc)
|
|
159
|
+
namespace.menu["Categories"].display_if_block.call.should == false
|
|
160
|
+
end
|
|
161
|
+
end
|
|
162
|
+
|
|
163
|
+
describe "adding as a belongs to" do
|
|
164
|
+
context "when not optional" do
|
|
165
|
+
before do
|
|
166
|
+
namespace.register Post do
|
|
167
|
+
belongs_to :author
|
|
168
|
+
end
|
|
169
|
+
end
|
|
170
|
+
it "should not show up in the menu" do
|
|
171
|
+
namespace.menu["Posts"].should be_nil
|
|
172
|
+
end
|
|
173
|
+
end
|
|
174
|
+
context "when optional" do
|
|
175
|
+
before do
|
|
176
|
+
namespace.register Post do
|
|
177
|
+
belongs_to :author, :optional => true
|
|
178
|
+
end
|
|
179
|
+
end
|
|
180
|
+
it "should show up in the menu" do
|
|
181
|
+
namespace.menu["Posts"].should_not be_nil
|
|
182
|
+
end
|
|
183
|
+
end
|
|
184
|
+
end
|
|
185
|
+
end
|
|
186
|
+
|
|
187
|
+
describe "dashboard controller name" do
|
|
188
|
+
context "when namespaced" do
|
|
189
|
+
it "should be namespaced" do
|
|
190
|
+
namespace = ActiveAdmin::Namespace.new(application, :admin)
|
|
191
|
+
namespace.dashboard_controller_name.should == "Admin::DashboardController"
|
|
192
|
+
end
|
|
193
|
+
end
|
|
194
|
+
context "when not namespaced" do
|
|
195
|
+
it "should not be namespaced" do
|
|
196
|
+
namespace = ActiveAdmin::Namespace.new(application, :root)
|
|
197
|
+
namespace.dashboard_controller_name.should == "DashboardController"
|
|
198
|
+
end
|
|
199
|
+
end
|
|
200
|
+
end
|
|
201
|
+
|
|
202
|
+
end
|
|
203
|
+
end
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
|
|
3
|
+
describe "#pretty_format" do
|
|
4
|
+
include ActiveAdmin::ViewHelpers::DisplayHelper
|
|
5
|
+
|
|
6
|
+
context "when a String is passed in" do
|
|
7
|
+
it "should return the String passed in" do
|
|
8
|
+
pretty_format("hello").should == "hello"
|
|
9
|
+
end
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
context "when a Date or a Time is passed in" do
|
|
13
|
+
it "should return a localized Date or Time with long format" do
|
|
14
|
+
t = Time.now
|
|
15
|
+
self.should_receive(:localize).with(t, {:format => :long}) { "Just Now!" }
|
|
16
|
+
pretty_format(t).should == "Just Now!"
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
context "when an ActiveRecord object is passed in" do
|
|
21
|
+
it "should delegate to auto_link" do
|
|
22
|
+
post = Post.new
|
|
23
|
+
self.should_receive(:auto_link).with(post) { "model name" }
|
|
24
|
+
pretty_format(post).should == "model name"
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
context "when something else is passed in" do
|
|
29
|
+
it "should delegate to display_name" do
|
|
30
|
+
something = Class.new.new
|
|
31
|
+
self.should_receive(:display_name).with(something) { "I'm not famous" }
|
|
32
|
+
pretty_format(something).should == "I'm not famous"
|
|
33
|
+
end
|
|
34
|
+
end
|
|
35
|
+
end
|