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