nsm-activeadmin 0.2.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (321) hide show
  1. data/.document +5 -0
  2. data/.gitignore +34 -0
  3. data/.travis.yml +4 -0
  4. data/.yardopts +8 -0
  5. data/CHANGELOG.rdoc +76 -0
  6. data/Gemfile +39 -0
  7. data/LICENSE +25 -0
  8. data/README.rdoc +487 -0
  9. data/Rakefile +27 -0
  10. data/activeadmin.gemspec +28 -0
  11. data/app/assets/images/active_admin/admin_notes_icon.png +0 -0
  12. data/app/assets/images/active_admin/datepicker/datepicker-header-bg.png +0 -0
  13. data/app/assets/images/active_admin/datepicker/datepicker-input-icon.png +0 -0
  14. data/app/assets/images/active_admin/datepicker/datepicker-next-link-icon.png +0 -0
  15. data/app/assets/images/active_admin/datepicker/datepicker-nipple.png +0 -0
  16. data/app/assets/images/active_admin/datepicker/datepicker-prev-link-icon.png +0 -0
  17. data/app/assets/images/active_admin/loading.gif +0 -0
  18. data/app/assets/images/active_admin/nested_menu_arrow.gif +0 -0
  19. data/app/assets/images/active_admin/nested_menu_arrow_dark.gif +0 -0
  20. data/app/assets/images/active_admin/orderable.png +0 -0
  21. data/app/assets/javascripts/active_admin/base.js +12 -0
  22. data/app/assets/javascripts/active_admin/vendor.js +382 -0
  23. data/app/assets/stylesheets/active_admin/_base.css.scss +400 -0
  24. data/app/assets/stylesheets/active_admin/_forms.css.scss +256 -0
  25. data/app/assets/stylesheets/active_admin/_header.css.scss +110 -0
  26. data/app/assets/stylesheets/active_admin/_mixins.css.scss +1 -0
  27. data/app/assets/stylesheets/active_admin/_typography.css.scss +100 -0
  28. data/app/assets/stylesheets/active_admin/components/_comments.css.scss +40 -0
  29. data/app/assets/stylesheets/active_admin/components/_date_picker.css.scss +123 -0
  30. data/app/assets/stylesheets/active_admin/components/_flash_messages.css.scss +38 -0
  31. data/app/assets/stylesheets/active_admin/mixins/_all.css.scss +8 -0
  32. data/app/assets/stylesheets/active_admin/mixins/_buttons.css.scss +27 -0
  33. data/app/assets/stylesheets/active_admin/mixins/_gradients.css.scss +29 -0
  34. data/app/assets/stylesheets/active_admin/mixins/_icons.css.scss +20 -0
  35. data/app/assets/stylesheets/active_admin/mixins/_reset.css.scss +165 -0
  36. data/app/assets/stylesheets/active_admin/mixins/_rounded.css.scss +43 -0
  37. data/app/assets/stylesheets/active_admin/mixins/_sections.css.scss +34 -0
  38. data/app/assets/stylesheets/active_admin/mixins/_shadows.css.scss +21 -0
  39. data/app/assets/stylesheets/active_admin/mixins/_variables.css.scss +21 -0
  40. data/app/views/active_admin/dashboard/index.html.arb +1 -0
  41. data/app/views/active_admin/devise/mailer/reset_password_instructions.html.erb +8 -0
  42. data/app/views/active_admin/devise/mailer/unlock_instructions.html.erb +7 -0
  43. data/app/views/active_admin/devise/passwords/edit.html.erb +16 -0
  44. data/app/views/active_admin/devise/passwords/new.html.erb +14 -0
  45. data/app/views/active_admin/devise/sessions/new.html.erb +18 -0
  46. data/app/views/active_admin/devise/shared/_links.erb +20 -0
  47. data/app/views/active_admin/devise/unlocks/new.html.erb +12 -0
  48. data/app/views/active_admin/resource/edit.html.arb +1 -0
  49. data/app/views/active_admin/resource/index.csv.erb +20 -0
  50. data/app/views/active_admin/resource/index.html.arb +1 -0
  51. data/app/views/active_admin/resource/new.html.arb +1 -0
  52. data/app/views/active_admin/resource/show.html.arb +1 -0
  53. data/app/views/layouts/active_admin.html.arb +1 -0
  54. data/app/views/layouts/active_admin_logged_out.html.erb +35 -0
  55. data/cucumber.yml +2 -0
  56. data/docs/1-general-configuration.md +52 -0
  57. data/docs/2-resource-customization.md +35 -0
  58. data/docs/3-index-pages.md +55 -0
  59. data/docs/3-index-pages/index-as-block.md +16 -0
  60. data/docs/3-index-pages/index-as-blog.md +61 -0
  61. data/docs/3-index-pages/index-as-grid.md +21 -0
  62. data/docs/3-index-pages/index-as-table.md +74 -0
  63. data/docs/4-csv-format.md +14 -0
  64. data/docs/5-forms.md +39 -0
  65. data/docs/6-show-screens.md +22 -0
  66. data/docs/7-sidebars.md +35 -0
  67. data/docs/8-custom-actions.md +123 -0
  68. data/features/comments/commenting.feature +112 -0
  69. data/features/comments/viewing_index.feature +19 -0
  70. data/features/dashboard.feature +26 -0
  71. data/features/edit_page.feature +106 -0
  72. data/features/first_boot.feature +16 -0
  73. data/features/global_navigation.feature +30 -0
  74. data/features/index/format_as_csv.feature +46 -0
  75. data/features/index/formats.feature +12 -0
  76. data/features/index/index_as_block.feature +15 -0
  77. data/features/index/index_as_blog.feature +50 -0
  78. data/features/index/index_as_grid.feature +45 -0
  79. data/features/index/index_as_table.feature +81 -0
  80. data/features/index/index_blank_slate.feature +55 -0
  81. data/features/index/index_scopes.feature +52 -0
  82. data/features/index/pagination.feature +17 -0
  83. data/features/menu.feature +26 -0
  84. data/features/new_page.feature +75 -0
  85. data/features/registering_assets.feature +35 -0
  86. data/features/registering_resources.feature +33 -0
  87. data/features/show/default_content.feature +43 -0
  88. data/features/show/page_title.feature +33 -0
  89. data/features/sidebar_sections.feature +127 -0
  90. data/features/specifying_actions.feature +87 -0
  91. data/features/step_definitions/action_item_steps.rb +7 -0
  92. data/features/step_definitions/additional_web_steps.rb +77 -0
  93. data/features/step_definitions/asset_steps.rb +7 -0
  94. data/features/step_definitions/attribute_steps.rb +13 -0
  95. data/features/step_definitions/comment_steps.rb +8 -0
  96. data/features/step_definitions/configuration_steps.rb +31 -0
  97. data/features/step_definitions/dashboard_steps.rb +11 -0
  98. data/features/step_definitions/factory_steps.rb +29 -0
  99. data/features/step_definitions/flash_steps.rb +3 -0
  100. data/features/step_definitions/format_steps.rb +35 -0
  101. data/features/step_definitions/index_scope_steps.rb +20 -0
  102. data/features/step_definitions/layout_steps.rb +3 -0
  103. data/features/step_definitions/menu_steps.rb +7 -0
  104. data/features/step_definitions/pagination_steps.rb +8 -0
  105. data/features/step_definitions/sidebar_steps.rb +7 -0
  106. data/features/step_definitions/tab_steps.rb +3 -0
  107. data/features/step_definitions/user_steps.rb +26 -0
  108. data/features/step_definitions/web_steps.rb +211 -0
  109. data/features/sti_resource.feature +61 -0
  110. data/features/support/env.rb +90 -0
  111. data/features/support/paths.rb +50 -0
  112. data/features/support/selectors.rb +45 -0
  113. data/features/users/logging_in.feature +34 -0
  114. data/features/users/logging_out.feature +13 -0
  115. data/lib/active_admin.rb +74 -0
  116. data/lib/active_admin/abstract_view_factory.rb +95 -0
  117. data/lib/active_admin/application.rb +228 -0
  118. data/lib/active_admin/arbre.rb +23 -0
  119. data/lib/active_admin/arbre/attributes.rb +20 -0
  120. data/lib/active_admin/arbre/class_list.rb +28 -0
  121. data/lib/active_admin/arbre/collection.rb +27 -0
  122. data/lib/active_admin/arbre/context.rb +14 -0
  123. data/lib/active_admin/arbre/core_extensions.rb +5 -0
  124. data/lib/active_admin/arbre/document.rb +42 -0
  125. data/lib/active_admin/arbre/element.rb +151 -0
  126. data/lib/active_admin/arbre/html.rb +84 -0
  127. data/lib/active_admin/arbre/html5_elements.rb +47 -0
  128. data/lib/active_admin/arbre/tag.rb +137 -0
  129. data/lib/active_admin/arbre/text_node.rb +35 -0
  130. data/lib/active_admin/asset_registration.rb +34 -0
  131. data/lib/active_admin/callbacks.rb +89 -0
  132. data/lib/active_admin/comments.rb +88 -0
  133. data/lib/active_admin/comments/comment.rb +21 -0
  134. data/lib/active_admin/comments/configuration.rb +18 -0
  135. data/lib/active_admin/comments/namespace_helper.rb +14 -0
  136. data/lib/active_admin/comments/resource_helper.rb +17 -0
  137. data/lib/active_admin/comments/show_page_helper.rb +23 -0
  138. data/lib/active_admin/comments/views.rb +3 -0
  139. data/lib/active_admin/comments/views/active_admin_comment.rb +0 -0
  140. data/lib/active_admin/comments/views/active_admin_comments.rb +82 -0
  141. data/lib/active_admin/component.rb +22 -0
  142. data/lib/active_admin/controller_action.rb +12 -0
  143. data/lib/active_admin/csv_builder.rb +45 -0
  144. data/lib/active_admin/dashboards.rb +48 -0
  145. data/lib/active_admin/dashboards/dashboard_controller.rb +38 -0
  146. data/lib/active_admin/dashboards/section.rb +34 -0
  147. data/lib/active_admin/deprecation.rb +36 -0
  148. data/lib/active_admin/devise.rb +43 -0
  149. data/lib/active_admin/dsl.rb +224 -0
  150. data/lib/active_admin/engine.rb +4 -0
  151. data/lib/active_admin/event.rb +31 -0
  152. data/lib/active_admin/form_builder.rb +109 -0
  153. data/lib/active_admin/helpers/optional_display.rb +34 -0
  154. data/lib/active_admin/helpers/settings.rb +63 -0
  155. data/lib/active_admin/iconic.rb +51 -0
  156. data/lib/active_admin/iconic/icons.rb +142 -0
  157. data/lib/active_admin/locales/da.yml +28 -0
  158. data/lib/active_admin/locales/en.yml +40 -0
  159. data/lib/active_admin/locales/es.yml +39 -0
  160. data/lib/active_admin/locales/it.yml +39 -0
  161. data/lib/active_admin/locales/pt-BR.yml +36 -0
  162. data/lib/active_admin/locales/ru.yml +40 -0
  163. data/lib/active_admin/locales/zh_cn.yml +40 -0
  164. data/lib/active_admin/menu.rb +42 -0
  165. data/lib/active_admin/menu_item.rb +73 -0
  166. data/lib/active_admin/namespace.rb +206 -0
  167. data/lib/active_admin/page_config.rb +15 -0
  168. data/lib/active_admin/reloader.rb +30 -0
  169. data/lib/active_admin/renderer.rb +87 -0
  170. data/lib/active_admin/resource.rb +151 -0
  171. data/lib/active_admin/resource/action_items.rb +88 -0
  172. data/lib/active_admin/resource/belongs_to.rb +31 -0
  173. data/lib/active_admin/resource/menu.rb +45 -0
  174. data/lib/active_admin/resource/naming.rb +36 -0
  175. data/lib/active_admin/resource/scopes.rb +33 -0
  176. data/lib/active_admin/resource/sidebars.rb +36 -0
  177. data/lib/active_admin/resource_controller.rb +103 -0
  178. data/lib/active_admin/resource_controller/action_builder.rb +21 -0
  179. data/lib/active_admin/resource_controller/actions.rb +79 -0
  180. data/lib/active_admin/resource_controller/callbacks.rb +47 -0
  181. data/lib/active_admin/resource_controller/collection.rb +144 -0
  182. data/lib/active_admin/resource_controller/filters.rb +58 -0
  183. data/lib/active_admin/resource_controller/form.rb +42 -0
  184. data/lib/active_admin/resource_controller/menu.rb +29 -0
  185. data/lib/active_admin/resource_controller/page_configurations.rb +53 -0
  186. data/lib/active_admin/resource_controller/scoping.rb +36 -0
  187. data/lib/active_admin/resource_controller/sidebars.rb +18 -0
  188. data/lib/active_admin/router.rb +85 -0
  189. data/lib/active_admin/sass/active_admin.scss +3 -0
  190. data/lib/active_admin/sass/css_loader.rb +16 -0
  191. data/lib/active_admin/sass/helpers.rb +40 -0
  192. data/lib/active_admin/scope.rb +17 -0
  193. data/lib/active_admin/sidebar_section.rb +41 -0
  194. data/lib/active_admin/stylesheets/active_admin/mixins/_utilities.scss +0 -0
  195. data/lib/active_admin/version.rb +3 -0
  196. data/lib/active_admin/view_factory.rb +23 -0
  197. data/lib/active_admin/view_helpers.rb +22 -0
  198. data/lib/active_admin/view_helpers/active_admin_application_helper.rb +12 -0
  199. data/lib/active_admin/view_helpers/assigns_with_indifferent_access_helper.rb +7 -0
  200. data/lib/active_admin/view_helpers/auto_link_helper.rb +42 -0
  201. data/lib/active_admin/view_helpers/breadcrumb_helper.rb +29 -0
  202. data/lib/active_admin/view_helpers/display_helper.rb +38 -0
  203. data/lib/active_admin/view_helpers/filter_form_helper.rb +186 -0
  204. data/lib/active_admin/view_helpers/form_helper.rb +13 -0
  205. data/lib/active_admin/view_helpers/icon_helper.rb +12 -0
  206. data/lib/active_admin/view_helpers/method_or_proc_helper.rb +26 -0
  207. data/lib/active_admin/view_helpers/renderer_helper.rb +29 -0
  208. data/lib/active_admin/view_helpers/sidebar_helper.rb +15 -0
  209. data/lib/active_admin/view_helpers/title_helper.rb +11 -0
  210. data/lib/active_admin/view_helpers/view_factory_helper.rb +11 -0
  211. data/lib/active_admin/views.rb +8 -0
  212. data/lib/active_admin/views/action_items.rb +17 -0
  213. data/lib/active_admin/views/components/attributes_table.rb +66 -0
  214. data/lib/active_admin/views/components/blank_slate.rb +33 -0
  215. data/lib/active_admin/views/components/columns.rb +47 -0
  216. data/lib/active_admin/views/components/paginated_collection.rb +92 -0
  217. data/lib/active_admin/views/components/panel.rb +26 -0
  218. data/lib/active_admin/views/components/scopes.rb +70 -0
  219. data/lib/active_admin/views/components/sidebar_section.rb +28 -0
  220. data/lib/active_admin/views/components/status_tag.rb +55 -0
  221. data/lib/active_admin/views/components/table_for.rb +193 -0
  222. data/lib/active_admin/views/dashboard_section_renderer.rb +19 -0
  223. data/lib/active_admin/views/header_renderer.rb +53 -0
  224. data/lib/active_admin/views/index_as_block.rb +29 -0
  225. data/lib/active_admin/views/index_as_blog.rb +129 -0
  226. data/lib/active_admin/views/index_as_grid.rb +70 -0
  227. data/lib/active_admin/views/index_as_table.rb +148 -0
  228. data/lib/active_admin/views/pages/base.rb +155 -0
  229. data/lib/active_admin/views/pages/dashboard.rb +62 -0
  230. data/lib/active_admin/views/pages/edit.rb +28 -0
  231. data/lib/active_admin/views/pages/index.rb +74 -0
  232. data/lib/active_admin/views/pages/layout.rb +26 -0
  233. data/lib/active_admin/views/pages/new.rb +28 -0
  234. data/lib/active_admin/views/pages/show.rb +56 -0
  235. data/lib/active_admin/views/tabs_renderer.rb +58 -0
  236. data/lib/activeadmin.rb +1 -0
  237. data/lib/generators/active_admin/assets/assets_generator.rb +21 -0
  238. data/lib/generators/active_admin/assets/templates/3.0/active_admin.js +427 -0
  239. data/lib/generators/active_admin/assets/templates/3.1/active_admin.css.scss +6 -0
  240. data/lib/generators/active_admin/assets/templates/3.1/active_admin.js +1 -0
  241. data/lib/generators/active_admin/assets/templates/dashboards.rb +36 -0
  242. data/lib/generators/active_admin/devise/devise_generator.rb +49 -0
  243. data/lib/generators/active_admin/install/install_generator.rb +44 -0
  244. data/lib/generators/active_admin/install/templates/active_admin.rb.erb +93 -0
  245. data/lib/generators/active_admin/install/templates/dashboards.rb +38 -0
  246. data/lib/generators/active_admin/install/templates/migrations/1_create_admin_notes.rb +16 -0
  247. data/lib/generators/active_admin/install/templates/migrations/2_move_admin_notes_to_comments.rb +25 -0
  248. data/lib/generators/active_admin/resource/resource_generator.rb +16 -0
  249. data/lib/generators/active_admin/resource/templates/admin.rb +3 -0
  250. data/script/local +44 -0
  251. data/script/use_rails +45 -0
  252. data/spec/integration/belongs_to_spec.rb +42 -0
  253. data/spec/integration/default_namespace.rb +77 -0
  254. data/spec/integration/javascript_spec.rb +20 -0
  255. data/spec/integration/stylesheets_spec.rb +41 -0
  256. data/spec/spec_helper.rb +157 -0
  257. data/spec/support/detect_rails_version.rb +11 -0
  258. data/spec/support/integration_example_group.rb +33 -0
  259. data/spec/support/jslint.yml +80 -0
  260. data/spec/support/rails_template.rb +32 -0
  261. data/spec/support/rails_template_with_data.rb +33 -0
  262. data/spec/support/templates/cucumber.rb +24 -0
  263. data/spec/unit/abstract_view_factory_spec.rb +79 -0
  264. data/spec/unit/action_builder_spec.rb +88 -0
  265. data/spec/unit/application_spec.rb +78 -0
  266. data/spec/unit/arbre/html/context_spec.rb +22 -0
  267. data/spec/unit/arbre/html/element_finder_methods_spec.rb +54 -0
  268. data/spec/unit/arbre/html/element_spec.rb +224 -0
  269. data/spec/unit/arbre/html/tag_attributes_spec.rb +61 -0
  270. data/spec/unit/arbre/html/tag_spec.rb +63 -0
  271. data/spec/unit/arbre/html_spec.rb +210 -0
  272. data/spec/unit/asset_registration_spec.rb +37 -0
  273. data/spec/unit/auto_link_spec.rb +39 -0
  274. data/spec/unit/belongs_to_spec.rb +45 -0
  275. data/spec/unit/breadcrumbs_spec.rb +110 -0
  276. data/spec/unit/comments_spec.rb +57 -0
  277. data/spec/unit/component_spec.rb +18 -0
  278. data/spec/unit/controller_filters_spec.rb +34 -0
  279. data/spec/unit/csv_builder_spec.rb +83 -0
  280. data/spec/unit/dashboard_controller_spec.rb +26 -0
  281. data/spec/unit/dashboard_section_spec.rb +56 -0
  282. data/spec/unit/dashboards_spec.rb +59 -0
  283. data/spec/unit/display_name_spec.rb +29 -0
  284. data/spec/unit/event_spec.rb +41 -0
  285. data/spec/unit/filter_form_builder_spec.rb +182 -0
  286. data/spec/unit/form_builder_spec.rb +239 -0
  287. data/spec/unit/generators/install_rails_3_1_spec.rb +16 -0
  288. data/spec/unit/helpers/settings_spec.rb +30 -0
  289. data/spec/unit/menu_item_spec.rb +143 -0
  290. data/spec/unit/menu_spec.rb +53 -0
  291. data/spec/unit/namespace_spec.rb +214 -0
  292. data/spec/unit/pretty_format_spec.rb +35 -0
  293. data/spec/unit/rails_spec.rb +43 -0
  294. data/spec/unit/registration_spec.rb +76 -0
  295. data/spec/unit/reloader_spec.rb +28 -0
  296. data/spec/unit/renderer_spec.rb +108 -0
  297. data/spec/unit/resource/action_items_spec.rb +62 -0
  298. data/spec/unit/resource/menu_spec.rb +80 -0
  299. data/spec/unit/resource/naming_spec.rb +56 -0
  300. data/spec/unit/resource/scopes_spec.rb +30 -0
  301. data/spec/unit/resource/sidebars_spec.rb +50 -0
  302. data/spec/unit/resource_controller/collection_spec.rb +34 -0
  303. data/spec/unit/resource_controller_spec.rb +152 -0
  304. data/spec/unit/resource_spec.rb +260 -0
  305. data/spec/unit/routing_spec.rb +88 -0
  306. data/spec/unit/sass/helpers_spec.rb +47 -0
  307. data/spec/unit/scope_spec.rb +31 -0
  308. data/spec/unit/tabs_renderer_spec.rb +85 -0
  309. data/spec/unit/view_factory_spec.rb +19 -0
  310. data/spec/unit/views/components/attributes_table_spec.rb +100 -0
  311. data/spec/unit/views/components/blank_slate_spec.rb +31 -0
  312. data/spec/unit/views/components/columns_spec.rb +75 -0
  313. data/spec/unit/views/components/panel_spec.rb +31 -0
  314. data/spec/unit/views/components/sidebar_section_spec.rb +37 -0
  315. data/spec/unit/views/components/status_tag_spec.rb +81 -0
  316. data/spec/unit/views/components/table_for_spec.rb +130 -0
  317. data/spec/unit/views/pages/layout_spec.rb +22 -0
  318. data/tasks/docs.rake +39 -0
  319. data/tasks/test.rake +49 -0
  320. data/tasks/yard.rake +6 -0
  321. metadata +510 -0
@@ -0,0 +1,47 @@
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
+ super.to_s + "<div style=\"clear:both;\"></div>".html_safe
40
+ end
41
+
42
+ end
43
+
44
+ class Column < ActiveAdmin::Component
45
+ end
46
+ end
47
+ end
@@ -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, :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 [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,28 @@
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
+ text_node render(@section.partial_name)
23
+ end
24
+ end
25
+ end
26
+
27
+ end
28
+ 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