adva-core 0.0.1

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 (279) hide show
  1. data/app/controllers/admin/base_controller.rb +21 -0
  2. data/app/controllers/admin/pages_controller.rb +9 -0
  3. data/app/controllers/admin/sections_controller.rb +36 -0
  4. data/app/controllers/admin/sites_controller.rb +18 -0
  5. data/app/controllers/articles_controller.rb +3 -0
  6. data/app/controllers/base_controller.rb +22 -0
  7. data/app/controllers/installations_controller.rb +28 -0
  8. data/app/controllers/pages_controller.rb +2 -0
  9. data/app/controllers/sections_controller.rb +3 -0
  10. data/app/helpers/form_helper.rb +13 -0
  11. data/app/helpers/sections_helper.rb +7 -0
  12. data/app/helpers/url_helper.rb +18 -0
  13. data/app/models/account.rb +3 -0
  14. data/app/models/article.rb +2 -0
  15. data/app/models/content.rb +4 -0
  16. data/app/models/page.rb +17 -0
  17. data/app/models/section.rb +59 -0
  18. data/app/models/site.rb +26 -0
  19. data/app/views/admin/pages/_menu.html.rb +30 -0
  20. data/app/views/admin/pages/new.html.rb +19 -0
  21. data/app/views/admin/pages/show.html.rb +25 -0
  22. data/app/views/admin/sections/_menu.html.rb +12 -0
  23. data/app/views/admin/sections/_section.html.rb +7 -0
  24. data/app/views/admin/sections/_select_type.html.rb +16 -0
  25. data/app/views/admin/sections/index.html.rb +28 -0
  26. data/app/views/admin/sites/_menu.html.rb +6 -0
  27. data/app/views/admin/sites/edit.html.rb +22 -0
  28. data/app/views/admin/sites/index.html.rb +12 -0
  29. data/app/views/admin/sites/new.html.rb +39 -0
  30. data/app/views/admin/sites/show.html.rb +7 -0
  31. data/app/views/installations/new.html.rb +39 -0
  32. data/app/views/installations/show.html.rb +9 -0
  33. data/app/views/layouts/_flash.html.rb +9 -0
  34. data/app/views/layouts/admin.rb +38 -0
  35. data/app/views/layouts/admin/_header.rb +48 -0
  36. data/app/views/layouts/admin/_tabs.html.rb +18 -0
  37. data/app/views/layouts/admin/_top.rb +56 -0
  38. data/app/views/layouts/base.rb +58 -0
  39. data/app/views/layouts/default.rb +31 -0
  40. data/app/views/layouts/default/_menu.rb +24 -0
  41. data/app/views/layouts/simple.rb +16 -0
  42. data/app/views/pages/show.html.rb +7 -0
  43. data/config/initializers/simple_form.rb +53 -0
  44. data/config/locales/en.yml +137 -0
  45. data/config/redirects.rb +8 -0
  46. data/config/routes.rb +21 -0
  47. data/lib/adva-core.rb +1 -0
  48. data/lib/adva.rb +37 -0
  49. data/lib/adva/active_record/has_options.rb +55 -0
  50. data/lib/adva/cli.rb +16 -0
  51. data/lib/adva/controller.rb +7 -0
  52. data/lib/adva/controller/abstract_actions.rb +87 -0
  53. data/lib/adva/controller/internal_redirect.rb +26 -0
  54. data/lib/adva/controller/references.rb +28 -0
  55. data/lib/adva/core.rb +84 -0
  56. data/lib/adva/engine.rb +64 -0
  57. data/lib/adva/engine/sliced_models.rb +35 -0
  58. data/lib/adva/generators.rb +8 -0
  59. data/lib/adva/generators/app.rb +121 -0
  60. data/lib/adva/generators/engine.rb +58 -0
  61. data/lib/adva/generators/gemfile.rb +50 -0
  62. data/lib/adva/generators/install.rb +31 -0
  63. data/lib/adva/generators/templates/app/app_template.rb +3 -0
  64. data/lib/adva/generators/templates/engine/Gemfile.erb +3 -0
  65. data/lib/adva/generators/templates/engine/all.rb +1 -0
  66. data/lib/adva/generators/templates/engine/en.yml.erb +2 -0
  67. data/lib/adva/generators/templates/engine/engine.rb.erb +11 -0
  68. data/lib/adva/generators/templates/engine/gemspec.erb +21 -0
  69. data/lib/adva/generators/templates/engine/migration.rb.erb +11 -0
  70. data/lib/adva/generators/templates/engine/redirects.rb.erb +3 -0
  71. data/lib/adva/generators/templates/engine/routes.rb.erb +3 -0
  72. data/lib/adva/generators/templates/engine/test_helper.rb.erb +3 -0
  73. data/lib/adva/rack.rb +5 -0
  74. data/lib/adva/rack/static.rb +50 -0
  75. data/lib/adva/registry.rb +62 -0
  76. data/lib/adva/responder.rb +21 -0
  77. data/lib/adva/responder/redirect.rb +31 -0
  78. data/lib/adva/routing_filters/section_path.rb +72 -0
  79. data/lib/adva/routing_filters/section_root.rb +65 -0
  80. data/lib/adva/tasks/core.rake +9 -0
  81. data/lib/adva/tasks/core.rb +160 -0
  82. data/lib/adva/testing.rb +57 -0
  83. data/lib/adva/testing/engine.rb +37 -0
  84. data/lib/adva/view.rb +7 -0
  85. data/lib/adva/view/form.rb +44 -0
  86. data/lib/adva/view/form/tabs.rb +46 -0
  87. data/lib/adva/view/menu.rb +51 -0
  88. data/lib/adva/view/menu/admin.rb +48 -0
  89. data/lib/adva/view/tabs.rb +28 -0
  90. data/lib/core_ext/rails/action_view/has_many_through_collection_helpers.rb +27 -0
  91. data/lib/core_ext/rails/active_record/skip_callbacks.rb +51 -0
  92. data/lib/core_ext/ruby/array/flatten_once.rb +9 -0
  93. data/lib/core_ext/ruby/kernel/silence_stream.rb +17 -0
  94. data/lib/core_ext/ruby/module/include_anonymous.rb +36 -0
  95. data/lib/core_ext/ruby/module/option_reader.rb +9 -0
  96. data/lib/patches/arel/table_initialization_fixes.rb +68 -0
  97. data/lib/patches/inherited_resources.rb +34 -0
  98. data/lib/patches/rails/arel_table_options_fix.rb +13 -0
  99. data/lib/patches/rails/asset_expansion_multiple_registrations.rb +21 -0
  100. data/lib/patches/rails/recognize_path_env.rb +43 -0
  101. data/lib/patches/rails/route_set_to_param.rb +25 -0
  102. data/lib/patches/rails/sti_associations.rb +17 -0
  103. data/lib/patches/rails/template_resolver_caching.rb +9 -0
  104. data/lib/patches/rails/url_for.rb +60 -0
  105. data/lib/patches/simple_form.rb +37 -0
  106. data/lib/patches/thor/core_ext/hash.rb +7 -0
  107. data/lib/patches/thor/group/symbolized_options.rb +8 -0
  108. data/lib/patches/webrat/links-data-method.rb +19 -0
  109. data/lib/patches/webrat/logger.rb +19 -0
  110. data/lib/patches/webrat/upload_file.rb +28 -0
  111. data/lib/testing/assertions.rb +19 -0
  112. data/lib/testing/factories.rb +30 -0
  113. data/lib/testing/helpers/global_helpers.rb +9 -0
  114. data/lib/testing/paths.rb +54 -0
  115. data/lib/testing/step_definitions/common_steps.rb +279 -0
  116. data/lib/testing/step_definitions/menu_steps.rb +11 -0
  117. data/lib/testing/step_definitions/routes_steps.rb +18 -0
  118. data/lib/testing/step_definitions/transforms.rb +43 -0
  119. data/lib/testing/step_definitions/webrat_steps.rb +291 -0
  120. data/lib/testing/step_definitions/within_steps.rb +17 -0
  121. data/lib/webrat/integrations/rails.rb +33 -0
  122. data/public/images/adva-core/admin/header_bg.png +0 -0
  123. data/public/images/adva-core/admin/menu_checkmark.png +0 -0
  124. data/public/images/adva-core/admin/section_menu_bg.png +0 -0
  125. data/public/images/adva-core/admin/tab_action_active.png +0 -0
  126. data/public/images/adva-core/admin/tab_main_active.png +0 -0
  127. data/public/images/adva-core/admin/tab_sidebar_active.png +0 -0
  128. data/public/images/adva-core/admin/tab_top_active.png +0 -0
  129. data/public/images/adva-core/asset_selected.png +0 -0
  130. data/public/images/adva-core/avatar.gif +0 -0
  131. data/public/images/adva-core/feed.mini.png +0 -0
  132. data/public/images/adva-core/filter-bg.png +0 -0
  133. data/public/images/adva-core/grid.png +0 -0
  134. data/public/images/adva-core/icons/accept.png +0 -0
  135. data/public/images/adva-core/icons/add.png +0 -0
  136. data/public/images/adva-core/icons/arrow_cross.png +0 -0
  137. data/public/images/adva-core/icons/arrow_cross_2.png +0 -0
  138. data/public/images/adva-core/icons/arrow_cross_3.png +0 -0
  139. data/public/images/adva-core/icons/arrow_up_down.png +0 -0
  140. data/public/images/adva-core/icons/assets/audio.png +0 -0
  141. data/public/images/adva-core/icons/assets/doc.png +0 -0
  142. data/public/images/adva-core/icons/assets/pdf.png +0 -0
  143. data/public/images/adva-core/icons/assets/video.png +0 -0
  144. data/public/images/adva-core/icons/attach.png +0 -0
  145. data/public/images/adva-core/icons/bin.png +0 -0
  146. data/public/images/adva-core/icons/bin_closed.png +0 -0
  147. data/public/images/adva-core/icons/bin_empty.png +0 -0
  148. data/public/images/adva-core/icons/bullet_black.png +0 -0
  149. data/public/images/adva-core/icons/bullet_delete.png +0 -0
  150. data/public/images/adva-core/icons/bullet_error.png +0 -0
  151. data/public/images/adva-core/icons/bullet_go.png +0 -0
  152. data/public/images/adva-core/icons/bullet_red.png +0 -0
  153. data/public/images/adva-core/icons/bullet_white.png +0 -0
  154. data/public/images/adva-core/icons/bullet_yellow.png +0 -0
  155. data/public/images/adva-core/icons/cancel.png +0 -0
  156. data/public/images/adva-core/icons/comment.gif +0 -0
  157. data/public/images/adva-core/icons/comment.png +0 -0
  158. data/public/images/adva-core/icons/comment_add.png +0 -0
  159. data/public/images/adva-core/icons/comment_blue.gif +0 -0
  160. data/public/images/adva-core/icons/comment_delete.png +0 -0
  161. data/public/images/adva-core/icons/comment_edit.png +0 -0
  162. data/public/images/adva-core/icons/comment_yellow.gif +0 -0
  163. data/public/images/adva-core/icons/cross.png +0 -0
  164. data/public/images/adva-core/icons/delete.png +0 -0
  165. data/public/images/adva-core/icons/eye.png +0 -0
  166. data/public/images/adva-core/icons/favorites.png +0 -0
  167. data/public/images/adva-core/icons/help.png +0 -0
  168. data/public/images/adva-core/icons/hourglass.png +0 -0
  169. data/public/images/adva-core/icons/icon_attachment.gif +0 -0
  170. data/public/images/adva-core/icons/icon_padlock.gif +0 -0
  171. data/public/images/adva-core/icons/link.png +0 -0
  172. data/public/images/adva-core/icons/lock.png +0 -0
  173. data/public/images/adva-core/icons/magnifier.png +0 -0
  174. data/public/images/adva-core/icons/minus.gif +0 -0
  175. data/public/images/adva-core/icons/page_add.png +0 -0
  176. data/public/images/adva-core/icons/page_delete.png +0 -0
  177. data/public/images/adva-core/icons/page_edit.png +0 -0
  178. data/public/images/adva-core/icons/page_favorites.png +0 -0
  179. data/public/images/adva-core/icons/page_go.png +0 -0
  180. data/public/images/adva-core/icons/page_green.png +0 -0
  181. data/public/images/adva-core/icons/page_red.png +0 -0
  182. data/public/images/adva-core/icons/page_white_add.png +0 -0
  183. data/public/images/adva-core/icons/page_white_delete.png +0 -0
  184. data/public/images/adva-core/icons/page_white_edit.png +0 -0
  185. data/public/images/adva-core/icons/page_white_go.png +0 -0
  186. data/public/images/adva-core/icons/page_white_link.png +0 -0
  187. data/public/images/adva-core/icons/page_white_magnify.png +0 -0
  188. data/public/images/adva-core/icons/pencil.png +0 -0
  189. data/public/images/adva-core/icons/star.png +0 -0
  190. data/public/images/adva-core/icons/stop.png +0 -0
  191. data/public/images/adva-core/icons/tag_green.png +0 -0
  192. data/public/images/adva-core/icons/tick.png +0 -0
  193. data/public/images/adva-core/icons/zoom.png +0 -0
  194. data/public/images/adva-core/indicator.gif +0 -0
  195. data/public/images/adva-core/lines.png +0 -0
  196. data/public/images/adva-core/preview.png +0 -0
  197. data/public/images/adva-core/rails.png +0 -0
  198. data/public/images/adva-core/sortable_tree/drag.png +0 -0
  199. data/public/images/adva-core/theme_selected.png +0 -0
  200. data/public/javascripts/adva-core/admin.js +21 -0
  201. data/public/javascripts/adva-core/jquery/jquery-1.4.2.min.js +154 -0
  202. data/public/javascripts/adva-core/jquery/jquery.table_tree.js +292 -0
  203. data/public/javascripts/adva-core/jquery/jquery.tablednd_0_5.js +386 -0
  204. data/public/javascripts/adva-core/rails.js +127 -0
  205. data/public/javascripts/backup/admin/jquery.admin.js +77 -0
  206. data/public/javascripts/backup/admin/jquery.article.js +22 -0
  207. data/public/javascripts/backup/admin/jquery.cached_pages.js +14 -0
  208. data/public/javascripts/backup/admin/jquery.table_tree.backup.js +279 -0
  209. data/public/javascripts/backup/admin/jquery.table_tree.js +10 -0
  210. data/public/javascripts/backup/application.js +38 -0
  211. data/public/javascripts/backup/application.prototype.js +135 -0
  212. data/public/javascripts/backup/builder.js +136 -0
  213. data/public/javascripts/backup/controls.js +965 -0
  214. data/public/javascripts/backup/cookie.js +49 -0
  215. data/public/javascripts/backup/dragdrop.js +975 -0
  216. data/public/javascripts/backup/effects.js +1130 -0
  217. data/public/javascripts/backup/flash.js +49 -0
  218. data/public/javascripts/backup/jquery.dates.js +49 -0
  219. data/public/javascripts/backup/jquery.flash.js +40 -0
  220. data/public/javascripts/backup/jquery.roles.js +23 -0
  221. data/public/javascripts/backup/jquery/jquery-lowpro.js +224 -0
  222. data/public/javascripts/backup/jquery/jquery-ui.js +273 -0
  223. data/public/javascripts/backup/jquery/jquery.js +19 -0
  224. data/public/javascripts/backup/jquery/jquery.qtip.min.js +15 -0
  225. data/public/javascripts/backup/json.js +139 -0
  226. data/public/javascripts/backup/lowpro.js +320 -0
  227. data/public/javascripts/backup/parseuri.js +39 -0
  228. data/public/javascripts/backup/prototype.js +4320 -0
  229. data/public/javascripts/backup/roles.js +16 -0
  230. data/public/javascripts/backup/scriptaculous.js +60 -0
  231. data/public/javascripts/backup/slider.js +275 -0
  232. data/public/javascripts/backup/sound.js +55 -0
  233. data/public/javascripts/backup/unittest.js +568 -0
  234. data/public/stylesheets/adva-core/admin/forms.css +172 -0
  235. data/public/stylesheets/adva-core/admin/layout.css +38 -0
  236. data/public/stylesheets/adva-core/admin/lists.css +54 -0
  237. data/public/stylesheets/adva-core/admin/navigation.css +234 -0
  238. data/public/stylesheets/adva-core/admin/sidebar.css +87 -0
  239. data/public/stylesheets/adva-core/admin/styles.css +128 -0
  240. data/public/stylesheets/adva-core/common/forms.css +174 -0
  241. data/public/stylesheets/adva-core/common/layout.css +93 -0
  242. data/public/stylesheets/adva-core/common/reset.css +42 -0
  243. data/public/stylesheets/adva-core/common/styles.css +41 -0
  244. data/public/stylesheets/adva-core/default/layout.css +0 -0
  245. data/public/stylesheets/adva-core/default/styles.css +30 -0
  246. data/public/stylesheets/adva-core/simple/layout.css +11 -0
  247. data/public/stylesheets/backup/alternate/common.css +76 -0
  248. data/public/stylesheets/backup/alternate/forms.css +121 -0
  249. data/public/stylesheets/backup/alternate/header.css +125 -0
  250. data/public/stylesheets/backup/alternate/layout.css +103 -0
  251. data/public/stylesheets/backup/alternate/lists.css +153 -0
  252. data/public/stylesheets/backup/alternate/sidebar.css +65 -0
  253. data/public/stylesheets/backup/alternate/top.css +123 -0
  254. data/public/stylesheets/backup/content.css +11 -0
  255. data/public/stylesheets/backup/helptip.css +35 -0
  256. data/public/stylesheets/backup/jquery/alternate/jquery.tooltip.css +13 -0
  257. data/public/stylesheets/backup/jquery/images/ui-bg_flat_0_aaaaaa_40x100.png +0 -0
  258. data/public/stylesheets/backup/jquery/images/ui-bg_flat_75_ffffff_40x100.png +0 -0
  259. data/public/stylesheets/backup/jquery/images/ui-bg_glass_55_fbf9ee_1x400.png +0 -0
  260. data/public/stylesheets/backup/jquery/images/ui-bg_glass_65_ffffff_1x400.png +0 -0
  261. data/public/stylesheets/backup/jquery/images/ui-bg_glass_75_dadada_1x400.png +0 -0
  262. data/public/stylesheets/backup/jquery/images/ui-bg_glass_75_e6e6e6_1x400.png +0 -0
  263. data/public/stylesheets/backup/jquery/images/ui-bg_glass_95_fef1ec_1x400.png +0 -0
  264. data/public/stylesheets/backup/jquery/images/ui-bg_highlight-soft_75_cccccc_1x100.png +0 -0
  265. data/public/stylesheets/backup/jquery/images/ui-icons_222222_256x240.png +0 -0
  266. data/public/stylesheets/backup/jquery/images/ui-icons_2e83ff_256x240.png +0 -0
  267. data/public/stylesheets/backup/jquery/images/ui-icons_454545_256x240.png +0 -0
  268. data/public/stylesheets/backup/jquery/images/ui-icons_888888_256x240.png +0 -0
  269. data/public/stylesheets/backup/jquery/images/ui-icons_cd0a0a_256x240.png +0 -0
  270. data/public/stylesheets/backup/jquery/jquery-ui.css +406 -0
  271. data/public/stylesheets/backup/jquery/jquery.tooltip.css +10 -0
  272. data/public/stylesheets/backup/layout.css +22 -0
  273. data/public/stylesheets/backup/lists.css +17 -0
  274. data/public/stylesheets/backup/menu.css +129 -0
  275. data/public/stylesheets/backup/projection.css +118 -0
  276. data/public/stylesheets/backup/screen/top.css +8 -0
  277. data/public/stylesheets/backup/themes.css +49 -0
  278. data/public/stylesheets/backup/users.css +40 -0
  279. metadata +536 -0
@@ -0,0 +1,57 @@
1
+ module Adva
2
+ module Testing
3
+ autoload :Engine, 'adva/testing/engine'
4
+
5
+ Rails::Engine.extend(Engine)
6
+
7
+ class << self
8
+ def setup(options = {})
9
+ Adva.out = StringIO.new('')
10
+ setup_logging(options)
11
+ setup_active_record
12
+
13
+ each_engine { |e| e.setup_load_paths }
14
+ each_engine { |e| e.migrate }
15
+ each_engine { |e| e.require_patches }
16
+ each_engine { |e| e.preload_sliced_models }
17
+
18
+ load_assertions
19
+ load_factories
20
+ end
21
+
22
+ def each_engine(&block)
23
+ Adva.engines.each(&block)
24
+ end
25
+
26
+ def load_assertions
27
+ Adva.engines.each { |e| e.load_assertions }
28
+ end
29
+
30
+ def load_factories
31
+ Adva.engines.each { |e| e.load_factories }
32
+ end
33
+
34
+ def load_cucumber_support
35
+ Adva.engines.each { |e| e.load_cucumber_support }
36
+ end
37
+
38
+ def load_helpers
39
+ Adva.engines.each { |e| e.load_helpers }
40
+ end
41
+
42
+ def setup_logging(options)
43
+ if log = options[:log]
44
+ FileUtils.touch(log) unless File.exists?(log)
45
+ ActiveRecord::Base.logger = Logger.new(log)
46
+ ActiveRecord::LogSubscriber.attach_to(:active_record)
47
+ end
48
+ end
49
+
50
+ def setup_active_record
51
+ ActiveRecord::Base.establish_connection(:adapter => 'sqlite3', :database => ':memory:')
52
+ ActiveRecord::Migration.verbose = false
53
+ DatabaseCleaner.strategy = :truncation
54
+ end
55
+ end
56
+ end
57
+ end
@@ -0,0 +1,37 @@
1
+ module Adva
2
+ module Testing
3
+ module Engine
4
+ def setup_load_paths
5
+ paths.app.each { |path| $:.unshift(path) if File.directory?(path) }
6
+ ActiveSupport::Dependencies.autoload_paths.unshift(*paths.app)
7
+ end
8
+
9
+ def migrate
10
+ ActiveRecord::Migrator.up(root.join('db/migrate'))
11
+ end
12
+
13
+ def load_assertions
14
+ load_all('lib/testing/assertions')
15
+ end
16
+
17
+ def load_factories
18
+ load_all('lib/testing/factories')
19
+ end
20
+
21
+ def load_cucumber_support
22
+ load_all('lib/testing/step_definitions')
23
+ load_all('lib/testing/paths')
24
+ end
25
+
26
+ def load_helpers
27
+ load_all('lib/testing/helpers')
28
+ end
29
+
30
+ def load_all(search)
31
+ Pathname.glob(root.join("#{search}{.rb,/*.rb}")).each do |file|
32
+ require(file) if file.exist?
33
+ end
34
+ end
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,7 @@
1
+ module Adva
2
+ module View
3
+ autoload :Form, 'adva/view/form'
4
+ autoload :Menu, 'adva/view/menu'
5
+ autoload :Tabs, 'adva/view/tabs'
6
+ end
7
+ end
@@ -0,0 +1,44 @@
1
+ module Adva
2
+ module View
3
+ class Form < Minimal::Template
4
+ autoload :Tabs, 'adva/view/form/tabs'
5
+ include Tabs
6
+
7
+ attr_reader :form
8
+
9
+ def to_html
10
+ form_tag
11
+ end
12
+
13
+ def form_tag
14
+ simple_form_for(*form_arguments) do |form|
15
+ @form = form
16
+ fields
17
+ button_group
18
+ end
19
+ end
20
+
21
+ def form_arguments
22
+ [resources]
23
+ end
24
+
25
+ def button_group
26
+ content_tag(:div, :class => 'buttons') do
27
+ buttons
28
+ end
29
+ end
30
+
31
+ def buttons
32
+ form.button :submit
33
+ end
34
+
35
+ def return_here
36
+ hidden_field_tag :return_to, request.url
37
+ end
38
+
39
+ def pass_return_to
40
+ hidden_field_tag :return_to, params[:return_to]
41
+ end
42
+ end
43
+ end
44
+ end
@@ -0,0 +1,46 @@
1
+ module Adva
2
+ module View
3
+ class Form
4
+ module Tabs
5
+ def form_for(*args, &block)
6
+ super(*args, &with_tabs(block))
7
+ end
8
+
9
+ def simple_form_for(*args, &block)
10
+ super(*args, &with_tabs(block))
11
+ end
12
+
13
+ def with_tabs(block)
14
+ if respond_to?(:sidebar)
15
+ lambda do |*args|
16
+ block.call(*args)
17
+ sidebar
18
+
19
+ div :class => :tabs do
20
+ ul do
21
+ controller.tabs.each do |tab|
22
+ li(:class => tab.active? ? :active : '') do
23
+ link_to(:"admin.tabs.#{tab.name}", "##{tab.name}")
24
+ end
25
+ end
26
+ end
27
+ controller.tabs.each do |tab|
28
+ div :id => "tab_#{tab.name}", :class => "tab #{tab.active? ? :active : ''}" do
29
+ tab.blocks.each { |block| block.call }
30
+ end
31
+ end
32
+ end
33
+ end
34
+ else
35
+ block
36
+ end
37
+ end
38
+
39
+ # should store the tabs on the form builder object instead of the controller
40
+ def tab(*args, &block)
41
+ controller.tabs.tab(*args, &block)
42
+ end
43
+ end
44
+ end
45
+ end
46
+ end
@@ -0,0 +1,51 @@
1
+ module Adva
2
+ module View
3
+ class Menu < Minimal::Template
4
+ autoload :Admin, 'adva/view/menu/admin'
5
+
6
+ def item(text, url = nil, options = {}, &block)
7
+ options.merge!(:class => text.to_s.gsub('.', '')) if text.is_a?(Symbol)
8
+ url = url_for(url) unless url.is_a?(String)
9
+ li(:class => active?(url, options) ? 'active' : nil) do
10
+ options[:type] == :label ? h4(text, options) : link_to(text, url, options)
11
+ self << capture { instance_eval(&block) } if block_given?
12
+ end
13
+ end
14
+
15
+ def label(text, url = nil, options = {}, &block)
16
+ item(text, url, options.merge(:type => :label), &block)
17
+ end
18
+
19
+ def link(text, url = '#', options = {}, &block)
20
+ item(text, url, options.merge(:type => :link), &block)
21
+ end
22
+
23
+ protected
24
+
25
+ def name
26
+ @name ||= self.class.name.demodulize.underscore
27
+ end
28
+
29
+ def css_classes
30
+ ['menu', name].uniq
31
+ end
32
+
33
+ def active?(url, options)
34
+ activate = options.key?(:activate) ? options.delete(:activate) : true
35
+ delete = options[:method] == :delete
36
+ activate && !delete && active_paths.include?(url)
37
+ end
38
+
39
+ def active_paths
40
+ @active_paths ||= path_and_parents(controller.request.fullpath)
41
+ end
42
+
43
+ def path_and_parents(path)
44
+ path.split('/').inject([]) do |paths, segment|
45
+ path = [paths.last == '/' ? '' : paths.last, segment].compact.join('/')
46
+ paths << (path.empty? ? '/' : path)
47
+ end
48
+ end
49
+ end
50
+ end
51
+ end
@@ -0,0 +1,48 @@
1
+ # Base class for admin menus. Encapsulates assumptions made by the admin layout.
2
+
3
+ module Adva
4
+ module View
5
+ class Menu
6
+ class Admin < Menu
7
+ def self.id(id)
8
+ write_inheritable_attribute(:id, id)
9
+ end
10
+
11
+ class Actions < Admin
12
+ id :actions
13
+ end
14
+
15
+ def to_html
16
+ div :id => id, :class => 'menus' do
17
+ menus
18
+ end
19
+ end
20
+
21
+ def menus
22
+ ul :class => 'menu main' do
23
+ main
24
+ end
25
+ ul :class => 'menu right' do
26
+ right
27
+ end
28
+ end
29
+
30
+ def main
31
+ end
32
+
33
+ def right
34
+ end
35
+
36
+ protected
37
+
38
+ def id
39
+ self.class.read_inheritable_attribute(:id)
40
+ end
41
+
42
+ def persisted?
43
+ resource.try(:persisted?)
44
+ end
45
+ end
46
+ end
47
+ end
48
+ end
@@ -0,0 +1,28 @@
1
+ module Adva
2
+ module View
3
+ class Tabs < Array
4
+ class Tab
5
+ attr_reader :tabs, :name
6
+
7
+ def initialize(tabs, name)
8
+ @tabs = tabs
9
+ @name = name
10
+ end
11
+
12
+ def active?
13
+ self == tabs.first
14
+ end
15
+
16
+ def blocks
17
+ @blocks ||= []
18
+ end
19
+ end
20
+
21
+ def tab(name, &block)
22
+ tab = detect { |tab| tab.name == name }
23
+ self << tab = Tab.new(self, name) unless tab
24
+ tab.blocks << block
25
+ end
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,27 @@
1
+ require 'action_view/helpers/form_helper'
2
+
3
+ ActionView::Helpers::FormBuilder.send :include do
4
+ def has_many_through_collection_check_boxes(attribute, collection, label_attribute)
5
+ through_class = object.class.reflect_on_association(attribute).class_name.constantize
6
+ foreign_key = through_class.reflect_on_all_associations(:belongs_to).detect { |r| r.class_name != object.class.name }.primary_key_name
7
+
8
+ html = ''
9
+ collection.each_with_index do |item, ix|
10
+ param = "#{object_name}[#{attribute}_attributes][#{ix}]"
11
+ through = object.send(attribute).detect { |t| t.send(foreign_key) == item.id }
12
+
13
+ if through
14
+ html << @template.hidden_field_tag("#{param}[id]", through.id, :id => '')
15
+ html << @template.hidden_field_tag("#{param}[_destroy]", '1', :id => '')
16
+ html << @template.label_tag("#{param}[_destroy]", :class => 'checkbox') do
17
+ @template.check_box_tag("#{param}[_destroy]", '0', true) + item.send(label_attribute)
18
+ end
19
+ else
20
+ html << @template.label_tag("#{param}[#{foreign_key}]", :class => 'checkbox') do
21
+ @template.check_box_tag("#{param}[#{foreign_key}]", item.id) + item.send(label_attribute)
22
+ end
23
+ end
24
+ end
25
+ html.html_safe
26
+ end
27
+ end
@@ -0,0 +1,51 @@
1
+ require 'active_support/basic_object'
2
+
3
+ ActiveRecord::Base.class_eval do
4
+ class WithoutCallbacks < ActiveSupport::BasicObject
5
+ def initialize(target, types)
6
+ @target = target
7
+ @types = types
8
+ end
9
+
10
+ def respond_to?(method, include_private = false)
11
+ @target.respond_to?(method, include_private)
12
+ end
13
+
14
+ def method_missing(method, *args, &block)
15
+ @target.skip_callbacks(*@types) do
16
+ @target.send(method, *args, &block)
17
+ end
18
+ end
19
+ end
20
+
21
+ class << self
22
+ def without_callbacks(*types)
23
+ WithoutCallbacks.new(self, types)
24
+ end
25
+
26
+ def skip_callbacks(*types)
27
+ deactivate_callbacks(*types)
28
+ yield.tap do
29
+ activate_callbacks(*types)
30
+ end
31
+ end
32
+
33
+ def deactivate_callbacks(*types)
34
+ types = [:save, :create, :update, :destroy, :touch] if types.empty?
35
+ types.each do |type|
36
+ name = :"_run_#{type}_callbacks"
37
+ alias_method(:"_deactivated_#{name}", name)
38
+ define_method(name) { |&block| block.call }
39
+ end
40
+ end
41
+
42
+ def activate_callbacks(*types)
43
+ types = [:save, :create, :update, :destroy, :touch] if types.empty?
44
+ types.each do |type|
45
+ name = :"_run_#{type}_callbacks"
46
+ alias_method(name, :"_deactivated_#{name}")
47
+ undef_method(:"_deactivated_#{name}")
48
+ end
49
+ end
50
+ end
51
+ end
@@ -0,0 +1,9 @@
1
+ class Array
2
+ def flatten_once
3
+ inject([]) { |result, elem| elem.is_a?(Array) ? result + elem : result << elem }
4
+ end
5
+
6
+ def flatten_once!
7
+ replace(flatten_once)
8
+ end
9
+ end
@@ -0,0 +1,17 @@
1
+ # from lib/core/facets/kernel/silence.rb
2
+ def silence_stream(*streams)
3
+ on_hold = streams.collect{ |stream| stream.dup }
4
+ streams.each do |stream|
5
+ stream.reopen(RUBY_PLATFORM =~ /mswin/ ? 'NUL:' : '/dev/null')
6
+ stream.sync = true
7
+ end
8
+ yield
9
+ ensure
10
+ streams.each_with_index do |stream, i|
11
+ stream.reopen(on_hold[i])
12
+ end
13
+ end
14
+
15
+ def silence_stdout
16
+ silence_stream(STDOUT) { yield }
17
+ end
@@ -0,0 +1,36 @@
1
+ # Include an anonymous module
2
+ #
3
+ # Useful for defining a class or module with a base module. So, instead of:
4
+ #
5
+ # class Foo
6
+ # module Base
7
+ # def bar
8
+ # # ...
9
+ # end
10
+ # end
11
+ # include Base
12
+ # end
13
+ #
14
+ # You can do:
15
+ #
16
+ # class Foo
17
+ # include do
18
+ # def bar
19
+ # # ...
20
+ # end
21
+ # end
22
+ # end
23
+
24
+ Class.class_eval do
25
+ def include(*args, &block)
26
+ block_given? ? super(Module.new(&block)) : super(*args)
27
+ end
28
+ end
29
+
30
+ Module.class_eval do
31
+ def include_with_anonymous(*args, &block)
32
+ block_given? ? include_without_anonymous(Module.new(&block)) : include_without_anonymous(*args)
33
+ end
34
+ alias :include_without_anonymous :include
35
+ alias :include :include_with_anonymous
36
+ end