nsm-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.
Files changed (321) hide show
  1. data/.document +5 -0
  2. data/.gitignore +34 -0
  3. data/.travis.yml +4 -0
  4. data/.yardopts +8 -0
  5. data/CHANGELOG.rdoc +76 -0
  6. data/Gemfile +39 -0
  7. data/LICENSE +25 -0
  8. data/README.rdoc +487 -0
  9. data/Rakefile +27 -0
  10. data/activeadmin.gemspec +28 -0
  11. data/app/assets/images/active_admin/admin_notes_icon.png +0 -0
  12. data/app/assets/images/active_admin/datepicker/datepicker-header-bg.png +0 -0
  13. data/app/assets/images/active_admin/datepicker/datepicker-input-icon.png +0 -0
  14. data/app/assets/images/active_admin/datepicker/datepicker-next-link-icon.png +0 -0
  15. data/app/assets/images/active_admin/datepicker/datepicker-nipple.png +0 -0
  16. data/app/assets/images/active_admin/datepicker/datepicker-prev-link-icon.png +0 -0
  17. data/app/assets/images/active_admin/loading.gif +0 -0
  18. data/app/assets/images/active_admin/nested_menu_arrow.gif +0 -0
  19. data/app/assets/images/active_admin/nested_menu_arrow_dark.gif +0 -0
  20. data/app/assets/images/active_admin/orderable.png +0 -0
  21. data/app/assets/javascripts/active_admin/base.js +12 -0
  22. data/app/assets/javascripts/active_admin/vendor.js +382 -0
  23. data/app/assets/stylesheets/active_admin/_base.css.scss +400 -0
  24. data/app/assets/stylesheets/active_admin/_forms.css.scss +256 -0
  25. data/app/assets/stylesheets/active_admin/_header.css.scss +110 -0
  26. data/app/assets/stylesheets/active_admin/_mixins.css.scss +1 -0
  27. data/app/assets/stylesheets/active_admin/_typography.css.scss +100 -0
  28. data/app/assets/stylesheets/active_admin/components/_comments.css.scss +40 -0
  29. data/app/assets/stylesheets/active_admin/components/_date_picker.css.scss +123 -0
  30. data/app/assets/stylesheets/active_admin/components/_flash_messages.css.scss +38 -0
  31. data/app/assets/stylesheets/active_admin/mixins/_all.css.scss +8 -0
  32. data/app/assets/stylesheets/active_admin/mixins/_buttons.css.scss +27 -0
  33. data/app/assets/stylesheets/active_admin/mixins/_gradients.css.scss +29 -0
  34. data/app/assets/stylesheets/active_admin/mixins/_icons.css.scss +20 -0
  35. data/app/assets/stylesheets/active_admin/mixins/_reset.css.scss +165 -0
  36. data/app/assets/stylesheets/active_admin/mixins/_rounded.css.scss +43 -0
  37. data/app/assets/stylesheets/active_admin/mixins/_sections.css.scss +34 -0
  38. data/app/assets/stylesheets/active_admin/mixins/_shadows.css.scss +21 -0
  39. data/app/assets/stylesheets/active_admin/mixins/_variables.css.scss +21 -0
  40. data/app/views/active_admin/dashboard/index.html.arb +1 -0
  41. data/app/views/active_admin/devise/mailer/reset_password_instructions.html.erb +8 -0
  42. data/app/views/active_admin/devise/mailer/unlock_instructions.html.erb +7 -0
  43. data/app/views/active_admin/devise/passwords/edit.html.erb +16 -0
  44. data/app/views/active_admin/devise/passwords/new.html.erb +14 -0
  45. data/app/views/active_admin/devise/sessions/new.html.erb +18 -0
  46. data/app/views/active_admin/devise/shared/_links.erb +20 -0
  47. data/app/views/active_admin/devise/unlocks/new.html.erb +12 -0
  48. data/app/views/active_admin/resource/edit.html.arb +1 -0
  49. data/app/views/active_admin/resource/index.csv.erb +20 -0
  50. data/app/views/active_admin/resource/index.html.arb +1 -0
  51. data/app/views/active_admin/resource/new.html.arb +1 -0
  52. data/app/views/active_admin/resource/show.html.arb +1 -0
  53. data/app/views/layouts/active_admin.html.arb +1 -0
  54. data/app/views/layouts/active_admin_logged_out.html.erb +35 -0
  55. data/cucumber.yml +2 -0
  56. data/docs/1-general-configuration.md +52 -0
  57. data/docs/2-resource-customization.md +35 -0
  58. data/docs/3-index-pages.md +55 -0
  59. data/docs/3-index-pages/index-as-block.md +16 -0
  60. data/docs/3-index-pages/index-as-blog.md +61 -0
  61. data/docs/3-index-pages/index-as-grid.md +21 -0
  62. data/docs/3-index-pages/index-as-table.md +74 -0
  63. data/docs/4-csv-format.md +14 -0
  64. data/docs/5-forms.md +39 -0
  65. data/docs/6-show-screens.md +22 -0
  66. data/docs/7-sidebars.md +35 -0
  67. data/docs/8-custom-actions.md +123 -0
  68. data/features/comments/commenting.feature +112 -0
  69. data/features/comments/viewing_index.feature +19 -0
  70. data/features/dashboard.feature +26 -0
  71. data/features/edit_page.feature +106 -0
  72. data/features/first_boot.feature +16 -0
  73. data/features/global_navigation.feature +30 -0
  74. data/features/index/format_as_csv.feature +46 -0
  75. data/features/index/formats.feature +12 -0
  76. data/features/index/index_as_block.feature +15 -0
  77. data/features/index/index_as_blog.feature +50 -0
  78. data/features/index/index_as_grid.feature +45 -0
  79. data/features/index/index_as_table.feature +81 -0
  80. data/features/index/index_blank_slate.feature +55 -0
  81. data/features/index/index_scopes.feature +52 -0
  82. data/features/index/pagination.feature +17 -0
  83. data/features/menu.feature +26 -0
  84. data/features/new_page.feature +75 -0
  85. data/features/registering_assets.feature +35 -0
  86. data/features/registering_resources.feature +33 -0
  87. data/features/show/default_content.feature +43 -0
  88. data/features/show/page_title.feature +33 -0
  89. data/features/sidebar_sections.feature +127 -0
  90. data/features/specifying_actions.feature +87 -0
  91. data/features/step_definitions/action_item_steps.rb +7 -0
  92. data/features/step_definitions/additional_web_steps.rb +77 -0
  93. data/features/step_definitions/asset_steps.rb +7 -0
  94. data/features/step_definitions/attribute_steps.rb +13 -0
  95. data/features/step_definitions/comment_steps.rb +8 -0
  96. data/features/step_definitions/configuration_steps.rb +31 -0
  97. data/features/step_definitions/dashboard_steps.rb +11 -0
  98. data/features/step_definitions/factory_steps.rb +29 -0
  99. data/features/step_definitions/flash_steps.rb +3 -0
  100. data/features/step_definitions/format_steps.rb +35 -0
  101. data/features/step_definitions/index_scope_steps.rb +20 -0
  102. data/features/step_definitions/layout_steps.rb +3 -0
  103. data/features/step_definitions/menu_steps.rb +7 -0
  104. data/features/step_definitions/pagination_steps.rb +8 -0
  105. data/features/step_definitions/sidebar_steps.rb +7 -0
  106. data/features/step_definitions/tab_steps.rb +3 -0
  107. data/features/step_definitions/user_steps.rb +26 -0
  108. data/features/step_definitions/web_steps.rb +211 -0
  109. data/features/sti_resource.feature +61 -0
  110. data/features/support/env.rb +90 -0
  111. data/features/support/paths.rb +50 -0
  112. data/features/support/selectors.rb +45 -0
  113. data/features/users/logging_in.feature +34 -0
  114. data/features/users/logging_out.feature +13 -0
  115. data/lib/active_admin.rb +74 -0
  116. data/lib/active_admin/abstract_view_factory.rb +95 -0
  117. data/lib/active_admin/application.rb +228 -0
  118. data/lib/active_admin/arbre.rb +23 -0
  119. data/lib/active_admin/arbre/attributes.rb +20 -0
  120. data/lib/active_admin/arbre/class_list.rb +28 -0
  121. data/lib/active_admin/arbre/collection.rb +27 -0
  122. data/lib/active_admin/arbre/context.rb +14 -0
  123. data/lib/active_admin/arbre/core_extensions.rb +5 -0
  124. data/lib/active_admin/arbre/document.rb +42 -0
  125. data/lib/active_admin/arbre/element.rb +151 -0
  126. data/lib/active_admin/arbre/html.rb +84 -0
  127. data/lib/active_admin/arbre/html5_elements.rb +47 -0
  128. data/lib/active_admin/arbre/tag.rb +137 -0
  129. data/lib/active_admin/arbre/text_node.rb +35 -0
  130. data/lib/active_admin/asset_registration.rb +34 -0
  131. data/lib/active_admin/callbacks.rb +89 -0
  132. data/lib/active_admin/comments.rb +88 -0
  133. data/lib/active_admin/comments/comment.rb +21 -0
  134. data/lib/active_admin/comments/configuration.rb +18 -0
  135. data/lib/active_admin/comments/namespace_helper.rb +14 -0
  136. data/lib/active_admin/comments/resource_helper.rb +17 -0
  137. data/lib/active_admin/comments/show_page_helper.rb +23 -0
  138. data/lib/active_admin/comments/views.rb +3 -0
  139. data/lib/active_admin/comments/views/active_admin_comment.rb +0 -0
  140. data/lib/active_admin/comments/views/active_admin_comments.rb +82 -0
  141. data/lib/active_admin/component.rb +22 -0
  142. data/lib/active_admin/controller_action.rb +12 -0
  143. data/lib/active_admin/csv_builder.rb +45 -0
  144. data/lib/active_admin/dashboards.rb +48 -0
  145. data/lib/active_admin/dashboards/dashboard_controller.rb +38 -0
  146. data/lib/active_admin/dashboards/section.rb +34 -0
  147. data/lib/active_admin/deprecation.rb +36 -0
  148. data/lib/active_admin/devise.rb +43 -0
  149. data/lib/active_admin/dsl.rb +224 -0
  150. data/lib/active_admin/engine.rb +4 -0
  151. data/lib/active_admin/event.rb +31 -0
  152. data/lib/active_admin/form_builder.rb +109 -0
  153. data/lib/active_admin/helpers/optional_display.rb +34 -0
  154. data/lib/active_admin/helpers/settings.rb +63 -0
  155. data/lib/active_admin/iconic.rb +51 -0
  156. data/lib/active_admin/iconic/icons.rb +142 -0
  157. data/lib/active_admin/locales/da.yml +28 -0
  158. data/lib/active_admin/locales/en.yml +40 -0
  159. data/lib/active_admin/locales/es.yml +39 -0
  160. data/lib/active_admin/locales/it.yml +39 -0
  161. data/lib/active_admin/locales/pt-BR.yml +36 -0
  162. data/lib/active_admin/locales/ru.yml +40 -0
  163. data/lib/active_admin/locales/zh_cn.yml +40 -0
  164. data/lib/active_admin/menu.rb +42 -0
  165. data/lib/active_admin/menu_item.rb +73 -0
  166. data/lib/active_admin/namespace.rb +206 -0
  167. data/lib/active_admin/page_config.rb +15 -0
  168. data/lib/active_admin/reloader.rb +30 -0
  169. data/lib/active_admin/renderer.rb +87 -0
  170. data/lib/active_admin/resource.rb +151 -0
  171. data/lib/active_admin/resource/action_items.rb +88 -0
  172. data/lib/active_admin/resource/belongs_to.rb +31 -0
  173. data/lib/active_admin/resource/menu.rb +45 -0
  174. data/lib/active_admin/resource/naming.rb +36 -0
  175. data/lib/active_admin/resource/scopes.rb +33 -0
  176. data/lib/active_admin/resource/sidebars.rb +36 -0
  177. data/lib/active_admin/resource_controller.rb +103 -0
  178. data/lib/active_admin/resource_controller/action_builder.rb +21 -0
  179. data/lib/active_admin/resource_controller/actions.rb +79 -0
  180. data/lib/active_admin/resource_controller/callbacks.rb +47 -0
  181. data/lib/active_admin/resource_controller/collection.rb +144 -0
  182. data/lib/active_admin/resource_controller/filters.rb +58 -0
  183. data/lib/active_admin/resource_controller/form.rb +42 -0
  184. data/lib/active_admin/resource_controller/menu.rb +29 -0
  185. data/lib/active_admin/resource_controller/page_configurations.rb +53 -0
  186. data/lib/active_admin/resource_controller/scoping.rb +36 -0
  187. data/lib/active_admin/resource_controller/sidebars.rb +18 -0
  188. data/lib/active_admin/router.rb +85 -0
  189. data/lib/active_admin/sass/active_admin.scss +3 -0
  190. data/lib/active_admin/sass/css_loader.rb +16 -0
  191. data/lib/active_admin/sass/helpers.rb +40 -0
  192. data/lib/active_admin/scope.rb +17 -0
  193. data/lib/active_admin/sidebar_section.rb +41 -0
  194. data/lib/active_admin/stylesheets/active_admin/mixins/_utilities.scss +0 -0
  195. data/lib/active_admin/version.rb +3 -0
  196. data/lib/active_admin/view_factory.rb +23 -0
  197. data/lib/active_admin/view_helpers.rb +22 -0
  198. data/lib/active_admin/view_helpers/active_admin_application_helper.rb +12 -0
  199. data/lib/active_admin/view_helpers/assigns_with_indifferent_access_helper.rb +7 -0
  200. data/lib/active_admin/view_helpers/auto_link_helper.rb +42 -0
  201. data/lib/active_admin/view_helpers/breadcrumb_helper.rb +29 -0
  202. data/lib/active_admin/view_helpers/display_helper.rb +38 -0
  203. data/lib/active_admin/view_helpers/filter_form_helper.rb +186 -0
  204. data/lib/active_admin/view_helpers/form_helper.rb +13 -0
  205. data/lib/active_admin/view_helpers/icon_helper.rb +12 -0
  206. data/lib/active_admin/view_helpers/method_or_proc_helper.rb +26 -0
  207. data/lib/active_admin/view_helpers/renderer_helper.rb +29 -0
  208. data/lib/active_admin/view_helpers/sidebar_helper.rb +15 -0
  209. data/lib/active_admin/view_helpers/title_helper.rb +11 -0
  210. data/lib/active_admin/view_helpers/view_factory_helper.rb +11 -0
  211. data/lib/active_admin/views.rb +8 -0
  212. data/lib/active_admin/views/action_items.rb +17 -0
  213. data/lib/active_admin/views/components/attributes_table.rb +66 -0
  214. data/lib/active_admin/views/components/blank_slate.rb +33 -0
  215. data/lib/active_admin/views/components/columns.rb +47 -0
  216. data/lib/active_admin/views/components/paginated_collection.rb +92 -0
  217. data/lib/active_admin/views/components/panel.rb +26 -0
  218. data/lib/active_admin/views/components/scopes.rb +70 -0
  219. data/lib/active_admin/views/components/sidebar_section.rb +28 -0
  220. data/lib/active_admin/views/components/status_tag.rb +55 -0
  221. data/lib/active_admin/views/components/table_for.rb +193 -0
  222. data/lib/active_admin/views/dashboard_section_renderer.rb +19 -0
  223. data/lib/active_admin/views/header_renderer.rb +53 -0
  224. data/lib/active_admin/views/index_as_block.rb +29 -0
  225. data/lib/active_admin/views/index_as_blog.rb +129 -0
  226. data/lib/active_admin/views/index_as_grid.rb +70 -0
  227. data/lib/active_admin/views/index_as_table.rb +148 -0
  228. data/lib/active_admin/views/pages/base.rb +155 -0
  229. data/lib/active_admin/views/pages/dashboard.rb +62 -0
  230. data/lib/active_admin/views/pages/edit.rb +28 -0
  231. data/lib/active_admin/views/pages/index.rb +74 -0
  232. data/lib/active_admin/views/pages/layout.rb +26 -0
  233. data/lib/active_admin/views/pages/new.rb +28 -0
  234. data/lib/active_admin/views/pages/show.rb +56 -0
  235. data/lib/active_admin/views/tabs_renderer.rb +58 -0
  236. data/lib/activeadmin.rb +1 -0
  237. data/lib/generators/active_admin/assets/assets_generator.rb +21 -0
  238. data/lib/generators/active_admin/assets/templates/3.0/active_admin.js +427 -0
  239. data/lib/generators/active_admin/assets/templates/3.1/active_admin.css.scss +6 -0
  240. data/lib/generators/active_admin/assets/templates/3.1/active_admin.js +1 -0
  241. data/lib/generators/active_admin/assets/templates/dashboards.rb +36 -0
  242. data/lib/generators/active_admin/devise/devise_generator.rb +49 -0
  243. data/lib/generators/active_admin/install/install_generator.rb +44 -0
  244. data/lib/generators/active_admin/install/templates/active_admin.rb.erb +93 -0
  245. data/lib/generators/active_admin/install/templates/dashboards.rb +38 -0
  246. data/lib/generators/active_admin/install/templates/migrations/1_create_admin_notes.rb +16 -0
  247. data/lib/generators/active_admin/install/templates/migrations/2_move_admin_notes_to_comments.rb +25 -0
  248. data/lib/generators/active_admin/resource/resource_generator.rb +16 -0
  249. data/lib/generators/active_admin/resource/templates/admin.rb +3 -0
  250. data/script/local +44 -0
  251. data/script/use_rails +45 -0
  252. data/spec/integration/belongs_to_spec.rb +42 -0
  253. data/spec/integration/default_namespace.rb +77 -0
  254. data/spec/integration/javascript_spec.rb +20 -0
  255. data/spec/integration/stylesheets_spec.rb +41 -0
  256. data/spec/spec_helper.rb +157 -0
  257. data/spec/support/detect_rails_version.rb +11 -0
  258. data/spec/support/integration_example_group.rb +33 -0
  259. data/spec/support/jslint.yml +80 -0
  260. data/spec/support/rails_template.rb +32 -0
  261. data/spec/support/rails_template_with_data.rb +33 -0
  262. data/spec/support/templates/cucumber.rb +24 -0
  263. data/spec/unit/abstract_view_factory_spec.rb +79 -0
  264. data/spec/unit/action_builder_spec.rb +88 -0
  265. data/spec/unit/application_spec.rb +78 -0
  266. data/spec/unit/arbre/html/context_spec.rb +22 -0
  267. data/spec/unit/arbre/html/element_finder_methods_spec.rb +54 -0
  268. data/spec/unit/arbre/html/element_spec.rb +224 -0
  269. data/spec/unit/arbre/html/tag_attributes_spec.rb +61 -0
  270. data/spec/unit/arbre/html/tag_spec.rb +63 -0
  271. data/spec/unit/arbre/html_spec.rb +210 -0
  272. data/spec/unit/asset_registration_spec.rb +37 -0
  273. data/spec/unit/auto_link_spec.rb +39 -0
  274. data/spec/unit/belongs_to_spec.rb +45 -0
  275. data/spec/unit/breadcrumbs_spec.rb +110 -0
  276. data/spec/unit/comments_spec.rb +57 -0
  277. data/spec/unit/component_spec.rb +18 -0
  278. data/spec/unit/controller_filters_spec.rb +34 -0
  279. data/spec/unit/csv_builder_spec.rb +83 -0
  280. data/spec/unit/dashboard_controller_spec.rb +26 -0
  281. data/spec/unit/dashboard_section_spec.rb +56 -0
  282. data/spec/unit/dashboards_spec.rb +59 -0
  283. data/spec/unit/display_name_spec.rb +29 -0
  284. data/spec/unit/event_spec.rb +41 -0
  285. data/spec/unit/filter_form_builder_spec.rb +182 -0
  286. data/spec/unit/form_builder_spec.rb +239 -0
  287. data/spec/unit/generators/install_rails_3_1_spec.rb +16 -0
  288. data/spec/unit/helpers/settings_spec.rb +30 -0
  289. data/spec/unit/menu_item_spec.rb +143 -0
  290. data/spec/unit/menu_spec.rb +53 -0
  291. data/spec/unit/namespace_spec.rb +214 -0
  292. data/spec/unit/pretty_format_spec.rb +35 -0
  293. data/spec/unit/rails_spec.rb +43 -0
  294. data/spec/unit/registration_spec.rb +76 -0
  295. data/spec/unit/reloader_spec.rb +28 -0
  296. data/spec/unit/renderer_spec.rb +108 -0
  297. data/spec/unit/resource/action_items_spec.rb +62 -0
  298. data/spec/unit/resource/menu_spec.rb +80 -0
  299. data/spec/unit/resource/naming_spec.rb +56 -0
  300. data/spec/unit/resource/scopes_spec.rb +30 -0
  301. data/spec/unit/resource/sidebars_spec.rb +50 -0
  302. data/spec/unit/resource_controller/collection_spec.rb +34 -0
  303. data/spec/unit/resource_controller_spec.rb +152 -0
  304. data/spec/unit/resource_spec.rb +260 -0
  305. data/spec/unit/routing_spec.rb +88 -0
  306. data/spec/unit/sass/helpers_spec.rb +47 -0
  307. data/spec/unit/scope_spec.rb +31 -0
  308. data/spec/unit/tabs_renderer_spec.rb +85 -0
  309. data/spec/unit/view_factory_spec.rb +19 -0
  310. data/spec/unit/views/components/attributes_table_spec.rb +100 -0
  311. data/spec/unit/views/components/blank_slate_spec.rb +31 -0
  312. data/spec/unit/views/components/columns_spec.rb +75 -0
  313. data/spec/unit/views/components/panel_spec.rb +31 -0
  314. data/spec/unit/views/components/sidebar_section_spec.rb +37 -0
  315. data/spec/unit/views/components/status_tag_spec.rb +81 -0
  316. data/spec/unit/views/components/table_for_spec.rb +130 -0
  317. data/spec/unit/views/pages/layout_spec.rb +22 -0
  318. data/tasks/docs.rake +39 -0
  319. data/tasks/test.rake +49 -0
  320. data/tasks/yard.rake +6 -0
  321. metadata +510 -0
@@ -0,0 +1,42 @@
1
+ module ActiveAdmin
2
+ class Menu
3
+
4
+ def initialize
5
+ @items = []
6
+ yield(self) if block_given?
7
+ end
8
+
9
+ def add(*args, &block)
10
+ @items << MenuItem.new(*args, &block)
11
+ end
12
+
13
+ def [](name)
14
+ items.find{ |i| i.name == name }
15
+ end
16
+
17
+ def items
18
+ @items.sort
19
+ end
20
+
21
+ def find_by_url(url)
22
+ recursive_find_by_url(items, url)
23
+ end
24
+
25
+ private
26
+
27
+ def recursive_find_by_url(collection, url)
28
+ found = nil
29
+ collection.each do |item|
30
+ if item.url == url
31
+ found = item
32
+ break
33
+ else
34
+ found = recursive_find_by_url(item.children, url)
35
+ break if found
36
+ end
37
+ end
38
+ found
39
+ end
40
+
41
+ end
42
+ end
@@ -0,0 +1,73 @@
1
+ module ActiveAdmin
2
+ class MenuItem
3
+
4
+ # Use this to get to the routes
5
+ include Rails.application.routes.url_helpers
6
+
7
+ attr_accessor :name, :url, :priority, :parent, :display_if_block
8
+
9
+ def initialize(name, url, priority = 10, options = {})
10
+ @name, @url, @priority = name, url, priority
11
+ @children = []
12
+ @cached_url = {} # Stores the cached url in a hash to allow us to change it and still cache it
13
+
14
+ @display_if_block = options.delete(:if)
15
+
16
+ yield(self) if block_given? # Builder style syntax
17
+ end
18
+
19
+ def add(name, url, priority=10, options = {}, &block)
20
+ item = MenuItem.new(name, url, priority, options, &block)
21
+ item.parent = self
22
+ @children << item
23
+ end
24
+
25
+ def children
26
+ @children.sort
27
+ end
28
+
29
+ def parent?
30
+ !parent.nil?
31
+ end
32
+
33
+ def dom_id
34
+ name.downcase.gsub( " ", '_' ).gsub( /[^a-z0-9_]/, '' )
35
+ end
36
+
37
+ def url
38
+ case @url
39
+ when Symbol
40
+ generated = send(@url) # Call the named route
41
+ else
42
+ generated = @url
43
+ end
44
+ @cached_url[@url] ||= generated
45
+ end
46
+
47
+ # Returns an array of the ancestory of this menu item
48
+ # The first item is the immediate parent fo the item
49
+ def ancestors
50
+ return [] unless parent?
51
+ [parent, parent.ancestors].flatten
52
+ end
53
+
54
+ # Returns the child item with the name passed in
55
+ # @blog_menu["Create New"] => <#MenuItem @name="Create New" >
56
+ def [](name)
57
+ @children.find{ |i| i.name == name }
58
+ end
59
+
60
+ def <=>(other)
61
+ result = priority <=> other.priority
62
+ result = name <=> other.name if result == 0
63
+ result
64
+ end
65
+
66
+ # Returns the display if block. If the block was not explicitly defined
67
+ # a default block always returning true will be returned.
68
+ def display_if_block
69
+ @display_if_block || lambda { |_| true }
70
+ end
71
+
72
+ end
73
+ end
@@ -0,0 +1,206 @@
1
+ module ActiveAdmin
2
+
3
+ class ResourceMismatchError < StandardError; end
4
+
5
+ # Namespaces are the basic organizing principle for resources within Active Admin
6
+ #
7
+ # Each resource is registered into a namespace which defines:
8
+ # * the namespaceing for routing
9
+ # * the module to namespace controllers
10
+ # * the menu which gets displayed (other resources in the same namespace)
11
+ #
12
+ # For example:
13
+ #
14
+ # ActiveAdmin.register Post, :namespace => :admin
15
+ #
16
+ # Will register the Post model into the "admin" namespace. This will namespace the
17
+ # urls for the resource to "/admin/posts" and will set the controller to
18
+ # Admin::PostsController
19
+ #
20
+ # You can also register to the "root" namespace, which is to say no namespace at all.
21
+ #
22
+ # ActiveAdmin.register Post, :namespace => false
23
+ #
24
+ # This will register the resource to an instantiated namespace called :root. The
25
+ # resource will be accessible from "/posts" and the controller will be PostsController.
26
+ #
27
+ class Namespace
28
+
29
+ RegisterEvent = 'active_admin.namespace.register'.freeze
30
+
31
+ attr_reader :application, :resources, :name, :menu
32
+
33
+ def initialize(application, name)
34
+ @application = application
35
+ @name = name.to_s.underscore.to_sym
36
+ @resources = {}
37
+ @menu = Menu.new
38
+ register_module unless root?
39
+ generate_dashboard_controller
40
+ end
41
+
42
+ # Register a resource into this namespace. The preffered method to access this is to
43
+ # use the global registration ActiveAdmin.register which delegates to the proper
44
+ # namespace instance.
45
+ def register(resource, options = {}, &block)
46
+ config = find_or_build_resource(resource, options)
47
+
48
+ # Register the resource
49
+ register_resource_controller(config)
50
+ parse_registration_block(config, &block) if block_given?
51
+ register_with_menu(config) if config.include_in_menu?
52
+
53
+ # Ensure that the dashboard is generated
54
+ generate_dashboard_controller
55
+
56
+ # Dispatch a registration event
57
+ ActiveAdmin::Event.dispatch ActiveAdmin::Resource::RegisterEvent, config
58
+
59
+ # Return the config
60
+ config
61
+ end
62
+
63
+ def root?
64
+ name == :root
65
+ end
66
+
67
+ # Returns the name of the module if required. Will be nil if none
68
+ # is required.
69
+ #
70
+ # eg:
71
+ # Namespace.new(:admin).module_name # => 'Admin'
72
+ # Namespace.new(:root).module_name # => nil
73
+ #
74
+ def module_name
75
+ return nil if root?
76
+ @module_name ||= name.to_s.camelize
77
+ end
78
+
79
+ # Returns the name of the dashboard controller for this namespace
80
+ def dashboard_controller_name
81
+ [module_name, "DashboardController"].compact.join("::")
82
+ end
83
+
84
+ # Unload all the registered resources for this namespace
85
+ def unload!
86
+ unload_resources!
87
+ unload_dashboard!
88
+ unload_menu!
89
+ end
90
+
91
+ # The menu gets built by Active Admin once all the resources have been
92
+ # loaded. This method gets called to register each resource with the menu system.
93
+ def load_menu!
94
+ register_dashboard
95
+ resources.values.each do |config|
96
+ register_with_menu(config) if config.include_in_menu?
97
+ end
98
+ end
99
+
100
+ # Returns the first registered ActiveAdmin::Resource instance for a given class
101
+ def resource_for(klass)
102
+ actual = resources.values.find{|config| config.resource == klass }
103
+ return actual if actual
104
+
105
+ if klass.respond_to?(:base_class)
106
+ base_class = klass.base_class
107
+ resources.values.find{|config| config.resource == base_class }
108
+ else
109
+ nil
110
+ end
111
+ end
112
+
113
+ protected
114
+
115
+ # Either returns an existing Resource instance or builds a new
116
+ # one for the resource and options
117
+ def find_or_build_resource(resource_class, options)
118
+ resource = Resource.new(self, resource_class, options)
119
+
120
+ # If we've already registered this resource, use the existing
121
+ if @resources.has_key? resource.camelized_resource_name
122
+ existing_resource = @resources[resource.camelized_resource_name]
123
+
124
+ if existing_resource.resource != resource_class
125
+ raise ActiveAdmin::ResourceMismatchError,
126
+ "Tried to register #{resource_class} as #{resource.camelized_resource_name} but already registered to #{resource.resource}"
127
+ end
128
+
129
+ resource = existing_resource
130
+ else
131
+ @resources[resource.camelized_resource_name] = resource
132
+ end
133
+
134
+ resource
135
+ end
136
+
137
+ def unload_resources!
138
+ resources.each do |name, config|
139
+ parent = (module_name || 'Object').constantize
140
+ const_name = config.controller_name.split('::').last
141
+ # Remove the const if its been defined
142
+ parent.send(:remove_const, const_name) if parent.const_defined?(const_name)
143
+ end
144
+ @resources = {}
145
+ end
146
+
147
+ def unload_dashboard!
148
+ # TODO: Only clear out my sections
149
+ Dashboards.clear_all_sections!
150
+ end
151
+
152
+ def unload_menu!
153
+ @menu = Menu.new
154
+ end
155
+
156
+ # Creates a ruby module to namespace all the classes in if required
157
+ def register_module
158
+ eval "module ::#{module_name}; end"
159
+ end
160
+
161
+ def register_resource_controller(config)
162
+ eval "class ::#{config.controller_name} < ActiveAdmin::ResourceController; end"
163
+ config.controller.active_admin_config = config
164
+ end
165
+
166
+ def dsl
167
+ @dsl ||= DSL.new
168
+ end
169
+
170
+ def parse_registration_block(config, &block)
171
+ dsl.run_registration_block(config, &block)
172
+ end
173
+
174
+ # Creates a dashboard controller for this config
175
+ def generate_dashboard_controller
176
+ eval "class ::#{dashboard_controller_name} < ActiveAdmin::Dashboards::DashboardController; end"
177
+ end
178
+
179
+ # Adds the dashboard to the menu
180
+ def register_dashboard
181
+ dashboard_path = root? ? :dashboard_path : "#{name}_dashboard_path".to_sym
182
+ menu.add(I18n.t("active_admin.dashboard"), dashboard_path, 1) unless menu[I18n.t("active_admin.dashboard")]
183
+ end
184
+
185
+ # Does all the work of registernig a config with the menu system
186
+ def register_with_menu(config)
187
+ # The menu we're going to add this resource to
188
+ add_to = menu
189
+
190
+ # Adding as a child
191
+ if config.parent_menu_item_name
192
+ # Create the parent if it doesn't exist
193
+ menu.add(config.parent_menu_item_name, '#') unless menu[config.parent_menu_item_name]
194
+ add_to = menu[config.parent_menu_item_name]
195
+ end
196
+
197
+ # Check if this menu item has already been created
198
+ if add_to[config.menu_item_name]
199
+ # Update the url if it's already been created
200
+ add_to[config.menu_item_name].url = config.route_collection_path
201
+ else
202
+ add_to.add(config.menu_item_name, config.route_collection_path, config.menu_item_priority, { :if => config.menu_item_display_if })
203
+ end
204
+ end
205
+ end
206
+ end
@@ -0,0 +1,15 @@
1
+ module ActiveAdmin
2
+ class PageConfig
3
+
4
+ attr_reader :block
5
+
6
+ def initialize(options = {}, &block)
7
+ @options, @block = options, block
8
+ end
9
+
10
+ def [](key)
11
+ @options[key]
12
+ end
13
+
14
+ end
15
+ end
@@ -0,0 +1,30 @@
1
+ module ActiveAdmin
2
+ # Deals with reloading Active Admin on each request in
3
+ # development and once in production.
4
+ class Reloader
5
+
6
+ # @param [String] rails_version
7
+ # The version of Rails we're using. We use this to switch between
8
+ # the correcr Rails reloader class.
9
+ def initialize(rails_version)
10
+ @rails_version = rails_version.to_s
11
+ end
12
+
13
+ # Attach to Rails and perform the reload on each request.
14
+ def attach!
15
+ reloader_class.to_prepare do
16
+ ActiveAdmin.application.unload!
17
+ Rails.application.reload_routes!
18
+ end
19
+ end
20
+
21
+ def reloader_class
22
+ if @rails_version[0..2] == '3.1'
23
+ ActionDispatch::Reloader
24
+ else
25
+ ActionDispatch::Callbacks
26
+ end
27
+ end
28
+
29
+ end
30
+ end
@@ -0,0 +1,87 @@
1
+ module ActiveAdmin
2
+ class Renderer
3
+
4
+ include ::ActiveAdmin::ViewHelpers::RendererHelper
5
+ include Arbre::HTML
6
+
7
+ attr_accessor :view, :assigns
8
+
9
+ # For use in html
10
+ alias_method :helpers, :view
11
+
12
+ def initialize(view_or_renderer)
13
+ @view = view_or_renderer.is_a?(Renderer) ? view_or_renderer.view : view_or_renderer
14
+
15
+ if view.respond_to?(:assigns)
16
+ @assigns = view.assigns.each { |key, value| instance_variable_set("@#{key}", value) }
17
+ else
18
+ @assigns = {}
19
+ end
20
+ end
21
+
22
+ def method_missing(name,*args, &block)
23
+ if view.respond_to?(name)
24
+ view.send(name, *args, &block)
25
+ else
26
+ super
27
+ end
28
+ end
29
+
30
+ def to_html(*args)
31
+ end
32
+
33
+ def to_s(*args)
34
+ to_html(*args)
35
+ end
36
+
37
+ def haml(template)
38
+ begin
39
+ require 'haml' unless defined?(Haml)
40
+ rescue LoadError
41
+ raise LoadError, "Please install the HAML gem to use the HAML method with ActiveAdmin"
42
+ end
43
+
44
+ # Find the first non whitespace character in the template
45
+ indent = template.index(/\S/)
46
+
47
+ # Remove the indent if its greater than 0
48
+ if indent > 0
49
+ template = template.split("\n").collect do |line|
50
+ line[indent..-1]
51
+ end.join("\n")
52
+ end
53
+
54
+ # Render it baby
55
+ Haml::Engine.new(template).render(self)
56
+ end
57
+
58
+ protected
59
+
60
+ # Although we make a copy of all the instance variables on the way in, it
61
+ # doesn't mean that we can set new instance variables that are stored in
62
+ # the context of the view. This method allows you to do that. It can be useful
63
+ # when trying to share variables with a layout.
64
+ def set_ivar_on_view(name, value)
65
+ view.instance_variable_set(name, value)
66
+ end
67
+
68
+ # Many times throughout the views we want to either call a method on an object
69
+ # or instance_exec a proc passing in the object as the first parameter. This
70
+ # method takes care of this functionality.
71
+ #
72
+ # call_method_or_proc_on(@my_obj, :size) same as @my_obj.size
73
+ # OR
74
+ # proc = Proc.new{|s| s.size }
75
+ # call_method_or_proc_on(@my_obj, proc)
76
+ #
77
+ def call_method_or_proc_on(obj, symbol_or_proc)
78
+ case symbol_or_proc
79
+ when Symbol, String
80
+ obj.send(symbol_or_proc.to_sym)
81
+ when Proc
82
+ instance_exec(obj, &symbol_or_proc)
83
+ end
84
+ end
85
+
86
+ end
87
+ end