##// END OF EJS Templates
Version details view changes:...
Jean-Philippe Lang -
r1193:9b59ea725658
parent child
Show More
@@ -1,199 +1,194
1 # redMine - project management software
1 # redMine - project management software
2 # Copyright (C) 2006 Jean-Philippe Lang
2 # Copyright (C) 2006 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 ProjectsHelper
18 module ProjectsHelper
19 def link_to_version(version, options = {})
19 def link_to_version(version, options = {})
20 return '' unless version && version.is_a?(Version)
20 return '' unless version && version.is_a?(Version)
21 link_to version.name, {:controller => 'projects',
21 link_to h(version.name), { :controller => 'versions', :action => 'show', :id => version }, options
22 :action => 'roadmap',
23 :id => version.project_id,
24 :completed => (version.completed? ? 1 : nil),
25 :anchor => version.name
26 }, options
27 end
22 end
28
23
29 def format_activity_day(date)
24 def format_activity_day(date)
30 date == Date.today ? l(:label_today).titleize : format_date(date)
25 date == Date.today ? l(:label_today).titleize : format_date(date)
31 end
26 end
32
27
33 def format_activity_description(text)
28 def format_activity_description(text)
34 h(truncate(text, 250))
29 h(truncate(text, 250))
35 end
30 end
36
31
37 def project_settings_tabs
32 def project_settings_tabs
38 tabs = [{:name => 'info', :action => :edit_project, :partial => 'projects/edit', :label => :label_information_plural},
33 tabs = [{:name => 'info', :action => :edit_project, :partial => 'projects/edit', :label => :label_information_plural},
39 {:name => 'modules', :action => :select_project_modules, :partial => 'projects/settings/modules', :label => :label_module_plural},
34 {:name => 'modules', :action => :select_project_modules, :partial => 'projects/settings/modules', :label => :label_module_plural},
40 {:name => 'members', :action => :manage_members, :partial => 'projects/settings/members', :label => :label_member_plural},
35 {:name => 'members', :action => :manage_members, :partial => 'projects/settings/members', :label => :label_member_plural},
41 {:name => 'versions', :action => :manage_versions, :partial => 'projects/settings/versions', :label => :label_version_plural},
36 {:name => 'versions', :action => :manage_versions, :partial => 'projects/settings/versions', :label => :label_version_plural},
42 {:name => 'categories', :action => :manage_categories, :partial => 'projects/settings/issue_categories', :label => :label_issue_category_plural},
37 {:name => 'categories', :action => :manage_categories, :partial => 'projects/settings/issue_categories', :label => :label_issue_category_plural},
43 {:name => 'wiki', :action => :manage_wiki, :partial => 'projects/settings/wiki', :label => :label_wiki},
38 {:name => 'wiki', :action => :manage_wiki, :partial => 'projects/settings/wiki', :label => :label_wiki},
44 {:name => 'repository', :action => :manage_repository, :partial => 'projects/settings/repository', :label => :label_repository},
39 {:name => 'repository', :action => :manage_repository, :partial => 'projects/settings/repository', :label => :label_repository},
45 {:name => 'boards', :action => :manage_boards, :partial => 'projects/settings/boards', :label => :label_board_plural}
40 {:name => 'boards', :action => :manage_boards, :partial => 'projects/settings/boards', :label => :label_board_plural}
46 ]
41 ]
47 tabs.select {|tab| User.current.allowed_to?(tab[:action], @project)}
42 tabs.select {|tab| User.current.allowed_to?(tab[:action], @project)}
48 end
43 end
49
44
50 # Generates a gantt image
45 # Generates a gantt image
51 # Only defined if RMagick is avalaible
46 # Only defined if RMagick is avalaible
52 def gantt_image(events, date_from, months, zoom)
47 def gantt_image(events, date_from, months, zoom)
53 date_to = (date_from >> months)-1
48 date_to = (date_from >> months)-1
54 show_weeks = zoom > 1
49 show_weeks = zoom > 1
55 show_days = zoom > 2
50 show_days = zoom > 2
56
51
57 subject_width = 320
52 subject_width = 320
58 header_heigth = 18
53 header_heigth = 18
59 # width of one day in pixels
54 # width of one day in pixels
60 zoom = zoom*2
55 zoom = zoom*2
61 g_width = (date_to - date_from + 1)*zoom
56 g_width = (date_to - date_from + 1)*zoom
62 g_height = 20 * events.length + 20
57 g_height = 20 * events.length + 20
63 headers_heigth = (show_weeks ? 2*header_heigth : header_heigth)
58 headers_heigth = (show_weeks ? 2*header_heigth : header_heigth)
64 height = g_height + headers_heigth
59 height = g_height + headers_heigth
65
60
66 imgl = Magick::ImageList.new
61 imgl = Magick::ImageList.new
67 imgl.new_image(subject_width+g_width+1, height)
62 imgl.new_image(subject_width+g_width+1, height)
68 gc = Magick::Draw.new
63 gc = Magick::Draw.new
69
64
70 # Subjects
65 # Subjects
71 top = headers_heigth + 20
66 top = headers_heigth + 20
72 gc.fill('black')
67 gc.fill('black')
73 gc.stroke('transparent')
68 gc.stroke('transparent')
74 gc.stroke_width(1)
69 gc.stroke_width(1)
75 events.each do |i|
70 events.each do |i|
76 gc.text(4, top + 2, (i.is_a?(Issue) ? i.subject : i.name))
71 gc.text(4, top + 2, (i.is_a?(Issue) ? i.subject : i.name))
77 top = top + 20
72 top = top + 20
78 end
73 end
79
74
80 # Months headers
75 # Months headers
81 month_f = date_from
76 month_f = date_from
82 left = subject_width
77 left = subject_width
83 months.times do
78 months.times do
84 width = ((month_f >> 1) - month_f) * zoom
79 width = ((month_f >> 1) - month_f) * zoom
85 gc.fill('white')
80 gc.fill('white')
86 gc.stroke('grey')
81 gc.stroke('grey')
87 gc.stroke_width(1)
82 gc.stroke_width(1)
88 gc.rectangle(left, 0, left + width, height)
83 gc.rectangle(left, 0, left + width, height)
89 gc.fill('black')
84 gc.fill('black')
90 gc.stroke('transparent')
85 gc.stroke('transparent')
91 gc.stroke_width(1)
86 gc.stroke_width(1)
92 gc.text(left.round + 8, 14, "#{month_f.year}-#{month_f.month}")
87 gc.text(left.round + 8, 14, "#{month_f.year}-#{month_f.month}")
93 left = left + width
88 left = left + width
94 month_f = month_f >> 1
89 month_f = month_f >> 1
95 end
90 end
96
91
97 # Weeks headers
92 # Weeks headers
98 if show_weeks
93 if show_weeks
99 left = subject_width
94 left = subject_width
100 height = header_heigth
95 height = header_heigth
101 if date_from.cwday == 1
96 if date_from.cwday == 1
102 # date_from is monday
97 # date_from is monday
103 week_f = date_from
98 week_f = date_from
104 else
99 else
105 # find next monday after date_from
100 # find next monday after date_from
106 week_f = date_from + (7 - date_from.cwday + 1)
101 week_f = date_from + (7 - date_from.cwday + 1)
107 width = (7 - date_from.cwday + 1) * zoom
102 width = (7 - date_from.cwday + 1) * zoom
108 gc.fill('white')
103 gc.fill('white')
109 gc.stroke('grey')
104 gc.stroke('grey')
110 gc.stroke_width(1)
105 gc.stroke_width(1)
111 gc.rectangle(left, header_heigth, left + width, 2*header_heigth + g_height-1)
106 gc.rectangle(left, header_heigth, left + width, 2*header_heigth + g_height-1)
112 left = left + width
107 left = left + width
113 end
108 end
114 while week_f <= date_to
109 while week_f <= date_to
115 width = (week_f + 6 <= date_to) ? 7 * zoom : (date_to - week_f + 1) * zoom
110 width = (week_f + 6 <= date_to) ? 7 * zoom : (date_to - week_f + 1) * zoom
116 gc.fill('white')
111 gc.fill('white')
117 gc.stroke('grey')
112 gc.stroke('grey')
118 gc.stroke_width(1)
113 gc.stroke_width(1)
119 gc.rectangle(left.round, header_heigth, left.round + width, 2*header_heigth + g_height-1)
114 gc.rectangle(left.round, header_heigth, left.round + width, 2*header_heigth + g_height-1)
120 gc.fill('black')
115 gc.fill('black')
121 gc.stroke('transparent')
116 gc.stroke('transparent')
122 gc.stroke_width(1)
117 gc.stroke_width(1)
123 gc.text(left.round + 2, header_heigth + 14, week_f.cweek.to_s)
118 gc.text(left.round + 2, header_heigth + 14, week_f.cweek.to_s)
124 left = left + width
119 left = left + width
125 week_f = week_f+7
120 week_f = week_f+7
126 end
121 end
127 end
122 end
128
123
129 # Days details (week-end in grey)
124 # Days details (week-end in grey)
130 if show_days
125 if show_days
131 left = subject_width
126 left = subject_width
132 height = g_height + header_heigth - 1
127 height = g_height + header_heigth - 1
133 wday = date_from.cwday
128 wday = date_from.cwday
134 (date_to - date_from + 1).to_i.times do
129 (date_to - date_from + 1).to_i.times do
135 width = zoom
130 width = zoom
136 gc.fill(wday == 6 || wday == 7 ? '#eee' : 'white')
131 gc.fill(wday == 6 || wday == 7 ? '#eee' : 'white')
137 gc.stroke('grey')
132 gc.stroke('grey')
138 gc.stroke_width(1)
133 gc.stroke_width(1)
139 gc.rectangle(left, 2*header_heigth, left + width, 2*header_heigth + g_height-1)
134 gc.rectangle(left, 2*header_heigth, left + width, 2*header_heigth + g_height-1)
140 left = left + width
135 left = left + width
141 wday = wday + 1
136 wday = wday + 1
142 wday = 1 if wday > 7
137 wday = 1 if wday > 7
143 end
138 end
144 end
139 end
145
140
146 # border
141 # border
147 gc.fill('transparent')
142 gc.fill('transparent')
148 gc.stroke('grey')
143 gc.stroke('grey')
149 gc.stroke_width(1)
144 gc.stroke_width(1)
150 gc.rectangle(0, 0, subject_width+g_width, headers_heigth)
145 gc.rectangle(0, 0, subject_width+g_width, headers_heigth)
151 gc.stroke('black')
146 gc.stroke('black')
152 gc.rectangle(0, 0, subject_width+g_width, g_height+ headers_heigth-1)
147 gc.rectangle(0, 0, subject_width+g_width, g_height+ headers_heigth-1)
153
148
154 # content
149 # content
155 top = headers_heigth + 20
150 top = headers_heigth + 20
156 gc.stroke('transparent')
151 gc.stroke('transparent')
157 events.each do |i|
152 events.each do |i|
158 if i.is_a?(Issue)
153 if i.is_a?(Issue)
159 i_start_date = (i.start_date >= date_from ? i.start_date : date_from )
154 i_start_date = (i.start_date >= date_from ? i.start_date : date_from )
160 i_end_date = (i.due_date <= date_to ? i.due_date : date_to )
155 i_end_date = (i.due_date <= date_to ? i.due_date : date_to )
161 i_done_date = i.start_date + ((i.due_date - i.start_date+1)*i.done_ratio/100).floor
156 i_done_date = i.start_date + ((i.due_date - i.start_date+1)*i.done_ratio/100).floor
162 i_done_date = (i_done_date <= date_from ? date_from : i_done_date )
157 i_done_date = (i_done_date <= date_from ? date_from : i_done_date )
163 i_done_date = (i_done_date >= date_to ? date_to : i_done_date )
158 i_done_date = (i_done_date >= date_to ? date_to : i_done_date )
164 i_late_date = [i_end_date, Date.today].min if i_start_date < Date.today
159 i_late_date = [i_end_date, Date.today].min if i_start_date < Date.today
165
160
166 i_left = subject_width + ((i_start_date - date_from)*zoom).floor
161 i_left = subject_width + ((i_start_date - date_from)*zoom).floor
167 i_width = ((i_end_date - i_start_date + 1)*zoom).floor # total width of the issue
162 i_width = ((i_end_date - i_start_date + 1)*zoom).floor # total width of the issue
168 d_width = ((i_done_date - i_start_date)*zoom).floor # done width
163 d_width = ((i_done_date - i_start_date)*zoom).floor # done width
169 l_width = i_late_date ? ((i_late_date - i_start_date+1)*zoom).floor : 0 # delay width
164 l_width = i_late_date ? ((i_late_date - i_start_date+1)*zoom).floor : 0 # delay width
170
165
171 gc.fill('grey')
166 gc.fill('grey')
172 gc.rectangle(i_left, top, i_left + i_width, top - 6)
167 gc.rectangle(i_left, top, i_left + i_width, top - 6)
173 gc.fill('red')
168 gc.fill('red')
174 gc.rectangle(i_left, top, i_left + l_width, top - 6) if l_width > 0
169 gc.rectangle(i_left, top, i_left + l_width, top - 6) if l_width > 0
175 gc.fill('blue')
170 gc.fill('blue')
176 gc.rectangle(i_left, top, i_left + d_width, top - 6) if d_width > 0
171 gc.rectangle(i_left, top, i_left + d_width, top - 6) if d_width > 0
177 gc.fill('black')
172 gc.fill('black')
178 gc.text(i_left + i_width + 5,top + 1, "#{i.status.name} #{i.done_ratio}%")
173 gc.text(i_left + i_width + 5,top + 1, "#{i.status.name} #{i.done_ratio}%")
179 else
174 else
180 i_left = subject_width + ((i.start_date - date_from)*zoom).floor
175 i_left = subject_width + ((i.start_date - date_from)*zoom).floor
181 gc.fill('green')
176 gc.fill('green')
182 gc.rectangle(i_left, top, i_left + 6, top - 6)
177 gc.rectangle(i_left, top, i_left + 6, top - 6)
183 gc.fill('black')
178 gc.fill('black')
184 gc.text(i_left + 11, top + 1, i.name)
179 gc.text(i_left + 11, top + 1, i.name)
185 end
180 end
186 top = top + 20
181 top = top + 20
187 end
182 end
188
183
189 # today red line
184 # today red line
190 if Date.today >= date_from and Date.today <= date_to
185 if Date.today >= date_from and Date.today <= date_to
191 gc.stroke('red')
186 gc.stroke('red')
192 x = (Date.today-date_from+1)*zoom + subject_width
187 x = (Date.today-date_from+1)*zoom + subject_width
193 gc.line(x, headers_heigth, x, headers_heigth + g_height-1)
188 gc.line(x, headers_heigth, x, headers_heigth + g_height-1)
194 end
189 end
195
190
196 gc.draw(imgl)
191 gc.draw(imgl)
197 imgl
192 imgl
198 end if Object.const_defined?(:Magick)
193 end if Object.const_defined?(:Magick)
199 end
194 end
@@ -1,96 +1,106
1 # redMine - project management software
1 # redMine - project management software
2 # Copyright (C) 2006 Jean-Philippe Lang
2 # Copyright (C) 2006 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 class Version < ActiveRecord::Base
18 class Version < ActiveRecord::Base
19 before_destroy :check_integrity
19 before_destroy :check_integrity
20 belongs_to :project
20 belongs_to :project
21 has_many :fixed_issues, :class_name => 'Issue', :foreign_key => 'fixed_version_id'
21 has_many :fixed_issues, :class_name => 'Issue', :foreign_key => 'fixed_version_id'
22 has_many :attachments, :as => :container, :dependent => :destroy
22 has_many :attachments, :as => :container, :dependent => :destroy
23
23
24 validates_presence_of :name
24 validates_presence_of :name
25 validates_uniqueness_of :name, :scope => [:project_id]
25 validates_uniqueness_of :name, :scope => [:project_id]
26 validates_length_of :name, :maximum => 30
26 validates_length_of :name, :maximum => 30
27 validates_format_of :effective_date, :with => /^\d{4}-\d{2}-\d{2}$/, :message => :activerecord_error_not_a_date, :allow_nil => true
27 validates_format_of :effective_date, :with => /^\d{4}-\d{2}-\d{2}$/, :message => :activerecord_error_not_a_date, :allow_nil => true
28
28
29 def start_date
29 def start_date
30 effective_date
30 effective_date
31 end
31 end
32
32
33 def due_date
33 def due_date
34 effective_date
34 effective_date
35 end
35 end
36
36
37 # Returns the total estimated time for this version
38 def estimated_hours
39 @estimated_hours ||= fixed_issues.sum(:estimated_hours).to_f
40 end
41
42 # Returns the total reported time for this version
43 def spent_hours
44 @spent_hours ||= TimeEntry.sum(:hours, :include => :issue, :conditions => ["#{Issue.table_name}.fixed_version_id = ?", id]).to_f
45 end
46
37 # Returns true if the version is completed: due date reached and no open issues
47 # Returns true if the version is completed: due date reached and no open issues
38 def completed?
48 def completed?
39 effective_date && (effective_date <= Date.today) && (open_issues_count == 0)
49 effective_date && (effective_date <= Date.today) && (open_issues_count == 0)
40 end
50 end
41
51
42 def completed_pourcent
52 def completed_pourcent
43 if fixed_issues.count == 0
53 if fixed_issues.count == 0
44 0
54 0
45 elsif open_issues_count == 0
55 elsif open_issues_count == 0
46 100
56 100
47 else
57 else
48 (closed_issues_count * 100 + Issue.sum('done_ratio', :include => 'status', :conditions => ["fixed_version_id = ? AND is_closed = ?", id, false]).to_f) / fixed_issues.count
58 (closed_issues_count * 100 + Issue.sum('done_ratio', :include => 'status', :conditions => ["fixed_version_id = ? AND is_closed = ?", id, false]).to_f) / fixed_issues.count
49 end
59 end
50 end
60 end
51
61
52 def closed_pourcent
62 def closed_pourcent
53 if fixed_issues.count == 0
63 if fixed_issues.count == 0
54 0
64 0
55 else
65 else
56 closed_issues_count * 100.0 / fixed_issues.count
66 closed_issues_count * 100.0 / fixed_issues.count
57 end
67 end
58 end
68 end
59
69
60 # Returns true if the version is overdue: due date reached and some open issues
70 # Returns true if the version is overdue: due date reached and some open issues
61 def overdue?
71 def overdue?
62 effective_date && (effective_date < Date.today) && (open_issues_count > 0)
72 effective_date && (effective_date < Date.today) && (open_issues_count > 0)
63 end
73 end
64
74
65 def open_issues_count
75 def open_issues_count
66 @open_issues_count ||= Issue.count(:all, :conditions => ["fixed_version_id = ? AND is_closed = ?", self.id, false], :include => :status)
76 @open_issues_count ||= Issue.count(:all, :conditions => ["fixed_version_id = ? AND is_closed = ?", self.id, false], :include => :status)
67 end
77 end
68
78
69 def closed_issues_count
79 def closed_issues_count
70 @closed_issues_count ||= Issue.count(:all, :conditions => ["fixed_version_id = ? AND is_closed = ?", self.id, true], :include => :status)
80 @closed_issues_count ||= Issue.count(:all, :conditions => ["fixed_version_id = ? AND is_closed = ?", self.id, true], :include => :status)
71 end
81 end
72
82
73 def wiki_page
83 def wiki_page
74 if project.wiki && !wiki_page_title.blank?
84 if project.wiki && !wiki_page_title.blank?
75 @wiki_page ||= project.wiki.find_page(wiki_page_title)
85 @wiki_page ||= project.wiki.find_page(wiki_page_title)
76 end
86 end
77 @wiki_page
87 @wiki_page
78 end
88 end
79
89
80 def to_s; name end
90 def to_s; name end
81
91
82 # Versions are sorted by effective_date
92 # Versions are sorted by effective_date
83 # Those with no effective_date are at the end, sorted by name
93 # Those with no effective_date are at the end, sorted by name
84 def <=>(version)
94 def <=>(version)
85 if self.effective_date
95 if self.effective_date
86 version.effective_date ? (self.effective_date <=> version.effective_date) : -1
96 version.effective_date ? (self.effective_date <=> version.effective_date) : -1
87 else
97 else
88 version.effective_date ? 1 : (self.name <=> version.name)
98 version.effective_date ? 1 : (self.name <=> version.name)
89 end
99 end
90 end
100 end
91
101
92 private
102 private
93 def check_integrity
103 def check_integrity
94 raise "Can't delete version" if self.fixed_issues.find(:first)
104 raise "Can't delete version" if self.fixed_issues.find(:first)
95 end
105 end
96 end
106 end
@@ -1,14 +1,49
1 <div class="contextual">
1 <div class="contextual">
2 <%= link_to_if_authorized l(:button_edit), {:controller => 'versions', :action => 'edit', :id => @version}, :class => 'icon icon-edit' %>
2 <%= link_to_if_authorized l(:button_edit), {:controller => 'versions', :action => 'edit', :id => @version}, :class => 'icon icon-edit' %>
3 </div>
3 </div>
4
4
5 <h2><%= h(@version.name) %></h2>
5 <h2><%= h(@version.name) %></h2>
6
6
7 <div id="version-summary">
8 <% if @version.estimated_hours > 0 || User.current.allowed_to?(:view_time_entries, @project) %>
9 <fieldset><legend><%= l(:label_time_tracking) %></legend>
10 <table>
11 <tr>
12 <td width="130px" align="right"><%= l(:field_estimated_hours) %></td>
13 <td width="240px" class="total-hours"width="130px" align="right"><%= html_hours(lwr(:label_f_hour, @version.estimated_hours)) %></td>
14 </tr>
15 <% if User.current.allowed_to?(:view_time_entries, @project) %>
16 <tr>
17 <td width="130px" align="right"><%= l(:label_spent_time) %></td>
18 <td width="240px" class="total-hours"><%= html_hours(lwr(:label_f_hour, @version.spent_hours)) %></td>
19 </tr>
20 <% end %>
21 </table>
22 </fieldset>
23 <% end %>
24
7 <div id="status_by">
25 <div id="status_by">
8 <%= render_issue_status_by(@version, params[:status_by]) if @version.fixed_issues.count > 0 %>
26 <%= render_issue_status_by(@version, params[:status_by]) if @version.fixed_issues.count > 0 %>
9 </div>
27 </div>
28 </div>
10
29
30 <div id="roadmap">
11 <%= render :partial => 'versions/overview', :locals => {:version => @version} %>
31 <%= render :partial => 'versions/overview', :locals => {:version => @version} %>
12 <%= render(:partial => "wiki/content", :locals => {:content => @version.wiki_page.content}) if @version.wiki_page %>
32 <%= render(:partial => "wiki/content", :locals => {:content => @version.wiki_page.content}) if @version.wiki_page %>
13
33
34 <% issues = @version.fixed_issues.find(:all,
35 :include => [:status, :tracker],
36 :order => "#{Tracker.table_name}.position, #{Issue.table_name}.id") %>
37 <% if issues.size > 0 %>
38 <fieldset class="related-issues"><legend><%= l(:label_related_issues) %></legend>
39 <ul>
40 <% issues.each do |issue| -%>
41 <li><%= link = link_to_issue(issue)
42 issue.status.is_closed? ? content_tag("del", link) : link %>: <%=h issue.subject %></li>
43 <% end -%>
44 </ul>
45 </fieldset>
46 <% end %>
47 </div>
48
14 <% html_title @version.name %>
49 <% html_title @version.name %>
@@ -1,570 +1,572
1 body { font-family: Verdana, sans-serif; font-size: 12px; color:#484848; margin: 0; padding: 0; min-width: 900px; }
1 body { font-family: Verdana, sans-serif; font-size: 12px; color:#484848; margin: 0; padding: 0; min-width: 900px; }
2
2
3 h1, h2, h3, h4 { font-family: "Trebuchet MS", Verdana, sans-serif;}
3 h1, h2, h3, h4 { font-family: "Trebuchet MS", Verdana, sans-serif;}
4 h1 {margin:0; padding:0; font-size: 24px;}
4 h1 {margin:0; padding:0; font-size: 24px;}
5 h2, .wiki h1 {font-size: 20px;padding: 2px 10px 1px 0px;margin: 0 0 10px 0; border-bottom: 1px solid #bbbbbb; color: #444;}
5 h2, .wiki h1 {font-size: 20px;padding: 2px 10px 1px 0px;margin: 0 0 10px 0; border-bottom: 1px solid #bbbbbb; color: #444;}
6 h3, .wiki h2 {font-size: 16px;padding: 2px 10px 1px 0px;margin: 0 0 10px 0; border-bottom: 1px solid #bbbbbb; color: #444;}
6 h3, .wiki h2 {font-size: 16px;padding: 2px 10px 1px 0px;margin: 0 0 10px 0; border-bottom: 1px solid #bbbbbb; color: #444;}
7 h4, .wiki h3 {font-size: 12px;padding: 2px 10px 1px 0px;margin-bottom: 5px; border-bottom: 1px dotted #bbbbbb; color: #444;}
7 h4, .wiki h3 {font-size: 12px;padding: 2px 10px 1px 0px;margin-bottom: 5px; border-bottom: 1px dotted #bbbbbb; color: #444;}
8
8
9 /***** Layout *****/
9 /***** Layout *****/
10 #wrapper {background: white;}
10 #wrapper {background: white;}
11
11
12 #top-menu {background: #2C4056;color: #fff;height:1.5em; padding: 2px 6px 0px 6px;}
12 #top-menu {background: #2C4056;color: #fff;height:1.5em; padding: 2px 6px 0px 6px;}
13 #top-menu ul {margin: 0; padding: 0;}
13 #top-menu ul {margin: 0; padding: 0;}
14 #top-menu li {
14 #top-menu li {
15 float:left;
15 float:left;
16 list-style-type:none;
16 list-style-type:none;
17 margin: 0px 0px 0px 0px;
17 margin: 0px 0px 0px 0px;
18 padding: 0px 0px 0px 0px;
18 padding: 0px 0px 0px 0px;
19 white-space:nowrap;
19 white-space:nowrap;
20 }
20 }
21 #top-menu a {color: #fff; padding-right: 4px;}
21 #top-menu a {color: #fff; padding-right: 4px;}
22 #top-menu #loggedas { float: right; margin-right: 0.5em; color: #fff; }
22 #top-menu #loggedas { float: right; margin-right: 0.5em; color: #fff; }
23
23
24 #account {float:right;}
24 #account {float:right;}
25
25
26 #header {height:5.3em;margin:0;background-color:#507AAA;color:#f8f8f8; padding: 4px 8px 0px 6px; position:relative;}
26 #header {height:5.3em;margin:0;background-color:#507AAA;color:#f8f8f8; padding: 4px 8px 0px 6px; position:relative;}
27 #header a {color:#f8f8f8;}
27 #header a {color:#f8f8f8;}
28 #quick-search {float:right;}
28 #quick-search {float:right;}
29
29
30 #main-menu {position: absolute; bottom: 0px; left:6px; margin-right: -500px;}
30 #main-menu {position: absolute; bottom: 0px; left:6px; margin-right: -500px;}
31 #main-menu ul {margin: 0; padding: 0;}
31 #main-menu ul {margin: 0; padding: 0;}
32 #main-menu li {
32 #main-menu li {
33 float:left;
33 float:left;
34 list-style-type:none;
34 list-style-type:none;
35 margin: 0px 10px 0px 0px;
35 margin: 0px 10px 0px 0px;
36 padding: 0px 0px 0px 0px;
36 padding: 0px 0px 0px 0px;
37 white-space:nowrap;
37 white-space:nowrap;
38 }
38 }
39 #main-menu li a {
39 #main-menu li a {
40 display: block;
40 display: block;
41 color: #fff;
41 color: #fff;
42 text-decoration: none;
42 text-decoration: none;
43 margin: 0;
43 margin: 0;
44 padding: 4px 4px 4px 4px;
44 padding: 4px 4px 4px 4px;
45 background: #2C4056;
45 background: #2C4056;
46 }
46 }
47 #main-menu li a:hover, #main-menu li a.selected {background:#759FCF;}
47 #main-menu li a:hover, #main-menu li a.selected {background:#759FCF;}
48
48
49 #main {background: url(../images/mainbg.png) repeat-x; background-color:#EEEEEE;}
49 #main {background: url(../images/mainbg.png) repeat-x; background-color:#EEEEEE;}
50
50
51 #sidebar{ float: right; width: 17%; position: relative; z-index: 9; min-height: 600px; padding: 0; margin: 0;}
51 #sidebar{ float: right; width: 17%; position: relative; z-index: 9; min-height: 600px; padding: 0; margin: 0;}
52 * html #sidebar{ width: 17%; }
52 * html #sidebar{ width: 17%; }
53 #sidebar h3{ font-size: 14px; margin-top:14px; color: #666; }
53 #sidebar h3{ font-size: 14px; margin-top:14px; color: #666; }
54 #sidebar hr{ width: 100%; margin: 0 auto; height: 1px; background: #ccc; border: 0; }
54 #sidebar hr{ width: 100%; margin: 0 auto; height: 1px; background: #ccc; border: 0; }
55 * html #sidebar hr{ width: 95%; position: relative; left: -6px; color: #ccc; }
55 * html #sidebar hr{ width: 95%; position: relative; left: -6px; color: #ccc; }
56
56
57 #content { width: 80%; background: url(../images/contentbg.png) repeat-x; background-color: #fff; margin: 0px; border-right: 1px solid #ddd; padding: 6px 10px 10px 10px; z-index: 10; height:600px; min-height: 600px;}
57 #content { width: 80%; background: url(../images/contentbg.png) repeat-x; background-color: #fff; margin: 0px; border-right: 1px solid #ddd; padding: 6px 10px 10px 10px; z-index: 10; height:600px; min-height: 600px;}
58 * html #content{ width: 80%; padding-left: 0; margin-top: 0px; padding: 6px 10px 10px 10px;}
58 * html #content{ width: 80%; padding-left: 0; margin-top: 0px; padding: 6px 10px 10px 10px;}
59 html>body #content {
59 html>body #content {
60 height: auto;
60 height: auto;
61 min-height: 600px;
61 min-height: 600px;
62 }
62 }
63
63
64 #main.nosidebar #sidebar{ display: none; }
64 #main.nosidebar #sidebar{ display: none; }
65 #main.nosidebar #content{ width: auto; border-right: 0; }
65 #main.nosidebar #content{ width: auto; border-right: 0; }
66
66
67 #footer {clear: both; border-top: 1px solid #bbb; font-size: 0.9em; color: #aaa; padding: 5px; text-align:center; background:#fff;}
67 #footer {clear: both; border-top: 1px solid #bbb; font-size: 0.9em; color: #aaa; padding: 5px; text-align:center; background:#fff;}
68
68
69 #login-form table {margin-top:5em; padding:1em; margin-left: auto; margin-right: auto; border: 2px solid #FDBF3B; background-color:#FFEBC1; }
69 #login-form table {margin-top:5em; padding:1em; margin-left: auto; margin-right: auto; border: 2px solid #FDBF3B; background-color:#FFEBC1; }
70 #login-form table td {padding: 6px;}
70 #login-form table td {padding: 6px;}
71 #login-form label {font-weight: bold;}
71 #login-form label {font-weight: bold;}
72
72
73 .clear:after{ content: "."; display: block; height: 0; clear: both; visibility: hidden; }
73 .clear:after{ content: "."; display: block; height: 0; clear: both; visibility: hidden; }
74
74
75 /***** Links *****/
75 /***** Links *****/
76 a, a:link, a:visited{ color: #2A5685; text-decoration: none; }
76 a, a:link, a:visited{ color: #2A5685; text-decoration: none; }
77 a:hover, a:active{ color: #c61a1a; text-decoration: underline;}
77 a:hover, a:active{ color: #c61a1a; text-decoration: underline;}
78 a img{ border: 0; }
78 a img{ border: 0; }
79
79
80 /***** Tables *****/
80 /***** Tables *****/
81 table.list { border: 1px solid #e4e4e4; border-collapse: collapse; width: 100%; margin-bottom: 4px; }
81 table.list { border: 1px solid #e4e4e4; border-collapse: collapse; width: 100%; margin-bottom: 4px; }
82 table.list th { background-color:#EEEEEE; padding: 4px; white-space:nowrap; }
82 table.list th { background-color:#EEEEEE; padding: 4px; white-space:nowrap; }
83 table.list td { overflow: hidden; vertical-align: top;}
83 table.list td { overflow: hidden; vertical-align: top;}
84 table.list td.id { width: 2%; text-align: center;}
84 table.list td.id { width: 2%; text-align: center;}
85 table.list td.checkbox { width: 15px; padding: 0px;}
85 table.list td.checkbox { width: 15px; padding: 0px;}
86
86
87 tr.issue { text-align: center; white-space: nowrap; }
87 tr.issue { text-align: center; white-space: nowrap; }
88 tr.issue td.subject, tr.issue td.category { white-space: normal; }
88 tr.issue td.subject, tr.issue td.category { white-space: normal; }
89 tr.issue td.subject { text-align: left; }
89 tr.issue td.subject { text-align: left; }
90 tr.issue td.done_ratio table.progress { margin-left:auto; margin-right: auto;}
90 tr.issue td.done_ratio table.progress { margin-left:auto; margin-right: auto;}
91
91
92 tr.entry { border: 1px solid #f8f8f8; }
92 tr.entry { border: 1px solid #f8f8f8; }
93 tr.entry td { white-space: nowrap; }
93 tr.entry td { white-space: nowrap; }
94 tr.entry td.filename { width: 30%; }
94 tr.entry td.filename { width: 30%; }
95 tr.entry td.size { text-align: right; font-size: 90%; }
95 tr.entry td.size { text-align: right; font-size: 90%; }
96 tr.entry td.revision, tr.entry td.author { text-align: center; }
96 tr.entry td.revision, tr.entry td.author { text-align: center; }
97 tr.entry td.age { text-align: right; }
97 tr.entry td.age { text-align: right; }
98
98
99 tr.changeset td.author { text-align: center; width: 15%; }
99 tr.changeset td.author { text-align: center; width: 15%; }
100 tr.changeset td.committed_on { text-align: center; width: 15%; }
100 tr.changeset td.committed_on { text-align: center; width: 15%; }
101
101
102 tr.message { height: 2.6em; }
102 tr.message { height: 2.6em; }
103 tr.message td.last_message { font-size: 80%; }
103 tr.message td.last_message { font-size: 80%; }
104 tr.message.locked td.subject a { background-image: url(../images/locked.png); }
104 tr.message.locked td.subject a { background-image: url(../images/locked.png); }
105 tr.message.sticky td.subject a { background-image: url(../images/sticky.png); font-weight: bold; }
105 tr.message.sticky td.subject a { background-image: url(../images/sticky.png); font-weight: bold; }
106
106
107 tr.user td { width:13%; }
107 tr.user td { width:13%; }
108 tr.user td.email { width:18%; }
108 tr.user td.email { width:18%; }
109 tr.user td { white-space: nowrap; }
109 tr.user td { white-space: nowrap; }
110 tr.user.locked, tr.user.registered { color: #aaa; }
110 tr.user.locked, tr.user.registered { color: #aaa; }
111 tr.user.locked a, tr.user.registered a { color: #aaa; }
111 tr.user.locked a, tr.user.registered a { color: #aaa; }
112
112
113 tr.time-entry { text-align: center; white-space: nowrap; }
113 tr.time-entry { text-align: center; white-space: nowrap; }
114 tr.time-entry td.subject, tr.time-entry td.comments { text-align: left; }
114 tr.time-entry td.subject, tr.time-entry td.comments { text-align: left; }
115 tr.time-entry td.hours { text-align: right; font-weight: bold; padding-right: 0.5em; }
115 tr.time-entry td.hours { text-align: right; font-weight: bold; padding-right: 0.5em; }
116 tr.time-entry .hours-dec { font-size: 0.9em; }
116 tr.time-entry .hours-dec { font-size: 0.9em; }
117
117
118 table.list tbody tr:hover { background-color:#ffffdd; }
118 table.list tbody tr:hover { background-color:#ffffdd; }
119 table td {padding:2px;}
119 table td {padding:2px;}
120 table p {margin:0;}
120 table p {margin:0;}
121 .odd {background-color:#f6f7f8;}
121 .odd {background-color:#f6f7f8;}
122 .even {background-color: #fff;}
122 .even {background-color: #fff;}
123
123
124 .highlight { background-color: #FCFD8D;}
124 .highlight { background-color: #FCFD8D;}
125 .highlight.token-1 { background-color: #faa;}
125 .highlight.token-1 { background-color: #faa;}
126 .highlight.token-2 { background-color: #afa;}
126 .highlight.token-2 { background-color: #afa;}
127 .highlight.token-3 { background-color: #aaf;}
127 .highlight.token-3 { background-color: #aaf;}
128
128
129 .box{
129 .box{
130 padding:6px;
130 padding:6px;
131 margin-bottom: 10px;
131 margin-bottom: 10px;
132 background-color:#f6f6f6;
132 background-color:#f6f6f6;
133 color:#505050;
133 color:#505050;
134 line-height:1.5em;
134 line-height:1.5em;
135 border: 1px solid #e4e4e4;
135 border: 1px solid #e4e4e4;
136 }
136 }
137
137
138 div.square {
138 div.square {
139 border: 1px solid #999;
139 border: 1px solid #999;
140 float: left;
140 float: left;
141 margin: .3em .4em 0 .4em;
141 margin: .3em .4em 0 .4em;
142 overflow: hidden;
142 overflow: hidden;
143 width: .6em; height: .6em;
143 width: .6em; height: .6em;
144 }
144 }
145
145
146 .contextual {float:right; white-space: nowrap; line-height:1.4em;margin-top:5px; padding-left: 10px; font-size:0.9em;}
146 .contextual {float:right; white-space: nowrap; line-height:1.4em;margin-top:5px; padding-left: 10px; font-size:0.9em;}
147 .contextual input {font-size:0.9em;}
147 .contextual input {font-size:0.9em;}
148
148
149 .splitcontentleft{float:left; width:49%;}
149 .splitcontentleft{float:left; width:49%;}
150 .splitcontentright{float:right; width:49%;}
150 .splitcontentright{float:right; width:49%;}
151 form {display: inline;}
151 form {display: inline;}
152 input, select {vertical-align: middle; margin-top: 1px; margin-bottom: 1px;}
152 input, select {vertical-align: middle; margin-top: 1px; margin-bottom: 1px;}
153 fieldset {border: 1px solid #e4e4e4; margin:0;}
153 fieldset {border: 1px solid #e4e4e4; margin:0;}
154 legend {color: #484848;}
154 legend {color: #484848;}
155 hr { width: 100%; height: 1px; background: #ccc; border: 0;}
155 hr { width: 100%; height: 1px; background: #ccc; border: 0;}
156 textarea.wiki-edit { width: 99%; }
156 textarea.wiki-edit { width: 99%; }
157 li p {margin-top: 0;}
157 li p {margin-top: 0;}
158 div.issue {background:#ffffdd; padding:6px; margin-bottom:6px;border: 1px solid #d7d7d7;}
158 div.issue {background:#ffffdd; padding:6px; margin-bottom:6px;border: 1px solid #d7d7d7;}
159
159
160 div#issue-changesets {float:right; width:45%; margin-left: 1em; margin-bottom: 1em; background: #fff; padding-left: 1em; font-size: 90%;}
160 div#issue-changesets {float:right; width:45%; margin-left: 1em; margin-bottom: 1em; background: #fff; padding-left: 1em; font-size: 90%;}
161 div#issue-changesets .changeset { padding: 4px;}
161 div#issue-changesets .changeset { padding: 4px;}
162 div#issue-changesets .changeset { border-bottom: 1px solid #ddd; }
162 div#issue-changesets .changeset { border-bottom: 1px solid #ddd; }
163 div#issue-changesets p { margin-top: 0; margin-bottom: 1em;}
163 div#issue-changesets p { margin-top: 0; margin-bottom: 1em;}
164
164
165 div#activity dl { margin-left: 2em; }
165 div#activity dl { margin-left: 2em; }
166 div#activity dd { margin-bottom: 1em; }
166 div#activity dd { margin-bottom: 1em; }
167 div#activity dt { margin-bottom: 1px; }
167 div#activity dt { margin-bottom: 1px; }
168 div#activity dt .time { color: #777; font-size: 80%; }
168 div#activity dt .time { color: #777; font-size: 80%; }
169 div#activity dd .description { font-style: italic; }
169 div#activity dd .description { font-style: italic; }
170
170
171 div#roadmap fieldset.related-issues { margin-bottom: 1em; }
171 div#roadmap fieldset.related-issues { margin-bottom: 1em; }
172 div#roadmap fieldset.related-issues ul { margin-top: 0.3em; margin-bottom: 0.3em; }
172 div#roadmap fieldset.related-issues ul { margin-top: 0.3em; margin-bottom: 0.3em; }
173 div#roadmap .wiki h1:first-child { display: none; }
173 div#roadmap .wiki h1:first-child { display: none; }
174 div#roadmap .wiki h1 { font-size: 120%; }
174 div#roadmap .wiki h1 { font-size: 120%; }
175 div#roadmap .wiki h2 { font-size: 110%; }
175 div#roadmap .wiki h2 { font-size: 110%; }
176
176
177 div#version-summary { float:right; width:380px; margin-left: 16px; margin-bottom: 16px; background-color: #fff; }
178 div#version-summary fieldset { margin-bottom: 1em; }
179 div#version-summary .total-hours { text-align: right; }
180
177 table#time-report td.hours { text-align: right; padding-right: 0.5em; }
181 table#time-report td.hours { text-align: right; padding-right: 0.5em; }
178 table#time-report tbody tr { font-style: italic; color: #777; }
182 table#time-report tbody tr { font-style: italic; color: #777; }
179 table#time-report tbody tr.last-level { font-style: normal; color: #555; }
183 table#time-report tbody tr.last-level { font-style: normal; color: #555; }
180 table#time-report tbody tr.total { font-style: normal; font-weight: bold; color: #555; background-color:#EEEEEE; }
184 table#time-report tbody tr.total { font-style: normal; font-weight: bold; color: #555; background-color:#EEEEEE; }
181 table#time-report .hours-dec { font-size: 0.9em; }
185 table#time-report .hours-dec { font-size: 0.9em; }
182
186
183 div.total-hours { text-align: left; font-size: 110%; font-weight: bold; }
187 .total-hours { font-size: 110%; font-weight: bold; }
184 div.total-hours span.hours-int { font-size: 120%; }
188 .total-hours span.hours-int { font-size: 120%; }
185
189
186 .autoscroll {overflow-x: auto; padding:1px; width:100%; margin-bottom: 1.2em;}
190 .autoscroll {overflow-x: auto; padding:1px; width:100%; margin-bottom: 1.2em;}
187 #user_firstname, #user_lastname, #user_mail, #my_account_form select { width: 90%; }
191 #user_firstname, #user_lastname, #user_mail, #my_account_form select { width: 90%; }
188
192
189 .pagination {font-size: 90%}
193 .pagination {font-size: 90%}
190 p.pagination {margin-top:8px;}
194 p.pagination {margin-top:8px;}
191
195
192 /***** Tabular forms ******/
196 /***** Tabular forms ******/
193 .tabular p{
197 .tabular p{
194 margin: 0;
198 margin: 0;
195 padding: 5px 0 8px 0;
199 padding: 5px 0 8px 0;
196 padding-left: 180px; /*width of left column containing the label elements*/
200 padding-left: 180px; /*width of left column containing the label elements*/
197 height: 1%;
201 height: 1%;
198 clear:left;
202 clear:left;
199 }
203 }
200
204
201 .tabular label{
205 .tabular label{
202 font-weight: bold;
206 font-weight: bold;
203 float: left;
207 float: left;
204 text-align: right;
208 text-align: right;
205 margin-left: -180px; /*width of left column*/
209 margin-left: -180px; /*width of left column*/
206 width: 175px; /*width of labels. Should be smaller than left column to create some right
210 width: 175px; /*width of labels. Should be smaller than left column to create some right
207 margin*/
211 margin*/
208 }
212 }
209
213
210 .tabular label.floating{
214 .tabular label.floating{
211 font-weight: normal;
215 font-weight: normal;
212 margin-left: 0px;
216 margin-left: 0px;
213 text-align: left;
217 text-align: left;
214 width: 200px;
218 width: 200px;
215 }
219 }
216
220
217 #preview fieldset {margin-top: 1em; background: url(../images/draft.png)}
221 #preview fieldset {margin-top: 1em; background: url(../images/draft.png)}
218
222
219 .tabular.settings p{ padding-left: 300px; }
223 .tabular.settings p{ padding-left: 300px; }
220 .tabular.settings label{ margin-left: -300px; width: 295px; }
224 .tabular.settings label{ margin-left: -300px; width: 295px; }
221
225
222 .required {color: #bb0000;}
226 .required {color: #bb0000;}
223 .summary {font-style: italic;}
227 .summary {font-style: italic;}
224
228
225 #attachments_fields input[type=text] {margin-left: 8px; }
229 #attachments_fields input[type=text] {margin-left: 8px; }
226
230
227 div.attachments p { margin:4px 0 2px 0; }
231 div.attachments p { margin:4px 0 2px 0; }
228 div.attachments img { vertical-align: middle; }
232 div.attachments img { vertical-align: middle; }
229 div.attachments span.author { font-size: 0.9em; color: #888; }
233 div.attachments span.author { font-size: 0.9em; color: #888; }
230
234
231 p.other-formats { text-align: right; font-size:0.9em; color: #666; }
235 p.other-formats { text-align: right; font-size:0.9em; color: #666; }
232 .other-formats span + span:before { content: "| "; }
236 .other-formats span + span:before { content: "| "; }
233
237
234 a.feed { background: url(../images/feed.png) no-repeat 1px 50%; padding: 2px 0px 3px 16px; }
238 a.feed { background: url(../images/feed.png) no-repeat 1px 50%; padding: 2px 0px 3px 16px; }
235
239
236 /***** Flash & error messages ****/
240 /***** Flash & error messages ****/
237 #errorExplanation, div.flash, .nodata {
241 #errorExplanation, div.flash, .nodata {
238 padding: 4px 4px 4px 30px;
242 padding: 4px 4px 4px 30px;
239 margin-bottom: 12px;
243 margin-bottom: 12px;
240 font-size: 1.1em;
244 font-size: 1.1em;
241 border: 2px solid;
245 border: 2px solid;
242 }
246 }
243
247
244 div.flash {margin-top: 8px;}
248 div.flash {margin-top: 8px;}
245
249
246 div.flash.error, #errorExplanation {
250 div.flash.error, #errorExplanation {
247 background: url(../images/false.png) 8px 5px no-repeat;
251 background: url(../images/false.png) 8px 5px no-repeat;
248 background-color: #ffe3e3;
252 background-color: #ffe3e3;
249 border-color: #dd0000;
253 border-color: #dd0000;
250 color: #550000;
254 color: #550000;
251 }
255 }
252
256
253 div.flash.notice {
257 div.flash.notice {
254 background: url(../images/true.png) 8px 5px no-repeat;
258 background: url(../images/true.png) 8px 5px no-repeat;
255 background-color: #dfffdf;
259 background-color: #dfffdf;
256 border-color: #9fcf9f;
260 border-color: #9fcf9f;
257 color: #005f00;
261 color: #005f00;
258 }
262 }
259
263
260 .nodata {
264 .nodata {
261 text-align: center;
265 text-align: center;
262 background-color: #FFEBC1;
266 background-color: #FFEBC1;
263 border-color: #FDBF3B;
267 border-color: #FDBF3B;
264 color: #A6750C;
268 color: #A6750C;
265 }
269 }
266
270
267 #errorExplanation ul { font-size: 0.9em;}
271 #errorExplanation ul { font-size: 0.9em;}
268
272
269 /***** Ajax indicator ******/
273 /***** Ajax indicator ******/
270 #ajax-indicator {
274 #ajax-indicator {
271 position: absolute; /* fixed not supported by IE */
275 position: absolute; /* fixed not supported by IE */
272 background-color:#eee;
276 background-color:#eee;
273 border: 1px solid #bbb;
277 border: 1px solid #bbb;
274 top:35%;
278 top:35%;
275 left:40%;
279 left:40%;
276 width:20%;
280 width:20%;
277 font-weight:bold;
281 font-weight:bold;
278 text-align:center;
282 text-align:center;
279 padding:0.6em;
283 padding:0.6em;
280 z-index:100;
284 z-index:100;
281 filter:alpha(opacity=50);
285 filter:alpha(opacity=50);
282 opacity: 0.5;
286 opacity: 0.5;
283 }
287 }
284
288
285 html>body #ajax-indicator { position: fixed; }
289 html>body #ajax-indicator { position: fixed; }
286
290
287 #ajax-indicator span {
291 #ajax-indicator span {
288 background-position: 0% 40%;
292 background-position: 0% 40%;
289 background-repeat: no-repeat;
293 background-repeat: no-repeat;
290 background-image: url(../images/loading.gif);
294 background-image: url(../images/loading.gif);
291 padding-left: 26px;
295 padding-left: 26px;
292 vertical-align: bottom;
296 vertical-align: bottom;
293 }
297 }
294
298
295 /***** Calendar *****/
299 /***** Calendar *****/
296 table.cal {border-collapse: collapse; width: 100%; margin: 8px 0 6px 0;border: 1px solid #d7d7d7;}
300 table.cal {border-collapse: collapse; width: 100%; margin: 8px 0 6px 0;border: 1px solid #d7d7d7;}
297 table.cal thead th {width: 14%;}
301 table.cal thead th {width: 14%;}
298 table.cal tbody tr {height: 100px;}
302 table.cal tbody tr {height: 100px;}
299 table.cal th { background-color:#EEEEEE; padding: 4px; }
303 table.cal th { background-color:#EEEEEE; padding: 4px; }
300 table.cal td {border: 1px solid #d7d7d7; vertical-align: top; font-size: 0.9em;}
304 table.cal td {border: 1px solid #d7d7d7; vertical-align: top; font-size: 0.9em;}
301 table.cal td p.day-num {font-size: 1.1em; text-align:right;}
305 table.cal td p.day-num {font-size: 1.1em; text-align:right;}
302 table.cal td.odd p.day-num {color: #bbb;}
306 table.cal td.odd p.day-num {color: #bbb;}
303 table.cal td.today {background:#ffffdd;}
307 table.cal td.today {background:#ffffdd;}
304 table.cal td.today p.day-num {font-weight: bold;}
308 table.cal td.today p.day-num {font-weight: bold;}
305
309
306 /***** Tooltips ******/
310 /***** Tooltips ******/
307 .tooltip{position:relative;z-index:24;}
311 .tooltip{position:relative;z-index:24;}
308 .tooltip:hover{z-index:25;color:#000;}
312 .tooltip:hover{z-index:25;color:#000;}
309 .tooltip span.tip{display: none; text-align:left;}
313 .tooltip span.tip{display: none; text-align:left;}
310
314
311 div.tooltip:hover span.tip{
315 div.tooltip:hover span.tip{
312 display:block;
316 display:block;
313 position:absolute;
317 position:absolute;
314 top:12px; left:24px; width:270px;
318 top:12px; left:24px; width:270px;
315 border:1px solid #555;
319 border:1px solid #555;
316 background-color:#fff;
320 background-color:#fff;
317 padding: 4px;
321 padding: 4px;
318 font-size: 0.8em;
322 font-size: 0.8em;
319 color:#505050;
323 color:#505050;
320 }
324 }
321
325
322 /***** Progress bar *****/
326 /***** Progress bar *****/
323 table.progress {
327 table.progress {
324 border: 1px solid #D7D7D7;
328 border: 1px solid #D7D7D7;
325 border-collapse: collapse;
329 border-collapse: collapse;
326 border-spacing: 0pt;
330 border-spacing: 0pt;
327 empty-cells: show;
331 empty-cells: show;
328 text-align: center;
332 text-align: center;
329 float:left;
333 float:left;
330 margin: 1px 6px 1px 0px;
334 margin: 1px 6px 1px 0px;
331 }
335 }
332
336
333 table.progress td { height: 0.9em; }
337 table.progress td { height: 0.9em; }
334 table.progress td.closed { background: #BAE0BA none repeat scroll 0%; }
338 table.progress td.closed { background: #BAE0BA none repeat scroll 0%; }
335 table.progress td.done { background: #DEF0DE none repeat scroll 0%; }
339 table.progress td.done { background: #DEF0DE none repeat scroll 0%; }
336 table.progress td.open { background: #FFF none repeat scroll 0%; }
340 table.progress td.open { background: #FFF none repeat scroll 0%; }
337 p.pourcent {font-size: 80%;}
341 p.pourcent {font-size: 80%;}
338 p.progress-info {clear: left; font-style: italic; font-size: 80%;}
342 p.progress-info {clear: left; font-style: italic; font-size: 80%;}
339
343
340 div#status_by { float:right; width:380px; margin-left: 16px; margin-bottom: 16px; }
341
342 /***** Tabs *****/
344 /***** Tabs *****/
343 #content .tabs {height: 2.6em; border-bottom: 1px solid #bbbbbb; margin-bottom:1.2em; position:relative;}
345 #content .tabs {height: 2.6em; border-bottom: 1px solid #bbbbbb; margin-bottom:1.2em; position:relative;}
344 #content .tabs ul {margin:0; position:absolute; bottom:-2px; padding-left:1em;}
346 #content .tabs ul {margin:0; position:absolute; bottom:-2px; padding-left:1em;}
345 #content .tabs>ul { bottom:-1px; } /* others */
347 #content .tabs>ul { bottom:-1px; } /* others */
346 #content .tabs ul li {
348 #content .tabs ul li {
347 float:left;
349 float:left;
348 list-style-type:none;
350 list-style-type:none;
349 white-space:nowrap;
351 white-space:nowrap;
350 margin-right:8px;
352 margin-right:8px;
351 background:#fff;
353 background:#fff;
352 }
354 }
353 #content .tabs ul li a{
355 #content .tabs ul li a{
354 display:block;
356 display:block;
355 font-size: 0.9em;
357 font-size: 0.9em;
356 text-decoration:none;
358 text-decoration:none;
357 line-height:1.3em;
359 line-height:1.3em;
358 padding:4px 6px 4px 6px;
360 padding:4px 6px 4px 6px;
359 border: 1px solid #ccc;
361 border: 1px solid #ccc;
360 border-bottom: 1px solid #bbbbbb;
362 border-bottom: 1px solid #bbbbbb;
361 background-color: #eeeeee;
363 background-color: #eeeeee;
362 color:#777;
364 color:#777;
363 font-weight:bold;
365 font-weight:bold;
364 }
366 }
365
367
366 #content .tabs ul li a:hover {
368 #content .tabs ul li a:hover {
367 background-color: #ffffdd;
369 background-color: #ffffdd;
368 text-decoration:none;
370 text-decoration:none;
369 }
371 }
370
372
371 #content .tabs ul li a.selected {
373 #content .tabs ul li a.selected {
372 background-color: #fff;
374 background-color: #fff;
373 border: 1px solid #bbbbbb;
375 border: 1px solid #bbbbbb;
374 border-bottom: 1px solid #fff;
376 border-bottom: 1px solid #fff;
375 }
377 }
376
378
377 #content .tabs ul li a.selected:hover {
379 #content .tabs ul li a.selected:hover {
378 background-color: #fff;
380 background-color: #fff;
379 }
381 }
380
382
381 /***** Diff *****/
383 /***** Diff *****/
382 .diff_out { background: #fcc; }
384 .diff_out { background: #fcc; }
383 .diff_in { background: #cfc; }
385 .diff_in { background: #cfc; }
384
386
385 /***** Wiki *****/
387 /***** Wiki *****/
386 div.wiki table {
388 div.wiki table {
387 border: 1px solid #505050;
389 border: 1px solid #505050;
388 border-collapse: collapse;
390 border-collapse: collapse;
389 }
391 }
390
392
391 div.wiki table, div.wiki td, div.wiki th {
393 div.wiki table, div.wiki td, div.wiki th {
392 border: 1px solid #bbb;
394 border: 1px solid #bbb;
393 padding: 4px;
395 padding: 4px;
394 }
396 }
395
397
396 div.wiki .external {
398 div.wiki .external {
397 background-position: 0% 60%;
399 background-position: 0% 60%;
398 background-repeat: no-repeat;
400 background-repeat: no-repeat;
399 padding-left: 12px;
401 padding-left: 12px;
400 background-image: url(../images/external.png);
402 background-image: url(../images/external.png);
401 }
403 }
402
404
403 div.wiki a.new {
405 div.wiki a.new {
404 color: #b73535;
406 color: #b73535;
405 }
407 }
406
408
407 div.wiki pre {
409 div.wiki pre {
408 margin: 1em 1em 1em 1.6em;
410 margin: 1em 1em 1em 1.6em;
409 padding: 2px;
411 padding: 2px;
410 background-color: #fafafa;
412 background-color: #fafafa;
411 border: 1px solid #dadada;
413 border: 1px solid #dadada;
412 width:95%;
414 width:95%;
413 overflow-x: auto;
415 overflow-x: auto;
414 }
416 }
415
417
416 div.wiki div.toc {
418 div.wiki div.toc {
417 background-color: #ffffdd;
419 background-color: #ffffdd;
418 border: 1px solid #e4e4e4;
420 border: 1px solid #e4e4e4;
419 padding: 4px;
421 padding: 4px;
420 line-height: 1.2em;
422 line-height: 1.2em;
421 margin-bottom: 12px;
423 margin-bottom: 12px;
422 margin-right: 12px;
424 margin-right: 12px;
423 display: table
425 display: table
424 }
426 }
425 * html div.wiki div.toc { width: 50%; } /* IE6 doesn't autosize div */
427 * html div.wiki div.toc { width: 50%; } /* IE6 doesn't autosize div */
426
428
427 div.wiki div.toc.right { float: right; margin-left: 12px; margin-right: 0; width: auto; }
429 div.wiki div.toc.right { float: right; margin-left: 12px; margin-right: 0; width: auto; }
428 div.wiki div.toc.left { float: left; margin-right: 12px; margin-left: 0; width: auto; }
430 div.wiki div.toc.left { float: left; margin-right: 12px; margin-left: 0; width: auto; }
429
431
430 div.wiki div.toc a {
432 div.wiki div.toc a {
431 display: block;
433 display: block;
432 font-size: 0.9em;
434 font-size: 0.9em;
433 font-weight: normal;
435 font-weight: normal;
434 text-decoration: none;
436 text-decoration: none;
435 color: #606060;
437 color: #606060;
436 }
438 }
437 div.wiki div.toc a:hover { color: #c61a1a; text-decoration: underline;}
439 div.wiki div.toc a:hover { color: #c61a1a; text-decoration: underline;}
438
440
439 div.wiki div.toc a.heading2 { margin-left: 6px; }
441 div.wiki div.toc a.heading2 { margin-left: 6px; }
440 div.wiki div.toc a.heading3 { margin-left: 12px; font-size: 0.8em; }
442 div.wiki div.toc a.heading3 { margin-left: 12px; font-size: 0.8em; }
441
443
442 /***** My page layout *****/
444 /***** My page layout *****/
443 .block-receiver {
445 .block-receiver {
444 border:1px dashed #c0c0c0;
446 border:1px dashed #c0c0c0;
445 margin-bottom: 20px;
447 margin-bottom: 20px;
446 padding: 15px 0 15px 0;
448 padding: 15px 0 15px 0;
447 }
449 }
448
450
449 .mypage-box {
451 .mypage-box {
450 margin:0 0 20px 0;
452 margin:0 0 20px 0;
451 color:#505050;
453 color:#505050;
452 line-height:1.5em;
454 line-height:1.5em;
453 }
455 }
454
456
455 .handle {
457 .handle {
456 cursor: move;
458 cursor: move;
457 }
459 }
458
460
459 a.close-icon {
461 a.close-icon {
460 display:block;
462 display:block;
461 margin-top:3px;
463 margin-top:3px;
462 overflow:hidden;
464 overflow:hidden;
463 width:12px;
465 width:12px;
464 height:12px;
466 height:12px;
465 background-repeat: no-repeat;
467 background-repeat: no-repeat;
466 cursor:pointer;
468 cursor:pointer;
467 background-image:url('../images/close.png');
469 background-image:url('../images/close.png');
468 }
470 }
469
471
470 a.close-icon:hover {
472 a.close-icon:hover {
471 background-image:url('../images/close_hl.png');
473 background-image:url('../images/close_hl.png');
472 }
474 }
473
475
474 /***** Gantt chart *****/
476 /***** Gantt chart *****/
475 .gantt_hdr {
477 .gantt_hdr {
476 position:absolute;
478 position:absolute;
477 top:0;
479 top:0;
478 height:16px;
480 height:16px;
479 border-top: 1px solid #c0c0c0;
481 border-top: 1px solid #c0c0c0;
480 border-bottom: 1px solid #c0c0c0;
482 border-bottom: 1px solid #c0c0c0;
481 border-right: 1px solid #c0c0c0;
483 border-right: 1px solid #c0c0c0;
482 text-align: center;
484 text-align: center;
483 overflow: hidden;
485 overflow: hidden;
484 }
486 }
485
487
486 .task {
488 .task {
487 position: absolute;
489 position: absolute;
488 height:8px;
490 height:8px;
489 font-size:0.8em;
491 font-size:0.8em;
490 color:#888;
492 color:#888;
491 padding:0;
493 padding:0;
492 margin:0;
494 margin:0;
493 line-height:0.8em;
495 line-height:0.8em;
494 }
496 }
495
497
496 .task_late { background:#f66 url(../images/task_late.png); border: 1px solid #f66; }
498 .task_late { background:#f66 url(../images/task_late.png); border: 1px solid #f66; }
497 .task_done { background:#66f url(../images/task_done.png); border: 1px solid #66f; }
499 .task_done { background:#66f url(../images/task_done.png); border: 1px solid #66f; }
498 .task_todo { background:#aaa url(../images/task_todo.png); border: 1px solid #aaa; }
500 .task_todo { background:#aaa url(../images/task_todo.png); border: 1px solid #aaa; }
499 .milestone { background-image:url(../images/milestone.png); background-repeat: no-repeat; border: 0; }
501 .milestone { background-image:url(../images/milestone.png); background-repeat: no-repeat; border: 0; }
500
502
501 /***** Icons *****/
503 /***** Icons *****/
502 .icon {
504 .icon {
503 background-position: 0% 40%;
505 background-position: 0% 40%;
504 background-repeat: no-repeat;
506 background-repeat: no-repeat;
505 padding-left: 20px;
507 padding-left: 20px;
506 padding-top: 2px;
508 padding-top: 2px;
507 padding-bottom: 3px;
509 padding-bottom: 3px;
508 }
510 }
509
511
510 .icon22 {
512 .icon22 {
511 background-position: 0% 40%;
513 background-position: 0% 40%;
512 background-repeat: no-repeat;
514 background-repeat: no-repeat;
513 padding-left: 26px;
515 padding-left: 26px;
514 line-height: 22px;
516 line-height: 22px;
515 vertical-align: middle;
517 vertical-align: middle;
516 }
518 }
517
519
518 .icon-add { background-image: url(../images/add.png); }
520 .icon-add { background-image: url(../images/add.png); }
519 .icon-edit { background-image: url(../images/edit.png); }
521 .icon-edit { background-image: url(../images/edit.png); }
520 .icon-copy { background-image: url(../images/copy.png); }
522 .icon-copy { background-image: url(../images/copy.png); }
521 .icon-del { background-image: url(../images/delete.png); }
523 .icon-del { background-image: url(../images/delete.png); }
522 .icon-move { background-image: url(../images/move.png); }
524 .icon-move { background-image: url(../images/move.png); }
523 .icon-save { background-image: url(../images/save.png); }
525 .icon-save { background-image: url(../images/save.png); }
524 .icon-cancel { background-image: url(../images/cancel.png); }
526 .icon-cancel { background-image: url(../images/cancel.png); }
525 .icon-file { background-image: url(../images/file.png); }
527 .icon-file { background-image: url(../images/file.png); }
526 .icon-folder { background-image: url(../images/folder.png); }
528 .icon-folder { background-image: url(../images/folder.png); }
527 .open .icon-folder { background-image: url(../images/folder_open.png); }
529 .open .icon-folder { background-image: url(../images/folder_open.png); }
528 .icon-package { background-image: url(../images/package.png); }
530 .icon-package { background-image: url(../images/package.png); }
529 .icon-home { background-image: url(../images/home.png); }
531 .icon-home { background-image: url(../images/home.png); }
530 .icon-user { background-image: url(../images/user.png); }
532 .icon-user { background-image: url(../images/user.png); }
531 .icon-mypage { background-image: url(../images/user_page.png); }
533 .icon-mypage { background-image: url(../images/user_page.png); }
532 .icon-admin { background-image: url(../images/admin.png); }
534 .icon-admin { background-image: url(../images/admin.png); }
533 .icon-projects { background-image: url(../images/projects.png); }
535 .icon-projects { background-image: url(../images/projects.png); }
534 .icon-logout { background-image: url(../images/logout.png); }
536 .icon-logout { background-image: url(../images/logout.png); }
535 .icon-help { background-image: url(../images/help.png); }
537 .icon-help { background-image: url(../images/help.png); }
536 .icon-attachment { background-image: url(../images/attachment.png); }
538 .icon-attachment { background-image: url(../images/attachment.png); }
537 .icon-index { background-image: url(../images/index.png); }
539 .icon-index { background-image: url(../images/index.png); }
538 .icon-history { background-image: url(../images/history.png); }
540 .icon-history { background-image: url(../images/history.png); }
539 .icon-time { background-image: url(../images/time.png); }
541 .icon-time { background-image: url(../images/time.png); }
540 .icon-stats { background-image: url(../images/stats.png); }
542 .icon-stats { background-image: url(../images/stats.png); }
541 .icon-warning { background-image: url(../images/warning.png); }
543 .icon-warning { background-image: url(../images/warning.png); }
542 .icon-fav { background-image: url(../images/fav.png); }
544 .icon-fav { background-image: url(../images/fav.png); }
543 .icon-fav-off { background-image: url(../images/fav_off.png); }
545 .icon-fav-off { background-image: url(../images/fav_off.png); }
544 .icon-reload { background-image: url(../images/reload.png); }
546 .icon-reload { background-image: url(../images/reload.png); }
545 .icon-lock { background-image: url(../images/locked.png); }
547 .icon-lock { background-image: url(../images/locked.png); }
546 .icon-unlock { background-image: url(../images/unlock.png); }
548 .icon-unlock { background-image: url(../images/unlock.png); }
547 .icon-checked { background-image: url(../images/true.png); }
549 .icon-checked { background-image: url(../images/true.png); }
548 .icon-details { background-image: url(../images/zoom_in.png); }
550 .icon-details { background-image: url(../images/zoom_in.png); }
549 .icon-report { background-image: url(../images/report.png); }
551 .icon-report { background-image: url(../images/report.png); }
550
552
551 .icon22-projects { background-image: url(../images/22x22/projects.png); }
553 .icon22-projects { background-image: url(../images/22x22/projects.png); }
552 .icon22-users { background-image: url(../images/22x22/users.png); }
554 .icon22-users { background-image: url(../images/22x22/users.png); }
553 .icon22-tracker { background-image: url(../images/22x22/tracker.png); }
555 .icon22-tracker { background-image: url(../images/22x22/tracker.png); }
554 .icon22-role { background-image: url(../images/22x22/role.png); }
556 .icon22-role { background-image: url(../images/22x22/role.png); }
555 .icon22-workflow { background-image: url(../images/22x22/workflow.png); }
557 .icon22-workflow { background-image: url(../images/22x22/workflow.png); }
556 .icon22-options { background-image: url(../images/22x22/options.png); }
558 .icon22-options { background-image: url(../images/22x22/options.png); }
557 .icon22-notifications { background-image: url(../images/22x22/notifications.png); }
559 .icon22-notifications { background-image: url(../images/22x22/notifications.png); }
558 .icon22-authent { background-image: url(../images/22x22/authent.png); }
560 .icon22-authent { background-image: url(../images/22x22/authent.png); }
559 .icon22-info { background-image: url(../images/22x22/info.png); }
561 .icon22-info { background-image: url(../images/22x22/info.png); }
560 .icon22-comment { background-image: url(../images/22x22/comment.png); }
562 .icon22-comment { background-image: url(../images/22x22/comment.png); }
561 .icon22-package { background-image: url(../images/22x22/package.png); }
563 .icon22-package { background-image: url(../images/22x22/package.png); }
562 .icon22-settings { background-image: url(../images/22x22/settings.png); }
564 .icon22-settings { background-image: url(../images/22x22/settings.png); }
563 .icon22-plugin { background-image: url(../images/22x22/plugin.png); }
565 .icon22-plugin { background-image: url(../images/22x22/plugin.png); }
564
566
565 /***** Media print specific styles *****/
567 /***** Media print specific styles *****/
566 @media print {
568 @media print {
567 #top-menu, #header, #main-menu, #sidebar, #footer, .contextual { display:none; }
569 #top-menu, #header, #main-menu, #sidebar, #footer, .contextual { display:none; }
568 #main { background: #fff; }
570 #main { background: #fff; }
569 #content { width: 99%; margin: 0; padding: 0; border: 0; background: #fff; }
571 #content { width: 99%; margin: 0; padding: 0; border: 0; background: #fff; }
570 }
572 }
General Comments 0
You need to be logged in to leave comments. Login now