active_scaffold_sortable 3.1.2 → 3.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/LICENSE.txt +1 -1
- data/README.textile +12 -31
- data/app/assets/images/active_scaffold/sortable.png +0 -0
- data/app/assets/javascripts/active_scaffold_sortable.js.erb +1 -0
- data/app/assets/javascripts/jquery/active_scaffold_sortable.js +46 -0
- data/app/assets/javascripts/jquery/active_scaffold_sortable.js~ +45 -0
- data/app/assets/javascripts/prototype/active_scaffold_sortable.js +34 -0
- data/app/assets/javascripts/prototype/active_scaffold_sortable.js~ +34 -0
- data/app/assets/stylesheets/active_scaffold_sortable.css.scss +7 -0
- data/app/views/active_scaffold_overrides/_form_association.html.erb +6 -0
- data/app/views/active_scaffold_overrides/_form_association.html.erb~ +6 -0
- data/app/views/active_scaffold_overrides/edit_associated.js.erb +6 -0
- data/app/views/active_scaffold_overrides/edit_associated.js.erb~ +6 -0
- data/frontends/default/active_scaffold_overrides/_list.html.erb +1 -0
- data/frontends/default/active_scaffold_overrides/on_create.js.erb +4 -0
- data/frontends/default/active_scaffold_overrides/on_create.js.erb~ +4 -0
- data/frontends/default/active_scaffold_overrides/on_update.js.erb +4 -0
- data/frontends/default/{views/on_update.js.erb → active_scaffold_overrides/on_update.js.erb~} +0 -0
- data/frontends/default/active_scaffold_overrides/reorder.js.erb +5 -0
- data/lib/active_scaffold/actions/sortable.rb +3 -3
- data/lib/active_scaffold/actions/sortable.rb~ +81 -0
- data/lib/active_scaffold/config/sortable.rb +47 -3
- data/lib/active_scaffold/helpers/sortable_helpers.rb +8 -16
- data/lib/active_scaffold_sortable.rb +3 -1
- data/lib/active_scaffold_sortable/core.rb +4 -1
- data/lib/active_scaffold_sortable/version.rb +2 -2
- data/lib/active_scaffold_sortable/view_helpers.rb +17 -0
- data/lib/active_scaffold_sortable/view_helpers.rb~ +16 -0
- metadata +42 -25
- data/app/assets/stylesheets/active_scaffold_sortable.css +0 -6
- data/frontends/default/views/_list_with_header.html.erb +0 -9
- data/frontends/default/views/on_create.js.erb +0 -16
- data/frontends/default/views/reorder.js.erb +0 -1
data/LICENSE.txt
CHANGED
data/README.textile
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
h1. Drag-Drop Sortable for ActiveScaffold
|
2
2
|
|
3
|
-
Currently, this plugin is compatible with rails 3.x and
|
3
|
+
Currently, this plugin is compatible with rails 3.x and ActiveScaffold 3.x gems.
|
4
4
|
|
5
5
|
h2. Overview
|
6
6
|
|
@@ -8,11 +8,11 @@ This plugin enables those slicker-than-snot ajax drag-drop sortable elements on
|
|
8
8
|
|
9
9
|
h2. Installation
|
10
10
|
|
11
|
-
You'll need at least
|
11
|
+
You'll need at least ActiveScaffold 3.x to use this, and rails 3.x
|
12
12
|
|
13
13
|
|
14
14
|
<pre>
|
15
|
-
|
15
|
+
gem install active_scaffold_sortable
|
16
16
|
</pre>
|
17
17
|
|
18
18
|
h2. Usage
|
@@ -28,14 +28,18 @@ Create a model with a column named 'position':
|
|
28
28
|
# title string(255)
|
29
29
|
# birthday date
|
30
30
|
# position integer
|
31
|
+
</pre>
|
32
|
+
|
33
|
+
h4. Step 2
|
31
34
|
|
35
|
+
Add acts_as_list to the model.
|
36
|
+
<pre>
|
32
37
|
class Entry < ActiveRecord::Base
|
38
|
+
acts_as_list # this line
|
33
39
|
end
|
34
40
|
</pre>
|
35
41
|
|
36
|
-
|
37
|
-
|
38
|
-
Create your scaffold controller
|
42
|
+
You can skip adding acts_as_list to the model, but you will have to enable sortable in the controller.
|
39
43
|
|
40
44
|
<pre>
|
41
45
|
# app/controllers/entries_controller.rb
|
@@ -48,38 +52,15 @@ class EntryController < ApplicationController
|
|
48
52
|
end
|
49
53
|
</pre>
|
50
54
|
|
51
|
-
|
52
|
-
h4. Step 3
|
53
|
-
|
54
|
-
Create your layout
|
55
|
-
|
56
|
-
<pre>
|
57
|
-
# app/views/layouts/application.rhtml
|
58
|
-
<html>
|
59
|
-
<head>
|
60
|
-
<title>active scaffold demo application</title>
|
61
|
-
<%= javascript_include_tag :defaults %>
|
62
|
-
<%= active_scaffold_includes %>
|
63
|
-
</head>
|
64
|
-
<body>
|
65
|
-
<%= yield %>
|
66
|
-
</body>
|
67
|
-
</html>
|
68
|
-
</pre>
|
69
|
-
|
70
|
-
h2. Notice:
|
71
|
-
|
72
|
-
If you are using acts_as_list plugin you can skip the step 3
|
73
|
-
|
74
55
|
h2. Support
|
75
56
|
|
76
|
-
If you have issues installing the plugin, search / post to the "Active Scaffold":http://groups.google.com/group/activescaffold forum or "Create an issue":http://github.com/
|
57
|
+
If you have issues installing the plugin, search / post to the "Active Scaffold":http://groups.google.com/group/activescaffold forum or "Create an issue":http://github.com/activescaffold/active_scaffold_sortable/issues
|
77
58
|
|
78
59
|
h2. Contributing
|
79
60
|
|
80
61
|
Fork, hack, push, and request a pull:
|
81
62
|
|
82
|
-
http://github.com/
|
63
|
+
http://github.com/activescaffold/active_scaffold_sortable/
|
83
64
|
|
84
65
|
h2. License
|
85
66
|
|
Binary file
|
@@ -0,0 +1 @@
|
|
1
|
+
<% require_asset "#{ActiveScaffold.js_framework}/active_scaffold_sortable" %>
|
@@ -0,0 +1,46 @@
|
|
1
|
+
ActiveScaffold.update_positions = function(content) {
|
2
|
+
if (typeof(content) == 'string') content = jQuery('#' + content);
|
3
|
+
var element = content.closest('.sortable-container');
|
4
|
+
jQuery.each(content.find('.sub-form-record input[name$="[' + element.data('column') + ']"]'), function(i, field) {
|
5
|
+
jQuery(field).val(i);
|
6
|
+
});
|
7
|
+
}
|
8
|
+
ActiveScaffold.sortable = function(element) {
|
9
|
+
var form, content, sortable_options = {};
|
10
|
+
if (typeof(element) == 'string') {
|
11
|
+
content = jQuery('#' + element);
|
12
|
+
element = content.closest('.sortable-container');
|
13
|
+
form = element.closest('form.as_form').length > 0;
|
14
|
+
} else {
|
15
|
+
form = element.closest('form.as_form').length > 0;
|
16
|
+
if (form) content = element;
|
17
|
+
else content = element.find('.records:first');
|
18
|
+
}
|
19
|
+
|
20
|
+
if (form) {
|
21
|
+
sortable_options.update = function(event, ui) {
|
22
|
+
ActiveScaffold.update_positions(content);
|
23
|
+
};
|
24
|
+
} else {
|
25
|
+
var csrf = jQuery('meta[name=csrf-param]').attr('content') + '=' + jQuery('meta[name=csrf-token]').attr('content');
|
26
|
+
var url = element.data('reorder-url');
|
27
|
+
sortable_options.update = function(event, ui) {
|
28
|
+
var body = jQuery(this).sortable('serialize',{key: encodeURIComponent(jQuery(this).attr('id') + '[]'), expression: new RegExp(element.data('format'))});
|
29
|
+
var params = element.data('with');
|
30
|
+
if (params) body += '&' + params;
|
31
|
+
jQuery.post(url, body + '&' + csrf);
|
32
|
+
};
|
33
|
+
}
|
34
|
+
sortable_options.handle = element.data('handle');
|
35
|
+
sortable_options.items = element.data('tag');
|
36
|
+
content.sortable(sortable_options);
|
37
|
+
};
|
38
|
+
|
39
|
+
jQuery(document).ready(function($) {
|
40
|
+
$(document).on('as:action_success', 'a.as_action', function(e, action_link) {
|
41
|
+
var sortable = $('.sortable-container', action_link.adapter);
|
42
|
+
if (sortable.length) $.each(sortable, function(i, s) { ActiveScaffold.sortable(s); });
|
43
|
+
});
|
44
|
+
var sortable = $('.sortable-container');
|
45
|
+
if (sortable.length) ActiveScaffold.sortable(sortable);
|
46
|
+
});
|
@@ -0,0 +1,45 @@
|
|
1
|
+
ActiveScaffold.update_positions = function(content) {
|
2
|
+
if (typeof(content) == 'string') content = jQuery('#' + content);
|
3
|
+
var element = content.closest('.sortable-container');
|
4
|
+
jQuery.each(content.find('.sub-form-record input[name$="[' + element.data('column') + ']"]'), function(i, field) {
|
5
|
+
jQuery(field).val(i);
|
6
|
+
});
|
7
|
+
}
|
8
|
+
ActiveScaffold.sortable = function(element) {
|
9
|
+
var form, content, sortable_options = {};
|
10
|
+
if (typeof(element) == 'string') {
|
11
|
+
content = jQuery('#' + element);
|
12
|
+
element = content.closest('.sortable-container');
|
13
|
+
} else {
|
14
|
+
var form = element.closest('form.as_form').length > 0;
|
15
|
+
if (form) content = element;
|
16
|
+
else content = element.find('.records:first');
|
17
|
+
}
|
18
|
+
|
19
|
+
if (form) {
|
20
|
+
sortable_options.update = function(event, ui) {
|
21
|
+
ActiveScaffold.update_positions(content);
|
22
|
+
};
|
23
|
+
} else {
|
24
|
+
var csrf = jQuery('meta[name=csrf-param]').attr('content') + '=' + jQuery('meta[name=csrf-token]').attr('content');
|
25
|
+
var url = element.data('reorder-url');
|
26
|
+
sortable_options.update = function(event, ui) {
|
27
|
+
var body = jQuery(this).sortable('serialize',{key: encodeURIComponent(jQuery(this).attr('id') + '[]'), expression: new RegExp(element.data('format'))});
|
28
|
+
var params = element.data('with');
|
29
|
+
if (params) body += '&' + params;
|
30
|
+
jQuery.post(url, body + '&' + csrf);
|
31
|
+
};
|
32
|
+
}
|
33
|
+
sortable_options.handle = element.data('handle');
|
34
|
+
sortable_options.items = element.data('tag');
|
35
|
+
content.sortable(sortable_options);
|
36
|
+
};
|
37
|
+
|
38
|
+
jQuery(document).ready(function($) {
|
39
|
+
$(document).on('as:action_success', 'a.as_action', function(e, action_link) {
|
40
|
+
var sortable = $('.sortable-container', action_link.adapter);
|
41
|
+
if (sortable.length) $.each(sortable, function(i, s) { ActiveScaffold.sortable(s); });
|
42
|
+
});
|
43
|
+
var sortable = $('.sortable-container');
|
44
|
+
if (sortable.length) ActiveScaffold.sortable(sortable);
|
45
|
+
});
|
@@ -0,0 +1,34 @@
|
|
1
|
+
ActiveScaffold.sortable = function(element) {
|
2
|
+
var form, content, sortable_options = {};
|
3
|
+
if (typeof(element) == 'string') {
|
4
|
+
content = $(element);
|
5
|
+
element = content.up('.sortable-container');
|
6
|
+
} else {
|
7
|
+
var form = !!element.up('form.as_form');
|
8
|
+
if (form) content = element;
|
9
|
+
else content = element.down('.records');
|
10
|
+
}
|
11
|
+
|
12
|
+
if (!form) {
|
13
|
+
var csrf = $$('meta[name=csrf-param]')[0].readAttribute('content') + '=' + $$('meta[name=csrf-token]')[0].readAttribute('content');
|
14
|
+
var url = element.readAttribute('data-reorder-url').append_params(csrf);
|
15
|
+
sortable_options.onUpdate = function() {
|
16
|
+
var body = Sortable.serialize(content);
|
17
|
+
var params = element.readAttribute('data-with');
|
18
|
+
if (params) body += '&' + params;
|
19
|
+
new Ajax.Request(url, {method: 'post', parameters: body + '&' + csrf});
|
20
|
+
}
|
21
|
+
}
|
22
|
+
sortable_options.handle = element.readAttribute('data-handle');
|
23
|
+
sortable_options.items = element.readAttribute('data-tag');
|
24
|
+
Sortable.create(content, sortable_options);
|
25
|
+
};
|
26
|
+
|
27
|
+
document.observe('dom:loaded', function(){
|
28
|
+
document.on('as:action_success', 'a.as_action', function(e, action_link) {
|
29
|
+
var sortable = $(action_link.adapter).find('.sortable-container');
|
30
|
+
if (sortable.length) sortable.invoke(function(s) { ActiveScaffold.sortable(s); });
|
31
|
+
});
|
32
|
+
var sortable = $$('.sortable-container');
|
33
|
+
if (sortable.length) ActiveScaffold.sortable(sortable[0]);
|
34
|
+
});
|
@@ -0,0 +1,34 @@
|
|
1
|
+
ActiveScaffold.sortable = function(element) {
|
2
|
+
var form, content, sortable_options = {};
|
3
|
+
if (typeof(element) == 'string') {
|
4
|
+
content = $(element);
|
5
|
+
element = content.up('.sortable-container');
|
6
|
+
} else {
|
7
|
+
var form = !!element.up('form.as_form');
|
8
|
+
if (form) content = element.down('.sub-form');
|
9
|
+
else content = element.down('.records');
|
10
|
+
}
|
11
|
+
|
12
|
+
if (!form) {
|
13
|
+
var csrf = $$('meta[name=csrf-param]')[0].readAttribute('content') + '=' + $$('meta[name=csrf-token]')[0].readAttribute('content');
|
14
|
+
var url = element.readAttribute('data-reorder-url').append_params(csrf);
|
15
|
+
sortable_options.onUpdate = function() {
|
16
|
+
var body = Sortable.serialize(content);
|
17
|
+
var params = element.readAttribute('data-with');
|
18
|
+
if (params) body += '&' + params;
|
19
|
+
new Ajax.Request(url, {method: 'post', parameters: body + '&' + csrf});
|
20
|
+
}
|
21
|
+
}
|
22
|
+
sortable_options.handle = element.readAttribute('data-handle');
|
23
|
+
sortable_options.items = element.readAttribute('data-tag');
|
24
|
+
Sortable.create(content, sortable_options);
|
25
|
+
};
|
26
|
+
|
27
|
+
document.observe('dom:loaded', function(){
|
28
|
+
document.on('as:action_success', 'a.as_action', function(e, action_link) {
|
29
|
+
var sortable = $(action_link.adapter).find('.sortable-container');
|
30
|
+
if (sortable.length) sortable.invoke(function(s) { ActiveScaffold.sortable(s); });
|
31
|
+
});
|
32
|
+
var sortable = $$('.sortable-container');
|
33
|
+
if (sortable.length) ActiveScaffold.sortable(sortable[0]);
|
34
|
+
});
|
@@ -0,0 +1,6 @@
|
|
1
|
+
<% config = active_scaffold_config_for(column.association.klass) %>
|
2
|
+
<% if config.actions.include? :sortable %>
|
3
|
+
<%= content_tag :div, render(:super), :class => 'sortable-container', :data => sort_params(config).merge(:tag => '.sub-form-record') %>
|
4
|
+
<% else %>
|
5
|
+
<%= render :super %>
|
6
|
+
<% end %>
|
@@ -0,0 +1,6 @@
|
|
1
|
+
<% config = active_scaffold_config_for(column.association.klass) %>
|
2
|
+
<% if config.actions.include? :sortable %>
|
3
|
+
<%= content_tag :div, render(:super), :class => 'sortable-container', :data => sort_params(config).merge(:tag => 'tbody') %>
|
4
|
+
<% else %>
|
5
|
+
<%= render :super %>
|
6
|
+
<% end %>
|
@@ -0,0 +1,6 @@
|
|
1
|
+
<%= render :super %>
|
2
|
+
<% config = active_scaffold_config_for(@column.association.klass) %>
|
3
|
+
<% if config.actions.include? :sortable %>
|
4
|
+
ActiveScaffold.update_positions('<%= sub_form_list_id(:association => @column.name) %>');
|
5
|
+
ActiveScaffold.sortable('<%= sub_form_list_id(:association => @column.name) %>');
|
6
|
+
<% end %>
|
@@ -0,0 +1,6 @@
|
|
1
|
+
<%= render :super %>
|
2
|
+
<% config = active_scaffold_config_for(@column.association.klass) %>
|
3
|
+
<% if config.actions.include? :sortable %>
|
4
|
+
ActiveScaffold.update_position('<%= sub_form_list_id(:association => @column.name) %>');
|
5
|
+
ActiveScaffold.sortable('<%= sub_form_list_id(:association => @column.name) %>');
|
6
|
+
<% end %>
|
@@ -0,0 +1 @@
|
|
1
|
+
<%= content_tag :div, render(:super), :class => 'sortable-container', :data => sort_params %>
|
data/frontends/default/{views/on_update.js.erb → active_scaffold_overrides/on_update.js.erb~}
RENAMED
File without changes
|
@@ -12,13 +12,12 @@ module ActiveScaffold::Actions
|
|
12
12
|
config.list.sorting = { sortable_column => "asc" }
|
13
13
|
|
14
14
|
config.actions.each do |action_name|
|
15
|
+
next if action_name == :subform
|
15
16
|
action = config.send(action_name)
|
16
17
|
action.columns.exclude(sortable_column) if action.respond_to? :columns
|
17
18
|
end
|
18
19
|
|
19
|
-
|
20
|
-
base.add_active_scaffold_path File.join(dir, frontend, 'views') if config.frontend.to_sym != :default
|
21
|
-
base.add_active_scaffold_path File.join(dir, 'default', 'views')
|
20
|
+
base.add_active_scaffold_path File.join(ActiveScaffold::Config::Sortable.plugin_directory, 'frontends', 'default')
|
22
21
|
end
|
23
22
|
end
|
24
23
|
|
@@ -34,6 +33,7 @@ module ActiveScaffold::Actions
|
|
34
33
|
reorder_simple_list(model)
|
35
34
|
end
|
36
35
|
end
|
36
|
+
do_refresh_list if active_scaffold_config.sortable.refresh_list
|
37
37
|
end
|
38
38
|
|
39
39
|
protected
|
@@ -0,0 +1,81 @@
|
|
1
|
+
module ActiveScaffold::Actions
|
2
|
+
module Sortable
|
3
|
+
def self.included(base)
|
4
|
+
base.helper ActiveScaffold::Helpers::SortableHelpers
|
5
|
+
base.before_filter :sortable_authorized?, :only => :reorder
|
6
|
+
base.active_scaffold_config.configure do |config|
|
7
|
+
config.list.pagination = false
|
8
|
+
|
9
|
+
# turn sorting off
|
10
|
+
sortable_column = config.sortable.column.name
|
11
|
+
config.columns.each {|c| c.sort = false unless c.name == sortable_column }
|
12
|
+
config.list.sorting = { sortable_column => "asc" }
|
13
|
+
|
14
|
+
config.actions.each do |action_name|
|
15
|
+
next if action_name == :subform
|
16
|
+
action = config.send(action_name)
|
17
|
+
action.columns.exclude(sortable_column) if action.respond_to? :columns
|
18
|
+
end
|
19
|
+
|
20
|
+
base.add_active_scaffold_path File.join(ActiveScaffold::Config::Sortable.plugin_directory, 'frontends', 'default')
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
def reorder
|
25
|
+
model = active_scaffold_config.model
|
26
|
+
|
27
|
+
unless (model.instance_methods & [:nested_set_scope, 'nested_set_scope']).empty?
|
28
|
+
reorder_children_in_tree(model)
|
29
|
+
else
|
30
|
+
if model.respond_to? :ancestry_column
|
31
|
+
reorder_ancestry_tree(model)
|
32
|
+
else
|
33
|
+
reorder_simple_list(model)
|
34
|
+
end
|
35
|
+
end
|
36
|
+
do_refresh_list if active_scaffold_config.sortable.refresh_list
|
37
|
+
end
|
38
|
+
|
39
|
+
protected
|
40
|
+
def sortable_authorized?
|
41
|
+
authorized_for?(:action => :update)
|
42
|
+
end
|
43
|
+
|
44
|
+
def reorder_ancestry_tree(model)
|
45
|
+
first_record = model.find(params[active_scaffold_tbody_id].first)
|
46
|
+
unless first_record.nil?
|
47
|
+
records = first_record.is_root? ? model.roots: first_record.parent.children
|
48
|
+
reorder_simple_list(model)
|
49
|
+
else
|
50
|
+
Rails.logger.info("Failed to find first record to reorder")
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
def reorder_simple_list(model)
|
55
|
+
column_name = active_scaffold_config.sortable.column.name
|
56
|
+
debugger
|
57
|
+
params[active_scaffold_tbody_id].each_with_index do |id, index|
|
58
|
+
model.update_all({column_name => index + 1}, {model.primary_key => id})
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
def reorder_children_in_tree(model)
|
63
|
+
current_order = model.find(params[active_scaffold_tbody_id].first).try(:self_and_siblings)
|
64
|
+
new_order = params[active_scaffold_tbody_id].collect {|item_id| item_id.to_i}
|
65
|
+
new_order.each_with_index do |record_id, new_position|
|
66
|
+
if record_id != current_order[new_position].id
|
67
|
+
current_order = move_child(current_order.find {|child| child.id == record_id}, new_position, current_order)
|
68
|
+
end
|
69
|
+
end if new_order.length == current_order.length
|
70
|
+
end
|
71
|
+
|
72
|
+
def move_child(child, new_position, children)
|
73
|
+
old_position = children.index(child)
|
74
|
+
(old_position - new_position).abs.times do |step|
|
75
|
+
child.send((old_position - new_position) > 0 ? :move_left : :move_right)
|
76
|
+
end
|
77
|
+
child.self_and_siblings
|
78
|
+
end
|
79
|
+
|
80
|
+
end
|
81
|
+
end
|
@@ -1,8 +1,8 @@
|
|
1
1
|
module ActiveScaffold::Config
|
2
2
|
class Sortable < Base
|
3
3
|
def initialize(core_config)
|
4
|
-
@options = {}
|
5
4
|
@core = core_config
|
5
|
+
@options = self.class.options.clone
|
6
6
|
|
7
7
|
self.column = core_config.model.new.position_column unless (@core.model.instance_methods & [:acts_as_list_class, 'acts_as_list_class']).empty?
|
8
8
|
self.column = core_config.model.new.left_column_name unless (@core.model.instance_methods & [:nested_set_scope, 'nested_set_scope']).empty?
|
@@ -10,21 +10,65 @@ module ActiveScaffold::Config
|
|
10
10
|
raise "ActiveScaffoldSortable: Missing sortable attribute '#{core_config.model.new.position_column}' in model '#{core_config.model.to_s}'" if @core.model.instance_methods.include? 'acts_as_list_class'
|
11
11
|
raise "ActiveScaffoldSortable: Missing sortable attribute '#{core_config.model.new.left_column_name}' in model '#{core_config.model.to_s}'" if @core.model.instance_methods.include? 'nested_set_scope'
|
12
12
|
end
|
13
|
-
|
13
|
+
self.add_handle_column = self.class.add_handle_column
|
14
|
+
self.refresh_list = self.class.refresh_list
|
14
15
|
end
|
15
16
|
|
16
17
|
cattr_accessor :plugin_directory
|
17
18
|
@@plugin_directory = File.expand_path(__FILE__).match(%{(^.*)/lib/active_scaffold/config/sortable.rb})[1]
|
18
19
|
|
20
|
+
cattr_accessor :add_handle_column
|
21
|
+
@@add_handle_column = false
|
22
|
+
|
23
|
+
cattr_accessor :options
|
24
|
+
@@options = {}
|
25
|
+
|
26
|
+
cattr_accessor :refresh_list
|
27
|
+
|
19
28
|
self.crud_type = :update
|
20
29
|
|
21
30
|
attr_reader :column
|
22
31
|
def column=(column_name)
|
23
32
|
@column = @core.columns[column_name]
|
24
|
-
|
33
|
+
if @column.nil?
|
34
|
+
Rails.logger.error("ActiveScaffold Sortable: postion column: #{column_name} not found in model")
|
35
|
+
else
|
36
|
+
@column.form_ui = :hidden
|
37
|
+
@column.css_class = 'sortable-handle'
|
38
|
+
@column.label = ''
|
39
|
+
@column.weight = -2**(0.size * 8 -2)
|
40
|
+
end
|
25
41
|
@column
|
26
42
|
end
|
27
43
|
|
28
44
|
attr_accessor :options
|
45
|
+
attr_accessor :refresh_list
|
46
|
+
|
47
|
+
attr_reader :add_handle_column
|
48
|
+
def add_handle_column=(where)
|
49
|
+
if where
|
50
|
+
raise(ArgumentError, "Unknown handle column position: #{where}") unless [:first, :last].include?(where)
|
51
|
+
@options[:handle] = 'td.sortable-handle'
|
52
|
+
define_handle_column
|
53
|
+
if where == :first
|
54
|
+
@core.list.columns = [:active_scaffold_sortable] + @core.list.columns.names_without_auth_check unless @core.list.columns.include? :active_scaffold_sortable
|
55
|
+
else
|
56
|
+
@column.weight = 2**(0.size * 8 -2) -1
|
57
|
+
@core.list.columns.add :active_scaffold_sortable
|
58
|
+
end
|
59
|
+
else
|
60
|
+
@options.delete(:handle)
|
61
|
+
end
|
62
|
+
@add_handle_column = where
|
63
|
+
end
|
64
|
+
|
65
|
+
protected
|
66
|
+
|
67
|
+
def define_handle_column
|
68
|
+
@core.columns.add :active_scaffold_sortable
|
69
|
+
@core.columns.exclude :active_scaffold_sortable
|
70
|
+
@core.columns[:active_scaffold_sortable].label = ''
|
71
|
+
@core.columns[:active_scaffold_sortable].sort = false
|
72
|
+
end
|
29
73
|
end
|
30
74
|
end
|
@@ -1,23 +1,15 @@
|
|
1
1
|
module ActiveScaffold::Helpers
|
2
2
|
module SortableHelpers
|
3
|
-
def
|
4
|
-
|
5
|
-
:tag => 'tr',
|
6
|
-
:url => {:action => :reorder, :controller => controller_name },
|
7
|
-
:format => '/^[^_-](?:[A-Za-z0-9_-]*)-(.*)-row$/',
|
8
|
-
:with => "Sortable.serialize(#{active_scaffold_tbody_id.to_json})"
|
9
|
-
}
|
10
|
-
additional_params = [:parent_controller, :eid, :controller].reject {|param| params[param].blank?}
|
11
|
-
options[:with] = additional_params.inject(options[:with]) do |string, param|
|
12
|
-
"#{string} + '&#{param}=' + encodeURIComponent('#{escape_javascript params[param]}')"
|
13
|
-
end
|
14
|
-
options.merge! active_scaffold_config.sortable.options
|
15
|
-
|
16
|
-
[active_scaffold_tbody_id, options]
|
3
|
+
def list_row_class(record)
|
4
|
+
"#{'sortable-handle' unless active_scaffold_config.sortable.add_handle_column} #{super}"
|
17
5
|
end
|
18
6
|
|
19
|
-
def
|
20
|
-
|
7
|
+
def column_class(column, column_value, record)
|
8
|
+
if column == :active_scaffold_sortable
|
9
|
+
'sortable-handle'
|
10
|
+
else
|
11
|
+
super
|
12
|
+
end
|
21
13
|
end
|
22
14
|
end
|
23
15
|
end
|
@@ -6,6 +6,7 @@ module ActiveScaffoldSortable
|
|
6
6
|
def self.root
|
7
7
|
File.dirname(__FILE__) + "/.."
|
8
8
|
end
|
9
|
+
autoload 'ViewHelpers', 'active_scaffold_sortable/view_helpers.rb'
|
9
10
|
end
|
10
11
|
|
11
12
|
module ActiveScaffold
|
@@ -21,6 +22,7 @@ module ActiveScaffold
|
|
21
22
|
ActiveScaffold.autoload_subdir('helpers', self, File.dirname(__FILE__))
|
22
23
|
end
|
23
24
|
end
|
24
|
-
|
25
|
+
ActionView::Base.send :include, ActiveScaffoldSortable::ViewHelpers
|
25
26
|
ActiveScaffold::Config::Core.send :include, ActiveScaffoldSortable::Core
|
26
27
|
ActiveScaffold.stylesheets << 'active_scaffold_sortable'
|
28
|
+
ActiveScaffold.javascripts << 'active_scaffold_sortable'
|
@@ -7,7 +7,10 @@ module ActiveScaffoldSortable
|
|
7
7
|
def initialize_with_sortable(model_id)
|
8
8
|
initialize_without_sortable(model_id)
|
9
9
|
# seems some rubies are returning strings in instance_methods and other symbols...
|
10
|
-
|
10
|
+
if !(model.instance_methods & ['acts_as_list_class', :acts_as_list_class, 'nested_set_scope', :nested_set_scope]).empty?
|
11
|
+
self.actions << :sortable
|
12
|
+
self.sortable # force to load
|
13
|
+
end
|
11
14
|
end
|
12
15
|
end
|
13
16
|
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
module ActiveScaffoldSortable
|
2
|
+
module ViewHelpers
|
3
|
+
def sort_params(config = active_scaffold_config)
|
4
|
+
options = {
|
5
|
+
:tag => 'tr',
|
6
|
+
:reorder_url => url_for(params_for(:action => :reorder, :controller => controller_name)),
|
7
|
+
:format => '^[^_-](?:[A-Za-z0-9_-]*)-(.*)-row$',
|
8
|
+
:column => config.sortable.column.name
|
9
|
+
}
|
10
|
+
options.merge config.sortable.options
|
11
|
+
end
|
12
|
+
|
13
|
+
def active_scaffold_sortable_column(record, column)
|
14
|
+
''
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
module ActiveScaffoldSortable
|
2
|
+
module ViewHelpers
|
3
|
+
def sort_params(config = active_scaffold_config)
|
4
|
+
options = {
|
5
|
+
:tag => 'tr',
|
6
|
+
:reorder_url => url_for(params_for(:action => :reorder, :controller => controller_name)),
|
7
|
+
:format => '^[^_-](?:[A-Za-z0-9_-]*)-(.*)-row$'
|
8
|
+
}
|
9
|
+
options.merge config.sortable.options
|
10
|
+
end
|
11
|
+
|
12
|
+
def active_scaffold_sortable_column(record, column)
|
13
|
+
''
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: active_scaffold_sortable
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 15
|
5
5
|
prerelease:
|
6
6
|
segments:
|
7
7
|
- 3
|
8
|
-
- 1
|
9
8
|
- 2
|
10
|
-
|
9
|
+
- 0
|
10
|
+
version: 3.2.0
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Sergio Cambra
|
@@ -16,10 +16,11 @@ autorequire:
|
|
16
16
|
bindir: bin
|
17
17
|
cert_chain: []
|
18
18
|
|
19
|
-
date: 2012-
|
19
|
+
date: 2012-12-18 00:00:00 Z
|
20
20
|
dependencies:
|
21
21
|
- !ruby/object:Gem::Dependency
|
22
|
-
|
22
|
+
type: :development
|
23
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
23
24
|
none: false
|
24
25
|
requirements:
|
25
26
|
- - ">="
|
@@ -28,12 +29,12 @@ dependencies:
|
|
28
29
|
segments:
|
29
30
|
- 0
|
30
31
|
version: "0"
|
31
|
-
|
32
|
+
version_requirements: *id001
|
32
33
|
prerelease: false
|
33
|
-
type: :development
|
34
34
|
name: shoulda
|
35
35
|
- !ruby/object:Gem::Dependency
|
36
|
-
|
36
|
+
type: :development
|
37
|
+
requirement: &id002 !ruby/object:Gem::Requirement
|
37
38
|
none: false
|
38
39
|
requirements:
|
39
40
|
- - ~>
|
@@ -44,12 +45,12 @@ dependencies:
|
|
44
45
|
- 0
|
45
46
|
- 0
|
46
47
|
version: 1.0.0
|
47
|
-
|
48
|
+
version_requirements: *id002
|
48
49
|
prerelease: false
|
49
|
-
type: :development
|
50
50
|
name: bundler
|
51
51
|
- !ruby/object:Gem::Dependency
|
52
|
-
|
52
|
+
type: :development
|
53
|
+
requirement: &id003 !ruby/object:Gem::Requirement
|
53
54
|
none: false
|
54
55
|
requirements:
|
55
56
|
- - ">="
|
@@ -58,24 +59,25 @@ dependencies:
|
|
58
59
|
segments:
|
59
60
|
- 0
|
60
61
|
version: "0"
|
61
|
-
|
62
|
+
version_requirements: *id003
|
62
63
|
prerelease: false
|
63
|
-
type: :development
|
64
64
|
name: rcov
|
65
65
|
- !ruby/object:Gem::Dependency
|
66
|
-
|
66
|
+
type: :runtime
|
67
|
+
requirement: &id004 !ruby/object:Gem::Requirement
|
67
68
|
none: false
|
68
69
|
requirements:
|
69
|
-
- -
|
70
|
+
- - ">="
|
70
71
|
- !ruby/object:Gem::Version
|
71
|
-
hash:
|
72
|
+
hash: -1842552253
|
72
73
|
segments:
|
73
74
|
- 3
|
75
|
+
- 3
|
74
76
|
- 0
|
75
|
-
|
76
|
-
|
77
|
+
- rc
|
78
|
+
version: 3.3.0.rc
|
79
|
+
version_requirements: *id004
|
77
80
|
prerelease: false
|
78
|
-
type: :runtime
|
79
81
|
name: active_scaffold
|
80
82
|
description: Sort Tree or List Structures by Drag n Drop
|
81
83
|
email: activescaffold@googlegroups.com
|
@@ -87,12 +89,25 @@ extra_rdoc_files:
|
|
87
89
|
- LICENSE.txt
|
88
90
|
- README.textile
|
89
91
|
files:
|
90
|
-
- app/assets/stylesheets/active_scaffold_sortable.css
|
91
|
-
-
|
92
|
-
-
|
93
|
-
-
|
94
|
-
-
|
92
|
+
- app/assets/stylesheets/active_scaffold_sortable.css.scss
|
93
|
+
- app/assets/images/active_scaffold/sortable.png
|
94
|
+
- app/assets/javascripts/active_scaffold_sortable.js.erb
|
95
|
+
- app/assets/javascripts/jquery/active_scaffold_sortable.js
|
96
|
+
- app/assets/javascripts/jquery/active_scaffold_sortable.js~
|
97
|
+
- app/assets/javascripts/prototype/active_scaffold_sortable.js
|
98
|
+
- app/assets/javascripts/prototype/active_scaffold_sortable.js~
|
99
|
+
- app/views/active_scaffold_overrides/_form_association.html.erb
|
100
|
+
- app/views/active_scaffold_overrides/edit_associated.js.erb
|
101
|
+
- app/views/active_scaffold_overrides/_form_association.html.erb~
|
102
|
+
- app/views/active_scaffold_overrides/edit_associated.js.erb~
|
103
|
+
- frontends/default/active_scaffold_overrides/_list.html.erb
|
104
|
+
- frontends/default/active_scaffold_overrides/on_create.js.erb
|
105
|
+
- frontends/default/active_scaffold_overrides/on_update.js.erb
|
106
|
+
- frontends/default/active_scaffold_overrides/reorder.js.erb
|
107
|
+
- frontends/default/active_scaffold_overrides/on_create.js.erb~
|
108
|
+
- frontends/default/active_scaffold_overrides/on_update.js.erb~
|
95
109
|
- lib/active_scaffold/actions/sortable.rb
|
110
|
+
- lib/active_scaffold/actions/sortable.rb~
|
96
111
|
- lib/active_scaffold/config/sortable.rb
|
97
112
|
- lib/active_scaffold/helpers/sortable_helpers.rb
|
98
113
|
- lib/active_scaffold_sortable.rb
|
@@ -100,6 +115,8 @@ files:
|
|
100
115
|
- lib/active_scaffold_sortable/core.rb
|
101
116
|
- lib/active_scaffold_sortable/version.rb
|
102
117
|
- lib/active_scaffold_sortable/engine.rb
|
118
|
+
- lib/active_scaffold_sortable/view_helpers.rb
|
119
|
+
- lib/active_scaffold_sortable/view_helpers.rb~
|
103
120
|
- LICENSE.txt
|
104
121
|
- README.textile
|
105
122
|
- test/auto_models_controller_test.rb
|
@@ -141,7 +158,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
141
158
|
requirements: []
|
142
159
|
|
143
160
|
rubyforge_project:
|
144
|
-
rubygems_version: 1.8.
|
161
|
+
rubygems_version: 1.8.23
|
145
162
|
signing_key:
|
146
163
|
specification_version: 3
|
147
164
|
summary: Drag n Drop Sorting for Activescaffold
|
@@ -1,9 +0,0 @@
|
|
1
|
-
<%= render :super %>
|
2
|
-
<% if ActiveScaffold.js_framework == :prototype %>
|
3
|
-
<%= sortable_element *sort_params %>
|
4
|
-
<% elsif ActiveScaffold.js_framework == :jquery %>
|
5
|
-
<% reorder_params = {}
|
6
|
-
reorder_params[:eid] = params[:eid] unless params[:eid].blank?
|
7
|
-
options = {:update => true, :action => 'reorder'} %>
|
8
|
-
<%= javascript_tag "ActiveScaffold.sortable('#{sort_params[0]}', #{url_for(:controller => controller_name).to_json}, #{options.to_json}, #{reorder_params.to_json});" %>
|
9
|
-
<% end %>
|
@@ -1,16 +0,0 @@
|
|
1
|
-
<%= render(:super, :locals => {:insert_at => :bottom}) %>
|
2
|
-
<%
|
3
|
-
unless nested_singular_association?
|
4
|
-
if ActiveScaffold.js_framework == :prototype
|
5
|
-
%>
|
6
|
-
<%= sortable_element_js(*sort_params) %>
|
7
|
-
<%
|
8
|
-
elsif ActiveScaffold.js_framework == :jquery
|
9
|
-
reorder_params = {}
|
10
|
-
reorder_params[:eid] = params[:eid] unless params[:eid].blank?
|
11
|
-
%>
|
12
|
-
<%= "ActiveScaffold.sortable('#{sort_params[0]}', #{controller_name.to_json}, #{reorder_params.to_json});".html_safe %>
|
13
|
-
<%
|
14
|
-
end if controller.send :successful?
|
15
|
-
end
|
16
|
-
%>
|
@@ -1 +0,0 @@
|
|
1
|
-
ActiveScaffold.stripe('<%= active_scaffold_tbody_id %>');
|