##// END OF EJS Templates
Strikethru closed issue links (#1127)....
Jean-Philippe Lang -
r1663:83baccb71ac0
parent child
Show More
@@ -1,519 +1,522
1 # redMine - project management software
1 # redMine - project management software
2 # Copyright (C) 2006-2007 Jean-Philippe Lang
2 # Copyright (C) 2006-2007 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 'coderay'
18 require 'coderay'
19 require 'coderay/helpers/file_type'
19 require 'coderay/helpers/file_type'
20
20
21 module ApplicationHelper
21 module ApplicationHelper
22 include Redmine::WikiFormatting::Macros::Definitions
22 include Redmine::WikiFormatting::Macros::Definitions
23
23
24 def current_role
24 def current_role
25 @current_role ||= User.current.role_for_project(@project)
25 @current_role ||= User.current.role_for_project(@project)
26 end
26 end
27
27
28 # Return true if user is authorized for controller/action, otherwise false
28 # Return true if user is authorized for controller/action, otherwise false
29 def authorize_for(controller, action)
29 def authorize_for(controller, action)
30 User.current.allowed_to?({:controller => controller, :action => action}, @project)
30 User.current.allowed_to?({:controller => controller, :action => action}, @project)
31 end
31 end
32
32
33 # Display a link if user is authorized
33 # Display a link if user is authorized
34 def link_to_if_authorized(name, options = {}, html_options = nil, *parameters_for_method_reference)
34 def link_to_if_authorized(name, options = {}, html_options = nil, *parameters_for_method_reference)
35 link_to(name, options, html_options, *parameters_for_method_reference) if authorize_for(options[:controller] || params[:controller], options[:action])
35 link_to(name, options, html_options, *parameters_for_method_reference) if authorize_for(options[:controller] || params[:controller], options[:action])
36 end
36 end
37
37
38 # Display a link to user's account page
38 # Display a link to user's account page
39 def link_to_user(user)
39 def link_to_user(user)
40 user ? link_to(user, :controller => 'account', :action => 'show', :id => user) : 'Anonymous'
40 user ? link_to(user, :controller => 'account', :action => 'show', :id => user) : 'Anonymous'
41 end
41 end
42
42
43 def link_to_issue(issue, options={})
43 def link_to_issue(issue, options={})
44 options[:class] ||= ''
45 options[:class] << ' issue'
46 options[:class] << ' closed' if issue.closed?
44 link_to "#{issue.tracker.name} ##{issue.id}", {:controller => "issues", :action => "show", :id => issue}, options
47 link_to "#{issue.tracker.name} ##{issue.id}", {:controller => "issues", :action => "show", :id => issue}, options
45 end
48 end
46
49
47 def toggle_link(name, id, options={})
50 def toggle_link(name, id, options={})
48 onclick = "Element.toggle('#{id}'); "
51 onclick = "Element.toggle('#{id}'); "
49 onclick << (options[:focus] ? "Form.Element.focus('#{options[:focus]}'); " : "this.blur(); ")
52 onclick << (options[:focus] ? "Form.Element.focus('#{options[:focus]}'); " : "this.blur(); ")
50 onclick << "return false;"
53 onclick << "return false;"
51 link_to(name, "#", :onclick => onclick)
54 link_to(name, "#", :onclick => onclick)
52 end
55 end
53
56
54 def image_to_function(name, function, html_options = {})
57 def image_to_function(name, function, html_options = {})
55 html_options.symbolize_keys!
58 html_options.symbolize_keys!
56 tag(:input, html_options.merge({
59 tag(:input, html_options.merge({
57 :type => "image", :src => image_path(name),
60 :type => "image", :src => image_path(name),
58 :onclick => (html_options[:onclick] ? "#{html_options[:onclick]}; " : "") + "#{function};"
61 :onclick => (html_options[:onclick] ? "#{html_options[:onclick]}; " : "") + "#{function};"
59 }))
62 }))
60 end
63 end
61
64
62 def prompt_to_remote(name, text, param, url, html_options = {})
65 def prompt_to_remote(name, text, param, url, html_options = {})
63 html_options[:onclick] = "promptToRemote('#{text}', '#{param}', '#{url_for(url)}'); return false;"
66 html_options[:onclick] = "promptToRemote('#{text}', '#{param}', '#{url_for(url)}'); return false;"
64 link_to name, {}, html_options
67 link_to name, {}, html_options
65 end
68 end
66
69
67 def format_date(date)
70 def format_date(date)
68 return nil unless date
71 return nil unless date
69 # "Setting.date_format.size < 2" is a temporary fix (content of date_format setting changed)
72 # "Setting.date_format.size < 2" is a temporary fix (content of date_format setting changed)
70 @date_format ||= (Setting.date_format.blank? || Setting.date_format.size < 2 ? l(:general_fmt_date) : Setting.date_format)
73 @date_format ||= (Setting.date_format.blank? || Setting.date_format.size < 2 ? l(:general_fmt_date) : Setting.date_format)
71 date.strftime(@date_format)
74 date.strftime(@date_format)
72 end
75 end
73
76
74 def format_time(time, include_date = true)
77 def format_time(time, include_date = true)
75 return nil unless time
78 return nil unless time
76 time = time.to_time if time.is_a?(String)
79 time = time.to_time if time.is_a?(String)
77 zone = User.current.time_zone
80 zone = User.current.time_zone
78 local = zone ? time.in_time_zone(zone) : (time.utc? ? time.utc_to_local : time)
81 local = zone ? time.in_time_zone(zone) : (time.utc? ? time.utc_to_local : time)
79 @date_format ||= (Setting.date_format.blank? || Setting.date_format.size < 2 ? l(:general_fmt_date) : Setting.date_format)
82 @date_format ||= (Setting.date_format.blank? || Setting.date_format.size < 2 ? l(:general_fmt_date) : Setting.date_format)
80 @time_format ||= (Setting.time_format.blank? ? l(:general_fmt_time) : Setting.time_format)
83 @time_format ||= (Setting.time_format.blank? ? l(:general_fmt_time) : Setting.time_format)
81 include_date ? local.strftime("#{@date_format} #{@time_format}") : local.strftime(@time_format)
84 include_date ? local.strftime("#{@date_format} #{@time_format}") : local.strftime(@time_format)
82 end
85 end
83
86
84 # Truncates and returns the string as a single line
87 # Truncates and returns the string as a single line
85 def truncate_single_line(string, *args)
88 def truncate_single_line(string, *args)
86 truncate(string, *args).gsub(%r{[\r\n]+}m, ' ')
89 truncate(string, *args).gsub(%r{[\r\n]+}m, ' ')
87 end
90 end
88
91
89 def html_hours(text)
92 def html_hours(text)
90 text.gsub(%r{(\d+)\.(\d+)}, '<span class="hours hours-int">\1</span><span class="hours hours-dec">.\2</span>')
93 text.gsub(%r{(\d+)\.(\d+)}, '<span class="hours hours-int">\1</span><span class="hours hours-dec">.\2</span>')
91 end
94 end
92
95
93 def authoring(created, author)
96 def authoring(created, author)
94 time_tag = content_tag('acronym', distance_of_time_in_words(Time.now, created), :title => format_time(created))
97 time_tag = content_tag('acronym', distance_of_time_in_words(Time.now, created), :title => format_time(created))
95 author_tag = (author.is_a?(User) && !author.anonymous?) ? link_to(h(author), :controller => 'account', :action => 'show', :id => author) : h(author || 'Anonymous')
98 author_tag = (author.is_a?(User) && !author.anonymous?) ? link_to(h(author), :controller => 'account', :action => 'show', :id => author) : h(author || 'Anonymous')
96 l(:label_added_time_by, author_tag, time_tag)
99 l(:label_added_time_by, author_tag, time_tag)
97 end
100 end
98
101
99 def l_or_humanize(s)
102 def l_or_humanize(s)
100 l_has_string?("label_#{s}".to_sym) ? l("label_#{s}".to_sym) : s.to_s.humanize
103 l_has_string?("label_#{s}".to_sym) ? l("label_#{s}".to_sym) : s.to_s.humanize
101 end
104 end
102
105
103 def day_name(day)
106 def day_name(day)
104 l(:general_day_names).split(',')[day-1]
107 l(:general_day_names).split(',')[day-1]
105 end
108 end
106
109
107 def month_name(month)
110 def month_name(month)
108 l(:actionview_datehelper_select_month_names).split(',')[month-1]
111 l(:actionview_datehelper_select_month_names).split(',')[month-1]
109 end
112 end
110
113
111 def syntax_highlight(name, content)
114 def syntax_highlight(name, content)
112 type = CodeRay::FileType[name]
115 type = CodeRay::FileType[name]
113 type ? CodeRay.scan(content, type).html : h(content)
116 type ? CodeRay.scan(content, type).html : h(content)
114 end
117 end
115
118
116 def to_path_param(path)
119 def to_path_param(path)
117 path.to_s.split(%r{[/\\]}).select {|p| !p.blank?}
120 path.to_s.split(%r{[/\\]}).select {|p| !p.blank?}
118 end
121 end
119
122
120 def pagination_links_full(paginator, count=nil, options={})
123 def pagination_links_full(paginator, count=nil, options={})
121 page_param = options.delete(:page_param) || :page
124 page_param = options.delete(:page_param) || :page
122 url_param = params.dup
125 url_param = params.dup
123 # don't reuse params if filters are present
126 # don't reuse params if filters are present
124 url_param.clear if url_param.has_key?(:set_filter)
127 url_param.clear if url_param.has_key?(:set_filter)
125
128
126 html = ''
129 html = ''
127 html << link_to_remote(('&#171; ' + l(:label_previous)),
130 html << link_to_remote(('&#171; ' + l(:label_previous)),
128 {:update => 'content',
131 {:update => 'content',
129 :url => url_param.merge(page_param => paginator.current.previous),
132 :url => url_param.merge(page_param => paginator.current.previous),
130 :complete => 'window.scrollTo(0,0)'},
133 :complete => 'window.scrollTo(0,0)'},
131 {:href => url_for(:params => url_param.merge(page_param => paginator.current.previous))}) + ' ' if paginator.current.previous
134 {:href => url_for(:params => url_param.merge(page_param => paginator.current.previous))}) + ' ' if paginator.current.previous
132
135
133 html << (pagination_links_each(paginator, options) do |n|
136 html << (pagination_links_each(paginator, options) do |n|
134 link_to_remote(n.to_s,
137 link_to_remote(n.to_s,
135 {:url => {:params => url_param.merge(page_param => n)},
138 {:url => {:params => url_param.merge(page_param => n)},
136 :update => 'content',
139 :update => 'content',
137 :complete => 'window.scrollTo(0,0)'},
140 :complete => 'window.scrollTo(0,0)'},
138 {:href => url_for(:params => url_param.merge(page_param => n))})
141 {:href => url_for(:params => url_param.merge(page_param => n))})
139 end || '')
142 end || '')
140
143
141 html << ' ' + link_to_remote((l(:label_next) + ' &#187;'),
144 html << ' ' + link_to_remote((l(:label_next) + ' &#187;'),
142 {:update => 'content',
145 {:update => 'content',
143 :url => url_param.merge(page_param => paginator.current.next),
146 :url => url_param.merge(page_param => paginator.current.next),
144 :complete => 'window.scrollTo(0,0)'},
147 :complete => 'window.scrollTo(0,0)'},
145 {:href => url_for(:params => url_param.merge(page_param => paginator.current.next))}) if paginator.current.next
148 {:href => url_for(:params => url_param.merge(page_param => paginator.current.next))}) if paginator.current.next
146
149
147 unless count.nil?
150 unless count.nil?
148 html << [" (#{paginator.current.first_item}-#{paginator.current.last_item}/#{count})", per_page_links(paginator.items_per_page)].compact.join(' | ')
151 html << [" (#{paginator.current.first_item}-#{paginator.current.last_item}/#{count})", per_page_links(paginator.items_per_page)].compact.join(' | ')
149 end
152 end
150
153
151 html
154 html
152 end
155 end
153
156
154 def per_page_links(selected=nil)
157 def per_page_links(selected=nil)
155 url_param = params.dup
158 url_param = params.dup
156 url_param.clear if url_param.has_key?(:set_filter)
159 url_param.clear if url_param.has_key?(:set_filter)
157
160
158 links = Setting.per_page_options_array.collect do |n|
161 links = Setting.per_page_options_array.collect do |n|
159 n == selected ? n : link_to_remote(n, {:update => "content", :url => params.dup.merge(:per_page => n)},
162 n == selected ? n : link_to_remote(n, {:update => "content", :url => params.dup.merge(:per_page => n)},
160 {:href => url_for(url_param.merge(:per_page => n))})
163 {:href => url_for(url_param.merge(:per_page => n))})
161 end
164 end
162 links.size > 1 ? l(:label_display_per_page, links.join(', ')) : nil
165 links.size > 1 ? l(:label_display_per_page, links.join(', ')) : nil
163 end
166 end
164
167
165 def breadcrumb(*args)
168 def breadcrumb(*args)
166 content_tag('p', args.join(' &#187; ') + ' &#187; ', :class => 'breadcrumb')
169 content_tag('p', args.join(' &#187; ') + ' &#187; ', :class => 'breadcrumb')
167 end
170 end
168
171
169 def html_title(*args)
172 def html_title(*args)
170 if args.empty?
173 if args.empty?
171 title = []
174 title = []
172 title << @project.name if @project
175 title << @project.name if @project
173 title += @html_title if @html_title
176 title += @html_title if @html_title
174 title << Setting.app_title
177 title << Setting.app_title
175 title.compact.join(' - ')
178 title.compact.join(' - ')
176 else
179 else
177 @html_title ||= []
180 @html_title ||= []
178 @html_title += args
181 @html_title += args
179 end
182 end
180 end
183 end
181
184
182 def accesskey(s)
185 def accesskey(s)
183 Redmine::AccessKeys.key_for s
186 Redmine::AccessKeys.key_for s
184 end
187 end
185
188
186 # Formats text according to system settings.
189 # Formats text according to system settings.
187 # 2 ways to call this method:
190 # 2 ways to call this method:
188 # * with a String: textilizable(text, options)
191 # * with a String: textilizable(text, options)
189 # * with an object and one of its attribute: textilizable(issue, :description, options)
192 # * with an object and one of its attribute: textilizable(issue, :description, options)
190 def textilizable(*args)
193 def textilizable(*args)
191 options = args.last.is_a?(Hash) ? args.pop : {}
194 options = args.last.is_a?(Hash) ? args.pop : {}
192 case args.size
195 case args.size
193 when 1
196 when 1
194 obj = nil
197 obj = nil
195 text = args.shift
198 text = args.shift
196 when 2
199 when 2
197 obj = args.shift
200 obj = args.shift
198 text = obj.send(args.shift).to_s
201 text = obj.send(args.shift).to_s
199 else
202 else
200 raise ArgumentError, 'invalid arguments to textilizable'
203 raise ArgumentError, 'invalid arguments to textilizable'
201 end
204 end
202 return '' if text.blank?
205 return '' if text.blank?
203
206
204 only_path = options.delete(:only_path) == false ? false : true
207 only_path = options.delete(:only_path) == false ? false : true
205
208
206 # when using an image link, try to use an attachment, if possible
209 # when using an image link, try to use an attachment, if possible
207 attachments = options[:attachments] || (obj && obj.respond_to?(:attachments) ? obj.attachments : nil)
210 attachments = options[:attachments] || (obj && obj.respond_to?(:attachments) ? obj.attachments : nil)
208
211
209 if attachments
212 if attachments
210 text = text.gsub(/!((\<|\=|\>)?(\([^\)]+\))?(\[[^\]]+\])?(\{[^\}]+\})?)(\S+\.(gif|jpg|jpeg|png))!/) do |m|
213 text = text.gsub(/!((\<|\=|\>)?(\([^\)]+\))?(\[[^\]]+\])?(\{[^\}]+\})?)(\S+\.(gif|jpg|jpeg|png))!/) do |m|
211 style = $1
214 style = $1
212 filename = $6
215 filename = $6
213 rf = Regexp.new(filename, Regexp::IGNORECASE)
216 rf = Regexp.new(filename, Regexp::IGNORECASE)
214 # search for the picture in attachments
217 # search for the picture in attachments
215 if found = attachments.detect { |att| att.filename =~ rf }
218 if found = attachments.detect { |att| att.filename =~ rf }
216 image_url = url_for :only_path => only_path, :controller => 'attachments', :action => 'download', :id => found
219 image_url = url_for :only_path => only_path, :controller => 'attachments', :action => 'download', :id => found
217 desc = found.description.to_s.gsub(/^([^\(\)]*).*$/, "\\1")
220 desc = found.description.to_s.gsub(/^([^\(\)]*).*$/, "\\1")
218 alt = desc.blank? ? nil : "(#{desc})"
221 alt = desc.blank? ? nil : "(#{desc})"
219 "!#{style}#{image_url}#{alt}!"
222 "!#{style}#{image_url}#{alt}!"
220 else
223 else
221 "!#{style}#{filename}!"
224 "!#{style}#{filename}!"
222 end
225 end
223 end
226 end
224 end
227 end
225
228
226 text = (Setting.text_formatting == 'textile') ?
229 text = (Setting.text_formatting == 'textile') ?
227 Redmine::WikiFormatting.to_html(text) { |macro, args| exec_macro(macro, obj, args) } :
230 Redmine::WikiFormatting.to_html(text) { |macro, args| exec_macro(macro, obj, args) } :
228 simple_format(auto_link(h(text)))
231 simple_format(auto_link(h(text)))
229
232
230 # different methods for formatting wiki links
233 # different methods for formatting wiki links
231 case options[:wiki_links]
234 case options[:wiki_links]
232 when :local
235 when :local
233 # used for local links to html files
236 # used for local links to html files
234 format_wiki_link = Proc.new {|project, title| "#{title}.html" }
237 format_wiki_link = Proc.new {|project, title| "#{title}.html" }
235 when :anchor
238 when :anchor
236 # used for single-file wiki export
239 # used for single-file wiki export
237 format_wiki_link = Proc.new {|project, title| "##{title}" }
240 format_wiki_link = Proc.new {|project, title| "##{title}" }
238 else
241 else
239 format_wiki_link = Proc.new {|project, title| url_for(:only_path => only_path, :controller => 'wiki', :action => 'index', :id => project, :page => title) }
242 format_wiki_link = Proc.new {|project, title| url_for(:only_path => only_path, :controller => 'wiki', :action => 'index', :id => project, :page => title) }
240 end
243 end
241
244
242 project = options[:project] || @project || (obj && obj.respond_to?(:project) ? obj.project : nil)
245 project = options[:project] || @project || (obj && obj.respond_to?(:project) ? obj.project : nil)
243
246
244 # Wiki links
247 # Wiki links
245 #
248 #
246 # Examples:
249 # Examples:
247 # [[mypage]]
250 # [[mypage]]
248 # [[mypage|mytext]]
251 # [[mypage|mytext]]
249 # wiki links can refer other project wikis, using project name or identifier:
252 # wiki links can refer other project wikis, using project name or identifier:
250 # [[project:]] -> wiki starting page
253 # [[project:]] -> wiki starting page
251 # [[project:|mytext]]
254 # [[project:|mytext]]
252 # [[project:mypage]]
255 # [[project:mypage]]
253 # [[project:mypage|mytext]]
256 # [[project:mypage|mytext]]
254 text = text.gsub(/(!)?(\[\[([^\]\n\|]+)(\|([^\]\n\|]+))?\]\])/) do |m|
257 text = text.gsub(/(!)?(\[\[([^\]\n\|]+)(\|([^\]\n\|]+))?\]\])/) do |m|
255 link_project = project
258 link_project = project
256 esc, all, page, title = $1, $2, $3, $5
259 esc, all, page, title = $1, $2, $3, $5
257 if esc.nil?
260 if esc.nil?
258 if page =~ /^([^\:]+)\:(.*)$/
261 if page =~ /^([^\:]+)\:(.*)$/
259 link_project = Project.find_by_name($1) || Project.find_by_identifier($1)
262 link_project = Project.find_by_name($1) || Project.find_by_identifier($1)
260 page = $2
263 page = $2
261 title ||= $1 if page.blank?
264 title ||= $1 if page.blank?
262 end
265 end
263
266
264 if link_project && link_project.wiki
267 if link_project && link_project.wiki
265 # check if page exists
268 # check if page exists
266 wiki_page = link_project.wiki.find_page(page)
269 wiki_page = link_project.wiki.find_page(page)
267 link_to((title || page), format_wiki_link.call(link_project, Wiki.titleize(page)),
270 link_to((title || page), format_wiki_link.call(link_project, Wiki.titleize(page)),
268 :class => ('wiki-page' + (wiki_page ? '' : ' new')))
271 :class => ('wiki-page' + (wiki_page ? '' : ' new')))
269 else
272 else
270 # project or wiki doesn't exist
273 # project or wiki doesn't exist
271 title || page
274 title || page
272 end
275 end
273 else
276 else
274 all
277 all
275 end
278 end
276 end
279 end
277
280
278 # Redmine links
281 # Redmine links
279 #
282 #
280 # Examples:
283 # Examples:
281 # Issues:
284 # Issues:
282 # #52 -> Link to issue #52
285 # #52 -> Link to issue #52
283 # Changesets:
286 # Changesets:
284 # r52 -> Link to revision 52
287 # r52 -> Link to revision 52
285 # commit:a85130f -> Link to scmid starting with a85130f
288 # commit:a85130f -> Link to scmid starting with a85130f
286 # Documents:
289 # Documents:
287 # document#17 -> Link to document with id 17
290 # document#17 -> Link to document with id 17
288 # document:Greetings -> Link to the document with title "Greetings"
291 # document:Greetings -> Link to the document with title "Greetings"
289 # document:"Some document" -> Link to the document with title "Some document"
292 # document:"Some document" -> Link to the document with title "Some document"
290 # Versions:
293 # Versions:
291 # version#3 -> Link to version with id 3
294 # version#3 -> Link to version with id 3
292 # version:1.0.0 -> Link to version named "1.0.0"
295 # version:1.0.0 -> Link to version named "1.0.0"
293 # version:"1.0 beta 2" -> Link to version named "1.0 beta 2"
296 # version:"1.0 beta 2" -> Link to version named "1.0 beta 2"
294 # Attachments:
297 # Attachments:
295 # attachment:file.zip -> Link to the attachment of the current object named file.zip
298 # attachment:file.zip -> Link to the attachment of the current object named file.zip
296 # Source files:
299 # Source files:
297 # source:some/file -> Link to the file located at /some/file in the project's repository
300 # source:some/file -> Link to the file located at /some/file in the project's repository
298 # source:some/file@52 -> Link to the file's revision 52
301 # source:some/file@52 -> Link to the file's revision 52
299 # source:some/file#L120 -> Link to line 120 of the file
302 # source:some/file#L120 -> Link to line 120 of the file
300 # source:some/file@52#L120 -> Link to line 120 of the file's revision 52
303 # source:some/file@52#L120 -> Link to line 120 of the file's revision 52
301 # export:some/file -> Force the download of the file
304 # export:some/file -> Force the download of the file
302 text = text.gsub(%r{([\s\(,\-\>]|^)(!)?(attachment|document|version|commit|source|export)?((#|r)(\d+)|(:)([^"\s<>][^\s<>]*?|"[^"]+?"))(?=(?=[[:punct:]]\W)|\s|<|$)}) do |m|
305 text = text.gsub(%r{([\s\(,\-\>]|^)(!)?(attachment|document|version|commit|source|export)?((#|r)(\d+)|(:)([^"\s<>][^\s<>]*?|"[^"]+?"))(?=(?=[[:punct:]]\W)|\s|<|$)}) do |m|
303 leading, esc, prefix, sep, oid = $1, $2, $3, $5 || $7, $6 || $8
306 leading, esc, prefix, sep, oid = $1, $2, $3, $5 || $7, $6 || $8
304 link = nil
307 link = nil
305 if esc.nil?
308 if esc.nil?
306 if prefix.nil? && sep == 'r'
309 if prefix.nil? && sep == 'r'
307 if project && (changeset = project.changesets.find_by_revision(oid))
310 if project && (changeset = project.changesets.find_by_revision(oid))
308 link = link_to("r#{oid}", {:only_path => only_path, :controller => 'repositories', :action => 'revision', :id => project, :rev => oid},
311 link = link_to("r#{oid}", {:only_path => only_path, :controller => 'repositories', :action => 'revision', :id => project, :rev => oid},
309 :class => 'changeset',
312 :class => 'changeset',
310 :title => truncate_single_line(changeset.comments, 100))
313 :title => truncate_single_line(changeset.comments, 100))
311 end
314 end
312 elsif sep == '#'
315 elsif sep == '#'
313 oid = oid.to_i
316 oid = oid.to_i
314 case prefix
317 case prefix
315 when nil
318 when nil
316 if issue = Issue.find_by_id(oid, :include => [:project, :status], :conditions => Project.visible_by(User.current))
319 if issue = Issue.find_by_id(oid, :include => [:project, :status], :conditions => Project.visible_by(User.current))
317 link = link_to("##{oid}", {:only_path => only_path, :controller => 'issues', :action => 'show', :id => oid},
320 link = link_to("##{oid}", {:only_path => only_path, :controller => 'issues', :action => 'show', :id => oid},
318 :class => (issue.closed? ? 'issue closed' : 'issue'),
321 :class => (issue.closed? ? 'issue closed' : 'issue'),
319 :title => "#{truncate(issue.subject, 100)} (#{issue.status.name})")
322 :title => "#{truncate(issue.subject, 100)} (#{issue.status.name})")
320 link = content_tag('del', link) if issue.closed?
323 link = content_tag('del', link) if issue.closed?
321 end
324 end
322 when 'document'
325 when 'document'
323 if document = Document.find_by_id(oid, :include => [:project], :conditions => Project.visible_by(User.current))
326 if document = Document.find_by_id(oid, :include => [:project], :conditions => Project.visible_by(User.current))
324 link = link_to h(document.title), {:only_path => only_path, :controller => 'documents', :action => 'show', :id => document},
327 link = link_to h(document.title), {:only_path => only_path, :controller => 'documents', :action => 'show', :id => document},
325 :class => 'document'
328 :class => 'document'
326 end
329 end
327 when 'version'
330 when 'version'
328 if version = Version.find_by_id(oid, :include => [:project], :conditions => Project.visible_by(User.current))
331 if version = Version.find_by_id(oid, :include => [:project], :conditions => Project.visible_by(User.current))
329 link = link_to h(version.name), {:only_path => only_path, :controller => 'versions', :action => 'show', :id => version},
332 link = link_to h(version.name), {:only_path => only_path, :controller => 'versions', :action => 'show', :id => version},
330 :class => 'version'
333 :class => 'version'
331 end
334 end
332 end
335 end
333 elsif sep == ':'
336 elsif sep == ':'
334 # removes the double quotes if any
337 # removes the double quotes if any
335 name = oid.gsub(%r{^"(.*)"$}, "\\1")
338 name = oid.gsub(%r{^"(.*)"$}, "\\1")
336 case prefix
339 case prefix
337 when 'document'
340 when 'document'
338 if project && document = project.documents.find_by_title(name)
341 if project && document = project.documents.find_by_title(name)
339 link = link_to h(document.title), {:only_path => only_path, :controller => 'documents', :action => 'show', :id => document},
342 link = link_to h(document.title), {:only_path => only_path, :controller => 'documents', :action => 'show', :id => document},
340 :class => 'document'
343 :class => 'document'
341 end
344 end
342 when 'version'
345 when 'version'
343 if project && version = project.versions.find_by_name(name)
346 if project && version = project.versions.find_by_name(name)
344 link = link_to h(version.name), {:only_path => only_path, :controller => 'versions', :action => 'show', :id => version},
347 link = link_to h(version.name), {:only_path => only_path, :controller => 'versions', :action => 'show', :id => version},
345 :class => 'version'
348 :class => 'version'
346 end
349 end
347 when 'commit'
350 when 'commit'
348 if project && (changeset = project.changesets.find(:first, :conditions => ["scmid LIKE ?", "#{name}%"]))
351 if project && (changeset = project.changesets.find(:first, :conditions => ["scmid LIKE ?", "#{name}%"]))
349 link = link_to h("#{name}"), {:only_path => only_path, :controller => 'repositories', :action => 'revision', :id => project, :rev => changeset.revision},
352 link = link_to h("#{name}"), {:only_path => only_path, :controller => 'repositories', :action => 'revision', :id => project, :rev => changeset.revision},
350 :class => 'changeset',
353 :class => 'changeset',
351 :title => truncate_single_line(changeset.comments, 100)
354 :title => truncate_single_line(changeset.comments, 100)
352 end
355 end
353 when 'source', 'export'
356 when 'source', 'export'
354 if project && project.repository
357 if project && project.repository
355 name =~ %r{^[/\\]*(.*?)(@([0-9a-f]+))?(#(L\d+))?$}
358 name =~ %r{^[/\\]*(.*?)(@([0-9a-f]+))?(#(L\d+))?$}
356 path, rev, anchor = $1, $3, $5
359 path, rev, anchor = $1, $3, $5
357 link = link_to h("#{prefix}:#{name}"), {:controller => 'repositories', :action => 'entry', :id => project,
360 link = link_to h("#{prefix}:#{name}"), {:controller => 'repositories', :action => 'entry', :id => project,
358 :path => to_path_param(path),
361 :path => to_path_param(path),
359 :rev => rev,
362 :rev => rev,
360 :anchor => anchor,
363 :anchor => anchor,
361 :format => (prefix == 'export' ? 'raw' : nil)},
364 :format => (prefix == 'export' ? 'raw' : nil)},
362 :class => (prefix == 'export' ? 'source download' : 'source')
365 :class => (prefix == 'export' ? 'source download' : 'source')
363 end
366 end
364 when 'attachment'
367 when 'attachment'
365 if attachments && attachment = attachments.detect {|a| a.filename == name }
368 if attachments && attachment = attachments.detect {|a| a.filename == name }
366 link = link_to h(attachment.filename), {:only_path => only_path, :controller => 'attachments', :action => 'download', :id => attachment},
369 link = link_to h(attachment.filename), {:only_path => only_path, :controller => 'attachments', :action => 'download', :id => attachment},
367 :class => 'attachment'
370 :class => 'attachment'
368 end
371 end
369 end
372 end
370 end
373 end
371 end
374 end
372 leading + (link || "#{prefix}#{sep}#{oid}")
375 leading + (link || "#{prefix}#{sep}#{oid}")
373 end
376 end
374
377
375 text
378 text
376 end
379 end
377
380
378 # Same as Rails' simple_format helper without using paragraphs
381 # Same as Rails' simple_format helper without using paragraphs
379 def simple_format_without_paragraph(text)
382 def simple_format_without_paragraph(text)
380 text.to_s.
383 text.to_s.
381 gsub(/\r\n?/, "\n"). # \r\n and \r -> \n
384 gsub(/\r\n?/, "\n"). # \r\n and \r -> \n
382 gsub(/\n\n+/, "<br /><br />"). # 2+ newline -> 2 br
385 gsub(/\n\n+/, "<br /><br />"). # 2+ newline -> 2 br
383 gsub(/([^\n]\n)(?=[^\n])/, '\1<br />') # 1 newline -> br
386 gsub(/([^\n]\n)(?=[^\n])/, '\1<br />') # 1 newline -> br
384 end
387 end
385
388
386 def error_messages_for(object_name, options = {})
389 def error_messages_for(object_name, options = {})
387 options = options.symbolize_keys
390 options = options.symbolize_keys
388 object = instance_variable_get("@#{object_name}")
391 object = instance_variable_get("@#{object_name}")
389 if object && !object.errors.empty?
392 if object && !object.errors.empty?
390 # build full_messages here with controller current language
393 # build full_messages here with controller current language
391 full_messages = []
394 full_messages = []
392 object.errors.each do |attr, msg|
395 object.errors.each do |attr, msg|
393 next if msg.nil?
396 next if msg.nil?
394 msg = msg.first if msg.is_a? Array
397 msg = msg.first if msg.is_a? Array
395 if attr == "base"
398 if attr == "base"
396 full_messages << l(msg)
399 full_messages << l(msg)
397 else
400 else
398 full_messages << "&#171; " + (l_has_string?("field_" + attr) ? l("field_" + attr) : object.class.human_attribute_name(attr)) + " &#187; " + l(msg) unless attr == "custom_values"
401 full_messages << "&#171; " + (l_has_string?("field_" + attr) ? l("field_" + attr) : object.class.human_attribute_name(attr)) + " &#187; " + l(msg) unless attr == "custom_values"
399 end
402 end
400 end
403 end
401 # retrieve custom values error messages
404 # retrieve custom values error messages
402 if object.errors[:custom_values]
405 if object.errors[:custom_values]
403 object.custom_values.each do |v|
406 object.custom_values.each do |v|
404 v.errors.each do |attr, msg|
407 v.errors.each do |attr, msg|
405 next if msg.nil?
408 next if msg.nil?
406 msg = msg.first if msg.is_a? Array
409 msg = msg.first if msg.is_a? Array
407 full_messages << "&#171; " + v.custom_field.name + " &#187; " + l(msg)
410 full_messages << "&#171; " + v.custom_field.name + " &#187; " + l(msg)
408 end
411 end
409 end
412 end
410 end
413 end
411 content_tag("div",
414 content_tag("div",
412 content_tag(
415 content_tag(
413 options[:header_tag] || "span", lwr(:gui_validation_error, full_messages.length) + ":"
416 options[:header_tag] || "span", lwr(:gui_validation_error, full_messages.length) + ":"
414 ) +
417 ) +
415 content_tag("ul", full_messages.collect { |msg| content_tag("li", msg) }),
418 content_tag("ul", full_messages.collect { |msg| content_tag("li", msg) }),
416 "id" => options[:id] || "errorExplanation", "class" => options[:class] || "errorExplanation"
419 "id" => options[:id] || "errorExplanation", "class" => options[:class] || "errorExplanation"
417 )
420 )
418 else
421 else
419 ""
422 ""
420 end
423 end
421 end
424 end
422
425
423 def lang_options_for_select(blank=true)
426 def lang_options_for_select(blank=true)
424 (blank ? [["(auto)", ""]] : []) +
427 (blank ? [["(auto)", ""]] : []) +
425 GLoc.valid_languages.collect{|lang| [ ll(lang.to_s, :general_lang_name), lang.to_s]}.sort{|x,y| x.last <=> y.last }
428 GLoc.valid_languages.collect{|lang| [ ll(lang.to_s, :general_lang_name), lang.to_s]}.sort{|x,y| x.last <=> y.last }
426 end
429 end
427
430
428 def label_tag_for(name, option_tags = nil, options = {})
431 def label_tag_for(name, option_tags = nil, options = {})
429 label_text = l(("field_"+field.to_s.gsub(/\_id$/, "")).to_sym) + (options.delete(:required) ? @template.content_tag("span", " *", :class => "required"): "")
432 label_text = l(("field_"+field.to_s.gsub(/\_id$/, "")).to_sym) + (options.delete(:required) ? @template.content_tag("span", " *", :class => "required"): "")
430 content_tag("label", label_text)
433 content_tag("label", label_text)
431 end
434 end
432
435
433 def labelled_tabular_form_for(name, object, options, &proc)
436 def labelled_tabular_form_for(name, object, options, &proc)
434 options[:html] ||= {}
437 options[:html] ||= {}
435 options[:html][:class] = 'tabular' unless options[:html].has_key?(:class)
438 options[:html][:class] = 'tabular' unless options[:html].has_key?(:class)
436 form_for(name, object, options.merge({ :builder => TabularFormBuilder, :lang => current_language}), &proc)
439 form_for(name, object, options.merge({ :builder => TabularFormBuilder, :lang => current_language}), &proc)
437 end
440 end
438
441
439 def back_url_hidden_field_tag
442 def back_url_hidden_field_tag
440 hidden_field_tag 'back_url', (params[:back_url] || request.env['HTTP_REFERER'])
443 hidden_field_tag 'back_url', (params[:back_url] || request.env['HTTP_REFERER'])
441 end
444 end
442
445
443 def check_all_links(form_name)
446 def check_all_links(form_name)
444 link_to_function(l(:button_check_all), "checkAll('#{form_name}', true)") +
447 link_to_function(l(:button_check_all), "checkAll('#{form_name}', true)") +
445 " | " +
448 " | " +
446 link_to_function(l(:button_uncheck_all), "checkAll('#{form_name}', false)")
449 link_to_function(l(:button_uncheck_all), "checkAll('#{form_name}', false)")
447 end
450 end
448
451
449 def progress_bar(pcts, options={})
452 def progress_bar(pcts, options={})
450 pcts = [pcts, pcts] unless pcts.is_a?(Array)
453 pcts = [pcts, pcts] unless pcts.is_a?(Array)
451 pcts[1] = pcts[1] - pcts[0]
454 pcts[1] = pcts[1] - pcts[0]
452 pcts << (100 - pcts[1] - pcts[0])
455 pcts << (100 - pcts[1] - pcts[0])
453 width = options[:width] || '100px;'
456 width = options[:width] || '100px;'
454 legend = options[:legend] || ''
457 legend = options[:legend] || ''
455 content_tag('table',
458 content_tag('table',
456 content_tag('tr',
459 content_tag('tr',
457 (pcts[0] > 0 ? content_tag('td', '', :width => "#{pcts[0].floor}%;", :class => 'closed') : '') +
460 (pcts[0] > 0 ? content_tag('td', '', :width => "#{pcts[0].floor}%;", :class => 'closed') : '') +
458 (pcts[1] > 0 ? content_tag('td', '', :width => "#{pcts[1].floor}%;", :class => 'done') : '') +
461 (pcts[1] > 0 ? content_tag('td', '', :width => "#{pcts[1].floor}%;", :class => 'done') : '') +
459 (pcts[2] > 0 ? content_tag('td', '', :width => "#{pcts[2].floor}%;", :class => 'todo') : '')
462 (pcts[2] > 0 ? content_tag('td', '', :width => "#{pcts[2].floor}%;", :class => 'todo') : '')
460 ), :class => 'progress', :style => "width: #{width};") +
463 ), :class => 'progress', :style => "width: #{width};") +
461 content_tag('p', legend, :class => 'pourcent')
464 content_tag('p', legend, :class => 'pourcent')
462 end
465 end
463
466
464 def context_menu_link(name, url, options={})
467 def context_menu_link(name, url, options={})
465 options[:class] ||= ''
468 options[:class] ||= ''
466 if options.delete(:selected)
469 if options.delete(:selected)
467 options[:class] << ' icon-checked disabled'
470 options[:class] << ' icon-checked disabled'
468 options[:disabled] = true
471 options[:disabled] = true
469 end
472 end
470 if options.delete(:disabled)
473 if options.delete(:disabled)
471 options.delete(:method)
474 options.delete(:method)
472 options.delete(:confirm)
475 options.delete(:confirm)
473 options.delete(:onclick)
476 options.delete(:onclick)
474 options[:class] << ' disabled'
477 options[:class] << ' disabled'
475 url = '#'
478 url = '#'
476 end
479 end
477 link_to name, url, options
480 link_to name, url, options
478 end
481 end
479
482
480 def calendar_for(field_id)
483 def calendar_for(field_id)
481 include_calendar_headers_tags
484 include_calendar_headers_tags
482 image_tag("calendar.png", {:id => "#{field_id}_trigger",:class => "calendar-trigger"}) +
485 image_tag("calendar.png", {:id => "#{field_id}_trigger",:class => "calendar-trigger"}) +
483 javascript_tag("Calendar.setup({inputField : '#{field_id}', ifFormat : '%Y-%m-%d', button : '#{field_id}_trigger' });")
486 javascript_tag("Calendar.setup({inputField : '#{field_id}', ifFormat : '%Y-%m-%d', button : '#{field_id}_trigger' });")
484 end
487 end
485
488
486 def include_calendar_headers_tags
489 def include_calendar_headers_tags
487 unless @calendar_headers_tags_included
490 unless @calendar_headers_tags_included
488 @calendar_headers_tags_included = true
491 @calendar_headers_tags_included = true
489 content_for :header_tags do
492 content_for :header_tags do
490 javascript_include_tag('calendar/calendar') +
493 javascript_include_tag('calendar/calendar') +
491 javascript_include_tag("calendar/lang/calendar-#{current_language}.js") +
494 javascript_include_tag("calendar/lang/calendar-#{current_language}.js") +
492 javascript_include_tag('calendar/calendar-setup') +
495 javascript_include_tag('calendar/calendar-setup') +
493 stylesheet_link_tag('calendar')
496 stylesheet_link_tag('calendar')
494 end
497 end
495 end
498 end
496 end
499 end
497
500
498 def wikitoolbar_for(field_id)
501 def wikitoolbar_for(field_id)
499 return '' unless Setting.text_formatting == 'textile'
502 return '' unless Setting.text_formatting == 'textile'
500
503
501 help_link = l(:setting_text_formatting) + ': ' +
504 help_link = l(:setting_text_formatting) + ': ' +
502 link_to(l(:label_help), compute_public_path('wiki_syntax', 'help', 'html'),
505 link_to(l(:label_help), compute_public_path('wiki_syntax', 'help', 'html'),
503 :onclick => "window.open(\"#{ compute_public_path('wiki_syntax', 'help', 'html') }\", \"\", \"resizable=yes, location=no, width=300, height=640, menubar=no, status=no, scrollbars=yes\"); return false;")
506 :onclick => "window.open(\"#{ compute_public_path('wiki_syntax', 'help', 'html') }\", \"\", \"resizable=yes, location=no, width=300, height=640, menubar=no, status=no, scrollbars=yes\"); return false;")
504
507
505 javascript_include_tag('jstoolbar/jstoolbar') +
508 javascript_include_tag('jstoolbar/jstoolbar') +
506 javascript_include_tag("jstoolbar/lang/jstoolbar-#{current_language}") +
509 javascript_include_tag("jstoolbar/lang/jstoolbar-#{current_language}") +
507 javascript_tag("var toolbar = new jsToolBar($('#{field_id}')); toolbar.setHelpLink('#{help_link}'); toolbar.draw();")
510 javascript_tag("var toolbar = new jsToolBar($('#{field_id}')); toolbar.setHelpLink('#{help_link}'); toolbar.draw();")
508 end
511 end
509
512
510 def content_for(name, content = nil, &block)
513 def content_for(name, content = nil, &block)
511 @has_content ||= {}
514 @has_content ||= {}
512 @has_content[name] = true
515 @has_content[name] = true
513 super(name, content, &block)
516 super(name, content, &block)
514 end
517 end
515
518
516 def has_content?(name)
519 def has_content?(name)
517 (@has_content && @has_content[name]) || false
520 (@has_content && @has_content[name]) || false
518 end
521 end
519 end
522 end
@@ -1,50 +1,50
1 <h2><%=l(:label_roadmap)%></h2>
1 <h2><%=l(:label_roadmap)%></h2>
2
2
3 <% if @versions.empty? %>
3 <% if @versions.empty? %>
4 <p class="nodata"><%= l(:label_no_data) %></p>
4 <p class="nodata"><%= l(:label_no_data) %></p>
5 <% else %>
5 <% else %>
6 <div id="roadmap">
6 <div id="roadmap">
7 <% @versions.each do |version| %>
7 <% @versions.each do |version| %>
8 <%= tag 'a', :name => version.name %>
8 <%= tag 'a', :name => version.name %>
9 <h3 class="icon22 icon22-package"><%= link_to h(version.name), :controller => 'versions', :action => 'show', :id => version %></h3>
9 <h3 class="icon22 icon22-package"><%= link_to h(version.name), :controller => 'versions', :action => 'show', :id => version %></h3>
10 <%= render :partial => 'versions/overview', :locals => {:version => version} %>
10 <%= render :partial => 'versions/overview', :locals => {:version => version} %>
11 <%= render(:partial => "wiki/content", :locals => {:content => version.wiki_page.content}) if version.wiki_page %>
11 <%= render(:partial => "wiki/content", :locals => {:content => version.wiki_page.content}) if version.wiki_page %>
12
12
13 <% issues = version.fixed_issues.find(:all,
13 <% issues = version.fixed_issues.find(:all,
14 :include => [:status, :tracker],
14 :include => [:status, :tracker],
15 :conditions => ["tracker_id in (#{@selected_tracker_ids.join(',')})"],
15 :conditions => ["tracker_id in (#{@selected_tracker_ids.join(',')})"],
16 :order => "#{Tracker.table_name}.position, #{Issue.table_name}.id") unless @selected_tracker_ids.empty?
16 :order => "#{Tracker.table_name}.position, #{Issue.table_name}.id") unless @selected_tracker_ids.empty?
17 issues ||= []
17 issues ||= []
18 %>
18 %>
19 <% if issues.size > 0 %>
19 <% if issues.size > 0 %>
20 <fieldset class="related-issues"><legend><%= l(:label_related_issues) %></legend>
20 <fieldset class="related-issues"><legend><%= l(:label_related_issues) %></legend>
21 <ul>
21 <ul>
22 <%- issues.each do |issue| -%>
22 <%- issues.each do |issue| -%>
23 <li class="issue <%= 'closed' if issue.closed? %>"><%= link_to_issue(issue) %>: <%=h issue.subject %></li>
23 <li><%= link_to_issue(issue) %>: <%=h issue.subject %></li>
24 <%- end -%>
24 <%- end -%>
25 </ul>
25 </ul>
26 </fieldset>
26 </fieldset>
27 <% end %>
27 <% end %>
28 <% end %>
28 <% end %>
29 </div>
29 </div>
30 <% end %>
30 <% end %>
31
31
32 <% content_for :sidebar do %>
32 <% content_for :sidebar do %>
33 <% form_tag({}, :method => :get) do %>
33 <% form_tag({}, :method => :get) do %>
34 <h3><%= l(:label_roadmap) %></h3>
34 <h3><%= l(:label_roadmap) %></h3>
35 <% @trackers.each do |tracker| %>
35 <% @trackers.each do |tracker| %>
36 <label><%= check_box_tag "tracker_ids[]", tracker.id, (@selected_tracker_ids.include? tracker.id.to_s), :id => nil %>
36 <label><%= check_box_tag "tracker_ids[]", tracker.id, (@selected_tracker_ids.include? tracker.id.to_s), :id => nil %>
37 <%= tracker.name %></label><br />
37 <%= tracker.name %></label><br />
38 <% end %>
38 <% end %>
39 <br />
39 <br />
40 <label for="completed"><%= check_box_tag "completed", 1, params[:completed] %> <%= l(:label_show_completed_versions) %></label>
40 <label for="completed"><%= check_box_tag "completed", 1, params[:completed] %> <%= l(:label_show_completed_versions) %></label>
41 <p><%= submit_tag l(:button_apply), :class => 'button-small', :name => nil %></p>
41 <p><%= submit_tag l(:button_apply), :class => 'button-small', :name => nil %></p>
42 <% end %>
42 <% end %>
43
43
44 <h3><%= l(:label_version_plural) %></h3>
44 <h3><%= l(:label_version_plural) %></h3>
45 <% @versions.each do |version| %>
45 <% @versions.each do |version| %>
46 <%= link_to version.name, "##{version.name}" %><br />
46 <%= link_to version.name, "##{version.name}" %><br />
47 <% end %>
47 <% end %>
48 <% end %>
48 <% end %>
49
49
50 <% html_title(l(:label_roadmap)) %>
50 <% html_title(l(:label_roadmap)) %>
@@ -1,48 +1,48
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">
7 <div id="version-summary">
8 <% if @version.estimated_hours > 0 || User.current.allowed_to?(:view_time_entries, @project) %>
8 <% if @version.estimated_hours > 0 || User.current.allowed_to?(:view_time_entries, @project) %>
9 <fieldset><legend><%= l(:label_time_tracking) %></legend>
9 <fieldset><legend><%= l(:label_time_tracking) %></legend>
10 <table>
10 <table>
11 <tr>
11 <tr>
12 <td width="130px" align="right"><%= l(:field_estimated_hours) %></td>
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>
13 <td width="240px" class="total-hours"width="130px" align="right"><%= html_hours(lwr(:label_f_hour, @version.estimated_hours)) %></td>
14 </tr>
14 </tr>
15 <% if User.current.allowed_to?(:view_time_entries, @project) %>
15 <% if User.current.allowed_to?(:view_time_entries, @project) %>
16 <tr>
16 <tr>
17 <td width="130px" align="right"><%= l(:label_spent_time) %></td>
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>
18 <td width="240px" class="total-hours"><%= html_hours(lwr(:label_f_hour, @version.spent_hours)) %></td>
19 </tr>
19 </tr>
20 <% end %>
20 <% end %>
21 </table>
21 </table>
22 </fieldset>
22 </fieldset>
23 <% end %>
23 <% end %>
24
24
25 <div id="status_by">
25 <div id="status_by">
26 <%= 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 %>
27 </div>
27 </div>
28 </div>
28 </div>
29
29
30 <div id="roadmap">
30 <div id="roadmap">
31 <%= render :partial => 'versions/overview', :locals => {:version => @version} %>
31 <%= render :partial => 'versions/overview', :locals => {:version => @version} %>
32 <%= 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 %>
33
33
34 <% issues = @version.fixed_issues.find(:all,
34 <% issues = @version.fixed_issues.find(:all,
35 :include => [:status, :tracker],
35 :include => [:status, :tracker],
36 :order => "#{Tracker.table_name}.position, #{Issue.table_name}.id") %>
36 :order => "#{Tracker.table_name}.position, #{Issue.table_name}.id") %>
37 <% if issues.size > 0 %>
37 <% if issues.size > 0 %>
38 <fieldset class="related-issues"><legend><%= l(:label_related_issues) %></legend>
38 <fieldset class="related-issues"><legend><%= l(:label_related_issues) %></legend>
39 <ul>
39 <ul>
40 <% issues.each do |issue| -%>
40 <% issues.each do |issue| -%>
41 <li class="issue <%= 'closed' if issue.closed? %>"><%= link_to_issue(issue) %>: <%=h issue.subject %></li>
41 <li><%= link_to_issue(issue) %>: <%=h issue.subject %></li>
42 <% end -%>
42 <% end -%>
43 </ul>
43 </ul>
44 </fieldset>
44 </fieldset>
45 <% end %>
45 <% end %>
46 </div>
46 </div>
47
47
48 <% html_title @version.name %>
48 <% html_title @version.name %>
@@ -1,614 +1,614
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: 13px;padding: 2px 10px 1px 0px;margin-bottom: 5px; border-bottom: 1px dotted #bbbbbb; color: #444;}
7 h4, .wiki h3 {font-size: 13px;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.8em; font-size: 0.8em; padding: 2px 2px 0px 6px;}
12 #top-menu {background: #2C4056; color: #fff; height:1.8em; font-size: 0.8em; padding: 2px 2px 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: 8px; font-weight: bold;}
21 #top-menu a {color: #fff; padding-right: 8px; font-weight: bold;}
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 2px 0px 0px;
35 margin: 0px 2px 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 font-weight: bold;
43 font-weight: bold;
44 margin: 0;
44 margin: 0;
45 padding: 4px 10px 4px 10px;
45 padding: 4px 10px 4px 10px;
46 }
46 }
47 #main-menu li a:hover {background:#759FCF; color:#fff;}
47 #main-menu li a:hover {background:#759FCF; color:#fff;}
48 #main-menu li a.selected, #main-menu li a.selected:hover {background:#fff; color:#555;}
48 #main-menu li a.selected, #main-menu li a.selected:hover {background:#fff; color:#555;}
49
49
50 #main {background-color:#EEEEEE;}
50 #main {background-color:#EEEEEE;}
51
51
52 #sidebar{ float: right; width: 17%; position: relative; z-index: 9; min-height: 600px; padding: 0; margin: 0;}
52 #sidebar{ float: right; width: 17%; position: relative; z-index: 9; min-height: 600px; padding: 0; margin: 0;}
53 * html #sidebar{ width: 17%; }
53 * html #sidebar{ width: 17%; }
54 #sidebar h3{ font-size: 14px; margin-top:14px; color: #666; }
54 #sidebar h3{ font-size: 14px; margin-top:14px; color: #666; }
55 #sidebar hr{ width: 100%; margin: 0 auto; height: 1px; background: #ccc; border: 0; }
55 #sidebar hr{ width: 100%; margin: 0 auto; height: 1px; background: #ccc; border: 0; }
56 * html #sidebar hr{ width: 95%; position: relative; left: -6px; color: #ccc; }
56 * html #sidebar hr{ width: 95%; position: relative; left: -6px; color: #ccc; }
57
57
58 #content { width: 80%; background-color: #fff; margin: 0px; border-right: 1px solid #ddd; padding: 6px 10px 10px 10px; z-index: 10; height:600px; min-height: 600px;}
58 #content { width: 80%; background-color: #fff; margin: 0px; border-right: 1px solid #ddd; padding: 6px 10px 10px 10px; z-index: 10; height:600px; min-height: 600px;}
59 * html #content{ width: 80%; padding-left: 0; margin-top: 0px; padding: 6px 10px 10px 10px;}
59 * html #content{ width: 80%; padding-left: 0; margin-top: 0px; padding: 6px 10px 10px 10px;}
60 html>body #content { height: auto; min-height: 600px; overflow: auto; }
60 html>body #content { height: auto; min-height: 600px; overflow: auto; }
61
61
62 #main.nosidebar #sidebar{ display: none; }
62 #main.nosidebar #sidebar{ display: none; }
63 #main.nosidebar #content{ width: auto; border-right: 0; }
63 #main.nosidebar #content{ width: auto; border-right: 0; }
64
64
65 #footer {clear: both; border-top: 1px solid #bbb; font-size: 0.9em; color: #aaa; padding: 5px; text-align:center; background:#fff;}
65 #footer {clear: both; border-top: 1px solid #bbb; font-size: 0.9em; color: #aaa; padding: 5px; text-align:center; background:#fff;}
66
66
67 #login-form table {margin-top:5em; padding:1em; margin-left: auto; margin-right: auto; border: 2px solid #FDBF3B; background-color:#FFEBC1; }
67 #login-form table {margin-top:5em; padding:1em; margin-left: auto; margin-right: auto; border: 2px solid #FDBF3B; background-color:#FFEBC1; }
68 #login-form table td {padding: 6px;}
68 #login-form table td {padding: 6px;}
69 #login-form label {font-weight: bold;}
69 #login-form label {font-weight: bold;}
70
70
71 .clear:after{ content: "."; display: block; height: 0; clear: both; visibility: hidden; }
71 .clear:after{ content: "."; display: block; height: 0; clear: both; visibility: hidden; }
72
72
73 /***** Links *****/
73 /***** Links *****/
74 a, a:link, a:visited{ color: #2A5685; text-decoration: none; }
74 a, a:link, a:visited{ color: #2A5685; text-decoration: none; }
75 a:hover, a:active{ color: #c61a1a; text-decoration: underline;}
75 a:hover, a:active{ color: #c61a1a; text-decoration: underline;}
76 a img{ border: 0; }
76 a img{ border: 0; }
77
77
78 a.issue.closed, .issue.closed a { text-decoration: line-through; }
78 a.issue.closed { text-decoration: line-through; }
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 { vertical-align: top; }
83 table.list td { 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 table.list.issues { margin-top: 10px; }
87 table.list.issues { margin-top: 10px; }
88 tr.issue { text-align: center; white-space: nowrap; }
88 tr.issue { text-align: center; white-space: nowrap; }
89 tr.issue td.subject, tr.issue td.category { white-space: normal; }
89 tr.issue td.subject, tr.issue td.category { white-space: normal; }
90 tr.issue td.subject { text-align: left; }
90 tr.issue td.subject { text-align: left; }
91 tr.issue td.done_ratio table.progress { margin-left:auto; margin-right: auto;}
91 tr.issue td.done_ratio table.progress { margin-left:auto; margin-right: auto;}
92
92
93 tr.entry { border: 1px solid #f8f8f8; }
93 tr.entry { border: 1px solid #f8f8f8; }
94 tr.entry td { white-space: nowrap; }
94 tr.entry td { white-space: nowrap; }
95 tr.entry td.filename { width: 30%; }
95 tr.entry td.filename { width: 30%; }
96 tr.entry td.size { text-align: right; font-size: 90%; }
96 tr.entry td.size { text-align: right; font-size: 90%; }
97 tr.entry td.revision, tr.entry td.author { text-align: center; }
97 tr.entry td.revision, tr.entry td.author { text-align: center; }
98 tr.entry td.age { text-align: right; }
98 tr.entry td.age { text-align: right; }
99
99
100 tr.entry span.expander {background-image: url(../images/bullet_toggle_plus.png); padding-left: 8px; margin-left: 0; cursor: pointer;}
100 tr.entry span.expander {background-image: url(../images/bullet_toggle_plus.png); padding-left: 8px; margin-left: 0; cursor: pointer;}
101 tr.entry.open span.expander {background-image: url(../images/bullet_toggle_minus.png);}
101 tr.entry.open span.expander {background-image: url(../images/bullet_toggle_minus.png);}
102 tr.entry.file td.filename a { margin-left: 16px; }
102 tr.entry.file td.filename a { margin-left: 16px; }
103
103
104 tr.changeset td.author { text-align: center; width: 15%; }
104 tr.changeset td.author { text-align: center; width: 15%; }
105 tr.changeset td.committed_on { text-align: center; width: 15%; }
105 tr.changeset td.committed_on { text-align: center; width: 15%; }
106
106
107 tr.message { height: 2.6em; }
107 tr.message { height: 2.6em; }
108 tr.message td.last_message { font-size: 80%; }
108 tr.message td.last_message { font-size: 80%; }
109 tr.message.locked td.subject a { background-image: url(../images/locked.png); }
109 tr.message.locked td.subject a { background-image: url(../images/locked.png); }
110 tr.message.sticky td.subject a { background-image: url(../images/sticky.png); font-weight: bold; }
110 tr.message.sticky td.subject a { background-image: url(../images/sticky.png); font-weight: bold; }
111
111
112 tr.user td { width:13%; }
112 tr.user td { width:13%; }
113 tr.user td.email { width:18%; }
113 tr.user td.email { width:18%; }
114 tr.user td { white-space: nowrap; }
114 tr.user td { white-space: nowrap; }
115 tr.user.locked, tr.user.registered { color: #aaa; }
115 tr.user.locked, tr.user.registered { color: #aaa; }
116 tr.user.locked a, tr.user.registered a { color: #aaa; }
116 tr.user.locked a, tr.user.registered a { color: #aaa; }
117
117
118 tr.time-entry { text-align: center; white-space: nowrap; }
118 tr.time-entry { text-align: center; white-space: nowrap; }
119 tr.time-entry td.subject, tr.time-entry td.comments { text-align: left; white-space: normal; }
119 tr.time-entry td.subject, tr.time-entry td.comments { text-align: left; white-space: normal; }
120 td.hours { text-align: right; font-weight: bold; padding-right: 0.5em; }
120 td.hours { text-align: right; font-weight: bold; padding-right: 0.5em; }
121 td.hours .hours-dec { font-size: 0.9em; }
121 td.hours .hours-dec { font-size: 0.9em; }
122
122
123 table.list tbody tr:hover { background-color:#ffffdd; }
123 table.list tbody tr:hover { background-color:#ffffdd; }
124 table td {padding:2px;}
124 table td {padding:2px;}
125 table p {margin:0;}
125 table p {margin:0;}
126 .odd {background-color:#f6f7f8;}
126 .odd {background-color:#f6f7f8;}
127 .even {background-color: #fff;}
127 .even {background-color: #fff;}
128
128
129 .highlight { background-color: #FCFD8D;}
129 .highlight { background-color: #FCFD8D;}
130 .highlight.token-1 { background-color: #faa;}
130 .highlight.token-1 { background-color: #faa;}
131 .highlight.token-2 { background-color: #afa;}
131 .highlight.token-2 { background-color: #afa;}
132 .highlight.token-3 { background-color: #aaf;}
132 .highlight.token-3 { background-color: #aaf;}
133
133
134 .box{
134 .box{
135 padding:6px;
135 padding:6px;
136 margin-bottom: 10px;
136 margin-bottom: 10px;
137 background-color:#f6f6f6;
137 background-color:#f6f6f6;
138 color:#505050;
138 color:#505050;
139 line-height:1.5em;
139 line-height:1.5em;
140 border: 1px solid #e4e4e4;
140 border: 1px solid #e4e4e4;
141 }
141 }
142
142
143 div.square {
143 div.square {
144 border: 1px solid #999;
144 border: 1px solid #999;
145 float: left;
145 float: left;
146 margin: .3em .4em 0 .4em;
146 margin: .3em .4em 0 .4em;
147 overflow: hidden;
147 overflow: hidden;
148 width: .6em; height: .6em;
148 width: .6em; height: .6em;
149 }
149 }
150 .contextual {float:right; white-space: nowrap; line-height:1.4em;margin-top:5px; padding-left: 10px; font-size:0.9em;}
150 .contextual {float:right; white-space: nowrap; line-height:1.4em;margin-top:5px; padding-left: 10px; font-size:0.9em;}
151 .contextual input {font-size:0.9em;}
151 .contextual input {font-size:0.9em;}
152
152
153 .splitcontentleft{float:left; width:49%;}
153 .splitcontentleft{float:left; width:49%;}
154 .splitcontentright{float:right; width:49%;}
154 .splitcontentright{float:right; width:49%;}
155 form {display: inline;}
155 form {display: inline;}
156 input, select {vertical-align: middle; margin-top: 1px; margin-bottom: 1px;}
156 input, select {vertical-align: middle; margin-top: 1px; margin-bottom: 1px;}
157 fieldset {border: 1px solid #e4e4e4; margin:0;}
157 fieldset {border: 1px solid #e4e4e4; margin:0;}
158 legend {color: #484848;}
158 legend {color: #484848;}
159 hr { width: 100%; height: 1px; background: #ccc; border: 0;}
159 hr { width: 100%; height: 1px; background: #ccc; border: 0;}
160 blockquote { font-style: italic; border-left: 3px solid #e0e0e0; padding-left: 0.6em; margin-left: 2.4em;}
160 blockquote { font-style: italic; border-left: 3px solid #e0e0e0; padding-left: 0.6em; margin-left: 2.4em;}
161 blockquote blockquote { margin-left: 0;}
161 blockquote blockquote { margin-left: 0;}
162 textarea.wiki-edit { width: 99%; }
162 textarea.wiki-edit { width: 99%; }
163 li p {margin-top: 0;}
163 li p {margin-top: 0;}
164 div.issue {background:#ffffdd; padding:6px; margin-bottom:6px;border: 1px solid #d7d7d7;}
164 div.issue {background:#ffffdd; padding:6px; margin-bottom:6px;border: 1px solid #d7d7d7;}
165 p.breadcrumb { font-size: 0.9em; margin: 4px 0 4px 0;}
165 p.breadcrumb { font-size: 0.9em; margin: 4px 0 4px 0;}
166 p.subtitle { font-size: 0.9em; margin: -6px 0 12px 0; font-style: italic; }
166 p.subtitle { font-size: 0.9em; margin: -6px 0 12px 0; font-style: italic; }
167
167
168 fieldset#filters { padding: 0.7em; }
168 fieldset#filters { padding: 0.7em; }
169 fieldset#filters p { margin: 1.2em 0 0.8em 2px; }
169 fieldset#filters p { margin: 1.2em 0 0.8em 2px; }
170 fieldset#filters .buttons { font-size: 0.9em; }
170 fieldset#filters .buttons { font-size: 0.9em; }
171 fieldset#filters table { border-collapse: collapse; }
171 fieldset#filters table { border-collapse: collapse; }
172 fieldset#filters table td { padding: 0; vertical-align: middle; }
172 fieldset#filters table td { padding: 0; vertical-align: middle; }
173 fieldset#filters tr.filter { height: 2em; }
173 fieldset#filters tr.filter { height: 2em; }
174 fieldset#filters td.add-filter { text-align: right; vertical-align: top; }
174 fieldset#filters td.add-filter { text-align: right; vertical-align: top; }
175
175
176 div#issue-changesets {float:right; width:45%; margin-left: 1em; margin-bottom: 1em; background: #fff; padding-left: 1em; font-size: 90%;}
176 div#issue-changesets {float:right; width:45%; margin-left: 1em; margin-bottom: 1em; background: #fff; padding-left: 1em; font-size: 90%;}
177 div#issue-changesets .changeset { padding: 4px;}
177 div#issue-changesets .changeset { padding: 4px;}
178 div#issue-changesets .changeset { border-bottom: 1px solid #ddd; }
178 div#issue-changesets .changeset { border-bottom: 1px solid #ddd; }
179 div#issue-changesets p { margin-top: 0; margin-bottom: 1em;}
179 div#issue-changesets p { margin-top: 0; margin-bottom: 1em;}
180
180
181 div#activity dl, #search-results { margin-left: 2em; }
181 div#activity dl, #search-results { margin-left: 2em; }
182 div#activity dd, #search-results dd { margin-bottom: 1em; padding-left: 18px; font-size: 0.9em; }
182 div#activity dd, #search-results dd { margin-bottom: 1em; padding-left: 18px; font-size: 0.9em; }
183 div#activity dt, #search-results dt { margin-bottom: 0px; padding-left: 20px; line-height: 18px; background-position: 0 50%; background-repeat: no-repeat; }
183 div#activity dt, #search-results dt { margin-bottom: 0px; padding-left: 20px; line-height: 18px; background-position: 0 50%; background-repeat: no-repeat; }
184 div#activity dt.me .time { border-bottom: 1px solid #999; }
184 div#activity dt.me .time { border-bottom: 1px solid #999; }
185 div#activity dt .time { color: #777; font-size: 80%; }
185 div#activity dt .time { color: #777; font-size: 80%; }
186 div#activity dd .description, #search-results dd .description { font-style: italic; }
186 div#activity dd .description, #search-results dd .description { font-style: italic; }
187 div#activity span.project:after, #search-results span.project:after { content: " -"; }
187 div#activity span.project:after, #search-results span.project:after { content: " -"; }
188 #search-results dd { margin-bottom: 1em; padding-left: 20px; margin-left:0px;}
188 #search-results dd { margin-bottom: 1em; padding-left: 20px; margin-left:0px;}
189 div#activity dd span.description, #search-results dd span.description { display:block; }
189 div#activity dd span.description, #search-results dd span.description { display:block; }
190
190
191 dt.issue { background-image: url(../images/ticket.png); }
191 dt.issue { background-image: url(../images/ticket.png); }
192 dt.issue-edit { background-image: url(../images/ticket_edit.png); }
192 dt.issue-edit { background-image: url(../images/ticket_edit.png); }
193 dt.issue-closed { background-image: url(../images/ticket_checked.png); }
193 dt.issue-closed { background-image: url(../images/ticket_checked.png); }
194 dt.issue-note { background-image: url(../images/ticket_note.png); }
194 dt.issue-note { background-image: url(../images/ticket_note.png); }
195 dt.changeset { background-image: url(../images/changeset.png); }
195 dt.changeset { background-image: url(../images/changeset.png); }
196 dt.news { background-image: url(../images/news.png); }
196 dt.news { background-image: url(../images/news.png); }
197 dt.message { background-image: url(../images/message.png); }
197 dt.message { background-image: url(../images/message.png); }
198 dt.reply { background-image: url(../images/comments.png); }
198 dt.reply { background-image: url(../images/comments.png); }
199 dt.wiki-page { background-image: url(../images/wiki_edit.png); }
199 dt.wiki-page { background-image: url(../images/wiki_edit.png); }
200 dt.attachment { background-image: url(../images/attachment.png); }
200 dt.attachment { background-image: url(../images/attachment.png); }
201 dt.document { background-image: url(../images/document.png); }
201 dt.document { background-image: url(../images/document.png); }
202 dt.project { background-image: url(../images/projects.png); }
202 dt.project { background-image: url(../images/projects.png); }
203
203
204 div#roadmap fieldset.related-issues { margin-bottom: 1em; }
204 div#roadmap fieldset.related-issues { margin-bottom: 1em; }
205 div#roadmap fieldset.related-issues ul { margin-top: 0.3em; margin-bottom: 0.3em; }
205 div#roadmap fieldset.related-issues ul { margin-top: 0.3em; margin-bottom: 0.3em; }
206 div#roadmap .wiki h1:first-child { display: none; }
206 div#roadmap .wiki h1:first-child { display: none; }
207 div#roadmap .wiki h1 { font-size: 120%; }
207 div#roadmap .wiki h1 { font-size: 120%; }
208 div#roadmap .wiki h2 { font-size: 110%; }
208 div#roadmap .wiki h2 { font-size: 110%; }
209
209
210 div#version-summary { float:right; width:380px; margin-left: 16px; margin-bottom: 16px; background-color: #fff; }
210 div#version-summary { float:right; width:380px; margin-left: 16px; margin-bottom: 16px; background-color: #fff; }
211 div#version-summary fieldset { margin-bottom: 1em; }
211 div#version-summary fieldset { margin-bottom: 1em; }
212 div#version-summary .total-hours { text-align: right; }
212 div#version-summary .total-hours { text-align: right; }
213
213
214 table#time-report td.hours, table#time-report th.period, table#time-report th.total { text-align: right; padding-right: 0.5em; }
214 table#time-report td.hours, table#time-report th.period, table#time-report th.total { text-align: right; padding-right: 0.5em; }
215 table#time-report tbody tr { font-style: italic; color: #777; }
215 table#time-report tbody tr { font-style: italic; color: #777; }
216 table#time-report tbody tr.last-level { font-style: normal; color: #555; }
216 table#time-report tbody tr.last-level { font-style: normal; color: #555; }
217 table#time-report tbody tr.total { font-style: normal; font-weight: bold; color: #555; background-color:#EEEEEE; }
217 table#time-report tbody tr.total { font-style: normal; font-weight: bold; color: #555; background-color:#EEEEEE; }
218 table#time-report .hours-dec { font-size: 0.9em; }
218 table#time-report .hours-dec { font-size: 0.9em; }
219
219
220 ul.properties {padding:0; font-size: 0.9em; color: #777;}
220 ul.properties {padding:0; font-size: 0.9em; color: #777;}
221 ul.properties li {list-style-type:none;}
221 ul.properties li {list-style-type:none;}
222 ul.properties li span {font-style:italic;}
222 ul.properties li span {font-style:italic;}
223
223
224 .total-hours { font-size: 110%; font-weight: bold; }
224 .total-hours { font-size: 110%; font-weight: bold; }
225 .total-hours span.hours-int { font-size: 120%; }
225 .total-hours span.hours-int { font-size: 120%; }
226
226
227 .autoscroll {overflow-x: auto; padding:1px; margin-bottom: 1.2em;}
227 .autoscroll {overflow-x: auto; padding:1px; margin-bottom: 1.2em;}
228 #user_firstname, #user_lastname, #user_mail, #my_account_form select { width: 90%; }
228 #user_firstname, #user_lastname, #user_mail, #my_account_form select { width: 90%; }
229
229
230 .pagination {font-size: 90%}
230 .pagination {font-size: 90%}
231 p.pagination {margin-top:8px;}
231 p.pagination {margin-top:8px;}
232
232
233 /***** Tabular forms ******/
233 /***** Tabular forms ******/
234 .tabular p{
234 .tabular p{
235 margin: 0;
235 margin: 0;
236 padding: 5px 0 8px 0;
236 padding: 5px 0 8px 0;
237 padding-left: 180px; /*width of left column containing the label elements*/
237 padding-left: 180px; /*width of left column containing the label elements*/
238 height: 1%;
238 height: 1%;
239 clear:left;
239 clear:left;
240 }
240 }
241
241
242 html>body .tabular p {overflow:hidden;}
242 html>body .tabular p {overflow:hidden;}
243
243
244 .tabular label{
244 .tabular label{
245 font-weight: bold;
245 font-weight: bold;
246 float: left;
246 float: left;
247 text-align: right;
247 text-align: right;
248 margin-left: -180px; /*width of left column*/
248 margin-left: -180px; /*width of left column*/
249 width: 175px; /*width of labels. Should be smaller than left column to create some right
249 width: 175px; /*width of labels. Should be smaller than left column to create some right
250 margin*/
250 margin*/
251 }
251 }
252
252
253 .tabular label.floating{
253 .tabular label.floating{
254 font-weight: normal;
254 font-weight: normal;
255 margin-left: 0px;
255 margin-left: 0px;
256 text-align: left;
256 text-align: left;
257 width: 200px;
257 width: 200px;
258 }
258 }
259
259
260 input#time_entry_comments { width: 90%;}
260 input#time_entry_comments { width: 90%;}
261
261
262 #preview fieldset {margin-top: 1em; background: url(../images/draft.png)}
262 #preview fieldset {margin-top: 1em; background: url(../images/draft.png)}
263
263
264 .tabular.settings p{ padding-left: 300px; }
264 .tabular.settings p{ padding-left: 300px; }
265 .tabular.settings label{ margin-left: -300px; width: 295px; }
265 .tabular.settings label{ margin-left: -300px; width: 295px; }
266
266
267 .required {color: #bb0000;}
267 .required {color: #bb0000;}
268 .summary {font-style: italic;}
268 .summary {font-style: italic;}
269
269
270 #attachments_fields input[type=text] {margin-left: 8px; }
270 #attachments_fields input[type=text] {margin-left: 8px; }
271
271
272 div.attachments p { margin:4px 0 2px 0; }
272 div.attachments p { margin:4px 0 2px 0; }
273 div.attachments img { vertical-align: middle; }
273 div.attachments img { vertical-align: middle; }
274 div.attachments span.author { font-size: 0.9em; color: #888; }
274 div.attachments span.author { font-size: 0.9em; color: #888; }
275
275
276 p.other-formats { text-align: right; font-size:0.9em; color: #666; }
276 p.other-formats { text-align: right; font-size:0.9em; color: #666; }
277 .other-formats span + span:before { content: "| "; }
277 .other-formats span + span:before { content: "| "; }
278
278
279 a.feed { background: url(../images/feed.png) no-repeat 1px 50%; padding: 2px 0px 3px 16px; }
279 a.feed { background: url(../images/feed.png) no-repeat 1px 50%; padding: 2px 0px 3px 16px; }
280
280
281 /***** Flash & error messages ****/
281 /***** Flash & error messages ****/
282 #errorExplanation, div.flash, .nodata, .warning {
282 #errorExplanation, div.flash, .nodata, .warning {
283 padding: 4px 4px 4px 30px;
283 padding: 4px 4px 4px 30px;
284 margin-bottom: 12px;
284 margin-bottom: 12px;
285 font-size: 1.1em;
285 font-size: 1.1em;
286 border: 2px solid;
286 border: 2px solid;
287 }
287 }
288
288
289 div.flash {margin-top: 8px;}
289 div.flash {margin-top: 8px;}
290
290
291 div.flash.error, #errorExplanation {
291 div.flash.error, #errorExplanation {
292 background: url(../images/false.png) 8px 5px no-repeat;
292 background: url(../images/false.png) 8px 5px no-repeat;
293 background-color: #ffe3e3;
293 background-color: #ffe3e3;
294 border-color: #dd0000;
294 border-color: #dd0000;
295 color: #550000;
295 color: #550000;
296 }
296 }
297
297
298 div.flash.notice {
298 div.flash.notice {
299 background: url(../images/true.png) 8px 5px no-repeat;
299 background: url(../images/true.png) 8px 5px no-repeat;
300 background-color: #dfffdf;
300 background-color: #dfffdf;
301 border-color: #9fcf9f;
301 border-color: #9fcf9f;
302 color: #005f00;
302 color: #005f00;
303 }
303 }
304
304
305 .nodata, .warning {
305 .nodata, .warning {
306 text-align: center;
306 text-align: center;
307 background-color: #FFEBC1;
307 background-color: #FFEBC1;
308 border-color: #FDBF3B;
308 border-color: #FDBF3B;
309 color: #A6750C;
309 color: #A6750C;
310 }
310 }
311
311
312 #errorExplanation ul { font-size: 0.9em;}
312 #errorExplanation ul { font-size: 0.9em;}
313
313
314 /***** Ajax indicator ******/
314 /***** Ajax indicator ******/
315 #ajax-indicator {
315 #ajax-indicator {
316 position: absolute; /* fixed not supported by IE */
316 position: absolute; /* fixed not supported by IE */
317 background-color:#eee;
317 background-color:#eee;
318 border: 1px solid #bbb;
318 border: 1px solid #bbb;
319 top:35%;
319 top:35%;
320 left:40%;
320 left:40%;
321 width:20%;
321 width:20%;
322 font-weight:bold;
322 font-weight:bold;
323 text-align:center;
323 text-align:center;
324 padding:0.6em;
324 padding:0.6em;
325 z-index:100;
325 z-index:100;
326 filter:alpha(opacity=50);
326 filter:alpha(opacity=50);
327 opacity: 0.5;
327 opacity: 0.5;
328 }
328 }
329
329
330 html>body #ajax-indicator { position: fixed; }
330 html>body #ajax-indicator { position: fixed; }
331
331
332 #ajax-indicator span {
332 #ajax-indicator span {
333 background-position: 0% 40%;
333 background-position: 0% 40%;
334 background-repeat: no-repeat;
334 background-repeat: no-repeat;
335 background-image: url(../images/loading.gif);
335 background-image: url(../images/loading.gif);
336 padding-left: 26px;
336 padding-left: 26px;
337 vertical-align: bottom;
337 vertical-align: bottom;
338 }
338 }
339
339
340 /***** Calendar *****/
340 /***** Calendar *****/
341 table.cal {border-collapse: collapse; width: 100%; margin: 8px 0 6px 0;border: 1px solid #d7d7d7;}
341 table.cal {border-collapse: collapse; width: 100%; margin: 8px 0 6px 0;border: 1px solid #d7d7d7;}
342 table.cal thead th {width: 14%;}
342 table.cal thead th {width: 14%;}
343 table.cal tbody tr {height: 100px;}
343 table.cal tbody tr {height: 100px;}
344 table.cal th { background-color:#EEEEEE; padding: 4px; }
344 table.cal th { background-color:#EEEEEE; padding: 4px; }
345 table.cal td {border: 1px solid #d7d7d7; vertical-align: top; font-size: 0.9em;}
345 table.cal td {border: 1px solid #d7d7d7; vertical-align: top; font-size: 0.9em;}
346 table.cal td p.day-num {font-size: 1.1em; text-align:right;}
346 table.cal td p.day-num {font-size: 1.1em; text-align:right;}
347 table.cal td.odd p.day-num {color: #bbb;}
347 table.cal td.odd p.day-num {color: #bbb;}
348 table.cal td.today {background:#ffffdd;}
348 table.cal td.today {background:#ffffdd;}
349 table.cal td.today p.day-num {font-weight: bold;}
349 table.cal td.today p.day-num {font-weight: bold;}
350
350
351 /***** Tooltips ******/
351 /***** Tooltips ******/
352 .tooltip{position:relative;z-index:24;}
352 .tooltip{position:relative;z-index:24;}
353 .tooltip:hover{z-index:25;color:#000;}
353 .tooltip:hover{z-index:25;color:#000;}
354 .tooltip span.tip{display: none; text-align:left;}
354 .tooltip span.tip{display: none; text-align:left;}
355
355
356 div.tooltip:hover span.tip{
356 div.tooltip:hover span.tip{
357 display:block;
357 display:block;
358 position:absolute;
358 position:absolute;
359 top:12px; left:24px; width:270px;
359 top:12px; left:24px; width:270px;
360 border:1px solid #555;
360 border:1px solid #555;
361 background-color:#fff;
361 background-color:#fff;
362 padding: 4px;
362 padding: 4px;
363 font-size: 0.8em;
363 font-size: 0.8em;
364 color:#505050;
364 color:#505050;
365 }
365 }
366
366
367 /***** Progress bar *****/
367 /***** Progress bar *****/
368 table.progress {
368 table.progress {
369 border: 1px solid #D7D7D7;
369 border: 1px solid #D7D7D7;
370 border-collapse: collapse;
370 border-collapse: collapse;
371 border-spacing: 0pt;
371 border-spacing: 0pt;
372 empty-cells: show;
372 empty-cells: show;
373 text-align: center;
373 text-align: center;
374 float:left;
374 float:left;
375 margin: 1px 6px 1px 0px;
375 margin: 1px 6px 1px 0px;
376 }
376 }
377
377
378 table.progress td { height: 0.9em; }
378 table.progress td { height: 0.9em; }
379 table.progress td.closed { background: #BAE0BA none repeat scroll 0%; }
379 table.progress td.closed { background: #BAE0BA none repeat scroll 0%; }
380 table.progress td.done { background: #DEF0DE none repeat scroll 0%; }
380 table.progress td.done { background: #DEF0DE none repeat scroll 0%; }
381 table.progress td.open { background: #FFF none repeat scroll 0%; }
381 table.progress td.open { background: #FFF none repeat scroll 0%; }
382 p.pourcent {font-size: 80%;}
382 p.pourcent {font-size: 80%;}
383 p.progress-info {clear: left; font-style: italic; font-size: 80%;}
383 p.progress-info {clear: left; font-style: italic; font-size: 80%;}
384
384
385 /***** Tabs *****/
385 /***** Tabs *****/
386 #content .tabs {height: 2.6em; border-bottom: 1px solid #bbbbbb; margin-bottom:1.2em; position:relative;}
386 #content .tabs {height: 2.6em; border-bottom: 1px solid #bbbbbb; margin-bottom:1.2em; position:relative;}
387 #content .tabs ul {margin:0; position:absolute; bottom:-2px; padding-left:1em;}
387 #content .tabs ul {margin:0; position:absolute; bottom:-2px; padding-left:1em;}
388 #content .tabs>ul { bottom:-1px; } /* others */
388 #content .tabs>ul { bottom:-1px; } /* others */
389 #content .tabs ul li {
389 #content .tabs ul li {
390 float:left;
390 float:left;
391 list-style-type:none;
391 list-style-type:none;
392 white-space:nowrap;
392 white-space:nowrap;
393 margin-right:8px;
393 margin-right:8px;
394 background:#fff;
394 background:#fff;
395 }
395 }
396 #content .tabs ul li a{
396 #content .tabs ul li a{
397 display:block;
397 display:block;
398 font-size: 0.9em;
398 font-size: 0.9em;
399 text-decoration:none;
399 text-decoration:none;
400 line-height:1.3em;
400 line-height:1.3em;
401 padding:4px 6px 4px 6px;
401 padding:4px 6px 4px 6px;
402 border: 1px solid #ccc;
402 border: 1px solid #ccc;
403 border-bottom: 1px solid #bbbbbb;
403 border-bottom: 1px solid #bbbbbb;
404 background-color: #eeeeee;
404 background-color: #eeeeee;
405 color:#777;
405 color:#777;
406 font-weight:bold;
406 font-weight:bold;
407 }
407 }
408
408
409 #content .tabs ul li a:hover {
409 #content .tabs ul li a:hover {
410 background-color: #ffffdd;
410 background-color: #ffffdd;
411 text-decoration:none;
411 text-decoration:none;
412 }
412 }
413
413
414 #content .tabs ul li a.selected {
414 #content .tabs ul li a.selected {
415 background-color: #fff;
415 background-color: #fff;
416 border: 1px solid #bbbbbb;
416 border: 1px solid #bbbbbb;
417 border-bottom: 1px solid #fff;
417 border-bottom: 1px solid #fff;
418 }
418 }
419
419
420 #content .tabs ul li a.selected:hover {
420 #content .tabs ul li a.selected:hover {
421 background-color: #fff;
421 background-color: #fff;
422 }
422 }
423
423
424 /***** Diff *****/
424 /***** Diff *****/
425 .diff_out { background: #fcc; }
425 .diff_out { background: #fcc; }
426 .diff_in { background: #cfc; }
426 .diff_in { background: #cfc; }
427
427
428 /***** Wiki *****/
428 /***** Wiki *****/
429 div.wiki table {
429 div.wiki table {
430 border: 1px solid #505050;
430 border: 1px solid #505050;
431 border-collapse: collapse;
431 border-collapse: collapse;
432 margin-bottom: 1em;
432 margin-bottom: 1em;
433 }
433 }
434
434
435 div.wiki table, div.wiki td, div.wiki th {
435 div.wiki table, div.wiki td, div.wiki th {
436 border: 1px solid #bbb;
436 border: 1px solid #bbb;
437 padding: 4px;
437 padding: 4px;
438 }
438 }
439
439
440 div.wiki .external {
440 div.wiki .external {
441 background-position: 0% 60%;
441 background-position: 0% 60%;
442 background-repeat: no-repeat;
442 background-repeat: no-repeat;
443 padding-left: 12px;
443 padding-left: 12px;
444 background-image: url(../images/external.png);
444 background-image: url(../images/external.png);
445 }
445 }
446
446
447 div.wiki a.new {
447 div.wiki a.new {
448 color: #b73535;
448 color: #b73535;
449 }
449 }
450
450
451 div.wiki pre {
451 div.wiki pre {
452 margin: 1em 1em 1em 1.6em;
452 margin: 1em 1em 1em 1.6em;
453 padding: 2px;
453 padding: 2px;
454 background-color: #fafafa;
454 background-color: #fafafa;
455 border: 1px solid #dadada;
455 border: 1px solid #dadada;
456 width:95%;
456 width:95%;
457 overflow-x: auto;
457 overflow-x: auto;
458 }
458 }
459
459
460 div.wiki div.toc {
460 div.wiki div.toc {
461 background-color: #ffffdd;
461 background-color: #ffffdd;
462 border: 1px solid #e4e4e4;
462 border: 1px solid #e4e4e4;
463 padding: 4px;
463 padding: 4px;
464 line-height: 1.2em;
464 line-height: 1.2em;
465 margin-bottom: 12px;
465 margin-bottom: 12px;
466 margin-right: 12px;
466 margin-right: 12px;
467 display: table
467 display: table
468 }
468 }
469 * html div.wiki div.toc { width: 50%; } /* IE6 doesn't autosize div */
469 * html div.wiki div.toc { width: 50%; } /* IE6 doesn't autosize div */
470
470
471 div.wiki div.toc.right { float: right; margin-left: 12px; margin-right: 0; width: auto; }
471 div.wiki div.toc.right { float: right; margin-left: 12px; margin-right: 0; width: auto; }
472 div.wiki div.toc.left { float: left; margin-right: 12px; margin-left: 0; width: auto; }
472 div.wiki div.toc.left { float: left; margin-right: 12px; margin-left: 0; width: auto; }
473
473
474 div.wiki div.toc a {
474 div.wiki div.toc a {
475 display: block;
475 display: block;
476 font-size: 0.9em;
476 font-size: 0.9em;
477 font-weight: normal;
477 font-weight: normal;
478 text-decoration: none;
478 text-decoration: none;
479 color: #606060;
479 color: #606060;
480 }
480 }
481 div.wiki div.toc a:hover { color: #c61a1a; text-decoration: underline;}
481 div.wiki div.toc a:hover { color: #c61a1a; text-decoration: underline;}
482
482
483 div.wiki div.toc a.heading2 { margin-left: 6px; }
483 div.wiki div.toc a.heading2 { margin-left: 6px; }
484 div.wiki div.toc a.heading3 { margin-left: 12px; font-size: 0.8em; }
484 div.wiki div.toc a.heading3 { margin-left: 12px; font-size: 0.8em; }
485
485
486 /***** My page layout *****/
486 /***** My page layout *****/
487 .block-receiver {
487 .block-receiver {
488 border:1px dashed #c0c0c0;
488 border:1px dashed #c0c0c0;
489 margin-bottom: 20px;
489 margin-bottom: 20px;
490 padding: 15px 0 15px 0;
490 padding: 15px 0 15px 0;
491 }
491 }
492
492
493 .mypage-box {
493 .mypage-box {
494 margin:0 0 20px 0;
494 margin:0 0 20px 0;
495 color:#505050;
495 color:#505050;
496 line-height:1.5em;
496 line-height:1.5em;
497 }
497 }
498
498
499 .handle {
499 .handle {
500 cursor: move;
500 cursor: move;
501 }
501 }
502
502
503 a.close-icon {
503 a.close-icon {
504 display:block;
504 display:block;
505 margin-top:3px;
505 margin-top:3px;
506 overflow:hidden;
506 overflow:hidden;
507 width:12px;
507 width:12px;
508 height:12px;
508 height:12px;
509 background-repeat: no-repeat;
509 background-repeat: no-repeat;
510 cursor:pointer;
510 cursor:pointer;
511 background-image:url('../images/close.png');
511 background-image:url('../images/close.png');
512 }
512 }
513
513
514 a.close-icon:hover {
514 a.close-icon:hover {
515 background-image:url('../images/close_hl.png');
515 background-image:url('../images/close_hl.png');
516 }
516 }
517
517
518 /***** Gantt chart *****/
518 /***** Gantt chart *****/
519 .gantt_hdr {
519 .gantt_hdr {
520 position:absolute;
520 position:absolute;
521 top:0;
521 top:0;
522 height:16px;
522 height:16px;
523 border-top: 1px solid #c0c0c0;
523 border-top: 1px solid #c0c0c0;
524 border-bottom: 1px solid #c0c0c0;
524 border-bottom: 1px solid #c0c0c0;
525 border-right: 1px solid #c0c0c0;
525 border-right: 1px solid #c0c0c0;
526 text-align: center;
526 text-align: center;
527 overflow: hidden;
527 overflow: hidden;
528 }
528 }
529
529
530 .task {
530 .task {
531 position: absolute;
531 position: absolute;
532 height:8px;
532 height:8px;
533 font-size:0.8em;
533 font-size:0.8em;
534 color:#888;
534 color:#888;
535 padding:0;
535 padding:0;
536 margin:0;
536 margin:0;
537 line-height:0.8em;
537 line-height:0.8em;
538 }
538 }
539
539
540 .task_late { background:#f66 url(../images/task_late.png); border: 1px solid #f66; }
540 .task_late { background:#f66 url(../images/task_late.png); border: 1px solid #f66; }
541 .task_done { background:#66f url(../images/task_done.png); border: 1px solid #66f; }
541 .task_done { background:#66f url(../images/task_done.png); border: 1px solid #66f; }
542 .task_todo { background:#aaa url(../images/task_todo.png); border: 1px solid #aaa; }
542 .task_todo { background:#aaa url(../images/task_todo.png); border: 1px solid #aaa; }
543 .milestone { background-image:url(../images/milestone.png); background-repeat: no-repeat; border: 0; }
543 .milestone { background-image:url(../images/milestone.png); background-repeat: no-repeat; border: 0; }
544
544
545 /***** Icons *****/
545 /***** Icons *****/
546 .icon {
546 .icon {
547 background-position: 0% 40%;
547 background-position: 0% 40%;
548 background-repeat: no-repeat;
548 background-repeat: no-repeat;
549 padding-left: 20px;
549 padding-left: 20px;
550 padding-top: 2px;
550 padding-top: 2px;
551 padding-bottom: 3px;
551 padding-bottom: 3px;
552 }
552 }
553
553
554 .icon22 {
554 .icon22 {
555 background-position: 0% 40%;
555 background-position: 0% 40%;
556 background-repeat: no-repeat;
556 background-repeat: no-repeat;
557 padding-left: 26px;
557 padding-left: 26px;
558 line-height: 22px;
558 line-height: 22px;
559 vertical-align: middle;
559 vertical-align: middle;
560 }
560 }
561
561
562 .icon-add { background-image: url(../images/add.png); }
562 .icon-add { background-image: url(../images/add.png); }
563 .icon-edit { background-image: url(../images/edit.png); }
563 .icon-edit { background-image: url(../images/edit.png); }
564 .icon-copy { background-image: url(../images/copy.png); }
564 .icon-copy { background-image: url(../images/copy.png); }
565 .icon-del { background-image: url(../images/delete.png); }
565 .icon-del { background-image: url(../images/delete.png); }
566 .icon-move { background-image: url(../images/move.png); }
566 .icon-move { background-image: url(../images/move.png); }
567 .icon-save { background-image: url(../images/save.png); }
567 .icon-save { background-image: url(../images/save.png); }
568 .icon-cancel { background-image: url(../images/cancel.png); }
568 .icon-cancel { background-image: url(../images/cancel.png); }
569 .icon-file { background-image: url(../images/file.png); }
569 .icon-file { background-image: url(../images/file.png); }
570 .icon-folder { background-image: url(../images/folder.png); }
570 .icon-folder { background-image: url(../images/folder.png); }
571 .open .icon-folder { background-image: url(../images/folder_open.png); }
571 .open .icon-folder { background-image: url(../images/folder_open.png); }
572 .icon-package { background-image: url(../images/package.png); }
572 .icon-package { background-image: url(../images/package.png); }
573 .icon-home { background-image: url(../images/home.png); }
573 .icon-home { background-image: url(../images/home.png); }
574 .icon-user { background-image: url(../images/user.png); }
574 .icon-user { background-image: url(../images/user.png); }
575 .icon-mypage { background-image: url(../images/user_page.png); }
575 .icon-mypage { background-image: url(../images/user_page.png); }
576 .icon-admin { background-image: url(../images/admin.png); }
576 .icon-admin { background-image: url(../images/admin.png); }
577 .icon-projects { background-image: url(../images/projects.png); }
577 .icon-projects { background-image: url(../images/projects.png); }
578 .icon-logout { background-image: url(../images/logout.png); }
578 .icon-logout { background-image: url(../images/logout.png); }
579 .icon-help { background-image: url(../images/help.png); }
579 .icon-help { background-image: url(../images/help.png); }
580 .icon-attachment { background-image: url(../images/attachment.png); }
580 .icon-attachment { background-image: url(../images/attachment.png); }
581 .icon-index { background-image: url(../images/index.png); }
581 .icon-index { background-image: url(../images/index.png); }
582 .icon-history { background-image: url(../images/history.png); }
582 .icon-history { background-image: url(../images/history.png); }
583 .icon-time { background-image: url(../images/time.png); }
583 .icon-time { background-image: url(../images/time.png); }
584 .icon-stats { background-image: url(../images/stats.png); }
584 .icon-stats { background-image: url(../images/stats.png); }
585 .icon-warning { background-image: url(../images/warning.png); }
585 .icon-warning { background-image: url(../images/warning.png); }
586 .icon-fav { background-image: url(../images/fav.png); }
586 .icon-fav { background-image: url(../images/fav.png); }
587 .icon-fav-off { background-image: url(../images/fav_off.png); }
587 .icon-fav-off { background-image: url(../images/fav_off.png); }
588 .icon-reload { background-image: url(../images/reload.png); }
588 .icon-reload { background-image: url(../images/reload.png); }
589 .icon-lock { background-image: url(../images/locked.png); }
589 .icon-lock { background-image: url(../images/locked.png); }
590 .icon-unlock { background-image: url(../images/unlock.png); }
590 .icon-unlock { background-image: url(../images/unlock.png); }
591 .icon-checked { background-image: url(../images/true.png); }
591 .icon-checked { background-image: url(../images/true.png); }
592 .icon-details { background-image: url(../images/zoom_in.png); }
592 .icon-details { background-image: url(../images/zoom_in.png); }
593 .icon-report { background-image: url(../images/report.png); }
593 .icon-report { background-image: url(../images/report.png); }
594
594
595 .icon22-projects { background-image: url(../images/22x22/projects.png); }
595 .icon22-projects { background-image: url(../images/22x22/projects.png); }
596 .icon22-users { background-image: url(../images/22x22/users.png); }
596 .icon22-users { background-image: url(../images/22x22/users.png); }
597 .icon22-tracker { background-image: url(../images/22x22/tracker.png); }
597 .icon22-tracker { background-image: url(../images/22x22/tracker.png); }
598 .icon22-role { background-image: url(../images/22x22/role.png); }
598 .icon22-role { background-image: url(../images/22x22/role.png); }
599 .icon22-workflow { background-image: url(../images/22x22/workflow.png); }
599 .icon22-workflow { background-image: url(../images/22x22/workflow.png); }
600 .icon22-options { background-image: url(../images/22x22/options.png); }
600 .icon22-options { background-image: url(../images/22x22/options.png); }
601 .icon22-notifications { background-image: url(../images/22x22/notifications.png); }
601 .icon22-notifications { background-image: url(../images/22x22/notifications.png); }
602 .icon22-authent { background-image: url(../images/22x22/authent.png); }
602 .icon22-authent { background-image: url(../images/22x22/authent.png); }
603 .icon22-info { background-image: url(../images/22x22/info.png); }
603 .icon22-info { background-image: url(../images/22x22/info.png); }
604 .icon22-comment { background-image: url(../images/22x22/comment.png); }
604 .icon22-comment { background-image: url(../images/22x22/comment.png); }
605 .icon22-package { background-image: url(../images/22x22/package.png); }
605 .icon22-package { background-image: url(../images/22x22/package.png); }
606 .icon22-settings { background-image: url(../images/22x22/settings.png); }
606 .icon22-settings { background-image: url(../images/22x22/settings.png); }
607 .icon22-plugin { background-image: url(../images/22x22/plugin.png); }
607 .icon22-plugin { background-image: url(../images/22x22/plugin.png); }
608
608
609 /***** Media print specific styles *****/
609 /***** Media print specific styles *****/
610 @media print {
610 @media print {
611 #top-menu, #header, #main-menu, #sidebar, #footer, .contextual, .other-formats { display:none; }
611 #top-menu, #header, #main-menu, #sidebar, #footer, .contextual, .other-formats { display:none; }
612 #main { background: #fff; }
612 #main { background: #fff; }
613 #content { width: 99%; margin: 0; padding: 0; border: 0; background: #fff; }
613 #content { width: 99%; margin: 0; padding: 0; border: 0; background: #fff; }
614 }
614 }
General Comments 0
You need to be logged in to leave comments. Login now