##// END OF EJS Templates
Adds a textual css class for issue priorities (#12216)....
Jean-Philippe Lang -
r10508:113f8b5cf278
parent child
Show More
@@ -0,0 +1,9
1 class AddEnumerationsPositionName < ActiveRecord::Migration
2 def up
3 add_column :enumerations, :position_name, :string, :limit => 30
4 end
5
6 def down
7 remove_column :enumerations, :position_name
8 end
9 end
@@ -0,0 +1,9
1 class PopulateEnumerationsPositionName < ActiveRecord::Migration
2 def up
3 IssuePriority.compute_position_names
4 end
5
6 def down
7 IssuePriority.clear_position_names
8 end
9 end
@@ -906,7 +906,7 class Issue < ActiveRecord::Base
906
906
907 # Returns a string of css classes that apply to the issue
907 # Returns a string of css classes that apply to the issue
908 def css_classes
908 def css_classes
909 s = "issue status-#{status_id} priority-#{priority_id}"
909 s = "issue status-#{status_id} #{priority.try(:css_classes)}"
910 s << ' closed' if closed?
910 s << ' closed' if closed?
911 s << ' overdue' if overdue?
911 s << ' overdue' if overdue?
912 s << ' child' if child?
912 s << ' child' if child?
@@ -18,6 +18,9
18 class IssuePriority < Enumeration
18 class IssuePriority < Enumeration
19 has_many :issues, :foreign_key => 'priority_id'
19 has_many :issues, :foreign_key => 'priority_id'
20
20
21 after_destroy {|priority| priority.class.compute_position_names}
22 after_save {|priority| priority.class.compute_position_names if priority.position_changed? && priority.position}
23
21 OptionName = :enumeration_issue_priorities
24 OptionName = :enumeration_issue_priorities
22
25
23 def option_name
26 def option_name
@@ -31,4 +34,35 class IssuePriority < Enumeration
31 def transfer_relations(to)
34 def transfer_relations(to)
32 issues.update_all("priority_id = #{to.id}")
35 issues.update_all("priority_id = #{to.id}")
33 end
36 end
37
38 def css_classes
39 "priority-#{id} priority-#{position_name}"
40 end
41
42 # Clears position_name for all priorities
43 # Called from migration 20121026003537_populate_enumerations_position_name
44 def self.clear_position_names
45 update_all :position_name => nil
46 end
47
48 # Updates position_name for active priorities
49 # Called from migration 20121026003537_populate_enumerations_position_name
50 def self.compute_position_names
51 priorities = where(:active => true).all.sort_by(&:position)
52 if priorities.any?
53 default = priorities.detect(&:is_default?) || priorities[(priorities.size - 1) / 2]
54 priorities.each_with_index do |priority, index|
55 name = case
56 when priority.position == default.position
57 "default"
58 when priority.position < default.position
59 index == 0 ? "lowest" : "low#{index+1}"
60 else
61 index == (priorities.size - 1) ? "highest" : "high#{priorities.size - index}"
62 end
63
64 update_all({:position_name => name}, :id => priority.id)
65 end
66 end
67 end
34 end
68 end
@@ -23,6 +23,7 enumerations_004:
23 type: IssuePriority
23 type: IssuePriority
24 active: true
24 active: true
25 position: 1
25 position: 1
26 position_name: lowest
26 enumerations_005:
27 enumerations_005:
27 name: Normal
28 name: Normal
28 id: 5
29 id: 5
@@ -30,24 +31,28 enumerations_005:
30 is_default: true
31 is_default: true
31 active: true
32 active: true
32 position: 2
33 position: 2
34 position_name: default
33 enumerations_006:
35 enumerations_006:
34 name: High
36 name: High
35 id: 6
37 id: 6
36 type: IssuePriority
38 type: IssuePriority
37 active: true
39 active: true
38 position: 3
40 position: 3
41 position_name: high3
39 enumerations_007:
42 enumerations_007:
40 name: Urgent
43 name: Urgent
41 id: 7
44 id: 7
42 type: IssuePriority
45 type: IssuePriority
43 active: true
46 active: true
44 position: 4
47 position: 4
48 position_name: high2
45 enumerations_008:
49 enumerations_008:
46 name: Immediate
50 name: Immediate
47 id: 8
51 id: 8
48 type: IssuePriority
52 type: IssuePriority
49 active: true
53 active: true
50 position: 5
54 position: 5
55 position_name: highest
51 enumerations_009:
56 enumerations_009:
52 name: Design
57 name: Design
53 id: 9
58 id: 9
@@ -73,4 +73,34 class IssuePriorityTest < ActiveSupport::TestCase
73 priority.expects(:reset_positions_in_list).once
73 priority.expects(:reset_positions_in_list).once
74 priority.move_to = 'higher'
74 priority.move_to = 'higher'
75 end
75 end
76
77 def test_clear_position_names_should_set_position_names_to_nil
78 IssuePriority.clear_position_names
79 assert IssuePriority.all.all? {|priority| priority.position_name.nil?}
80 end
81
82 def test_compute_position_names_with_default_priority
83 IssuePriority.clear_position_names
84
85 IssuePriority.compute_position_names
86 assert_equal %w(lowest default high3 high2 highest), IssuePriority.active.all.sort.map(&:position_name)
87 end
88
89 def test_compute_position_names_without_default_priority_should_split_priorities
90 IssuePriority.clear_position_names
91 IssuePriority.update_all :is_default => false
92
93 IssuePriority.compute_position_names
94 assert_equal %w(lowest low2 default high2 highest), IssuePriority.active.all.sort.map(&:position_name)
95 end
96
97 def test_adding_a_priority_should_update_position_names
98 priority = IssuePriority.create!(:name => 'New')
99 assert_equal %w(lowest default high4 high3 high2 highest), IssuePriority.active.all.sort.map(&:position_name)
100 end
101
102 def test_destroying_a_priority_should_update_position_names
103 IssuePriority.find_by_position_name('highest').destroy
104 assert_equal %w(lowest default high2 highest), IssuePriority.active.all.sort.map(&:position_name)
105 end
76 end
106 end
@@ -1821,4 +1821,11 class IssueTest < ActiveSupport::TestCase
1821 def test_journals_after_with_blank_arg_should_return_all_journals
1821 def test_journals_after_with_blank_arg_should_return_all_journals
1822 assert_equal [Journal.find(1), Journal.find(2)], Issue.find(1).journals_after('')
1822 assert_equal [Journal.find(1), Journal.find(2)], Issue.find(1).journals_after('')
1823 end
1823 end
1824
1825 def test_css_classes_should_include_priority
1826 issue = Issue.new(:priority => IssuePriority.find(8))
1827 classes = issue.css_classes.split(' ')
1828 assert_include 'priority-8', classes
1829 assert_include 'priority-highest', classes
1830 end
1824 end
1831 end
General Comments 0
You need to be logged in to leave comments. Login now