adding preview functionality

Oleg committed Jan 06, 2011
commit e3e7119c853b46e14abed85488fb998a7a45d036
Showing 8 changed files with 86 additions and 24 deletions
app/controllers/cms_admin/pages_controller.rb +10 -2
@@ @@ -1,8 +1,9 @@
class CmsAdmin::PagesController < CmsAdmin::BaseController
before_filter :build_cms_page, :only => [:new, :create]
- before_filter :build_upload_file, :only => [:new, :edit]
before_filter :load_cms_page, :only => [:edit, :update, :destroy]
+ before_filter :preview_cms_page, :only => [:create, :update]
+ before_filter :build_upload_file, :only => [:new, :edit]
def index
return redirect_to :action => :new if @cms_site.cms_pages.count == 0
@@ @@ -27,7 +28,7 @@ class CmsAdmin::PagesController < CmsAdmin::BaseController
end
def update
- @cms_page.update_attributes!(params[:cms_page])
+ @cms_page.save!
flash[:notice] = 'Page updated'
redirect_to :action => :edit, :id => @cms_page
rescue ActiveRecord::RecordInvalid
@@ @@ -60,10 +61,17 @@ protected
def load_cms_page
@cms_page = @cms_site.cms_pages.find(params[:id])
+ @cms_page.attributes = params[:cms_page]
@cms_page.cms_layout ||= (@cms_page.parent && @cms_page.parent.cms_layout || @cms_site.cms_layouts.first)
rescue ActiveRecord::RecordNotFound
flash[:error] = 'Page not found'
redirect_to :action => :index
end
+ def preview_cms_page
+ if params[:preview]
+ layout = @cms_page.cms_layout.app_layout.blank?? false : @cms_page.cms_layout.app_layout
+ render :inline => @cms_page.content(true), :layout => layout
+ end
+ end
end
app/views/cms_admin/pages/_form.html.erb +6 -1
@@ @@ -29,4 +29,9 @@
<%= render :partial => 'form_blocks' %>
- <%= form.check_box :is_published, :label => 'Published' %>
\ No newline at end of file
+ <%= form.simple_field nil, nil, :class => 'form_save' do %>
+ <%= form.check_box :is_published, :disable_builder => true %>
+ <%= form.label_for :is_published, :label => 'Published' %>
+ <%= form.submit @cms_page.new_record?? 'Create Page' : 'Update Page', :disable_builder => true %>
+ <%= form.submit 'Preview', :name => 'preview', :id => 'cms_page_preview', :disable_builder => true %>
+ <% end %>
\ No newline at end of file
app/views/cms_admin/pages/edit.html.erb +0 -1
@@ @@ -2,5 +2,4 @@
<%= cms_form_for @cms_page, :url => {:action => :update} do |form| %>
<%= render :partial => 'form', :object => form %>
- <%= form.submit 'Update Page' %>
<% end %>
\ No newline at end of file
app/views/cms_admin/pages/new.html.erb +0 -1
@@ @@ -2,5 +2,4 @@
<%= cms_form_for @cms_page, :url => {:action => :create} do |form| %>
<%= render :partial => 'form', :object => form %>
- <%= form.submit 'Create Page' %>
<% end %>
\ No newline at end of file
comfortable_mexican_sofa/form_builder.rb b/lib/comfortable_mexican_sofa/form_builder.rb +4 -4
@@ @@ -24,10 +24,10 @@ class ComfortableMexicanSofa::FormBuilder < ActionView::Helpers::FormBuilder
).html_safe
end
- def simple_field(label = nil, content = nil, &block)
+ def simple_field(label = nil, content = nil, options = {}, &block)
content ||= @template.capture(&block) if block_given?
%(
- <div class='form_element'>
+ <div class='form_element #{options.delete(:class)}'>
<div class='label'>#{label}</div>
<div class='value'>#{content}</div>
</div>
@@ @@ -40,11 +40,11 @@ class ComfortableMexicanSofa::FormBuilder < ActionView::Helpers::FormBuilder
end
def submit(value, options = {}, &block)
+ return super if options.delete(:disable_builder)
extra_content = @template.capture(&block) if block_given?
- cancel_link ||= options[:cancel_url] ? ' or ' + options.delete(:cancel_url) : ''
%(
<div class='form_element submit_element'>
- #{super(value, options)} #{extra_content} #{cancel_link}
+ #{super(value, options)} #{extra_content}
</div>
).html_safe
end
public/javascripts/comfortable_mexican_sofa/cms.js +10 -0
@@ @@ -9,6 +9,7 @@ $.CMS = function(){
$.CMS.load_page_blocks();
$.CMS.enable_rich_text();
$.CMS.enable_date_picker();
+ if($('form.new_cms_page, form.edit_cms_page').get(0)) $.CMS.enable_page_save_form();
if($('#page_save').get(0)) $.CMS.enable_page_save_widget();
if($('#uploader_button').get(0)) $.CMS.enable_uploader();
@@ @@ -103,6 +104,15 @@ $.CMS = function(){
})
},
+ enable_page_save_form : function(){
+ $('input[name=commit]').click(function() {
+ $(this).parents('form').attr('target', '');
+ });
+ $('input[name=preview]').click(function() {
+ $(this).parents('form').attr('target', '_blank');
+ });
+ },
+
enable_uploader : function(){
auth_token = $("meta[name=csrf-token]").attr('content');
var uploader = new plupload.Uploader({
public/stylesheets/comfortable_mexican_sofa/structure.css +13 -2
@@ @@ -158,12 +158,14 @@ html, body {
.form_element .value {
margin-left: 160px;
}
- .form_element .value input,
+ .form_element .value input[type='text'],
+ .form_element .value input[type='password'],
.form_element .value textarea,
.form_element .value select {
width: 98%;
}
- .form_element .value input,
+ .form_element .value input[type='text'],
+ .form_element .value input[type='password'],
.form_element .value select,
.form_element .value textarea {
border: 1px solid #ccc;
@@ @@ -207,6 +209,15 @@ html, body {
.form_element .value .field_with_errors textarea {
border-color: #9e0b0f;
}
+ .form_element.form_save {
+ background-color: #E0E0E0;
+ border-radius: 3px;
+ -moz-border-radius: 3px;
+ padding: 5px 0px;
+ }
+ .form_element.form_save label {
+ margin: 0px 5px;
+ }
/* -- Listings ----------------------------------------------------------- */
ul.list li .item {
test/functional/cms_admin/pages_controller_test.rb +43 -13
@@ @@ -126,19 +126,17 @@ class CmsAdmin::PagesControllerTest < ActionController::TestCase
def test_creation
assert_difference 'CmsPage.count' do
- assert_difference 'CmsBlock.count', 3 do
+ assert_difference 'CmsBlock.count', 2 do
post :create, :cms_page => {
:label => 'Test Page',
:slug => 'test-page',
:parent_id => cms_pages(:default).id,
:cms_layout_id => cms_layouts(:default).id,
:cms_blocks_attributes => [
- { :label => 'content',
+ { :label => 'default_page_text',
:content => 'content content' },
- { :label => 'title',
- :content => 'title content' },
- { :label => 'number',
- :content => '999' }
+ { :label => 'default_field_text',
+ :content => 'title content' }
]
}
assert_response :redirect
@@ @@ -155,18 +153,16 @@ class CmsAdmin::PagesControllerTest < ActionController::TestCase
post :create, :cms_page => {
:cms_layout_id => cms_layouts(:default).id,
:cms_blocks_attributes => [
- { :label => 'content',
+ { :label => 'default_page_text',
:content => 'content content' },
- { :label => 'title',
- :content => 'title content' },
- { :label => 'number',
- :content => '999' }
+ { :label => 'default_field_text',
+ :content => 'title content' }
]
}
assert_response :success
page = assigns(:cms_page)
- assert_equal 3, page.cms_blocks.size
- assert_equal ['content content', 'title content', '999'], page.cms_blocks.collect{|b| b.content}
+ assert_equal 2, page.cms_blocks.size
+ assert_equal ['content content', 'title content'], page.cms_blocks.collect{|b| b.content}
assert_template :new
assert_equal 'Failed to create page', flash[:error]
end
@@ @@ -252,4 +248,38 @@ class CmsAdmin::PagesControllerTest < ActionController::TestCase
assert_template :form_blocks
end
+ def test_creation_preview
+ assert_no_difference 'CmsPage.count' do
+ post :create, :preview => 'Preview', :cms_page => {
+ :label => 'Test Page',
+ :slug => 'test-page',
+ :parent_id => cms_pages(:default).id,
+ :cms_layout_id => cms_layouts(:default).id,
+ :cms_blocks_attributes => [
+ { :label => 'default_page_text',
+ :content => 'preview content' }
+ ]
+ }
+ assert_response :success
+ assert_match /preview content/, response.body
+ end
+ end
+
+ def test_update_preview
+ page = cms_pages(:default)
+ assert_no_difference 'CmsPage.count' do
+ put :update, :preview => 'Preview', :id => page, :cms_page => {
+ :label => 'Updated Label',
+ :cms_blocks_attributes => [
+ { :label => 'default_page_text',
+ :content => 'preview content',
+ :id => cms_blocks(:default_page_text).id}
+ ]
+ }
+ assert_response :success
+ assert_match /preview content/, response.body
+ page.reload
+ assert_not_equal 'Updated Label', page.label
+ end
+ end
end
\ No newline at end of file