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,92 @@
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 kaminari
30
+ # @param [Hash] options These options will be passed on to the page_entries_info
31
+ # method.
32
+ # Useful keys:
33
+ # :entry_name - The name to display for this resource collection
34
+ def build(collection, options = {})
35
+ @collection = collection
36
+ div(page_entries_info(options).html_safe, :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 paginate(collection)
62
+ end
63
+
64
+ # TODO: Refactor to new HTML DSL
65
+ def build_download_format_links(formats = [:csv, :xml])
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 [I18n.t('active_admin.download'), links].flatten.join("&nbsp;").html_safe
70
+ end
71
+
72
+ # modified from will_paginate
73
+ def page_entries_info(options = {})
74
+ entry_name = options[:entry_name] ||
75
+ (collection.empty?? 'entry' : collection.first.class.name.underscore.sub('_', ' '))
76
+
77
+ if collection.num_pages < 2
78
+ case collection.size
79
+ when 0; I18n.t('active_admin.pagination.empty', :model => entry_name.pluralize)
80
+ when 1; I18n.t('active_admin.pagination.one', :model => entry_name)
81
+ else; I18n.t('active_admin.pagination.one_page', :model => entry_name.pluralize, :n => collection.size)
82
+ end
83
+ else
84
+ offset = collection.current_page * active_admin_application.default_per_page
85
+ total = collection.total_count
86
+ I18n.t('active_admin.pagination.multiple', :model => entry_name.pluralize, :from => (offset - active_admin_application.default_per_page + 1), :to => offset > total ? total : offset, :total => total)
87
+ end
88
+ end
89
+
90
+ end
91
+ end
92
+ 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,70 @@
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
+ begin
20
+ scope_name = I18n.t!("active_admin.scopes.#{scope.scope_method}")
21
+ rescue I18n::MissingTranslationData
22
+ scope_name = scope.name
23
+ end
24
+
25
+ if current_scope?(scope)
26
+ em(scope_name)
27
+ else
28
+ a(scope_name, :href => url_for(params.merge(:scope => scope.id, :page => 1)))
29
+ end
30
+ text_node(" ")
31
+ scope_count(scope)
32
+ text_node(" ")
33
+ end
34
+ end
35
+
36
+ def classes_for_scope(scope)
37
+ classes = ["scope", scope.id]
38
+ classes << "selected" if current_scope?(scope)
39
+ classes.join(" ")
40
+ end
41
+
42
+ def current_scope?(scope)
43
+ if params[:scope]
44
+ params[:scope] == scope.id
45
+ else
46
+ active_admin_config.default_scope == scope
47
+ end
48
+ end
49
+
50
+ def scope_count(scope)
51
+ span :class => 'count' do
52
+ "(" + get_scope_count(scope).to_s + ")"
53
+ end
54
+ end
55
+
56
+ def get_scope_count(scope)
57
+ if scope.scope_method
58
+ scoping_class.send(scope.scope_method).count
59
+ else
60
+ instance_exec(scoping_class, &scope.scope_block).count
61
+ end
62
+ end
63
+
64
+ def scoping_class
65
+ assigns["before_scope_collection"] || active_admin_config.resource
66
+ end
67
+
68
+ end
69
+ end
70
+ 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,55 @@
1
+ module ActiveAdmin
2
+ module Views
3
+ # Build a StatusTag
4
+ class StatusTag < ActiveAdmin::Component
5
+ builder_method :status_tag
6
+
7
+ def tag_name
8
+ 'span'
9
+ end
10
+
11
+ def default_class_name
12
+ 'status'
13
+ end
14
+
15
+ # @method status_tag(status, type = nil, options = {})
16
+ #
17
+ # @param [String] status the status to display. One of the span classes will be an underscored version of the status.
18
+ # @param [Symbol] type type of status. Will become a class of the span. ActiveAdmin provide style for :ok, :warning and :error.
19
+ # @param [Hash] options such as :class, :id etc
20
+ #
21
+ # @return [ActiveAdmin::Views::StatusTag]
22
+ #
23
+ # Examples:
24
+ # status_tag('In Progress')
25
+ # # => <span class='status in_progress'>In Progress</span>
26
+ #
27
+ # status_tag('active', :ok)
28
+ # # => <span class='status active ok'>Active</span>
29
+ #
30
+ # status_tag('active', :ok, :class => 'important', :id => 'status_123')
31
+ # # => <span class='status active ok important' id='status_123'>Active</span>
32
+ #
33
+ def build(*args)
34
+ options = args.extract_options!
35
+ status = args[0]
36
+ type = args[1]
37
+ classes = options.delete(:class)
38
+
39
+ status = status.titleize if status
40
+
41
+ super(status, options)
42
+
43
+ add_class(status_to_class(status)) if status
44
+ add_class(type.to_s) if type
45
+ add_class(classes) if classes
46
+ end
47
+
48
+ protected
49
+
50
+ def status_to_class(status)
51
+ status.titleize.gsub(/\s/, '').underscore
52
+ end
53
+ end
54
+ end
55
+ end
@@ -0,0 +1,193 @@
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
+ @resource_class = options.delete(:i18n)
13
+ @collection = collection
14
+ @columns = []
15
+ build_table
16
+ super(options)
17
+ end
18
+
19
+ def column(*args, &block)
20
+ options = default_options.merge(args.last.is_a?(::Hash) ? args.pop : {})
21
+ title = args[0]
22
+ data = args[1] || args[0]
23
+
24
+ col = Column.new(title, data, options, &block)
25
+ @columns << col
26
+
27
+ # Build our header item
28
+ within @header_row do
29
+ build_table_header(col)
30
+ end
31
+
32
+ # Add a table cell for each item
33
+ @collection.each_with_index do |item, i|
34
+ within @tbody.children[i] do
35
+ build_table_cell(col, item)
36
+ end
37
+ end
38
+ end
39
+
40
+ def sortable?
41
+ @sortable
42
+ end
43
+
44
+ # Returns the columns to display based on the conditional block
45
+ def visible_columns
46
+ @visible_columns ||= @columns.select{|col| col.display_column? }
47
+ end
48
+
49
+ protected
50
+
51
+ def build_table
52
+ build_table_head
53
+ build_table_body
54
+ end
55
+
56
+ def build_table_head
57
+ @thead = thead do
58
+ @header_row = tr
59
+ end
60
+ end
61
+
62
+ def build_table_header(col)
63
+ if sortable? && col.sortable?
64
+ build_sortable_header_for(col.title, col.sort_key)
65
+ else
66
+ th(col.title)
67
+ end
68
+ end
69
+
70
+ def build_sortable_header_for(title, sort_key)
71
+ classes = Arbre::HTML::ClassList.new(["sortable"])
72
+ if current_sort[0] == sort_key
73
+ classes << "sorted-#{current_sort[1]}"
74
+ end
75
+
76
+ th :class => classes do
77
+ link_to(title, params.merge(:order => "#{sort_key}_#{order_for_sort_key(sort_key)}").except(:page))
78
+ end
79
+ end
80
+
81
+ def build_table_body
82
+ @tbody = tbody do
83
+ # Build enough rows for our collection
84
+ @collection.each{|_| tr(:class => cycle('odd', 'even')) }
85
+ end
86
+ end
87
+
88
+ def build_table_cell(col, item)
89
+ td do
90
+ rvalue = call_method_or_proc_on(item, col.data, :exec => false)
91
+ if col.data.is_a?(Symbol)
92
+ rvalue = pretty_format(rvalue)
93
+ end
94
+ rvalue
95
+ end
96
+ end
97
+
98
+ # Returns an array for the current sort order
99
+ # current_sort[0] #=> sort_key
100
+ # current_sort[1] #=> asc | desc
101
+ def current_sort
102
+ @current_sort ||= if params[:order] && params[:order] =~ /^([\w\_\.]+)_(desc|asc)$/
103
+ [$1,$2]
104
+ else
105
+ []
106
+ end
107
+ end
108
+
109
+ # Returns the order to use for a given sort key
110
+ #
111
+ # Default is to use 'desc'. If the current sort key is
112
+ # 'desc' it will return 'asc'
113
+ def order_for_sort_key(sort_key)
114
+ current_key, current_order = current_sort
115
+ return 'desc' unless current_key == sort_key
116
+ current_order == 'desc' ? 'asc' : 'desc'
117
+ end
118
+
119
+ def default_options
120
+ {
121
+ :i18n => @resource_class
122
+ }
123
+ end
124
+
125
+ class Column
126
+
127
+ attr_accessor :title, :data
128
+
129
+ def initialize(*args, &block)
130
+ @options = default_options.merge(args.last.is_a?(::Hash) ? args.pop : {})
131
+ @title = pretty_title args[0]
132
+ @data = args[1] || args[0]
133
+ @data = block if block
134
+ end
135
+
136
+ def sortable?
137
+ if @data.is_a?(Proc)
138
+ [String, Symbol].include?(@options[:sortable].class)
139
+ else
140
+ @options[:sortable]
141
+ end
142
+ end
143
+
144
+ #
145
+ # Returns the key to be used for sorting this column
146
+ #
147
+ # Defaults to the column's method if its a symbol
148
+ # column :username
149
+ # # => Sort key will be set to 'username'
150
+ #
151
+ # You can set the sort key by passing a string or symbol
152
+ # to the sortable option:
153
+ # column :username, :sortable => 'other_column_to_sort_on'
154
+ #
155
+ # If you pass a block to be rendered for this column, the column
156
+ # will not be sortable unless you pass a string to sortable to
157
+ # sort the column on:
158
+ #
159
+ # column('Username', :sortable => 'login'){ @user.pretty_name }
160
+ # # => Sort key will be 'login'
161
+ #
162
+ def sort_key
163
+ if @options[:sortable] == true || @options[:sortable] == false
164
+ @data.to_s
165
+ else
166
+ @options[:sortable].to_s
167
+ end
168
+ end
169
+
170
+ private
171
+
172
+ def pretty_title(raw)
173
+ if raw.is_a?(Symbol)
174
+ if @options[:i18n] && @options[:i18n].respond_to?(:human_attribute_name) && human_name = @options[:i18n].human_attribute_name(raw)
175
+ raw = human_name
176
+ end
177
+
178
+ raw.to_s.titleize
179
+ else
180
+ raw
181
+ end
182
+ end
183
+
184
+ def default_options
185
+ {
186
+ :sortable => true
187
+ }
188
+ end
189
+
190
+ end
191
+ end
192
+ end
193
+ end
@@ -0,0 +1,19 @@
1
+ module ActiveAdmin
2
+ module Views
3
+ class DashboardSection < ActiveAdmin::Views::Panel
4
+
5
+ def build(section)
6
+ @section = section
7
+ super(title, :icon => @section.icon)
8
+ instance_eval &@section.block
9
+ end
10
+
11
+ protected
12
+
13
+ def title
14
+ @section.name.to_s.titleize
15
+ end
16
+
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,37 @@
1
+ module ActiveAdmin
2
+ module Views
3
+
4
+ # Renderer for the header of the application. Includes the page
5
+ # title, global navigation and utility navigation.
6
+ class HeaderRenderer < ::ActiveAdmin::Renderer
7
+
8
+ def to_html
9
+ title + global_navigation + utility_navigation
10
+ end
11
+
12
+ protected
13
+
14
+ def title
15
+ content_tag 'h1', active_admin_application.site_title, :id => 'site_title'
16
+ end
17
+
18
+ # Renders the global navigation returned by
19
+ # ActiveAdmin::ResourceController#current_menu
20
+ #
21
+ # It uses the ActiveAdmin.tabs_renderer option
22
+ def global_navigation
23
+ render view_factory.global_navigation, current_menu
24
+ end
25
+
26
+ def utility_navigation
27
+ content_tag 'p', :id => "utility_nav" do
28
+ if current_active_admin_user?
29
+ content_tag(:span, display_name(current_active_admin_user), :class => "current_user") +
30
+ link_to(I18n.t('active_admin.logout'), "/#{active_admin_application.default_namespace}/logout")
31
+ end
32
+ end
33
+ end
34
+ end
35
+
36
+ end
37
+ end
@@ -0,0 +1,24 @@
1
+ module ActiveAdmin
2
+ module Views
3
+
4
+ # Simplest rendering possible. Calls the block for each element in the collection.
5
+ #
6
+ # Example:
7
+ #
8
+ # ActiveAdmin.register Post do
9
+ # index :as => :block do |post|
10
+ # # render the post partial (app/views/admin/posts/_post)
11
+ # render 'post', :post => post
12
+ # end
13
+ # end
14
+ class IndexAsBlock < ActiveAdmin::Component
15
+
16
+ def build(page_config, collection)
17
+ collection.each do |obj|
18
+ instance_exec(obj, &page_config.block)
19
+ end
20
+ end
21
+
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,89 @@
1
+ module ActiveAdmin
2
+ module Views
3
+ class IndexAsBlog < ActiveAdmin::Component
4
+
5
+ def build(page_config, collection)
6
+ @page_config = page_config
7
+ @collection = collection
8
+
9
+ # Call the block passed in. This will set the
10
+ # title and body methods
11
+ instance_eval &page_config.block if page_config.block
12
+
13
+ build_posts
14
+ end
15
+
16
+ # Setter method for the configuration of the title
17
+ #
18
+ # index :as => :blog do
19
+ # title :a_method_to_call #=> Calls #a_method_to_call on the resource
20
+ #
21
+ # # OR
22
+ #
23
+ # title do |post|
24
+ # post.a_method_to_call
25
+ # end
26
+ # end
27
+ def title(method = nil, &block)
28
+ if block_given? || method
29
+ @title = block_given? ? block : method
30
+ end
31
+ @title
32
+ end
33
+
34
+ # Setter method for the configuration of the body
35
+ #
36
+ # index :as => :blog do
37
+ # title :my_title
38
+ #
39
+ # body :a_method_to_call #=> Calls #a_method_to_call on the resource
40
+ #
41
+ # # OR
42
+ #
43
+ # title do |post|
44
+ # post.a_method_to_call
45
+ # end
46
+ # end
47
+ def body(method = nil, &block)
48
+ if block_given? || method
49
+ @body = block_given? ? block : method
50
+ end
51
+ @body
52
+ end
53
+
54
+ private
55
+
56
+ def build_posts
57
+ @collection.each do |post|
58
+ build_post(post)
59
+ end
60
+ end
61
+
62
+ def build_post(post)
63
+ div :for => post do
64
+ build_title(post)
65
+ build_body(post)
66
+ end
67
+ end
68
+
69
+ def build_title(post)
70
+ if @title
71
+ h3 do
72
+ link_to(call_method_or_proc_on(post, @title), resource_path(post))
73
+ end
74
+ else
75
+ h3 do
76
+ auto_link(post)
77
+ end
78
+ end
79
+ end
80
+
81
+ def build_body(post)
82
+ if @body
83
+ div(call_method_or_proc_on(post, @body), :class => 'content')
84
+ end
85
+ end
86
+
87
+ end # Posts
88
+ end
89
+ end
@@ -0,0 +1,49 @@
1
+ module ActiveAdmin
2
+ module Views
3
+ class IndexAsGrid < ActiveAdmin::Component
4
+
5
+ def build(page_config, collection)
6
+ @page_config = page_config
7
+ @collection = collection
8
+ build_table
9
+ end
10
+
11
+ def number_of_columns
12
+ @page_config[:columns] || default_number_of_columns
13
+ end
14
+
15
+ protected
16
+
17
+ def build_table
18
+ table :class => "index_grid" do
19
+ collection.in_groups_of(number_of_columns).each do |group|
20
+ build_row(group)
21
+ end
22
+ end
23
+ end
24
+
25
+ def build_row(group)
26
+ tr do
27
+ group.each do |item|
28
+ item ? build_item(item) : build_empty_cell
29
+ end
30
+ end
31
+ end
32
+
33
+ def build_item(item)
34
+ td :for => item do
35
+ instance_exec(item, &@page_config.block)
36
+ end
37
+ end
38
+
39
+ def build_empty_cell
40
+ td '&nbsp;'.html_safe
41
+ end
42
+
43
+ def default_number_of_columns
44
+ 3
45
+ end
46
+
47
+ end
48
+ end
49
+ end