##// END OF EJS Templates
Date added as acronym title in ApplicationHelper#authoring...
Jean-Philippe Lang -
r725:00bf5f04db5f
parent child
Show More
@@ -1,324 +1,325
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
19
20 def current_role
20 def current_role
21 @current_role ||= User.current.role_for_project(@project)
21 @current_role ||= User.current.role_for_project(@project)
22 end
22 end
23
23
24 # Return true if user is authorized for controller/action, otherwise false
24 # Return true if user is authorized for controller/action, otherwise false
25 def authorize_for(controller, action)
25 def authorize_for(controller, action)
26 User.current.allowed_to?({:controller => controller, :action => action}, @project)
26 User.current.allowed_to?({:controller => controller, :action => action}, @project)
27 end
27 end
28
28
29 # Display a link if user is authorized
29 # Display a link if user is authorized
30 def link_to_if_authorized(name, options = {}, html_options = nil, *parameters_for_method_reference)
30 def link_to_if_authorized(name, options = {}, html_options = nil, *parameters_for_method_reference)
31 link_to(name, options, html_options, *parameters_for_method_reference) if authorize_for(options[:controller] || params[:controller], options[:action])
31 link_to(name, options, html_options, *parameters_for_method_reference) if authorize_for(options[:controller] || params[:controller], options[:action])
32 end
32 end
33
33
34 # Display a link to user's account page
34 # Display a link to user's account page
35 def link_to_user(user)
35 def link_to_user(user)
36 link_to user.name, :controller => 'account', :action => 'show', :id => user
36 link_to user.name, :controller => 'account', :action => 'show', :id => user
37 end
37 end
38
38
39 def link_to_issue(issue)
39 def link_to_issue(issue)
40 link_to "#{issue.tracker.name} ##{issue.id}", :controller => "issues", :action => "show", :id => issue
40 link_to "#{issue.tracker.name} ##{issue.id}", :controller => "issues", :action => "show", :id => issue
41 end
41 end
42
42
43 def toggle_link(name, id, options={})
43 def toggle_link(name, id, options={})
44 onclick = "Element.toggle('#{id}'); "
44 onclick = "Element.toggle('#{id}'); "
45 onclick << (options[:focus] ? "Form.Element.focus('#{options[:focus]}'); " : "this.blur(); ")
45 onclick << (options[:focus] ? "Form.Element.focus('#{options[:focus]}'); " : "this.blur(); ")
46 onclick << "return false;"
46 onclick << "return false;"
47 link_to(name, "#", :onclick => onclick)
47 link_to(name, "#", :onclick => onclick)
48 end
48 end
49
49
50 def image_to_function(name, function, html_options = {})
50 def image_to_function(name, function, html_options = {})
51 html_options.symbolize_keys!
51 html_options.symbolize_keys!
52 tag(:input, html_options.merge({
52 tag(:input, html_options.merge({
53 :type => "image", :src => image_path(name),
53 :type => "image", :src => image_path(name),
54 :onclick => (html_options[:onclick] ? "#{html_options[:onclick]}; " : "") + "#{function};"
54 :onclick => (html_options[:onclick] ? "#{html_options[:onclick]}; " : "") + "#{function};"
55 }))
55 }))
56 end
56 end
57
57
58 def prompt_to_remote(name, text, param, url, html_options = {})
58 def prompt_to_remote(name, text, param, url, html_options = {})
59 html_options[:onclick] = "promptToRemote('#{text}', '#{param}', '#{url_for(url)}'); return false;"
59 html_options[:onclick] = "promptToRemote('#{text}', '#{param}', '#{url_for(url)}'); return false;"
60 link_to name, {}, html_options
60 link_to name, {}, html_options
61 end
61 end
62
62
63 def format_date(date)
63 def format_date(date)
64 return nil unless date
64 return nil unless date
65 @date_format_setting ||= Setting.date_format.to_i
65 @date_format_setting ||= Setting.date_format.to_i
66 @date_format_setting == 0 ? l_date(date) : date.strftime("%Y-%m-%d")
66 @date_format_setting == 0 ? l_date(date) : date.strftime("%Y-%m-%d")
67 end
67 end
68
68
69 def format_time(time)
69 def format_time(time)
70 return nil unless time
70 return nil unless time
71 @date_format_setting ||= Setting.date_format.to_i
71 @date_format_setting ||= Setting.date_format.to_i
72 time = time.to_time if time.is_a?(String)
72 time = time.to_time if time.is_a?(String)
73 @date_format_setting == 0 ? l_datetime(time) : (time.strftime("%Y-%m-%d") + ' ' + l_time(time))
73 @date_format_setting == 0 ? l_datetime(time) : (time.strftime("%Y-%m-%d") + ' ' + l_time(time))
74 end
74 end
75
75
76 def authoring(created, author)
76 def authoring(created, author)
77 l(:label_added_time_by, author.name, distance_of_time_in_words(Time.now, created))
77 time_tag = content_tag('acronym', distance_of_time_in_words(Time.now, created), :title => format_time(created))
78 l(:label_added_time_by, author.name, time_tag)
78 end
79 end
79
80
80 def day_name(day)
81 def day_name(day)
81 l(:general_day_names).split(',')[day-1]
82 l(:general_day_names).split(',')[day-1]
82 end
83 end
83
84
84 def month_name(month)
85 def month_name(month)
85 l(:actionview_datehelper_select_month_names).split(',')[month-1]
86 l(:actionview_datehelper_select_month_names).split(',')[month-1]
86 end
87 end
87
88
88 def pagination_links_full(paginator, options={}, html_options={})
89 def pagination_links_full(paginator, options={}, html_options={})
89 page_param = options.delete(:page_param) || :page
90 page_param = options.delete(:page_param) || :page
90
91
91 html = ''
92 html = ''
92 html << link_to_remote(('&#171; ' + l(:label_previous)),
93 html << link_to_remote(('&#171; ' + l(:label_previous)),
93 {:update => "content", :url => options.merge(page_param => paginator.current.previous)},
94 {:update => "content", :url => options.merge(page_param => paginator.current.previous)},
94 {:href => url_for(:params => options.merge(page_param => paginator.current.previous))}) + ' ' if paginator.current.previous
95 {:href => url_for(:params => options.merge(page_param => paginator.current.previous))}) + ' ' if paginator.current.previous
95
96
96 html << (pagination_links_each(paginator, options) do |n|
97 html << (pagination_links_each(paginator, options) do |n|
97 link_to_remote(n.to_s,
98 link_to_remote(n.to_s,
98 {:url => {:params => options.merge(page_param => n)}, :update => 'content'},
99 {:url => {:params => options.merge(page_param => n)}, :update => 'content'},
99 {:href => url_for(:params => options.merge(page_param => n))})
100 {:href => url_for(:params => options.merge(page_param => n))})
100 end || '')
101 end || '')
101
102
102 html << ' ' + link_to_remote((l(:label_next) + ' &#187;'),
103 html << ' ' + link_to_remote((l(:label_next) + ' &#187;'),
103 {:update => "content", :url => options.merge(page_param => paginator.current.next)},
104 {:update => "content", :url => options.merge(page_param => paginator.current.next)},
104 {:href => url_for(:params => options.merge(page_param => paginator.current.next))}) if paginator.current.next
105 {:href => url_for(:params => options.merge(page_param => paginator.current.next))}) if paginator.current.next
105 html
106 html
106 end
107 end
107
108
108 def set_html_title(text)
109 def set_html_title(text)
109 @html_header_title = text
110 @html_header_title = text
110 end
111 end
111
112
112 def html_title
113 def html_title
113 title = []
114 title = []
114 title << @project.name if @project
115 title << @project.name if @project
115 title << @html_header_title
116 title << @html_header_title
116 title << Setting.app_title
117 title << Setting.app_title
117 title.compact.join(' - ')
118 title.compact.join(' - ')
118 end
119 end
119
120
120 # format text according to system settings
121 # format text according to system settings
121 def textilizable(text, options = {})
122 def textilizable(text, options = {})
122 return "" if text.blank?
123 return "" if text.blank?
123
124
124 # when using an image link, try to use an attachment, if possible
125 # when using an image link, try to use an attachment, if possible
125 attachments = options[:attachments]
126 attachments = options[:attachments]
126 if attachments
127 if attachments
127 text = text.gsub(/!([<>=]*)(\S+\.(gif|jpg|jpeg|png))!/) do |m|
128 text = text.gsub(/!([<>=]*)(\S+\.(gif|jpg|jpeg|png))!/) do |m|
128 align = $1
129 align = $1
129 filename = $2
130 filename = $2
130 rf = Regexp.new(filename, Regexp::IGNORECASE)
131 rf = Regexp.new(filename, Regexp::IGNORECASE)
131 # search for the picture in attachments
132 # search for the picture in attachments
132 if found = attachments.detect { |att| att.filename =~ rf }
133 if found = attachments.detect { |att| att.filename =~ rf }
133 image_url = url_for :controller => 'attachments', :action => 'download', :id => found.id
134 image_url = url_for :controller => 'attachments', :action => 'download', :id => found.id
134 "!#{align}#{image_url}!"
135 "!#{align}#{image_url}!"
135 else
136 else
136 "!#{align}#{filename}!"
137 "!#{align}#{filename}!"
137 end
138 end
138 end
139 end
139 end
140 end
140
141
141 text = (Setting.text_formatting == 'textile') ?
142 text = (Setting.text_formatting == 'textile') ?
142 Redmine::WikiFormatting.to_html(text) : simple_format(auto_link(h(text)))
143 Redmine::WikiFormatting.to_html(text) : simple_format(auto_link(h(text)))
143
144
144 # different methods for formatting wiki links
145 # different methods for formatting wiki links
145 case options[:wiki_links]
146 case options[:wiki_links]
146 when :local
147 when :local
147 # used for local links to html files
148 # used for local links to html files
148 format_wiki_link = Proc.new {|project, title| "#{title}.html" }
149 format_wiki_link = Proc.new {|project, title| "#{title}.html" }
149 when :anchor
150 when :anchor
150 # used for single-file wiki export
151 # used for single-file wiki export
151 format_wiki_link = Proc.new {|project, title| "##{title}" }
152 format_wiki_link = Proc.new {|project, title| "##{title}" }
152 else
153 else
153 format_wiki_link = Proc.new {|project, title| url_for :controller => 'wiki', :action => 'index', :id => project, :page => title }
154 format_wiki_link = Proc.new {|project, title| url_for :controller => 'wiki', :action => 'index', :id => project, :page => title }
154 end
155 end
155
156
156 project = options[:project] || @project
157 project = options[:project] || @project
157
158
158 # turn wiki links into html links
159 # turn wiki links into html links
159 # example:
160 # example:
160 # [[mypage]]
161 # [[mypage]]
161 # [[mypage|mytext]]
162 # [[mypage|mytext]]
162 # wiki links can refer other project wikis, using project name or identifier:
163 # wiki links can refer other project wikis, using project name or identifier:
163 # [[project:]] -> wiki starting page
164 # [[project:]] -> wiki starting page
164 # [[project:|mytext]]
165 # [[project:|mytext]]
165 # [[project:mypage]]
166 # [[project:mypage]]
166 # [[project:mypage|mytext]]
167 # [[project:mypage|mytext]]
167 text = text.gsub(/\[\[([^\]\|]+)(\|([^\]\|]+))?\]\]/) do |m|
168 text = text.gsub(/\[\[([^\]\|]+)(\|([^\]\|]+))?\]\]/) do |m|
168 link_project = project
169 link_project = project
169 page = $1
170 page = $1
170 title = $3
171 title = $3
171 if page =~ /^([^\:]+)\:(.*)$/
172 if page =~ /^([^\:]+)\:(.*)$/
172 link_project = Project.find_by_name($1) || Project.find_by_identifier($1)
173 link_project = Project.find_by_name($1) || Project.find_by_identifier($1)
173 page = title || $2
174 page = title || $2
174 title = $1 if page.blank?
175 title = $1 if page.blank?
175 end
176 end
176
177
177 if link_project && link_project.wiki
178 if link_project && link_project.wiki
178 # check if page exists
179 # check if page exists
179 wiki_page = link_project.wiki.find_page(page)
180 wiki_page = link_project.wiki.find_page(page)
180 link_to((title || page), format_wiki_link.call(link_project, Wiki.titleize(page)),
181 link_to((title || page), format_wiki_link.call(link_project, Wiki.titleize(page)),
181 :class => ('wiki-page' + (wiki_page ? '' : ' new')))
182 :class => ('wiki-page' + (wiki_page ? '' : ' new')))
182 else
183 else
183 # project or wiki doesn't exist
184 # project or wiki doesn't exist
184 title || page
185 title || page
185 end
186 end
186 end
187 end
187
188
188 # turn issue and revision ids into links
189 # turn issue and revision ids into links
189 # example:
190 # example:
190 # #52 -> <a href="/issues/show/52">#52</a>
191 # #52 -> <a href="/issues/show/52">#52</a>
191 # r52 -> <a href="/repositories/revision/6?rev=52">r52</a> (project.id is 6)
192 # r52 -> <a href="/repositories/revision/6?rev=52">r52</a> (project.id is 6)
192 text = text.gsub(%r{([\s,-^])(#|r)(\d+)(?=[[:punct:]]|\s|<|$)}) do |m|
193 text = text.gsub(%r{([\s,-^])(#|r)(\d+)(?=[[:punct:]]|\s|<|$)}) do |m|
193 leading, otype, oid = $1, $2, $3
194 leading, otype, oid = $1, $2, $3
194 link = nil
195 link = nil
195 if otype == 'r'
196 if otype == 'r'
196 if project && (changeset = project.changesets.find_by_revision(oid))
197 if project && (changeset = project.changesets.find_by_revision(oid))
197 link = link_to("r#{oid}", {:controller => 'repositories', :action => 'revision', :id => project.id, :rev => oid}, :class => 'changeset',
198 link = link_to("r#{oid}", {:controller => 'repositories', :action => 'revision', :id => project.id, :rev => oid}, :class => 'changeset',
198 :title => truncate(changeset.comments, 100))
199 :title => truncate(changeset.comments, 100))
199 end
200 end
200 else
201 else
201 if issue = Issue.find_by_id(oid.to_i, :include => [:project, :status], :conditions => Project.visible_by(User.current))
202 if issue = Issue.find_by_id(oid.to_i, :include => [:project, :status], :conditions => Project.visible_by(User.current))
202 link = link_to("##{oid}", {:controller => 'issues', :action => 'show', :id => oid}, :class => 'issue',
203 link = link_to("##{oid}", {:controller => 'issues', :action => 'show', :id => oid}, :class => 'issue',
203 :title => "#{truncate(issue.subject, 100)} (#{issue.status.name})")
204 :title => "#{truncate(issue.subject, 100)} (#{issue.status.name})")
204 link = content_tag('del', link) if issue.closed?
205 link = content_tag('del', link) if issue.closed?
205 end
206 end
206 end
207 end
207 leading + (link || "#{otype}#{oid}")
208 leading + (link || "#{otype}#{oid}")
208 end
209 end
209
210
210 text
211 text
211 end
212 end
212
213
213 # Same as Rails' simple_format helper without using paragraphs
214 # Same as Rails' simple_format helper without using paragraphs
214 def simple_format_without_paragraph(text)
215 def simple_format_without_paragraph(text)
215 text.to_s.
216 text.to_s.
216 gsub(/\r\n?/, "\n"). # \r\n and \r -> \n
217 gsub(/\r\n?/, "\n"). # \r\n and \r -> \n
217 gsub(/\n\n+/, "<br /><br />"). # 2+ newline -> 2 br
218 gsub(/\n\n+/, "<br /><br />"). # 2+ newline -> 2 br
218 gsub(/([^\n]\n)(?=[^\n])/, '\1<br />') # 1 newline -> br
219 gsub(/([^\n]\n)(?=[^\n])/, '\1<br />') # 1 newline -> br
219 end
220 end
220
221
221 def error_messages_for(object_name, options = {})
222 def error_messages_for(object_name, options = {})
222 options = options.symbolize_keys
223 options = options.symbolize_keys
223 object = instance_variable_get("@#{object_name}")
224 object = instance_variable_get("@#{object_name}")
224 if object && !object.errors.empty?
225 if object && !object.errors.empty?
225 # build full_messages here with controller current language
226 # build full_messages here with controller current language
226 full_messages = []
227 full_messages = []
227 object.errors.each do |attr, msg|
228 object.errors.each do |attr, msg|
228 next if msg.nil?
229 next if msg.nil?
229 msg = msg.first if msg.is_a? Array
230 msg = msg.first if msg.is_a? Array
230 if attr == "base"
231 if attr == "base"
231 full_messages << l(msg)
232 full_messages << l(msg)
232 else
233 else
233 full_messages << "&#171; " + (l_has_string?("field_" + attr) ? l("field_" + attr) : object.class.human_attribute_name(attr)) + " &#187; " + l(msg) unless attr == "custom_values"
234 full_messages << "&#171; " + (l_has_string?("field_" + attr) ? l("field_" + attr) : object.class.human_attribute_name(attr)) + " &#187; " + l(msg) unless attr == "custom_values"
234 end
235 end
235 end
236 end
236 # retrieve custom values error messages
237 # retrieve custom values error messages
237 if object.errors[:custom_values]
238 if object.errors[:custom_values]
238 object.custom_values.each do |v|
239 object.custom_values.each do |v|
239 v.errors.each do |attr, msg|
240 v.errors.each do |attr, msg|
240 next if msg.nil?
241 next if msg.nil?
241 msg = msg.first if msg.is_a? Array
242 msg = msg.first if msg.is_a? Array
242 full_messages << "&#171; " + v.custom_field.name + " &#187; " + l(msg)
243 full_messages << "&#171; " + v.custom_field.name + " &#187; " + l(msg)
243 end
244 end
244 end
245 end
245 end
246 end
246 content_tag("div",
247 content_tag("div",
247 content_tag(
248 content_tag(
248 options[:header_tag] || "span", lwr(:gui_validation_error, full_messages.length) + ":"
249 options[:header_tag] || "span", lwr(:gui_validation_error, full_messages.length) + ":"
249 ) +
250 ) +
250 content_tag("ul", full_messages.collect { |msg| content_tag("li", msg) }),
251 content_tag("ul", full_messages.collect { |msg| content_tag("li", msg) }),
251 "id" => options[:id] || "errorExplanation", "class" => options[:class] || "errorExplanation"
252 "id" => options[:id] || "errorExplanation", "class" => options[:class] || "errorExplanation"
252 )
253 )
253 else
254 else
254 ""
255 ""
255 end
256 end
256 end
257 end
257
258
258 def lang_options_for_select(blank=true)
259 def lang_options_for_select(blank=true)
259 (blank ? [["(auto)", ""]] : []) +
260 (blank ? [["(auto)", ""]] : []) +
260 GLoc.valid_languages.collect{|lang| [ ll(lang.to_s, :general_lang_name), lang.to_s]}.sort{|x,y| x.first <=> y.first }
261 GLoc.valid_languages.collect{|lang| [ ll(lang.to_s, :general_lang_name), lang.to_s]}.sort{|x,y| x.first <=> y.first }
261 end
262 end
262
263
263 def label_tag_for(name, option_tags = nil, options = {})
264 def label_tag_for(name, option_tags = nil, options = {})
264 label_text = l(("field_"+field.to_s.gsub(/\_id$/, "")).to_sym) + (options.delete(:required) ? @template.content_tag("span", " *", :class => "required"): "")
265 label_text = l(("field_"+field.to_s.gsub(/\_id$/, "")).to_sym) + (options.delete(:required) ? @template.content_tag("span", " *", :class => "required"): "")
265 content_tag("label", label_text)
266 content_tag("label", label_text)
266 end
267 end
267
268
268 def labelled_tabular_form_for(name, object, options, &proc)
269 def labelled_tabular_form_for(name, object, options, &proc)
269 options[:html] ||= {}
270 options[:html] ||= {}
270 options[:html].store :class, "tabular"
271 options[:html].store :class, "tabular"
271 form_for(name, object, options.merge({ :builder => TabularFormBuilder, :lang => current_language}), &proc)
272 form_for(name, object, options.merge({ :builder => TabularFormBuilder, :lang => current_language}), &proc)
272 end
273 end
273
274
274 def check_all_links(form_name)
275 def check_all_links(form_name)
275 link_to_function(l(:button_check_all), "checkAll('#{form_name}', true)") +
276 link_to_function(l(:button_check_all), "checkAll('#{form_name}', true)") +
276 " | " +
277 " | " +
277 link_to_function(l(:button_uncheck_all), "checkAll('#{form_name}', false)")
278 link_to_function(l(:button_uncheck_all), "checkAll('#{form_name}', false)")
278 end
279 end
279
280
280 def calendar_for(field_id)
281 def calendar_for(field_id)
281 image_tag("calendar.png", {:id => "#{field_id}_trigger",:class => "calendar-trigger"}) +
282 image_tag("calendar.png", {:id => "#{field_id}_trigger",:class => "calendar-trigger"}) +
282 javascript_tag("Calendar.setup({inputField : '#{field_id}', ifFormat : '%Y-%m-%d', button : '#{field_id}_trigger' });")
283 javascript_tag("Calendar.setup({inputField : '#{field_id}', ifFormat : '%Y-%m-%d', button : '#{field_id}_trigger' });")
283 end
284 end
284
285
285 def wikitoolbar_for(field_id)
286 def wikitoolbar_for(field_id)
286 return '' unless Setting.text_formatting == 'textile'
287 return '' unless Setting.text_formatting == 'textile'
287 javascript_include_tag('jstoolbar') + javascript_tag("var toolbar = new jsToolBar($('#{field_id}')); toolbar.draw();")
288 javascript_include_tag('jstoolbar') + javascript_tag("var toolbar = new jsToolBar($('#{field_id}')); toolbar.draw();")
288 end
289 end
289 end
290 end
290
291
291 class TabularFormBuilder < ActionView::Helpers::FormBuilder
292 class TabularFormBuilder < ActionView::Helpers::FormBuilder
292 include GLoc
293 include GLoc
293
294
294 def initialize(object_name, object, template, options, proc)
295 def initialize(object_name, object, template, options, proc)
295 set_language_if_valid options.delete(:lang)
296 set_language_if_valid options.delete(:lang)
296 @object_name, @object, @template, @options, @proc = object_name, object, template, options, proc
297 @object_name, @object, @template, @options, @proc = object_name, object, template, options, proc
297 end
298 end
298
299
299 (field_helpers - %w(radio_button hidden_field) + %w(date_select)).each do |selector|
300 (field_helpers - %w(radio_button hidden_field) + %w(date_select)).each do |selector|
300 src = <<-END_SRC
301 src = <<-END_SRC
301 def #{selector}(field, options = {})
302 def #{selector}(field, options = {})
302 return super if options.delete :no_label
303 return super if options.delete :no_label
303 label_text = l(options[:label]) if options[:label]
304 label_text = l(options[:label]) if options[:label]
304 label_text ||= l(("field_"+field.to_s.gsub(/\_id$/, "")).to_sym)
305 label_text ||= l(("field_"+field.to_s.gsub(/\_id$/, "")).to_sym)
305 label_text << @template.content_tag("span", " *", :class => "required") if options.delete(:required)
306 label_text << @template.content_tag("span", " *", :class => "required") if options.delete(:required)
306 label = @template.content_tag("label", label_text,
307 label = @template.content_tag("label", label_text,
307 :class => (@object && @object.errors[field] ? "error" : nil),
308 :class => (@object && @object.errors[field] ? "error" : nil),
308 :for => (@object_name.to_s + "_" + field.to_s))
309 :for => (@object_name.to_s + "_" + field.to_s))
309 label + super
310 label + super
310 end
311 end
311 END_SRC
312 END_SRC
312 class_eval src, __FILE__, __LINE__
313 class_eval src, __FILE__, __LINE__
313 end
314 end
314
315
315 def select(field, choices, options = {}, html_options = {})
316 def select(field, choices, options = {}, html_options = {})
316 label_text = l(("field_"+field.to_s.gsub(/\_id$/, "")).to_sym) + (options.delete(:required) ? @template.content_tag("span", " *", :class => "required"): "")
317 label_text = l(("field_"+field.to_s.gsub(/\_id$/, "")).to_sym) + (options.delete(:required) ? @template.content_tag("span", " *", :class => "required"): "")
317 label = @template.content_tag("label", label_text,
318 label = @template.content_tag("label", label_text,
318 :class => (@object && @object.errors[field] ? "error" : nil),
319 :class => (@object && @object.errors[field] ? "error" : nil),
319 :for => (@object_name.to_s + "_" + field.to_s))
320 :for => (@object_name.to_s + "_" + field.to_s))
320 label + super
321 label + super
321 end
322 end
322
323
323 end
324 end
324
325
@@ -1,738 +1,739
1 /* andreas08 - an open source xhtml/css website layout by Andreas Viklund - http://andreasviklund.com . Free to use in any way and for any purpose as long as the proper credits are given to the original designer. Version: 1.0, November 28, 2005 */
1 /* andreas08 - an open source xhtml/css website layout by Andreas Viklund - http://andreasviklund.com . Free to use in any way and for any purpose as long as the proper credits are given to the original designer. Version: 1.0, November 28, 2005 */
2 /* Edited by Jean-Philippe Lang *>
2 /* Edited by Jean-Philippe Lang *>
3 /**************** Body and tag styles ****************/
3 /**************** Body and tag styles ****************/
4
4
5 #header * {margin:0; padding:0;}
5 #header * {margin:0; padding:0;}
6 p, ul, ol, li {margin:0; padding:0;}
6 p, ul, ol, li {margin:0; padding:0;}
7
7
8 body{
8 body{
9 font:76% Verdana,Tahoma,Arial,sans-serif;
9 font:76% Verdana,Tahoma,Arial,sans-serif;
10 line-height:1.4em;
10 line-height:1.4em;
11 text-align:center;
11 text-align:center;
12 color:#303030;
12 color:#303030;
13 background:#e8eaec;
13 background:#e8eaec;
14 margin:0;
14 margin:0;
15 }
15 }
16
16
17 a{color:#467aa7;font-weight:bold;text-decoration:none;background-color:inherit;}
17 a{color:#467aa7;font-weight:bold;text-decoration:none;background-color:inherit;}
18 a:hover{color:#2a5a8a; text-decoration:none; background-color:inherit;}
18 a:hover{color:#2a5a8a; text-decoration:none; background-color:inherit;}
19 a img{border:none;}
19 a img{border:none;}
20
20
21 p{margin:0 0 1em 0;}
21 p{margin:0 0 1em 0;}
22 p form{margin-top:0; margin-bottom:20px;}
22 p form{margin-top:0; margin-bottom:20px;}
23
23
24 img.left,img.center,img.right{padding:4px; border:1px solid #a0a0a0;}
24 img.left,img.center,img.right{padding:4px; border:1px solid #a0a0a0;}
25 img.left{float:left; margin:0 12px 5px 0;}
25 img.left{float:left; margin:0 12px 5px 0;}
26 img.center{display:block; margin:0 auto 5px auto;}
26 img.center{display:block; margin:0 auto 5px auto;}
27 img.right{float:right; margin:0 0 5px 12px;}
27 img.right{float:right; margin:0 0 5px 12px;}
28
28
29 /**************** Header and navigation styles ****************/
29 /**************** Header and navigation styles ****************/
30
30
31 #container{
31 #container{
32 width:100%;
32 width:100%;
33 min-width: 800px;
33 min-width: 800px;
34 margin:0;
34 margin:0;
35 padding:0;
35 padding:0;
36 text-align:left;
36 text-align:left;
37 background:#ffffff;
37 background:#ffffff;
38 color:#303030;
38 color:#303030;
39 }
39 }
40
40
41 #header{
41 #header{
42 height:4.5em;
42 height:4.5em;
43 margin:0;
43 margin:0;
44 background:#467aa7;
44 background:#467aa7;
45 color:#ffffff;
45 color:#ffffff;
46 margin-bottom:1px;
46 margin-bottom:1px;
47 }
47 }
48
48
49 #header h1{
49 #header h1{
50 padding:10px 0 0 20px;
50 padding:10px 0 0 20px;
51 font-size:2em;
51 font-size:2em;
52 background-color:inherit;
52 background-color:inherit;
53 color:#fff;
53 color:#fff;
54 letter-spacing:-1px;
54 letter-spacing:-1px;
55 font-weight:bold;
55 font-weight:bold;
56 font-family: Trebuchet MS,Georgia,"Times New Roman",serif;
56 font-family: Trebuchet MS,Georgia,"Times New Roman",serif;
57 }
57 }
58
58
59 #header h2{
59 #header h2{
60 margin:3px 0 0 40px;
60 margin:3px 0 0 40px;
61 font-size:1.5em;
61 font-size:1.5em;
62 background-color:inherit;
62 background-color:inherit;
63 color:#f0f2f4;
63 color:#f0f2f4;
64 letter-spacing:-1px;
64 letter-spacing:-1px;
65 font-weight:normal;
65 font-weight:normal;
66 font-family: Trebuchet MS,Georgia,"Times New Roman",serif;
66 font-family: Trebuchet MS,Georgia,"Times New Roman",serif;
67 }
67 }
68
68
69 #header a {color:#fff;}
69 #header a {color:#fff;}
70
70
71 #navigation{
71 #navigation{
72 height:2.2em;
72 height:2.2em;
73 line-height:2.2em;
73 line-height:2.2em;
74 margin:0;
74 margin:0;
75 background:#578bb8;
75 background:#578bb8;
76 color:#ffffff;
76 color:#ffffff;
77 }
77 }
78
78
79 #navigation li{
79 #navigation li{
80 float:left;
80 float:left;
81 list-style-type:none;
81 list-style-type:none;
82 border-right:1px solid #ffffff;
82 border-right:1px solid #ffffff;
83 white-space:nowrap;
83 white-space:nowrap;
84 }
84 }
85
85
86 #navigation li.right {
86 #navigation li.right {
87 float:right;
87 float:right;
88 list-style-type:none;
88 list-style-type:none;
89 border-right:0;
89 border-right:0;
90 border-left:1px solid #ffffff;
90 border-left:1px solid #ffffff;
91 white-space:nowrap;
91 white-space:nowrap;
92 }
92 }
93
93
94 #navigation li a{
94 #navigation li a{
95 display:block;
95 display:block;
96 padding:0px 10px 0px 22px;
96 padding:0px 10px 0px 22px;
97 font-size:0.8em;
97 font-size:0.8em;
98 font-weight:normal;
98 font-weight:normal;
99 text-decoration:none;
99 text-decoration:none;
100 background-color:inherit;
100 background-color:inherit;
101 color: #ffffff;
101 color: #ffffff;
102 }
102 }
103
103
104 #navigation li.submenu {background:url(../images/arrow_down.png) 96% 80% no-repeat;}
104 #navigation li.submenu {background:url(../images/arrow_down.png) 96% 80% no-repeat;}
105 #navigation li.submenu a {padding:0px 16px 0px 22px;}
105 #navigation li.submenu a {padding:0px 16px 0px 22px;}
106 * html #navigation a {width:1%;}
106 * html #navigation a {width:1%;}
107
107
108 #navigation .selected,#navigation a:hover{
108 #navigation .selected,#navigation a:hover{
109 color:#ffffff;
109 color:#ffffff;
110 text-decoration:none;
110 text-decoration:none;
111 background-color: #80b0da;
111 background-color: #80b0da;
112 }
112 }
113
113
114 /**************** Icons *******************/
114 /**************** Icons *******************/
115 .icon {
115 .icon {
116 background-position: 0% 40%;
116 background-position: 0% 40%;
117 background-repeat: no-repeat;
117 background-repeat: no-repeat;
118 padding-left: 20px;
118 padding-left: 20px;
119 padding-top: 2px;
119 padding-top: 2px;
120 padding-bottom: 3px;
120 padding-bottom: 3px;
121 }
121 }
122
122
123 #navigation .icon {
123 #navigation .icon {
124 background-position: 4px 50%;
124 background-position: 4px 50%;
125 }
125 }
126
126
127 .icon22 {
127 .icon22 {
128 background-position: 0% 40%;
128 background-position: 0% 40%;
129 background-repeat: no-repeat;
129 background-repeat: no-repeat;
130 padding-left: 26px;
130 padding-left: 26px;
131 line-height: 22px;
131 line-height: 22px;
132 vertical-align: middle;
132 vertical-align: middle;
133 }
133 }
134
134
135 .icon-add { background-image: url(../images/add.png); }
135 .icon-add { background-image: url(../images/add.png); }
136 .icon-edit { background-image: url(../images/edit.png); }
136 .icon-edit { background-image: url(../images/edit.png); }
137 .icon-del { background-image: url(../images/delete.png); }
137 .icon-del { background-image: url(../images/delete.png); }
138 .icon-move { background-image: url(../images/move.png); }
138 .icon-move { background-image: url(../images/move.png); }
139 .icon-save { background-image: url(../images/save.png); }
139 .icon-save { background-image: url(../images/save.png); }
140 .icon-cancel { background-image: url(../images/cancel.png); }
140 .icon-cancel { background-image: url(../images/cancel.png); }
141 .icon-pdf { background-image: url(../images/pdf.png); }
141 .icon-pdf { background-image: url(../images/pdf.png); }
142 .icon-csv { background-image: url(../images/csv.png); }
142 .icon-csv { background-image: url(../images/csv.png); }
143 .icon-html { background-image: url(../images/html.png); }
143 .icon-html { background-image: url(../images/html.png); }
144 .icon-image { background-image: url(../images/image.png); }
144 .icon-image { background-image: url(../images/image.png); }
145 .icon-txt { background-image: url(../images/txt.png); }
145 .icon-txt { background-image: url(../images/txt.png); }
146 .icon-file { background-image: url(../images/file.png); }
146 .icon-file { background-image: url(../images/file.png); }
147 .icon-folder { background-image: url(../images/folder.png); }
147 .icon-folder { background-image: url(../images/folder.png); }
148 .icon-package { background-image: url(../images/package.png); }
148 .icon-package { background-image: url(../images/package.png); }
149 .icon-home { background-image: url(../images/home.png); }
149 .icon-home { background-image: url(../images/home.png); }
150 .icon-user { background-image: url(../images/user.png); }
150 .icon-user { background-image: url(../images/user.png); }
151 .icon-mypage { background-image: url(../images/user_page.png); }
151 .icon-mypage { background-image: url(../images/user_page.png); }
152 .icon-admin { background-image: url(../images/admin.png); }
152 .icon-admin { background-image: url(../images/admin.png); }
153 .icon-projects { background-image: url(../images/projects.png); }
153 .icon-projects { background-image: url(../images/projects.png); }
154 .icon-logout { background-image: url(../images/logout.png); }
154 .icon-logout { background-image: url(../images/logout.png); }
155 .icon-help { background-image: url(../images/help.png); }
155 .icon-help { background-image: url(../images/help.png); }
156 .icon-attachment { background-image: url(../images/attachment.png); }
156 .icon-attachment { background-image: url(../images/attachment.png); }
157 .icon-index { background-image: url(../images/index.png); }
157 .icon-index { background-image: url(../images/index.png); }
158 .icon-history { background-image: url(../images/history.png); }
158 .icon-history { background-image: url(../images/history.png); }
159 .icon-feed { background-image: url(../images/feed.png); }
159 .icon-feed { background-image: url(../images/feed.png); }
160 .icon-time { background-image: url(../images/time.png); }
160 .icon-time { background-image: url(../images/time.png); }
161 .icon-stats { background-image: url(../images/stats.png); }
161 .icon-stats { background-image: url(../images/stats.png); }
162 .icon-warning { background-image: url(../images/warning.png); }
162 .icon-warning { background-image: url(../images/warning.png); }
163 .icon-fav { background-image: url(../images/fav.png); }
163 .icon-fav { background-image: url(../images/fav.png); }
164 .icon-fav-off { background-image: url(../images/fav_off.png); }
164 .icon-fav-off { background-image: url(../images/fav_off.png); }
165 .icon-reload { background-image: url(../images/reload.png); }
165 .icon-reload { background-image: url(../images/reload.png); }
166 .icon-lock { background-image: url(../images/locked.png); }
166 .icon-lock { background-image: url(../images/locked.png); }
167 .icon-unlock { background-image: url(../images/unlock.png); }
167 .icon-unlock { background-image: url(../images/unlock.png); }
168
168
169 .icon22-projects { background-image: url(../images/22x22/projects.png); }
169 .icon22-projects { background-image: url(../images/22x22/projects.png); }
170 .icon22-users { background-image: url(../images/22x22/users.png); }
170 .icon22-users { background-image: url(../images/22x22/users.png); }
171 .icon22-tracker { background-image: url(../images/22x22/tracker.png); }
171 .icon22-tracker { background-image: url(../images/22x22/tracker.png); }
172 .icon22-role { background-image: url(../images/22x22/role.png); }
172 .icon22-role { background-image: url(../images/22x22/role.png); }
173 .icon22-workflow { background-image: url(../images/22x22/workflow.png); }
173 .icon22-workflow { background-image: url(../images/22x22/workflow.png); }
174 .icon22-options { background-image: url(../images/22x22/options.png); }
174 .icon22-options { background-image: url(../images/22x22/options.png); }
175 .icon22-notifications { background-image: url(../images/22x22/notifications.png); }
175 .icon22-notifications { background-image: url(../images/22x22/notifications.png); }
176 .icon22-authent { background-image: url(../images/22x22/authent.png); }
176 .icon22-authent { background-image: url(../images/22x22/authent.png); }
177 .icon22-info { background-image: url(../images/22x22/info.png); }
177 .icon22-info { background-image: url(../images/22x22/info.png); }
178 .icon22-comment { background-image: url(../images/22x22/comment.png); }
178 .icon22-comment { background-image: url(../images/22x22/comment.png); }
179 .icon22-package { background-image: url(../images/22x22/package.png); }
179 .icon22-package { background-image: url(../images/22x22/package.png); }
180 .icon22-settings { background-image: url(../images/22x22/settings.png); }
180 .icon22-settings { background-image: url(../images/22x22/settings.png); }
181
181
182 /**************** Content styles ****************/
182 /**************** Content styles ****************/
183
183
184 html>body #content {
184 html>body #content {
185 height: auto;
185 height: auto;
186 min-height: 500px;
186 min-height: 500px;
187 }
187 }
188
188
189 #content{
189 #content{
190 width: auto;
190 width: auto;
191 height:500px;
191 height:500px;
192 font-size:0.9em;
192 font-size:0.9em;
193 padding:20px 10px 10px 20px;
193 padding:20px 10px 10px 20px;
194 margin-left: 120px;
194 margin-left: 120px;
195 border-left: 1px dashed #c0c0c0;
195 border-left: 1px dashed #c0c0c0;
196
196
197 }
197 }
198
198
199 #content h2, #content div.wiki h1 {
199 #content h2, #content div.wiki h1 {
200 display:block;
200 display:block;
201 margin:0 0 16px 0;
201 margin:0 0 16px 0;
202 font-size:1.7em;
202 font-size:1.7em;
203 font-weight:normal;
203 font-weight:normal;
204 letter-spacing:-1px;
204 letter-spacing:-1px;
205 color:#606060;
205 color:#606060;
206 background-color:inherit;
206 background-color:inherit;
207 font-family: Trebuchet MS,Georgia,"Times New Roman",serif;
207 font-family: Trebuchet MS,Georgia,"Times New Roman",serif;
208 }
208 }
209
209
210 #content h2 a{font-weight:normal;}
210 #content h2 a{font-weight:normal;}
211 #content h3{margin:0 0 12px 0; font-size:1.4em;color:#707070;font-family: Trebuchet MS,Georgia,"Times New Roman",serif;}
211 #content h3{margin:0 0 12px 0; font-size:1.4em;color:#707070;font-family: Trebuchet MS,Georgia,"Times New Roman",serif;}
212 #content h4{font-size: 1em; margin-bottom: 12px; margin-top: 20px; font-weight: normal; border-bottom: dotted 1px #c0c0c0;}
212 #content h4{font-size: 1em; margin-bottom: 12px; margin-top: 20px; font-weight: normal; border-bottom: dotted 1px #c0c0c0;}
213 #content a:hover,#subcontent a:hover{text-decoration:underline;}
213 #content a:hover,#subcontent a:hover{text-decoration:underline;}
214 #content ul,#content ol{margin:0 5px 16px 35px;}
214 #content ul,#content ol{margin:0 5px 16px 35px;}
215 #content dl{margin:0 5px 10px 25px;}
215 #content dl{margin:0 5px 10px 25px;}
216 #content dt{font-weight:bold; margin-bottom:5px;}
216 #content dt{font-weight:bold; margin-bottom:5px;}
217 #content dd{margin:0 0 10px 15px;}
217 #content dd{margin:0 0 10px 15px;}
218
218
219 #content .tabs{height: 2.6em;}
219 #content .tabs{height: 2.6em;}
220 #content .tabs ul{margin:0;}
220 #content .tabs ul{margin:0;}
221 #content .tabs ul li{
221 #content .tabs ul li{
222 float:left;
222 float:left;
223 list-style-type:none;
223 list-style-type:none;
224 white-space:nowrap;
224 white-space:nowrap;
225 margin-right:8px;
225 margin-right:8px;
226 background:#fff;
226 background:#fff;
227 }
227 }
228 #content .tabs ul li a{
228 #content .tabs ul li a{
229 display:block;
229 display:block;
230 font-size: 0.9em;
230 font-size: 0.9em;
231 text-decoration:none;
231 text-decoration:none;
232 line-height:1em;
232 line-height:1em;
233 padding:4px;
233 padding:4px;
234 border: 1px solid #c0c0c0;
234 border: 1px solid #c0c0c0;
235 }
235 }
236
236
237 #content .tabs ul li a.selected, #content .tabs ul li a:hover{
237 #content .tabs ul li a.selected, #content .tabs ul li a:hover{
238 background-color: #80b0da;
238 background-color: #80b0da;
239 border: 1px solid #80b0da;
239 border: 1px solid #80b0da;
240 color: #fff;
240 color: #fff;
241 text-decoration:none;
241 text-decoration:none;
242 }
242 }
243
243
244 /***********************************************/
244 /***********************************************/
245
245
246 form {display: inline;}
246 form {display: inline;}
247 blockquote {padding-left: 6px; border-left: 2px solid #ccc;}
247 blockquote {padding-left: 6px; border-left: 2px solid #ccc;}
248 input, select {vertical-align: middle; margin-top: 1px; margin-bottom: 1px;}
248 input, select {vertical-align: middle; margin-top: 1px; margin-bottom: 1px;}
249
249
250 input.button-small {font-size: 0.8em;}
250 input.button-small {font-size: 0.8em;}
251 textarea.wiki-edit { width: 99.5%; }
251 textarea.wiki-edit { width: 99.5%; }
252 .select-small {font-size: 0.8em;}
252 .select-small {font-size: 0.8em;}
253 label {font-weight: bold; font-size: 1em; color: #505050;}
253 label {font-weight: bold; font-size: 1em; color: #505050;}
254 fieldset {border:1px solid #c0c0c0; padding: 6px;}
254 fieldset {border:1px solid #c0c0c0; padding: 6px;}
255 legend {color: #505050;}
255 legend {color: #505050;}
256 .required {color: #bb0000;}
256 .required {color: #bb0000;}
257 .odd {background-color:#f6f7f8;}
257 .odd {background-color:#f6f7f8;}
258 .even {background-color: #fff;}
258 .even {background-color: #fff;}
259 hr { border:0; border-top: dotted 1px #fff; border-bottom: dotted 1px #c0c0c0; }
259 hr { border:0; border-top: dotted 1px #fff; border-bottom: dotted 1px #c0c0c0; }
260 table p {margin:0; padding:0;}
260 table p {margin:0; padding:0;}
261 acronym {border-bottom:0;}
261
262
262 .highlight { background-color: #FCFD8D;}
263 .highlight { background-color: #FCFD8D;}
263
264
264 div.square {
265 div.square {
265 border: 1px solid #999;
266 border: 1px solid #999;
266 float: left;
267 float: left;
267 margin: .4em .5em 0 0;
268 margin: .4em .5em 0 0;
268 overflow: hidden;
269 overflow: hidden;
269 width: .6em; height: .6em;
270 width: .6em; height: .6em;
270 }
271 }
271
272
272 ul.documents {
273 ul.documents {
273 list-style-type: none;
274 list-style-type: none;
274 padding: 0;
275 padding: 0;
275 margin: 0;
276 margin: 0;
276 }
277 }
277
278
278 ul.documents li {
279 ul.documents li {
279 background-image: url(../images/32x32/file.png);
280 background-image: url(../images/32x32/file.png);
280 background-repeat: no-repeat;
281 background-repeat: no-repeat;
281 background-position: 0 1px;
282 background-position: 0 1px;
282 padding-left: 36px;
283 padding-left: 36px;
283 margin-bottom: 10px;
284 margin-bottom: 10px;
284 margin-left: -37px;
285 margin-left: -37px;
285 }
286 }
286
287
287 /********** Table used to display lists of things ***********/
288 /********** Table used to display lists of things ***********/
288
289
289 table.list {
290 table.list {
290 width:100%;
291 width:100%;
291 border-collapse: collapse;
292 border-collapse: collapse;
292 border: 1px dotted #d0d0d0;
293 border: 1px dotted #d0d0d0;
293 margin-bottom: 6px;
294 margin-bottom: 6px;
294 }
295 }
295
296
296 table.with-cells td {
297 table.with-cells td {
297 border: 1px solid #d7d7d7;
298 border: 1px solid #d7d7d7;
298 }
299 }
299
300
300 table.list td {
301 table.list td {
301 padding:2px;
302 padding:2px;
302 }
303 }
303
304
304 table.list thead th {
305 table.list thead th {
305 text-align: center;
306 text-align: center;
306 background: #eee;
307 background: #eee;
307 border: 1px solid #d7d7d7;
308 border: 1px solid #d7d7d7;
308 color: #777;
309 color: #777;
309 }
310 }
310
311
311 table.list tbody th {
312 table.list tbody th {
312 font-weight: bold;
313 font-weight: bold;
313 background: #eed;
314 background: #eed;
314 border: 1px solid #d7d7d7;
315 border: 1px solid #d7d7d7;
315 color: #777;
316 color: #777;
316 }
317 }
317
318
318 /*========== Drop down menu ==============*/
319 /*========== Drop down menu ==============*/
319 div.menu {
320 div.menu {
320 background-color: #FFFFFF;
321 background-color: #FFFFFF;
321 border-style: solid;
322 border-style: solid;
322 border-width: 1px;
323 border-width: 1px;
323 border-color: #7F9DB9;
324 border-color: #7F9DB9;
324 position: absolute;
325 position: absolute;
325 top: 0px;
326 top: 0px;
326 left: 0px;
327 left: 0px;
327 padding: 0;
328 padding: 0;
328 visibility: hidden;
329 visibility: hidden;
329 z-index: 101;
330 z-index: 101;
330 }
331 }
331
332
332 div.menu a.menuItem {
333 div.menu a.menuItem {
333 font-size: 10px;
334 font-size: 10px;
334 font-weight: normal;
335 font-weight: normal;
335 line-height: 2em;
336 line-height: 2em;
336 color: #000000;
337 color: #000000;
337 background-color: #FFFFFF;
338 background-color: #FFFFFF;
338 cursor: default;
339 cursor: default;
339 display: block;
340 display: block;
340 padding: 0 1em;
341 padding: 0 1em;
341 margin: 0;
342 margin: 0;
342 border: 0;
343 border: 0;
343 text-decoration: none;
344 text-decoration: none;
344 white-space: nowrap;
345 white-space: nowrap;
345 }
346 }
346
347
347 div.menu a.menuItem:hover, div.menu a.menuItemHighlight {
348 div.menu a.menuItem:hover, div.menu a.menuItemHighlight {
348 background-color: #80b0da;
349 background-color: #80b0da;
349 color: #ffffff;
350 color: #ffffff;
350 }
351 }
351
352
352 div.menu a.menuItem span.menuItemText {}
353 div.menu a.menuItem span.menuItemText {}
353
354
354 div.menu a.menuItem span.menuItemArrow {
355 div.menu a.menuItem span.menuItemArrow {
355 margin-right: -.75em;
356 margin-right: -.75em;
356 }
357 }
357
358
358 /**************** Sidebar styles ****************/
359 /**************** Sidebar styles ****************/
359
360
360 #subcontent{
361 #subcontent{
361 position: absolute;
362 position: absolute;
362 left: 0px;
363 left: 0px;
363 width:95px;
364 width:95px;
364 padding:20px 20px 10px 5px;
365 padding:20px 20px 10px 5px;
365 overflow: hidden;
366 overflow: hidden;
366 }
367 }
367
368
368 #subcontent h2{
369 #subcontent h2{
369 display:block;
370 display:block;
370 margin:0 0 5px 0;
371 margin:0 0 5px 0;
371 font-size:1.0em;
372 font-size:1.0em;
372 font-weight:bold;
373 font-weight:bold;
373 text-align:left;
374 text-align:left;
374 color:#606060;
375 color:#606060;
375 background-color:inherit;
376 background-color:inherit;
376 font-family: Trebuchet MS,Georgia,"Times New Roman",serif;
377 font-family: Trebuchet MS,Georgia,"Times New Roman",serif;
377 }
378 }
378
379
379 #subcontent p{margin:0 0 16px 0; font-size:0.9em;}
380 #subcontent p{margin:0 0 16px 0; font-size:0.9em;}
380
381
381 /**************** Menublock styles ****************/
382 /**************** Menublock styles ****************/
382
383
383 .menublock{margin:0 0 20px 8px; font-size:0.8em;}
384 .menublock{margin:0 0 20px 8px; font-size:0.8em;}
384 .menublock li{list-style:none; display:block; padding:1px; margin-bottom:0px;}
385 .menublock li{list-style:none; display:block; padding:1px; margin-bottom:0px;}
385 .menublock li a{font-weight:bold; text-decoration:none;}
386 .menublock li a{font-weight:bold; text-decoration:none;}
386 .menublock li a:hover{text-decoration:none;}
387 .menublock li a:hover{text-decoration:none;}
387 .menublock li ul{margin:0; font-size:1em; font-weight:normal;}
388 .menublock li ul{margin:0; font-size:1em; font-weight:normal;}
388 .menublock li ul li{margin-bottom:0;}
389 .menublock li ul li{margin-bottom:0;}
389 .menublock li ul a{font-weight:normal;}
390 .menublock li ul a{font-weight:normal;}
390
391
391 /**************** Footer styles ****************/
392 /**************** Footer styles ****************/
392
393
393 #footer{
394 #footer{
394 clear:both;
395 clear:both;
395 padding:5px 0;
396 padding:5px 0;
396 margin:0;
397 margin:0;
397 font-size:0.9em;
398 font-size:0.9em;
398 color:#f0f0f0;
399 color:#f0f0f0;
399 background:#467aa7;
400 background:#467aa7;
400 }
401 }
401
402
402 #footer p{padding:0; margin:0; text-align:center;}
403 #footer p{padding:0; margin:0; text-align:center;}
403 #footer a{color:#f0f0f0; background-color:inherit; font-weight:bold;}
404 #footer a{color:#f0f0f0; background-color:inherit; font-weight:bold;}
404 #footer a:hover{color:#ffffff; background-color:inherit; text-decoration: underline;}
405 #footer a:hover{color:#ffffff; background-color:inherit; text-decoration: underline;}
405
406
406 /**************** Misc classes and styles ****************/
407 /**************** Misc classes and styles ****************/
407
408
408 .splitcontentleft{float:left; width:49%;}
409 .splitcontentleft{float:left; width:49%;}
409 .splitcontentright{float:right; width:49%;}
410 .splitcontentright{float:right; width:49%;}
410 .clear{clear:both;}
411 .clear{clear:both;}
411 .small{font-size:0.8em;line-height:1.4em;padding:0 0 0 0;}
412 .small{font-size:0.8em;line-height:1.4em;padding:0 0 0 0;}
412 .hide{display:none;}
413 .hide{display:none;}
413 .textcenter{text-align:center;}
414 .textcenter{text-align:center;}
414 .textright{text-align:right;}
415 .textright{text-align:right;}
415 .important{color:#f02025; background-color:inherit; font-weight:bold;}
416 .important{color:#f02025; background-color:inherit; font-weight:bold;}
416
417
417 #content .author {color:#888; font-style:italic;}
418 #content .author {color:#888; font-style:italic;}
418
419
419 .box{
420 .box{
420 margin:0 0 20px 0;
421 margin:0 0 20px 0;
421 padding:10px;
422 padding:10px;
422 border:1px solid #c0c0c0;
423 border:1px solid #c0c0c0;
423 background-color:#fafbfc;
424 background-color:#fafbfc;
424 color:#505050;
425 color:#505050;
425 line-height:1.5em;
426 line-height:1.5em;
426 }
427 }
427
428
428 a.close-icon {
429 a.close-icon {
429 display:block;
430 display:block;
430 margin-top:3px;
431 margin-top:3px;
431 overflow:hidden;
432 overflow:hidden;
432 width:12px;
433 width:12px;
433 height:12px;
434 height:12px;
434 background-repeat: no-repeat;
435 background-repeat: no-repeat;
435 cursor:pointer;
436 cursor:pointer;
436 background-image:url('../images/close.png');
437 background-image:url('../images/close.png');
437 }
438 }
438
439
439 a.close-icon:hover {
440 a.close-icon:hover {
440 background-image:url('../images/close_hl.png');
441 background-image:url('../images/close_hl.png');
441 }
442 }
442
443
443 .rightbox{
444 .rightbox{
444 background: #fafbfc;
445 background: #fafbfc;
445 border: 1px solid #c0c0c0;
446 border: 1px solid #c0c0c0;
446 float: right;
447 float: right;
447 padding: 8px;
448 padding: 8px;
448 position: relative;
449 position: relative;
449 margin: 0 5px 5px;
450 margin: 0 5px 5px;
450 }
451 }
451
452
452 div.attachments {padding-left: 6px; border-left: 2px solid #ccc; margin-bottom: 8px;}
453 div.attachments {padding-left: 6px; border-left: 2px solid #ccc; margin-bottom: 8px;}
453 div.attachments p {margin-bottom:2px;}
454 div.attachments p {margin-bottom:2px;}
454
455
455 .overlay{
456 .overlay{
456 position: absolute;
457 position: absolute;
457 margin-left:0;
458 margin-left:0;
458 z-index: 50;
459 z-index: 50;
459 }
460 }
460
461
461 .layout-active {
462 .layout-active {
462 background: #ECF3E1;
463 background: #ECF3E1;
463 }
464 }
464
465
465 .block-receiver {
466 .block-receiver {
466 border:1px dashed #c0c0c0;
467 border:1px dashed #c0c0c0;
467 margin-bottom: 20px;
468 margin-bottom: 20px;
468 padding: 15px 0 15px 0;
469 padding: 15px 0 15px 0;
469 }
470 }
470
471
471 .mypage-box {
472 .mypage-box {
472 margin:0 0 20px 0;
473 margin:0 0 20px 0;
473 color:#505050;
474 color:#505050;
474 line-height:1.5em;
475 line-height:1.5em;
475 }
476 }
476
477
477 .handle {
478 .handle {
478 cursor: move;
479 cursor: move;
479 }
480 }
480
481
481 .login {
482 .login {
482 width: 50%;
483 width: 50%;
483 text-align: left;
484 text-align: left;
484 }
485 }
485
486
486 img.calendar-trigger {
487 img.calendar-trigger {
487 cursor: pointer;
488 cursor: pointer;
488 vertical-align: middle;
489 vertical-align: middle;
489 margin-left: 4px;
490 margin-left: 4px;
490 }
491 }
491
492
492 #history p {
493 #history p {
493 margin-left: 34px;
494 margin-left: 34px;
494 }
495 }
495
496
496 .progress {
497 .progress {
497 border: 1px solid #D7D7D7;
498 border: 1px solid #D7D7D7;
498 border-collapse: collapse;
499 border-collapse: collapse;
499 border-spacing: 0pt;
500 border-spacing: 0pt;
500 empty-cells: show;
501 empty-cells: show;
501 padding: 3px;
502 padding: 3px;
502 width: 40em;
503 width: 40em;
503 text-align: center;
504 text-align: center;
504 }
505 }
505
506
506 .progress td { height: 1em; }
507 .progress td { height: 1em; }
507 .progress .closed { background: #BAE0BA none repeat scroll 0%; }
508 .progress .closed { background: #BAE0BA none repeat scroll 0%; }
508 .progress .open { background: #FFF none repeat scroll 0%; }
509 .progress .open { background: #FFF none repeat scroll 0%; }
509
510
510 /***** Contextual links div *****/
511 /***** Contextual links div *****/
511 .contextual {
512 .contextual {
512 float: right;
513 float: right;
513 font-size: 0.8em;
514 font-size: 0.8em;
514 line-height: 16px;
515 line-height: 16px;
515 padding: 2px;
516 padding: 2px;
516 }
517 }
517
518
518 .contextual select, .contextual input {
519 .contextual select, .contextual input {
519 font-size: 1em;
520 font-size: 1em;
520 }
521 }
521
522
522 /***** Gantt chart *****/
523 /***** Gantt chart *****/
523 .gantt_hdr {
524 .gantt_hdr {
524 position:absolute;
525 position:absolute;
525 top:0;
526 top:0;
526 height:16px;
527 height:16px;
527 border-top: 1px solid #c0c0c0;
528 border-top: 1px solid #c0c0c0;
528 border-bottom: 1px solid #c0c0c0;
529 border-bottom: 1px solid #c0c0c0;
529 border-right: 1px solid #c0c0c0;
530 border-right: 1px solid #c0c0c0;
530 text-align: center;
531 text-align: center;
531 overflow: hidden;
532 overflow: hidden;
532 }
533 }
533
534
534 .task {
535 .task {
535 position: absolute;
536 position: absolute;
536 height:8px;
537 height:8px;
537 font-size:0.8em;
538 font-size:0.8em;
538 color:#888;
539 color:#888;
539 padding:0;
540 padding:0;
540 margin:0;
541 margin:0;
541 line-height:0.8em;
542 line-height:0.8em;
542 }
543 }
543
544
544 .task_late { background:#f66 url(../images/task_late.png); border: 1px solid #f66; }
545 .task_late { background:#f66 url(../images/task_late.png); border: 1px solid #f66; }
545 .task_done { background:#66f url(../images/task_done.png); border: 1px solid #66f; }
546 .task_done { background:#66f url(../images/task_done.png); border: 1px solid #66f; }
546 .task_todo { background:#aaa url(../images/task_todo.png); border: 1px solid #aaa; }
547 .task_todo { background:#aaa url(../images/task_todo.png); border: 1px solid #aaa; }
547 .milestone { background-image:url(../images/milestone.png); background-repeat: no-repeat; border: 0; }
548 .milestone { background-image:url(../images/milestone.png); background-repeat: no-repeat; border: 0; }
548
549
549 /***** project list *****/
550 /***** project list *****/
550 dl.projects dt { font-size: 120%; margin-top:1.2em; padding: 2px 2px 4px 2px; background-color:#fafbfc; }
551 dl.projects dt { font-size: 120%; margin-top:1.2em; padding: 2px 2px 4px 2px; background-color:#fafbfc; }
551
552
552 /***** Tooltips ******/
553 /***** Tooltips ******/
553 .tooltip{position:relative;z-index:24;}
554 .tooltip{position:relative;z-index:24;}
554 .tooltip:hover{z-index:25;color:#000;}
555 .tooltip:hover{z-index:25;color:#000;}
555 .tooltip span.tip{display: none; text-align:left;}
556 .tooltip span.tip{display: none; text-align:left;}
556
557
557 div.tooltip:hover span.tip{
558 div.tooltip:hover span.tip{
558 display:block;
559 display:block;
559 position:absolute;
560 position:absolute;
560 top:12px; left:24px; width:270px;
561 top:12px; left:24px; width:270px;
561 border:1px solid #555;
562 border:1px solid #555;
562 background-color:#fff;
563 background-color:#fff;
563 padding: 4px;
564 padding: 4px;
564 font-size: 0.8em;
565 font-size: 0.8em;
565 color:#505050;
566 color:#505050;
566 }
567 }
567
568
568 /***** CSS FORM ******/
569 /***** CSS FORM ******/
569 .tabular p{
570 .tabular p{
570 margin: 0;
571 margin: 0;
571 padding: 5px 0 8px 0;
572 padding: 5px 0 8px 0;
572 padding-left: 180px; /*width of left column containing the label elements*/
573 padding-left: 180px; /*width of left column containing the label elements*/
573 height: 1%;
574 height: 1%;
574 clear:both;
575 clear:both;
575 }
576 }
576
577
577 .tabular label{
578 .tabular label{
578 font-weight: bold;
579 font-weight: bold;
579 float: left;
580 float: left;
580 margin-left: -180px; /*width of left column*/
581 margin-left: -180px; /*width of left column*/
581 margin-bottom: 10px;
582 margin-bottom: 10px;
582 width: 175px; /*width of labels. Should be smaller than left column to create some right
583 width: 175px; /*width of labels. Should be smaller than left column to create some right
583 margin*/
584 margin*/
584 }
585 }
585
586
586 .error {
587 .error {
587 color: #cc0000;
588 color: #cc0000;
588 }
589 }
589
590
590 #settings .tabular p{ padding-left: 300px; }
591 #settings .tabular p{ padding-left: 300px; }
591 #settings .tabular label{ margin-left: -300px; width: 295px; }
592 #settings .tabular label{ margin-left: -300px; width: 295px; }
592
593
593 /*.threepxfix class below:
594 /*.threepxfix class below:
594 Targets IE6- ONLY. Adds 3 pixel indent for multi-line form contents.
595 Targets IE6- ONLY. Adds 3 pixel indent for multi-line form contents.
595 to account for 3 pixel bug: http://www.positioniseverything.net/explorer/threepxtest.html
596 to account for 3 pixel bug: http://www.positioniseverything.net/explorer/threepxtest.html
596 */
597 */
597
598
598 * html .threepxfix{
599 * html .threepxfix{
599 margin-left: 3px;
600 margin-left: 3px;
600 }
601 }
601
602
602 /***** Wiki sections ****/
603 /***** Wiki sections ****/
603 #content div.wiki { font-size: 110%}
604 #content div.wiki { font-size: 110%}
604
605
605 #content div.wiki h2, div.wiki h3 { font-family: Trebuchet MS,Georgia,"Times New Roman",serif; color:#606060; }
606 #content div.wiki h2, div.wiki h3 { font-family: Trebuchet MS,Georgia,"Times New Roman",serif; color:#606060; }
606 #content div.wiki h2 { font-size: 1.4em;}
607 #content div.wiki h2 { font-size: 1.4em;}
607 #content div.wiki h3 { font-size: 1.2em;}
608 #content div.wiki h3 { font-size: 1.2em;}
608
609
609 div.wiki table {
610 div.wiki table {
610 border: 1px solid #505050;
611 border: 1px solid #505050;
611 border-collapse: collapse;
612 border-collapse: collapse;
612 }
613 }
613
614
614 div.wiki table, div.wiki td, div.wiki th {
615 div.wiki table, div.wiki td, div.wiki th {
615 border: 1px solid #bbb;
616 border: 1px solid #bbb;
616 padding: 4px;
617 padding: 4px;
617 }
618 }
618
619
619 div.wiki a {
620 div.wiki a {
620 background-position: 0% 60%;
621 background-position: 0% 60%;
621 background-repeat: no-repeat;
622 background-repeat: no-repeat;
622 padding-left: 12px;
623 padding-left: 12px;
623 background-image: url(../images/external.png);
624 background-image: url(../images/external.png);
624 }
625 }
625
626
626 div.wiki a.wiki-page, div.wiki a.issue, div.wiki a.changeset, div.wiki a.email, div.wiki div.toc a {
627 div.wiki a.wiki-page, div.wiki a.issue, div.wiki a.changeset, div.wiki a.email, div.wiki div.toc a {
627 padding-left: 0;
628 padding-left: 0;
628 background-image: none;
629 background-image: none;
629 }
630 }
630
631
631 div.wiki a.new {
632 div.wiki a.new {
632 color: #b73535;
633 color: #b73535;
633 }
634 }
634
635
635 div.wiki code {
636 div.wiki code {
636 font-size: 1.2em;
637 font-size: 1.2em;
637 }
638 }
638
639
639 div.wiki img {
640 div.wiki img {
640 margin: 6px;
641 margin: 6px;
641 }
642 }
642
643
643 div.wiki pre {
644 div.wiki pre {
644 margin: 1em 1em 1em 1.6em;
645 margin: 1em 1em 1em 1.6em;
645 padding: 2px;
646 padding: 2px;
646 background-color: #fafafa;
647 background-color: #fafafa;
647 border: 1px solid #dadada;
648 border: 1px solid #dadada;
648 }
649 }
649
650
650 div.wiki div.toc {
651 div.wiki div.toc {
651 background-color: #fdfed0;
652 background-color: #fdfed0;
652 border: 1px solid #dadada;
653 border: 1px solid #dadada;
653 padding: 4px;
654 padding: 4px;
654 line-height: 1.1em;
655 line-height: 1.1em;
655 margin-bottom: 12px;
656 margin-bottom: 12px;
656 float: left;
657 float: left;
657 margin-right: 12px;
658 margin-right: 12px;
658 }
659 }
659
660
660 div.wiki div.toc.right {
661 div.wiki div.toc.right {
661 float: right;
662 float: right;
662 margin-left: 12px;
663 margin-left: 12px;
663 margin-right: 0;
664 margin-right: 0;
664 }
665 }
665
666
666 div.wiki div.toc a {
667 div.wiki div.toc a {
667 display: block;
668 display: block;
668 font-size: 0.9em;
669 font-size: 0.9em;
669 font-weight: normal;
670 font-weight: normal;
670 color: #606060;
671 color: #606060;
671 }
672 }
672
673
673 div.wiki div.toc a.heading2 { margin-left: 6px; }
674 div.wiki div.toc a.heading2 { margin-left: 6px; }
674 div.wiki div.toc a.heading3 { margin-left: 12px; font-size: 0.8em; }
675 div.wiki div.toc a.heading3 { margin-left: 12px; font-size: 0.8em; }
675
676
676 div.wiki
677 div.wiki
677
678
678 .diff_out{
679 .diff_out{
679 background: #fcc;
680 background: #fcc;
680 }
681 }
681
682
682 .diff_in{
683 .diff_in{
683 background: #cfc;
684 background: #cfc;
684 }
685 }
685
686
686 #preview .preview { background: #fafbfc url(../images/draft.png); }
687 #preview .preview { background: #fafbfc url(../images/draft.png); }
687
688
688 #ajax-indicator {
689 #ajax-indicator {
689 position: absolute; /* fixed not supported by IE */
690 position: absolute; /* fixed not supported by IE */
690 background-color:#eee;
691 background-color:#eee;
691 border: 1px solid #bbb;
692 border: 1px solid #bbb;
692 top:35%;
693 top:35%;
693 left:40%;
694 left:40%;
694 width:20%;
695 width:20%;
695 font-weight:bold;
696 font-weight:bold;
696 text-align:center;
697 text-align:center;
697 padding:0.6em;
698 padding:0.6em;
698 z-index:100;
699 z-index:100;
699 filter:alpha(opacity=50);
700 filter:alpha(opacity=50);
700 -moz-opacity:0.5;
701 -moz-opacity:0.5;
701 opacity: 0.5;
702 opacity: 0.5;
702 -khtml-opacity: 0.5;
703 -khtml-opacity: 0.5;
703 }
704 }
704
705
705 html>body #ajax-indicator { position: fixed; }
706 html>body #ajax-indicator { position: fixed; }
706
707
707 #ajax-indicator span {
708 #ajax-indicator span {
708 background-position: 0% 40%;
709 background-position: 0% 40%;
709 background-repeat: no-repeat;
710 background-repeat: no-repeat;
710 background-image: url(../images/loading.gif);
711 background-image: url(../images/loading.gif);
711 padding-left: 26px;
712 padding-left: 26px;
712 vertical-align: bottom;
713 vertical-align: bottom;
713 }
714 }
714
715
715 /***** Flash & error messages ****/
716 /***** Flash & error messages ****/
716 #flash div, #errorExplanation {
717 #flash div, #errorExplanation {
717 padding: 4px 4px 4px 30px;
718 padding: 4px 4px 4px 30px;
718 margin-bottom: 16px;
719 margin-bottom: 16px;
719 font-size: 1.1em;
720 font-size: 1.1em;
720 border: 2px solid;
721 border: 2px solid;
721 }
722 }
722
723
723 #flash div.error, #errorExplanation {
724 #flash div.error, #errorExplanation {
724 background: url(../images/false.png) 8px 5px no-repeat;
725 background: url(../images/false.png) 8px 5px no-repeat;
725 background-color: #ffe3e3;
726 background-color: #ffe3e3;
726 border-color: #dd0000;
727 border-color: #dd0000;
727 color: #550000;
728 color: #550000;
728 }
729 }
729
730
730 #flash div.notice {
731 #flash div.notice {
731 background: url(../images/true.png) 8px 5px no-repeat;
732 background: url(../images/true.png) 8px 5px no-repeat;
732 background-color: #dfffdf;
733 background-color: #dfffdf;
733 border-color: #9fcf9f;
734 border-color: #9fcf9f;
734 color: #005f00;
735 color: #005f00;
735 }
736 }
736
737
737 #errorExplanation ul { margin-bottom: 0px; }
738 #errorExplanation ul { margin-bottom: 0px; }
738 #errorExplanation ul li { list-style: none; margin-left: -16px;}
739 #errorExplanation ul li { list-style: none; margin-left: -16px;}
General Comments 0
You need to be logged in to leave comments. Login now