active_scaffold_sortable 3.2.1 → 3.2.2

Sign up to get free protection for your applications and to get access to all the features.
@@ -23,14 +23,16 @@ ActiveScaffold.sortable = function(element) {
23
23
  ActiveScaffold.update_positions(content);
24
24
  };
25
25
  } else {
26
- var csrf = jQuery('meta[name=csrf-param]').attr('content') + '=' + jQuery('meta[name=csrf-token]').attr('content');
27
26
  var url = element.data('reorder-url');
28
- sortable_options.update = function(event, ui) {
29
- var body = jQuery(this).sortable('serialize',{key: encodeURIComponent(jQuery(this).attr('id') + '[]'), expression: new RegExp(element.data('format'))});
30
- var params = element.data('with');
31
- if (params) body += '&' + params;
32
- jQuery.post(url, body + '&' + csrf);
33
- };
27
+ if (url) {
28
+ var csrf = jQuery('meta[name=csrf-param]').attr('content') + '=' + jQuery('meta[name=csrf-token]').attr('content');
29
+ sortable_options.update = function(event, ui) {
30
+ var body = jQuery(this).sortable('serialize',{key: encodeURIComponent(jQuery(this).attr('id') + '[]'), expression: new RegExp(element.data('format'))});
31
+ var params = element.data('with');
32
+ if (params) body += '&' + params;
33
+ jQuery.post(url, body + '&' + csrf);
34
+ };
35
+ }
34
36
  }
35
37
  sortable_options.handle = element.data('handle');
36
38
  sortable_options.items = element.data('tag');
@@ -40,7 +42,7 @@ ActiveScaffold.sortable = function(element) {
40
42
  jQuery(document).ready(function($) {
41
43
  $(document).on('as:action_success', 'a.as_action', function(e, action_link) {
42
44
  var sortable = $('.sortable-container', action_link.adapter);
43
- if (sortable.length) $.each(sortable, function(i, s) { ActiveScaffold.sortable(s); });
45
+ if (sortable.length) $.each(sortable, function(i, s) { ActiveScaffold.sortable($(s)); });
44
46
  });
45
47
  var sortable = $('.sortable-container');
46
48
  if (sortable.length) ActiveScaffold.sortable(sortable);
@@ -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.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 => '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_position('<%= sub_form_list_id(:association => @column.name) %>');
5
+ ActiveScaffold.sortable('<%= sub_form_list_id(:association => @column.name) %>');
6
+ <% end %>
@@ -0,0 +1,4 @@
1
+ <%= render(:super, :locals => {:insert_at => :bottom}) %>
2
+ <% if controller.send(:successful?) && !nested_singular_association? %>
3
+ ActiveScaffold.sortable('<%= active_scaffold_tbody_id %>'); %>
4
+ <% end %>
@@ -0,0 +1,17 @@
1
+ <%= render(:super) %>
2
+ <%
3
+ # if we are currently editing a nested belongs_to association do not do any sorting stuff
4
+ unless nested_singular_association?
5
+ if ActiveScaffold.js_framework == :prototype
6
+ %>
7
+ <%= sortable_element_js(*sort_params) %>
8
+ <%
9
+ elsif ActiveScaffold.js_framework == :jquery
10
+ reorder_params = {}
11
+ reorder_params[:eid] = params[:eid] unless params[:eid].blank?
12
+ %>
13
+ <%= "ActiveScaffold.sortable('#{sort_params[0]}', #{controller_name.to_json}, #{reorder_params.to_json});".html_safe %>
14
+ <%
15
+ end if controller.send :successful?
16
+ end
17
+ %>
@@ -4,12 +4,12 @@ module ActiveScaffold::Actions
4
4
  base.helper ActiveScaffold::Helpers::SortableHelpers
5
5
  base.before_filter :sortable_authorized?, :only => :reorder
6
6
  base.active_scaffold_config.configure do |config|
7
- config.list.pagination = false
7
+ config.list.pagination = false if config.actions.include? :list
8
8
 
9
9
  # turn sorting off
10
10
  sortable_column = config.sortable.column.name
11
11
  config.columns.each {|c| c.sort = false unless c.name == sortable_column }
12
- config.list.sorting = { sortable_column => "asc" }
12
+ config.list.sorting = { sortable_column => "asc" } if config.actions.include? :list
13
13
 
14
14
  config.actions.each do |action_name|
15
15
  next if action_name == :subform
@@ -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
@@ -50,11 +50,13 @@ module ActiveScaffold::Config
50
50
  raise(ArgumentError, "Unknown handle column position: #{where}") unless [:first, :last].include?(where)
51
51
  @options[:handle] = 'td.sortable-handle'
52
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
53
+ @column.weight = 2**(0.size * 8 -2) -1 unless where == :first
54
+ if @core.actions.include? :list
55
+ if where == :first
56
+ @core.list.columns = [:active_scaffold_sortable] + @core.list.columns.names_without_auth_check unless @core.list.columns.include? :active_scaffold_sortable
57
+ else
58
+ @core.list.columns.add :active_scaffold_sortable
59
+ end
58
60
  end
59
61
  else
60
62
  @options.delete(:handle)
@@ -2,7 +2,7 @@ module ActiveScaffoldSortable
2
2
  module Version
3
3
  MAJOR = 3
4
4
  MINOR = 2
5
- PATCH = 1
5
+ PATCH = 2
6
6
 
7
7
  STRING = [MAJOR, MINOR, PATCH].compact.join('.')
8
8
  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: 13
4
+ hash: 11
5
5
  prerelease:
6
6
  segments:
7
7
  - 3
8
8
  - 2
9
- - 1
10
- version: 3.2.1
9
+ - 2
10
+ version: 3.2.2
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: 2013-01-16 00:00:00 Z
19
+ date: 2013-03-08 00:00:00 Z
20
20
  dependencies:
21
21
  - !ruby/object:Gem::Dependency
22
- version_requirements: &id001 !ruby/object:Gem::Requirement
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"
32
+ version_requirements: *id001
31
33
  prerelease: false
32
- type: :development
33
- requirement: *id001
34
34
  name: shoulda
35
35
  - !ruby/object:Gem::Dependency
36
- version_requirements: &id002 !ruby/object:Gem::Requirement
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
48
+ version_requirements: *id002
47
49
  prerelease: false
48
- type: :development
49
- requirement: *id002
50
50
  name: bundler
51
51
  - !ruby/object:Gem::Dependency
52
- version_requirements: &id003 !ruby/object:Gem::Requirement
52
+ type: :development
53
+ requirement: &id003 !ruby/object:Gem::Requirement
53
54
  none: false
54
55
  requirements:
55
56
  - - ">="
@@ -58,26 +59,26 @@ dependencies:
58
59
  segments:
59
60
  - 0
60
61
  version: "0"
62
+ version_requirements: *id003
61
63
  prerelease: false
62
- type: :development
63
- requirement: *id003
64
64
  name: rcov
65
65
  - !ruby/object:Gem::Dependency
66
- version_requirements: &id004 !ruby/object:Gem::Requirement
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: 2064438024
72
+ hash: 2371454695
72
73
  segments:
73
74
  - 3
74
75
  - 3
75
76
  - 0
76
77
  - rc
77
- version: 3.3.0.rc
78
+ - 3
79
+ version: 3.3.0.rc3
80
+ version_requirements: *id004
78
81
  prerelease: false
79
- type: :runtime
80
- requirement: *id004
81
82
  name: active_scaffold
82
83
  description: Sort Tree or List Structures by Drag n Drop
83
84
  email: activescaffold@googlegroups.com
@@ -89,38 +90,46 @@ extra_rdoc_files:
89
90
  - LICENSE.txt
90
91
  - README.textile
91
92
  files:
92
- - app/views/active_scaffold_overrides/_form_association.html.erb
93
- - app/views/active_scaffold_overrides/edit_associated.js.erb
94
- - app/assets/images/active_scaffold/sortable.png
95
93
  - app/assets/stylesheets/active_scaffold_sortable.css.scss
96
- - app/assets/javascripts/prototype/active_scaffold_sortable.js
94
+ - app/assets/images/active_scaffold/sortable.png
97
95
  - app/assets/javascripts/active_scaffold_sortable.js.erb
98
96
  - app/assets/javascripts/jquery/active_scaffold_sortable.js
99
- - frontends/default/active_scaffold_overrides/on_create.js.erb
97
+ - app/assets/javascripts/jquery/active_scaffold_sortable.js~
98
+ - app/assets/javascripts/prototype/active_scaffold_sortable.js
99
+ - app/assets/javascripts/prototype/active_scaffold_sortable.js~
100
+ - app/views/active_scaffold_overrides/_form_association.html.erb
101
+ - app/views/active_scaffold_overrides/edit_associated.js.erb
102
+ - app/views/active_scaffold_overrides/_form_association.html.erb~
103
+ - app/views/active_scaffold_overrides/edit_associated.js.erb~
100
104
  - frontends/default/active_scaffold_overrides/_list.html.erb
105
+ - frontends/default/active_scaffold_overrides/on_create.js.erb
101
106
  - frontends/default/active_scaffold_overrides/on_update.js.erb
102
107
  - frontends/default/active_scaffold_overrides/reorder.js.erb
108
+ - frontends/default/active_scaffold_overrides/on_create.js.erb~
109
+ - frontends/default/active_scaffold_overrides/on_update.js.erb~
103
110
  - lib/active_scaffold/actions/sortable.rb
111
+ - lib/active_scaffold/actions/sortable.rb~
104
112
  - lib/active_scaffold/config/sortable.rb
105
113
  - lib/active_scaffold/helpers/sortable_helpers.rb
106
- - lib/active_scaffold_sortable/engine.rb
107
- - lib/active_scaffold_sortable/core.rb
108
- - lib/active_scaffold_sortable/view_helpers.rb
114
+ - lib/active_scaffold_sortable.rb
109
115
  - lib/active_scaffold_sortable/config/core.rb
116
+ - lib/active_scaffold_sortable/core.rb
110
117
  - lib/active_scaffold_sortable/version.rb
111
- - lib/active_scaffold_sortable.rb
118
+ - lib/active_scaffold_sortable/engine.rb
119
+ - lib/active_scaffold_sortable/view_helpers.rb
120
+ - lib/active_scaffold_sortable/view_helpers.rb~
112
121
  - LICENSE.txt
113
122
  - README.textile
114
- - test/router_test.rb
123
+ - test/auto_models_controller_test.rb
124
+ - test/config_test.rb
125
+ - test/controllers/auto_models_controller.rb
126
+ - test/controllers/models_controller.rb
127
+ - test/controllers/sortable_models_controller.rb
115
128
  - test/models/auto_model.rb
116
129
  - test/models/model.rb
130
+ - test/router_test.rb
117
131
  - test/schema.rb
118
132
  - test/test_helper.rb
119
- - test/controllers/auto_models_controller.rb
120
- - test/controllers/models_controller.rb
121
- - test/controllers/sortable_models_controller.rb
122
- - test/auto_models_controller_test.rb
123
- - test/config_test.rb
124
133
  homepage: http://github.com/activescaffold/active_scaffold_sortable
125
134
  licenses:
126
135
  - MIT
@@ -150,18 +159,18 @@ required_rubygems_version: !ruby/object:Gem::Requirement
150
159
  requirements: []
151
160
 
152
161
  rubyforge_project:
153
- rubygems_version: 1.8.19
162
+ rubygems_version: 1.8.23
154
163
  signing_key:
155
164
  specification_version: 3
156
165
  summary: Drag n Drop Sorting for Activescaffold
157
166
  test_files:
158
- - test/router_test.rb
167
+ - test/auto_models_controller_test.rb
168
+ - test/config_test.rb
169
+ - test/controllers/auto_models_controller.rb
170
+ - test/controllers/models_controller.rb
171
+ - test/controllers/sortable_models_controller.rb
159
172
  - test/models/auto_model.rb
160
173
  - test/models/model.rb
174
+ - test/router_test.rb
161
175
  - test/schema.rb
162
176
  - test/test_helper.rb
163
- - test/controllers/auto_models_controller.rb
164
- - test/controllers/models_controller.rb
165
- - test/controllers/sortable_models_controller.rb
166
- - test/auto_models_controller_test.rb
167
- - test/config_test.rb