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.

Files changed (255) hide show
  1. data/CHANGELOG.rdoc +15 -1
  2. data/Gemfile +41 -11
  3. data/LICENSE +5 -0
  4. data/README.rdoc +202 -87
  5. data/Rakefile +51 -15
  6. data/activeadmin.gemspec +310 -131
  7. data/cucumber.yml +1 -0
  8. data/features/comments/commenting.feature +81 -0
  9. data/features/comments/viewing_index.feature +19 -0
  10. data/features/edit_page.feature +77 -0
  11. data/features/first_boot.feature +16 -0
  12. data/features/global_navigation.feature +30 -0
  13. data/features/index/formats.feature +10 -0
  14. data/features/index/index_as_block.feature +15 -0
  15. data/features/index/index_as_blog.feature +50 -0
  16. data/features/index/index_as_grid.feature +45 -0
  17. data/features/index/index_as_table.feature +79 -0
  18. data/features/index/index_scopes.feature +52 -0
  19. data/features/index/pagination.feature +23 -0
  20. data/features/new_page.feature +75 -0
  21. data/features/registering_assets.feature +35 -0
  22. data/features/registering_resources.feature +33 -0
  23. data/features/show/default_content.feature +43 -0
  24. data/features/show/page_title.feature +33 -0
  25. data/features/sidebar_sections.feature +128 -0
  26. data/features/specifying_actions.feature +16 -0
  27. data/features/step_definitions/action_item_steps.rb +7 -0
  28. data/features/step_definitions/additional_web_steps.rb +67 -0
  29. data/features/step_definitions/asset_steps.rb +7 -0
  30. data/features/step_definitions/attribute_steps.rb +15 -0
  31. data/features/step_definitions/comment_steps.rb +8 -0
  32. data/features/step_definitions/configuration_steps.rb +31 -0
  33. data/features/step_definitions/factory_steps.rb +28 -0
  34. data/features/step_definitions/flash_steps.rb +3 -0
  35. data/features/step_definitions/format_steps.rb +7 -0
  36. data/features/step_definitions/index_scope_steps.rb +20 -0
  37. data/features/step_definitions/pagination_steps.rb +8 -0
  38. data/features/step_definitions/sidebar_steps.rb +11 -0
  39. data/features/step_definitions/tab_steps.rb +3 -0
  40. data/features/step_definitions/user_steps.rb +20 -0
  41. data/features/step_definitions/web_steps.rb +219 -0
  42. data/features/support/env.rb +88 -0
  43. data/features/support/paths.rb +48 -0
  44. data/features/users/logging_in.feature +34 -0
  45. data/features/users/logging_out.feature +13 -0
  46. data/lib/active_admin.rb +155 -79
  47. data/lib/active_admin/abstract_view_factory.rb +95 -0
  48. data/lib/active_admin/action_items.rb +4 -15
  49. data/lib/active_admin/arbre.rb +23 -0
  50. data/lib/active_admin/arbre/attributes.rb +20 -0
  51. data/lib/active_admin/arbre/class_list.rb +28 -0
  52. data/lib/active_admin/arbre/collection.rb +27 -0
  53. data/lib/active_admin/arbre/context.rb +8 -0
  54. data/lib/active_admin/arbre/core_extensions.rb +5 -0
  55. data/lib/active_admin/arbre/document.rb +42 -0
  56. data/lib/active_admin/arbre/element.rb +151 -0
  57. data/lib/active_admin/arbre/html.rb +84 -0
  58. data/lib/active_admin/arbre/html5_elements.rb +47 -0
  59. data/lib/active_admin/arbre/tag.rb +129 -0
  60. data/lib/active_admin/arbre/text_node.rb +35 -0
  61. data/lib/active_admin/callbacks.rb +87 -0
  62. data/lib/active_admin/comments.rb +73 -0
  63. data/lib/active_admin/comments/comment.rb +15 -0
  64. data/lib/active_admin/comments/configuration.rb +16 -0
  65. data/lib/active_admin/comments/namespace_helper.rb +14 -0
  66. data/lib/active_admin/comments/resource_helper.rb +17 -0
  67. data/lib/active_admin/comments/show_page_helper.rb +23 -0
  68. data/lib/active_admin/comments/views.rb +3 -0
  69. data/lib/active_admin/comments/views/active_admin_comment.rb +0 -0
  70. data/lib/active_admin/comments/views/active_admin_comments.rb +82 -0
  71. data/lib/active_admin/component.rb +22 -0
  72. data/lib/active_admin/controller_action.rb +12 -0
  73. data/lib/active_admin/dashboards.rb +0 -2
  74. data/lib/active_admin/dashboards/dashboard_controller.rb +10 -5
  75. data/lib/active_admin/dashboards/section.rb +5 -14
  76. data/lib/active_admin/devise.rb +43 -0
  77. data/lib/active_admin/dsl.rb +202 -0
  78. data/lib/active_admin/event.rb +31 -0
  79. data/lib/active_admin/form_builder.rb +68 -50
  80. data/lib/active_admin/iconic.rb +51 -0
  81. data/lib/active_admin/iconic/icons.rb +142 -0
  82. data/lib/active_admin/namespace.rb +102 -16
  83. data/lib/active_admin/renderer.rb +18 -3
  84. data/lib/active_admin/resource.rb +110 -9
  85. data/lib/active_admin/resource/belongs_to.rb +31 -0
  86. data/lib/active_admin/resource_controller.rb +45 -260
  87. data/lib/active_admin/resource_controller/action_builder.rb +21 -0
  88. data/lib/active_admin/resource_controller/actions.rb +53 -0
  89. data/lib/active_admin/resource_controller/callbacks.rb +47 -0
  90. data/lib/active_admin/resource_controller/collection.rb +142 -0
  91. data/lib/active_admin/resource_controller/filters.rb +58 -0
  92. data/lib/active_admin/resource_controller/form.rb +42 -0
  93. data/lib/active_admin/resource_controller/menu.rb +29 -0
  94. data/lib/active_admin/resource_controller/page_configurations.rb +53 -0
  95. data/lib/active_admin/resource_controller/scoping.rb +36 -0
  96. data/lib/active_admin/resource_controller/sidebars.rb +38 -0
  97. data/lib/active_admin/scope.rb +17 -0
  98. data/lib/active_admin/sidebar.rb +8 -47
  99. data/lib/active_admin/stylesheets/active_admin.scss +418 -0
  100. data/lib/active_admin/stylesheets/active_admin/_comments.scss +40 -0
  101. data/lib/active_admin/stylesheets/active_admin/_flash_messages.scss +13 -0
  102. data/lib/active_admin/stylesheets/active_admin/_forms.scss +168 -0
  103. data/lib/active_admin/stylesheets/active_admin/_header.scss +108 -0
  104. data/lib/active_admin/stylesheets/active_admin/_typography.scss +100 -0
  105. data/lib/active_admin/stylesheets/active_admin/mixins/_all.scss +8 -0
  106. data/lib/active_admin/stylesheets/active_admin/mixins/_buttons.scss +27 -0
  107. data/lib/active_admin/stylesheets/active_admin/mixins/_gradients.scss +21 -0
  108. data/lib/active_admin/stylesheets/active_admin/mixins/_icons.scss +20 -0
  109. data/lib/active_admin/stylesheets/active_admin/mixins/_reset.scss +165 -0
  110. data/lib/active_admin/stylesheets/active_admin/mixins/_rounded.scss +43 -0
  111. data/lib/active_admin/stylesheets/active_admin/mixins/_sections.scss +27 -0
  112. data/lib/active_admin/stylesheets/active_admin/mixins/_shadows.scss +21 -0
  113. data/lib/active_admin/stylesheets/active_admin/mixins/_variables.scss +12 -0
  114. data/lib/active_admin/version.rb +1 -1
  115. data/lib/active_admin/view_factory.rb +21 -0
  116. data/lib/active_admin/view_helpers.rb +17 -100
  117. data/lib/active_admin/view_helpers/assigns_with_indifferent_access_helper.rb +7 -0
  118. data/lib/active_admin/view_helpers/auto_link_helper.rb +41 -0
  119. data/lib/active_admin/view_helpers/breadcrumb_helper.rb +29 -0
  120. data/lib/active_admin/view_helpers/display_helper.rb +38 -0
  121. data/lib/active_admin/view_helpers/filter_form_helper.rb +174 -0
  122. data/lib/active_admin/view_helpers/form_helper.rb +12 -0
  123. data/lib/active_admin/view_helpers/icon_helper.rb +12 -0
  124. data/lib/active_admin/view_helpers/method_or_proc_helper.rb +26 -0
  125. data/lib/active_admin/view_helpers/renderer_helper.rb +29 -0
  126. data/lib/active_admin/view_helpers/sidebar_helper.rb +15 -0
  127. data/lib/active_admin/view_helpers/status_tag_helper.rb +13 -0
  128. data/lib/active_admin/view_helpers/table_helper.rb +12 -0
  129. data/lib/active_admin/view_helpers/title_helper.rb +11 -0
  130. data/lib/active_admin/view_helpers/view_factory_helper.rb +11 -0
  131. data/lib/active_admin/views.rb +8 -0
  132. data/lib/active_admin/views/action_items.rb +17 -0
  133. data/lib/active_admin/views/components/attributes_table.rb +66 -0
  134. data/lib/active_admin/views/components/columns.rb +49 -0
  135. data/lib/active_admin/views/components/paginated_collection.rb +74 -0
  136. data/lib/active_admin/views/components/panel.rb +26 -0
  137. data/lib/active_admin/views/components/scopes.rb +64 -0
  138. data/lib/active_admin/views/components/sidebar_section.rb +30 -0
  139. data/lib/active_admin/views/components/table_for.rb +174 -0
  140. data/lib/active_admin/views/dashboard_section_renderer.rb +19 -0
  141. data/lib/active_admin/views/header_renderer.rb +37 -0
  142. data/lib/active_admin/views/index_as_block.rb +24 -0
  143. data/lib/active_admin/views/index_as_blog.rb +89 -0
  144. data/lib/active_admin/views/index_as_grid.rb +49 -0
  145. data/lib/active_admin/views/index_as_table.rb +73 -0
  146. data/lib/active_admin/views/pages/base.rb +138 -0
  147. data/lib/active_admin/views/pages/dashboard.rb +61 -0
  148. data/lib/active_admin/views/pages/edit.rb +27 -0
  149. data/lib/active_admin/views/pages/index.rb +64 -0
  150. data/lib/active_admin/views/pages/new.rb +27 -0
  151. data/lib/active_admin/views/pages/show.rb +56 -0
  152. data/lib/active_admin/views/tabs_renderer.rb +52 -0
  153. data/lib/active_admin/views/templates/active_admin/devise/mailer/reset_password_instructions.html.erb +8 -0
  154. data/lib/active_admin/views/templates/active_admin/devise/mailer/unlock_instructions.html.erb +7 -0
  155. data/lib/active_admin/views/templates/active_admin/devise/passwords/edit.html.erb +16 -0
  156. data/lib/active_admin/views/templates/active_admin/devise/passwords/new.html.erb +14 -0
  157. data/lib/active_admin/views/templates/active_admin/devise/sessions/new.html.erb +18 -0
  158. data/lib/active_admin/views/templates/active_admin/devise/shared/_links.erb +20 -0
  159. data/lib/active_admin/views/templates/active_admin/devise/unlocks/new.html.erb +12 -0
  160. data/lib/active_admin/views/templates/active_admin_dashboard/index.html.arb +1 -0
  161. data/lib/active_admin/views/templates/active_admin_default/edit.html.arb +1 -0
  162. data/lib/active_admin/views/{active_admin_default → templates/active_admin_default}/index.csv.erb +0 -0
  163. data/lib/active_admin/views/templates/active_admin_default/index.html.arb +1 -0
  164. data/lib/active_admin/views/templates/active_admin_default/new.html.arb +1 -0
  165. data/lib/active_admin/views/templates/active_admin_default/show.html.arb +1 -0
  166. data/lib/active_admin/views/{layouts → templates/layouts}/active_admin.html.erb +3 -4
  167. data/lib/active_admin/views/templates/layouts/active_admin_logged_out.html.erb +31 -0
  168. data/lib/generators/active_admin/devise/devise_generator.rb +45 -0
  169. data/lib/generators/active_admin/install/install_generator.rb +18 -3
  170. data/lib/generators/active_admin/install/templates/active_admin.js +41 -0
  171. data/lib/generators/active_admin/install/templates/{active_admin.rb → active_admin.rb.erb} +33 -3
  172. data/lib/generators/active_admin/install/templates/active_admin_vendor.js +1 -1
  173. data/lib/generators/active_admin/install/templates/dashboards.rb +3 -4
  174. data/lib/generators/active_admin/install/templates/images/admin_notes_icon.png +0 -0
  175. data/lib/generators/active_admin/install/templates/images/loading.gif +0 -0
  176. data/lib/generators/active_admin/install/templates/images/nested_menu_arrow.gif +0 -0
  177. data/lib/generators/active_admin/install/templates/images/nested_menu_arrow_dark.gif +0 -0
  178. data/lib/generators/active_admin/install/templates/images/orderable.png +0 -0
  179. data/lib/generators/active_admin/install/templates/migrations/1_create_admin_notes.rb +16 -0
  180. data/lib/generators/active_admin/install/templates/migrations/2_move_admin_notes_to_comments.rb +25 -0
  181. data/spec/integration/belongs_to_spec.rb +42 -0
  182. data/spec/integration/index_as_table_spec.rb +0 -119
  183. data/spec/integration/layout_spec.rb +3 -37
  184. data/spec/spec_helper.rb +89 -50
  185. data/spec/support/integration_example_group.rb +37 -0
  186. data/spec/support/rails_template.rb +21 -9
  187. data/spec/support/rails_template_with_data.rb +32 -0
  188. data/spec/support/templates/cucumber.rb +28 -0
  189. data/spec/unit/abstract_view_factory_spec.rb +79 -0
  190. data/spec/unit/action_builder_spec.rb +19 -7
  191. data/spec/unit/action_items_spec.rb +16 -30
  192. data/spec/unit/active_admin_spec.rb +10 -22
  193. data/spec/unit/arbre/html/element_finder_methods_spec.rb +54 -0
  194. data/spec/unit/arbre/html/element_spec.rb +224 -0
  195. data/spec/unit/arbre/html/tag_attributes_spec.rb +61 -0
  196. data/spec/unit/arbre/html/tag_spec.rb +63 -0
  197. data/spec/unit/arbre/html_spec.rb +185 -0
  198. data/spec/unit/auto_link_spec.rb +38 -0
  199. data/spec/unit/belongs_to_spec.rb +44 -0
  200. data/spec/unit/breadcrumbs_spec.rb +110 -0
  201. data/spec/unit/comments_spec.rb +53 -0
  202. data/spec/unit/component_spec.rb +18 -0
  203. data/spec/unit/components/attributes_table_spec.rb +100 -0
  204. data/spec/unit/components/columns_spec.rb +75 -0
  205. data/spec/unit/components/panel_spec.rb +31 -0
  206. data/spec/unit/components/sidebar_section_spec.rb +37 -0
  207. data/spec/unit/components/table_for_spec.rb +130 -0
  208. data/spec/unit/dashboard_controller_spec.rb +26 -0
  209. data/spec/unit/dashboard_section_spec.rb +10 -17
  210. data/spec/unit/display_name_spec.rb +29 -0
  211. data/spec/unit/event_spec.rb +41 -0
  212. data/spec/unit/filter_form_builder_spec.rb +99 -77
  213. data/spec/unit/form_builder_spec.rb +69 -69
  214. data/spec/unit/namespace_spec.rb +61 -3
  215. data/spec/unit/pretty_format_spec.rb +35 -0
  216. data/spec/unit/registration_spec.rb +40 -1
  217. data/spec/unit/renderer_spec.rb +8 -0
  218. data/spec/unit/resource_controller_spec.rb +105 -6
  219. data/spec/unit/resource_spec.rb +78 -11
  220. data/spec/unit/routing_spec.rb +82 -6
  221. data/spec/unit/scope_spec.rb +31 -0
  222. data/spec/unit/tabs_renderer_spec.rb +24 -2
  223. data/spec/unit/view_factory_spec.rb +16 -0
  224. metadata +268 -82
  225. data/.gitignore +0 -25
  226. data/active_admin.gemspec +0 -22
  227. data/lib/active_admin/action_builder.rb +0 -60
  228. data/lib/active_admin/breadcrumbs.rb +0 -26
  229. data/lib/active_admin/dashboards/renderer.rb +0 -45
  230. data/lib/active_admin/dashboards/section_renderer.rb +0 -28
  231. data/lib/active_admin/filters.rb +0 -189
  232. data/lib/active_admin/pages.rb +0 -11
  233. data/lib/active_admin/pages/base.rb +0 -92
  234. data/lib/active_admin/pages/edit.rb +0 -21
  235. data/lib/active_admin/pages/index.rb +0 -58
  236. data/lib/active_admin/pages/index/blog.rb +0 -65
  237. data/lib/active_admin/pages/index/table.rb +0 -48
  238. data/lib/active_admin/pages/index/thumbnails.rb +0 -40
  239. data/lib/active_admin/pages/new.rb +0 -21
  240. data/lib/active_admin/pages/show.rb +0 -54
  241. data/lib/active_admin/table_builder.rb +0 -162
  242. data/lib/active_admin/tabs_renderer.rb +0 -39
  243. data/lib/active_admin/views/active_admin_dashboard/index.html.erb +0 -1
  244. data/lib/active_admin/views/active_admin_default/edit.html.erb +0 -1
  245. data/lib/active_admin/views/active_admin_default/index.html.erb +0 -1
  246. data/lib/active_admin/views/active_admin_default/new.html.erb +0 -1
  247. data/lib/active_admin/views/active_admin_default/show.html.erb +0 -1
  248. data/lib/generators/active_admin/install/templates/active_admin.css +0 -325
  249. data/lib/generators/active_admin/install/templates/images/orderable.gif +0 -0
  250. data/spec/integration/index_as_blog_spec.rb +0 -65
  251. data/spec/integration/index_as_thumbnails_spec.rb +0 -43
  252. data/spec/integration/new_view_spec.rb +0 -52
  253. data/spec/integration/show_view_spec.rb +0 -91
  254. data/spec/unit/sidebar_spec.rb +0 -96
  255. data/spec/unit/table_builder_spec.rb +0 -162
@@ -0,0 +1,48 @@
1
+ module NavigationHelpers
2
+ # Maps a name to a path. Used by the
3
+ #
4
+ # When /^I go to (.+)$/ do |page_name|
5
+ #
6
+ # step definition in web_steps.rb
7
+ #
8
+ def path_to(page_name)
9
+ case page_name
10
+
11
+ when /the home\s?page/
12
+ '/'
13
+ when /the dashboard/
14
+ "/admin"
15
+
16
+ # the index page for posts in the root namespace
17
+ # the index page for posts in the user_admin namespace
18
+ when /^the index page for (.*) in the (.*) namespace$/
19
+ if $2 != 'root'
20
+ send(:"#{$2}_#{$1}_path")
21
+ else
22
+ send(:"#{$1}_path")
23
+ end
24
+
25
+ # same as above, except defaults to admin namespace
26
+ when /^the index page for (.*)$/
27
+ send(:"admin_#{$1}_path")
28
+
29
+ # Add more mappings here.
30
+ # Here is an example that pulls values out of the Regexp:
31
+ #
32
+ # when /^(.*)'s profile page$/i
33
+ # user_profile_path(User.find_by_login($1))
34
+
35
+ else
36
+ begin
37
+ page_name =~ /the (.*) page/
38
+ path_components = $1.split(/\s+/)
39
+ self.send(path_components.push('path').join('_').to_sym)
40
+ rescue Object => e
41
+ raise "Can't find mapping from \"#{page_name}\" to a path.\n" +
42
+ "Now, go and add a mapping in #{__FILE__}"
43
+ end
44
+ end
45
+ end
46
+ end
47
+
48
+ World(NavigationHelpers)
@@ -0,0 +1,34 @@
1
+ Feature: User Logging In
2
+
3
+ Logging in to the system as an admin user
4
+
5
+ Background:
6
+ Given a configuration of:
7
+ """
8
+ ActiveAdmin.register Post
9
+ """
10
+ And I am logged out
11
+ And an admin user "admin@example.com" exists
12
+ When I go to the dashboard
13
+
14
+ Scenario: Logging in Successfully
15
+ When I fill in "Email" with "admin@example.com"
16
+ And I fill in "Password" with "password"
17
+ And I press "Login"
18
+ Then I should be on the the dashboard
19
+ And I should see "Logout"
20
+ And I should see "admin@example.com"
21
+
22
+ Scenario: Attempting to log in with an incorrent email address
23
+ When I fill in "Email" with "not-an-admin@example.com"
24
+ And I fill in "Password" with "not-my-password"
25
+ And I press "Login"
26
+ Then I should see "Login"
27
+ And I should see "Invalid email or password."
28
+
29
+ Scenario: Attempting to log in with an incorrect password
30
+ When I fill in "Email" with "admin@example.com"
31
+ And I fill in "Password" with "not-my-password"
32
+ And I press "Login"
33
+ Then I should see "Login"
34
+ And I should see "Invalid email or password."
@@ -0,0 +1,13 @@
1
+ Feature: User Logging out
2
+
3
+ Logging out of the system as an admin user
4
+
5
+ Scenario: Logging out successfully
6
+ Given a configuration of:
7
+ """
8
+ ActiveAdmin.register Post
9
+ """
10
+ And I am logged in
11
+ When I go to the dashboard
12
+ And I follow "Logout"
13
+ Then I should see "Login"
@@ -1,77 +1,105 @@
1
1
  require 'meta_search'
2
+ require 'devise'
3
+ require 'will_paginate'
4
+ require 'sass'
5
+ require 'active_admin/arbre'
2
6
 
3
7
  module ActiveAdmin
4
-
5
- autoload :VERSION, 'active_admin/version'
6
- autoload :Namespace, 'active_admin/namespace'
7
- autoload :Resource, 'active_admin/resource'
8
- autoload :ResourceController, 'active_admin/resource_controller'
9
- autoload :Dashboards, 'active_admin/dashboards'
10
- autoload :Renderer, 'active_admin/renderer'
11
- autoload :TableBuilder, 'active_admin/table_builder'
12
- autoload :FormBuilder, 'active_admin/form_builder'
13
- autoload :TabsRenderer, 'active_admin/tabs_renderer'
14
- autoload :ViewHelpers, 'active_admin/view_helpers'
15
- autoload :Breadcrumbs, 'active_admin/breadcrumbs'
16
- autoload :Filters, 'active_admin/filters'
17
- autoload :PageConfig, 'active_admin/page_config'
18
- autoload :Pages, 'active_admin/pages'
19
- autoload :Sidebar, 'active_admin/sidebar'
20
- autoload :ActionItems, 'active_admin/action_items'
21
- autoload :AssetRegistration, 'active_admin/asset_registration'
22
- autoload :Menu, 'active_admin/menu'
23
- autoload :MenuItem, 'active_admin/menu_item'
24
- autoload :ActionBuilder, 'active_admin/action_builder'
25
8
 
26
- extend AssetRegistration
27
-
28
- # The default namespace to put controllers and routes inside. Set this
29
- # in config/initializers/active_admin.rb using:
30
- #
31
- # ActiveAdmin.default_namespace = :super_admin
32
- #
33
- @@default_namespace = :admin
34
- mattr_accessor :default_namespace
35
-
36
- # The default number of resources to display on index pages
37
- @@default_per_page = 30
38
- mattr_accessor :default_per_page
39
-
40
- # The default sort order for index pages
41
- @@default_sort_order = 'id_desc'
42
- mattr_accessor :default_sort_order
43
-
44
- # A hash of all the registered namespaces
45
- @@namespaces = {}
46
- mattr_accessor :namespaces
47
-
48
- # The title which get's displayed in the main layout
49
- @@site_title = ""
50
- mattr_accessor :site_title
51
-
52
- # Load paths for admin configurations. Add folders to this load path
53
- # to load up other resources for administration. External gems can
54
- # include thier paths in this load path to provide active_admin UIs
55
- @@load_paths = [File.expand_path('app/admin', Rails.root)]
56
- mattr_accessor :load_paths
57
-
58
- # Stores if everything has been loaded or we need to reload
59
- @@loaded = false
9
+ autoload :VERSION, 'active_admin/version'
10
+ autoload :ActionItems, 'active_admin/action_items'
11
+ autoload :AssetRegistration, 'active_admin/asset_registration'
12
+ autoload :Breadcrumbs, 'active_admin/breadcrumbs'
13
+ autoload :Callbacks, 'active_admin/callbacks'
14
+ autoload :Component, 'active_admin/component'
15
+ autoload :ControllerAction, 'active_admin/controller_action'
16
+ autoload :Dashboards, 'active_admin/dashboards'
17
+ autoload :Devise, 'active_admin/devise'
18
+ autoload :DSL, 'active_admin/dsl'
19
+ autoload :Event, 'active_admin/event'
20
+ autoload :FormBuilder, 'active_admin/form_builder'
21
+ autoload :Iconic, 'active_admin/iconic'
22
+ autoload :Menu, 'active_admin/menu'
23
+ autoload :MenuItem, 'active_admin/menu_item'
24
+ autoload :Namespace, 'active_admin/namespace'
25
+ autoload :PageConfig, 'active_admin/page_config'
26
+ autoload :Resource, 'active_admin/resource'
27
+ autoload :ResourceController, 'active_admin/resource_controller'
28
+ autoload :Renderer, 'active_admin/renderer'
29
+ autoload :Scope, 'active_admin/scope'
30
+ autoload :Sidebar, 'active_admin/sidebar'
31
+ autoload :TableBuilder, 'active_admin/table_builder'
32
+ autoload :ViewFactory, 'active_admin/view_factory'
33
+ autoload :ViewHelpers, 'active_admin/view_helpers'
34
+ autoload :Views, 'active_admin/views'
35
+
36
+ module Configuration
37
+
38
+ # The default namespace to put controllers and routes inside. Set this
39
+ # in config/initializers/active_admin.rb using:
40
+ #
41
+ # config.default_namespace = :super_admin
42
+ #
43
+ @@default_namespace = :admin
44
+ mattr_accessor :default_namespace
45
+
46
+ # The default number of resources to display on index pages
47
+ @@default_per_page = 30
48
+ mattr_accessor :default_per_page
49
+
50
+ # The default sort order for index pages
51
+ @@default_sort_order = 'id_desc'
52
+ mattr_accessor :default_sort_order
53
+
54
+ # A hash of all the registered namespaces
55
+ @@namespaces = {}
56
+ mattr_accessor :namespaces
57
+
58
+ # The title which get's displayed in the main layout
59
+ @@site_title = ""
60
+ mattr_accessor :site_title
61
+
62
+ # Load paths for admin configurations. Add folders to this load path
63
+ # to load up other resources for administration. External gems can
64
+ # include thier paths in this load path to provide active_admin UIs
65
+ @@load_paths = [File.expand_path('app/admin', Rails.root)]
66
+ mattr_accessor :load_paths
67
+
68
+ # The view factory to use to generate all the view classes. Take
69
+ # a look at ActiveAdmin::ViewFactory
70
+ @@view_factory = ActiveAdmin::ViewFactory.new
71
+ mattr_accessor :view_factory
72
+
73
+ # Whether or not to use admin comments
74
+ @@admin_notes = true
75
+ mattr_accessor :admin_notes
76
+
77
+ # The method to call in controllers to get the current user
78
+ @@current_user_method = :current_admin_user
79
+ mattr_accessor :current_user_method
80
+
81
+ # The method to call in the controllers to ensure that there
82
+ # is a currently authenticated admin user
83
+ @@authentication_method = :authenticate_admin_user!
84
+ mattr_accessor :authentication_method
85
+
86
+ # Active Admin makes educated guesses when displaying objects, this is
87
+ # the list of methods its tries calling in order
88
+ @@display_name_methods = [:display_name, :full_name, :name, :username, :login, :title, :email, :to_s]
89
+ mattr_accessor :display_name_methods
60
90
 
61
- # A hash containing a menu for each of our namespaces
62
- @@menus = {}
63
- mattr_accessor :menus
91
+ end
64
92
 
65
- # The class to use to render the tabs in the interface
66
- @@tabs_renderer = ActiveAdmin::TabsRenderer
67
- mattr_accessor :tabs_renderer
93
+ extend Configuration
94
+ extend AssetRegistration
68
95
 
69
96
  class << self
70
97
 
98
+
71
99
  # Get's called within the initializer
72
100
  def setup
73
101
  # Register the default assets
74
- register_stylesheet 'active_admin.css'
102
+ register_stylesheet 'admin/active_admin.css'
75
103
  register_javascript 'active_admin_vendor.js'
76
104
  register_javascript 'active_admin.js'
77
105
 
@@ -80,6 +108,9 @@ module ActiveAdmin
80
108
  # If not, file nameing becomes very important and can cause clashes.
81
109
  ActiveSupport::Dependencies.autoload_paths.reject!{|path| load_paths.include?(path) }
82
110
 
111
+ # Add the Active Admin view path to the rails view path
112
+ ActionController::Base.append_view_path File.expand_path('../active_admin/views/templates', __FILE__)
113
+
83
114
  # Don't eagerload our configs, we'll deal with them ourselves
84
115
  Rails.application.config.eager_load_paths = Rails.application.config.eager_load_paths.reject do |path|
85
116
  load_paths.include?(path)
@@ -89,23 +120,36 @@ module ActiveAdmin
89
120
  # and on every require in development mode
90
121
  ActionDispatch::Callbacks.to_prepare :active_admin do
91
122
  ActiveAdmin.unload!
92
- # Because every time we load, the routes may have changed
93
- # we must ensure to load the routes each request (in dev)
94
123
  Rails.application.reload_routes!
95
124
  end
96
125
 
97
126
  yield self
127
+
128
+ # Setup SASS
129
+ require 'sass/plugin' # This must be required after initialization
130
+ Sass::Plugin.add_template_location(File.expand_path("../active_admin/stylesheets/", __FILE__), File.join(Rails.root, "public/stylesheets/admin"))
98
131
  end
99
132
 
100
133
  # Registers a brand new configuration for the given resource.
101
- #
102
- # TODO: Setup docs for registration options
103
134
  def register(resource, options = {}, &block)
104
135
  namespace_name = options[:namespace] == false ? :root : (options[:namespace] || default_namespace)
105
- namespace = namespaces[namespace_name] ||= Namespace.new(namespace_name)
136
+ namespace = find_or_create_namespace(namespace_name)
106
137
  namespace.register(resource, options, &block)
107
138
  end
108
139
 
140
+ # Creates a namespace for the given name
141
+ def find_or_create_namespace(name)
142
+ return namespaces[name] if namespaces[name]
143
+ namespace = Namespace.new(name)
144
+ ActiveAdmin::Event.dispatch ActiveAdmin::Namespace::RegisterEvent, namespace
145
+ namespaces[name] = namespace
146
+ namespace
147
+ end
148
+
149
+
150
+ # Stores if everything has been loaded or we need to reload
151
+ @@loaded = false
152
+
109
153
  # Returns true if all the configuration files have been loaded.
110
154
  def loaded?
111
155
  @@loaded
@@ -118,6 +162,7 @@ module ActiveAdmin
118
162
  # to allow for changes without having to restart the server.
119
163
  def unload!
120
164
  namespaces.values.each{|namespace| namespace.unload! }
165
+ self.namespaces = {}
121
166
  @@loaded = false
122
167
  end
123
168
 
@@ -129,14 +174,21 @@ module ActiveAdmin
129
174
  # and they aren't marked for re-loading. To mark the files for re-loading
130
175
  # you must first call ActiveAdmin.unload!
131
176
  def load!
132
- unless loaded?
133
- load_paths.flatten.compact.uniq.each do |path|
134
- Dir["#{path}/*.rb"].each{|f| load f }
135
- end
136
- @@loaded = true
137
- return true
177
+ # No work to do if we've already loaded
178
+ return false if loaded?
179
+
180
+ # Load files
181
+ load_paths.flatten.compact.uniq.each do |path|
182
+ Dir["#{path}/*.rb"].each{|f| load f }
138
183
  end
139
- false
184
+
185
+ # If no configurations, let's make sure you can still login
186
+ load_default_namespace if namespaces.values.empty?
187
+
188
+ # Load Menus
189
+ namespaces.values.each{|namespace| namespace.load_menu! }
190
+
191
+ @@loaded = true
140
192
  end
141
193
 
142
194
  # Creates all the necessary routes for the ActiveAdmin configurations
@@ -190,17 +242,39 @@ module ActiveAdmin
190
242
  end
191
243
  end
192
244
 
193
- if config.namespace.root?
194
- instance_eval(&route_definition_block)
195
- else
196
- namespace config.namespace.name do
197
- instance_eval(&route_definition_block)
245
+ # Add in the parent if it exists
246
+ if config.belongs_to?
247
+ routes_for_belongs_to = route_definition_block.dup
248
+ route_definition_block = Proc.new do
249
+ # If its optional, make the normal resource routes
250
+ instance_eval &routes_for_belongs_to if config.belongs_to_config.optional?
251
+
252
+ # Make the nested belongs_to routes
253
+ resources config.belongs_to_config.target.underscored_resource_name.pluralize do
254
+ instance_eval &routes_for_belongs_to
255
+ end
198
256
  end
199
257
  end
258
+
259
+ # Add on the namespace if required
260
+ if !config.namespace.root?
261
+ routes_in_namespace = route_definition_block.dup
262
+ route_definition_block = Proc.new do
263
+ namespace config.namespace.name do
264
+ instance_eval(&routes_in_namespace)
265
+ end
266
+ end
267
+ end
268
+
269
+ instance_eval &route_definition_block
200
270
  end
201
271
  end
202
272
  end
203
273
 
274
+ def load_default_namespace
275
+ find_or_create_namespace(default_namespace)
276
+ end
277
+
204
278
  #
205
279
  # Add before, around and after filters to each registered resource.
206
280
  #
@@ -227,3 +301,5 @@ module ActiveAdmin
227
301
 
228
302
  end
229
303
  end
304
+
305
+ require 'active_admin/comments'
@@ -0,0 +1,95 @@
1
+ module ActiveAdmin
2
+ class AbstractViewFactory
3
+ @@default_views = {}
4
+
5
+ def self.register(view_hash)
6
+ view_hash.each do |view_key, view_class|
7
+ @@default_views[view_key] = view_class
8
+ end
9
+ end
10
+
11
+ def initialize
12
+ @views = {}
13
+ end
14
+
15
+ # Register a new view key with the view factory
16
+ #
17
+ # eg:
18
+ #
19
+ # factory = AbstractViewFactory.new
20
+ # factory.register :my_view => SomeViewClass
21
+ #
22
+ # You can setup many at the same time:
23
+ #
24
+ # factory.register :my_view => SomeClass,
25
+ # :another_view => OtherViewClass
26
+ #
27
+ def register(view_hash)
28
+ view_hash.each do |view_key, view_class|
29
+ @views[view_key] = view_class
30
+ end
31
+ end
32
+
33
+ def default_for(key)
34
+ @@default_views[key.to_sym]
35
+ end
36
+
37
+ def has_key?(key)
38
+ @views.has_key?(key.to_sym) || @@default_views.has_key?(key.to_sym)
39
+ end
40
+
41
+ def [](key)
42
+ get_view_for_key(key)
43
+ end
44
+
45
+ def []=(key, value)
46
+ set_view_for_key(key, value)
47
+ end
48
+
49
+ # Override respond to to include keys
50
+ def respond_to?(method)
51
+ key = key_from_method_name(method)
52
+ if has_key?(key)
53
+ true
54
+ else
55
+ super
56
+ end
57
+ end
58
+
59
+ private
60
+
61
+ def method_missing(method, *args)
62
+ key = key_from_method_name(method)
63
+ if has_key?(key)
64
+ if method.to_s.include?('=')
65
+ self.class_eval <<-EOS
66
+ def #{key}=(value)
67
+ set_view_for_key(:#{key}, value)
68
+ end
69
+ EOS
70
+ else
71
+ self.class_eval <<-EOS
72
+ def #{key}
73
+ get_view_for_key(:#{key})
74
+ end
75
+ EOS
76
+ end
77
+ self.send(method, *args)
78
+ else
79
+ super
80
+ end
81
+ end
82
+
83
+ def key_from_method_name(method)
84
+ method.to_s.gsub('=', '').to_sym
85
+ end
86
+
87
+ def get_view_for_key(key)
88
+ @views[key.to_sym] || @@default_views[key.to_sym]
89
+ end
90
+
91
+ def set_view_for_key(key, view)
92
+ @views[key.to_sym] = view
93
+ end
94
+ end
95
+ end