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 | |