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