lucy_cms 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- data/Gemfile +19 -0
- data/Gemfile.lock +88 -0
- data/LICENSE +24 -0
- data/README.md +161 -0
- data/Rakefile +26 -0
- data/VERSION +1 -0
- data/app/controllers/application_controller.rb +5 -0
- data/app/controllers/cms_admin/base_controller.rb +43 -0
- data/app/controllers/cms_admin/layouts_controller.rb +66 -0
- data/app/controllers/cms_admin/pages_controller.rb +111 -0
- data/app/controllers/cms_admin/sessions_controller.rb +25 -0
- data/app/controllers/cms_admin/sites_controller.rb +69 -0
- data/app/controllers/cms_admin/snippets_controller.rb +62 -0
- data/app/controllers/cms_admin/upload_dirs_controller.rb +79 -0
- data/app/controllers/cms_admin/users_controller.rb +129 -0
- data/app/controllers/cms_content_controller.rb +51 -0
- data/app/models/cms_block.rb +28 -0
- data/app/models/cms_layout.rb +118 -0
- data/app/models/cms_page.rb +163 -0
- data/app/models/cms_site.rb +38 -0
- data/app/models/cms_snippet.rb +70 -0
- data/app/models/cms_upload.rb +19 -0
- data/app/models/cms_upload_dir.rb +11 -0
- data/app/models/cms_user.rb +93 -0
- data/app/views/cms_admin/layouts/_form.html.erb +10 -0
- data/app/views/cms_admin/layouts/_index_branch.html.erb +24 -0
- data/app/views/cms_admin/layouts/edit.html.erb +6 -0
- data/app/views/cms_admin/layouts/index.html.erb +6 -0
- data/app/views/cms_admin/layouts/new.html.erb +6 -0
- data/app/views/cms_admin/pages/_form.html.erb +37 -0
- data/app/views/cms_admin/pages/_form_blocks.html.erb +7 -0
- data/app/views/cms_admin/pages/_index_branch.html.erb +40 -0
- data/app/views/cms_admin/pages/edit.html.erb +5 -0
- data/app/views/cms_admin/pages/form_blocks.js.erb +2 -0
- data/app/views/cms_admin/pages/index.html.erb +6 -0
- data/app/views/cms_admin/pages/new.html.erb +5 -0
- data/app/views/cms_admin/pages/toggle_branch.js.erb +11 -0
- data/app/views/cms_admin/sessions/new.html.erb +12 -0
- data/app/views/cms_admin/sites/_form.html.erb +16 -0
- data/app/views/cms_admin/sites/edit.html.erb +6 -0
- data/app/views/cms_admin/sites/new.html.erb +6 -0
- data/app/views/cms_admin/sites/setup.html.erb +16 -0
- data/app/views/cms_admin/snippets/_form.html.erb +4 -0
- data/app/views/cms_admin/snippets/edit.html.erb +6 -0
- data/app/views/cms_admin/snippets/index.html.erb +23 -0
- data/app/views/cms_admin/snippets/new.html.erb +6 -0
- data/app/views/cms_admin/upload_dirs/_file.html.erb +15 -0
- data/app/views/cms_admin/upload_dirs/_form.html.erb +2 -0
- data/app/views/cms_admin/upload_dirs/conflict.html.erb +12 -0
- data/app/views/cms_admin/upload_dirs/index.html.erb +23 -0
- data/app/views/cms_admin/upload_dirs/new.html.erb +6 -0
- data/app/views/cms_admin/upload_dirs/show.html.erb +26 -0
- data/app/views/cms_admin/upload_dirs/uploads_destroy.js.erb +3 -0
- data/app/views/cms_admin/users/_form.html.erb +9 -0
- data/app/views/cms_admin/users/_index_branch.html.erb +16 -0
- data/app/views/cms_admin/users/change_password.html.erb +14 -0
- data/app/views/cms_admin/users/edit.html.erb +17 -0
- data/app/views/cms_admin/users/index.html.erb +6 -0
- data/app/views/cms_admin/users/new.html.erb +14 -0
- data/app/views/layouts/cms_admin.html.erb +52 -0
- data/config/application.rb +48 -0
- data/config/boot.rb +13 -0
- data/config/database.yml +22 -0
- data/config/environment.rb +5 -0
- data/config/environments/development.rb +22 -0
- data/config/environments/production.rb +49 -0
- data/config/environments/test.rb +35 -0
- data/config/initializers/LucyCMS.rb +37 -0
- data/config/initializers/mime_types.rb +5 -0
- data/config/locales/en.yml +5 -0
- data/config/routes.rb +45 -0
- data/config.ru +4 -0
- data/db/cms_seeds/example.local/layouts/default.yml +8 -0
- data/db/cms_seeds/example.local/layouts/nested.yml +6 -0
- data/db/cms_seeds/example.local/pages/child/subchild.yml +14 -0
- data/db/cms_seeds/example.local/pages/child.yml +10 -0
- data/db/cms_seeds/example.local/pages/index.yml +11 -0
- data/db/cms_seeds/example.local/snippets/example.yml +4 -0
- data/db/migrate/01_create_cms.rb +114 -0
- data/db/seeds.rb +7 -0
- data/lib/LucyCMS/acts_as_tree.rb +102 -0
- data/lib/LucyCMS/cms_tag/field_datetime.rb +26 -0
- data/lib/LucyCMS/cms_tag/field_integer.rb +26 -0
- data/lib/LucyCMS/cms_tag/field_string.rb +26 -0
- data/lib/LucyCMS/cms_tag/field_text.rb +26 -0
- data/lib/LucyCMS/cms_tag/helper.rb +20 -0
- data/lib/LucyCMS/cms_tag/page_datetime.rb +22 -0
- data/lib/LucyCMS/cms_tag/page_integer.rb +22 -0
- data/lib/LucyCMS/cms_tag/page_rich_text.rb +22 -0
- data/lib/LucyCMS/cms_tag/page_string.rb +22 -0
- data/lib/LucyCMS/cms_tag/page_text.rb +22 -0
- data/lib/LucyCMS/cms_tag/partial.rb +21 -0
- data/lib/LucyCMS/cms_tag/snippet.rb +22 -0
- data/lib/LucyCMS/cms_tag.rb +119 -0
- data/lib/LucyCMS/configuration.rb +36 -0
- data/lib/LucyCMS/controller_methods.rb +42 -0
- data/lib/LucyCMS/engine.rb +12 -0
- data/lib/LucyCMS/form_builder.rb +129 -0
- data/lib/LucyCMS/rails_extensions.rb +22 -0
- data/lib/LucyCMS/site_form_builder.rb +129 -0
- data/lib/LucyCMS/view_hooks.rb +30 -0
- data/lib/LucyCMS/view_methods.rb +68 -0
- data/lib/LucyCMS.rb +40 -0
- data/lib/generators/README +17 -0
- data/lib/generators/cms_generator.rb +44 -0
- data/lib/tasks/LucyCMS.rake +283 -0
- data/lucy_cms.gemspec +100 -0
- data/public/404.html +26 -0
- data/public/422.html +26 -0
- data/public/500.html +26 -0
- data/public/favicon.ico +0 -0
- data/public/images/LucyCMS/arrow_bottom.gif +0 -0
- data/public/images/LucyCMS/arrow_right.gif +0 -0
- data/public/images/LucyCMS/icon_folder.png +0 -0
- data/public/images/LucyCMS/icon_layout.gif +0 -0
- data/public/images/LucyCMS/icon_move.gif +0 -0
- data/public/images/LucyCMS/icon_regular.gif +0 -0
- data/public/images/LucyCMS/icon_snippet.gif +0 -0
- data/public/images/LucyCMS/icon_upload.png +0 -0
- data/public/images/LucyCMS/icon_user.jpg +0 -0
- data/public/javascripts/LucyCMS/cms.js +204 -0
- data/public/javascripts/LucyCMS/codemirror/codemirror.css +102 -0
- data/public/javascripts/LucyCMS/codemirror/codemirror.js +23 -0
- data/public/javascripts/LucyCMS/codemirror/codemirror_base.js +88 -0
- data/public/javascripts/LucyCMS/codemirror/parse_css.js +4 -0
- data/public/javascripts/LucyCMS/codemirror/parse_html_mixed.js +3 -0
- data/public/javascripts/LucyCMS/codemirror/parse_js.js +12 -0
- data/public/javascripts/LucyCMS/codemirror/parse_xml.js +7 -0
- data/public/javascripts/LucyCMS/jquery-ui/images/ui-bg_flat_0_aaaaaa_40x100.png +0 -0
- data/public/javascripts/LucyCMS/jquery-ui/images/ui-bg_flat_75_ffffff_40x100.png +0 -0
- data/public/javascripts/LucyCMS/jquery-ui/images/ui-bg_glass_55_fbf9ee_1x400.png +0 -0
- data/public/javascripts/LucyCMS/jquery-ui/images/ui-bg_glass_65_ffffff_1x400.png +0 -0
- data/public/javascripts/LucyCMS/jquery-ui/images/ui-bg_glass_75_dadada_1x400.png +0 -0
- data/public/javascripts/LucyCMS/jquery-ui/images/ui-bg_glass_75_e6e6e6_1x400.png +0 -0
- data/public/javascripts/LucyCMS/jquery-ui/images/ui-bg_glass_95_fef1ec_1x400.png +0 -0
- data/public/javascripts/LucyCMS/jquery-ui/images/ui-bg_highlight-soft_75_cccccc_1x100.png +0 -0
- data/public/javascripts/LucyCMS/jquery-ui/images/ui-icons_222222_256x240.png +0 -0
- data/public/javascripts/LucyCMS/jquery-ui/images/ui-icons_2e83ff_256x240.png +0 -0
- data/public/javascripts/LucyCMS/jquery-ui/images/ui-icons_454545_256x240.png +0 -0
- data/public/javascripts/LucyCMS/jquery-ui/images/ui-icons_888888_256x240.png +0 -0
- data/public/javascripts/LucyCMS/jquery-ui/images/ui-icons_cd0a0a_256x240.png +0 -0
- data/public/javascripts/LucyCMS/jquery-ui/jquery-ui.css +362 -0
- data/public/javascripts/LucyCMS/jquery-ui/jquery-ui.js +190 -0
- data/public/javascripts/LucyCMS/jquery.js +154 -0
- data/public/javascripts/LucyCMS/plupload/plupload.full.min.js +1 -0
- data/public/javascripts/LucyCMS/plupload/plupload.html5.min.js +1 -0
- data/public/javascripts/LucyCMS/plupload/plupload.min.js +1 -0
- data/public/javascripts/LucyCMS/rails.js +132 -0
- data/public/javascripts/LucyCMS/tiny_mce/jquery.tinymce.js +1 -0
- data/public/javascripts/LucyCMS/tiny_mce/langs/en.js +170 -0
- data/public/javascripts/LucyCMS/tiny_mce/themes/advanced/about.htm +54 -0
- data/public/javascripts/LucyCMS/tiny_mce/themes/advanced/anchor.htm +26 -0
- data/public/javascripts/LucyCMS/tiny_mce/themes/advanced/charmap.htm +52 -0
- data/public/javascripts/LucyCMS/tiny_mce/themes/advanced/color_picker.htm +73 -0
- data/public/javascripts/LucyCMS/tiny_mce/themes/advanced/editor_template.js +1 -0
- data/public/javascripts/LucyCMS/tiny_mce/themes/advanced/image.htm +80 -0
- data/public/javascripts/LucyCMS/tiny_mce/themes/advanced/img/colorpicker.jpg +0 -0
- data/public/javascripts/LucyCMS/tiny_mce/themes/advanced/img/icons.gif +0 -0
- data/public/javascripts/LucyCMS/tiny_mce/themes/advanced/js/about.js +72 -0
- data/public/javascripts/LucyCMS/tiny_mce/themes/advanced/js/anchor.js +37 -0
- data/public/javascripts/LucyCMS/tiny_mce/themes/advanced/js/charmap.js +335 -0
- data/public/javascripts/LucyCMS/tiny_mce/themes/advanced/js/color_picker.js +253 -0
- data/public/javascripts/LucyCMS/tiny_mce/themes/advanced/js/image.js +245 -0
- data/public/javascripts/LucyCMS/tiny_mce/themes/advanced/js/link.js +156 -0
- data/public/javascripts/LucyCMS/tiny_mce/themes/advanced/js/source_editor.js +56 -0
- data/public/javascripts/LucyCMS/tiny_mce/themes/advanced/langs/en.js +62 -0
- data/public/javascripts/LucyCMS/tiny_mce/themes/advanced/langs/en_dlg.js +51 -0
- data/public/javascripts/LucyCMS/tiny_mce/themes/advanced/link.htm +58 -0
- data/public/javascripts/LucyCMS/tiny_mce/themes/advanced/skins/default/content.css +36 -0
- data/public/javascripts/LucyCMS/tiny_mce/themes/advanced/skins/default/dialog.css +117 -0
- data/public/javascripts/LucyCMS/tiny_mce/themes/advanced/skins/default/img/buttons.png +0 -0
- data/public/javascripts/LucyCMS/tiny_mce/themes/advanced/skins/default/img/items.gif +0 -0
- data/public/javascripts/LucyCMS/tiny_mce/themes/advanced/skins/default/img/menu_arrow.gif +0 -0
- data/public/javascripts/LucyCMS/tiny_mce/themes/advanced/skins/default/img/menu_check.gif +0 -0
- data/public/javascripts/LucyCMS/tiny_mce/themes/advanced/skins/default/img/progress.gif +0 -0
- data/public/javascripts/LucyCMS/tiny_mce/themes/advanced/skins/default/img/tabs.gif +0 -0
- data/public/javascripts/LucyCMS/tiny_mce/themes/advanced/skins/default/ui.css +213 -0
- data/public/javascripts/LucyCMS/tiny_mce/themes/advanced/source_editor.htm +25 -0
- data/public/javascripts/LucyCMS/tiny_mce/tiny_mce.js +1 -0
- data/public/javascripts/LucyCMS/tiny_mce/tiny_mce_popup.js +5 -0
- data/public/robots.txt +5 -0
- data/public/stylesheets/LucyCMS/content.css +196 -0
- data/public/stylesheets/LucyCMS/form.css +125 -0
- data/public/stylesheets/LucyCMS/reset.css +1 -0
- data/public/stylesheets/LucyCMS/site_form.css +82 -0
- data/public/stylesheets/LucyCMS/structure.css +125 -0
- data/public/stylesheets/LucyCMS/typography.css +25 -0
- data/script/rails +6 -0
- data/test/cms_seeds/test.host/layouts/broken.yml +1 -0
- data/test/cms_seeds/test.host/layouts/default.yml +3 -0
- data/test/cms_seeds/test.host/layouts/nested.yml +4 -0
- data/test/cms_seeds/test.host/pages/broken.yml +1 -0
- data/test/cms_seeds/test.host/pages/child/subchild.yml +10 -0
- data/test/cms_seeds/test.host/pages/child.yml +10 -0
- data/test/cms_seeds/test.host/pages/index.yml +10 -0
- data/test/cms_seeds/test.host/snippets/broken.yml +1 -0
- data/test/cms_seeds/test.host/snippets/default.yml +3 -0
- data/test/fixtures/cms_blocks.yml +12 -0
- data/test/fixtures/cms_layouts.yml +36 -0
- data/test/fixtures/cms_pages.yml +39 -0
- data/test/fixtures/cms_sites.yml +3 -0
- data/test/fixtures/cms_snippets.yml +5 -0
- data/test/fixtures/cms_upload_dirs.yml +9 -0
- data/test/fixtures/cms_uploads.yml +4 -0
- data/test/fixtures/cms_users.yml +11 -0
- data/test/fixtures/files/invalid_file.gif +9 -0
- data/test/fixtures/files/valid_image.jpg +0 -0
- data/test/fixtures/views/_nav_hook.html.erb +1 -0
- data/test/fixtures/views/_nav_hook_2.html.erb +1 -0
- data/test/functional/cms_admin/layouts_controller_test.rb +103 -0
- data/test/functional/cms_admin/pages_controller_test.rb +334 -0
- data/test/functional/cms_admin/sites_controller_test.rb +99 -0
- data/test/functional/cms_admin/snippets_controller_test.rb +102 -0
- data/test/functional/cms_admin/uploads_controller_test.rb +26 -0
- data/test/functional/cms_content_controller_test.rb +134 -0
- data/test/integration/rake_tasks_test.rb +65 -0
- data/test/integration/render_cms_seed_test.rb +34 -0
- data/test/integration/render_cms_test.rb +81 -0
- data/test/integration/sites_test.rb +63 -0
- data/test/integration/view_hooks_test.rb +33 -0
- data/test/test_helper.rb +86 -0
- data/test/unit/cms_block_test.rb +43 -0
- data/test/unit/cms_configuration_test.rb +17 -0
- data/test/unit/cms_layout_test.rb +146 -0
- data/test/unit/cms_page_test.rb +257 -0
- data/test/unit/cms_site_test.rb +41 -0
- data/test/unit/cms_snippet_test.rb +77 -0
- data/test/unit/cms_tag_test.rb +206 -0
- data/test/unit/cms_tags/field_datetime_test.rb +34 -0
- data/test/unit/cms_tags/field_integer_test.rb +33 -0
- data/test/unit/cms_tags/field_string_test.rb +34 -0
- data/test/unit/cms_tags/field_text_test.rb +32 -0
- data/test/unit/cms_tags/helper_test.rb +38 -0
- data/test/unit/cms_tags/page_datetime_test.rb +34 -0
- data/test/unit/cms_tags/page_integer_test.rb +33 -0
- data/test/unit/cms_tags/page_rich_text.rb +33 -0
- data/test/unit/cms_tags/page_string_test.rb +33 -0
- data/test/unit/cms_tags/page_text_test.rb +34 -0
- data/test/unit/cms_tags/partial_test.rb +44 -0
- data/test/unit/cms_tags/snippet_test.rb +33 -0
- data/test/unit/cms_upload_dir_test.rb +8 -0
- data/test/unit/cms_upload_test.rb +26 -0
- data/test/unit/cms_user_test.rb +8 -0
- data/test/unit/view_methods_test.rb +21 -0
- 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
|