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,45 @@
1
+ module ActiveAdmin
2
+ # CSVBuilder stores CSV configuration
3
+ #
4
+ # Usage example:
5
+ #
6
+ # csv_builder = CSVBuilder.new
7
+ # csv_builder.column :id
8
+ # csv_builder.column("Name") { |resource| resource.full_name }
9
+ #
10
+ class CSVBuilder
11
+
12
+ # Return a default CSVBuilder for a resource
13
+ # The CSVBuilder's columns would be Id followed by this
14
+ # resource's content columns
15
+ def self.default_for_resource(resource)
16
+ new.tap do |csv_builder|
17
+ csv_builder.column(:id)
18
+ resource.content_columns.each do |content_column|
19
+ csv_builder.column(content_column.name.to_sym)
20
+ end
21
+ end
22
+ end
23
+
24
+ attr_reader :columns
25
+
26
+ def initialize(&block)
27
+ @columns = []
28
+ instance_eval &block if block_given?
29
+ end
30
+
31
+ # Add a column
32
+ def column(name, &block)
33
+ @columns << Column.new(name, block)
34
+ end
35
+
36
+ class Column
37
+ attr_reader :name, :data
38
+
39
+ def initialize(name, block = nil)
40
+ @name = name.is_a?(Symbol) ? name.to_s.titleize : name
41
+ @data = block || name.to_sym
42
+ end
43
+ end
44
+ end
45
+ end
@@ -0,0 +1,47 @@
1
+ module ActiveAdmin
2
+ module Dashboards
3
+ class DashboardController < ResourceController
4
+
5
+ before_filter :skip_sidebar!
6
+
7
+ actions :index
8
+
9
+ clear_action_items!
10
+
11
+ def index
12
+ @dashboard_sections = find_sections
13
+ end
14
+
15
+ protected
16
+
17
+ # Override _prefix so we force ActionController to render
18
+ # the views from active_admin/dashboard instead of default path.
19
+ def _prefix
20
+ 'active_admin/dashboard'
21
+ end
22
+
23
+ def set_current_tab
24
+ @current_tab = "Dashboard"
25
+ end
26
+
27
+ def find_sections
28
+ ActiveAdmin::Dashboards.sections_for_namespace(namespace)
29
+ end
30
+
31
+ def namespace
32
+ class_name = self.class.name
33
+ if class_name.include?('::')
34
+ self.class.name.split('::').first.underscore.to_sym
35
+ else
36
+ :root
37
+ end
38
+ end
39
+
40
+ # Return the current menu for the view. This is a helper method
41
+ def current_menu
42
+ ActiveAdmin.application.namespaces[namespace].menu
43
+ end
44
+
45
+ end
46
+ end
47
+ end
@@ -0,0 +1,34 @@
1
+ module ActiveAdmin
2
+ module Dashboards
3
+ class Section
4
+
5
+ DEFAULT_PRIORITY = 10
6
+
7
+ attr_accessor :name, :block
8
+ attr_reader :namespace, :options
9
+
10
+ def initialize(namespace, name, options = {}, &block)
11
+ @namespace = namespace
12
+ @name = name
13
+ @options = options
14
+ @block = block
15
+ end
16
+
17
+ def priority
18
+ @options[:priority] || DEFAULT_PRIORITY
19
+ end
20
+
21
+ def icon
22
+ @options[:icon]
23
+ end
24
+
25
+ # Sort by priority then by name
26
+ def <=>(other)
27
+ result = priority <=> other.priority
28
+ result = name.to_s <=> other.name.to_s if result == 0
29
+ result
30
+ end
31
+
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,48 @@
1
+ module ActiveAdmin
2
+ module Dashboards
3
+
4
+ autoload :DashboardController, 'active_admin/dashboards/dashboard_controller'
5
+ autoload :Section, 'active_admin/dashboards/section'
6
+
7
+ @@sections = {}
8
+ mattr_accessor :sections
9
+
10
+ class << self
11
+
12
+ # Eval an entire block in the context of this module to build
13
+ # dashboards quicker.
14
+ #
15
+ # Example:
16
+ #
17
+ # ActiveAdmin::Dashboards.build do
18
+ # section "Recent Post" do
19
+ # # return a list of posts
20
+ # end
21
+ # end
22
+ #
23
+ def build(&block)
24
+ module_eval(&block)
25
+ end
26
+
27
+ # Add a new dashboard section to a namespace. If no namespace is given
28
+ # it will be added to the default namespace.
29
+ def add_section(name, options = {}, &block)
30
+ namespace = options.delete(:namespace) || ActiveAdmin.application.default_namespace || :root
31
+ self.sections[namespace] ||= []
32
+ self.sections[namespace] << Section.new(namespace, name, options, &block)
33
+ self.sections[namespace].sort!
34
+ end
35
+ alias_method :section, :add_section
36
+
37
+ def sections_for_namespace(namespace)
38
+ @@sections[namespace] || []
39
+ end
40
+
41
+ def clear_all_sections!
42
+ @@sections = {}
43
+ end
44
+
45
+ end
46
+
47
+ end
48
+ end
@@ -0,0 +1,43 @@
1
+ require 'devise'
2
+
3
+ module ActiveAdmin
4
+ module Devise
5
+
6
+ def self.config
7
+ {
8
+ :path => ActiveAdmin.application.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.application.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,215 @@
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
+ # Configure the CSV format
119
+ #
120
+ # For example:
121
+ #
122
+ # csv do
123
+ # column :name
124
+ # column("Author") { |post| post.author.full_name }
125
+ # end
126
+ #
127
+ def csv(&block)
128
+ config.csv_builder = CSVBuilder.new(&block)
129
+ end
130
+
131
+ # Member Actions give you the functionality of defining both the
132
+ # action and the route directly from your ActiveAdmin registration
133
+ # block.
134
+ #
135
+ # For example:
136
+ #
137
+ # ActiveAdmin.register Post do
138
+ # member_action :comments do
139
+ # @post = Post.find(params[:id]
140
+ # @comments = @post.comments
141
+ # end
142
+ # end
143
+ #
144
+ # Will create a new controller action comments and will hook it up to
145
+ # the named route (comments_admin_post_path) /admin/posts/:id/comments
146
+ #
147
+ # You can treat everything within the block as a standard Rails controller
148
+ # action.
149
+ #
150
+ def member_action(name, options = {}, &block)
151
+ config.member_actions << ControllerAction.new(name, options)
152
+ controller do
153
+ define_method(name, &block || Proc.new{})
154
+ end
155
+ end
156
+
157
+ def collection_action(name, options = {}, &block)
158
+ config.collection_actions << ControllerAction.new(name, options)
159
+ controller do
160
+ define_method(name, &block || Proc.new{})
161
+ end
162
+ end
163
+
164
+ # Defined Callbacks
165
+ #
166
+ # == After Build
167
+ # Called after the resource is built in the new and create actions.
168
+ #
169
+ # ActiveAdmin.register Post do
170
+ # after_build do |post|
171
+ # post.author = current_user
172
+ # end
173
+ # end
174
+ #
175
+ # == Before / After Create
176
+ # Called before and after a resource is saved to the db on the create action.
177
+ #
178
+ # == Before / After Update
179
+ # Called before and after a resource is saved to the db on the update action.
180
+ #
181
+ # == Before / After Save
182
+ # Called before and after the object is saved in the create and update action.
183
+ # Note: Gets called after the create and update callbacks
184
+ #
185
+ # == Before / After Destroy
186
+ # Called before and after the object is destroyed from the database.
187
+ #
188
+ delegate :before_build, :after_build, :to => :controller
189
+ delegate :before_create, :after_create, :to => :controller
190
+ delegate :before_update, :after_update, :to => :controller
191
+ delegate :before_save, :after_save, :to => :controller
192
+ delegate :before_destroy, :after_destroy, :to => :controller
193
+
194
+ # Filters
195
+ delegate :filter, :to => :controller
196
+
197
+ # Sidebar
198
+ delegate :sidebar, :to => :controller
199
+
200
+ # Standard rails filters
201
+ delegate :before_filter, :after_filter, :around_filter, :to => :controller
202
+
203
+ # Specify which actions to create in the controller
204
+ #
205
+ # Eg:
206
+ #
207
+ # ActiveAdmin.register Post do
208
+ # actions :index, :show
209
+ # end
210
+ #
211
+ # Will only create the index and show actions (no create, update or delete)
212
+ delegate :actions, :to => :controller
213
+
214
+ end
215
+ 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
@@ -0,0 +1,109 @@
1
+ require 'formtastic'
2
+
3
+ module ActiveAdmin
4
+ class FormBuilder < ::Formtastic::SemanticFormBuilder
5
+
6
+ attr_reader :form_buffers
7
+
8
+ def initialize(*args)
9
+ @form_buffers = ["".html_safe]
10
+ super
11
+ end
12
+
13
+ def inputs(*args, &block)
14
+ # Store that we are creating inputs without a block
15
+ @inputs_with_block = block_given? ? true : false
16
+ content = with_new_form_buffer { super }
17
+ form_buffers.last << content.html_safe
18
+ end
19
+
20
+ # The input method returns a properly formatted string for
21
+ # its contents, so we want to skip the internal buffering
22
+ # while building up its contents
23
+ def input(*args)
24
+ content = with_new_form_buffer { super }
25
+ return content.html_safe unless @inputs_with_block
26
+ form_buffers.last << content.html_safe
27
+ end
28
+
29
+ # The buttons method always needs to be wrapped in a new buffer
30
+ def buttons(*args, &block)
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
35
+ end
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 I18n.t('active_admin.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
+
53
+ def datepicker_input(method, options)
54
+ options = options.dup
55
+ options[:input_html] ||= {}
56
+ options[:input_html][:class] = [options[:input_html][:class], "datepicker"].compact.join(' ')
57
+ options[:input_html][:size] ||= "10"
58
+ string_input(method, options)
59
+ end
60
+
61
+ def has_many(association, options = {}, &block)
62
+ options = { :for => association }.merge(options)
63
+ options[:class] ||= ""
64
+ options[:class] << "inputs has_many_fields"
65
+
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 I18n.t('active_admin.has_many_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 I18n.t('active_admin.has_many_new', :model => 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
97
+ end
98
+
99
+ private
100
+
101
+ def with_new_form_buffer
102
+ form_buffers << "".html_safe
103
+ return_value = yield
104
+ form_buffers.pop
105
+ return_value
106
+ end
107
+
108
+ end
109
+ end
@@ -0,0 +1,34 @@
1
+ module ActiveAdmin
2
+
3
+ # Shareable module to give a #display_on?(action) method
4
+ # which returns true or false depending on an options hash.
5
+ #
6
+ # The options hash accepts:
7
+ #
8
+ # :only => :index
9
+ # :only => [:index, :show]
10
+ # :except => :index
11
+ # :except => [:index, :show]
12
+ #
13
+ # call #normalize_display_options! after @options has been set
14
+ # to ensure that the display options are setup correctly
15
+
16
+ module OptionalDisplay
17
+ def display_on?(action)
18
+ return @options[:only].include?(action.to_sym) if @options[:only]
19
+ return !@options[:except].include?(action.to_sym) if @options[:except]
20
+ true
21
+ end
22
+
23
+ private
24
+
25
+ def normalize_display_options!
26
+ if @options[:only]
27
+ @options[:only] = @options[:only].is_a?(Array) ? @options[:only] : [@options[:only]]
28
+ end
29
+ if @options[:except]
30
+ @options[:except] = @options[:except].is_a?(Array) ? @options[:except] : [@options[:except]]
31
+ end
32
+ end
33
+ end
34
+ end