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.
Files changed (255) hide show
  1. data/.document +5 -0
  2. data/.gitignore +32 -0
  3. data/.travis.yml +4 -0
  4. data/CHANGELOG.rdoc +76 -0
  5. data/Gemfile +26 -0
  6. data/LICENSE +25 -0
  7. data/README.rdoc +450 -0
  8. data/Rakefile +100 -0
  9. data/activeadmin.gemspec +28 -0
  10. data/cucumber.yml +2 -0
  11. data/features/comments/commenting.feature +99 -0
  12. data/features/comments/viewing_index.feature +19 -0
  13. data/features/dashboard.feature +26 -0
  14. data/features/edit_page.feature +77 -0
  15. data/features/first_boot.feature +16 -0
  16. data/features/global_navigation.feature +30 -0
  17. data/features/index/format_as_csv.feature +45 -0
  18. data/features/index/formats.feature +10 -0
  19. data/features/index/index_as_block.feature +15 -0
  20. data/features/index/index_as_blog.feature +50 -0
  21. data/features/index/index_as_grid.feature +45 -0
  22. data/features/index/index_as_table.feature +79 -0
  23. data/features/index/index_scopes.feature +52 -0
  24. data/features/index/pagination.feature +23 -0
  25. data/features/menu.feature +26 -0
  26. data/features/new_page.feature +75 -0
  27. data/features/registering_assets.feature +35 -0
  28. data/features/registering_resources.feature +33 -0
  29. data/features/show/default_content.feature +43 -0
  30. data/features/show/page_title.feature +33 -0
  31. data/features/sidebar_sections.feature +127 -0
  32. data/features/specifying_actions.feature +60 -0
  33. data/features/step_definitions/action_item_steps.rb +7 -0
  34. data/features/step_definitions/additional_web_steps.rb +67 -0
  35. data/features/step_definitions/asset_steps.rb +7 -0
  36. data/features/step_definitions/attribute_steps.rb +15 -0
  37. data/features/step_definitions/comment_steps.rb +8 -0
  38. data/features/step_definitions/configuration_steps.rb +31 -0
  39. data/features/step_definitions/dashboard_steps.rb +11 -0
  40. data/features/step_definitions/factory_steps.rb +28 -0
  41. data/features/step_definitions/flash_steps.rb +3 -0
  42. data/features/step_definitions/format_steps.rb +34 -0
  43. data/features/step_definitions/index_scope_steps.rb +20 -0
  44. data/features/step_definitions/menu_steps.rb +7 -0
  45. data/features/step_definitions/pagination_steps.rb +8 -0
  46. data/features/step_definitions/sidebar_steps.rb +11 -0
  47. data/features/step_definitions/tab_steps.rb +3 -0
  48. data/features/step_definitions/user_steps.rb +20 -0
  49. data/features/step_definitions/web_steps.rb +219 -0
  50. data/features/sti_resource.feature +49 -0
  51. data/features/support/env.rb +92 -0
  52. data/features/support/paths.rb +48 -0
  53. data/features/users/logging_in.feature +34 -0
  54. data/features/users/logging_out.feature +13 -0
  55. data/lib/active_admin/abstract_view_factory.rb +95 -0
  56. data/lib/active_admin/action_items.rb +37 -0
  57. data/lib/active_admin/application.rb +204 -0
  58. data/lib/active_admin/arbre/attributes.rb +20 -0
  59. data/lib/active_admin/arbre/class_list.rb +28 -0
  60. data/lib/active_admin/arbre/collection.rb +27 -0
  61. data/lib/active_admin/arbre/context.rb +8 -0
  62. data/lib/active_admin/arbre/core_extensions.rb +5 -0
  63. data/lib/active_admin/arbre/document.rb +42 -0
  64. data/lib/active_admin/arbre/element.rb +151 -0
  65. data/lib/active_admin/arbre/html.rb +84 -0
  66. data/lib/active_admin/arbre/html5_elements.rb +47 -0
  67. data/lib/active_admin/arbre/tag.rb +137 -0
  68. data/lib/active_admin/arbre/text_node.rb +35 -0
  69. data/lib/active_admin/arbre.rb +23 -0
  70. data/lib/active_admin/asset_registration.rb +34 -0
  71. data/lib/active_admin/callbacks.rb +87 -0
  72. data/lib/active_admin/comments/comment.rb +21 -0
  73. data/lib/active_admin/comments/configuration.rb +18 -0
  74. data/lib/active_admin/comments/namespace_helper.rb +14 -0
  75. data/lib/active_admin/comments/resource_helper.rb +17 -0
  76. data/lib/active_admin/comments/show_page_helper.rb +23 -0
  77. data/lib/active_admin/comments/views/active_admin_comment.rb +0 -0
  78. data/lib/active_admin/comments/views/active_admin_comments.rb +82 -0
  79. data/lib/active_admin/comments/views.rb +3 -0
  80. data/lib/active_admin/comments.rb +88 -0
  81. data/lib/active_admin/component.rb +22 -0
  82. data/lib/active_admin/controller_action.rb +12 -0
  83. data/lib/active_admin/csv_builder.rb +45 -0
  84. data/lib/active_admin/dashboards/dashboard_controller.rb +47 -0
  85. data/lib/active_admin/dashboards/section.rb +34 -0
  86. data/lib/active_admin/dashboards.rb +48 -0
  87. data/lib/active_admin/devise.rb +43 -0
  88. data/lib/active_admin/dsl.rb +215 -0
  89. data/lib/active_admin/event.rb +31 -0
  90. data/lib/active_admin/form_builder.rb +109 -0
  91. data/lib/active_admin/helpers/optional_display.rb +34 -0
  92. data/lib/active_admin/iconic/icons.rb +142 -0
  93. data/lib/active_admin/iconic.rb +51 -0
  94. data/lib/active_admin/locales/da.yml +26 -0
  95. data/lib/active_admin/locales/en.yml +34 -0
  96. data/lib/active_admin/locales/es.yml +34 -0
  97. data/lib/active_admin/locales/pt.yml +34 -0
  98. data/lib/active_admin/menu.rb +42 -0
  99. data/lib/active_admin/menu_item.rb +73 -0
  100. data/lib/active_admin/namespace.rb +198 -0
  101. data/lib/active_admin/page_config.rb +15 -0
  102. data/lib/active_admin/renderer.rb +87 -0
  103. data/lib/active_admin/resource/belongs_to.rb +31 -0
  104. data/lib/active_admin/resource.rb +229 -0
  105. data/lib/active_admin/resource_controller/action_builder.rb +21 -0
  106. data/lib/active_admin/resource_controller/actions.rb +79 -0
  107. data/lib/active_admin/resource_controller/callbacks.rb +47 -0
  108. data/lib/active_admin/resource_controller/collection.rb +144 -0
  109. data/lib/active_admin/resource_controller/filters.rb +58 -0
  110. data/lib/active_admin/resource_controller/form.rb +42 -0
  111. data/lib/active_admin/resource_controller/menu.rb +29 -0
  112. data/lib/active_admin/resource_controller/page_configurations.rb +53 -0
  113. data/lib/active_admin/resource_controller/scoping.rb +36 -0
  114. data/lib/active_admin/resource_controller/sidebars.rb +38 -0
  115. data/lib/active_admin/resource_controller.rb +119 -0
  116. data/lib/active_admin/router.rb +85 -0
  117. data/lib/active_admin/scope.rb +17 -0
  118. data/lib/active_admin/sidebar.rb +43 -0
  119. data/lib/active_admin/stylesheets/active_admin/_comments.scss +40 -0
  120. data/lib/active_admin/stylesheets/active_admin/_flash_messages.scss +13 -0
  121. data/lib/active_admin/stylesheets/active_admin/_forms.scss +168 -0
  122. data/lib/active_admin/stylesheets/active_admin/_header.scss +108 -0
  123. data/lib/active_admin/stylesheets/active_admin/_typography.scss +100 -0
  124. data/lib/active_admin/stylesheets/active_admin/mixins/_all.scss +8 -0
  125. data/lib/active_admin/stylesheets/active_admin/mixins/_buttons.scss +27 -0
  126. data/lib/active_admin/stylesheets/active_admin/mixins/_gradients.scss +21 -0
  127. data/lib/active_admin/stylesheets/active_admin/mixins/_icons.scss +20 -0
  128. data/lib/active_admin/stylesheets/active_admin/mixins/_reset.scss +165 -0
  129. data/lib/active_admin/stylesheets/active_admin/mixins/_rounded.scss +43 -0
  130. data/lib/active_admin/stylesheets/active_admin/mixins/_sections.scss +27 -0
  131. data/lib/active_admin/stylesheets/active_admin/mixins/_shadows.scss +21 -0
  132. data/lib/active_admin/stylesheets/active_admin/mixins/_variables.scss +12 -0
  133. data/lib/active_admin/stylesheets/active_admin.scss +429 -0
  134. data/lib/active_admin/version.rb +3 -0
  135. data/lib/active_admin/view_factory.rb +21 -0
  136. data/lib/active_admin/view_helpers/active_admin_application_helper.rb +12 -0
  137. data/lib/active_admin/view_helpers/assigns_with_indifferent_access_helper.rb +7 -0
  138. data/lib/active_admin/view_helpers/auto_link_helper.rb +42 -0
  139. data/lib/active_admin/view_helpers/breadcrumb_helper.rb +29 -0
  140. data/lib/active_admin/view_helpers/display_helper.rb +38 -0
  141. data/lib/active_admin/view_helpers/filter_form_helper.rb +185 -0
  142. data/lib/active_admin/view_helpers/form_helper.rb +12 -0
  143. data/lib/active_admin/view_helpers/icon_helper.rb +12 -0
  144. data/lib/active_admin/view_helpers/method_or_proc_helper.rb +26 -0
  145. data/lib/active_admin/view_helpers/renderer_helper.rb +29 -0
  146. data/lib/active_admin/view_helpers/sidebar_helper.rb +15 -0
  147. data/lib/active_admin/view_helpers/table_helper.rb +12 -0
  148. data/lib/active_admin/view_helpers/title_helper.rb +11 -0
  149. data/lib/active_admin/view_helpers/view_factory_helper.rb +11 -0
  150. data/lib/active_admin/view_helpers.rb +23 -0
  151. data/lib/active_admin/views/action_items.rb +17 -0
  152. data/lib/active_admin/views/components/attributes_table.rb +66 -0
  153. data/lib/active_admin/views/components/columns.rb +47 -0
  154. data/lib/active_admin/views/components/paginated_collection.rb +92 -0
  155. data/lib/active_admin/views/components/panel.rb +26 -0
  156. data/lib/active_admin/views/components/scopes.rb +70 -0
  157. data/lib/active_admin/views/components/sidebar_section.rb +30 -0
  158. data/lib/active_admin/views/components/status_tag.rb +55 -0
  159. data/lib/active_admin/views/components/table_for.rb +193 -0
  160. data/lib/active_admin/views/dashboard_section_renderer.rb +19 -0
  161. data/lib/active_admin/views/header_renderer.rb +37 -0
  162. data/lib/active_admin/views/index_as_block.rb +24 -0
  163. data/lib/active_admin/views/index_as_blog.rb +89 -0
  164. data/lib/active_admin/views/index_as_grid.rb +49 -0
  165. data/lib/active_admin/views/index_as_table.rb +75 -0
  166. data/lib/active_admin/views/pages/base.rb +144 -0
  167. data/lib/active_admin/views/pages/dashboard.rb +59 -0
  168. data/lib/active_admin/views/pages/edit.rb +27 -0
  169. data/lib/active_admin/views/pages/index.rb +66 -0
  170. data/lib/active_admin/views/pages/new.rb +27 -0
  171. data/lib/active_admin/views/pages/show.rb +56 -0
  172. data/lib/active_admin/views/tabs_renderer.rb +58 -0
  173. data/lib/active_admin/views/templates/active_admin/dashboard/index.html.arb +1 -0
  174. data/lib/active_admin/views/templates/active_admin/devise/mailer/reset_password_instructions.html.erb +8 -0
  175. data/lib/active_admin/views/templates/active_admin/devise/mailer/unlock_instructions.html.erb +7 -0
  176. data/lib/active_admin/views/templates/active_admin/devise/passwords/edit.html.erb +16 -0
  177. data/lib/active_admin/views/templates/active_admin/devise/passwords/new.html.erb +14 -0
  178. data/lib/active_admin/views/templates/active_admin/devise/sessions/new.html.erb +18 -0
  179. data/lib/active_admin/views/templates/active_admin/devise/shared/_links.erb +20 -0
  180. data/lib/active_admin/views/templates/active_admin/devise/unlocks/new.html.erb +12 -0
  181. data/lib/active_admin/views/templates/active_admin/resource/edit.html.arb +1 -0
  182. data/lib/active_admin/views/templates/active_admin/resource/index.csv.erb +20 -0
  183. data/lib/active_admin/views/templates/active_admin/resource/index.html.arb +1 -0
  184. data/lib/active_admin/views/templates/active_admin/resource/new.html.arb +1 -0
  185. data/lib/active_admin/views/templates/active_admin/resource/show.html.arb +1 -0
  186. data/lib/active_admin/views/templates/layouts/active_admin.html.erb +39 -0
  187. data/lib/active_admin/views/templates/layouts/active_admin_logged_out.html.erb +31 -0
  188. data/lib/active_admin/views.rb +8 -0
  189. data/lib/active_admin.rb +71 -0
  190. data/lib/activeadmin.rb +1 -0
  191. data/lib/generators/active_admin/devise/devise_generator.rb +49 -0
  192. data/lib/generators/active_admin/install/install_generator.rb +46 -0
  193. data/lib/generators/active_admin/install/templates/active_admin.js +51 -0
  194. data/lib/generators/active_admin/install/templates/active_admin.rb.erb +78 -0
  195. data/lib/generators/active_admin/install/templates/active_admin_vendor.js +382 -0
  196. data/lib/generators/active_admin/install/templates/dashboards.rb +38 -0
  197. data/lib/generators/active_admin/install/templates/images/admin_notes_icon.png +0 -0
  198. data/lib/generators/active_admin/install/templates/images/loading.gif +0 -0
  199. data/lib/generators/active_admin/install/templates/images/nested_menu_arrow.gif +0 -0
  200. data/lib/generators/active_admin/install/templates/images/nested_menu_arrow_dark.gif +0 -0
  201. data/lib/generators/active_admin/install/templates/images/orderable.png +0 -0
  202. data/lib/generators/active_admin/install/templates/migrations/1_create_admin_notes.rb +16 -0
  203. data/lib/generators/active_admin/install/templates/migrations/2_move_admin_notes_to_comments.rb +25 -0
  204. data/lib/generators/active_admin/resource/resource_generator.rb +16 -0
  205. data/lib/generators/active_admin/resource/templates/admin.rb +3 -0
  206. data/spec/integration/belongs_to_spec.rb +42 -0
  207. data/spec/spec_helper.rb +156 -0
  208. data/spec/support/integration_example_group.rb +33 -0
  209. data/spec/support/rails_template.rb +32 -0
  210. data/spec/support/rails_template_with_data.rb +32 -0
  211. data/spec/support/templates/cucumber.rb +24 -0
  212. data/spec/unit/abstract_view_factory_spec.rb +79 -0
  213. data/spec/unit/action_builder_spec.rb +88 -0
  214. data/spec/unit/action_items_spec.rb +27 -0
  215. data/spec/unit/application_spec.rb +67 -0
  216. data/spec/unit/arbre/html/element_finder_methods_spec.rb +54 -0
  217. data/spec/unit/arbre/html/element_spec.rb +224 -0
  218. data/spec/unit/arbre/html/tag_attributes_spec.rb +61 -0
  219. data/spec/unit/arbre/html/tag_spec.rb +63 -0
  220. data/spec/unit/arbre/html_spec.rb +210 -0
  221. data/spec/unit/asset_registration_spec.rb +37 -0
  222. data/spec/unit/auto_link_spec.rb +39 -0
  223. data/spec/unit/belongs_to_spec.rb +45 -0
  224. data/spec/unit/breadcrumbs_spec.rb +110 -0
  225. data/spec/unit/comments_spec.rb +57 -0
  226. data/spec/unit/component_spec.rb +18 -0
  227. data/spec/unit/components/attributes_table_spec.rb +100 -0
  228. data/spec/unit/components/columns_spec.rb +75 -0
  229. data/spec/unit/components/panel_spec.rb +31 -0
  230. data/spec/unit/components/sidebar_section_spec.rb +37 -0
  231. data/spec/unit/components/status_tag_spec.rb +81 -0
  232. data/spec/unit/components/table_for_spec.rb +130 -0
  233. data/spec/unit/controller_filters_spec.rb +27 -0
  234. data/spec/unit/csv_builder_spec.rb +83 -0
  235. data/spec/unit/dashboard_controller_spec.rb +26 -0
  236. data/spec/unit/dashboard_section_spec.rb +56 -0
  237. data/spec/unit/dashboards_spec.rb +59 -0
  238. data/spec/unit/display_name_spec.rb +29 -0
  239. data/spec/unit/event_spec.rb +41 -0
  240. data/spec/unit/filter_form_builder_spec.rb +179 -0
  241. data/spec/unit/form_builder_spec.rb +238 -0
  242. data/spec/unit/menu_item_spec.rb +143 -0
  243. data/spec/unit/menu_spec.rb +53 -0
  244. data/spec/unit/namespace_spec.rb +203 -0
  245. data/spec/unit/pretty_format_spec.rb +35 -0
  246. data/spec/unit/registration_spec.rb +76 -0
  247. data/spec/unit/renderer_spec.rb +108 -0
  248. data/spec/unit/resource_controller/collection_spec.rb +34 -0
  249. data/spec/unit/resource_controller_spec.rb +147 -0
  250. data/spec/unit/resource_spec.rb +290 -0
  251. data/spec/unit/routing_spec.rb +88 -0
  252. data/spec/unit/scope_spec.rb +31 -0
  253. data/spec/unit/tabs_renderer_spec.rb +85 -0
  254. data/spec/unit/view_factory_spec.rb +16 -0
  255. metadata +482 -0
@@ -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
@@ -0,0 +1,37 @@
1
+ require 'active_admin/helpers/optional_display'
2
+
3
+ module ActiveAdmin
4
+ module ActionItems
5
+ extend ActiveSupport::Concern
6
+
7
+ included do
8
+ self.class_inheritable_accessor :action_items
9
+ self.action_items = []
10
+ end
11
+
12
+ module ClassMethods
13
+ def action_item(options = {}, &block)
14
+ self.action_items << ActiveAdmin::ActionItems::ActionItem.new(options, &block)
15
+ end
16
+
17
+ def clear_action_items!
18
+ self.action_items = []
19
+ end
20
+
21
+ def action_items_for(action)
22
+ action_items.select{|item| item.display_on?(action) }
23
+ end
24
+ end
25
+
26
+ class ActionItem
27
+ include ActiveAdmin::OptionalDisplay
28
+
29
+ attr_accessor :block
30
+
31
+ def initialize(options = {}, &block)
32
+ @options, @block = options, block
33
+ normalize_display_options!
34
+ end
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,204 @@
1
+ require 'active_admin/router'
2
+
3
+ module ActiveAdmin
4
+ class Application
5
+
6
+ # The default namespace to put controllers and routes inside. Set this
7
+ # in config/initializers/active_admin.rb using:
8
+ #
9
+ # config.default_namespace = :super_admin
10
+ #
11
+ attr_accessor_with_default :default_namespace, :admin
12
+
13
+ # The default number of resources to display on index pages
14
+ attr_accessor_with_default :default_per_page, 30
15
+
16
+ # The default sort order for index pages
17
+ attr_accessor_with_default :default_sort_order, 'id_desc'
18
+
19
+ # A hash of all the registered namespaces
20
+ attr_accessor_with_default :namespaces, {}
21
+
22
+ # The title which gets displayed in the main layout
23
+ attr_accessor_with_default :site_title, ""
24
+
25
+ # Load paths for admin configurations. Add folders to this load path
26
+ # to load up other resources for administration. External gems can
27
+ # include their paths in this load path to provide active_admin UIs
28
+ attr_accessor_with_default :load_paths, [File.expand_path('app/admin', Rails.root)]
29
+
30
+ # The view factory to use to generate all the view classes. Take
31
+ # a look at ActiveAdmin::ViewFactory
32
+ attr_accessor_with_default :view_factory, ActiveAdmin::ViewFactory.new
33
+
34
+ # DEPRECATED: This option is deprecated and will be removed. Use
35
+ # the #allow_comments_in option instead
36
+ attr_accessor :admin_notes
37
+
38
+ # The method to call in controllers to get the current user
39
+ attr_accessor_with_default :current_user_method, false
40
+
41
+ # The method to call in the controllers to ensure that there
42
+ # is a currently authenticated admin user
43
+ attr_accessor_with_default :authentication_method, false
44
+
45
+ # Active Admin makes educated guesses when displaying objects, this is
46
+ # the list of methods it tries calling in order
47
+ attr_accessor_with_default :display_name_methods, [ :display_name,
48
+ :full_name,
49
+ :name,
50
+ :username,
51
+ :login,
52
+ :title,
53
+ :email,
54
+ :to_s ]
55
+
56
+ attr_accessor_with_default :views_path, File.expand_path('../views/templates', __FILE__)
57
+
58
+ include AssetRegistration
59
+
60
+ def initialize
61
+ register_default_assets
62
+ end
63
+
64
+ def prepare!
65
+ remove_active_admin_load_paths_from_rails_autoload_and_eager_load
66
+ append_active_admin_views_path
67
+ generate_stylesheets
68
+ end
69
+
70
+ # Registers a brand new configuration for the given resource.
71
+ def register(resource, options = {}, &block)
72
+ namespace_name = options[:namespace] == false ? :root : (options[:namespace] || default_namespace || :root)
73
+ namespace = find_or_create_namespace(namespace_name)
74
+ namespace.register(resource, options, &block)
75
+ end
76
+
77
+ # Creates a namespace for the given name
78
+ def find_or_create_namespace(name)
79
+ return namespaces[name] if namespaces[name]
80
+ namespace = Namespace.new(self, name)
81
+ ActiveAdmin::Event.dispatch ActiveAdmin::Namespace::RegisterEvent, namespace
82
+ namespaces[name] = namespace
83
+ namespace
84
+ end
85
+
86
+
87
+ # Stores if everything has been loaded or we need to reload
88
+ @@loaded = false
89
+
90
+ # Returns true if all the configuration files have been loaded.
91
+ def loaded?
92
+ @@loaded
93
+ end
94
+
95
+ # Removes all the controllers that were defined by registering
96
+ # resources for administration.
97
+ #
98
+ # We remove them, then load them on each request in development
99
+ # to allow for changes without having to restart the server.
100
+ def unload!
101
+ namespaces.values.each{|namespace| namespace.unload! }
102
+ self.namespaces = {}
103
+ @@loaded = false
104
+ end
105
+
106
+ # Loads all of the ruby files that are within the load path of
107
+ # ActiveAdmin.load_paths. This should load all of the administration
108
+ # UIs so that they are available for the router to proceed.
109
+ #
110
+ # The files are only loaded if we haven't already loaded all the files
111
+ # and they aren't marked for re-loading. To mark the files for re-loading
112
+ # you must first call ActiveAdmin.unload!
113
+ def load!
114
+ # No work to do if we've already loaded
115
+ return false if loaded?
116
+
117
+ # Load files
118
+ files_in_load_path.each{|file| load file }
119
+
120
+ # If no configurations, let's make sure you can still login
121
+ load_default_namespace if namespaces.values.empty?
122
+
123
+ # Load Menus
124
+ namespaces.values.each{|namespace| namespace.load_menu! }
125
+
126
+ @@loaded = true
127
+ end
128
+
129
+ # Returns ALL the files to load from all the load paths
130
+ def files_in_load_path
131
+ load_paths.flatten.compact.uniq.collect{|path| Dir["#{path}/**/*.rb"] }.flatten
132
+ end
133
+
134
+ def router
135
+ @router ||= Router.new(self)
136
+ end
137
+
138
+ def routes(rails_router)
139
+ # Ensure that all the configurations (which define the routes)
140
+ # are all loaded
141
+ load!
142
+
143
+ router.apply(rails_router)
144
+ end
145
+
146
+ def load_default_namespace
147
+ find_or_create_namespace(default_namespace)
148
+ end
149
+
150
+ #
151
+ # Add before, around and after filters to each registered resource.
152
+ #
153
+ # eg:
154
+ #
155
+ # ActiveAdmin.before_filter :authenticate_admin!
156
+ #
157
+ def before_filter(*args, &block)
158
+ ResourceController.before_filter(*args, &block)
159
+ end
160
+
161
+ def after_filter(*args, &block)
162
+ ResourceController.after_filter(*args, &block)
163
+ end
164
+
165
+ def around_filter(*args, &block)
166
+ ResourceController.around_filter(*args, &block)
167
+ end
168
+
169
+ # Helper method to add a dashboard section
170
+ def dashboard_section(name, options = {}, &block)
171
+ ActiveAdmin::Dashboards.add_section(name, options, &block)
172
+ end
173
+
174
+ private
175
+
176
+ def register_default_assets
177
+ register_stylesheet 'admin/active_admin.css'
178
+ register_javascript 'active_admin_vendor.js'
179
+ register_javascript 'active_admin.js'
180
+ end
181
+
182
+ # Since we're dealing with all our own file loading, we need
183
+ # to remove our paths from the ActiveSupport autoload paths.
184
+ # If not, file naming becomes very important and can cause clashes.
185
+ def remove_active_admin_load_paths_from_rails_autoload_and_eager_load
186
+ ActiveSupport::Dependencies.autoload_paths.reject!{|path| load_paths.include?(path) }
187
+ # Don't eagerload our configs, we'll deal with them ourselves
188
+ Rails.application.config.eager_load_paths = Rails.application.config.eager_load_paths.reject do |path|
189
+ load_paths.include?(path)
190
+ end
191
+ end
192
+
193
+ # Add the Active Admin view path to the rails view path
194
+ def append_active_admin_views_path
195
+ ActionController::Base.append_view_path views_path
196
+ end
197
+
198
+ def generate_stylesheets
199
+ # Setup SASS
200
+ require 'sass/plugin' # This must be required after initialization
201
+ Sass::Plugin.add_template_location(File.expand_path("../active_admin/stylesheets/", __FILE__), File.join(Sass::Plugin.options[:css_location], 'admin'))
202
+ end
203
+ end
204
+ end
@@ -0,0 +1,20 @@
1
+ module Arbre
2
+ module HTML
3
+
4
+ class Attributes < Hash
5
+
6
+ def to_html
7
+ self.collect do |name, value|
8
+ "#{html_escape(name)}=\"#{html_escape(value)}\""
9
+ end.join(" ")
10
+ end
11
+
12
+ protected
13
+
14
+ def html_escape(s)
15
+ ERB::Util.html_escape(s)
16
+ end
17
+ end
18
+
19
+ end
20
+ end
@@ -0,0 +1,28 @@
1
+ require 'set'
2
+
3
+ module Arbre
4
+ module HTML
5
+
6
+ # Holds a set of classes
7
+ class ClassList < Set
8
+
9
+ def add(class_names)
10
+ class_names.to_s.split(" ").each do |class_name|
11
+ super(class_name)
12
+ end
13
+ self
14
+ end
15
+ alias :<< :add
16
+
17
+ def to_s
18
+ to_html
19
+ end
20
+
21
+ def to_html
22
+ to_a.join(" ")
23
+ end
24
+
25
+ end
26
+
27
+ end
28
+ end
@@ -0,0 +1,27 @@
1
+ module Arbre
2
+ module HTML
3
+
4
+ # Stores a collection of Element objects
5
+ class Collection < Array
6
+
7
+ def +(other)
8
+ self.class.new(super)
9
+ end
10
+
11
+ def -(other)
12
+ self.class.new(super)
13
+ end
14
+
15
+ def &(other)
16
+ self.class.new(super)
17
+ end
18
+
19
+ def to_html
20
+ self.collect do |element|
21
+ element.to_html
22
+ end.join.html_safe
23
+ end
24
+ end
25
+
26
+ end
27
+ end
@@ -0,0 +1,8 @@
1
+ module Arbre
2
+ class Context < Arbre::HTML::Element
3
+ def indent_level
4
+ # A context does not increment the indent_level
5
+ super - 1
6
+ end
7
+ end
8
+ end
@@ -0,0 +1,5 @@
1
+ class Object
2
+ def to_html
3
+ to_s
4
+ end
5
+ end
@@ -0,0 +1,42 @@
1
+ module Arbre
2
+ module HTML
3
+
4
+ class Document < Tag
5
+
6
+ def build(*args)
7
+ super
8
+ build_head
9
+ build_body
10
+ end
11
+
12
+ def document
13
+ self
14
+ end
15
+
16
+ def tag_name
17
+ 'html'
18
+ end
19
+
20
+ def doctype
21
+ '<!DOCTYPE html>'.html_safe
22
+ end
23
+
24
+ def to_html
25
+ doctype + super
26
+ end
27
+
28
+ protected
29
+
30
+ def build_head
31
+ @head = head do
32
+ meta :"http-equiv" => "Content-type", :content => "text/html; charset=utf-8"
33
+ end
34
+ end
35
+
36
+ def build_body
37
+ @body = body
38
+ end
39
+ end
40
+
41
+ end
42
+ end
@@ -0,0 +1,151 @@
1
+ module Arbre
2
+ module HTML
3
+
4
+ class Element
5
+ include ::Arbre::HTML
6
+ include ::Arbre::HTML::BuilderMethods
7
+
8
+ attr_accessor :parent
9
+ attr_reader :children
10
+
11
+ def self.builder_method(method_name)
12
+ ::Arbre::HTML::BuilderMethods.class_eval <<-EOF, __FILE__, __LINE__
13
+ def #{method_name}(*args, &block)
14
+ insert_tag #{self.name}, *args, &block
15
+ end
16
+ EOF
17
+ end
18
+
19
+ def initialize(assigns = {}, helpers = nil)
20
+ @_assigns, @_helpers = assigns, helpers
21
+ @children = Collection.new
22
+ end
23
+
24
+ def assigns
25
+ @_assigns
26
+ end
27
+
28
+ def helpers
29
+ @_helpers
30
+ end
31
+
32
+ def tag_name
33
+ @tag_name ||= self.class.name.demodulize.downcase
34
+ end
35
+
36
+ def build(*args, &block)
37
+ # Render the block passing ourselves in
38
+ insert_text_node_if_string(block.call(self)) if block
39
+ end
40
+
41
+ def add_child(child)
42
+ return unless child
43
+
44
+ if child.is_a?(Array)
45
+ child.each{|item| add_child(item) }
46
+ return @children
47
+ end
48
+
49
+ # If its not an element, wrap it in a TextNode
50
+ unless child.is_a?(Element)
51
+ child = TextNode.from_string(child)
52
+ end
53
+
54
+ if child.respond_to?(:parent)
55
+ # Remove the child
56
+ child.parent.remove_child(child) if child.parent
57
+ # Set ourselves as the parent
58
+ child.parent = self
59
+ end
60
+
61
+ @children << child
62
+ end
63
+
64
+ def remove_child(child)
65
+ child.parent = nil if child.respond_to?(:parent=)
66
+ @children.delete(child)
67
+ end
68
+
69
+ def <<(child)
70
+ add_child(child)
71
+ end
72
+
73
+ def parent=(parent)
74
+ @parent = parent
75
+ end
76
+
77
+ def parent?
78
+ !@parent.nil?
79
+ end
80
+
81
+ def document
82
+ parent.document if parent?
83
+ end
84
+
85
+ def content=(contents)
86
+ clear_children!
87
+ add_child(contents)
88
+ end
89
+
90
+ def get_elements_by_tag_name(tag_name)
91
+ elements = Collection.new
92
+ children.each do |child|
93
+ elements << child if child.tag_name == tag_name
94
+ elements.concat(child.get_elements_by_tag_name(tag_name))
95
+ end
96
+ elements
97
+ end
98
+ alias_method :find_by_tag, :get_elements_by_tag_name
99
+
100
+ def content
101
+ children.to_html
102
+ end
103
+
104
+ def html_safe
105
+ to_html
106
+ end
107
+
108
+ def indent_level
109
+ parent? ? parent.indent_level + 1 : 0
110
+ end
111
+
112
+ def each(&block)
113
+ [to_html].each(&block)
114
+ end
115
+
116
+ def to_s
117
+ to_html
118
+ end
119
+
120
+ def to_str
121
+ to_s
122
+ end
123
+
124
+ def to_html
125
+ content
126
+ end
127
+
128
+ def +(element)
129
+ case element
130
+ when Element, Collection
131
+ else
132
+ element = TextNode.from_string(element)
133
+ end
134
+ Collection.new([self]) + element
135
+ end
136
+
137
+ def to_ary
138
+ Collection.new [self]
139
+ end
140
+ alias_method :to_a, :to_ary
141
+
142
+ private
143
+
144
+ # Resets the Elements children
145
+ def clear_children!
146
+ @children.clear
147
+ end
148
+ end
149
+
150
+ end
151
+ end
@@ -0,0 +1,84 @@
1
+ module Arbre
2
+ module HTML
3
+ def current_dom_context
4
+ @__current_dom_element__ ||= Arbre::Context.new(assigns, helpers)
5
+ @__current_dom_element__.current_dom_context
6
+ end
7
+
8
+ def helpers
9
+ @_helpers
10
+ end
11
+
12
+ def method_missing(name, *args, &block)
13
+ if current_dom_context.respond_to?(name)
14
+ current_dom_context.send name, *args, &block
15
+ elsif assigns && assigns.has_key?(name)
16
+ assigns[name]
17
+ elsif helpers.respond_to?(name)
18
+ helpers.send(name, *args, &block)
19
+ else
20
+ super
21
+ end
22
+ end
23
+
24
+ module BuilderMethods
25
+ def build_tag(klass, *args, &block)
26
+ tag = klass.new(assigns, helpers)
27
+
28
+ # If you passed in a block and want the object
29
+ if block_given? && block.arity > 0
30
+ # Set out context to the tag, and pass responsibility to the tag
31
+ with_current_dom_context tag do
32
+ tag.build(*args, &block)
33
+ end
34
+ else
35
+ # Build the tag
36
+ tag.build(*args)
37
+
38
+ # Render the blocks contents
39
+ if block_given?
40
+ with_current_dom_context tag do
41
+ insert_text_node_if_string(yield)
42
+ end
43
+ end
44
+ end
45
+
46
+ tag
47
+ end
48
+
49
+ def insert_tag(klass, *args, &block)
50
+ tag = build_tag(klass, *args, &block)
51
+ current_dom_context.add_child(tag)
52
+ tag
53
+ end
54
+
55
+ def current_dom_context
56
+ @__current_dom_element_buffer__ ||= [self]
57
+ current_element = @__current_dom_element_buffer__.last
58
+ if current_element == self
59
+ self
60
+ else
61
+ current_element.current_dom_context
62
+ end
63
+ end
64
+
65
+ def with_current_dom_context(tag)
66
+ raise ArgumentError, "Can't be in the context of nil. #{@__current_dom_element_buffer__.inspect}" unless tag
67
+ current_dom_context # Ensure a context is setup
68
+ @__current_dom_element_buffer__.push tag
69
+ yield
70
+ @__current_dom_element_buffer__.pop
71
+ end
72
+ alias_method :within, :with_current_dom_context
73
+
74
+ # Inserts a text node if the tag is a string
75
+ def insert_text_node_if_string(tag)
76
+ if tag.is_a?(String)
77
+ current_dom_context << TextNode.from_string(tag)
78
+ end
79
+ end
80
+ end
81
+
82
+ end
83
+ end
84
+