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,8 @@
1
+ module ActiveAdmin
2
+ module Views
3
+
4
+ # Loads all the classes in views/*.rb
5
+ Dir[File.expand_path('../views', __FILE__) + "/**/*.rb"].sort.each{ |f| require f }
6
+
7
+ end
8
+ end
@@ -0,0 +1,17 @@
1
+ module ActiveAdmin
2
+ module Views
3
+
4
+ class ActionItems < ActiveAdmin::Component
5
+
6
+ def build(action_items)
7
+ action_items.each do |action_item|
8
+ span :class => "action_item" do
9
+ instance_eval(&action_item.block)
10
+ end
11
+ end
12
+ end
13
+
14
+ end
15
+
16
+ end
17
+ end
@@ -0,0 +1,66 @@
1
+ module ActiveAdmin
2
+ module Views
3
+
4
+ class AttributesTable < ActiveAdmin::Component
5
+ builder_method :attributes_table_for
6
+
7
+ attr_reader :resource
8
+
9
+ def build(record, *attrs)
10
+ @record = record
11
+ super(:for => @record)
12
+ @table = table
13
+ rows(*attrs)
14
+ end
15
+
16
+ def rows(*attrs)
17
+ attrs.each {|attr| row(attr) }
18
+ end
19
+
20
+ def row(attr, &block)
21
+ @table << tr do
22
+ th do
23
+ header_content_for(attr)
24
+ end
25
+ td do
26
+ content_for(block || attr)
27
+ end
28
+ end
29
+ end
30
+
31
+ protected
32
+
33
+ def default_id_for_prefix
34
+ 'attributes_table'
35
+ end
36
+
37
+ def header_content_for(attr)
38
+ attr.to_s.titleize
39
+ end
40
+
41
+ def empty_value
42
+ span "Empty", :class => "empty"
43
+ end
44
+
45
+ def content_for(attr_or_proc)
46
+ value = case attr_or_proc
47
+ when Proc
48
+ attr_or_proc.call
49
+ else
50
+ content_for_attribute(attr_or_proc)
51
+ end
52
+ value = pretty_format(value)
53
+ value == "" || value == nil ? empty_value : value
54
+ end
55
+
56
+ def content_for_attribute(attr)
57
+ if attr.to_s =~ /^([\w]+)_id$/ && @record.respond_to?($1.to_sym)
58
+ content_for_attribute($1)
59
+ else
60
+ @record.send(attr.to_sym)
61
+ end
62
+ end
63
+ end
64
+
65
+ end
66
+ end
@@ -0,0 +1,49 @@
1
+ module ActiveAdmin
2
+ module Views
3
+
4
+ class Columns < ActiveAdmin::Component
5
+ builder_method :columns
6
+
7
+ def column(*args, &block)
8
+ insert_tag Column, *args, &block
9
+ end
10
+
11
+ # Override add child to set widths
12
+ def add_child(*)
13
+ super
14
+ calculate_columns!
15
+ end
16
+
17
+ protected
18
+
19
+ def margin_size
20
+ 2
21
+ end
22
+
23
+ def calculate_columns!
24
+ # Calculate our columns sizes and margins
25
+ count = children.size
26
+ margins_width = margin_size * (count - 1)
27
+ column_width = (100.00 - margins_width) / count
28
+
29
+ # Convert to an integer if its not a float
30
+ column_width = column_width.to_i == column_width ? column_width.to_i : column_width
31
+
32
+ children.each_with_index do |col, i|
33
+ col.set_attribute :style, "width: #{column_width}%;"
34
+ col.attr(:style) << " margin-right: #{margin_size}%;" unless i == (count - 1)
35
+ end
36
+ end
37
+
38
+ def to_html
39
+ html = super
40
+ p html
41
+ html.to_s + "<div style=\"clear:both;\"></div>".html_safe
42
+ end
43
+
44
+ end
45
+
46
+ class Column < ActiveAdmin::Component
47
+ end
48
+ end
49
+ end
@@ -0,0 +1,74 @@
1
+ module ActiveAdmin
2
+ module Views
3
+
4
+ # Wraps the content with pagination and available formats.
5
+ #
6
+ # *Example:*
7
+ #
8
+ # paginated_collection collection, :entry_name => "Post" do
9
+ # div do
10
+ # h2 "Inside the
11
+ # end
12
+ # end
13
+ #
14
+ # This will create a div with a sentence describing the number of
15
+ # posts in one of the following formats:
16
+ #
17
+ # * "No Posts found"
18
+ # * "Displaying all 10 Posts"
19
+ # * "Displaying Posts 1 - 30 of 31 in total"
20
+ #
21
+ # It will also generate pagination links.
22
+ #
23
+ class PaginatedCollection < ActiveAdmin::Component
24
+ builder_method :paginated_collection
25
+
26
+
27
+ # Builds a new paginated collection component
28
+ #
29
+ # @param [Array] collection A "paginated" collection from will_paginate
30
+ # @param [Hash] options These options will be passed on to the page_entries_info
31
+ # method supplied in will_paginate.
32
+ # Useful keys:
33
+ # :entry_name - The name to dislpay for this resource collection
34
+ def build(collection, options = {})
35
+ @collection = collection
36
+ div(page_entries_info(@collection, options), :class => "pagination_information")
37
+ @contents = div(:class => "paginated_collection_contents")
38
+ build_pagination_with_formats
39
+ @built = true
40
+ end
41
+
42
+ # Override add_child to insert all children into the @contents div
43
+ def add_child(*args, &block)
44
+ if @built
45
+ @contents.add_child(*args, &block)
46
+ else
47
+ super
48
+ end
49
+ end
50
+
51
+ protected
52
+
53
+ def build_pagination_with_formats
54
+ div :id => "index_footer" do
55
+ build_download_format_links
56
+ build_pagination
57
+ end
58
+ end
59
+
60
+ def build_pagination
61
+ text_node will_paginate(collection, :previous_label => "Previous", :next_label => "Next")
62
+ end
63
+
64
+ # TODO: Refactor to new HTML DSL
65
+ def build_download_format_links(formats = [:csv, :xml, :json])
66
+ links = formats.collect do |format|
67
+ link_to format.to_s.upcase, { :format => format}.merge(request.query_parameters.except(:commit, :format))
68
+ end
69
+ text_node ["Download:", links].flatten.join("&nbsp;").html_safe
70
+ end
71
+
72
+ end
73
+ end
74
+ end
@@ -0,0 +1,26 @@
1
+ module ActiveAdmin
2
+ module Views
3
+
4
+ class Panel < ActiveAdmin::Component
5
+ builder_method :panel
6
+
7
+ def build(title, attributes = {})
8
+ icon_name = attributes.delete(:icon)
9
+ icn = icon_name ? icon(icon_name) : ""
10
+ super(attributes)
11
+ add_class "panel"
12
+ @title = h3(icn + title.to_s)
13
+ @contents = div(:class => "panel_contents")
14
+ end
15
+
16
+ def add_child(child)
17
+ if @contents
18
+ @contents << child
19
+ else
20
+ super
21
+ end
22
+ end
23
+ end
24
+
25
+ end
26
+ end
@@ -0,0 +1,64 @@
1
+ module ActiveAdmin
2
+ module Views
3
+
4
+ # Renders a collection of ActiveAdmin::Scope objects as a
5
+ # simple list with a seperator
6
+ class Scopes < ActiveAdmin::Component
7
+ builder_method :scopes_renderer
8
+
9
+ def build(scopes)
10
+ scopes.each do |scope|
11
+ build_scope(scope)
12
+ end
13
+ end
14
+
15
+ protected
16
+
17
+ def build_scope(scope)
18
+ span :class => classes_for_scope(scope) do
19
+ if current_scope?(scope)
20
+ em(scope.name)
21
+ else
22
+ a(scope.name, :href => url_for(params.merge(:scope => scope.id, :page => 1)))
23
+ end
24
+ text_node(" ")
25
+ scope_count(scope)
26
+ text_node(" ")
27
+ end
28
+ end
29
+
30
+ def classes_for_scope(scope)
31
+ classes = ["scope", scope.id]
32
+ classes << "selected" if current_scope?(scope)
33
+ classes.join(" ")
34
+ end
35
+
36
+ def current_scope?(scope)
37
+ if params[:scope]
38
+ params[:scope] == scope.id
39
+ else
40
+ active_admin_config.default_scope == scope
41
+ end
42
+ end
43
+
44
+ def scope_count(scope)
45
+ span :class => 'count' do
46
+ "(" + get_scope_count(scope).to_s + ")"
47
+ end
48
+ end
49
+
50
+ def get_scope_count(scope)
51
+ if scope.scope_method
52
+ scoping_class.send(scope.scope_method).count
53
+ else
54
+ instance_exec(scoping_class, &scope.scope_block).count
55
+ end
56
+ end
57
+
58
+ def scoping_class
59
+ assigns["before_scope_collection"] || active_admin_config.resource
60
+ end
61
+
62
+ end
63
+ end
64
+ end
@@ -0,0 +1,30 @@
1
+ module ActiveAdmin
2
+ module Views
3
+
4
+ class SidebarSection < Panel
5
+ builder_method :sidebar_section
6
+
7
+ # Takes a ActiveAdmin::Sidebar::Section instance
8
+ def build(section)
9
+ @section = section
10
+ super(@section.title, :icon => @section.icon)
11
+ self.id = @section.id
12
+ build_sidebar_content
13
+ end
14
+
15
+ protected
16
+
17
+ def build_sidebar_content
18
+ if @section.block
19
+ rvalue = instance_eval(&@section.block)
20
+ self << rvalue if rvalue.is_a?(String)
21
+ else
22
+ self << capture do
23
+ render @section.partial_name
24
+ end
25
+ end
26
+ end
27
+ end
28
+
29
+ end
30
+ end
@@ -0,0 +1,174 @@
1
+ module ActiveAdmin
2
+ module Views
3
+ class TableFor < Arbre::HTML::Table
4
+ builder_method :table_for
5
+
6
+ def tag_name
7
+ 'table'
8
+ end
9
+
10
+ def build(collection, options = {})
11
+ @sortable = options.delete(:sortable)
12
+ @collection = collection
13
+ @columns = []
14
+ build_table
15
+ super(options)
16
+ end
17
+
18
+ def column(*args, &block)
19
+ col = Column.new(*args, &block)
20
+ @columns << col
21
+
22
+ # Build our header item
23
+ within @header_row do
24
+ build_table_header(col)
25
+ end
26
+
27
+ # Add a table cell for each item
28
+ @collection.each_with_index do |item, i|
29
+ within @tbody.children[i] do
30
+ build_table_cell(col, item)
31
+ end
32
+ end
33
+ end
34
+
35
+ def sortable?
36
+ @sortable
37
+ end
38
+
39
+ # Returns the columns to display based on the conditional block
40
+ def visible_columns
41
+ @visible_columns ||= @columns.select{|col| col.display_column? }
42
+ end
43
+
44
+ protected
45
+
46
+ def build_table
47
+ build_table_head
48
+ build_table_body
49
+ end
50
+
51
+ def build_table_head
52
+ @thead = thead do
53
+ @header_row = tr
54
+ end
55
+ end
56
+
57
+ def build_table_header(col)
58
+ if sortable? && col.sortable?
59
+ build_sortable_header_for(col.title, col.sort_key)
60
+ else
61
+ th(col.title)
62
+ end
63
+ end
64
+
65
+ def build_sortable_header_for(title, sort_key)
66
+ classes = Arbre::HTML::ClassList.new(["sortable"])
67
+ if current_sort[0] == sort_key
68
+ classes << "sorted-#{current_sort[1]}"
69
+ end
70
+
71
+ th :class => classes do
72
+ link_to(title, request.query_parameters.merge(:order => "#{sort_key}_#{order_for_sort_key(sort_key)}").except(:page))
73
+ end
74
+ end
75
+
76
+ def build_table_body
77
+ @tbody = tbody do
78
+ # Build enough rows for our collection
79
+ @collection.each{|_| tr(:class => cycle('odd', 'event')) }
80
+ end
81
+ end
82
+
83
+ def build_table_cell(col, item)
84
+ td do
85
+ rvalue = call_method_or_proc_on(item, col.data, :exec => false)
86
+ if col.data.is_a?(Symbol)
87
+ rvalue = pretty_format(rvalue)
88
+ end
89
+ rvalue
90
+ end
91
+ end
92
+
93
+ # Returns an array for the current sort order
94
+ # current_sort[0] #=> sort_key
95
+ # current_sort[1] #=> asc | desc
96
+ def current_sort
97
+ @current_sort ||= if params[:order] && params[:order] =~ /^([\w\_\.]+)_(desc|asc)$/
98
+ [$1,$2]
99
+ else
100
+ []
101
+ end
102
+ end
103
+
104
+ # Returns the order to use for a given sort key
105
+ #
106
+ # Default is to use 'desc'. If the current sort key is
107
+ # 'desc' it will return 'asc'
108
+ def order_for_sort_key(sort_key)
109
+ current_key, current_order = current_sort
110
+ return 'desc' unless current_key == sort_key
111
+ current_order == 'desc' ? 'asc' : 'desc'
112
+ end
113
+
114
+ class Column
115
+
116
+ attr_accessor :title, :data
117
+
118
+ def initialize(*args, &block)
119
+ @options = default_options.merge(args.last.is_a?(::Hash) ? args.pop : {})
120
+ @title = pretty_title args[0]
121
+ @data = args[1] || args[0]
122
+ @data = block if block
123
+ end
124
+
125
+ def sortable?
126
+ if @data.is_a?(Proc)
127
+ [String, Symbol].include?(@options[:sortable].class)
128
+ else
129
+ @options[:sortable]
130
+ end
131
+ end
132
+
133
+ #
134
+ # Returns the key to be used for sorting this column
135
+ #
136
+ # Defaults to the column's method if its a symbol
137
+ # column :username
138
+ # # => Sort key will be set to 'username'
139
+ #
140
+ # You can set the sort key by passing a string or symbol
141
+ # to the sortable option:
142
+ # column :username, :sortable => 'other_column_to_sort_on'
143
+ #
144
+ # If you pass a block to be rendered for this column, the column
145
+ # will not be sortable unless you pass a string to sortable to
146
+ # sort the column on:
147
+ #
148
+ # column('Username', :sortable => 'login'){ @user.pretty_name }
149
+ # # => Sort key will be 'login'
150
+ #
151
+ def sort_key
152
+ if @options[:sortable] == true || @options[:sortable] == false
153
+ @data.to_s
154
+ else
155
+ @options[:sortable].to_s
156
+ end
157
+ end
158
+
159
+ private
160
+
161
+ def pretty_title(raw)
162
+ raw.is_a?(Symbol) ? raw.to_s.titleize : raw
163
+ end
164
+
165
+ def default_options
166
+ {
167
+ :sortable => true
168
+ }
169
+ end
170
+
171
+ end
172
+ end
173
+ end
174
+ end