active_scaffold_sortable 3.2.1 → 3.2.2

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