##// END OF EJS Templates
Highlight changes inside diff lines (#7139)....
Jean-Philippe Lang -
r4974:21c79827ff73
parent child
Show More
@@ -0,0 +1,46
1 --- partials.txt Wed Jan 19 12:06:17 2011
2 +++ partials.1.txt Wed Jan 19 12:06:10 2011
3 @@ -1,31 +1,31 @@
4 -Lorem ipsum dolor sit amet, consectetur adipiscing elit
5 +Lorem ipsum dolor sit amet, consectetur adipiscing xx
6 Praesent et sagittis dui. Vivamus ac diam diam
7 -Ut sed auctor justo
8 +xxx auctor justo
9 Suspendisse venenatis sollicitudin magna quis suscipit
10 -Sed blandit gravida odio ac ultrices
11 +Sed blandit gxxxxa odio ac ultrices
12 Morbi rhoncus est ut est aliquam tempus
13 -Morbi id nisi vel felis tincidunt tempus
14 +Morbi id nisi vel felis xx tempus
15 Mauris auctor sagittis ante eu luctus
16 -Fusce commodo felis sed ligula congue molestie
17 +Fusce commodo felis sed ligula congue
18 Lorem ipsum dolor sit amet, consectetur adipiscing elit
19 -Praesent et sagittis dui. Vivamus ac diam diam
20 +et sagittis dui. Vivamus ac diam diam
21 Ut sed auctor justo
22 Suspendisse venenatis sollicitudin magna quis suscipit
23 Sed blandit gravida odio ac ultrices
24
25 -Lorem ipsum dolor sit amet, consectetur adipiscing elit
26 -Praesent et sagittis dui. Vivamus ac diam diam
27 +Lorem ipsum dolor sit amet, xxxx adipiscing elit
28 Ut sed auctor justo
29 Suspendisse venenatis sollicitudin magna quis suscipit
30 Sed blandit gravida odio ac ultrices
31 -Morbi rhoncus est ut est aliquam tempus
32 +Morbi rhoncus est ut est xxxx tempus
33 +New line
34 Morbi id nisi vel felis tincidunt tempus
35 Mauris auctor sagittis ante eu luctus
36 Fusce commodo felis sed ligula congue molestie
37
38 -Lorem ipsum dolor sit amet, consectetur adipiscing elit
39 -Praesent et sagittis dui. Vivamus ac diam diam
40 -Ut sed auctor justo
41 +Lorem ipsum dolor sit amet, xxxxtetur adipiscing elit
42 +Praesent et xxxxx. Vivamus ac diam diam
43 +Ut sed auctor
44 Suspendisse venenatis sollicitudin magna quis suscipit
45 Sed blandit gravida odio ac ultrices
46 Morbi rhoncus est ut est aliquam tempus
@@ -1,67 +1,57
1 <% diff = Redmine::UnifiedDiff.new(diff, :type => diff_type, :max_lines => Setting.diff_max_lines_displayed.to_i) -%>
1 <% diff = Redmine::UnifiedDiff.new(diff, :type => diff_type, :max_lines => Setting.diff_max_lines_displayed.to_i) -%>
2
2 <% diff.each do |table_file| -%>
3 <% diff.each do |table_file| -%>
3 <div class="autoscroll">
4 <div class="autoscroll">
4 <% if diff_type == 'sbs' -%>
5 <% if diff.diff_type == 'sbs' -%>
5 <table class="filecontent">
6 <table class="filecontent">
6 <thead>
7 <thead>
7 <tr><th colspan="4" class="filename"><%=to_utf8 table_file.file_name %></th></tr>
8 <tr><th colspan="4" class="filename"><%=to_utf8 table_file.file_name %></th></tr>
8 </thead>
9 </thead>
9 <tbody>
10 <tbody>
10 <% prev_line_left, prev_line_right = nil, nil -%>
11 <% table_file.each_line do |spacing, line| -%>
11 <% table_file.keys.sort.each do |key| -%>
12 <% if spacing -%>
12 <% if prev_line_left && prev_line_right && (table_file[key].nb_line_left != prev_line_left+1) && (table_file[key].nb_line_right != prev_line_right+1) -%>
13 <tr class="spacing">
13 <tr class="spacing">
14 <th class="line-num">...</th><td></td><th class="line-num">...</th><td></td>
14 <th class="line-num">...</th><td></td><th class="line-num">...</th><td></td>
15 </tr>
15 <% end -%>
16 <% end -%>
16 <tr>
17 <tr>
17 <th class="line-num"><%= table_file[key].nb_line_left %></th>
18 <th class="line-num"><%= line.nb_line_left %></th>
18 <td class="line-code <%= table_file[key].type_diff_left %>">
19 <td class="line-code <%= line.type_diff_left %>">
19 <pre><%=to_utf8 table_file[key].line_left %></pre>
20 <pre><%=to_utf8 line.html_line_left %></pre>
20 </td>
21 </td>
21 <th class="line-num"><%= table_file[key].nb_line_right %></th>
22 <th class="line-num"><%= line.nb_line_right %></th>
22 <td class="line-code <%= table_file[key].type_diff_right %>">
23 <td class="line-code <%= line.type_diff_right %>">
23 <pre><%=to_utf8 table_file[key].line_right %></pre>
24 <pre><%=to_utf8 line.html_line_right %></pre>
24 </td>
25 </td>
25 </tr>
26 </tr>
26 <% prev_line_left, prev_line_right = table_file[key].nb_line_left.to_i, table_file[key].nb_line_right.to_i -%>
27 <% end -%>
27 <% end -%>
28 </tbody>
28 </tbody>
29 </table>
29 </table>
30
30
31 <% else -%>
31 <% else -%>
32 <table class="filecontent syntaxhl">
32 <table class="filecontent">
33 <thead>
33 <thead>
34 <tr><th colspan="3" class="filename"><%=to_utf8 table_file.file_name %></th></tr>
34 <tr><th colspan="3" class="filename"><%=to_utf8 table_file.file_name %></th></tr>
35 </thead>
35 </thead>
36 <tbody>
36 <tbody>
37 <% prev_line_left, prev_line_right = nil, nil -%>
37 <% table_file.each_line do |spacing, line| %>
38 <% table_file.keys.sort.each do |key, line| %>
38 <% if spacing -%>
39 <% if prev_line_left && prev_line_right && (table_file[key].nb_line_left != prev_line_left+1) && (table_file[key].nb_line_right != prev_line_right+1) -%>
40 <tr class="spacing">
39 <tr class="spacing">
41 <th class="line-num">...</th><th class="line-num">...</th><td></td>
40 <th class="line-num">...</th><th class="line-num">...</th><td></td>
42 </tr>
41 </tr>
43 <% end -%>
42 <% end -%>
44 <tr>
43 <tr>
45 <th class="line-num"><%= table_file[key].nb_line_left %></th>
44 <th class="line-num"><%= line.nb_line_left %></th>
46 <th class="line-num"><%= table_file[key].nb_line_right %></th>
45 <th class="line-num"><%= line.nb_line_right %></th>
47 <% if table_file[key].line_left.empty? -%>
46 <td class="line-code <%= line.type_diff %>">
48 <td class="line-code <%= table_file[key].type_diff_right %>">
47 <pre><%=to_utf8 line.html_line %></pre>
49 <pre><%=to_utf8 table_file[key].line_right %></pre>
50 </td>
48 </td>
51 <% else -%>
52 <td class="line-code <%= table_file[key].type_diff_left %>">
53 <pre><%=to_utf8 table_file[key].line_left %></pre>
54 </td>
55 <% end -%>
56 </tr>
49 </tr>
57 <% prev_line_left = table_file[key].nb_line_left.to_i if table_file[key].nb_line_left.to_i > 0 -%>
58 <% prev_line_right = table_file[key].nb_line_right.to_i if table_file[key].nb_line_right.to_i > 0 -%>
59 <% end -%>
50 <% end -%>
60 </tbody>
51 </tbody>
61 </table>
52 </table>
62 <% end -%>
53 <% end -%>
63
64 </div>
54 </div>
65 <% end -%>
55 <% end -%>
66
56
67 <%= l(:text_diff_truncated) if diff.truncated? %>
57 <%= l(:text_diff_truncated) if diff.truncated? %>
@@ -1,198 +1,258
1 # redMine - project management software
1 # Redmine - project management software
2 # Copyright (C) 2006-2008 Jean-Philippe Lang
2 # Copyright (C) 2006-2011 Jean-Philippe Lang
3 #
3 #
4 # This program is free software; you can redistribute it and/or
4 # This program is free software; you can redistribute it and/or
5 # modify it under the terms of the GNU General Public License
5 # modify it under the terms of the GNU General Public License
6 # as published by the Free Software Foundation; either version 2
6 # as published by the Free Software Foundation; either version 2
7 # of the License, or (at your option) any later version.
7 # of the License, or (at your option) any later version.
8 #
8 #
9 # This program is distributed in the hope that it will be useful,
9 # This program is distributed in the hope that it will be useful,
10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 # GNU General Public License for more details.
12 # GNU General Public License for more details.
13 #
13 #
14 # You should have received a copy of the GNU General Public License
14 # You should have received a copy of the GNU General Public License
15 # along with this program; if not, write to the Free Software
15 # along with this program; if not, write to the Free Software
16 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
16 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
17
17
18 module Redmine
18 module Redmine
19 # Class used to parse unified diffs
19 # Class used to parse unified diffs
20 class UnifiedDiff < Array
20 class UnifiedDiff < Array
21 attr_reader :diff_type
22
21 def initialize(diff, options={})
23 def initialize(diff, options={})
22 options.assert_valid_keys(:type, :max_lines)
24 options.assert_valid_keys(:type, :max_lines)
23 diff = diff.split("\n") if diff.is_a?(String)
25 diff = diff.split("\n") if diff.is_a?(String)
24 diff_type = options[:type] || 'inline'
26 @diff_type = options[:type] || 'inline'
25 lines = 0
27 lines = 0
26 @truncated = false
28 @truncated = false
27 diff_table = DiffTable.new(diff_type)
29 diff_table = DiffTable.new(@diff_type)
28 diff.each do |line|
30 diff.each do |line|
29 line_encoding = nil
31 line_encoding = nil
30 if line.respond_to?(:force_encoding)
32 if line.respond_to?(:force_encoding)
31 line_encoding = line.encoding
33 line_encoding = line.encoding
32 # TODO: UTF-16 and Japanese CP932 which is imcompatible with ASCII
34 # TODO: UTF-16 and Japanese CP932 which is imcompatible with ASCII
33 # In Japan, diffrence between file path encoding
35 # In Japan, diffrence between file path encoding
34 # and file contents encoding is popular.
36 # and file contents encoding is popular.
35 line.force_encoding('ASCII-8BIT')
37 line.force_encoding('ASCII-8BIT')
36 end
38 end
37 unless diff_table.add_line line
39 unless diff_table.add_line line
38 line.force_encoding(line_encoding) if line_encoding
40 line.force_encoding(line_encoding) if line_encoding
39 self << diff_table if diff_table.length > 0
41 self << diff_table if diff_table.length > 0
40 diff_table = DiffTable.new(diff_type)
42 diff_table = DiffTable.new(diff_type)
41 end
43 end
42 lines += 1
44 lines += 1
43 if options[:max_lines] && lines > options[:max_lines]
45 if options[:max_lines] && lines > options[:max_lines]
44 @truncated = true
46 @truncated = true
45 break
47 break
46 end
48 end
47 end
49 end
48 self << diff_table unless diff_table.empty?
50 self << diff_table unless diff_table.empty?
49 self
51 self
50 end
52 end
51
53
52 def truncated?; @truncated; end
54 def truncated?; @truncated; end
53 end
55 end
54
56
55 # Class that represents a file diff
57 # Class that represents a file diff
56 class DiffTable < Hash
58 class DiffTable < Array
57 attr_reader :file_name, :line_num_l, :line_num_r
59 attr_reader :file_name
58
60
59 # Initialize with a Diff file and the type of Diff View
61 # Initialize with a Diff file and the type of Diff View
60 # The type view must be inline or sbs (side_by_side)
62 # The type view must be inline or sbs (side_by_side)
61 def initialize(type="inline")
63 def initialize(type="inline")
62 @parsing = false
64 @parsing = false
63 @nb_line = 1
65 @added = 0
64 @start = false
66 @removed = 0
65 @before = 'same'
66 @second = true
67 @type = type
67 @type = type
68 end
68 end
69
69
70 # Function for add a line of this Diff
70 # Function for add a line of this Diff
71 # Returns false when the diff ends
71 # Returns false when the diff ends
72 def add_line(line)
72 def add_line(line)
73 unless @parsing
73 unless @parsing
74 if line =~ /^(---|\+\+\+) (.*)$/
74 if line =~ /^(---|\+\+\+) (.*)$/
75 @file_name = $2
75 @file_name = $2
76 elsif line =~ /^@@ (\+|\-)(\d+)(,\d+)? (\+|\-)(\d+)(,\d+)? @@/
76 elsif line =~ /^@@ (\+|\-)(\d+)(,\d+)? (\+|\-)(\d+)(,\d+)? @@/
77 @line_num_l = $2.to_i
77 @line_num_l = $2.to_i
78 @line_num_r = $5.to_i
78 @line_num_r = $5.to_i
79 @parsing = true
79 @parsing = true
80 end
80 end
81 else
81 else
82 if line =~ /^[^\+\-\s@\\]/
82 if line =~ /^[^\+\-\s@\\]/
83 @parsing = false
83 @parsing = false
84 return false
84 return false
85 elsif line =~ /^@@ (\+|\-)(\d+)(,\d+)? (\+|\-)(\d+)(,\d+)? @@/
85 elsif line =~ /^@@ (\+|\-)(\d+)(,\d+)? (\+|\-)(\d+)(,\d+)? @@/
86 @line_num_l = $2.to_i
86 @line_num_l = $2.to_i
87 @line_num_r = $5.to_i
87 @line_num_r = $5.to_i
88 else
88 else
89 @nb_line += 1 if parse_line(line, @type)
89 parse_line(line, @type)
90 end
90 end
91 end
91 end
92 return true
92 return true
93 end
93 end
94
95 def each_line
96 prev_line_left, prev_line_right = nil, nil
97 each do |line|
98 spacing = prev_line_left && prev_line_right && (line.nb_line_left != prev_line_left+1) && (line.nb_line_right != prev_line_right+1)
99 yield spacing, line
100 prev_line_left = line.nb_line_left.to_i if line.nb_line_left.to_i > 0
101 prev_line_right = line.nb_line_right.to_i if line.nb_line_right.to_i > 0
102 end
103 end
94
104
95 def inspect
105 def inspect
96 puts '### DIFF TABLE ###'
106 puts '### DIFF TABLE ###'
97 puts "file : #{file_name}"
107 puts "file : #{file_name}"
98 self.each do |d|
108 self.each do |d|
99 d.inspect
109 d.inspect
100 end
110 end
101 end
111 end
102
112
103 private
113 private
104 # Test if is a Side By Side type
105 def sbs?(type, func)
106 if @start and type == "sbs"
107 if @before == func and @second
108 tmp_nb_line = @nb_line
109 self[tmp_nb_line] = Diff.new
110 else
111 @second = false
112 tmp_nb_line = @start
113 @start += 1
114 @nb_line -= 1
115 end
116 else
117 tmp_nb_line = @nb_line
118 @start = @nb_line
119 self[tmp_nb_line] = Diff.new
120 @second = true
121 end
122 unless self[tmp_nb_line]
123 @nb_line += 1
124 self[tmp_nb_line] = Diff.new
125 else
126 self[tmp_nb_line]
127 end
128 end
129
114
130 # Escape the HTML for the diff
115 # Escape the HTML for the diff
131 def escapeHTML(line)
116 def escapeHTML(line)
132 CGI.escapeHTML(line)
117 CGI.escapeHTML(line)
133 end
118 end
119
120 def diff_for_added_line
121 if @type == 'sbs' && @removed > 0 && @added < @removed
122 self[-(@removed - @added)]
123 else
124 diff = Diff.new
125 self << diff
126 diff
127 end
128 end
134
129
135 def parse_line(line, type="inline")
130 def parse_line(line, type="inline")
136 if line[0, 1] == "+"
131 if line[0, 1] == "+"
137 diff = sbs? type, 'add'
132 diff = diff_for_added_line
138 @before = 'add'
139 diff.line_right = escapeHTML line[1..-1]
133 diff.line_right = escapeHTML line[1..-1]
140 diff.nb_line_right = @line_num_r
134 diff.nb_line_right = @line_num_r
141 diff.type_diff_right = 'diff_in'
135 diff.type_diff_right = 'diff_in'
142 @line_num_r += 1
136 @line_num_r += 1
137 @added += 1
143 true
138 true
144 elsif line[0, 1] == "-"
139 elsif line[0, 1] == "-"
145 diff = sbs? type, 'remove'
146 @before = 'remove'
147 diff.line_left = escapeHTML line[1..-1]
148 diff.nb_line_left = @line_num_l
149 diff.type_diff_left = 'diff_out'
150 @line_num_l += 1
151 true
152 elsif line[0, 1] =~ /\s/
153 @before = 'same'
154 @start = false
155 diff = Diff.new
140 diff = Diff.new
156 diff.line_right = escapeHTML line[1..-1]
157 diff.nb_line_right = @line_num_r
158 diff.line_left = escapeHTML line[1..-1]
141 diff.line_left = escapeHTML line[1..-1]
159 diff.nb_line_left = @line_num_l
142 diff.nb_line_left = @line_num_l
160 self[@nb_line] = diff
143 diff.type_diff_left = 'diff_out'
144 self << diff
161 @line_num_l += 1
145 @line_num_l += 1
162 @line_num_r += 1
146 @removed += 1
163 true
147 true
164 elsif line[0, 1] = "\\"
148 else
149 write_offsets
150 if line[0, 1] =~ /\s/
151 diff = Diff.new
152 diff.line_right = escapeHTML line[1..-1]
153 diff.nb_line_right = @line_num_r
154 diff.line_left = escapeHTML line[1..-1]
155 diff.nb_line_left = @line_num_l
156 self << diff
157 @line_num_l += 1
158 @line_num_r += 1
159 true
160 elsif line[0, 1] = "\\"
165 true
161 true
166 else
162 else
167 false
163 false
168 end
164 end
169 end
165 end
170 end
166 end
167
168 def write_offsets
169 if @added > 0 && @added == @removed
170 @added.times do |i|
171 line = self[-(1 + i)]
172 removed = (@type == 'sbs') ? line : self[-(1 + @added + i)]
173 offsets = offsets(removed.line_left, line.line_right)
174 removed.offsets = line.offsets = offsets
175 end
176 end
177 @added = 0
178 @removed = 0
179 end
180
181 def offsets(line_left, line_right)
182 if line_left.present? && line_right.present? && line_left != line_right
183 max = [line_left.size, line_right.size].min
184 starting = 0
185 while starting < max && line_left[starting] == line_right[starting]
186 starting += 1
187 end
188 ending = -1
189 while ending >= -(max - starting) && line_left[ending] == line_right[ending]
190 ending -= 1
191 end
192 unless starting == 0 && ending == -1
193 [starting, ending]
194 end
195 end
196 end
197 end
171
198
172 # A line of diff
199 # A line of diff
173 class Diff
200 class Diff
174 attr_accessor :nb_line_left
201 attr_accessor :nb_line_left
175 attr_accessor :line_left
202 attr_accessor :line_left
176 attr_accessor :nb_line_right
203 attr_accessor :nb_line_right
177 attr_accessor :line_right
204 attr_accessor :line_right
178 attr_accessor :type_diff_right
205 attr_accessor :type_diff_right
179 attr_accessor :type_diff_left
206 attr_accessor :type_diff_left
207 attr_accessor :offsets
180
208
181 def initialize()
209 def initialize()
182 self.nb_line_left = ''
210 self.nb_line_left = ''
183 self.nb_line_right = ''
211 self.nb_line_right = ''
184 self.line_left = ''
212 self.line_left = ''
185 self.line_right = ''
213 self.line_right = ''
186 self.type_diff_right = ''
214 self.type_diff_right = ''
187 self.type_diff_left = ''
215 self.type_diff_left = ''
188 end
216 end
217
218 def type_diff
219 type_diff_right == 'diff_in' ? type_diff_right : type_diff_left
220 end
221
222 def line
223 type_diff_right == 'diff_in' ? line_right : line_left
224 end
225
226 def html_line_left
227 if offsets
228 line_left.dup.insert(offsets.first, '<span>').insert(offsets.last, '</span>')
229 else
230 line_left
231 end
232 end
233
234 def html_line_right
235 if offsets
236 line_right.dup.insert(offsets.first, '<span>').insert(offsets.last, '</span>')
237 else
238 line_right
239 end
240 end
241
242 def html_line
243 if offsets
244 line.dup.insert(offsets.first, '<span>').insert(offsets.last, '</span>')
245 else
246 line
247 end
248 end
189
249
190 def inspect
250 def inspect
191 puts '### Start Line Diff ###'
251 puts '### Start Line Diff ###'
192 puts self.nb_line_left
252 puts self.nb_line_left
193 puts self.line_left
253 puts self.line_left
194 puts self.nb_line_right
254 puts self.nb_line_right
195 puts self.line_right
255 puts self.line_right
196 end
256 end
197 end
257 end
198 end
258 end
@@ -1,961 +1,963
1 html {overflow-y:scroll;}
1 html {overflow-y:scroll;}
2 body { font-family: Verdana, sans-serif; font-size: 12px; color:#484848; margin: 0; padding: 0; min-width: 900px; }
2 body { font-family: Verdana, sans-serif; font-size: 12px; color:#484848; margin: 0; padding: 0; min-width: 900px; }
3
3
4 h1, h2, h3, h4 { font-family: "Trebuchet MS", Verdana, sans-serif;}
4 h1, h2, h3, h4 { font-family: "Trebuchet MS", Verdana, sans-serif;}
5 h1 {margin:0; padding:0; font-size: 24px;}
5 h1 {margin:0; padding:0; font-size: 24px;}
6 h2, .wiki h1 {font-size: 20px;padding: 2px 10px 1px 0px;margin: 0 0 10px 0; border-bottom: 1px solid #bbbbbb; color: #444;}
6 h2, .wiki h1 {font-size: 20px;padding: 2px 10px 1px 0px;margin: 0 0 10px 0; border-bottom: 1px solid #bbbbbb; color: #444;}
7 h3, .wiki h2 {font-size: 16px;padding: 2px 10px 1px 0px;margin: 0 0 10px 0; border-bottom: 1px solid #bbbbbb; color: #444;}
7 h3, .wiki h2 {font-size: 16px;padding: 2px 10px 1px 0px;margin: 0 0 10px 0; border-bottom: 1px solid #bbbbbb; color: #444;}
8 h4, .wiki h3 {font-size: 13px;padding: 2px 10px 1px 0px;margin-bottom: 5px; border-bottom: 1px dotted #bbbbbb; color: #444;}
8 h4, .wiki h3 {font-size: 13px;padding: 2px 10px 1px 0px;margin-bottom: 5px; border-bottom: 1px dotted #bbbbbb; color: #444;}
9
9
10 /***** Layout *****/
10 /***** Layout *****/
11 #wrapper {background: white;}
11 #wrapper {background: white;}
12
12
13 #top-menu {background: #2C4056; color: #fff; height:1.8em; font-size: 0.8em; padding: 2px 2px 0px 6px;}
13 #top-menu {background: #2C4056; color: #fff; height:1.8em; font-size: 0.8em; padding: 2px 2px 0px 6px;}
14 #top-menu ul {margin: 0; padding: 0;}
14 #top-menu ul {margin: 0; padding: 0;}
15 #top-menu li {
15 #top-menu li {
16 float:left;
16 float:left;
17 list-style-type:none;
17 list-style-type:none;
18 margin: 0px 0px 0px 0px;
18 margin: 0px 0px 0px 0px;
19 padding: 0px 0px 0px 0px;
19 padding: 0px 0px 0px 0px;
20 white-space:nowrap;
20 white-space:nowrap;
21 }
21 }
22 #top-menu a {color: #fff; margin-right: 8px; font-weight: bold;}
22 #top-menu a {color: #fff; margin-right: 8px; font-weight: bold;}
23 #top-menu #loggedas { float: right; margin-right: 0.5em; color: #fff; }
23 #top-menu #loggedas { float: right; margin-right: 0.5em; color: #fff; }
24
24
25 #account {float:right;}
25 #account {float:right;}
26
26
27 #header {height:5.3em;margin:0;background-color:#507AAA;color:#f8f8f8; padding: 4px 8px 0px 6px; position:relative;}
27 #header {height:5.3em;margin:0;background-color:#507AAA;color:#f8f8f8; padding: 4px 8px 0px 6px; position:relative;}
28 #header a {color:#f8f8f8;}
28 #header a {color:#f8f8f8;}
29 #header h1 a.ancestor { font-size: 80%; }
29 #header h1 a.ancestor { font-size: 80%; }
30 #quick-search {float:right;}
30 #quick-search {float:right;}
31
31
32 #main-menu {position: absolute; bottom: 0px; left:6px; margin-right: -500px;}
32 #main-menu {position: absolute; bottom: 0px; left:6px; margin-right: -500px;}
33 #main-menu ul {margin: 0; padding: 0;}
33 #main-menu ul {margin: 0; padding: 0;}
34 #main-menu li {
34 #main-menu li {
35 float:left;
35 float:left;
36 list-style-type:none;
36 list-style-type:none;
37 margin: 0px 2px 0px 0px;
37 margin: 0px 2px 0px 0px;
38 padding: 0px 0px 0px 0px;
38 padding: 0px 0px 0px 0px;
39 white-space:nowrap;
39 white-space:nowrap;
40 }
40 }
41 #main-menu li a {
41 #main-menu li a {
42 display: block;
42 display: block;
43 color: #fff;
43 color: #fff;
44 text-decoration: none;
44 text-decoration: none;
45 font-weight: bold;
45 font-weight: bold;
46 margin: 0;
46 margin: 0;
47 padding: 4px 10px 4px 10px;
47 padding: 4px 10px 4px 10px;
48 }
48 }
49 #main-menu li a:hover {background:#759FCF; color:#fff;}
49 #main-menu li a:hover {background:#759FCF; color:#fff;}
50 #main-menu li a.selected, #main-menu li a.selected:hover {background:#fff; color:#555;}
50 #main-menu li a.selected, #main-menu li a.selected:hover {background:#fff; color:#555;}
51
51
52 #admin-menu ul {margin: 0; padding: 0;}
52 #admin-menu ul {margin: 0; padding: 0;}
53 #admin-menu li {margin: 0; padding: 0 0 12px 0; list-style-type:none;}
53 #admin-menu li {margin: 0; padding: 0 0 12px 0; list-style-type:none;}
54
54
55 #admin-menu a { background-position: 0% 40%; background-repeat: no-repeat; padding-left: 20px; padding-top: 2px; padding-bottom: 3px;}
55 #admin-menu a { background-position: 0% 40%; background-repeat: no-repeat; padding-left: 20px; padding-top: 2px; padding-bottom: 3px;}
56 #admin-menu a.projects { background-image: url(../images/projects.png); }
56 #admin-menu a.projects { background-image: url(../images/projects.png); }
57 #admin-menu a.users { background-image: url(../images/user.png); }
57 #admin-menu a.users { background-image: url(../images/user.png); }
58 #admin-menu a.groups { background-image: url(../images/group.png); }
58 #admin-menu a.groups { background-image: url(../images/group.png); }
59 #admin-menu a.roles { background-image: url(../images/database_key.png); }
59 #admin-menu a.roles { background-image: url(../images/database_key.png); }
60 #admin-menu a.trackers { background-image: url(../images/ticket.png); }
60 #admin-menu a.trackers { background-image: url(../images/ticket.png); }
61 #admin-menu a.issue_statuses { background-image: url(../images/ticket_edit.png); }
61 #admin-menu a.issue_statuses { background-image: url(../images/ticket_edit.png); }
62 #admin-menu a.workflows { background-image: url(../images/ticket_go.png); }
62 #admin-menu a.workflows { background-image: url(../images/ticket_go.png); }
63 #admin-menu a.custom_fields { background-image: url(../images/textfield.png); }
63 #admin-menu a.custom_fields { background-image: url(../images/textfield.png); }
64 #admin-menu a.enumerations { background-image: url(../images/text_list_bullets.png); }
64 #admin-menu a.enumerations { background-image: url(../images/text_list_bullets.png); }
65 #admin-menu a.settings { background-image: url(../images/changeset.png); }
65 #admin-menu a.settings { background-image: url(../images/changeset.png); }
66 #admin-menu a.plugins { background-image: url(../images/plugin.png); }
66 #admin-menu a.plugins { background-image: url(../images/plugin.png); }
67 #admin-menu a.info { background-image: url(../images/help.png); }
67 #admin-menu a.info { background-image: url(../images/help.png); }
68 #admin-menu a.server_authentication { background-image: url(../images/server_key.png); }
68 #admin-menu a.server_authentication { background-image: url(../images/server_key.png); }
69
69
70 #main {background-color:#EEEEEE;}
70 #main {background-color:#EEEEEE;}
71
71
72 #sidebar{ float: right; width: 22%; position: relative; z-index: 9; padding: 0; margin: 0;}
72 #sidebar{ float: right; width: 22%; position: relative; z-index: 9; padding: 0; margin: 0;}
73 * html #sidebar{ width: 22%; }
73 * html #sidebar{ width: 22%; }
74 #sidebar h3{ font-size: 14px; margin-top:14px; color: #666; }
74 #sidebar h3{ font-size: 14px; margin-top:14px; color: #666; }
75 #sidebar hr{ width: 100%; margin: 0 auto; height: 1px; background: #ccc; border: 0; }
75 #sidebar hr{ width: 100%; margin: 0 auto; height: 1px; background: #ccc; border: 0; }
76 * html #sidebar hr{ width: 95%; position: relative; left: -6px; color: #ccc; }
76 * html #sidebar hr{ width: 95%; position: relative; left: -6px; color: #ccc; }
77 #sidebar .contextual { margin-right: 1em; }
77 #sidebar .contextual { margin-right: 1em; }
78
78
79 #content { width: 75%; background-color: #fff; margin: 0px; border-right: 1px solid #ddd; padding: 6px 10px 10px 10px; z-index: 10; }
79 #content { width: 75%; background-color: #fff; margin: 0px; border-right: 1px solid #ddd; padding: 6px 10px 10px 10px; z-index: 10; }
80 * html #content{ width: 75%; padding-left: 0; margin-top: 0px; padding: 6px 10px 10px 10px;}
80 * html #content{ width: 75%; padding-left: 0; margin-top: 0px; padding: 6px 10px 10px 10px;}
81 html>body #content { min-height: 600px; }
81 html>body #content { min-height: 600px; }
82 * html body #content { height: 600px; } /* IE */
82 * html body #content { height: 600px; } /* IE */
83
83
84 #main.nosidebar #sidebar{ display: none; }
84 #main.nosidebar #sidebar{ display: none; }
85 #main.nosidebar #content{ width: auto; border-right: 0; }
85 #main.nosidebar #content{ width: auto; border-right: 0; }
86
86
87 #footer {clear: both; border-top: 1px solid #bbb; font-size: 0.9em; color: #aaa; padding: 5px; text-align:center; background:#fff;}
87 #footer {clear: both; border-top: 1px solid #bbb; font-size: 0.9em; color: #aaa; padding: 5px; text-align:center; background:#fff;}
88
88
89 #login-form table {margin-top:5em; padding:1em; margin-left: auto; margin-right: auto; border: 2px solid #FDBF3B; background-color:#FFEBC1; }
89 #login-form table {margin-top:5em; padding:1em; margin-left: auto; margin-right: auto; border: 2px solid #FDBF3B; background-color:#FFEBC1; }
90 #login-form table td {padding: 6px;}
90 #login-form table td {padding: 6px;}
91 #login-form label {font-weight: bold;}
91 #login-form label {font-weight: bold;}
92 #login-form input#username, #login-form input#password { width: 300px; }
92 #login-form input#username, #login-form input#password { width: 300px; }
93
93
94 input#openid_url { background: url(../images/openid-bg.gif) no-repeat; background-color: #fff; background-position: 0 50%; padding-left: 18px; }
94 input#openid_url { background: url(../images/openid-bg.gif) no-repeat; background-color: #fff; background-position: 0 50%; padding-left: 18px; }
95
95
96 .clear:after{ content: "."; display: block; height: 0; clear: both; visibility: hidden; }
96 .clear:after{ content: "."; display: block; height: 0; clear: both; visibility: hidden; }
97
97
98 /***** Links *****/
98 /***** Links *****/
99 a, a:link, a:visited{ color: #2A5685; text-decoration: none; }
99 a, a:link, a:visited{ color: #2A5685; text-decoration: none; }
100 a:hover, a:active{ color: #c61a1a; text-decoration: underline;}
100 a:hover, a:active{ color: #c61a1a; text-decoration: underline;}
101 a img{ border: 0; }
101 a img{ border: 0; }
102
102
103 a.issue.closed, a.issue.closed:link, a.issue.closed:visited { color: #999; text-decoration: line-through; }
103 a.issue.closed, a.issue.closed:link, a.issue.closed:visited { color: #999; text-decoration: line-through; }
104
104
105 /***** Tables *****/
105 /***** Tables *****/
106 table.list { border: 1px solid #e4e4e4; border-collapse: collapse; width: 100%; margin-bottom: 4px; }
106 table.list { border: 1px solid #e4e4e4; border-collapse: collapse; width: 100%; margin-bottom: 4px; }
107 table.list th { background-color:#EEEEEE; padding: 4px; white-space:nowrap; }
107 table.list th { background-color:#EEEEEE; padding: 4px; white-space:nowrap; }
108 table.list td { vertical-align: top; }
108 table.list td { vertical-align: top; }
109 table.list td.id { width: 2%; text-align: center;}
109 table.list td.id { width: 2%; text-align: center;}
110 table.list td.checkbox { width: 15px; padding: 0px;}
110 table.list td.checkbox { width: 15px; padding: 0px;}
111 table.list td.buttons { width: 15%; white-space:nowrap; text-align: right; }
111 table.list td.buttons { width: 15%; white-space:nowrap; text-align: right; }
112 table.list td.buttons a { padding-right: 0.6em; }
112 table.list td.buttons a { padding-right: 0.6em; }
113 table.list caption { text-align: left; padding: 0.5em 0.5em 0.5em 0; }
113 table.list caption { text-align: left; padding: 0.5em 0.5em 0.5em 0; }
114
114
115 tr.project td.name a { white-space:nowrap; }
115 tr.project td.name a { white-space:nowrap; }
116
116
117 tr.project.idnt td.name span {background: url(../images/bullet_arrow_right.png) no-repeat 0 50%; padding-left: 16px;}
117 tr.project.idnt td.name span {background: url(../images/bullet_arrow_right.png) no-repeat 0 50%; padding-left: 16px;}
118 tr.project.idnt-1 td.name {padding-left: 0.5em;}
118 tr.project.idnt-1 td.name {padding-left: 0.5em;}
119 tr.project.idnt-2 td.name {padding-left: 2em;}
119 tr.project.idnt-2 td.name {padding-left: 2em;}
120 tr.project.idnt-3 td.name {padding-left: 3.5em;}
120 tr.project.idnt-3 td.name {padding-left: 3.5em;}
121 tr.project.idnt-4 td.name {padding-left: 5em;}
121 tr.project.idnt-4 td.name {padding-left: 5em;}
122 tr.project.idnt-5 td.name {padding-left: 6.5em;}
122 tr.project.idnt-5 td.name {padding-left: 6.5em;}
123 tr.project.idnt-6 td.name {padding-left: 8em;}
123 tr.project.idnt-6 td.name {padding-left: 8em;}
124 tr.project.idnt-7 td.name {padding-left: 9.5em;}
124 tr.project.idnt-7 td.name {padding-left: 9.5em;}
125 tr.project.idnt-8 td.name {padding-left: 11em;}
125 tr.project.idnt-8 td.name {padding-left: 11em;}
126 tr.project.idnt-9 td.name {padding-left: 12.5em;}
126 tr.project.idnt-9 td.name {padding-left: 12.5em;}
127
127
128 tr.issue { text-align: center; white-space: nowrap; }
128 tr.issue { text-align: center; white-space: nowrap; }
129 tr.issue td.subject, tr.issue td.category, td.assigned_to { white-space: normal; }
129 tr.issue td.subject, tr.issue td.category, td.assigned_to { white-space: normal; }
130 tr.issue td.subject { text-align: left; }
130 tr.issue td.subject { text-align: left; }
131 tr.issue td.done_ratio table.progress { margin-left:auto; margin-right: auto;}
131 tr.issue td.done_ratio table.progress { margin-left:auto; margin-right: auto;}
132
132
133 tr.issue.idnt td.subject a {background: url(../images/bullet_arrow_right.png) no-repeat 0 50%; padding-left: 16px;}
133 tr.issue.idnt td.subject a {background: url(../images/bullet_arrow_right.png) no-repeat 0 50%; padding-left: 16px;}
134 tr.issue.idnt-1 td.subject {padding-left: 0.5em;}
134 tr.issue.idnt-1 td.subject {padding-left: 0.5em;}
135 tr.issue.idnt-2 td.subject {padding-left: 2em;}
135 tr.issue.idnt-2 td.subject {padding-left: 2em;}
136 tr.issue.idnt-3 td.subject {padding-left: 3.5em;}
136 tr.issue.idnt-3 td.subject {padding-left: 3.5em;}
137 tr.issue.idnt-4 td.subject {padding-left: 5em;}
137 tr.issue.idnt-4 td.subject {padding-left: 5em;}
138 tr.issue.idnt-5 td.subject {padding-left: 6.5em;}
138 tr.issue.idnt-5 td.subject {padding-left: 6.5em;}
139 tr.issue.idnt-6 td.subject {padding-left: 8em;}
139 tr.issue.idnt-6 td.subject {padding-left: 8em;}
140 tr.issue.idnt-7 td.subject {padding-left: 9.5em;}
140 tr.issue.idnt-7 td.subject {padding-left: 9.5em;}
141 tr.issue.idnt-8 td.subject {padding-left: 11em;}
141 tr.issue.idnt-8 td.subject {padding-left: 11em;}
142 tr.issue.idnt-9 td.subject {padding-left: 12.5em;}
142 tr.issue.idnt-9 td.subject {padding-left: 12.5em;}
143
143
144 tr.entry { border: 1px solid #f8f8f8; }
144 tr.entry { border: 1px solid #f8f8f8; }
145 tr.entry td { white-space: nowrap; }
145 tr.entry td { white-space: nowrap; }
146 tr.entry td.filename { width: 30%; }
146 tr.entry td.filename { width: 30%; }
147 tr.entry td.size { text-align: right; font-size: 90%; }
147 tr.entry td.size { text-align: right; font-size: 90%; }
148 tr.entry td.revision, tr.entry td.author { text-align: center; }
148 tr.entry td.revision, tr.entry td.author { text-align: center; }
149 tr.entry td.age { text-align: right; }
149 tr.entry td.age { text-align: right; }
150 tr.entry.file td.filename a { margin-left: 16px; }
150 tr.entry.file td.filename a { margin-left: 16px; }
151
151
152 tr span.expander {background-image: url(../images/bullet_toggle_plus.png); padding-left: 8px; margin-left: 0; cursor: pointer;}
152 tr span.expander {background-image: url(../images/bullet_toggle_plus.png); padding-left: 8px; margin-left: 0; cursor: pointer;}
153 tr.open span.expander {background-image: url(../images/bullet_toggle_minus.png);}
153 tr.open span.expander {background-image: url(../images/bullet_toggle_minus.png);}
154
154
155 tr.changeset td.author { text-align: center; width: 15%; }
155 tr.changeset td.author { text-align: center; width: 15%; }
156 tr.changeset td.committed_on { text-align: center; width: 15%; }
156 tr.changeset td.committed_on { text-align: center; width: 15%; }
157
157
158 table.files tr.file td { text-align: center; }
158 table.files tr.file td { text-align: center; }
159 table.files tr.file td.filename { text-align: left; padding-left: 24px; }
159 table.files tr.file td.filename { text-align: left; padding-left: 24px; }
160 table.files tr.file td.digest { font-size: 80%; }
160 table.files tr.file td.digest { font-size: 80%; }
161
161
162 table.members td.roles, table.memberships td.roles { width: 45%; }
162 table.members td.roles, table.memberships td.roles { width: 45%; }
163
163
164 tr.message { height: 2.6em; }
164 tr.message { height: 2.6em; }
165 tr.message td.subject { padding-left: 20px; }
165 tr.message td.subject { padding-left: 20px; }
166 tr.message td.created_on { white-space: nowrap; }
166 tr.message td.created_on { white-space: nowrap; }
167 tr.message td.last_message { font-size: 80%; white-space: nowrap; }
167 tr.message td.last_message { font-size: 80%; white-space: nowrap; }
168 tr.message.locked td.subject { background: url(../images/locked.png) no-repeat 0 1px; }
168 tr.message.locked td.subject { background: url(../images/locked.png) no-repeat 0 1px; }
169 tr.message.sticky td.subject { background: url(../images/bullet_go.png) no-repeat 0 1px; font-weight: bold; }
169 tr.message.sticky td.subject { background: url(../images/bullet_go.png) no-repeat 0 1px; font-weight: bold; }
170
170
171 tr.version.closed, tr.version.closed a { color: #999; }
171 tr.version.closed, tr.version.closed a { color: #999; }
172 tr.version td.name { padding-left: 20px; }
172 tr.version td.name { padding-left: 20px; }
173 tr.version.shared td.name { background: url(../images/link.png) no-repeat 0% 70%; }
173 tr.version.shared td.name { background: url(../images/link.png) no-repeat 0% 70%; }
174 tr.version td.date, tr.version td.status, tr.version td.sharing { text-align: center; white-space:nowrap; }
174 tr.version td.date, tr.version td.status, tr.version td.sharing { text-align: center; white-space:nowrap; }
175
175
176 tr.user td { width:13%; }
176 tr.user td { width:13%; }
177 tr.user td.email { width:18%; }
177 tr.user td.email { width:18%; }
178 tr.user td { white-space: nowrap; }
178 tr.user td { white-space: nowrap; }
179 tr.user.locked, tr.user.registered { color: #aaa; }
179 tr.user.locked, tr.user.registered { color: #aaa; }
180 tr.user.locked a, tr.user.registered a { color: #aaa; }
180 tr.user.locked a, tr.user.registered a { color: #aaa; }
181
181
182 tr.wiki-page-version td.updated_on, tr.wiki-page-version td.author {text-align:center;}
182 tr.wiki-page-version td.updated_on, tr.wiki-page-version td.author {text-align:center;}
183
183
184 tr.time-entry { text-align: center; white-space: nowrap; }
184 tr.time-entry { text-align: center; white-space: nowrap; }
185 tr.time-entry td.subject, tr.time-entry td.comments { text-align: left; white-space: normal; }
185 tr.time-entry td.subject, tr.time-entry td.comments { text-align: left; white-space: normal; }
186 td.hours { text-align: right; font-weight: bold; padding-right: 0.5em; }
186 td.hours { text-align: right; font-weight: bold; padding-right: 0.5em; }
187 td.hours .hours-dec { font-size: 0.9em; }
187 td.hours .hours-dec { font-size: 0.9em; }
188
188
189 table.plugins td { vertical-align: middle; }
189 table.plugins td { vertical-align: middle; }
190 table.plugins td.configure { text-align: right; padding-right: 1em; }
190 table.plugins td.configure { text-align: right; padding-right: 1em; }
191 table.plugins span.name { font-weight: bold; display: block; margin-bottom: 6px; }
191 table.plugins span.name { font-weight: bold; display: block; margin-bottom: 6px; }
192 table.plugins span.description { display: block; font-size: 0.9em; }
192 table.plugins span.description { display: block; font-size: 0.9em; }
193 table.plugins span.url { display: block; font-size: 0.9em; }
193 table.plugins span.url { display: block; font-size: 0.9em; }
194
194
195 table.list tbody tr.group td { padding: 0.8em 0 0.5em 0.3em; font-weight: bold; border-bottom: 1px solid #ccc; }
195 table.list tbody tr.group td { padding: 0.8em 0 0.5em 0.3em; font-weight: bold; border-bottom: 1px solid #ccc; }
196 table.list tbody tr.group span.count { color: #aaa; font-size: 80%; }
196 table.list tbody tr.group span.count { color: #aaa; font-size: 80%; }
197
197
198 table.list tbody tr:hover { background-color:#ffffdd; }
198 table.list tbody tr:hover { background-color:#ffffdd; }
199 table.list tbody tr.group:hover { background-color:inherit; }
199 table.list tbody tr.group:hover { background-color:inherit; }
200 table td {padding:2px;}
200 table td {padding:2px;}
201 table p {margin:0;}
201 table p {margin:0;}
202 .odd {background-color:#f6f7f8;}
202 .odd {background-color:#f6f7f8;}
203 .even {background-color: #fff;}
203 .even {background-color: #fff;}
204
204
205 a.sort { padding-right: 16px; background-position: 100% 50%; background-repeat: no-repeat; }
205 a.sort { padding-right: 16px; background-position: 100% 50%; background-repeat: no-repeat; }
206 a.sort.asc { background-image: url(../images/sort_asc.png); }
206 a.sort.asc { background-image: url(../images/sort_asc.png); }
207 a.sort.desc { background-image: url(../images/sort_desc.png); }
207 a.sort.desc { background-image: url(../images/sort_desc.png); }
208
208
209 table.attributes { width: 100% }
209 table.attributes { width: 100% }
210 table.attributes th { vertical-align: top; text-align: left; }
210 table.attributes th { vertical-align: top; text-align: left; }
211 table.attributes td { vertical-align: top; }
211 table.attributes td { vertical-align: top; }
212
212
213 table.boards a.board, h3.comments { background: url(../images/comment.png) no-repeat 0% 50%; padding-left: 20px; }
213 table.boards a.board, h3.comments { background: url(../images/comment.png) no-repeat 0% 50%; padding-left: 20px; }
214
214
215 td.center {text-align:center;}
215 td.center {text-align:center;}
216
216
217 h3.version { background: url(../images/package.png) no-repeat 0% 50%; padding-left: 20px; }
217 h3.version { background: url(../images/package.png) no-repeat 0% 50%; padding-left: 20px; }
218
218
219 div.issues h3 { background: url(../images/ticket.png) no-repeat 0% 50%; padding-left: 20px; }
219 div.issues h3 { background: url(../images/ticket.png) no-repeat 0% 50%; padding-left: 20px; }
220 div.members h3 { background: url(../images/group.png) no-repeat 0% 50%; padding-left: 20px; }
220 div.members h3 { background: url(../images/group.png) no-repeat 0% 50%; padding-left: 20px; }
221 div.news h3 { background: url(../images/news.png) no-repeat 0% 50%; padding-left: 20px; }
221 div.news h3 { background: url(../images/news.png) no-repeat 0% 50%; padding-left: 20px; }
222 div.projects h3 { background: url(../images/projects.png) no-repeat 0% 50%; padding-left: 20px; }
222 div.projects h3 { background: url(../images/projects.png) no-repeat 0% 50%; padding-left: 20px; }
223
223
224 #watchers ul {margin: 0; padding: 0;}
224 #watchers ul {margin: 0; padding: 0;}
225 #watchers li {list-style-type:none;margin: 0px 2px 0px 0px; padding: 0px 0px 0px 0px;}
225 #watchers li {list-style-type:none;margin: 0px 2px 0px 0px; padding: 0px 0px 0px 0px;}
226 #watchers select {width: 95%; display: block;}
226 #watchers select {width: 95%; display: block;}
227 #watchers a.delete {opacity: 0.4;}
227 #watchers a.delete {opacity: 0.4;}
228 #watchers a.delete:hover {opacity: 1;}
228 #watchers a.delete:hover {opacity: 1;}
229 #watchers img.gravatar {vertical-align: middle;margin: 0 4px 2px 0;}
229 #watchers img.gravatar {vertical-align: middle;margin: 0 4px 2px 0;}
230
230
231 .highlight { background-color: #FCFD8D;}
231 .highlight { background-color: #FCFD8D;}
232 .highlight.token-1 { background-color: #faa;}
232 .highlight.token-1 { background-color: #faa;}
233 .highlight.token-2 { background-color: #afa;}
233 .highlight.token-2 { background-color: #afa;}
234 .highlight.token-3 { background-color: #aaf;}
234 .highlight.token-3 { background-color: #aaf;}
235
235
236 .box{
236 .box{
237 padding:6px;
237 padding:6px;
238 margin-bottom: 10px;
238 margin-bottom: 10px;
239 background-color:#f6f6f6;
239 background-color:#f6f6f6;
240 color:#505050;
240 color:#505050;
241 line-height:1.5em;
241 line-height:1.5em;
242 border: 1px solid #e4e4e4;
242 border: 1px solid #e4e4e4;
243 }
243 }
244
244
245 div.square {
245 div.square {
246 border: 1px solid #999;
246 border: 1px solid #999;
247 float: left;
247 float: left;
248 margin: .3em .4em 0 .4em;
248 margin: .3em .4em 0 .4em;
249 overflow: hidden;
249 overflow: hidden;
250 width: .6em; height: .6em;
250 width: .6em; height: .6em;
251 }
251 }
252 .contextual {float:right; white-space: nowrap; line-height:1.4em;margin-top:5px; padding-left: 10px; font-size:0.9em;}
252 .contextual {float:right; white-space: nowrap; line-height:1.4em;margin-top:5px; padding-left: 10px; font-size:0.9em;}
253 .contextual input, .contextual select {font-size:0.9em;}
253 .contextual input, .contextual select {font-size:0.9em;}
254 .message .contextual { margin-top: 0; }
254 .message .contextual { margin-top: 0; }
255
255
256 .splitcontentleft{float:left; width:49%;}
256 .splitcontentleft{float:left; width:49%;}
257 .splitcontentright{float:right; width:49%;}
257 .splitcontentright{float:right; width:49%;}
258 form {display: inline;}
258 form {display: inline;}
259 input, select {vertical-align: middle; margin-top: 1px; margin-bottom: 1px;}
259 input, select {vertical-align: middle; margin-top: 1px; margin-bottom: 1px;}
260 fieldset {border: 1px solid #e4e4e4; margin:0;}
260 fieldset {border: 1px solid #e4e4e4; margin:0;}
261 legend {color: #484848;}
261 legend {color: #484848;}
262 hr { width: 100%; height: 1px; background: #ccc; border: 0;}
262 hr { width: 100%; height: 1px; background: #ccc; border: 0;}
263 blockquote { font-style: italic; border-left: 3px solid #e0e0e0; padding-left: 0.6em; margin-left: 2.4em;}
263 blockquote { font-style: italic; border-left: 3px solid #e0e0e0; padding-left: 0.6em; margin-left: 2.4em;}
264 blockquote blockquote { margin-left: 0;}
264 blockquote blockquote { margin-left: 0;}
265 acronym { border-bottom: 1px dotted; cursor: help; }
265 acronym { border-bottom: 1px dotted; cursor: help; }
266 textarea.wiki-edit { width: 99%; }
266 textarea.wiki-edit { width: 99%; }
267 li p {margin-top: 0;}
267 li p {margin-top: 0;}
268 div.issue {background:#ffffdd; padding:6px; margin-bottom:6px;border: 1px solid #d7d7d7;}
268 div.issue {background:#ffffdd; padding:6px; margin-bottom:6px;border: 1px solid #d7d7d7;}
269 p.breadcrumb { font-size: 0.9em; margin: 4px 0 4px 0;}
269 p.breadcrumb { font-size: 0.9em; margin: 4px 0 4px 0;}
270 p.subtitle { font-size: 0.9em; margin: -6px 0 12px 0; font-style: italic; }
270 p.subtitle { font-size: 0.9em; margin: -6px 0 12px 0; font-style: italic; }
271 p.footnote { font-size: 0.9em; margin-top: 0px; margin-bottom: 0px; }
271 p.footnote { font-size: 0.9em; margin-top: 0px; margin-bottom: 0px; }
272
272
273 div.issue div.subject div div { padding-left: 16px; }
273 div.issue div.subject div div { padding-left: 16px; }
274 div.issue div.subject p {margin: 0; margin-bottom: 0.1em; font-size: 90%; color: #999;}
274 div.issue div.subject p {margin: 0; margin-bottom: 0.1em; font-size: 90%; color: #999;}
275 div.issue div.subject>div>p { margin-top: 0.5em; }
275 div.issue div.subject>div>p { margin-top: 0.5em; }
276 div.issue div.subject h3 {margin: 0; margin-bottom: 0.1em;}
276 div.issue div.subject h3 {margin: 0; margin-bottom: 0.1em;}
277
277
278 #issue_tree table.issues { border: 0; }
278 #issue_tree table.issues { border: 0; }
279 #issue_tree td.checkbox {display:none;}
279 #issue_tree td.checkbox {display:none;}
280
280
281 fieldset.collapsible { border-width: 1px 0 0 0; font-size: 0.9em; }
281 fieldset.collapsible { border-width: 1px 0 0 0; font-size: 0.9em; }
282 fieldset.collapsible legend { padding-left: 16px; background: url(../images/arrow_expanded.png) no-repeat 0% 40%; cursor:pointer; }
282 fieldset.collapsible legend { padding-left: 16px; background: url(../images/arrow_expanded.png) no-repeat 0% 40%; cursor:pointer; }
283 fieldset.collapsible.collapsed legend { background-image: url(../images/arrow_collapsed.png); }
283 fieldset.collapsible.collapsed legend { background-image: url(../images/arrow_collapsed.png); }
284
284
285 fieldset#date-range p { margin: 2px 0 2px 0; }
285 fieldset#date-range p { margin: 2px 0 2px 0; }
286 fieldset#filters table { border-collapse: collapse; }
286 fieldset#filters table { border-collapse: collapse; }
287 fieldset#filters table td { padding: 0; vertical-align: middle; }
287 fieldset#filters table td { padding: 0; vertical-align: middle; }
288 fieldset#filters tr.filter { height: 2em; }
288 fieldset#filters tr.filter { height: 2em; }
289 fieldset#filters td.add-filter { text-align: right; vertical-align: top; }
289 fieldset#filters td.add-filter { text-align: right; vertical-align: top; }
290 .buttons { font-size: 0.9em; margin-bottom: 1.4em; margin-top: 1em; }
290 .buttons { font-size: 0.9em; margin-bottom: 1.4em; margin-top: 1em; }
291
291
292 div#issue-changesets {float:right; width:45%; margin-left: 1em; margin-bottom: 1em; background: #fff; padding-left: 1em; font-size: 90%;}
292 div#issue-changesets {float:right; width:45%; margin-left: 1em; margin-bottom: 1em; background: #fff; padding-left: 1em; font-size: 90%;}
293 div#issue-changesets div.changeset { padding: 4px;}
293 div#issue-changesets div.changeset { padding: 4px;}
294 div#issue-changesets div.changeset { border-bottom: 1px solid #ddd; }
294 div#issue-changesets div.changeset { border-bottom: 1px solid #ddd; }
295 div#issue-changesets p { margin-top: 0; margin-bottom: 1em;}
295 div#issue-changesets p { margin-top: 0; margin-bottom: 1em;}
296
296
297 div#activity dl, #search-results { margin-left: 2em; }
297 div#activity dl, #search-results { margin-left: 2em; }
298 div#activity dd, #search-results dd { margin-bottom: 1em; padding-left: 18px; font-size: 0.9em; }
298 div#activity dd, #search-results dd { margin-bottom: 1em; padding-left: 18px; font-size: 0.9em; }
299 div#activity dt, #search-results dt { margin-bottom: 0px; padding-left: 20px; line-height: 18px; background-position: 0 50%; background-repeat: no-repeat; }
299 div#activity dt, #search-results dt { margin-bottom: 0px; padding-left: 20px; line-height: 18px; background-position: 0 50%; background-repeat: no-repeat; }
300 div#activity dt.me .time { border-bottom: 1px solid #999; }
300 div#activity dt.me .time { border-bottom: 1px solid #999; }
301 div#activity dt .time { color: #777; font-size: 80%; }
301 div#activity dt .time { color: #777; font-size: 80%; }
302 div#activity dd .description, #search-results dd .description { font-style: italic; }
302 div#activity dd .description, #search-results dd .description { font-style: italic; }
303 div#activity span.project:after, #search-results span.project:after { content: " -"; }
303 div#activity span.project:after, #search-results span.project:after { content: " -"; }
304 div#activity dd span.description, #search-results dd span.description { display:block; color: #808080; }
304 div#activity dd span.description, #search-results dd span.description { display:block; color: #808080; }
305
305
306 #search-results dd { margin-bottom: 1em; padding-left: 20px; margin-left:0px; }
306 #search-results dd { margin-bottom: 1em; padding-left: 20px; margin-left:0px; }
307
307
308 div#search-results-counts {float:right;}
308 div#search-results-counts {float:right;}
309 div#search-results-counts ul { margin-top: 0.5em; }
309 div#search-results-counts ul { margin-top: 0.5em; }
310 div#search-results-counts li { list-style-type:none; float: left; margin-left: 1em; }
310 div#search-results-counts li { list-style-type:none; float: left; margin-left: 1em; }
311
311
312 dt.issue { background-image: url(../images/ticket.png); }
312 dt.issue { background-image: url(../images/ticket.png); }
313 dt.issue-edit { background-image: url(../images/ticket_edit.png); }
313 dt.issue-edit { background-image: url(../images/ticket_edit.png); }
314 dt.issue-closed { background-image: url(../images/ticket_checked.png); }
314 dt.issue-closed { background-image: url(../images/ticket_checked.png); }
315 dt.issue-note { background-image: url(../images/ticket_note.png); }
315 dt.issue-note { background-image: url(../images/ticket_note.png); }
316 dt.changeset { background-image: url(../images/changeset.png); }
316 dt.changeset { background-image: url(../images/changeset.png); }
317 dt.news { background-image: url(../images/news.png); }
317 dt.news { background-image: url(../images/news.png); }
318 dt.message { background-image: url(../images/message.png); }
318 dt.message { background-image: url(../images/message.png); }
319 dt.reply { background-image: url(../images/comments.png); }
319 dt.reply { background-image: url(../images/comments.png); }
320 dt.wiki-page { background-image: url(../images/wiki_edit.png); }
320 dt.wiki-page { background-image: url(../images/wiki_edit.png); }
321 dt.attachment { background-image: url(../images/attachment.png); }
321 dt.attachment { background-image: url(../images/attachment.png); }
322 dt.document { background-image: url(../images/document.png); }
322 dt.document { background-image: url(../images/document.png); }
323 dt.project { background-image: url(../images/projects.png); }
323 dt.project { background-image: url(../images/projects.png); }
324 dt.time-entry { background-image: url(../images/time.png); }
324 dt.time-entry { background-image: url(../images/time.png); }
325
325
326 #search-results dt.issue.closed { background-image: url(../images/ticket_checked.png); }
326 #search-results dt.issue.closed { background-image: url(../images/ticket_checked.png); }
327
327
328 div#roadmap .related-issues { margin-bottom: 1em; }
328 div#roadmap .related-issues { margin-bottom: 1em; }
329 div#roadmap .related-issues td.checkbox { display: none; }
329 div#roadmap .related-issues td.checkbox { display: none; }
330 div#roadmap .wiki h1:first-child { display: none; }
330 div#roadmap .wiki h1:first-child { display: none; }
331 div#roadmap .wiki h1 { font-size: 120%; }
331 div#roadmap .wiki h1 { font-size: 120%; }
332 div#roadmap .wiki h2 { font-size: 110%; }
332 div#roadmap .wiki h2 { font-size: 110%; }
333
333
334 div#version-summary { float:right; width:380px; margin-left: 16px; margin-bottom: 16px; background-color: #fff; }
334 div#version-summary { float:right; width:380px; margin-left: 16px; margin-bottom: 16px; background-color: #fff; }
335 div#version-summary fieldset { margin-bottom: 1em; }
335 div#version-summary fieldset { margin-bottom: 1em; }
336 div#version-summary .total-hours { text-align: right; }
336 div#version-summary .total-hours { text-align: right; }
337
337
338 table#time-report td.hours, table#time-report th.period, table#time-report th.total { text-align: right; padding-right: 0.5em; }
338 table#time-report td.hours, table#time-report th.period, table#time-report th.total { text-align: right; padding-right: 0.5em; }
339 table#time-report tbody tr { font-style: italic; color: #777; }
339 table#time-report tbody tr { font-style: italic; color: #777; }
340 table#time-report tbody tr.last-level { font-style: normal; color: #555; }
340 table#time-report tbody tr.last-level { font-style: normal; color: #555; }
341 table#time-report tbody tr.total { font-style: normal; font-weight: bold; color: #555; background-color:#EEEEEE; }
341 table#time-report tbody tr.total { font-style: normal; font-weight: bold; color: #555; background-color:#EEEEEE; }
342 table#time-report .hours-dec { font-size: 0.9em; }
342 table#time-report .hours-dec { font-size: 0.9em; }
343
343
344 form .attributes { margin-bottom: 8px; }
344 form .attributes { margin-bottom: 8px; }
345 form .attributes p { padding-top: 1px; padding-bottom: 2px; }
345 form .attributes p { padding-top: 1px; padding-bottom: 2px; }
346 form .attributes select { min-width: 50%; }
346 form .attributes select { min-width: 50%; }
347
347
348 ul.projects { margin: 0; padding-left: 1em; }
348 ul.projects { margin: 0; padding-left: 1em; }
349 ul.projects.root { margin: 0; padding: 0; }
349 ul.projects.root { margin: 0; padding: 0; }
350 ul.projects ul.projects { border-left: 3px solid #e0e0e0; }
350 ul.projects ul.projects { border-left: 3px solid #e0e0e0; }
351 ul.projects li.root { list-style-type:none; margin-bottom: 1em; }
351 ul.projects li.root { list-style-type:none; margin-bottom: 1em; }
352 ul.projects li.child { list-style-type:none; margin-top: 1em;}
352 ul.projects li.child { list-style-type:none; margin-top: 1em;}
353 ul.projects div.root a.project { font-family: "Trebuchet MS", Verdana, sans-serif; font-weight: bold; font-size: 16px; margin: 0 0 10px 0; }
353 ul.projects div.root a.project { font-family: "Trebuchet MS", Verdana, sans-serif; font-weight: bold; font-size: 16px; margin: 0 0 10px 0; }
354 .my-project { padding-left: 18px; background: url(../images/fav.png) no-repeat 0 50%; }
354 .my-project { padding-left: 18px; background: url(../images/fav.png) no-repeat 0 50%; }
355
355
356 #tracker_project_ids ul { margin: 0; padding-left: 1em; }
356 #tracker_project_ids ul { margin: 0; padding-left: 1em; }
357 #tracker_project_ids li { list-style-type:none; }
357 #tracker_project_ids li { list-style-type:none; }
358
358
359 ul.properties {padding:0; font-size: 0.9em; color: #777;}
359 ul.properties {padding:0; font-size: 0.9em; color: #777;}
360 ul.properties li {list-style-type:none;}
360 ul.properties li {list-style-type:none;}
361 ul.properties li span {font-style:italic;}
361 ul.properties li span {font-style:italic;}
362
362
363 .total-hours { font-size: 110%; font-weight: bold; }
363 .total-hours { font-size: 110%; font-weight: bold; }
364 .total-hours span.hours-int { font-size: 120%; }
364 .total-hours span.hours-int { font-size: 120%; }
365
365
366 .autoscroll {overflow-x: auto; padding:1px; margin-bottom: 1.2em;}
366 .autoscroll {overflow-x: auto; padding:1px; margin-bottom: 1.2em;}
367 #user_firstname, #user_lastname, #user_mail, #my_account_form select { width: 90%; }
367 #user_firstname, #user_lastname, #user_mail, #my_account_form select { width: 90%; }
368
368
369 #workflow_copy_form select { width: 200px; }
369 #workflow_copy_form select { width: 200px; }
370
370
371 textarea#custom_field_possible_values {width: 99%}
371 textarea#custom_field_possible_values {width: 99%}
372
372
373 .pagination {font-size: 90%}
373 .pagination {font-size: 90%}
374 p.pagination {margin-top:8px;}
374 p.pagination {margin-top:8px;}
375
375
376 /***** Tabular forms ******/
376 /***** Tabular forms ******/
377 .tabular p{
377 .tabular p{
378 margin: 0;
378 margin: 0;
379 padding: 5px 0 8px 0;
379 padding: 5px 0 8px 0;
380 padding-left: 180px; /*width of left column containing the label elements*/
380 padding-left: 180px; /*width of left column containing the label elements*/
381 height: 1%;
381 height: 1%;
382 clear:left;
382 clear:left;
383 }
383 }
384
384
385 html>body .tabular p {overflow:hidden;}
385 html>body .tabular p {overflow:hidden;}
386
386
387 .tabular label{
387 .tabular label{
388 font-weight: bold;
388 font-weight: bold;
389 float: left;
389 float: left;
390 text-align: right;
390 text-align: right;
391 margin-left: -180px; /*width of left column*/
391 margin-left: -180px; /*width of left column*/
392 width: 175px; /*width of labels. Should be smaller than left column to create some right
392 width: 175px; /*width of labels. Should be smaller than left column to create some right
393 margin*/
393 margin*/
394 }
394 }
395
395
396 .tabular label.floating{
396 .tabular label.floating{
397 font-weight: normal;
397 font-weight: normal;
398 margin-left: 0px;
398 margin-left: 0px;
399 text-align: left;
399 text-align: left;
400 width: 270px;
400 width: 270px;
401 }
401 }
402
402
403 .tabular label.block{
403 .tabular label.block{
404 font-weight: normal;
404 font-weight: normal;
405 margin-left: 0px !important;
405 margin-left: 0px !important;
406 text-align: left;
406 text-align: left;
407 float: none;
407 float: none;
408 display: block;
408 display: block;
409 width: auto;
409 width: auto;
410 }
410 }
411
411
412 .tabular label.inline{
412 .tabular label.inline{
413 float:none;
413 float:none;
414 margin-left: 5px !important;
414 margin-left: 5px !important;
415 width: auto;
415 width: auto;
416 }
416 }
417
417
418 input#time_entry_comments { width: 90%;}
418 input#time_entry_comments { width: 90%;}
419
419
420 #preview fieldset {margin-top: 1em; background: url(../images/draft.png)}
420 #preview fieldset {margin-top: 1em; background: url(../images/draft.png)}
421
421
422 .tabular.settings p{ padding-left: 300px; }
422 .tabular.settings p{ padding-left: 300px; }
423 .tabular.settings label{ margin-left: -300px; width: 295px; }
423 .tabular.settings label{ margin-left: -300px; width: 295px; }
424 .tabular.settings textarea { width: 99%; }
424 .tabular.settings textarea { width: 99%; }
425
425
426 fieldset.settings label { display: block; }
426 fieldset.settings label { display: block; }
427 .parent { padding-left: 20px; }
427 .parent { padding-left: 20px; }
428
428
429 .required {color: #bb0000;}
429 .required {color: #bb0000;}
430 .summary {font-style: italic;}
430 .summary {font-style: italic;}
431
431
432 #attachments_fields input[type=text] {margin-left: 8px; }
432 #attachments_fields input[type=text] {margin-left: 8px; }
433
433
434 div.attachments { margin-top: 12px; }
434 div.attachments { margin-top: 12px; }
435 div.attachments p { margin:4px 0 2px 0; }
435 div.attachments p { margin:4px 0 2px 0; }
436 div.attachments img { vertical-align: middle; }
436 div.attachments img { vertical-align: middle; }
437 div.attachments span.author { font-size: 0.9em; color: #888; }
437 div.attachments span.author { font-size: 0.9em; color: #888; }
438
438
439 p.other-formats { text-align: right; font-size:0.9em; color: #666; }
439 p.other-formats { text-align: right; font-size:0.9em; color: #666; }
440 .other-formats span + span:before { content: "| "; }
440 .other-formats span + span:before { content: "| "; }
441
441
442 a.atom { background: url(../images/feed.png) no-repeat 1px 50%; padding: 2px 0px 3px 16px; }
442 a.atom { background: url(../images/feed.png) no-repeat 1px 50%; padding: 2px 0px 3px 16px; }
443
443
444 /* Project members tab */
444 /* Project members tab */
445 div#tab-content-members .splitcontentleft, div#tab-content-memberships .splitcontentleft, div#tab-content-users .splitcontentleft { width: 64% }
445 div#tab-content-members .splitcontentleft, div#tab-content-memberships .splitcontentleft, div#tab-content-users .splitcontentleft { width: 64% }
446 div#tab-content-members .splitcontentright, div#tab-content-memberships .splitcontentright, div#tab-content-users .splitcontentright { width: 34% }
446 div#tab-content-members .splitcontentright, div#tab-content-memberships .splitcontentright, div#tab-content-users .splitcontentright { width: 34% }
447 div#tab-content-members fieldset, div#tab-content-memberships fieldset, div#tab-content-users fieldset { padding:1em; margin-bottom: 1em; }
447 div#tab-content-members fieldset, div#tab-content-memberships fieldset, div#tab-content-users fieldset { padding:1em; margin-bottom: 1em; }
448 div#tab-content-members fieldset legend, div#tab-content-memberships fieldset legend, div#tab-content-users fieldset legend { font-weight: bold; }
448 div#tab-content-members fieldset legend, div#tab-content-memberships fieldset legend, div#tab-content-users fieldset legend { font-weight: bold; }
449 div#tab-content-members fieldset label, div#tab-content-memberships fieldset label, div#tab-content-users fieldset label { display: block; }
449 div#tab-content-members fieldset label, div#tab-content-memberships fieldset label, div#tab-content-users fieldset label { display: block; }
450 div#tab-content-members fieldset div, div#tab-content-users fieldset div { max-height: 400px; overflow:auto; }
450 div#tab-content-members fieldset div, div#tab-content-users fieldset div { max-height: 400px; overflow:auto; }
451
451
452 table.members td.group { padding-left: 20px; background: url(../images/group.png) no-repeat 0% 50%; }
452 table.members td.group { padding-left: 20px; background: url(../images/group.png) no-repeat 0% 50%; }
453
453
454 input#principal_search, input#user_search {width:100%}
454 input#principal_search, input#user_search {width:100%}
455
455
456 * html div#tab-content-members fieldset div { height: 450px; }
456 * html div#tab-content-members fieldset div { height: 450px; }
457
457
458 /***** Flash & error messages ****/
458 /***** Flash & error messages ****/
459 #errorExplanation, div.flash, .nodata, .warning {
459 #errorExplanation, div.flash, .nodata, .warning {
460 padding: 4px 4px 4px 30px;
460 padding: 4px 4px 4px 30px;
461 margin-bottom: 12px;
461 margin-bottom: 12px;
462 font-size: 1.1em;
462 font-size: 1.1em;
463 border: 2px solid;
463 border: 2px solid;
464 }
464 }
465
465
466 div.flash {margin-top: 8px;}
466 div.flash {margin-top: 8px;}
467
467
468 div.flash.error, #errorExplanation {
468 div.flash.error, #errorExplanation {
469 background: url(../images/exclamation.png) 8px 50% no-repeat;
469 background: url(../images/exclamation.png) 8px 50% no-repeat;
470 background-color: #ffe3e3;
470 background-color: #ffe3e3;
471 border-color: #dd0000;
471 border-color: #dd0000;
472 color: #880000;
472 color: #880000;
473 }
473 }
474
474
475 div.flash.notice {
475 div.flash.notice {
476 background: url(../images/true.png) 8px 5px no-repeat;
476 background: url(../images/true.png) 8px 5px no-repeat;
477 background-color: #dfffdf;
477 background-color: #dfffdf;
478 border-color: #9fcf9f;
478 border-color: #9fcf9f;
479 color: #005f00;
479 color: #005f00;
480 }
480 }
481
481
482 div.flash.warning {
482 div.flash.warning {
483 background: url(../images/warning.png) 8px 5px no-repeat;
483 background: url(../images/warning.png) 8px 5px no-repeat;
484 background-color: #FFEBC1;
484 background-color: #FFEBC1;
485 border-color: #FDBF3B;
485 border-color: #FDBF3B;
486 color: #A6750C;
486 color: #A6750C;
487 text-align: left;
487 text-align: left;
488 }
488 }
489
489
490 .nodata, .warning {
490 .nodata, .warning {
491 text-align: center;
491 text-align: center;
492 background-color: #FFEBC1;
492 background-color: #FFEBC1;
493 border-color: #FDBF3B;
493 border-color: #FDBF3B;
494 color: #A6750C;
494 color: #A6750C;
495 }
495 }
496
496
497 #errorExplanation ul { font-size: 0.9em;}
497 #errorExplanation ul { font-size: 0.9em;}
498 #errorExplanation h2, #errorExplanation p { display: none; }
498 #errorExplanation h2, #errorExplanation p { display: none; }
499
499
500 /***** Ajax indicator ******/
500 /***** Ajax indicator ******/
501 #ajax-indicator {
501 #ajax-indicator {
502 position: absolute; /* fixed not supported by IE */
502 position: absolute; /* fixed not supported by IE */
503 background-color:#eee;
503 background-color:#eee;
504 border: 1px solid #bbb;
504 border: 1px solid #bbb;
505 top:35%;
505 top:35%;
506 left:40%;
506 left:40%;
507 width:20%;
507 width:20%;
508 font-weight:bold;
508 font-weight:bold;
509 text-align:center;
509 text-align:center;
510 padding:0.6em;
510 padding:0.6em;
511 z-index:100;
511 z-index:100;
512 filter:alpha(opacity=50);
512 filter:alpha(opacity=50);
513 opacity: 0.5;
513 opacity: 0.5;
514 }
514 }
515
515
516 html>body #ajax-indicator { position: fixed; }
516 html>body #ajax-indicator { position: fixed; }
517
517
518 #ajax-indicator span {
518 #ajax-indicator span {
519 background-position: 0% 40%;
519 background-position: 0% 40%;
520 background-repeat: no-repeat;
520 background-repeat: no-repeat;
521 background-image: url(../images/loading.gif);
521 background-image: url(../images/loading.gif);
522 padding-left: 26px;
522 padding-left: 26px;
523 vertical-align: bottom;
523 vertical-align: bottom;
524 }
524 }
525
525
526 /***** Calendar *****/
526 /***** Calendar *****/
527 table.cal {border-collapse: collapse; width: 100%; margin: 0px 0 6px 0;border: 1px solid #d7d7d7;}
527 table.cal {border-collapse: collapse; width: 100%; margin: 0px 0 6px 0;border: 1px solid #d7d7d7;}
528 table.cal thead th {width: 14%; background-color:#EEEEEE; padding: 4px; }
528 table.cal thead th {width: 14%; background-color:#EEEEEE; padding: 4px; }
529 table.cal thead th.week-number {width: auto;}
529 table.cal thead th.week-number {width: auto;}
530 table.cal tbody tr {height: 100px;}
530 table.cal tbody tr {height: 100px;}
531 table.cal td {border: 1px solid #d7d7d7; vertical-align: top; font-size: 0.9em;}
531 table.cal td {border: 1px solid #d7d7d7; vertical-align: top; font-size: 0.9em;}
532 table.cal td.week-number { background-color:#EEEEEE; padding: 4px; border:none; font-size: 1em;}
532 table.cal td.week-number { background-color:#EEEEEE; padding: 4px; border:none; font-size: 1em;}
533 table.cal td p.day-num {font-size: 1.1em; text-align:right;}
533 table.cal td p.day-num {font-size: 1.1em; text-align:right;}
534 table.cal td.odd p.day-num {color: #bbb;}
534 table.cal td.odd p.day-num {color: #bbb;}
535 table.cal td.today {background:#ffffdd;}
535 table.cal td.today {background:#ffffdd;}
536 table.cal td.today p.day-num {font-weight: bold;}
536 table.cal td.today p.day-num {font-weight: bold;}
537 table.cal .starting a, p.cal.legend .starting {background: url(../images/bullet_go.png) no-repeat -1px -2px; padding-left:16px;}
537 table.cal .starting a, p.cal.legend .starting {background: url(../images/bullet_go.png) no-repeat -1px -2px; padding-left:16px;}
538 table.cal .ending a, p.cal.legend .ending {background: url(../images/bullet_end.png) no-repeat -1px -2px; padding-left:16px;}
538 table.cal .ending a, p.cal.legend .ending {background: url(../images/bullet_end.png) no-repeat -1px -2px; padding-left:16px;}
539 table.cal .starting.ending a, p.cal.legend .starting.ending {background: url(../images/bullet_diamond.png) no-repeat -1px -2px; padding-left:16px;}
539 table.cal .starting.ending a, p.cal.legend .starting.ending {background: url(../images/bullet_diamond.png) no-repeat -1px -2px; padding-left:16px;}
540 p.cal.legend span {display:block;}
540 p.cal.legend span {display:block;}
541
541
542 /***** Tooltips ******/
542 /***** Tooltips ******/
543 .tooltip{position:relative;z-index:24;}
543 .tooltip{position:relative;z-index:24;}
544 .tooltip:hover{z-index:25;color:#000;}
544 .tooltip:hover{z-index:25;color:#000;}
545 .tooltip span.tip{display: none; text-align:left;}
545 .tooltip span.tip{display: none; text-align:left;}
546
546
547 div.tooltip:hover span.tip{
547 div.tooltip:hover span.tip{
548 display:block;
548 display:block;
549 position:absolute;
549 position:absolute;
550 top:12px; left:24px; width:270px;
550 top:12px; left:24px; width:270px;
551 border:1px solid #555;
551 border:1px solid #555;
552 background-color:#fff;
552 background-color:#fff;
553 padding: 4px;
553 padding: 4px;
554 font-size: 0.8em;
554 font-size: 0.8em;
555 color:#505050;
555 color:#505050;
556 }
556 }
557
557
558 /***** Progress bar *****/
558 /***** Progress bar *****/
559 table.progress {
559 table.progress {
560 border: 1px solid #D7D7D7;
560 border: 1px solid #D7D7D7;
561 border-collapse: collapse;
561 border-collapse: collapse;
562 border-spacing: 0pt;
562 border-spacing: 0pt;
563 empty-cells: show;
563 empty-cells: show;
564 text-align: center;
564 text-align: center;
565 float:left;
565 float:left;
566 margin: 1px 6px 1px 0px;
566 margin: 1px 6px 1px 0px;
567 }
567 }
568
568
569 table.progress td { height: 0.9em; }
569 table.progress td { height: 0.9em; }
570 table.progress td.closed { background: #BAE0BA none repeat scroll 0%; }
570 table.progress td.closed { background: #BAE0BA none repeat scroll 0%; }
571 table.progress td.done { background: #DEF0DE none repeat scroll 0%; }
571 table.progress td.done { background: #DEF0DE none repeat scroll 0%; }
572 table.progress td.open { background: #FFF none repeat scroll 0%; }
572 table.progress td.open { background: #FFF none repeat scroll 0%; }
573 p.pourcent {font-size: 80%;}
573 p.pourcent {font-size: 80%;}
574 p.progress-info {clear: left; font-style: italic; font-size: 80%;}
574 p.progress-info {clear: left; font-style: italic; font-size: 80%;}
575
575
576 /***** Tabs *****/
576 /***** Tabs *****/
577 #content .tabs {height: 2.6em; margin-bottom:1.2em; position:relative; overflow:hidden;}
577 #content .tabs {height: 2.6em; margin-bottom:1.2em; position:relative; overflow:hidden;}
578 #content .tabs ul {margin:0; position:absolute; bottom:0; padding-left:1em; width: 2000px; border-bottom: 1px solid #bbbbbb;}
578 #content .tabs ul {margin:0; position:absolute; bottom:0; padding-left:1em; width: 2000px; border-bottom: 1px solid #bbbbbb;}
579 #content .tabs ul li {
579 #content .tabs ul li {
580 float:left;
580 float:left;
581 list-style-type:none;
581 list-style-type:none;
582 white-space:nowrap;
582 white-space:nowrap;
583 margin-right:8px;
583 margin-right:8px;
584 background:#fff;
584 background:#fff;
585 position:relative;
585 position:relative;
586 margin-bottom:-1px;
586 margin-bottom:-1px;
587 }
587 }
588 #content .tabs ul li a{
588 #content .tabs ul li a{
589 display:block;
589 display:block;
590 font-size: 0.9em;
590 font-size: 0.9em;
591 text-decoration:none;
591 text-decoration:none;
592 line-height:1.3em;
592 line-height:1.3em;
593 padding:4px 6px 4px 6px;
593 padding:4px 6px 4px 6px;
594 border: 1px solid #ccc;
594 border: 1px solid #ccc;
595 border-bottom: 1px solid #bbbbbb;
595 border-bottom: 1px solid #bbbbbb;
596 background-color: #eeeeee;
596 background-color: #eeeeee;
597 color:#777;
597 color:#777;
598 font-weight:bold;
598 font-weight:bold;
599 }
599 }
600
600
601 #content .tabs ul li a:hover {
601 #content .tabs ul li a:hover {
602 background-color: #ffffdd;
602 background-color: #ffffdd;
603 text-decoration:none;
603 text-decoration:none;
604 }
604 }
605
605
606 #content .tabs ul li a.selected {
606 #content .tabs ul li a.selected {
607 background-color: #fff;
607 background-color: #fff;
608 border: 1px solid #bbbbbb;
608 border: 1px solid #bbbbbb;
609 border-bottom: 1px solid #fff;
609 border-bottom: 1px solid #fff;
610 }
610 }
611
611
612 #content .tabs ul li a.selected:hover {
612 #content .tabs ul li a.selected:hover {
613 background-color: #fff;
613 background-color: #fff;
614 }
614 }
615
615
616 div.tabs-buttons { position:absolute; right: 0; width: 48px; height: 24px; background: white; bottom: 0; border-bottom: 1px solid #bbbbbb; }
616 div.tabs-buttons { position:absolute; right: 0; width: 48px; height: 24px; background: white; bottom: 0; border-bottom: 1px solid #bbbbbb; }
617
617
618 button.tab-left, button.tab-right {
618 button.tab-left, button.tab-right {
619 font-size: 0.9em;
619 font-size: 0.9em;
620 cursor: pointer;
620 cursor: pointer;
621 height:24px;
621 height:24px;
622 border: 1px solid #ccc;
622 border: 1px solid #ccc;
623 border-bottom: 1px solid #bbbbbb;
623 border-bottom: 1px solid #bbbbbb;
624 position:absolute;
624 position:absolute;
625 padding:4px;
625 padding:4px;
626 width: 20px;
626 width: 20px;
627 bottom: -1px;
627 bottom: -1px;
628 }
628 }
629
629
630 button.tab-left {
630 button.tab-left {
631 right: 20px;
631 right: 20px;
632 background: #eeeeee url(../images/bullet_arrow_left.png) no-repeat 50% 50%;
632 background: #eeeeee url(../images/bullet_arrow_left.png) no-repeat 50% 50%;
633 }
633 }
634
634
635 button.tab-right {
635 button.tab-right {
636 right: 0;
636 right: 0;
637 background: #eeeeee url(../images/bullet_arrow_right.png) no-repeat 50% 50%;
637 background: #eeeeee url(../images/bullet_arrow_right.png) no-repeat 50% 50%;
638 }
638 }
639
639
640 /***** Auto-complete *****/
640 /***** Auto-complete *****/
641 div.autocomplete {
641 div.autocomplete {
642 position:absolute;
642 position:absolute;
643 width:400px;
643 width:400px;
644 margin:0;
644 margin:0;
645 padding:0;
645 padding:0;
646 }
646 }
647 div.autocomplete ul {
647 div.autocomplete ul {
648 list-style-type:none;
648 list-style-type:none;
649 margin:0;
649 margin:0;
650 padding:0;
650 padding:0;
651 }
651 }
652 div.autocomplete ul li {
652 div.autocomplete ul li {
653 list-style-type:none;
653 list-style-type:none;
654 display:block;
654 display:block;
655 margin:-1px 0 0 0;
655 margin:-1px 0 0 0;
656 padding:2px;
656 padding:2px;
657 cursor:pointer;
657 cursor:pointer;
658 font-size: 90%;
658 font-size: 90%;
659 border: 1px solid #ccc;
659 border: 1px solid #ccc;
660 border-left: 1px solid #ccc;
660 border-left: 1px solid #ccc;
661 border-right: 1px solid #ccc;
661 border-right: 1px solid #ccc;
662 background-color:white;
662 background-color:white;
663 }
663 }
664 div.autocomplete ul li.selected { background-color: #ffb;}
664 div.autocomplete ul li.selected { background-color: #ffb;}
665 div.autocomplete ul li span.informal {
665 div.autocomplete ul li span.informal {
666 font-size: 80%;
666 font-size: 80%;
667 color: #aaa;
667 color: #aaa;
668 }
668 }
669
669
670 #parent_issue_candidates ul li {width: 500px;}
670 #parent_issue_candidates ul li {width: 500px;}
671 #related_issue_candidates ul li {width: 500px;}
671 #related_issue_candidates ul li {width: 500px;}
672
672
673 /***** Diff *****/
673 /***** Diff *****/
674 .diff_out { background: #fcc; }
674 .diff_out { background: #fcc; }
675 .diff_out span { background: #faa; }
675 .diff_in { background: #cfc; }
676 .diff_in { background: #cfc; }
677 .diff_in span { background: #afa; }
676
678
677 .text-diff {
679 .text-diff {
678 padding: 1em;
680 padding: 1em;
679 background-color:#f6f6f6;
681 background-color:#f6f6f6;
680 color:#505050;
682 color:#505050;
681 border: 1px solid #e4e4e4;
683 border: 1px solid #e4e4e4;
682 }
684 }
683
685
684 /***** Wiki *****/
686 /***** Wiki *****/
685 div.wiki table {
687 div.wiki table {
686 border: 1px solid #505050;
688 border: 1px solid #505050;
687 border-collapse: collapse;
689 border-collapse: collapse;
688 margin-bottom: 1em;
690 margin-bottom: 1em;
689 }
691 }
690
692
691 div.wiki table, div.wiki td, div.wiki th {
693 div.wiki table, div.wiki td, div.wiki th {
692 border: 1px solid #bbb;
694 border: 1px solid #bbb;
693 padding: 4px;
695 padding: 4px;
694 }
696 }
695
697
696 div.wiki .external {
698 div.wiki .external {
697 background-position: 0% 60%;
699 background-position: 0% 60%;
698 background-repeat: no-repeat;
700 background-repeat: no-repeat;
699 padding-left: 12px;
701 padding-left: 12px;
700 background-image: url(../images/external.png);
702 background-image: url(../images/external.png);
701 }
703 }
702
704
703 div.wiki a.new {
705 div.wiki a.new {
704 color: #b73535;
706 color: #b73535;
705 }
707 }
706
708
707 div.wiki pre {
709 div.wiki pre {
708 margin: 1em 1em 1em 1.6em;
710 margin: 1em 1em 1em 1.6em;
709 padding: 2px 2px 2px 0;
711 padding: 2px 2px 2px 0;
710 background-color: #fafafa;
712 background-color: #fafafa;
711 border: 1px solid #dadada;
713 border: 1px solid #dadada;
712 width:auto;
714 width:auto;
713 overflow-x: auto;
715 overflow-x: auto;
714 overflow-y: hidden;
716 overflow-y: hidden;
715 }
717 }
716
718
717 div.wiki ul.toc {
719 div.wiki ul.toc {
718 background-color: #ffffdd;
720 background-color: #ffffdd;
719 border: 1px solid #e4e4e4;
721 border: 1px solid #e4e4e4;
720 padding: 4px;
722 padding: 4px;
721 line-height: 1.2em;
723 line-height: 1.2em;
722 margin-bottom: 12px;
724 margin-bottom: 12px;
723 margin-right: 12px;
725 margin-right: 12px;
724 margin-left: 0;
726 margin-left: 0;
725 display: table
727 display: table
726 }
728 }
727 * html div.wiki ul.toc { width: 50%; } /* IE6 doesn't autosize div */
729 * html div.wiki ul.toc { width: 50%; } /* IE6 doesn't autosize div */
728
730
729 div.wiki ul.toc.right { float: right; margin-left: 12px; margin-right: 0; width: auto; }
731 div.wiki ul.toc.right { float: right; margin-left: 12px; margin-right: 0; width: auto; }
730 div.wiki ul.toc.left { float: left; margin-right: 12px; margin-left: 0; width: auto; }
732 div.wiki ul.toc.left { float: left; margin-right: 12px; margin-left: 0; width: auto; }
731 div.wiki ul.toc ul { margin: 0; padding: 0; }
733 div.wiki ul.toc ul { margin: 0; padding: 0; }
732 div.wiki ul.toc li { list-style-type:none; margin: 0;}
734 div.wiki ul.toc li { list-style-type:none; margin: 0;}
733 div.wiki ul.toc li li { margin-left: 1.5em; }
735 div.wiki ul.toc li li { margin-left: 1.5em; }
734 div.wiki ul.toc li li li { font-size: 0.8em; }
736 div.wiki ul.toc li li li { font-size: 0.8em; }
735
737
736 div.wiki ul.toc a {
738 div.wiki ul.toc a {
737 font-size: 0.9em;
739 font-size: 0.9em;
738 font-weight: normal;
740 font-weight: normal;
739 text-decoration: none;
741 text-decoration: none;
740 color: #606060;
742 color: #606060;
741 }
743 }
742 div.wiki ul.toc a:hover { color: #c61a1a; text-decoration: underline;}
744 div.wiki ul.toc a:hover { color: #c61a1a; text-decoration: underline;}
743
745
744 a.wiki-anchor { display: none; margin-left: 6px; text-decoration: none; }
746 a.wiki-anchor { display: none; margin-left: 6px; text-decoration: none; }
745 a.wiki-anchor:hover { color: #aaa !important; text-decoration: none; }
747 a.wiki-anchor:hover { color: #aaa !important; text-decoration: none; }
746 h1:hover a.wiki-anchor, h2:hover a.wiki-anchor, h3:hover a.wiki-anchor { display: inline; color: #ddd; }
748 h1:hover a.wiki-anchor, h2:hover a.wiki-anchor, h3:hover a.wiki-anchor { display: inline; color: #ddd; }
747
749
748 div.wiki img { vertical-align: middle; }
750 div.wiki img { vertical-align: middle; }
749
751
750 /***** My page layout *****/
752 /***** My page layout *****/
751 .block-receiver {
753 .block-receiver {
752 border:1px dashed #c0c0c0;
754 border:1px dashed #c0c0c0;
753 margin-bottom: 20px;
755 margin-bottom: 20px;
754 padding: 15px 0 15px 0;
756 padding: 15px 0 15px 0;
755 }
757 }
756
758
757 .mypage-box {
759 .mypage-box {
758 margin:0 0 20px 0;
760 margin:0 0 20px 0;
759 color:#505050;
761 color:#505050;
760 line-height:1.5em;
762 line-height:1.5em;
761 }
763 }
762
764
763 .handle {
765 .handle {
764 cursor: move;
766 cursor: move;
765 }
767 }
766
768
767 a.close-icon {
769 a.close-icon {
768 display:block;
770 display:block;
769 margin-top:3px;
771 margin-top:3px;
770 overflow:hidden;
772 overflow:hidden;
771 width:12px;
773 width:12px;
772 height:12px;
774 height:12px;
773 background-repeat: no-repeat;
775 background-repeat: no-repeat;
774 cursor:pointer;
776 cursor:pointer;
775 background-image:url('../images/close.png');
777 background-image:url('../images/close.png');
776 }
778 }
777
779
778 a.close-icon:hover {
780 a.close-icon:hover {
779 background-image:url('../images/close_hl.png');
781 background-image:url('../images/close_hl.png');
780 }
782 }
781
783
782 /***** Gantt chart *****/
784 /***** Gantt chart *****/
783 .gantt_hdr {
785 .gantt_hdr {
784 position:absolute;
786 position:absolute;
785 top:0;
787 top:0;
786 height:16px;
788 height:16px;
787 border-top: 1px solid #c0c0c0;
789 border-top: 1px solid #c0c0c0;
788 border-bottom: 1px solid #c0c0c0;
790 border-bottom: 1px solid #c0c0c0;
789 border-right: 1px solid #c0c0c0;
791 border-right: 1px solid #c0c0c0;
790 text-align: center;
792 text-align: center;
791 overflow: hidden;
793 overflow: hidden;
792 }
794 }
793
795
794 .gantt_subjects { font-size: 0.8em; }
796 .gantt_subjects { font-size: 0.8em; }
795 .gantt_subjects div { line-height:16px;height:16px;overflow:hidden;white-space:nowrap;text-overflow: ellipsis; }
797 .gantt_subjects div { line-height:16px;height:16px;overflow:hidden;white-space:nowrap;text-overflow: ellipsis; }
796
798
797 .task {
799 .task {
798 position: absolute;
800 position: absolute;
799 height:8px;
801 height:8px;
800 font-size:0.8em;
802 font-size:0.8em;
801 color:#888;
803 color:#888;
802 padding:0;
804 padding:0;
803 margin:0;
805 margin:0;
804 line-height:16px;
806 line-height:16px;
805 white-space:nowrap;
807 white-space:nowrap;
806 }
808 }
807
809
808 .task.label {width:100%;}
810 .task.label {width:100%;}
809 .task.label.project, .task.label.version { font-weight: bold; }
811 .task.label.project, .task.label.version { font-weight: bold; }
810
812
811 .task_late { background:#f66 url(../images/task_late.png); border: 1px solid #f66; }
813 .task_late { background:#f66 url(../images/task_late.png); border: 1px solid #f66; }
812 .task_done { background:#00c600 url(../images/task_done.png); border: 1px solid #00c600; }
814 .task_done { background:#00c600 url(../images/task_done.png); border: 1px solid #00c600; }
813 .task_todo { background:#aaa url(../images/task_todo.png); border: 1px solid #aaa; }
815 .task_todo { background:#aaa url(../images/task_todo.png); border: 1px solid #aaa; }
814
816
815 .task_todo.parent { background: #888; border: 1px solid #888; height: 3px;}
817 .task_todo.parent { background: #888; border: 1px solid #888; height: 3px;}
816 .task_late.parent, .task_done.parent { height: 3px;}
818 .task_late.parent, .task_done.parent { height: 3px;}
817 .task.parent.marker.starting { position: absolute; background: url(../images/task_parent_end.png) no-repeat 0 0; width: 8px; height: 16px; margin-left: -4px; left: 0px; top: -1px;}
819 .task.parent.marker.starting { position: absolute; background: url(../images/task_parent_end.png) no-repeat 0 0; width: 8px; height: 16px; margin-left: -4px; left: 0px; top: -1px;}
818 .task.parent.marker.ending { position: absolute; background: url(../images/task_parent_end.png) no-repeat 0 0; width: 8px; height: 16px; margin-left: -4px; right: 0px; top: -1px;}
820 .task.parent.marker.ending { position: absolute; background: url(../images/task_parent_end.png) no-repeat 0 0; width: 8px; height: 16px; margin-left: -4px; right: 0px; top: -1px;}
819
821
820 .version.task_late { background:#f66 url(../images/milestone_late.png); border: 1px solid #f66; height: 2px; margin-top: 3px;}
822 .version.task_late { background:#f66 url(../images/milestone_late.png); border: 1px solid #f66; height: 2px; margin-top: 3px;}
821 .version.task_done { background:#00c600 url(../images/milestone_done.png); border: 1px solid #00c600; height: 2px; margin-top: 3px;}
823 .version.task_done { background:#00c600 url(../images/milestone_done.png); border: 1px solid #00c600; height: 2px; margin-top: 3px;}
822 .version.task_todo { background:#fff url(../images/milestone_todo.png); border: 1px solid #fff; height: 2px; margin-top: 3px;}
824 .version.task_todo { background:#fff url(../images/milestone_todo.png); border: 1px solid #fff; height: 2px; margin-top: 3px;}
823 .version.marker { background-image:url(../images/version_marker.png); background-repeat: no-repeat; border: 0; margin-left: -4px; margin-top: 1px; }
825 .version.marker { background-image:url(../images/version_marker.png); background-repeat: no-repeat; border: 0; margin-left: -4px; margin-top: 1px; }
824
826
825 .project.task_late { background:#f66 url(../images/milestone_late.png); border: 1px solid #f66; height: 2px; margin-top: 3px;}
827 .project.task_late { background:#f66 url(../images/milestone_late.png); border: 1px solid #f66; height: 2px; margin-top: 3px;}
826 .project.task_done { background:#00c600 url(../images/milestone_done.png); border: 1px solid #00c600; height: 2px; margin-top: 3px;}
828 .project.task_done { background:#00c600 url(../images/milestone_done.png); border: 1px solid #00c600; height: 2px; margin-top: 3px;}
827 .project.task_todo { background:#fff url(../images/milestone_todo.png); border: 1px solid #fff; height: 2px; margin-top: 3px;}
829 .project.task_todo { background:#fff url(../images/milestone_todo.png); border: 1px solid #fff; height: 2px; margin-top: 3px;}
828 .project.marker { background-image:url(../images/project_marker.png); background-repeat: no-repeat; border: 0; margin-left: -4px; margin-top: 1px; }
830 .project.marker { background-image:url(../images/project_marker.png); background-repeat: no-repeat; border: 0; margin-left: -4px; margin-top: 1px; }
829
831
830 .version-behind-schedule a, .issue-behind-schedule a {color: #f66914;}
832 .version-behind-schedule a, .issue-behind-schedule a {color: #f66914;}
831 .version-overdue a, .issue-overdue a, .project-overdue a {color: #f00;}
833 .version-overdue a, .issue-overdue a, .project-overdue a {color: #f00;}
832
834
833 /***** Icons *****/
835 /***** Icons *****/
834 .icon {
836 .icon {
835 background-position: 0% 50%;
837 background-position: 0% 50%;
836 background-repeat: no-repeat;
838 background-repeat: no-repeat;
837 padding-left: 20px;
839 padding-left: 20px;
838 padding-top: 2px;
840 padding-top: 2px;
839 padding-bottom: 3px;
841 padding-bottom: 3px;
840 }
842 }
841
843
842 .icon-add { background-image: url(../images/add.png); }
844 .icon-add { background-image: url(../images/add.png); }
843 .icon-edit { background-image: url(../images/edit.png); }
845 .icon-edit { background-image: url(../images/edit.png); }
844 .icon-copy { background-image: url(../images/copy.png); }
846 .icon-copy { background-image: url(../images/copy.png); }
845 .icon-duplicate { background-image: url(../images/duplicate.png); }
847 .icon-duplicate { background-image: url(../images/duplicate.png); }
846 .icon-del { background-image: url(../images/delete.png); }
848 .icon-del { background-image: url(../images/delete.png); }
847 .icon-move { background-image: url(../images/move.png); }
849 .icon-move { background-image: url(../images/move.png); }
848 .icon-save { background-image: url(../images/save.png); }
850 .icon-save { background-image: url(../images/save.png); }
849 .icon-cancel { background-image: url(../images/cancel.png); }
851 .icon-cancel { background-image: url(../images/cancel.png); }
850 .icon-multiple { background-image: url(../images/table_multiple.png); }
852 .icon-multiple { background-image: url(../images/table_multiple.png); }
851 .icon-folder { background-image: url(../images/folder.png); }
853 .icon-folder { background-image: url(../images/folder.png); }
852 .open .icon-folder { background-image: url(../images/folder_open.png); }
854 .open .icon-folder { background-image: url(../images/folder_open.png); }
853 .icon-package { background-image: url(../images/package.png); }
855 .icon-package { background-image: url(../images/package.png); }
854 .icon-user { background-image: url(../images/user.png); }
856 .icon-user { background-image: url(../images/user.png); }
855 .icon-projects { background-image: url(../images/projects.png); }
857 .icon-projects { background-image: url(../images/projects.png); }
856 .icon-help { background-image: url(../images/help.png); }
858 .icon-help { background-image: url(../images/help.png); }
857 .icon-attachment { background-image: url(../images/attachment.png); }
859 .icon-attachment { background-image: url(../images/attachment.png); }
858 .icon-history { background-image: url(../images/history.png); }
860 .icon-history { background-image: url(../images/history.png); }
859 .icon-time { background-image: url(../images/time.png); }
861 .icon-time { background-image: url(../images/time.png); }
860 .icon-time-add { background-image: url(../images/time_add.png); }
862 .icon-time-add { background-image: url(../images/time_add.png); }
861 .icon-stats { background-image: url(../images/stats.png); }
863 .icon-stats { background-image: url(../images/stats.png); }
862 .icon-warning { background-image: url(../images/warning.png); }
864 .icon-warning { background-image: url(../images/warning.png); }
863 .icon-fav { background-image: url(../images/fav.png); }
865 .icon-fav { background-image: url(../images/fav.png); }
864 .icon-fav-off { background-image: url(../images/fav_off.png); }
866 .icon-fav-off { background-image: url(../images/fav_off.png); }
865 .icon-reload { background-image: url(../images/reload.png); }
867 .icon-reload { background-image: url(../images/reload.png); }
866 .icon-lock { background-image: url(../images/locked.png); }
868 .icon-lock { background-image: url(../images/locked.png); }
867 .icon-unlock { background-image: url(../images/unlock.png); }
869 .icon-unlock { background-image: url(../images/unlock.png); }
868 .icon-checked { background-image: url(../images/true.png); }
870 .icon-checked { background-image: url(../images/true.png); }
869 .icon-details { background-image: url(../images/zoom_in.png); }
871 .icon-details { background-image: url(../images/zoom_in.png); }
870 .icon-report { background-image: url(../images/report.png); }
872 .icon-report { background-image: url(../images/report.png); }
871 .icon-comment { background-image: url(../images/comment.png); }
873 .icon-comment { background-image: url(../images/comment.png); }
872 .icon-summary { background-image: url(../images/lightning.png); }
874 .icon-summary { background-image: url(../images/lightning.png); }
873 .icon-server-authentication { background-image: url(../images/server_key.png); }
875 .icon-server-authentication { background-image: url(../images/server_key.png); }
874 .icon-issue { background-image: url(../images/ticket.png); }
876 .icon-issue { background-image: url(../images/ticket.png); }
875 .icon-zoom-in { background-image: url(../images/zoom_in.png); }
877 .icon-zoom-in { background-image: url(../images/zoom_in.png); }
876 .icon-zoom-out { background-image: url(../images/zoom_out.png); }
878 .icon-zoom-out { background-image: url(../images/zoom_out.png); }
877
879
878 .icon-file { background-image: url(../images/files/default.png); }
880 .icon-file { background-image: url(../images/files/default.png); }
879 .icon-file.text-plain { background-image: url(../images/files/text.png); }
881 .icon-file.text-plain { background-image: url(../images/files/text.png); }
880 .icon-file.text-x-c { background-image: url(../images/files/c.png); }
882 .icon-file.text-x-c { background-image: url(../images/files/c.png); }
881 .icon-file.text-x-csharp { background-image: url(../images/files/csharp.png); }
883 .icon-file.text-x-csharp { background-image: url(../images/files/csharp.png); }
882 .icon-file.text-x-php { background-image: url(../images/files/php.png); }
884 .icon-file.text-x-php { background-image: url(../images/files/php.png); }
883 .icon-file.text-x-ruby { background-image: url(../images/files/ruby.png); }
885 .icon-file.text-x-ruby { background-image: url(../images/files/ruby.png); }
884 .icon-file.text-xml { background-image: url(../images/files/xml.png); }
886 .icon-file.text-xml { background-image: url(../images/files/xml.png); }
885 .icon-file.image-gif { background-image: url(../images/files/image.png); }
887 .icon-file.image-gif { background-image: url(../images/files/image.png); }
886 .icon-file.image-jpeg { background-image: url(../images/files/image.png); }
888 .icon-file.image-jpeg { background-image: url(../images/files/image.png); }
887 .icon-file.image-png { background-image: url(../images/files/image.png); }
889 .icon-file.image-png { background-image: url(../images/files/image.png); }
888 .icon-file.image-tiff { background-image: url(../images/files/image.png); }
890 .icon-file.image-tiff { background-image: url(../images/files/image.png); }
889 .icon-file.application-pdf { background-image: url(../images/files/pdf.png); }
891 .icon-file.application-pdf { background-image: url(../images/files/pdf.png); }
890 .icon-file.application-zip { background-image: url(../images/files/zip.png); }
892 .icon-file.application-zip { background-image: url(../images/files/zip.png); }
891 .icon-file.application-x-gzip { background-image: url(../images/files/zip.png); }
893 .icon-file.application-x-gzip { background-image: url(../images/files/zip.png); }
892
894
893 img.gravatar {
895 img.gravatar {
894 padding: 2px;
896 padding: 2px;
895 border: solid 1px #d5d5d5;
897 border: solid 1px #d5d5d5;
896 background: #fff;
898 background: #fff;
897 }
899 }
898
900
899 div.issue img.gravatar {
901 div.issue img.gravatar {
900 float: right;
902 float: right;
901 margin: 0 0 0 1em;
903 margin: 0 0 0 1em;
902 padding: 5px;
904 padding: 5px;
903 }
905 }
904
906
905 div.issue table img.gravatar {
907 div.issue table img.gravatar {
906 height: 14px;
908 height: 14px;
907 width: 14px;
909 width: 14px;
908 padding: 2px;
910 padding: 2px;
909 float: left;
911 float: left;
910 margin: 0 0.5em 0 0;
912 margin: 0 0.5em 0 0;
911 }
913 }
912
914
913 h2 img.gravatar {
915 h2 img.gravatar {
914 padding: 3px;
916 padding: 3px;
915 margin: -2px 4px -4px 0;
917 margin: -2px 4px -4px 0;
916 vertical-align: top;
918 vertical-align: top;
917 }
919 }
918
920
919 h4 img.gravatar {
921 h4 img.gravatar {
920 padding: 3px;
922 padding: 3px;
921 margin: -6px 0 -4px 0;
923 margin: -6px 0 -4px 0;
922 vertical-align: top;
924 vertical-align: top;
923 }
925 }
924
926
925 td.username img.gravatar {
927 td.username img.gravatar {
926 margin: 0 0.5em 0 0;
928 margin: 0 0.5em 0 0;
927 vertical-align: top;
929 vertical-align: top;
928 }
930 }
929
931
930 #activity dt img.gravatar {
932 #activity dt img.gravatar {
931 float: left;
933 float: left;
932 margin: 0 1em 1em 0;
934 margin: 0 1em 1em 0;
933 }
935 }
934
936
935 /* Used on 12px Gravatar img tags without the icon background */
937 /* Used on 12px Gravatar img tags without the icon background */
936 .icon-gravatar {
938 .icon-gravatar {
937 float: left;
939 float: left;
938 margin-right: 4px;
940 margin-right: 4px;
939 }
941 }
940
942
941 #activity dt,
943 #activity dt,
942 .journal {
944 .journal {
943 clear: left;
945 clear: left;
944 }
946 }
945
947
946 .journal-link {
948 .journal-link {
947 float: right;
949 float: right;
948 }
950 }
949
951
950 h2 img { vertical-align:middle; }
952 h2 img { vertical-align:middle; }
951
953
952 .hascontextmenu { cursor: context-menu; }
954 .hascontextmenu { cursor: context-menu; }
953
955
954 /***** Media print specific styles *****/
956 /***** Media print specific styles *****/
955 @media print {
957 @media print {
956 #top-menu, #header, #main-menu, #sidebar, #footer, .contextual, .other-formats { display:none; }
958 #top-menu, #header, #main-menu, #sidebar, #footer, .contextual, .other-formats { display:none; }
957 #main { background: #fff; }
959 #main { background: #fff; }
958 #content { width: 99%; margin: 0; padding: 0; border: 0; background: #fff; overflow: visible !important;}
960 #content { width: 99%; margin: 0; padding: 0; border: 0; background: #fff; overflow: visible !important;}
959 #wiki_add_attachment { display:none; }
961 #wiki_add_attachment { display:none; }
960 .hide-when-print { display: none; }
962 .hide-when-print { display: none; }
961 }
963 }
@@ -1,99 +1,156
1 # Redmine - project management software
1 # Redmine - project management software
2 # Copyright (C) 2006-2008 Jean-Philippe Lang
2 # Copyright (C) 2006-2011 Jean-Philippe Lang
3 #
3 #
4 # This program is free software; you can redistribute it and/or
4 # This program is free software; you can redistribute it and/or
5 # modify it under the terms of the GNU General Public License
5 # modify it under the terms of the GNU General Public License
6 # as published by the Free Software Foundation; either version 2
6 # as published by the Free Software Foundation; either version 2
7 # of the License, or (at your option) any later version.
7 # of the License, or (at your option) any later version.
8 #
8 #
9 # This program is distributed in the hope that it will be useful,
9 # This program is distributed in the hope that it will be useful,
10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 # GNU General Public License for more details.
12 # GNU General Public License for more details.
13 #
13 #
14 # You should have received a copy of the GNU General Public License
14 # You should have received a copy of the GNU General Public License
15 # along with this program; if not, write to the Free Software
15 # along with this program; if not, write to the Free Software
16 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
16 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
17
17
18 require File.expand_path('../../../../test_helper', __FILE__)
18 require File.expand_path('../../../../test_helper', __FILE__)
19
19
20 class Redmine::UnifiedDiffTest < ActiveSupport::TestCase
20 class Redmine::UnifiedDiffTest < ActiveSupport::TestCase
21
21
22 def setup
22 def setup
23 end
23 end
24
24
25 def test_subversion_diff
25 def test_subversion_diff
26 diff = Redmine::UnifiedDiff.new(read_diff_fixture('subversion.diff'))
26 diff = Redmine::UnifiedDiff.new(read_diff_fixture('subversion.diff'))
27 # number of files
27 # number of files
28 assert_equal 4, diff.size
28 assert_equal 4, diff.size
29 assert diff.detect {|file| file.file_name =~ %r{^config/settings.yml}}
29 assert diff.detect {|file| file.file_name =~ %r{^config/settings.yml}}
30 end
30 end
31
31
32 def test_truncate_diff
32 def test_truncate_diff
33 diff = Redmine::UnifiedDiff.new(read_diff_fixture('subversion.diff'), :max_lines => 20)
33 diff = Redmine::UnifiedDiff.new(read_diff_fixture('subversion.diff'), :max_lines => 20)
34 assert_equal 2, diff.size
34 assert_equal 2, diff.size
35 end
35 end
36
36
37 def test_inline_partials
38 diff = Redmine::UnifiedDiff.new(read_diff_fixture('partials.diff'))
39 assert_equal 1, diff.size
40 diff = diff.first
41 assert_equal 43, diff.size
42
43 assert_equal [51, -1], diff[0].offsets
44 assert_equal [51, -1], diff[1].offsets
45 assert_equal 'Lorem ipsum dolor sit amet, consectetur adipiscing <span>elit</span>', diff[0].html_line
46 assert_equal 'Lorem ipsum dolor sit amet, consectetur adipiscing <span>xx</span>', diff[1].html_line
47
48 assert_nil diff[2].offsets
49 assert_equal 'Praesent et sagittis dui. Vivamus ac diam diam', diff[2].html_line
50
51 assert_equal [0, -14], diff[3].offsets
52 assert_equal [0, -14], diff[4].offsets
53 assert_equal '<span>Ut sed</span> auctor justo', diff[3].html_line
54 assert_equal '<span>xxx</span> auctor justo', diff[4].html_line
55
56 assert_equal [13, -19], diff[6].offsets
57 assert_equal [13, -19], diff[7].offsets
58
59 assert_equal [24, -8], diff[9].offsets
60 assert_equal [24, -8], diff[10].offsets
61
62 assert_equal [37, -1], diff[12].offsets
63 assert_equal [37, -1], diff[13].offsets
64
65 assert_equal [0, -38], diff[15].offsets
66 assert_equal [0, -38], diff[16].offsets
67 end
68
69 def test_side_by_side_partials
70 diff = Redmine::UnifiedDiff.new(read_diff_fixture('partials.diff'), :type => 'sbs')
71 assert_equal 1, diff.size
72 diff = diff.first
73 assert_equal 32, diff.size
74
75 assert_equal [51, -1], diff[0].offsets
76 assert_equal 'Lorem ipsum dolor sit amet, consectetur adipiscing <span>elit</span>', diff[0].html_line_left
77 assert_equal 'Lorem ipsum dolor sit amet, consectetur adipiscing <span>xx</span>', diff[0].html_line_right
78
79 assert_nil diff[1].offsets
80 assert_equal 'Praesent et sagittis dui. Vivamus ac diam diam', diff[1].html_line_left
81 assert_equal 'Praesent et sagittis dui. Vivamus ac diam diam', diff[1].html_line_right
82
83 assert_equal [0, -14], diff[2].offsets
84 assert_equal '<span>Ut sed</span> auctor justo', diff[2].html_line_left
85 assert_equal '<span>xxx</span> auctor justo', diff[2].html_line_right
86
87 assert_equal [13, -19], diff[4].offsets
88 assert_equal [24, -8], diff[6].offsets
89 assert_equal [37, -1], diff[8].offsets
90 assert_equal [0, -38], diff[10].offsets
91
92 end
93
37 def test_line_starting_with_dashes
94 def test_line_starting_with_dashes
38 diff = Redmine::UnifiedDiff.new(<<-DIFF
95 diff = Redmine::UnifiedDiff.new(<<-DIFF
39 --- old.txt Wed Nov 11 14:24:58 2009
96 --- old.txt Wed Nov 11 14:24:58 2009
40 +++ new.txt Wed Nov 11 14:25:02 2009
97 +++ new.txt Wed Nov 11 14:25:02 2009
41 @@ -1,8 +1,4 @@
98 @@ -1,8 +1,4 @@
42 -Lines that starts with dashes:
99 -Lines that starts with dashes:
43 -
100 -
44 -------------------------
101 -------------------------
45 --- file.c
102 --- file.c
46 -------------------------
103 -------------------------
47 +A line that starts with dashes:
104 +A line that starts with dashes:
48
105
49 and removed.
106 and removed.
50
107
51 @@ -23,4 +19,4 @@
108 @@ -23,4 +19,4 @@
52
109
53
110
54
111
55 -Another chunk of change
112 -Another chunk of change
56 +Another chunk of changes
113 +Another chunk of changes
57
114
58 DIFF
115 DIFF
59 )
116 )
60 assert_equal 1, diff.size
117 assert_equal 1, diff.size
61 end
118 end
62
119
63 def test_one_line_new_files
120 def test_one_line_new_files
64 diff = Redmine::UnifiedDiff.new(<<-DIFF
121 diff = Redmine::UnifiedDiff.new(<<-DIFF
65 diff -r 000000000000 -r ea98b14f75f0 README1
122 diff -r 000000000000 -r ea98b14f75f0 README1
66 --- /dev/null
123 --- /dev/null
67 +++ b/README1
124 +++ b/README1
68 @@ -0,0 +1,1 @@
125 @@ -0,0 +1,1 @@
69 +test1
126 +test1
70 diff -r 000000000000 -r ea98b14f75f0 README2
127 diff -r 000000000000 -r ea98b14f75f0 README2
71 --- /dev/null
128 --- /dev/null
72 +++ b/README2
129 +++ b/README2
73 @@ -0,0 +1,1 @@
130 @@ -0,0 +1,1 @@
74 +test2
131 +test2
75 diff -r 000000000000 -r ea98b14f75f0 README3
132 diff -r 000000000000 -r ea98b14f75f0 README3
76 --- /dev/null
133 --- /dev/null
77 +++ b/README3
134 +++ b/README3
78 @@ -0,0 +1,3 @@
135 @@ -0,0 +1,3 @@
79 +test4
136 +test4
80 +test5
137 +test5
81 +test6
138 +test6
82 diff -r 000000000000 -r ea98b14f75f0 README4
139 diff -r 000000000000 -r ea98b14f75f0 README4
83 --- /dev/null
140 --- /dev/null
84 +++ b/README4
141 +++ b/README4
85 @@ -0,0 +1,3 @@
142 @@ -0,0 +1,3 @@
86 +test4
143 +test4
87 +test5
144 +test5
88 +test6
145 +test6
89 DIFF
146 DIFF
90 )
147 )
91 assert_equal 4, diff.size
148 assert_equal 4, diff.size
92 end
149 end
93
150
94 private
151 private
95
152
96 def read_diff_fixture(filename)
153 def read_diff_fixture(filename)
97 File.new(File.join(File.dirname(__FILE__), '/../../../fixtures/diffs', filename)).read
154 File.new(File.join(File.dirname(__FILE__), '/../../../fixtures/diffs', filename)).read
98 end
155 end
99 end
156 end
General Comments 0
You need to be logged in to leave comments. Login now