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,22 @@
1
+ module ActiveAdmin
2
+ class Component < Arbre::HTML::Div
3
+
4
+ # By default components render a div
5
+ def tag_name
6
+ 'div'
7
+ end
8
+
9
+ def initialize(*)
10
+ super
11
+ add_class default_class_name
12
+ end
13
+
14
+ protected
15
+
16
+ # By default, add a css class named after the ruby class
17
+ def default_class_name
18
+ self.class.name.demodulize.underscore
19
+ end
20
+
21
+ end
22
+ end
@@ -0,0 +1,12 @@
1
+ module ActiveAdmin
2
+ class ControllerAction
3
+ attr_reader :name
4
+ def initialize(name, options = {})
5
+ @name, @options = name, options
6
+ end
7
+
8
+ def http_verb
9
+ @options[:method] ||= :get
10
+ end
11
+ end
12
+ end
@@ -2,9 +2,7 @@ module ActiveAdmin
2
2
  module Dashboards
3
3
 
4
4
  autoload :DashboardController, 'active_admin/dashboards/dashboard_controller'
5
- autoload :Renderer, 'active_admin/dashboards/renderer'
6
5
  autoload :Section, 'active_admin/dashboards/section'
7
- autoload :SectionRenderer, 'active_admin/dashboards/section_renderer'
8
6
 
9
7
  @@sections = {}
10
8
  mattr_accessor :sections
@@ -2,13 +2,16 @@ module ActiveAdmin
2
2
  module Dashboards
3
3
  class DashboardController < ResourceController
4
4
 
5
+ before_filter :skip_sidebar!
6
+
7
+ actions :index
8
+
5
9
  # Render from here if not overriden
6
10
  self.default_views = 'active_admin_dashboard'
7
11
 
8
12
  clear_action_items!
9
13
 
10
14
  def index
11
- skip_sidebar!
12
15
  @dashboard_sections = find_sections
13
16
  render_or_default 'index'
14
17
  end
@@ -24,7 +27,12 @@ module ActiveAdmin
24
27
  end
25
28
 
26
29
  def namespace
27
- self.class.name.split('::').first.underscore.to_sym
30
+ class_name = self.class.name
31
+ if class_name.include?('::')
32
+ self.class.name.split('::').first.underscore.to_sym
33
+ else
34
+ :root
35
+ end
28
36
  end
29
37
 
30
38
  # Return the current menu for the view. This is a helper method
@@ -32,9 +40,6 @@ module ActiveAdmin
32
40
  ActiveAdmin.namespaces[namespace].menu
33
41
  end
34
42
 
35
- # Override to do nothing
36
- def add_section_breadcrumb
37
- end
38
43
  end
39
44
  end
40
45
  end
@@ -2,15 +2,10 @@ module ActiveAdmin
2
2
  module Dashboards
3
3
  class Section
4
4
 
5
- @@renderers = {
6
- :default => SectionRenderer
7
- }
8
- cattr_accessor :renderers
9
-
10
5
  DEFAULT_PRIORITY = 10
11
6
 
12
7
  attr_accessor :name, :block
13
- attr_reader :namespace
8
+ attr_reader :namespace, :options
14
9
 
15
10
  def initialize(namespace, name, options = {}, &block)
16
11
  @namespace = namespace
@@ -23,6 +18,10 @@ module ActiveAdmin
23
18
  @options[:priority] || DEFAULT_PRIORITY
24
19
  end
25
20
 
21
+ def icon
22
+ @options[:icon]
23
+ end
24
+
26
25
  # Sort by priority then by name
27
26
  def <=>(other)
28
27
  result = priority <=> other.priority
@@ -30,14 +29,6 @@ module ActiveAdmin
30
29
  result
31
30
  end
32
31
 
33
- # Returns the class to use as this sections renderer. Raises
34
- # an exception if the renderer could not be found
35
- def renderer
36
- klass = Section.renderers[@options[:as] || :default]
37
- raise StandardError, "Could not find the #{@options[:as].inspect} dashboard section renderer." unless klass
38
- klass
39
- end
40
-
41
32
  end
42
33
  end
43
34
  end
@@ -0,0 +1,43 @@
1
+ require 'devise'
2
+
3
+ module ActiveAdmin
4
+ module Devise
5
+
6
+ def self.config
7
+ {
8
+ :path => ActiveAdmin.default_namespace,
9
+ :controllers => ActiveAdmin::Devise.controllers,
10
+ :path_names => { :sign_in => 'login', :sign_out => "logout" }
11
+ }
12
+ end
13
+
14
+ def self.controllers
15
+ {
16
+ :sessions => "active_admin/devise/sessions",
17
+ :passwords => "active_admin/devise/passwords"
18
+ }
19
+ end
20
+
21
+ module Controller
22
+ extend ::ActiveSupport::Concern
23
+ included do
24
+ layout 'active_admin_logged_out'
25
+ helper ::ActiveAdmin::ViewHelpers
26
+ end
27
+
28
+ # Redirect to the default namespace on logout
29
+ def root_path
30
+ "/#{ActiveAdmin.default_namespace}"
31
+ end
32
+ end
33
+
34
+ class SessionsController < ::Devise::SessionsController
35
+ include ::ActiveAdmin::Devise::Controller
36
+ end
37
+
38
+ class PasswordsController < ::Devise::PasswordsController
39
+ include ::ActiveAdmin::Devise::Controller
40
+ end
41
+
42
+ end
43
+ end
@@ -0,0 +1,202 @@
1
+ module ActiveAdmin
2
+
3
+ #
4
+ # The Active Admin DSL. This class is where all the registration blocks
5
+ # are instance eval'd. This is the central place for the API given to
6
+ # users of Active Admin
7
+ #
8
+ class DSL
9
+
10
+ # Runs the registration block inside this object
11
+ def run_registration_block(config, &block)
12
+ @config = config
13
+ instance_eval &block
14
+ end
15
+
16
+ private
17
+
18
+ # The instance of ActiveAdmin::Resource that's being registered
19
+ # currently. You can use this within your registration blocks to
20
+ # modify options:
21
+ #
22
+ # eg:
23
+ #
24
+ # ActiveAdmin.register Post do
25
+ # config.admin_notes = false
26
+ # end
27
+ #
28
+ def config
29
+ @config
30
+ end
31
+
32
+ # Returns the controller for this resource. If you pass a
33
+ # block, it will be eval'd in the controller
34
+ #
35
+ # Example:
36
+ #
37
+ # ActiveAdmin.register Post do
38
+ #
39
+ # controller do
40
+ # def some_method_on_controller
41
+ # # Method gets added to Admin::PostsController
42
+ # end
43
+ # end
44
+ #
45
+ # end
46
+ #
47
+ def controller(&block)
48
+ @config.controller.class_eval(&block) if block_given?
49
+ @config.controller
50
+ end
51
+
52
+ def belongs_to(target, options = {})
53
+ config.belongs_to(target, options)
54
+ end
55
+
56
+ def menu(options = {})
57
+ config.menu(options)
58
+ end
59
+
60
+ # Scope this controller to some object which has a relation
61
+ # to the resource. Can either accept a block or a symbol
62
+ # of a method to call.
63
+ #
64
+ # Eg:
65
+ #
66
+ # ActiveAdmin.register Post do
67
+ # scope_to :current_user
68
+ # end
69
+ #
70
+ # Then every time we instantiate and object, it would call
71
+ #
72
+ # current_user.posts.build
73
+ #
74
+ # By default Active Admin will use the resource name to build a
75
+ # method to call as the association. If its different, you can
76
+ # pass in the association_method as an option.
77
+ #
78
+ # scope_to :current_user, :association_method => :blog_posts
79
+ #
80
+ # will result in the following
81
+ #
82
+ # current_user.blog_posts.build
83
+ #
84
+ def scope_to(*args, &block)
85
+ options = args.extract_options!
86
+ method = args.first
87
+
88
+ config.scope_to = block_given? ? block : method
89
+ config.scope_to_association_method = options[:association_method]
90
+ end
91
+
92
+ # Create a scope
93
+ def scope(*args, &block)
94
+ config.scope(*args, &block)
95
+ end
96
+
97
+ def action_item(options = {}, &block)
98
+ controller.action_item(options, &block)
99
+ end
100
+
101
+ # Configure the index page for the resource
102
+ def index(options = {}, &block)
103
+ options[:as] ||= :table
104
+ controller.set_page_config :index, options, &block
105
+ end
106
+
107
+ # Configure the show page for the resource
108
+ def show(options = {}, &block)
109
+ # TODO: controller.set_page_config just sets page_configs on the Resource (config) obj
110
+ controller.set_page_config :show, options, &block
111
+ end
112
+
113
+ def form(options = {}, &block)
114
+ options[:block] = block
115
+ controller.form_config = options
116
+ end
117
+
118
+ # Member Actions give you the functionality of defining both the
119
+ # action and the route directly from your ActiveAdmin registration
120
+ # block.
121
+ #
122
+ # For example:
123
+ #
124
+ # ActiveAdmin.register Post do
125
+ # member_action :comments do
126
+ # @post = Post.find(params[:id]
127
+ # @comments = @post.comments
128
+ # end
129
+ # end
130
+ #
131
+ # Will create a new controller action comments and will hook it up to
132
+ # the named route (comments_admin_post_path) /admin/posts/:id/comments
133
+ #
134
+ # You can treat everything within the block as a standard Rails controller
135
+ # action.
136
+ #
137
+ def member_action(name, options = {}, &block)
138
+ config.member_actions << ControllerAction.new(name, options)
139
+ controller do
140
+ define_method(name, &block || Proc.new{})
141
+ end
142
+ end
143
+
144
+ def collection_action(name, options = {}, &block)
145
+ config.collection_actions << ControllerAction.new(name, options)
146
+ controller do
147
+ define_method(name, &block || Proc.new{})
148
+ end
149
+ end
150
+
151
+ # Defined Callbacks
152
+ #
153
+ # == After Build
154
+ # Called after the resource is built in the new and create actions.
155
+ #
156
+ # ActiveAdmin.register Post do
157
+ # after_build do |post|
158
+ # post.author = current_user
159
+ # end
160
+ # end
161
+ #
162
+ # == Before / After Create
163
+ # Called before and after a resource is saved to the db on the create action.
164
+ #
165
+ # == Before / After Update
166
+ # Called before and after a resource is saved to the db on the update action.
167
+ #
168
+ # == Before / After Save
169
+ # Called before and after the object is saved in the create and update action.
170
+ # Note: Gets called after the create and update callbacks
171
+ #
172
+ # == Before / After Destroy
173
+ # Called before and after the object is destroyed from the database.
174
+ #
175
+ delegate :before_build, :after_build, :to => :controller
176
+ delegate :before_create, :after_create, :to => :controller
177
+ delegate :before_update, :after_update, :to => :controller
178
+ delegate :before_save, :after_save, :to => :controller
179
+ delegate :before_destroy, :after_destroy, :to => :controller
180
+
181
+ # Filters
182
+ delegate :filter, :to => :controller
183
+
184
+ # Sidebar
185
+ delegate :sidebar, :to => :controller
186
+
187
+ # Standard rails filters
188
+ delegate :before_filter, :after_filter, :around_filter, :to => :controller
189
+
190
+ # Specify which actions to create in the controller
191
+ #
192
+ # Eg:
193
+ #
194
+ # ActiveAdmin.register Post do
195
+ # actions :index, :show
196
+ # end
197
+ #
198
+ # Will only create the index and show actions (no create, update or delete)
199
+ delegate :actions, :to => :controller
200
+
201
+ end
202
+ end
@@ -0,0 +1,31 @@
1
+ module ActiveAdmin
2
+
3
+ class EventDispatcher
4
+ def initialize
5
+ @events = {}
6
+ end
7
+
8
+ def clear_all_subscribers!
9
+ @events = {}
10
+ end
11
+
12
+ def subscribe(event, &block)
13
+ @events[event] ||= []
14
+ @events[event] << block
15
+ end
16
+
17
+ def subscribers(event)
18
+ @events[event] || []
19
+ end
20
+
21
+ def dispatch(event, *args)
22
+ subscribers(event).each do |subscriber|
23
+ subscriber.call(*args)
24
+ end
25
+ end
26
+ end
27
+
28
+ # ActiveAdmin::Event is set to a dispatcher
29
+ Event = EventDispatcher.new
30
+
31
+ end
@@ -1,68 +1,55 @@
1
+ require 'formtastic'
2
+
1
3
  module ActiveAdmin
2
4
  class FormBuilder < ::Formtastic::SemanticFormBuilder
5
+
6
+ attr_reader :form_buffers
3
7
 
4
8
  def initialize(*args)
5
9
  @form_buffers = ["".html_safe]
6
- @skip_form_buffer = false
7
10
  super
8
11
  end
9
12
 
10
- # Sets up buffering for this form which allows
11
- # the entire form to be built in a block outside
12
- # of the context of the view. Ie: you don't need
13
- # to use erb tags.
14
- def self.buffer_output_for(*method_names)
15
- method_names.each do |method_name|
16
- module_eval <<-EOF
17
- def #{method_name}(*args)
18
- content = block_given? ? with_new_form_buffer{ super } : super
19
- return content if @skip_form_buffer
20
- @form_buffers.last << content.html_safe
21
- end
22
- EOF
23
- end
24
- end
25
-
26
- buffer_output_for :submit,
27
- :label,
28
- :inputs_for_nested_attributes,
29
- :semantic_fields_for,
30
- :text_field,
31
- :text_area,
32
- :datetime_select,
33
- :time_select,
34
- :date_select,
35
- :radio_button,
36
- :file_field,
37
- :hidden_field,
38
- :select,
39
- :grouped_collection_select,
40
- :collection_select
41
-
42
13
  def inputs(*args, &block)
43
14
  # Store that we are creating inputs without a block
44
- @inputs_with_no_block = true unless block_given?
15
+ @inputs_with_block = block_given? ? true : false
45
16
  content = with_new_form_buffer { super }
46
- @form_buffers.last << content.html_safe
17
+ form_buffers.last << content.html_safe
47
18
  end
48
19
 
49
20
  # The input method returns a properly formatted string for
50
21
  # its contents, so we want to skip the internal buffering
51
22
  # while building up its contents
52
23
  def input(*args)
53
- @skip_form_buffer = true
54
24
  content = with_new_form_buffer { super }
55
- @skip_form_buffer = false
56
- return content.html_safe if @inputs_with_no_block
57
- @form_buffers.last << content.html_safe
25
+ return content.html_safe unless @inputs_with_block
26
+ form_buffers.last << content.html_safe
58
27
  end
59
28
 
60
29
  # The buttons method always needs to be wrapped in a new buffer
61
30
  def buttons(*args, &block)
62
- content = with_new_form_buffer{ super }
63
- @form_buffers.last << content.html_safe
31
+ content = with_new_form_buffer do
32
+ block_given? ? super : super { commit_button_with_cancel_link }
33
+ end
34
+ form_buffers.last << content.html_safe
64
35
  end
65
36
 
37
+ def commit_button(*args)
38
+ content = with_new_form_buffer{ super }
39
+ form_buffers.last << content.html_safe
40
+ end
41
+
42
+ def cancel_link(url = nil, html_options = {}, li_attributes = {})
43
+ li_attributes[:class] ||= "cancel"
44
+ url ||= {:action => "index"}
45
+ template.content_tag(:li, (template.link_to ActiveAdmin::Iconic.icon(:x) + " Cancel", url, html_options), li_attributes)
46
+ end
47
+
48
+ def commit_button_with_cancel_link
49
+ content = commit_button
50
+ content << cancel_link
51
+ end
52
+
66
53
  def datepicker_input(method, options)
67
54
  options = options.dup
68
55
  options[:input_html] ||= {}
@@ -71,19 +58,50 @@ module ActiveAdmin
71
58
  string_input(method, options)
72
59
  end
73
60
 
74
- private
61
+ def has_many(association, options = {}, &block)
62
+ options = { :for => association }.merge(options)
63
+ options[:class] ||= ""
64
+ options[:class] << "inputs has_many_fields"
75
65
 
76
- def with_new_form_buffer
77
- @form_buffers << "".html_safe
78
- return_value = yield
79
- @form_buffers.pop
80
- return_value
66
+ # Add Delete Links
67
+ form_block = proc do |has_many_form|
68
+ block.call(has_many_form) + if has_many_form.object.new_record?
69
+ template.content_tag :li do
70
+ template.link_to "Delete", "#", :onclick => "$(this).closest('.has_many_fields').remove(); return false;", :class => "button"
71
+ end
72
+ else
73
+ end
74
+ end
75
+
76
+ content = with_new_form_buffer do
77
+ template.content_tag :div, :class => "has_many #{association}" do
78
+ form_buffers.last << template.content_tag(:h3, association.to_s.titlecase)
79
+ inputs options, &form_block
80
+
81
+ # Capture the ADD JS
82
+ js = with_new_form_buffer do
83
+ inputs_for_nested_attributes :for => [association, object.class.reflect_on_association(association).klass.new],
84
+ :class => "inputs has_many_fields",
85
+ :for_options => {
86
+ :child_index => "NEW_RECORD"
87
+ }, &form_block
88
+ end
89
+
90
+ js = template.escape_javascript(js)
91
+ js = template.link_to "Add New #{association.to_s.singularize.titlecase}", "#", :onclick => "$(this).before('#{js}'.replace(/NEW_RECORD/g, new Date().getTime())); return false;", :class => "button"
92
+
93
+ form_buffers.last << js.html_safe
94
+ end
95
+ end
96
+ form_buffers.last << content.html_safe
81
97
  end
82
98
 
83
- def skip_form_buffers
84
- @skip_form_buffer = true
99
+ private
100
+
101
+ def with_new_form_buffer
102
+ form_buffers << "".html_safe
85
103
  return_value = yield
86
- @skip_form_buffer = false
104
+ form_buffers.pop
87
105
  return_value
88
106
  end
89
107