adva-core 0.0.3 → 0.0.4

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 (285) hide show
  1. data/app/controllers/admin/base_controller.rb +20 -0
  2. data/app/controllers/admin/pages_controller.rb +7 -0
  3. data/app/controllers/admin/sections_controller.rb +22 -0
  4. data/app/controllers/admin/sites_controller.rb +16 -0
  5. data/app/controllers/articles_controller.rb +3 -0
  6. data/app/controllers/base_controller.rb +18 -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 +9 -0
  17. data/app/models/section.rb +49 -0
  18. data/app/models/site.rb +24 -0
  19. data/app/views/admin/contents/_menu.html.rb +17 -0
  20. data/app/views/admin/pages/_menu.html.rb +10 -0
  21. data/app/views/admin/pages/new.html.rb +19 -0
  22. data/app/views/admin/pages/show.html.rb +25 -0
  23. data/app/views/admin/sections/_menu.html.rb +45 -0
  24. data/app/views/admin/sections/_section.html.rb +7 -0
  25. data/app/views/admin/sections/_select_type.html.rb +16 -0
  26. data/app/views/admin/sections/index.html.rb +28 -0
  27. data/app/views/admin/sites/_menu.html.rb +2 -0
  28. data/app/views/admin/sites/edit.html.rb +22 -0
  29. data/app/views/admin/sites/index.html.rb +24 -0
  30. data/app/views/admin/sites/new.html.rb +39 -0
  31. data/app/views/admin/sites/show.html.rb +7 -0
  32. data/app/views/installations/new.html.rb +39 -0
  33. data/app/views/installations/show.html.rb +9 -0
  34. data/app/views/layouts/admin.rb +55 -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 +62 -0
  38. data/app/views/layouts/base.rb +64 -0
  39. data/app/views/layouts/default.rb +46 -0
  40. data/app/views/layouts/default/_menu.rb +19 -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 +129 -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 +40 -0
  49. data/lib/adva/active_record/has_one_default.rb +40 -0
  50. data/lib/adva/active_record/has_options.rb +55 -0
  51. data/lib/adva/cli.rb +16 -0
  52. data/lib/adva/controller.rb +7 -0
  53. data/lib/adva/controller/abstract_actions.rb +92 -0
  54. data/lib/adva/controller/internal_redirect.rb +26 -0
  55. data/lib/adva/controller/references.rb +28 -0
  56. data/lib/adva/core.rb +94 -0
  57. data/lib/adva/engine.rb +44 -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 +58 -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/helper/i18n.rb +10 -0
  88. data/lib/adva/view/menu.rb +73 -0
  89. data/lib/adva/view/menu/admin.rb +100 -0
  90. data/lib/adva/view/menu/items.rb +26 -0
  91. data/lib/adva/view/tabs.rb +28 -0
  92. data/lib/adva_core/version.rb +3 -0
  93. data/lib/core_ext/rails/action_view/has_many_through_collection_helpers.rb +27 -0
  94. data/lib/core_ext/rails/active_record/skip_callbacks.rb +51 -0
  95. data/lib/core_ext/ruby/array/flatten_once.rb +9 -0
  96. data/lib/core_ext/ruby/kernel/silence_stream.rb +17 -0
  97. data/lib/core_ext/ruby/module/include_anonymous.rb +36 -0
  98. data/lib/core_ext/ruby/module/option_reader.rb +9 -0
  99. data/lib/patches/inherited_resources.rb +35 -0
  100. data/lib/patches/rails/asset_expansion_multiple_registrations.rb +21 -0
  101. data/lib/patches/rails/integretion_runner_respond_to.rb +13 -0
  102. data/lib/patches/rails/polymorphic_url_for.rb +115 -0
  103. data/lib/patches/rails/recognize_path_env.rb +42 -0
  104. data/lib/patches/rails/route_set_to_param.rb +25 -0
  105. data/lib/patches/rails/route_set_trailing_segment.rb +13 -0
  106. data/lib/patches/rails/sti_associations.rb +17 -0
  107. data/lib/patches/rails/template_resolver_caching.rb +9 -0
  108. data/lib/patches/rails/translation_helper.rb +18 -0
  109. data/lib/patches/responders/flash_responder.rb +17 -0
  110. data/lib/patches/simple_form.rb +37 -0
  111. data/lib/patches/thor/core_ext/hash.rb +7 -0
  112. data/lib/patches/thor/group/symbolized_options.rb +8 -0
  113. data/lib/patches/webrat/links-data-method.rb +15 -0
  114. data/lib/patches/webrat/logger.rb +14 -0
  115. data/lib/patches/webrat/upload_file.rb +23 -0
  116. data/lib/testing/assertions.rb +19 -0
  117. data/lib/testing/env.rb +41 -0
  118. data/lib/testing/factories.rb +28 -0
  119. data/lib/testing/helpers/global_helpers.rb +9 -0
  120. data/lib/testing/paths.rb +54 -0
  121. data/lib/testing/step_definitions/common_steps.rb +287 -0
  122. data/lib/testing/step_definitions/debug_steps.rb +22 -0
  123. data/lib/testing/step_definitions/menu_steps.rb +11 -0
  124. data/lib/testing/step_definitions/routes_steps.rb +18 -0
  125. data/lib/testing/step_definitions/transforms.rb +50 -0
  126. data/lib/testing/step_definitions/webrat_steps.rb +284 -0
  127. data/lib/testing/step_definitions/within_steps.rb +16 -0
  128. data/lib/webrat/integrations/rails.rb +33 -0
  129. data/public/images/adva-core/admin/header_bg.png +0 -0
  130. data/public/images/adva-core/admin/menu_checkmark.png +0 -0
  131. data/public/images/adva-core/admin/section_menu_bg.png +0 -0
  132. data/public/images/adva-core/admin/tab_action_active.png +0 -0
  133. data/public/images/adva-core/admin/tab_main_active.png +0 -0
  134. data/public/images/adva-core/admin/tab_sidebar_active.png +0 -0
  135. data/public/images/adva-core/admin/tab_top_active.png +0 -0
  136. data/public/images/adva-core/asset_selected.png +0 -0
  137. data/public/images/adva-core/avatar.gif +0 -0
  138. data/public/images/adva-core/feed.mini.png +0 -0
  139. data/public/images/adva-core/filter-bg.png +0 -0
  140. data/public/images/adva-core/grid.png +0 -0
  141. data/public/images/adva-core/icons/accept.png +0 -0
  142. data/public/images/adva-core/icons/add.png +0 -0
  143. data/public/images/adva-core/icons/arrow_cross.png +0 -0
  144. data/public/images/adva-core/icons/arrow_cross_2.png +0 -0
  145. data/public/images/adva-core/icons/arrow_cross_3.png +0 -0
  146. data/public/images/adva-core/icons/arrow_up_down.png +0 -0
  147. data/public/images/adva-core/icons/assets/audio.png +0 -0
  148. data/public/images/adva-core/icons/assets/doc.png +0 -0
  149. data/public/images/adva-core/icons/assets/pdf.png +0 -0
  150. data/public/images/adva-core/icons/assets/video.png +0 -0
  151. data/public/images/adva-core/icons/attach.png +0 -0
  152. data/public/images/adva-core/icons/bin.png +0 -0
  153. data/public/images/adva-core/icons/bin_closed.png +0 -0
  154. data/public/images/adva-core/icons/bin_empty.png +0 -0
  155. data/public/images/adva-core/icons/bullet_black.png +0 -0
  156. data/public/images/adva-core/icons/bullet_delete.png +0 -0
  157. data/public/images/adva-core/icons/bullet_error.png +0 -0
  158. data/public/images/adva-core/icons/bullet_go.png +0 -0
  159. data/public/images/adva-core/icons/bullet_red.png +0 -0
  160. data/public/images/adva-core/icons/bullet_white.png +0 -0
  161. data/public/images/adva-core/icons/bullet_yellow.png +0 -0
  162. data/public/images/adva-core/icons/cancel.png +0 -0
  163. data/public/images/adva-core/icons/comment.gif +0 -0
  164. data/public/images/adva-core/icons/comment.png +0 -0
  165. data/public/images/adva-core/icons/comment_add.png +0 -0
  166. data/public/images/adva-core/icons/comment_blue.gif +0 -0
  167. data/public/images/adva-core/icons/comment_delete.png +0 -0
  168. data/public/images/adva-core/icons/comment_edit.png +0 -0
  169. data/public/images/adva-core/icons/comment_yellow.gif +0 -0
  170. data/public/images/adva-core/icons/cross.png +0 -0
  171. data/public/images/adva-core/icons/delete.png +0 -0
  172. data/public/images/adva-core/icons/eye.png +0 -0
  173. data/public/images/adva-core/icons/favorites.png +0 -0
  174. data/public/images/adva-core/icons/help.png +0 -0
  175. data/public/images/adva-core/icons/hourglass.png +0 -0
  176. data/public/images/adva-core/icons/icon_attachment.gif +0 -0
  177. data/public/images/adva-core/icons/icon_padlock.gif +0 -0
  178. data/public/images/adva-core/icons/link.png +0 -0
  179. data/public/images/adva-core/icons/lock.png +0 -0
  180. data/public/images/adva-core/icons/magnifier.png +0 -0
  181. data/public/images/adva-core/icons/minus.gif +0 -0
  182. data/public/images/adva-core/icons/page_add.png +0 -0
  183. data/public/images/adva-core/icons/page_delete.png +0 -0
  184. data/public/images/adva-core/icons/page_edit.png +0 -0
  185. data/public/images/adva-core/icons/page_favorites.png +0 -0
  186. data/public/images/adva-core/icons/page_go.png +0 -0
  187. data/public/images/adva-core/icons/page_green.png +0 -0
  188. data/public/images/adva-core/icons/page_red.png +0 -0
  189. data/public/images/adva-core/icons/page_white_add.png +0 -0
  190. data/public/images/adva-core/icons/page_white_delete.png +0 -0
  191. data/public/images/adva-core/icons/page_white_edit.png +0 -0
  192. data/public/images/adva-core/icons/page_white_go.png +0 -0
  193. data/public/images/adva-core/icons/page_white_link.png +0 -0
  194. data/public/images/adva-core/icons/page_white_magnify.png +0 -0
  195. data/public/images/adva-core/icons/pencil.png +0 -0
  196. data/public/images/adva-core/icons/star.png +0 -0
  197. data/public/images/adva-core/icons/stop.png +0 -0
  198. data/public/images/adva-core/icons/tag_green.png +0 -0
  199. data/public/images/adva-core/icons/tick.png +0 -0
  200. data/public/images/adva-core/icons/zoom.png +0 -0
  201. data/public/images/adva-core/indicator.gif +0 -0
  202. data/public/images/adva-core/lines.png +0 -0
  203. data/public/images/adva-core/preview.png +0 -0
  204. data/public/images/adva-core/theme_selected.png +0 -0
  205. data/public/javascripts/adva-core/admin.js +22 -0
  206. data/public/javascripts/adva-core/jquery/jquery-1.4.2.min.js +154 -0
  207. data/public/javascripts/adva-core/jquery/jquery.table_tree.js +296 -0
  208. data/public/javascripts/adva-core/jquery/jquery.tablednd_0_5.js +385 -0
  209. data/public/javascripts/adva-core/rails.js +127 -0
  210. data/public/javascripts/backup/admin/jquery.admin.js +75 -0
  211. data/public/javascripts/backup/admin/jquery.article.js +22 -0
  212. data/public/javascripts/backup/admin/jquery.cached_pages.js +14 -0
  213. data/public/javascripts/backup/admin/jquery.table_tree.backup.js +279 -0
  214. data/public/javascripts/backup/admin/jquery.table_tree.js +10 -0
  215. data/public/javascripts/backup/application.js +38 -0
  216. data/public/javascripts/backup/application.prototype.js +135 -0
  217. data/public/javascripts/backup/builder.js +136 -0
  218. data/public/javascripts/backup/controls.js +965 -0
  219. data/public/javascripts/backup/cookie.js +49 -0
  220. data/public/javascripts/backup/dragdrop.js +975 -0
  221. data/public/javascripts/backup/effects.js +1130 -0
  222. data/public/javascripts/backup/flash.js +49 -0
  223. data/public/javascripts/backup/jquery.dates.js +49 -0
  224. data/public/javascripts/backup/jquery.flash.js +40 -0
  225. data/public/javascripts/backup/jquery.roles.js +23 -0
  226. data/public/javascripts/backup/jquery/jquery-lowpro.js +224 -0
  227. data/public/javascripts/backup/jquery/jquery-ui.js +273 -0
  228. data/public/javascripts/backup/jquery/jquery.js +19 -0
  229. data/public/javascripts/backup/jquery/jquery.qtip.min.js +15 -0
  230. data/public/javascripts/backup/json.js +139 -0
  231. data/public/javascripts/backup/lowpro.js +320 -0
  232. data/public/javascripts/backup/parseuri.js +39 -0
  233. data/public/javascripts/backup/prototype.js +4320 -0
  234. data/public/javascripts/backup/roles.js +16 -0
  235. data/public/javascripts/backup/scriptaculous.js +60 -0
  236. data/public/javascripts/backup/slider.js +275 -0
  237. data/public/javascripts/backup/sound.js +55 -0
  238. data/public/javascripts/backup/unittest.js +568 -0
  239. data/public/stylesheets/adva-core/admin/forms.css +172 -0
  240. data/public/stylesheets/adva-core/admin/layout.css +38 -0
  241. data/public/stylesheets/adva-core/admin/lists.css +54 -0
  242. data/public/stylesheets/adva-core/admin/navigation.css +234 -0
  243. data/public/stylesheets/adva-core/admin/sidebar.css +87 -0
  244. data/public/stylesheets/adva-core/admin/styles.css +130 -0
  245. data/public/stylesheets/adva-core/common/forms.css +174 -0
  246. data/public/stylesheets/adva-core/common/layout.css +93 -0
  247. data/public/stylesheets/adva-core/common/reset.css +42 -0
  248. data/public/stylesheets/adva-core/common/styles.css +41 -0
  249. data/public/stylesheets/adva-core/default/layout.css +0 -0
  250. data/public/stylesheets/adva-core/default/styles.css +0 -0
  251. data/public/stylesheets/adva-core/simple/layout.css +11 -0
  252. data/public/stylesheets/backup/alternate/common.css +76 -0
  253. data/public/stylesheets/backup/alternate/forms.css +121 -0
  254. data/public/stylesheets/backup/alternate/header.css +125 -0
  255. data/public/stylesheets/backup/alternate/layout.css +103 -0
  256. data/public/stylesheets/backup/alternate/lists.css +153 -0
  257. data/public/stylesheets/backup/alternate/sidebar.css +65 -0
  258. data/public/stylesheets/backup/alternate/top.css +123 -0
  259. data/public/stylesheets/backup/content.css +11 -0
  260. data/public/stylesheets/backup/helptip.css +35 -0
  261. data/public/stylesheets/backup/jquery/alternate/jquery.tooltip.css +13 -0
  262. data/public/stylesheets/backup/jquery/images/ui-bg_flat_0_aaaaaa_40x100.png +0 -0
  263. data/public/stylesheets/backup/jquery/images/ui-bg_flat_75_ffffff_40x100.png +0 -0
  264. data/public/stylesheets/backup/jquery/images/ui-bg_glass_55_fbf9ee_1x400.png +0 -0
  265. data/public/stylesheets/backup/jquery/images/ui-bg_glass_65_ffffff_1x400.png +0 -0
  266. data/public/stylesheets/backup/jquery/images/ui-bg_glass_75_dadada_1x400.png +0 -0
  267. data/public/stylesheets/backup/jquery/images/ui-bg_glass_75_e6e6e6_1x400.png +0 -0
  268. data/public/stylesheets/backup/jquery/images/ui-bg_glass_95_fef1ec_1x400.png +0 -0
  269. data/public/stylesheets/backup/jquery/images/ui-bg_highlight-soft_75_cccccc_1x100.png +0 -0
  270. data/public/stylesheets/backup/jquery/images/ui-icons_222222_256x240.png +0 -0
  271. data/public/stylesheets/backup/jquery/images/ui-icons_2e83ff_256x240.png +0 -0
  272. data/public/stylesheets/backup/jquery/images/ui-icons_454545_256x240.png +0 -0
  273. data/public/stylesheets/backup/jquery/images/ui-icons_888888_256x240.png +0 -0
  274. data/public/stylesheets/backup/jquery/images/ui-icons_cd0a0a_256x240.png +0 -0
  275. data/public/stylesheets/backup/jquery/jquery-ui.css +405 -0
  276. data/public/stylesheets/backup/jquery/jquery.tooltip.css +10 -0
  277. data/public/stylesheets/backup/layout.css +22 -0
  278. data/public/stylesheets/backup/lists.css +17 -0
  279. data/public/stylesheets/backup/menu.css +129 -0
  280. data/public/stylesheets/backup/projection.css +118 -0
  281. data/public/stylesheets/backup/screen/top.css +8 -0
  282. data/public/stylesheets/backup/themes.css +49 -0
  283. data/public/stylesheets/backup/users.css +40 -0
  284. metadata +338 -40
  285. data/lib/bundler/repository.rb +0 -118
@@ -0,0 +1,20 @@
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 :tabs
12
+
13
+ def self.responder
14
+ Adva::Responder
15
+ end
16
+
17
+ def tabs
18
+ @tabs ||= Adva::View::Tabs.new
19
+ end
20
+ end
@@ -0,0 +1,7 @@
1
+ class Admin::PagesController < Admin::SectionsController
2
+ purges :create, :update
3
+
4
+ def update
5
+ update! { |success, failure| failure.html { render :show } }
6
+ end
7
+ end
@@ -0,0 +1,22 @@
1
+ class Admin::SectionsController < Admin::BaseController
2
+ belongs_to :site
3
+
4
+ respond_to :html
5
+ respond_to :json, :only => :update
6
+
7
+ before_filter :protect_last_section, :only => :destroy
8
+
9
+ helper :sections
10
+ abstract_actions :except => [:index, :destroy]
11
+
12
+ purges :destroy
13
+
14
+ protected
15
+
16
+ def protect_last_section
17
+ if site.sections.count == 1
18
+ resource.errors[:error] = [:last_section_cant_be_destroyed]
19
+ respond_with(resources)
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,16 @@
1
+ class Admin::SitesController < Admin::BaseController
2
+ respond_to :html
3
+ respond_to :json, :only => :update
4
+
5
+ purges :update, :destroy
6
+
7
+ before_filter :set_params_for_nested_resources, :only => [:new, :edit]
8
+
9
+ helper :sections
10
+
11
+ protected
12
+
13
+ def set_params_for_nested_resources
14
+ params[:site] ||= { :host => request.host, :sections_attributes => [{ :name => '' }] }
15
+ end
16
+ end
@@ -0,0 +1,3 @@
1
+ class ArticlesController < BaseController
2
+ belongs_to :page, :singleton => true
3
+ end
@@ -0,0 +1,18 @@
1
+ require 'inherited_resources'
2
+ require 'inherited_resources/helpers'
3
+
4
+ class BaseController < InheritedResources::Base
5
+ begin_of_association_chain :site
6
+ tracks :resource, :resources, :collection, :site => %w(.title .name .sections)
7
+
8
+ layout 'default'
9
+ helper_method :site
10
+
11
+ def self.responder
12
+ Adva::Responder
13
+ end
14
+
15
+ def site
16
+ @site ||= Site.by_host(request.host_with_port)
17
+ end
18
+ 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.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 [user dependency] 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,9 @@
1
+ class Page < Section
2
+ has_one :article, :foreign_key => 'section_id', :inverse_of => :section, :dependent => :destroy, :default => :build_default_article
3
+ accepts_nested_attributes_for :article
4
+ delegate :title=, :body=, :to => :article
5
+
6
+ def build_default_article
7
+ build_article(:site => site, :title => name)
8
+ end
9
+ end
@@ -0,0 +1,49 @@
1
+ class Section < ActiveRecord::Base
2
+ extend ActiveSupport::Memoizable
3
+
4
+ belongs_to :site, :inverse_of => :sections
5
+
6
+ validates_presence_of :site, :name, :slug
7
+ # validates_uniqueness_of :slug, :scope => [:site_id, :parent_id]
8
+
9
+ has_slug :scope => :site_id
10
+ acts_as_nested_set :scope => :site_id
11
+
12
+ mattr_accessor :types
13
+ self.types = []
14
+
15
+ class << self
16
+ def inherited(child)
17
+ types << child.name
18
+ super
19
+ end
20
+
21
+ def type_names
22
+ @type_names ||= types.map(&:underscore)
23
+ end
24
+ end
25
+
26
+ def type
27
+ read_attribute(:type) || 'Page'
28
+ end
29
+
30
+ def path
31
+ home? ? '' : super
32
+ end
33
+
34
+ def home?
35
+ root? && previous_sibling.nil?
36
+ end
37
+
38
+ def attributes_protected_by_default
39
+ default = [self.class.primary_key]
40
+ default << 'id' unless self.class.primary_key.eql? 'id'
41
+ default
42
+ end
43
+
44
+ protected
45
+
46
+ def _path
47
+ read_attribute(:path)
48
+ end
49
+ end
@@ -0,0 +1,24 @@
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
+ class << self
12
+ def install(params)
13
+ User.skip_callbacks do # TODO [user dependency] move to adva-user
14
+ site = Site.create!(params[:site])
15
+ site.account.users.first.confirm!
16
+ site
17
+ end
18
+ end
19
+
20
+ def by_host(host)
21
+ Site.count == 1 ? Site.first : Site.find_by_host(host) # TODO [site detection] figure out how we want to do this ...
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,17 @@
1
+ class Admin::Contents::Menu < Adva::View::Menu::Admin::Actions
2
+ include do
3
+ def main
4
+ resource_section_label
5
+ index
6
+ edit_parent
7
+ end
8
+
9
+ def right
10
+ new
11
+ if persisted?
12
+ edit
13
+ destroy
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,10 @@
1
+ require_dependency 'admin/sections/_menu.html'
2
+
3
+ class Admin::Pages::Menu < Admin::Sections::Menu
4
+ include do
5
+ def right
6
+ super
7
+ destroy if show?
8
+ end
9
+ end
10
+ 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,45 @@
1
+ # Base menu for sections. Also used on admin/sections/new.
2
+ class Admin::Sections::Menu < Adva::View::Menu::Admin::Actions
3
+ include do
4
+ def main
5
+ if collection?
6
+ index
7
+ else
8
+ resource_label
9
+ show
10
+ edit unless page?
11
+ end
12
+ end
13
+
14
+ def right
15
+ new if collection?
16
+ destroy if edit?
17
+ reorder if index? && collection.size > 1
18
+ end
19
+
20
+ protected
21
+
22
+ def index
23
+ item(:".sections", index_parent_path(:sections))
24
+ end
25
+
26
+ def reorder
27
+ super( :'data-resource_type' => 'site', :'data-sortable_type' => 'sections')
28
+ end
29
+
30
+ def page?
31
+ resource.is_a?(Page)
32
+ end
33
+
34
+ def edit
35
+ item(:'.edit_section', edit_path)
36
+ end
37
+
38
+ def active?(url, options)
39
+ # hmmm ...
40
+ types = Section.types.map { |type| type.underscore.pluralize }.join('|')
41
+ return false if url =~ %r(/admin/sites/\d+/#{types}/\d+$) && request.path != url
42
+ super
43
+ end
44
+ end
45
+ 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(:'.actions.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