pages can be sorted
Oleg
committed Jan 28, 2011
commit 4dc308bf109fb3ca39db737a58b0a190244a64d1
Showing 11
changed files with
69 additions
and 4 deletions
app/controllers/cms_admin/pages_controller.rb
+9
-0
| @@ | @@ -57,6 +57,15 @@ class CmsAdmin::PagesController < CmsAdmin::BaseController |
| # do nothing | |
| end | |
| + | def reorder |
| + | (params[:cms_page] || []).each_with_index do |id, index| |
| + | if (cms_page = CmsPage.find_by_id(id)) |
| + | cms_page.update_attribute(:position, index) |
| + | end |
| + | end |
| + | render :nothing => true |
| + | end |
| + | |
| protected | |
| def check_for_layouts | |
app/models/cms_page.rb
+8
-1
| @@ | @@ -16,7 +16,8 @@ class CmsPage < ActiveRecord::Base |
| # -- Callbacks ------------------------------------------------------------ | |
| before_validation :assign_parent, | |
| - | :assign_full_path |
| + | :assign_full_path, |
| + | :assign_position |
| before_save :set_cached_content | |
| after_save :sync_child_pages | |
| @@ | @@ -130,6 +131,12 @@ protected |
| self.full_path = self.parent ? "#{self.parent.full_path}/#{self.slug}".squeeze('/') : '/' | |
| end | |
| + | def assign_position |
| + | return unless self.parent |
| + | max = self.parent.children.maximum(:position) |
| + | self.position = max ? max + 1 : 0 |
| + | end |
| + | |
| def validate_target_page | |
| return unless self.target_page | |
| p = self | |
app/views/cms_admin/pages/_index_branch.html.erb
+2
-2
| @@ | @@ -5,7 +5,7 @@ |
| branch_open = (session[:cms_page_tree] || []).member?(cms_page.id.to_s) || cms_page.root? | |
| %> | |
| - | <li id='cms_page_<%= cms_page.id %>'> |
| + | <li id='<%= dom_id(cms_page) %>'> |
| <div class='item'> | |
| <div class='toggle <%= 'open' if branch_open %>'> | |
| <%= | |
| @@ | @@ -16,7 +16,7 @@ |
| </div> | |
| <div class='icon'> | |
| <% if has_siblings %> | |
| - | <div class='dragger'></div> |
| + | <div class='dragger'><span>drag</span></div> |
| <% end %> | |
| </div> | |
| <div class='action_links'> | |
app/views/cms_admin/pages/index.html.erb
+1
-1
| @@ | @@ -1,6 +1,6 @@ |
| <%= link_to span_tag('Create New Page'), new_cms_admin_page_path, :class => 'big_button' %> | |
| <h1>Pages</h1> | |
| - | <ul class='list'> |
| + | <ul class='list sortable'> |
| <%= render :partial => 'index_branch', :collection => @cms_pages %> | |
| </ul> | |
| \ No newline at end of file | |
app/views/cms_admin/pages/toggle_branch.js.erb
+1
-0
| @@ | @@ -4,6 +4,7 @@ li.find('.item .toggle').first().toggleClass('open'); |
| <% if session[:cms_page_tree].member?(@cms_page.id.to_s) %> | |
| if(!li.find('ul')[0]) { | |
| li.append('<ul><%= escape_javascript(render :partial => "index_branch", :collection => @cms_page.children) %></ul>'); | |
| + | $.CMS.enable_sortable_list(); |
| } | |
| <% else %> | |
| li.find('ul').remove(); | |
config/routes.rb
+3
-0
| @@ | @@ -7,6 +7,9 @@ Rails.application.routes.draw do |
| match :form_blocks | |
| match :toggle_branch | |
| end | |
| + | collection do |
| + | match :reorder |
| + | end |
| end | |
| resources :sites | |
| resources :layouts | |
public/images/comfortable_mexican_sofa/icon_move.gif
+0
-0
public/javascripts/comfortable_mexican_sofa/cms.js
+11
-0
| @@ | @@ -10,6 +10,7 @@ $.CMS = function(){ |
| $.CMS.enable_rich_text(); | |
| $.CMS.enable_date_picker(); | |
| $.CMS.enable_desc_toggle(); | |
| + | $.CMS.enable_sortable_list(); |
| 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(); | |
| @@ | @@ -18,6 +19,16 @@ $.CMS = function(){ |
| return { | |
| + | enable_sortable_list: function(){ |
| + | $('ul.sortable, ul.sortable ul').sortable({ |
| + | handle: 'div.dragger', |
| + | axis: 'y', |
| + | update: function(){ |
| + | $.post(current_path + '/reorder', '_method=put&'+$(this).sortable('serialize')); |
| + | } |
| + | }) |
| + | }, |
| + | |
| slugify: function(){ | |
| $('input#slugify').bind('keyup.cms', function() { | |
| $('input#slug').val( slugify( $(this).val() ) ); | |
public/stylesheets/comfortable_mexican_sofa/structure.css
+12
-0
| @@ | @@ -281,6 +281,18 @@ ul.list li .item .icon { |
| height: 28px; | |
| background: url(/images/comfortable_mexican_sofa/icon_regular.gif); | |
| } | |
| + | ul.list li .item .icon .dragger { |
| + | width: 28px; |
| + | height: 28px; |
| + | background: url(/images/comfortable_mexican_sofa/icon_move.gif); |
| + | display: none; |
| + | } |
| + | ul.list li .item .icon:hover .dragger { |
| + | display: block; |
| + | } |
| + | ul.list li .item .icon .dragger span { |
| + | display: none; |
| + | } |
| ul.list li .item .label { | |
| margin-left: 60px; | |
| font-size: 14px; | |
test/functional/cms_admin/pages_controller_test.rb
+21
-0
| @@ | @@ -310,4 +310,25 @@ class CmsAdmin::PagesControllerTest < ActionController::TestCase |
| assert_response :success | |
| assert_equal [], session[:cms_page_tree] | |
| end | |
| + | |
| + | def test_reorder |
| + | page_one = cms_pages(:child) |
| + | page_two = cms_sites(:default).cms_pages.create!( |
| + | :parent => cms_pages(:default), |
| + | :cms_layout => cms_layouts(:default), |
| + | :label => 'test', |
| + | :slug => 'test' |
| + | ) |
| + | assert_equal 0, page_one.position |
| + | assert_equal 1, page_two.position |
| + | |
| + | post :reorder, :cms_page => [page_two.id, page_one.id] |
| + | assert_response :success |
| + | page_one.reload |
| + | page_two.reload |
| + | |
| + | assert_equal 1, page_one.position |
| + | assert_equal 0, page_two.position |
| + | end |
| + | |
| end | |
| \ No newline at end of file | |
test/unit/cms_page_test.rb
+1
-0
| @@ | @@ -57,6 +57,7 @@ class CmsPageTest < ActiveSupport::TestCase |
| ] | |
| ) | |
| assert page.is_published? | |
| + | assert_equal 1, page.position |
| end | |
| end | |