lucy_cms 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 (245) hide show
  1. data/Gemfile +19 -0
  2. data/Gemfile.lock +88 -0
  3. data/LICENSE +24 -0
  4. data/README.md +161 -0
  5. data/Rakefile +26 -0
  6. data/VERSION +1 -0
  7. data/app/controllers/application_controller.rb +5 -0
  8. data/app/controllers/cms_admin/base_controller.rb +43 -0
  9. data/app/controllers/cms_admin/layouts_controller.rb +66 -0
  10. data/app/controllers/cms_admin/pages_controller.rb +111 -0
  11. data/app/controllers/cms_admin/sessions_controller.rb +25 -0
  12. data/app/controllers/cms_admin/sites_controller.rb +69 -0
  13. data/app/controllers/cms_admin/snippets_controller.rb +62 -0
  14. data/app/controllers/cms_admin/upload_dirs_controller.rb +79 -0
  15. data/app/controllers/cms_admin/users_controller.rb +129 -0
  16. data/app/controllers/cms_content_controller.rb +51 -0
  17. data/app/models/cms_block.rb +28 -0
  18. data/app/models/cms_layout.rb +118 -0
  19. data/app/models/cms_page.rb +163 -0
  20. data/app/models/cms_site.rb +38 -0
  21. data/app/models/cms_snippet.rb +70 -0
  22. data/app/models/cms_upload.rb +19 -0
  23. data/app/models/cms_upload_dir.rb +11 -0
  24. data/app/models/cms_user.rb +93 -0
  25. data/app/views/cms_admin/layouts/_form.html.erb +10 -0
  26. data/app/views/cms_admin/layouts/_index_branch.html.erb +24 -0
  27. data/app/views/cms_admin/layouts/edit.html.erb +6 -0
  28. data/app/views/cms_admin/layouts/index.html.erb +6 -0
  29. data/app/views/cms_admin/layouts/new.html.erb +6 -0
  30. data/app/views/cms_admin/pages/_form.html.erb +37 -0
  31. data/app/views/cms_admin/pages/_form_blocks.html.erb +7 -0
  32. data/app/views/cms_admin/pages/_index_branch.html.erb +40 -0
  33. data/app/views/cms_admin/pages/edit.html.erb +5 -0
  34. data/app/views/cms_admin/pages/form_blocks.js.erb +2 -0
  35. data/app/views/cms_admin/pages/index.html.erb +6 -0
  36. data/app/views/cms_admin/pages/new.html.erb +5 -0
  37. data/app/views/cms_admin/pages/toggle_branch.js.erb +11 -0
  38. data/app/views/cms_admin/sessions/new.html.erb +12 -0
  39. data/app/views/cms_admin/sites/_form.html.erb +16 -0
  40. data/app/views/cms_admin/sites/edit.html.erb +6 -0
  41. data/app/views/cms_admin/sites/new.html.erb +6 -0
  42. data/app/views/cms_admin/sites/setup.html.erb +16 -0
  43. data/app/views/cms_admin/snippets/_form.html.erb +4 -0
  44. data/app/views/cms_admin/snippets/edit.html.erb +6 -0
  45. data/app/views/cms_admin/snippets/index.html.erb +23 -0
  46. data/app/views/cms_admin/snippets/new.html.erb +6 -0
  47. data/app/views/cms_admin/upload_dirs/_file.html.erb +15 -0
  48. data/app/views/cms_admin/upload_dirs/_form.html.erb +2 -0
  49. data/app/views/cms_admin/upload_dirs/conflict.html.erb +12 -0
  50. data/app/views/cms_admin/upload_dirs/index.html.erb +23 -0
  51. data/app/views/cms_admin/upload_dirs/new.html.erb +6 -0
  52. data/app/views/cms_admin/upload_dirs/show.html.erb +26 -0
  53. data/app/views/cms_admin/upload_dirs/uploads_destroy.js.erb +3 -0
  54. data/app/views/cms_admin/users/_form.html.erb +9 -0
  55. data/app/views/cms_admin/users/_index_branch.html.erb +16 -0
  56. data/app/views/cms_admin/users/change_password.html.erb +14 -0
  57. data/app/views/cms_admin/users/edit.html.erb +17 -0
  58. data/app/views/cms_admin/users/index.html.erb +6 -0
  59. data/app/views/cms_admin/users/new.html.erb +14 -0
  60. data/app/views/layouts/cms_admin.html.erb +52 -0
  61. data/config/application.rb +48 -0
  62. data/config/boot.rb +13 -0
  63. data/config/database.yml +22 -0
  64. data/config/environment.rb +5 -0
  65. data/config/environments/development.rb +22 -0
  66. data/config/environments/production.rb +49 -0
  67. data/config/environments/test.rb +35 -0
  68. data/config/initializers/LucyCMS.rb +37 -0
  69. data/config/initializers/mime_types.rb +5 -0
  70. data/config/locales/en.yml +5 -0
  71. data/config/routes.rb +45 -0
  72. data/config.ru +4 -0
  73. data/db/cms_seeds/example.local/layouts/default.yml +8 -0
  74. data/db/cms_seeds/example.local/layouts/nested.yml +6 -0
  75. data/db/cms_seeds/example.local/pages/child/subchild.yml +14 -0
  76. data/db/cms_seeds/example.local/pages/child.yml +10 -0
  77. data/db/cms_seeds/example.local/pages/index.yml +11 -0
  78. data/db/cms_seeds/example.local/snippets/example.yml +4 -0
  79. data/db/migrate/01_create_cms.rb +114 -0
  80. data/db/seeds.rb +7 -0
  81. data/lib/LucyCMS/acts_as_tree.rb +102 -0
  82. data/lib/LucyCMS/cms_tag/field_datetime.rb +26 -0
  83. data/lib/LucyCMS/cms_tag/field_integer.rb +26 -0
  84. data/lib/LucyCMS/cms_tag/field_string.rb +26 -0
  85. data/lib/LucyCMS/cms_tag/field_text.rb +26 -0
  86. data/lib/LucyCMS/cms_tag/helper.rb +20 -0
  87. data/lib/LucyCMS/cms_tag/page_datetime.rb +22 -0
  88. data/lib/LucyCMS/cms_tag/page_integer.rb +22 -0
  89. data/lib/LucyCMS/cms_tag/page_rich_text.rb +22 -0
  90. data/lib/LucyCMS/cms_tag/page_string.rb +22 -0
  91. data/lib/LucyCMS/cms_tag/page_text.rb +22 -0
  92. data/lib/LucyCMS/cms_tag/partial.rb +21 -0
  93. data/lib/LucyCMS/cms_tag/snippet.rb +22 -0
  94. data/lib/LucyCMS/cms_tag.rb +119 -0
  95. data/lib/LucyCMS/configuration.rb +36 -0
  96. data/lib/LucyCMS/controller_methods.rb +42 -0
  97. data/lib/LucyCMS/engine.rb +12 -0
  98. data/lib/LucyCMS/form_builder.rb +129 -0
  99. data/lib/LucyCMS/rails_extensions.rb +22 -0
  100. data/lib/LucyCMS/site_form_builder.rb +129 -0
  101. data/lib/LucyCMS/view_hooks.rb +30 -0
  102. data/lib/LucyCMS/view_methods.rb +68 -0
  103. data/lib/LucyCMS.rb +40 -0
  104. data/lib/generators/README +17 -0
  105. data/lib/generators/cms_generator.rb +44 -0
  106. data/lib/tasks/LucyCMS.rake +283 -0
  107. data/lucy_cms.gemspec +100 -0
  108. data/public/404.html +26 -0
  109. data/public/422.html +26 -0
  110. data/public/500.html +26 -0
  111. data/public/favicon.ico +0 -0
  112. data/public/images/LucyCMS/arrow_bottom.gif +0 -0
  113. data/public/images/LucyCMS/arrow_right.gif +0 -0
  114. data/public/images/LucyCMS/icon_folder.png +0 -0
  115. data/public/images/LucyCMS/icon_layout.gif +0 -0
  116. data/public/images/LucyCMS/icon_move.gif +0 -0
  117. data/public/images/LucyCMS/icon_regular.gif +0 -0
  118. data/public/images/LucyCMS/icon_snippet.gif +0 -0
  119. data/public/images/LucyCMS/icon_upload.png +0 -0
  120. data/public/images/LucyCMS/icon_user.jpg +0 -0
  121. data/public/javascripts/LucyCMS/cms.js +204 -0
  122. data/public/javascripts/LucyCMS/codemirror/codemirror.css +102 -0
  123. data/public/javascripts/LucyCMS/codemirror/codemirror.js +23 -0
  124. data/public/javascripts/LucyCMS/codemirror/codemirror_base.js +88 -0
  125. data/public/javascripts/LucyCMS/codemirror/parse_css.js +4 -0
  126. data/public/javascripts/LucyCMS/codemirror/parse_html_mixed.js +3 -0
  127. data/public/javascripts/LucyCMS/codemirror/parse_js.js +12 -0
  128. data/public/javascripts/LucyCMS/codemirror/parse_xml.js +7 -0
  129. data/public/javascripts/LucyCMS/jquery-ui/images/ui-bg_flat_0_aaaaaa_40x100.png +0 -0
  130. data/public/javascripts/LucyCMS/jquery-ui/images/ui-bg_flat_75_ffffff_40x100.png +0 -0
  131. data/public/javascripts/LucyCMS/jquery-ui/images/ui-bg_glass_55_fbf9ee_1x400.png +0 -0
  132. data/public/javascripts/LucyCMS/jquery-ui/images/ui-bg_glass_65_ffffff_1x400.png +0 -0
  133. data/public/javascripts/LucyCMS/jquery-ui/images/ui-bg_glass_75_dadada_1x400.png +0 -0
  134. data/public/javascripts/LucyCMS/jquery-ui/images/ui-bg_glass_75_e6e6e6_1x400.png +0 -0
  135. data/public/javascripts/LucyCMS/jquery-ui/images/ui-bg_glass_95_fef1ec_1x400.png +0 -0
  136. data/public/javascripts/LucyCMS/jquery-ui/images/ui-bg_highlight-soft_75_cccccc_1x100.png +0 -0
  137. data/public/javascripts/LucyCMS/jquery-ui/images/ui-icons_222222_256x240.png +0 -0
  138. data/public/javascripts/LucyCMS/jquery-ui/images/ui-icons_2e83ff_256x240.png +0 -0
  139. data/public/javascripts/LucyCMS/jquery-ui/images/ui-icons_454545_256x240.png +0 -0
  140. data/public/javascripts/LucyCMS/jquery-ui/images/ui-icons_888888_256x240.png +0 -0
  141. data/public/javascripts/LucyCMS/jquery-ui/images/ui-icons_cd0a0a_256x240.png +0 -0
  142. data/public/javascripts/LucyCMS/jquery-ui/jquery-ui.css +362 -0
  143. data/public/javascripts/LucyCMS/jquery-ui/jquery-ui.js +190 -0
  144. data/public/javascripts/LucyCMS/jquery.js +154 -0
  145. data/public/javascripts/LucyCMS/plupload/plupload.full.min.js +1 -0
  146. data/public/javascripts/LucyCMS/plupload/plupload.html5.min.js +1 -0
  147. data/public/javascripts/LucyCMS/plupload/plupload.min.js +1 -0
  148. data/public/javascripts/LucyCMS/rails.js +132 -0
  149. data/public/javascripts/LucyCMS/tiny_mce/jquery.tinymce.js +1 -0
  150. data/public/javascripts/LucyCMS/tiny_mce/langs/en.js +170 -0
  151. data/public/javascripts/LucyCMS/tiny_mce/themes/advanced/about.htm +54 -0
  152. data/public/javascripts/LucyCMS/tiny_mce/themes/advanced/anchor.htm +26 -0
  153. data/public/javascripts/LucyCMS/tiny_mce/themes/advanced/charmap.htm +52 -0
  154. data/public/javascripts/LucyCMS/tiny_mce/themes/advanced/color_picker.htm +73 -0
  155. data/public/javascripts/LucyCMS/tiny_mce/themes/advanced/editor_template.js +1 -0
  156. data/public/javascripts/LucyCMS/tiny_mce/themes/advanced/image.htm +80 -0
  157. data/public/javascripts/LucyCMS/tiny_mce/themes/advanced/img/colorpicker.jpg +0 -0
  158. data/public/javascripts/LucyCMS/tiny_mce/themes/advanced/img/icons.gif +0 -0
  159. data/public/javascripts/LucyCMS/tiny_mce/themes/advanced/js/about.js +72 -0
  160. data/public/javascripts/LucyCMS/tiny_mce/themes/advanced/js/anchor.js +37 -0
  161. data/public/javascripts/LucyCMS/tiny_mce/themes/advanced/js/charmap.js +335 -0
  162. data/public/javascripts/LucyCMS/tiny_mce/themes/advanced/js/color_picker.js +253 -0
  163. data/public/javascripts/LucyCMS/tiny_mce/themes/advanced/js/image.js +245 -0
  164. data/public/javascripts/LucyCMS/tiny_mce/themes/advanced/js/link.js +156 -0
  165. data/public/javascripts/LucyCMS/tiny_mce/themes/advanced/js/source_editor.js +56 -0
  166. data/public/javascripts/LucyCMS/tiny_mce/themes/advanced/langs/en.js +62 -0
  167. data/public/javascripts/LucyCMS/tiny_mce/themes/advanced/langs/en_dlg.js +51 -0
  168. data/public/javascripts/LucyCMS/tiny_mce/themes/advanced/link.htm +58 -0
  169. data/public/javascripts/LucyCMS/tiny_mce/themes/advanced/skins/default/content.css +36 -0
  170. data/public/javascripts/LucyCMS/tiny_mce/themes/advanced/skins/default/dialog.css +117 -0
  171. data/public/javascripts/LucyCMS/tiny_mce/themes/advanced/skins/default/img/buttons.png +0 -0
  172. data/public/javascripts/LucyCMS/tiny_mce/themes/advanced/skins/default/img/items.gif +0 -0
  173. data/public/javascripts/LucyCMS/tiny_mce/themes/advanced/skins/default/img/menu_arrow.gif +0 -0
  174. data/public/javascripts/LucyCMS/tiny_mce/themes/advanced/skins/default/img/menu_check.gif +0 -0
  175. data/public/javascripts/LucyCMS/tiny_mce/themes/advanced/skins/default/img/progress.gif +0 -0
  176. data/public/javascripts/LucyCMS/tiny_mce/themes/advanced/skins/default/img/tabs.gif +0 -0
  177. data/public/javascripts/LucyCMS/tiny_mce/themes/advanced/skins/default/ui.css +213 -0
  178. data/public/javascripts/LucyCMS/tiny_mce/themes/advanced/source_editor.htm +25 -0
  179. data/public/javascripts/LucyCMS/tiny_mce/tiny_mce.js +1 -0
  180. data/public/javascripts/LucyCMS/tiny_mce/tiny_mce_popup.js +5 -0
  181. data/public/robots.txt +5 -0
  182. data/public/stylesheets/LucyCMS/content.css +196 -0
  183. data/public/stylesheets/LucyCMS/form.css +125 -0
  184. data/public/stylesheets/LucyCMS/reset.css +1 -0
  185. data/public/stylesheets/LucyCMS/site_form.css +82 -0
  186. data/public/stylesheets/LucyCMS/structure.css +125 -0
  187. data/public/stylesheets/LucyCMS/typography.css +25 -0
  188. data/script/rails +6 -0
  189. data/test/cms_seeds/test.host/layouts/broken.yml +1 -0
  190. data/test/cms_seeds/test.host/layouts/default.yml +3 -0
  191. data/test/cms_seeds/test.host/layouts/nested.yml +4 -0
  192. data/test/cms_seeds/test.host/pages/broken.yml +1 -0
  193. data/test/cms_seeds/test.host/pages/child/subchild.yml +10 -0
  194. data/test/cms_seeds/test.host/pages/child.yml +10 -0
  195. data/test/cms_seeds/test.host/pages/index.yml +10 -0
  196. data/test/cms_seeds/test.host/snippets/broken.yml +1 -0
  197. data/test/cms_seeds/test.host/snippets/default.yml +3 -0
  198. data/test/fixtures/cms_blocks.yml +12 -0
  199. data/test/fixtures/cms_layouts.yml +36 -0
  200. data/test/fixtures/cms_pages.yml +39 -0
  201. data/test/fixtures/cms_sites.yml +3 -0
  202. data/test/fixtures/cms_snippets.yml +5 -0
  203. data/test/fixtures/cms_upload_dirs.yml +9 -0
  204. data/test/fixtures/cms_uploads.yml +4 -0
  205. data/test/fixtures/cms_users.yml +11 -0
  206. data/test/fixtures/files/invalid_file.gif +9 -0
  207. data/test/fixtures/files/valid_image.jpg +0 -0
  208. data/test/fixtures/views/_nav_hook.html.erb +1 -0
  209. data/test/fixtures/views/_nav_hook_2.html.erb +1 -0
  210. data/test/functional/cms_admin/layouts_controller_test.rb +103 -0
  211. data/test/functional/cms_admin/pages_controller_test.rb +334 -0
  212. data/test/functional/cms_admin/sites_controller_test.rb +99 -0
  213. data/test/functional/cms_admin/snippets_controller_test.rb +102 -0
  214. data/test/functional/cms_admin/uploads_controller_test.rb +26 -0
  215. data/test/functional/cms_content_controller_test.rb +134 -0
  216. data/test/integration/rake_tasks_test.rb +65 -0
  217. data/test/integration/render_cms_seed_test.rb +34 -0
  218. data/test/integration/render_cms_test.rb +81 -0
  219. data/test/integration/sites_test.rb +63 -0
  220. data/test/integration/view_hooks_test.rb +33 -0
  221. data/test/test_helper.rb +86 -0
  222. data/test/unit/cms_block_test.rb +43 -0
  223. data/test/unit/cms_configuration_test.rb +17 -0
  224. data/test/unit/cms_layout_test.rb +146 -0
  225. data/test/unit/cms_page_test.rb +257 -0
  226. data/test/unit/cms_site_test.rb +41 -0
  227. data/test/unit/cms_snippet_test.rb +77 -0
  228. data/test/unit/cms_tag_test.rb +206 -0
  229. data/test/unit/cms_tags/field_datetime_test.rb +34 -0
  230. data/test/unit/cms_tags/field_integer_test.rb +33 -0
  231. data/test/unit/cms_tags/field_string_test.rb +34 -0
  232. data/test/unit/cms_tags/field_text_test.rb +32 -0
  233. data/test/unit/cms_tags/helper_test.rb +38 -0
  234. data/test/unit/cms_tags/page_datetime_test.rb +34 -0
  235. data/test/unit/cms_tags/page_integer_test.rb +33 -0
  236. data/test/unit/cms_tags/page_rich_text.rb +33 -0
  237. data/test/unit/cms_tags/page_string_test.rb +33 -0
  238. data/test/unit/cms_tags/page_text_test.rb +34 -0
  239. data/test/unit/cms_tags/partial_test.rb +44 -0
  240. data/test/unit/cms_tags/snippet_test.rb +33 -0
  241. data/test/unit/cms_upload_dir_test.rb +8 -0
  242. data/test/unit/cms_upload_test.rb +26 -0
  243. data/test/unit/cms_user_test.rb +8 -0
  244. data/test/unit/view_methods_test.rb +21 -0
  245. metadata +488 -0
@@ -0,0 +1,129 @@
1
+ class LucyCMS::FormBuilder < ActionView::Helpers::FormBuilder
2
+
3
+ helpers = field_helpers -
4
+ %w(hidden_field fields_for) +
5
+ %w(select)
6
+
7
+ helpers.each do |name|
8
+ class_eval %Q^
9
+ def #{name}(field, *args)
10
+ options = args.extract_options!
11
+ args << options
12
+ return super if options.delete(:disable_builder)
13
+ default_field('#{name}', field, options){ super }
14
+ end
15
+ ^
16
+ end
17
+
18
+ def default_field(type, field, options = {}, &block)
19
+ errors = if object.errors[field].present?
20
+ "<div class='errors'>#{[object.errors[field]].flatten.first}</div>"
21
+ end
22
+ if desc = options.delete(:desc)
23
+ desc = "<div class='desc'>#{desc}</div>"
24
+ end
25
+ %(
26
+ <div class='form_element #{type}_element #{'errors' if errors}'>
27
+ <div class='label'>#{label_for(field, options)}</div>
28
+ <div class='value'>#{yield}</div>
29
+ #{desc}
30
+ #{errors}
31
+ </div>
32
+ ).html_safe
33
+ end
34
+
35
+ def simple_field(label = nil, content = nil, options = {}, &block)
36
+ content ||= @template.capture(&block) if block_given?
37
+ %(
38
+ <div class='form_element #{options.delete(:class)}'>
39
+ <div class='label'>#{label}</div>
40
+ <div class='value'>#{content}</div>
41
+ </div>
42
+ ).html_safe
43
+ end
44
+
45
+ def label_for(field, options)
46
+ label = options.delete(:label) || field.to_s.titleize.capitalize_all
47
+ "<label for=\"#{object_name}_#{field}\">#{label}</label>".html_safe
48
+ end
49
+
50
+ def submit(value, options = {}, &block)
51
+ return super if options.delete(:disable_builder)
52
+ extra_content = @template.capture(&block) if block_given?
53
+ simple_field(nil, "#{super(value, options)} #{extra_content}", :class => 'submit_element')
54
+ end
55
+
56
+ # -- Tag Field Fields -----------------------------------------------------
57
+ def default_tag_field(tag, options = {})
58
+ label = options[:label] || tag.label.to_s.titleize
59
+ css_class = options[:css_class] || tag.class.name.underscore.downcase.idify
60
+
61
+ field_css_class = case tag
62
+ when CmsTag::PageRichText then 'rich_text'
63
+ when CmsTag::PageText, CmsTag::FieldText then 'code'
64
+ end
65
+
66
+ options[:content_field_method] ||= :text_field_tag
67
+ field =
68
+ options[:field] ||
69
+ @template.send(options[:content_field_method], 'cms_page[cms_blocks_attributes][][content]', tag.content, :id => nil, :class => field_css_class)
70
+
71
+ %(
72
+ <div class='form_element #{css_class}'>
73
+ <div class='label'>#{label}</div>
74
+ <div class='value'>
75
+ #{field}
76
+ #{@template.hidden_field_tag('cms_page[cms_blocks_attributes][][label]', tag.label, :id => nil)}
77
+ #{@template.hidden_field_tag('cms_page[cms_blocks_attributes][][id]', tag.record_id, :id => nil) if tag.record_id}
78
+ </div>
79
+ </div>
80
+ ).html_safe
81
+ end
82
+
83
+ def field_date_time(tag)
84
+ default_tag_field(tag, :content_field_method => :datetime_field_tag)
85
+ end
86
+
87
+ def field_integer(tag)
88
+ default_tag_field(tag, :content_field_method => :number_field_tag)
89
+ end
90
+
91
+ def field_string(tag)
92
+ default_tag_field(tag)
93
+ end
94
+
95
+ def field_text(tag)
96
+ default_tag_field(tag, :content_field_method => :text_area_tag)
97
+ end
98
+
99
+ def page_date_time(tag)
100
+ default_tag_field(tag, :content_field_method => :datetime_field_tag)
101
+ end
102
+
103
+ def page_integer(tag)
104
+ default_tag_field(tag, :content_field_method => :number_field_tag)
105
+ end
106
+
107
+ def page_string(tag)
108
+ default_tag_field(tag)
109
+ end
110
+
111
+ def page_text(tag)
112
+ default_tag_field(tag, :content_field_method => :text_area_tag)
113
+ end
114
+
115
+ def page_rich_text(tag)
116
+ default_tag_field(tag, :content_field_method => :text_area_tag)
117
+ end
118
+
119
+ # Capturing all calls of cms_tag_* type. For those we'll try to render
120
+ # a form element. Everything else can trigger MethodNotFound error.
121
+ def method_missing(method_name, *args)
122
+ if m = method_name.to_s.match(/^cms_tag_(\w+)$/)
123
+ send(m[1], *args) if respond_to?(m[1])
124
+ else
125
+ super
126
+ end
127
+ end
128
+
129
+ end
@@ -0,0 +1,22 @@
1
+ class String
2
+ # Converts string to something suitable to be used as an element id
3
+ def idify
4
+ self.strip.gsub(/\W/, '_').gsub(/\s|^_*|_*$/, '').squeeze('_')
5
+ end
6
+
7
+ # Capitalize all words in the string
8
+ def capitalize_all(delimiter = ' ')
9
+ self.split(delimiter).collect{|w| w.capitalize }.join(' ')
10
+ end
11
+ end
12
+
13
+ module Enumerable
14
+ # Like a normal collect, only with index
15
+ def collect_with_index
16
+ result = []
17
+ self.each_with_index do |elt, idx|
18
+ result << yield(elt, idx)
19
+ end
20
+ result
21
+ end
22
+ end
@@ -0,0 +1,129 @@
1
+ class LucyCMS::SiteFormBuilder < ActionView::Helpers::FormBuilder
2
+
3
+ helpers = field_helpers -
4
+ %w(hidden_field fields_for) +
5
+ %w(select)
6
+
7
+ helpers.each do |name|
8
+ class_eval %Q^
9
+ def #{name}(field, *args)
10
+ options = args.extract_options!
11
+ args << options
12
+ return super if options.delete(:disable_builder)
13
+ default_field('#{name}', field, options){ super }
14
+ end
15
+ ^
16
+ end
17
+
18
+ def default_field(type, field, options = {}, &block)
19
+ errors = if object.errors[field].present?
20
+ "<div class='errors'>#{[object.errors[field]].flatten.first}</div>"
21
+ end
22
+ if desc = options.delete(:desc)
23
+ desc = "<div class='desc'>#{desc}</div>"
24
+ end
25
+ %(
26
+ <div class='site_form_element #{type}_element #{'errors' if errors}'>
27
+ <div class='label'>#{label_for(field, options)}</div>
28
+ <div class='value'>#{yield}</div>
29
+ #{desc}
30
+ #{errors}
31
+ </div>
32
+ ).html_safe
33
+ end
34
+
35
+ def simple_field(label = nil, content = nil, options = {}, &block)
36
+ content ||= @template.capture(&block) if block_given?
37
+ %(
38
+ <div class='site_form_element #{options.delete(:class)}'>
39
+ <div class='label'>#{label}</div>
40
+ <div class='value'>#{content}</div>
41
+ </div>
42
+ ).html_safe
43
+ end
44
+
45
+ def label_for(field, options)
46
+ label = options.delete(:label) || field.to_s.titleize.capitalize_all
47
+ "<label for=\"#{object_name}_#{field}\">#{label}</label>".html_safe
48
+ end
49
+
50
+ def submit(value, options = {}, &block)
51
+ return super if options.delete(:disable_builder)
52
+ extra_content = @template.capture(&block) if block_given?
53
+ simple_field(nil, "#{super(value, options)} #{extra_content}", :class => 'submit_element')
54
+ end
55
+
56
+ # -- Tag Field Fields -----------------------------------------------------
57
+ def default_tag_field(tag, options = {})
58
+ label = options[:label] || tag.label.to_s.titleize
59
+ css_class = options[:css_class] || tag.class.name.underscore.downcase.idify
60
+
61
+ field_css_class = case tag
62
+ when CmsTag::PageRichText then 'rich_text'
63
+ when CmsTag::PageText, CmsTag::FieldText then 'code'
64
+ end
65
+
66
+ options[:content_field_method] ||= :text_field_tag
67
+ field =
68
+ options[:field] ||
69
+ @template.send(options[:content_field_method], 'cms_page[cms_blocks_attributes][][content]', tag.content, :id => nil, :class => field_css_class)
70
+
71
+ %(
72
+ <div class='site_form_element #{css_class}'>
73
+ <div class='label'>#{label}</div>
74
+ <div class='value'>
75
+ #{field}
76
+ #{@template.hidden_field_tag('cms_page[cms_blocks_attributes][][label]', tag.label, :id => nil)}
77
+ #{@template.hidden_field_tag('cms_page[cms_blocks_attributes][][id]', tag.record_id, :id => nil) if tag.record_id}
78
+ </div>
79
+ </div>
80
+ ).html_safe
81
+ end
82
+
83
+ def field_date_time(tag)
84
+ default_tag_field(tag, :content_field_method => :datetime_field_tag)
85
+ end
86
+
87
+ def field_integer(tag)
88
+ default_tag_field(tag, :content_field_method => :number_field_tag)
89
+ end
90
+
91
+ def field_string(tag)
92
+ default_tag_field(tag)
93
+ end
94
+
95
+ def field_text(tag)
96
+ default_tag_field(tag, :content_field_method => :text_area_tag)
97
+ end
98
+
99
+ def page_date_time(tag)
100
+ default_tag_field(tag, :content_field_method => :datetime_field_tag)
101
+ end
102
+
103
+ def page_integer(tag)
104
+ default_tag_field(tag, :content_field_method => :number_field_tag)
105
+ end
106
+
107
+ def page_string(tag)
108
+ default_tag_field(tag)
109
+ end
110
+
111
+ def page_text(tag)
112
+ default_tag_field(tag, :content_field_method => :text_area_tag)
113
+ end
114
+
115
+ def page_rich_text(tag)
116
+ default_tag_field(tag, :content_field_method => :text_area_tag)
117
+ end
118
+
119
+ # Capturing all calls of cms_tag_* type. For those we'll try to render
120
+ # a form element. Everything else can trigger MethodNotFound error.
121
+ def method_missing(method_name, *args)
122
+ if m = method_name.to_s.match(/^cms_tag_(\w+)$/)
123
+ send(m[1], *args) if respond_to?(m[1])
124
+ else
125
+ super
126
+ end
127
+ end
128
+
129
+ end
@@ -0,0 +1,30 @@
1
+ module LucyCMS::ViewHooks
2
+
3
+ # Array of declared hooks
4
+ def self.hooks
5
+ @@hooks ||= { }
6
+ end
7
+
8
+ # Renders hook content
9
+ def self.render(name, template, options = {})
10
+ out = ''
11
+ (self.hooks[name.to_sym] || []).each do |path|
12
+ out += template.render({:partial => path}.merge(options))
13
+ end
14
+ return out.html_safe
15
+ end
16
+
17
+ # Will declare a partial that will be rendered for this hook
18
+ # Example:
19
+ # ComfortableMexicanSofa::ViewHooks.add(:navigation, 'shared/navigation')
20
+ def self.add(name, partial_path)
21
+ self.hooks[name.to_sym] ||= []
22
+ self.hooks[name.to_sym] << partial_path
23
+ end
24
+
25
+ # Removing previously declared hook
26
+ def self.remove(name)
27
+ self.hooks.delete(name)
28
+ end
29
+
30
+ end
@@ -0,0 +1,68 @@
1
+ module LucyCMS::ViewMethods
2
+ # Wrapper around CmsFormBuilder
3
+ def cms_form_for(record_or_name_or_array, *args, &proc)
4
+ options = args.extract_options!
5
+ form_for(record_or_name_or_array, *(args << options.merge(:builder => LucyCMS::FormBuilder)), &proc)
6
+ end
7
+
8
+ def cms_site_form_for(record_or_name_or_array, *args, &proc)
9
+ options = args.extract_options!
10
+ form_for(record_or_name_or_array, *(args << options.merge(:builder => LucyCMS::SiteFormBuilder)), &proc)
11
+ end
12
+
13
+
14
+ # Wrapper for <span>
15
+ def span_tag(*args)
16
+ content_tag(:span, *args)
17
+ end
18
+
19
+ # Rails 3.0 doesn't have this helper defined
20
+ def datetime_field_tag(name, value = nil, options = {})
21
+ text_field_tag(name, value, options.stringify_keys.update('type' => 'datetime'))
22
+ end
23
+
24
+ # Injects some content somewhere inside cms admin area
25
+ def cms_hook(name, options = {})
26
+ LucyCMS::ViewHooks.render(name, self, options)
27
+ end
28
+
29
+ # Content of a snippet. Example:
30
+ # cms_snippet_content(:my_snippet)
31
+ def cms_snippet_content(snippet_slug)
32
+ return '' unless snippet = CmsSnippet.find_by_slug(snippet_slug)
33
+ snippet.content.to_s.html_safe
34
+ end
35
+
36
+ # Content of a page block. This is how you get content from page:field
37
+ # Example:
38
+ # cms_page_content(:left_column, CmsPage.first)
39
+ # cms_page_content(:left_column) # if @cms_page is present
40
+ def cms_page_content(block_label, page = nil)
41
+ return '' unless page ||= @cms_page
42
+ return '' unless block = page.cms_blocks.find_by_label(block_label)
43
+ block.content.to_s.html_safe
44
+ end
45
+ end
46
+
47
+ ActionView::Base.send :include, LucyCMS::ViewMethods
48
+
49
+ ActionView::Helpers::AssetTagHelper.register_javascript_expansion :cms => [
50
+ 'LucyCMS/jquery',
51
+ 'LucyCMS/jquery-ui/jquery-ui',
52
+ 'LucyCMS/rails',
53
+ 'LucyCMS/tiny_mce/tiny_mce',
54
+ 'LucyCMS/tiny_mce/jquery.tinymce',
55
+ 'LucyCMS/plupload/plupload.min',
56
+ 'LucyCMS/plupload/plupload.html5.min',
57
+ 'LucyCMS/codemirror/codemirror.js',
58
+ 'LucyCMS/cms'
59
+ ]
60
+ ActionView::Helpers::AssetTagHelper.register_stylesheet_expansion :cms => [
61
+ 'LucyCMS/reset',
62
+ 'LucyCMS/structure',
63
+ 'LucyCMS/typography',
64
+ 'LucyCMS/form',
65
+ 'LucyCMS/site_form',
66
+ 'LucyCMS/content',
67
+ '/javascripts/LucyCMS/jquery-ui/jquery-ui'
68
+ ]
data/lib/LucyCMS.rb ADDED
@@ -0,0 +1,40 @@
1
+ # Loading engine only if this is not a standalone installation
2
+ unless defined? LucyCMS::Application
3
+ require File.expand_path('LucyCMS/engine', File.dirname(__FILE__))
4
+ end
5
+
6
+ [ 'LucyCMS/configuration',
7
+ 'LucyCMS/rails_extensions',
8
+ 'LucyCMS/controller_methods',
9
+ 'LucyCMS/view_hooks',
10
+ 'LucyCMS/view_methods',
11
+ 'LucyCMS/form_builder',
12
+ 'LucyCMS/site_form_builder',
13
+ 'LucyCMS/acts_as_tree',
14
+ '../app/models/cms_block',
15
+ '../app/models/cms_snippet',
16
+ 'LucyCMS/cms_tag'
17
+ ].each do |path|
18
+ require File.expand_path(path, File.dirname(__FILE__))
19
+ end
20
+
21
+ Dir.glob(File.expand_path('LucyCMS/cms_tag/*.rb', File.dirname(__FILE__))).each do |tag_path|
22
+ require tag_path
23
+ end
24
+
25
+ module LucyCMS
26
+
27
+ class << self
28
+
29
+ def configure
30
+ yield configuration
31
+ end
32
+
33
+ def configuration
34
+ @configuration ||= Configuration.new
35
+ end
36
+ alias :config :configuration
37
+
38
+ end
39
+
40
+ end
@@ -0,0 +1,17 @@
1
+ ____ __ _ _ _
2
+ / ___|___ _ __ ___ / _| ___ _ __| |_ __ _| |__ | | ___
3
+ | | / _ \| '_ ` _ \| |_ / _ \| '__| __/ _` | '_ \| |/ _ \
4
+ | |__| (_) | | | | | | _| (_) | | | || (_| | |_) | | __/
5
+ \____\___/|_| |_| |_|_| \___/|_| \__\__,_|_.__/|_|\___|
6
+ __ __ _ ____ __
7
+ | \/ | _____ _(_) ___ __ _ _ __ / ___| ___ / _| __ _
8
+ | |\/| |/ _ \ \/ / |/ __/ _` | '_ \ \___ \ / _ \| |_ / _` |
9
+ | | | | __/> <| | (_| (_| | | | | ___) | (_) | _| (_| |
10
+ |_| |_|\___/_/\_\_|\___\__,_|_| |_| |____/ \___/|_| \__,_|
11
+
12
+ Hey! Everything is almost done. Please don't forget to
13
+
14
+ * run migrations -> `rake db:migrate`
15
+
16
+ After that go to http://your-awesome-app/cms-admin to start populating content.
17
+ Default username and password are: username // password
@@ -0,0 +1,44 @@
1
+ class CmsGenerator < Rails::Generators::Base
2
+
3
+ include Rails::Generators::Migration
4
+ include Thor::Actions
5
+
6
+ source_root File.expand_path('../../..', __FILE__)
7
+
8
+ def generate_migration
9
+ destination = File.expand_path('db/migrate/01_create_cms.rb', self.destination_root)
10
+ migration_dir = File.dirname(destination)
11
+ destination = self.class.migration_exists?(migration_dir, 'create_cms')
12
+
13
+ if destination
14
+ puts "\e[0m\e[31mFound existing cms_create.rb migration. Remove it if you want to regenerate.\e[0m"
15
+ else
16
+ migration_template 'db/migrate/01_create_cms.rb', 'db/migrate/create_cms.rb'
17
+ end
18
+ end
19
+
20
+ def generate_initialization
21
+ copy_file 'config/initializers/comfortable_mexican_sofa.rb', 'config/initializers/comfortable_mexican_sofa.rb'
22
+ end
23
+
24
+ def generate_public_assets
25
+ directory 'public/stylesheets/comfortable_mexican_sofa', 'public/stylesheets/comfortable_mexican_sofa'
26
+ directory 'public/javascripts/comfortable_mexican_sofa', 'public/javascripts/comfortable_mexican_sofa'
27
+ directory 'public/images/comfortable_mexican_sofa', 'public/images/comfortable_mexican_sofa'
28
+ end
29
+
30
+ def generate_cms_seeds
31
+ directory 'db/cms_seeds', 'db/cms_seeds'
32
+ end
33
+
34
+ def show_readme
35
+ readme 'lib/generators/README'
36
+ end
37
+
38
+ def self.next_migration_number(dirname)
39
+ orm = Rails.configuration.generators.options[:rails][:orm]
40
+ require "rails/generators/#{orm}"
41
+ "#{orm.to_s.camelize}::Generators::Base".constantize.next_migration_number(dirname)
42
+ end
43
+
44
+ end