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,21 @@
1
+ require 'adva/controller/internal_redirect'
2
+ require 'inherited_resources'
3
+ require 'inherited_resources/helpers'
4
+
5
+ class Admin::BaseController < InheritedResources::Base
6
+ include UrlHelper
7
+
8
+ respond_to :html
9
+ layout 'admin'
10
+
11
+ helper_method :account, :tabs
12
+ delegate :account, :to => :site
13
+
14
+ def self.responder
15
+ Adva::Responder
16
+ end
17
+
18
+ def tabs
19
+ @tabs ||= Adva::View::Tabs.new
20
+ end
21
+ end
@@ -0,0 +1,9 @@
1
+ class Admin::PagesController < Admin::SectionsController
2
+ purges :create, :update
3
+
4
+ def update
5
+ update! do |success, failure|
6
+ failure.html { render :show }
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,36 @@
1
+ class Admin::SectionsController < Admin::BaseController
2
+ belongs_to :site
3
+
4
+ before_filter :set_params_for_nested_resources, :only => [:new, :create, :edit, :update]
5
+ before_filter :protect_last_section, :only => :destroy
6
+
7
+ helper :sections
8
+ abstract_actions :except => [:index, :destroy]
9
+
10
+ purges :destroy
11
+
12
+ def create
13
+ resource.save
14
+ respond_with *resources
15
+ end
16
+
17
+ protected
18
+
19
+ def set_params_for_nested_resources
20
+ params[:section] ||= { :type => 'Page' }
21
+ if params[:section][:type] == 'Page'
22
+ # FIXME! this seems to insert tons of empty articles on update if :article_attributes is empty.
23
+ # shouldn't happen with a regular form submit but still seems a bit ugly
24
+ params[:section][:article_attributes] ||= { :body => '' } if params[:action] == 'new'
25
+ else
26
+ params[:section].delete(:article_attributes)
27
+ end
28
+ end
29
+
30
+ def protect_last_section
31
+ if site.sections.count == 1
32
+ flash[:error] = t(:'flash.actions.destroy.alert', :resource_name => resource.class.model_name)
33
+ respond_with(resources)
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,18 @@
1
+ class Admin::SitesController < Admin::BaseController
2
+ purges :update, :destroy
3
+
4
+ before_filter :set_params_for_nested_resources, :only => [:new, :edit]
5
+ before_filter :set_account, :only => :create
6
+
7
+ helper :sections
8
+
9
+ protected
10
+
11
+ def set_params_for_nested_resources
12
+ params[:site] ||= { :host => request.host, :sections_attributes => [{ :name => '' }] }
13
+ end
14
+
15
+ def set_account
16
+ params[:site][:account_id] = Account.first.id # TODO
17
+ end
18
+ end
@@ -0,0 +1,3 @@
1
+ class ArticlesController < BaseController
2
+ belongs_to :page, :singleton => true
3
+ end
@@ -0,0 +1,22 @@
1
+ require 'inherited_resources'
2
+ require 'inherited_resources/helpers'
3
+ require 'simple_table'
4
+
5
+ ActionView::Base.send(:include, SimpleTable) # TODO should be in simple_table
6
+
7
+ class BaseController < InheritedResources::Base
8
+ begin_of_association_chain :site
9
+ tracks :resource, :resources, :collection, :site => %w(.title .name .sections)
10
+
11
+ layout 'default'
12
+ helper_method :account, :site
13
+ delegate :account, :to => :site
14
+
15
+ def self.responder
16
+ Adva::Responder
17
+ end
18
+
19
+ def site
20
+ @site ||= Site.by_host(request.host_with_port)
21
+ end
22
+ end
@@ -0,0 +1,28 @@
1
+ class InstallationsController < BaseController
2
+ defaults :resource_class => Site, :instance_name => 'site'
3
+
4
+ layout 'simple'
5
+ helper :sections
6
+
7
+ before_filter :set_params_for_nested_resources, :only => [:new, :create]
8
+ before_filter :protect_install, :only => [:new, :create]
9
+
10
+ def create
11
+ @site = Site.install(params)
12
+ respond_with resource
13
+ end
14
+
15
+ protected
16
+ def set_params_for_nested_resources
17
+ params[:site] ||= {}
18
+ params[:site].reverse_merge!(:host => request.host_with_port, :title => params[:site][:name], :account_attributes => {})
19
+ params[:site][:sections_attributes] ||= [{ :type => 'Page', :name => I18n.t(:'section.default_name', :default => 'Home') }]
20
+ end
21
+
22
+ def protect_install
23
+ if Site.find_by_host(request.host_with_port)
24
+ flash[:error] = t(:'flash.installation.protected', :host => request.host_with_port)
25
+ redirect_to admin_sites_url # TODO figure out how to remove the user dependency
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,2 @@
1
+ class PagesController < BaseController
2
+ end
@@ -0,0 +1,3 @@
1
+ class SectionsController < BaseController
2
+ abstract_actions :except => :index
3
+ end
@@ -0,0 +1,13 @@
1
+ module FormHelper
2
+ def fieldset(&block)
3
+ content_tag(:fieldset, &block)
4
+ end
5
+
6
+ def column(&block)
7
+ content_tag(:div, :class => 'column', &block)
8
+ end
9
+
10
+ def button_group(&block)
11
+ content_tag(:div, :class => 'buttons', &block)
12
+ end
13
+ end
@@ -0,0 +1,7 @@
1
+ module SectionsHelper
2
+ def section_types_option_values
3
+ Section.types.map do |type|
4
+ [t(:"section.types.#{type.demodulize.underscore}"), type]
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,18 @@
1
+ require 'core_ext/ruby/module/include_anonymous'
2
+
3
+ module UrlHelper
4
+ def self.included(base)
5
+ base.send(:helper_method, public_instance_methods)
6
+ end
7
+
8
+ include do
9
+ def public_url
10
+ public_url_for(resources.reject { |r| r.respond_to?(:new_record?) && r.new_record? })
11
+ end
12
+
13
+ def public_url_for(resources, options = {})
14
+ resources -= [:admin, site]
15
+ resources.empty? ? "http://#{site.host}" : polymorphic_url(resources, options)
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,3 @@
1
+ class Account < ActiveRecord::Base
2
+ has_many :sites, :dependent => :destroy
3
+ end
@@ -0,0 +1,2 @@
1
+ class Article < Content
2
+ end
@@ -0,0 +1,4 @@
1
+ class Content < ActiveRecord::Base
2
+ belongs_to :site
3
+ belongs_to :section
4
+ end
@@ -0,0 +1,17 @@
1
+ class Page < Section
2
+ has_one :article, :foreign_key => 'section_id', :inverse_of => :section, :dependent => :destroy
3
+ validates_presence_of :article
4
+ accepts_nested_attributes_for :article
5
+ before_validation :ensure_default_article
6
+
7
+ def body=(body)
8
+ ensure_default_article
9
+ article.body = body
10
+ end
11
+
12
+ protected
13
+
14
+ def ensure_default_article
15
+ build_article(:site => site, :section => self, :title => name) unless article.present?
16
+ end
17
+ end
@@ -0,0 +1,59 @@
1
+ class Section < ActiveRecord::Base
2
+ extend ActiveSupport::Memoizable
3
+
4
+ belongs_to :site, :inverse_of => :sections
5
+
6
+ # unfortunate, but moving this to a adva-categories/section_slice breaks because
7
+ # class_inheritable_attributes get out of sync and crash. this might change if we
8
+ # were able to load code slices lazily
9
+ if Adva.engine?(:categories)
10
+ has_many :categories, :foreign_key => :section_id
11
+ accepts_nested_attributes_for :categories
12
+ end
13
+
14
+ validates_presence_of :site, :name, :slug
15
+
16
+ has_slug :scope => :site_id
17
+ acts_as_nested_set # FIXME must scope to site_id
18
+ serialize :options # FIXME should be in has_options, but the class_inheritable_accessor :serialized_attributes seems to get out of sync
19
+
20
+ # validates_uniqueness_of :slug, :scope => [:site_id, :parent_id]
21
+
22
+ mattr_accessor :types
23
+ self.types ||= [] # FIXME model is loaded twice, at least in cucumber
24
+
25
+ class << self
26
+ def inherited(child)
27
+ types << child.name
28
+ super
29
+ end
30
+
31
+ def type_names
32
+ @type_names ||= types.map(&:underscore)
33
+ end
34
+ end
35
+
36
+ def type
37
+ read_attribute(:type) || 'Section'
38
+ end
39
+
40
+ def path
41
+ _path == site.home_section.send(:_path) ? '' : _path
42
+ end
43
+
44
+ def home?
45
+ root? && previous_sibling.nil?
46
+ end
47
+
48
+ def attributes_protected_by_default
49
+ default = [self.class.primary_key]
50
+ default << 'id' unless self.class.primary_key.eql? 'id'
51
+ default
52
+ end
53
+
54
+ protected
55
+
56
+ def _path
57
+ read_attribute(:path)
58
+ end
59
+ end
@@ -0,0 +1,26 @@
1
+ class Site < ActiveRecord::Base
2
+ validates_presence_of :host, :name, :title
3
+ validates_uniqueness_of :host
4
+
5
+ belongs_to :account
6
+ has_many :sections, :inverse_of => :site, :dependent => :destroy
7
+ has_many :pages, :dependent => :destroy
8
+
9
+ accepts_nested_attributes_for :account, :sections
10
+
11
+ has_one :home_section, :class_name => 'Section', :conditions => 'parent_id IS NULL', :order => 'lft'
12
+
13
+ class << self
14
+ def install(params)
15
+ User.skip_callbacks do # TODO remove user dependency, test failure
16
+ site = Site.create!(params[:site])
17
+ site.account.users.first.confirm!
18
+ site
19
+ end
20
+ end
21
+
22
+ def by_host(host)
23
+ Site.count == 1 ? Site.first : Site.find_by_host(host) # TODO figure out how we want to do this ...
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,30 @@
1
+ class Admin::Pages::Menu < Adva::View::Menu::Admin::Actions
2
+ include do
3
+ def main
4
+ if resource.try(:persisted?)
5
+ label(resource.name)
6
+ item(:'.show', show_path)
7
+ else
8
+ item(:'.sections', index_path)
9
+ end
10
+ end
11
+
12
+ def right
13
+ if resource.try(:persisted?)
14
+ item(:'.view', public_url)
15
+ item(:'.destroy', resource_path, :method => :delete, :confirm => t(:'.confirm_destroy', :model_name => resource.class.model_name.human))
16
+ else
17
+ item(:'.new', new_path)
18
+ end
19
+ end
20
+
21
+ protected
22
+
23
+ def active?(url, options)
24
+ # hmmm ...
25
+ types = Section.types.map { |type| type.underscore.pluralize }.join('|')
26
+ return false if url =~ %r(/admin/sites/\d+/#{types}/\d+$) && request.path != url
27
+ super
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,19 @@
1
+ class Admin::Pages::New < Adva::View::Form
2
+ include do
3
+ def to_html
4
+ h2 :'.title'
5
+ render 'admin/sections/select_type'
6
+ super
7
+ end
8
+
9
+ def fields
10
+ fieldset do
11
+ form.hidden_field :type
12
+ form.input :name
13
+ form.simple_fields_for(:article) do |a|
14
+ a.input :body
15
+ end
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,25 @@
1
+ class Admin::Pages::Show < Adva::View::Form
2
+ include do
3
+ def to_html
4
+ h2 :'.title'
5
+ super
6
+ end
7
+
8
+ def fields
9
+ form.simple_fields_for(:article) do |a|
10
+ a.input :body
11
+ end
12
+ end
13
+
14
+ def buttons
15
+ form.button :submit
16
+ end
17
+
18
+ def sidebar
19
+ tab :options do
20
+ form.input :name
21
+ form.input :slug
22
+ end
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,12 @@
1
+ class Admin::Sections::Menu < Adva::View::Menu::Admin::Actions
2
+ include do
3
+ def main
4
+ item(:'.sections', index_path)
5
+ end
6
+
7
+ def right
8
+ item(:'.new', new_path)
9
+ item(:'.reorder', index_path, :activate => false)
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,7 @@
1
+ class Admin::Sections::Section < Minimal::Template
2
+ include do
3
+ def to_html
4
+ p { link_to(section.name, [:admin, section.site, section]) }
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,16 @@
1
+ class Admin::Sections::SelectType < Minimal::Template
2
+ def to_html
3
+ simple_form_for(resources, :as => :section, :url => { :action => :new }, :html => { :method => :get, :class => 'section_type' }) do |f|
4
+ fieldset do
5
+ f.label :type
6
+ div :class => :radio_group do
7
+ section_types_option_values.each do |name, value|
8
+ f.radio_button :type, value, :class => :section_type
9
+ f.label "type_#{value.underscore}", name, :class => :inline
10
+ end
11
+ f.submit 'Select', :class => :inline
12
+ end
13
+ end
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,28 @@
1
+ class Admin::Sections::Index < Minimal::Template
2
+ include do
3
+ def to_html
4
+ table_for collection, :collection_name => :sections, :class => 'sections list tree' do |t|
5
+ t.column :section
6
+ t.column :actions, :class => :actions
7
+
8
+ t.row(:class => 'section') do |r, section|
9
+ r.add_class "level_#{section.level}"
10
+ r.cell link_to_section(section)
11
+ r.cell links_to_actions([:view, :edit, :destroy], section)
12
+ end
13
+ end
14
+ end
15
+
16
+ def link_to_section(section)
17
+ status(section) + capture { link_to(section.name, url_for([:admin, site, section])) } # :class => section.state
18
+ end
19
+
20
+ def link_to_view(section)
21
+ capture { link_to(:'.view', public_url_for([section]), :class => :view) }
22
+ end
23
+
24
+ def status(section)
25
+ capture { span(t(:'.published'), :title => t(:'.published'), :class => 'status published') }
26
+ end
27
+ end
28
+ end