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