nested_set 1.5.3 → 1.5.4

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/README.rdoc CHANGED
@@ -62,6 +62,13 @@ Example usage:
62
62
 
63
63
  <%= select_tag 'parent_id', options_for_select(nested_set_options(Category) {|i| "#{'-' * i.level} #{i.name}" } ) %>
64
64
 
65
+ or sorted select:
66
+
67
+ <%= f.select :parent_id, sorted_nested_set_options(Category, lambda(&:name)) {|i| "#{'-' * i.level} #{i.name}" } %>
68
+
69
+ <% sort_method = lambda{|x, y| x.name.downcase <=> y.name.downcase} %>
70
+ <%= select_tag 'parent_id', options_for_select(sorted_nested_set_options(Category, sort_method){|i| "#{'-' * i.level} #{i.name}" } ) %>
71
+
65
72
  See CollectiveIdea::Acts::NestedSet::Helper for more information about the helpers.
66
73
 
67
74
  == References
data/VERSION CHANGED
@@ -1 +1 @@
1
- 1.5.3
1
+ 1.5.4
@@ -17,8 +17,8 @@ module CollectiveIdea #:nodoc:
17
17
  #
18
18
  # == Usage
19
19
  #
20
- # <%= f.select :parent_id, nested_set_options(Category, @category) {|i|
21
- # "#{'–' * i.level} #{i.name}"
20
+ # <%= f.select :parent_id, nested_set_options(Category, @category) {|i, level|
21
+ # "#{'–' * level} #{i.name}"
22
22
  # }) %>
23
23
  #
24
24
  def nested_set_options(class_or_item, mover = nil)
@@ -41,6 +41,55 @@ module CollectiveIdea #:nodoc:
41
41
  end
42
42
  result
43
43
  end
44
+
45
+ # Returns options for select.
46
+ # You can sort node's child by any method
47
+ # You can exclude some items from the tree.
48
+ # You can pass a block receiving an item and returning the string displayed in the select.
49
+ #
50
+ # == Params
51
+ # * +class_or_item+ - Class name or top level times
52
+ # * +sort_proc+ sorting proc for node's child, ex. lambda{|x| x.name}
53
+ # * +mover+ - The item that is being move, used to exlude impossible moves
54
+ # * +level+ - start level, :default => 0
55
+ # * +&block+ - a block that will be used to display: { |itemi, level| "#{'–' * level} #{i.name}" }
56
+ # == Usage
57
+ #
58
+ # <%= f.select :parent_id, sorted_nested_set_options(Category, lambda(&:name)) {|i, level|
59
+ # "#{'–' * level} #{i.name}"
60
+ # }) %>
61
+ #
62
+ # OR
63
+ #
64
+ # sort_method = lambda{|x,y| x.name.downcase <=> y.name.downcase}
65
+ #
66
+ # <%= f.select :parent_id, nested_set_options(Category, sort_method) {|i, level|
67
+ # "#{'–' * level} #{i.name}"
68
+ # }) %>
69
+ #
70
+ def sorted_nested_set_options(class_or_item, sort_proc, mover = nil, level = 0)
71
+ class_or_item = class_or_item.roots if class_or_item.is_a?(Class)
72
+ items = Array(class_or_item)
73
+ result = []
74
+ items.sort_by(&sort_proc).each do |root|
75
+ set = root.self_and_descendants
76
+ result += build_node(set[0], set, sort_proc, mover, level){|x, level| yield(x, level)}
77
+ end
78
+ result
79
+ end
80
+
81
+ def build_node(node, set, sort_proc, mover = nil, level = nil)
82
+ result ||= []
83
+ if mover.nil? || mover.new_record? || mover.move_possible?(i)
84
+ result << [yield(node, level), node.id]
85
+ unless node.leaf?
86
+ set.select{|i| i.parent_id == node.id}.sort_by(&sort_proc).map{ |i|
87
+ result.push(*build_node(i, set, sort_proc, mover, level.to_i + 1){|x, level| yield(x, level)})
88
+ }
89
+ end
90
+ end
91
+ result
92
+ end
44
93
  end
45
94
  end
46
95
  end
data/nested_set.gemspec CHANGED
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{nested_set}
8
- s.version = "1.5.3"
8
+ s.version = "1.5.4"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Brandon Keepers", "Daniel Morrison"]
12
- s.date = %q{2010-11-10}
12
+ s.date = %q{2010-11-12}
13
13
  s.description = %q{An awesome nested set implementation for Active Record}
14
14
  s.email = %q{info@collectiveidea.com}
15
15
  s.extra_rdoc_files = [
@@ -35,6 +35,42 @@ module CollectiveIdea
35
35
  assert_equal expected, actual
36
36
  end
37
37
 
38
+ def test_build_node
39
+ set = categories(:top_level).self_and_descendants
40
+ expected = set.map{|i| [i.name, i.id]}
41
+ actual = build_node(set[0], set, lambda(&:lft)){|i, level| i.name }
42
+ assert_equal expected, actual
43
+ end
44
+
45
+ def test_build_node_with_back_id_order
46
+ set = categories(:top_level).self_and_descendants
47
+ expected = [
48
+ ["Top Level", 1],
49
+ ["Child 3", 5],
50
+ ["Child 2", 3],
51
+ ["Child 2.1", 4],
52
+ ["Child 1", 2]
53
+ ]
54
+ actual = build_node(set[0], set, lambda{|x| -x.id}){|i, level| i.name }
55
+ assert_equal expected, actual
56
+ end
57
+
58
+ def test_sorted_nested_set
59
+ expected = [
60
+ [" Top Level 2", 6],
61
+ [" Top Level", 1],
62
+ ['- Child 3', 5],
63
+ ['- Child 2', 3],
64
+ ['-- Child 2.1', 4],
65
+ ["- Child 1", 2]
66
+ ]
67
+
68
+ actual = sorted_nested_set_options(Category, lambda{|x| -x.id}) do |c, level|
69
+ "#{'-' * level} #{c.name}"
70
+ end
71
+ assert_equal expected, actual
72
+ end
73
+
38
74
  end
39
75
  end
40
76
  end
metadata CHANGED
@@ -5,8 +5,8 @@ version: !ruby/object:Gem::Version
5
5
  segments:
6
6
  - 1
7
7
  - 5
8
- - 3
9
- version: 1.5.3
8
+ - 4
9
+ version: 1.5.4
10
10
  platform: ruby
11
11
  authors:
12
12
  - Brandon Keepers
@@ -15,7 +15,7 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2010-11-10 00:00:00 +03:00
18
+ date: 2010-11-12 00:00:00 +03:00
19
19
  default_executable:
20
20
  dependencies:
21
21
  - !ruby/object:Gem::Dependency