##// END OF EJS Templates
Tab left/right buttons for project menu (#20632)....
Jean-Philippe Lang -
r14685:2ec87100a91f
parent child
Show More
@@ -1,26 +1,21
1 1 <div class="tabs">
2 2 <ul>
3 3 <% tabs.each do |tab| -%>
4 4 <li><%= link_to l(tab[:label]), { :tab => tab[:name] },
5 5 :id => "tab-#{tab[:name]}",
6 6 :class => (tab[:name] != selected_tab ? nil : 'selected'),
7 7 :onclick => "showTab('#{tab[:name]}', this.href); this.blur(); return false;" %></li>
8 8 <% end -%>
9 9 </ul>
10 10 <div class="tabs-buttons" style="display:none;">
11 11 <button class="tab-left" type="button" onclick="moveTabLeft(this);"></button>
12 12 <button class="tab-right" type="button" onclick="moveTabRight(this);"></button>
13 13 </div>
14 14 </div>
15 15
16 <script>
17 $(document).ready(displayTabsButtons);
18 $(window).resize(displayTabsButtons);
19 </script>
20
21 16 <% tabs.each do |tab| -%>
22 17 <%= content_tag('div', render(:partial => tab[:partial], :locals => {:tab => tab} ),
23 18 :id => "tab-content-#{tab[:name]}",
24 19 :style => (tab[:name] != selected_tab ? 'display:none' : nil),
25 20 :class => 'tab-content') %>
26 21 <% end -%>
@@ -1,123 +1,127
1 1 <!DOCTYPE html>
2 2 <html lang="<%= current_language %>">
3 3 <head>
4 4 <meta charset="utf-8" />
5 5 <meta http-equiv="X-UA-Compatible" content="IE=edge"/>
6 6 <title><%= html_title %></title>
7 7 <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
8 8 <meta name="description" content="<%= Redmine::Info.app_name %>" />
9 9 <meta name="keywords" content="issue,bug,tracker" />
10 10 <%= csrf_meta_tag %>
11 11 <%= favicon %>
12 12 <%= stylesheet_link_tag 'jquery/jquery-ui-1.11.0', 'application', 'responsive', :media => 'all' %>
13 13 <%= stylesheet_link_tag 'rtl', :media => 'all' if l(:direction) == 'rtl' %>
14 14 <%= javascript_heads %>
15 15 <%= heads_for_theme %>
16 16 <%= call_hook :view_layouts_base_html_head %>
17 17 <!-- page specific tags -->
18 18 <%= yield :header_tags -%>
19 19 </head>
20 20 <body class="<%= body_css_classes %>">
21 21 <div id="wrapper">
22 22
23 23 <div class="flyout-menu js-flyout-menu">
24 24
25 25
26 26 <% if User.current.logged? || !Setting.login_required? %>
27 27 <div class="flyout-menu__search">
28 28 <%= form_tag({:controller => 'search', :action => 'index', :id => @project}, :method => :get ) do %>
29 29 <%= hidden_field_tag(controller.default_search_scope, 1, :id => nil) if controller.default_search_scope %>
30 30 <%= label_tag 'flyout-search', '&#9906;'.html_safe, :class => 'search-magnifier search-magnifier--flyout' %>
31 31 <%= text_field_tag 'q', @question, :id => 'flyout-search', :class => 'small js-search-input', :placeholder => l(:label_search) %>
32 32 <% end %>
33 33 </div>
34 34 <% end %>
35 35
36 36 <% if User.current.logged? %>
37 37 <div class="flyout-menu__avatar <% if !Setting.gravatar_enabled? %>flyout-menu__avatar--no-avatar<% end %>">
38 38 <% if Setting.gravatar_enabled? %>
39 39 <%= link_to(avatar(User.current, :size => "80"), user_path(User.current)) %>
40 40 <% end %>
41 41 <%= link_to_user(User.current, :format => :username) %>
42 42 </div>
43 43 <% end %>
44 44
45 45 <% if display_main_menu?(@project) %>
46 46 <h3><%= l(:label_project) %></h3>
47 47 <span class="js-project-menu"></span>
48 48 <% end %>
49 49
50 50 <h3><%= l(:label_general) %></h3>
51 51 <span class="js-general-menu"></span>
52 52
53 53 <span class="js-sidebar flyout-menu__sidebar"></span>
54 54
55 55 <h3><%= l(:label_profile) %></h3>
56 56 <span class="js-profile-menu"></span>
57 57
58 58 </div>
59 59
60 60 <div id="wrapper2">
61 61 <div id="wrapper3">
62 62 <div id="top-menu">
63 63 <div id="account">
64 64 <%= render_menu :account_menu -%>
65 65 </div>
66 66 <%= content_tag('div', "#{l(:label_logged_as)} #{link_to_user(User.current, :format => :username)}".html_safe, :id => 'loggedas') if User.current.logged? %>
67 67 <%= render_menu :top_menu if User.current.logged? || !Setting.login_required? -%>
68 68 </div>
69 69
70 70 <div id="header">
71 71
72 72 <a href="#" class="mobile-toggle-button js-flyout-menu-toggle-button"></a>
73 73
74 74 <% if User.current.logged? || !Setting.login_required? %>
75 75 <div id="quick-search">
76 76 <%= form_tag({:controller => 'search', :action => 'index', :id => @project}, :method => :get ) do %>
77 77 <%= hidden_field_tag(controller.default_search_scope, 1, :id => nil) if controller.default_search_scope %>
78 78 <label for='q'>
79 79 <%= link_to l(:label_search), {:controller => 'search', :action => 'index', :id => @project}, :accesskey => accesskey(:search) %>:
80 80 </label>
81 81 <%= text_field_tag 'q', @question, :size => 20, :class => 'small', :accesskey => accesskey(:quick_search) %>
82 82 <% end %>
83 83 <%= render_project_jump_box %>
84 84 </div>
85 85 <% end %>
86 86
87 87 <h1><%= page_header_title %></h1>
88 88
89 89 <% if display_main_menu?(@project) %>
90 <div id="main-menu">
90 <div id="main-menu" class="tabs">
91 91 <%= render_main_menu(@project) %>
92 <div class="tabs-buttons" style="display:none;">
93 <button class="tab-left" onclick="moveTabLeft(this); return false;"></button>
94 <button class="tab-right" onclick="moveTabRight(this); return false;"></button>
95 </div>
92 96 </div>
93 97 <% end %>
94 98 </div>
95 99
96 100 <div id="main" class="<%= sidebar_content? ? '' : 'nosidebar' %>">
97 101 <div id="sidebar">
98 102 <%= yield :sidebar %>
99 103 <%= view_layouts_base_sidebar_hook_response %>
100 104 </div>
101 105
102 106 <div id="content">
103 107 <%= render_flash_messages %>
104 108 <%= yield %>
105 109 <%= call_hook :view_layouts_base_content %>
106 110 <div style="clear:both;"></div>
107 111 </div>
108 112 </div>
109 113 </div>
110 114
111 115 <div id="ajax-indicator" style="display:none;"><span><%= l(:label_loading) %></span></div>
112 116 <div id="ajax-modal" style="display:none;"></div>
113 117
114 118 <div id="footer">
115 119 <div class="bgl"><div class="bgr">
116 120 Powered by <%= link_to Redmine::Info.app_name, Redmine::Info.url %> &copy; 2006-2015 Jean-Philippe Lang
117 121 </div></div>
118 122 </div>
119 123 </div>
120 124 </div>
121 125 <%= call_hook :view_layouts_base_body_bottom %>
122 126 </body>
123 127 </html>
@@ -1,454 +1,454
1 1 # Redmine - project management software
2 2 # Copyright (C) 2006-2015 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 Redmine
19 19 module MenuManager
20 20 class MenuError < StandardError #:nodoc:
21 21 end
22 22
23 23 module MenuController
24 24 def self.included(base)
25 25 base.extend(ClassMethods)
26 26 end
27 27
28 28 module ClassMethods
29 29 @@menu_items = Hash.new {|hash, key| hash[key] = {:default => key, :actions => {}}}
30 30 mattr_accessor :menu_items
31 31
32 32 # Set the menu item name for a controller or specific actions
33 33 # Examples:
34 34 # * menu_item :tickets # => sets the menu name to :tickets for the whole controller
35 35 # * menu_item :tickets, :only => :list # => sets the menu name to :tickets for the 'list' action only
36 36 # * menu_item :tickets, :only => [:list, :show] # => sets the menu name to :tickets for 2 actions only
37 37 #
38 38 # The default menu item name for a controller is controller_name by default
39 39 # Eg. the default menu item name for ProjectsController is :projects
40 40 def menu_item(id, options = {})
41 41 if actions = options[:only]
42 42 actions = [] << actions unless actions.is_a?(Array)
43 43 actions.each {|a| menu_items[controller_name.to_sym][:actions][a.to_sym] = id}
44 44 else
45 45 menu_items[controller_name.to_sym][:default] = id
46 46 end
47 47 end
48 48 end
49 49
50 50 def menu_items
51 51 self.class.menu_items
52 52 end
53 53
54 54 # Returns the menu item name according to the current action
55 55 def current_menu_item
56 56 @current_menu_item ||= menu_items[controller_name.to_sym][:actions][action_name.to_sym] ||
57 57 menu_items[controller_name.to_sym][:default]
58 58 end
59 59
60 60 # Redirects user to the menu item of the given project
61 61 # Returns false if user is not authorized
62 62 def redirect_to_project_menu_item(project, name)
63 63 item = Redmine::MenuManager.items(:project_menu).detect {|i| i.name.to_s == name.to_s}
64 64 if item && item.allowed?(User.current, project)
65 65 redirect_to({item.param => project}.merge(item.url))
66 66 return true
67 67 end
68 68 false
69 69 end
70 70 end
71 71
72 72 module MenuHelper
73 73 # Returns the current menu item name
74 74 def current_menu_item
75 75 controller.current_menu_item
76 76 end
77 77
78 78 # Renders the application main menu
79 79 def render_main_menu(project)
80 80 render_menu((project && !project.new_record?) ? :project_menu : :application_menu, project)
81 81 end
82 82
83 83 def display_main_menu?(project)
84 84 menu_name = project && !project.new_record? ? :project_menu : :application_menu
85 85 Redmine::MenuManager.items(menu_name).children.present?
86 86 end
87 87
88 88 def render_menu(menu, project=nil)
89 89 links = []
90 90 menu_items_for(menu, project) do |node|
91 91 links << render_menu_node(node, project)
92 92 end
93 links.empty? ? nil : content_tag('ul', links.join("\n").html_safe)
93 links.empty? ? nil : content_tag('ul', links.join.html_safe)
94 94 end
95 95
96 96 def render_menu_node(node, project=nil)
97 97 if node.children.present? || !node.child_menus.nil?
98 98 return render_menu_node_with_children(node, project)
99 99 else
100 100 caption, url, selected = extract_node_details(node, project)
101 101 return content_tag('li',
102 102 render_single_menu_node(node, caption, url, selected))
103 103 end
104 104 end
105 105
106 106 def render_menu_node_with_children(node, project=nil)
107 107 caption, url, selected = extract_node_details(node, project)
108 108
109 109 html = [].tap do |html|
110 110 html << '<li>'
111 111 # Parent
112 112 html << render_single_menu_node(node, caption, url, selected)
113 113
114 114 # Standard children
115 115 standard_children_list = "".html_safe.tap do |child_html|
116 116 node.children.each do |child|
117 117 child_html << render_menu_node(child, project)
118 118 end
119 119 end
120 120
121 121 html << content_tag(:ul, standard_children_list, :class => 'menu-children') unless standard_children_list.empty?
122 122
123 123 # Unattached children
124 124 unattached_children_list = render_unattached_children_menu(node, project)
125 125 html << content_tag(:ul, unattached_children_list, :class => 'menu-children unattached') unless unattached_children_list.blank?
126 126
127 127 html << '</li>'
128 128 end
129 129 return html.join("\n").html_safe
130 130 end
131 131
132 132 # Returns a list of unattached children menu items
133 133 def render_unattached_children_menu(node, project)
134 134 return nil unless node.child_menus
135 135
136 136 "".html_safe.tap do |child_html|
137 137 unattached_children = node.child_menus.call(project)
138 138 # Tree nodes support #each so we need to do object detection
139 139 if unattached_children.is_a? Array
140 140 unattached_children.each do |child|
141 141 child_html << content_tag(:li, render_unattached_menu_item(child, project))
142 142 end
143 143 else
144 144 raise MenuError, ":child_menus must be an array of MenuItems"
145 145 end
146 146 end
147 147 end
148 148
149 149 def render_single_menu_node(item, caption, url, selected)
150 150 link_to(h(caption), url, item.html_options(:selected => selected))
151 151 end
152 152
153 153 def render_unattached_menu_item(menu_item, project)
154 154 raise MenuError, ":child_menus must be an array of MenuItems" unless menu_item.is_a? MenuItem
155 155
156 156 if menu_item.allowed?(User.current, project)
157 157 link_to(menu_item.caption, menu_item.url, menu_item.html_options)
158 158 end
159 159 end
160 160
161 161 def menu_items_for(menu, project=nil)
162 162 items = []
163 163 Redmine::MenuManager.items(menu).root.children.each do |node|
164 164 if node.allowed?(User.current, project)
165 165 if block_given?
166 166 yield node
167 167 else
168 168 items << node # TODO: not used?
169 169 end
170 170 end
171 171 end
172 172 return block_given? ? nil : items
173 173 end
174 174
175 175 def extract_node_details(node, project=nil)
176 176 item = node
177 177 url = case item.url
178 178 when Hash
179 179 project.nil? ? item.url : {item.param => project}.merge(item.url)
180 180 when Symbol
181 181 if project
182 182 send(item.url, project)
183 183 else
184 184 send(item.url)
185 185 end
186 186 else
187 187 item.url
188 188 end
189 189 caption = item.caption(project)
190 190 return [caption, url, (current_menu_item == item.name)]
191 191 end
192 192
193 193 # See MenuItem#allowed?
194 194 def allowed_node?(node, user, project)
195 195 node.allowed?(user, project)
196 196 end
197 197 end
198 198
199 199 class << self
200 200 def map(menu_name)
201 201 @items ||= {}
202 202 mapper = Mapper.new(menu_name.to_sym, @items)
203 203 if block_given?
204 204 yield mapper
205 205 else
206 206 mapper
207 207 end
208 208 end
209 209
210 210 def items(menu_name)
211 211 @items[menu_name.to_sym] || MenuNode.new(:root, {})
212 212 end
213 213 end
214 214
215 215 class Mapper
216 216 attr_reader :menu, :menu_items
217 217
218 218 def initialize(menu, items)
219 219 items[menu] ||= MenuNode.new(:root, {})
220 220 @menu = menu
221 221 @menu_items = items[menu]
222 222 end
223 223
224 224 # Adds an item at the end of the menu. Available options:
225 225 # * param: the parameter name that is used for the project id (default is :id)
226 226 # * if: a Proc that is called before rendering the item, the item is displayed only if it returns true
227 227 # * caption that can be:
228 228 # * a localized string Symbol
229 229 # * a String
230 230 # * a Proc that can take the project as argument
231 231 # * before, after: specify where the menu item should be inserted (eg. :after => :activity)
232 232 # * parent: menu item will be added as a child of another named menu (eg. :parent => :issues)
233 233 # * children: a Proc that is called before rendering the item. The Proc should return an array of MenuItems, which will be added as children to this item.
234 234 # eg. :children => Proc.new {|project| [Redmine::MenuManager::MenuItem.new(...)] }
235 235 # * last: menu item will stay at the end (eg. :last => true)
236 236 # * html_options: a hash of html options that are passed to link_to
237 237 def push(name, url, options={})
238 238 options = options.dup
239 239
240 240 if options[:parent]
241 241 subtree = self.find(options[:parent])
242 242 if subtree
243 243 target_root = subtree
244 244 else
245 245 target_root = @menu_items.root
246 246 end
247 247
248 248 else
249 249 target_root = @menu_items.root
250 250 end
251 251
252 252 # menu item position
253 253 if first = options.delete(:first)
254 254 target_root.prepend(MenuItem.new(name, url, options))
255 255 elsif before = options.delete(:before)
256 256
257 257 if exists?(before)
258 258 target_root.add_at(MenuItem.new(name, url, options), position_of(before))
259 259 else
260 260 target_root.add(MenuItem.new(name, url, options))
261 261 end
262 262
263 263 elsif after = options.delete(:after)
264 264
265 265 if exists?(after)
266 266 target_root.add_at(MenuItem.new(name, url, options), position_of(after) + 1)
267 267 else
268 268 target_root.add(MenuItem.new(name, url, options))
269 269 end
270 270
271 271 elsif options[:last] # don't delete, needs to be stored
272 272 target_root.add_last(MenuItem.new(name, url, options))
273 273 else
274 274 target_root.add(MenuItem.new(name, url, options))
275 275 end
276 276 end
277 277
278 278 # Removes a menu item
279 279 def delete(name)
280 280 if found = self.find(name)
281 281 @menu_items.remove!(found)
282 282 end
283 283 end
284 284
285 285 # Checks if a menu item exists
286 286 def exists?(name)
287 287 @menu_items.any? {|node| node.name == name}
288 288 end
289 289
290 290 def find(name)
291 291 @menu_items.find {|node| node.name == name}
292 292 end
293 293
294 294 def position_of(name)
295 295 @menu_items.each do |node|
296 296 if node.name == name
297 297 return node.position
298 298 end
299 299 end
300 300 end
301 301 end
302 302
303 303 class MenuNode
304 304 include Enumerable
305 305 attr_accessor :parent
306 306 attr_reader :last_items_count, :name
307 307
308 308 def initialize(name, content = nil)
309 309 @name = name
310 310 @children = []
311 311 @last_items_count = 0
312 312 end
313 313
314 314 def children
315 315 if block_given?
316 316 @children.each {|child| yield child}
317 317 else
318 318 @children
319 319 end
320 320 end
321 321
322 322 # Returns the number of descendants + 1
323 323 def size
324 324 @children.inject(1) {|sum, node| sum + node.size}
325 325 end
326 326
327 327 def each &block
328 328 yield self
329 329 children { |child| child.each(&block) }
330 330 end
331 331
332 332 # Adds a child at first position
333 333 def prepend(child)
334 334 add_at(child, 0)
335 335 end
336 336
337 337 # Adds a child at given position
338 338 def add_at(child, position)
339 339 raise "Child already added" if find {|node| node.name == child.name}
340 340
341 341 @children = @children.insert(position, child)
342 342 child.parent = self
343 343 child
344 344 end
345 345
346 346 # Adds a child as last child
347 347 def add_last(child)
348 348 add_at(child, -1)
349 349 @last_items_count += 1
350 350 child
351 351 end
352 352
353 353 # Adds a child
354 354 def add(child)
355 355 position = @children.size - @last_items_count
356 356 add_at(child, position)
357 357 end
358 358 alias :<< :add
359 359
360 360 # Removes a child
361 361 def remove!(child)
362 362 @children.delete(child)
363 363 @last_items_count -= +1 if child && child.last
364 364 child.parent = nil
365 365 child
366 366 end
367 367
368 368 # Returns the position for this node in it's parent
369 369 def position
370 370 self.parent.children.index(self)
371 371 end
372 372
373 373 # Returns the root for this node
374 374 def root
375 375 root = self
376 376 root = root.parent while root.parent
377 377 root
378 378 end
379 379 end
380 380
381 381 class MenuItem < MenuNode
382 382 include Redmine::I18n
383 383 attr_reader :name, :url, :param, :condition, :parent, :child_menus, :last, :permission
384 384
385 385 def initialize(name, url, options={})
386 386 raise ArgumentError, "Invalid option :if for menu item '#{name}'" if options[:if] && !options[:if].respond_to?(:call)
387 387 raise ArgumentError, "Invalid option :html for menu item '#{name}'" if options[:html] && !options[:html].is_a?(Hash)
388 388 raise ArgumentError, "Cannot set the :parent to be the same as this item" if options[:parent] == name.to_sym
389 389 raise ArgumentError, "Invalid option :children for menu item '#{name}'" if options[:children] && !options[:children].respond_to?(:call)
390 390 @name = name
391 391 @url = url
392 392 @condition = options[:if]
393 393 @permission = options[:permission]
394 394 @permission ||= false if options.key?(:permission)
395 395 @param = options[:param] || :id
396 396 @caption = options[:caption]
397 397 @html_options = options[:html] || {}
398 398 # Adds a unique class to each menu item based on its name
399 399 @html_options[:class] = [@html_options[:class], @name.to_s.dasherize].compact.join(' ')
400 400 @parent = options[:parent]
401 401 @child_menus = options[:children]
402 402 @last = options[:last] || false
403 403 super @name.to_sym
404 404 end
405 405
406 406 def caption(project=nil)
407 407 if @caption.is_a?(Proc)
408 408 c = @caption.call(project).to_s
409 409 c = @name.to_s.humanize if c.blank?
410 410 c
411 411 else
412 412 if @caption.nil?
413 413 l_or_humanize(name, :prefix => 'label_')
414 414 else
415 415 @caption.is_a?(Symbol) ? l(@caption) : @caption
416 416 end
417 417 end
418 418 end
419 419
420 420 def html_options(options={})
421 421 if options[:selected]
422 422 o = @html_options.dup
423 423 o[:class] += ' selected'
424 424 o
425 425 else
426 426 @html_options
427 427 end
428 428 end
429 429
430 430 # Checks if a user is allowed to access the menu item by:
431 431 #
432 432 # * Checking the permission or the url target (project only)
433 433 # * Checking the conditions of the item
434 434 def allowed?(user, project)
435 435 if user && project
436 436 if permission
437 437 unless user.allowed_to?(permission, project)
438 438 return false
439 439 end
440 440 elsif permission.nil? && url.is_a?(Hash)
441 441 unless user.allowed_to?(url, project)
442 442 return false
443 443 end
444 444 end
445 445 end
446 446 if condition && !condition.call(project)
447 447 # Condition that doesn't pass
448 448 return false
449 449 end
450 450 return true
451 451 end
452 452 end
453 453 end
454 454 end
@@ -1,679 +1,687
1 1 /* Redmine - project management software
2 2 Copyright (C) 2006-2015 Jean-Philippe Lang */
3 3
4 4 function checkAll(id, checked) {
5 5 $('#'+id).find('input[type=checkbox]:enabled').prop('checked', checked);
6 6 }
7 7
8 8 function toggleCheckboxesBySelector(selector) {
9 9 var all_checked = true;
10 10 $(selector).each(function(index) {
11 11 if (!$(this).is(':checked')) { all_checked = false; }
12 12 });
13 13 $(selector).prop('checked', !all_checked);
14 14 }
15 15
16 16 function showAndScrollTo(id, focus) {
17 17 $('#'+id).show();
18 18 if (focus !== null) {
19 19 $('#'+focus).focus();
20 20 }
21 21 $('html, body').animate({scrollTop: $('#'+id).offset().top}, 100);
22 22 }
23 23
24 24 function toggleRowGroup(el) {
25 25 var tr = $(el).parents('tr').first();
26 26 var n = tr.next();
27 27 tr.toggleClass('open');
28 28 while (n.length && !n.hasClass('group')) {
29 29 n.toggle();
30 30 n = n.next('tr');
31 31 }
32 32 }
33 33
34 34 function collapseAllRowGroups(el) {
35 35 var tbody = $(el).parents('tbody').first();
36 36 tbody.children('tr').each(function(index) {
37 37 if ($(this).hasClass('group')) {
38 38 $(this).removeClass('open');
39 39 } else {
40 40 $(this).hide();
41 41 }
42 42 });
43 43 }
44 44
45 45 function expandAllRowGroups(el) {
46 46 var tbody = $(el).parents('tbody').first();
47 47 tbody.children('tr').each(function(index) {
48 48 if ($(this).hasClass('group')) {
49 49 $(this).addClass('open');
50 50 } else {
51 51 $(this).show();
52 52 }
53 53 });
54 54 }
55 55
56 56 function toggleAllRowGroups(el) {
57 57 var tr = $(el).parents('tr').first();
58 58 if (tr.hasClass('open')) {
59 59 collapseAllRowGroups(el);
60 60 } else {
61 61 expandAllRowGroups(el);
62 62 }
63 63 }
64 64
65 65 function toggleFieldset(el) {
66 66 var fieldset = $(el).parents('fieldset').first();
67 67 fieldset.toggleClass('collapsed');
68 68 fieldset.children('div').toggle();
69 69 }
70 70
71 71 function hideFieldset(el) {
72 72 var fieldset = $(el).parents('fieldset').first();
73 73 fieldset.toggleClass('collapsed');
74 74 fieldset.children('div').hide();
75 75 }
76 76
77 77 // columns selection
78 78 function moveOptions(theSelFrom, theSelTo) {
79 79 $(theSelFrom).find('option:selected').detach().prop("selected", false).appendTo($(theSelTo));
80 80 }
81 81
82 82 function moveOptionUp(theSel) {
83 83 $(theSel).find('option:selected').each(function(){
84 84 $(this).prev(':not(:selected)').detach().insertAfter($(this));
85 85 });
86 86 }
87 87
88 88 function moveOptionTop(theSel) {
89 89 $(theSel).find('option:selected').detach().prependTo($(theSel));
90 90 }
91 91
92 92 function moveOptionDown(theSel) {
93 93 $($(theSel).find('option:selected').get().reverse()).each(function(){
94 94 $(this).next(':not(:selected)').detach().insertBefore($(this));
95 95 });
96 96 }
97 97
98 98 function moveOptionBottom(theSel) {
99 99 $(theSel).find('option:selected').detach().appendTo($(theSel));
100 100 }
101 101
102 102 function initFilters() {
103 103 $('#add_filter_select').change(function() {
104 104 addFilter($(this).val(), '', []);
105 105 });
106 106 $('#filters-table td.field input[type=checkbox]').each(function() {
107 107 toggleFilter($(this).val());
108 108 });
109 109 $('#filters-table').on('click', 'td.field input[type=checkbox]', function() {
110 110 toggleFilter($(this).val());
111 111 });
112 112 $('#filters-table').on('click', '.toggle-multiselect', function() {
113 113 toggleMultiSelect($(this).siblings('select'));
114 114 });
115 115 $('#filters-table').on('keypress', 'input[type=text]', function(e) {
116 116 if (e.keyCode == 13) $(this).closest('form').submit();
117 117 });
118 118 }
119 119
120 120 function addFilter(field, operator, values) {
121 121 var fieldId = field.replace('.', '_');
122 122 var tr = $('#tr_'+fieldId);
123 123 if (tr.length > 0) {
124 124 tr.show();
125 125 } else {
126 126 buildFilterRow(field, operator, values);
127 127 }
128 128 $('#cb_'+fieldId).prop('checked', true);
129 129 toggleFilter(field);
130 130 $('#add_filter_select').val('').find('option').each(function() {
131 131 if ($(this).attr('value') == field) {
132 132 $(this).attr('disabled', true);
133 133 }
134 134 });
135 135 }
136 136
137 137 function buildFilterRow(field, operator, values) {
138 138 var fieldId = field.replace('.', '_');
139 139 var filterTable = $("#filters-table");
140 140 var filterOptions = availableFilters[field];
141 141 if (!filterOptions) return;
142 142 var operators = operatorByType[filterOptions['type']];
143 143 var filterValues = filterOptions['values'];
144 144 var i, select;
145 145
146 146 var tr = $('<tr class="filter">').attr('id', 'tr_'+fieldId).html(
147 147 '<td class="field"><input checked="checked" id="cb_'+fieldId+'" name="f[]" value="'+field+'" type="checkbox"><label for="cb_'+fieldId+'"> '+filterOptions['name']+'</label></td>' +
148 148 '<td class="operator"><select id="operators_'+fieldId+'" name="op['+field+']"></td>' +
149 149 '<td class="values"></td>'
150 150 );
151 151 filterTable.append(tr);
152 152
153 153 select = tr.find('td.operator select');
154 154 for (i = 0; i < operators.length; i++) {
155 155 var option = $('<option>').val(operators[i]).text(operatorLabels[operators[i]]);
156 156 if (operators[i] == operator) { option.attr('selected', true); }
157 157 select.append(option);
158 158 }
159 159 select.change(function(){ toggleOperator(field); });
160 160
161 161 switch (filterOptions['type']) {
162 162 case "list":
163 163 case "list_optional":
164 164 case "list_status":
165 165 case "list_subprojects":
166 166 tr.find('td.values').append(
167 167 '<span style="display:none;"><select class="value" id="values_'+fieldId+'_1" name="v['+field+'][]"></select>' +
168 168 ' <span class="toggle-multiselect">&nbsp;</span></span>'
169 169 );
170 170 select = tr.find('td.values select');
171 171 if (values.length > 1) { select.attr('multiple', true); }
172 172 for (i = 0; i < filterValues.length; i++) {
173 173 var filterValue = filterValues[i];
174 174 var option = $('<option>');
175 175 if ($.isArray(filterValue)) {
176 176 option.val(filterValue[1]).text(filterValue[0]);
177 177 if ($.inArray(filterValue[1], values) > -1) {option.attr('selected', true);}
178 178 } else {
179 179 option.val(filterValue).text(filterValue);
180 180 if ($.inArray(filterValue, values) > -1) {option.attr('selected', true);}
181 181 }
182 182 select.append(option);
183 183 }
184 184 break;
185 185 case "date":
186 186 case "date_past":
187 187 tr.find('td.values').append(
188 188 '<span style="display:none;"><input type="text" name="v['+field+'][]" id="values_'+fieldId+'_1" size="10" class="value date_value" /></span>' +
189 189 ' <span style="display:none;"><input type="text" name="v['+field+'][]" id="values_'+fieldId+'_2" size="10" class="value date_value" /></span>' +
190 190 ' <span style="display:none;"><input type="text" name="v['+field+'][]" id="values_'+fieldId+'" size="3" class="value" /> '+labelDayPlural+'</span>'
191 191 );
192 192 $('#values_'+fieldId+'_1').val(values[0]).datepicker(datepickerOptions);
193 193 $('#values_'+fieldId+'_2').val(values[1]).datepicker(datepickerOptions);
194 194 $('#values_'+fieldId).val(values[0]);
195 195 break;
196 196 case "string":
197 197 case "text":
198 198 tr.find('td.values').append(
199 199 '<span style="display:none;"><input type="text" name="v['+field+'][]" id="values_'+fieldId+'" size="30" class="value" /></span>'
200 200 );
201 201 $('#values_'+fieldId).val(values[0]);
202 202 break;
203 203 case "relation":
204 204 tr.find('td.values').append(
205 205 '<span style="display:none;"><input type="text" name="v['+field+'][]" id="values_'+fieldId+'" size="6" class="value" /></span>' +
206 206 '<span style="display:none;"><select class="value" name="v['+field+'][]" id="values_'+fieldId+'_1"></select></span>'
207 207 );
208 208 $('#values_'+fieldId).val(values[0]);
209 209 select = tr.find('td.values select');
210 210 for (i = 0; i < allProjects.length; i++) {
211 211 var filterValue = allProjects[i];
212 212 var option = $('<option>');
213 213 option.val(filterValue[1]).text(filterValue[0]);
214 214 if (values[0] == filterValue[1]) { option.attr('selected', true); }
215 215 select.append(option);
216 216 }
217 217 break;
218 218 case "integer":
219 219 case "float":
220 220 case "tree":
221 221 tr.find('td.values').append(
222 222 '<span style="display:none;"><input type="text" name="v['+field+'][]" id="values_'+fieldId+'_1" size="6" class="value" /></span>' +
223 223 ' <span style="display:none;"><input type="text" name="v['+field+'][]" id="values_'+fieldId+'_2" size="6" class="value" /></span>'
224 224 );
225 225 $('#values_'+fieldId+'_1').val(values[0]);
226 226 $('#values_'+fieldId+'_2').val(values[1]);
227 227 break;
228 228 }
229 229 }
230 230
231 231 function toggleFilter(field) {
232 232 var fieldId = field.replace('.', '_');
233 233 if ($('#cb_' + fieldId).is(':checked')) {
234 234 $("#operators_" + fieldId).show().removeAttr('disabled');
235 235 toggleOperator(field);
236 236 } else {
237 237 $("#operators_" + fieldId).hide().attr('disabled', true);
238 238 enableValues(field, []);
239 239 }
240 240 }
241 241
242 242 function enableValues(field, indexes) {
243 243 var fieldId = field.replace('.', '_');
244 244 $('#tr_'+fieldId+' td.values .value').each(function(index) {
245 245 if ($.inArray(index, indexes) >= 0) {
246 246 $(this).removeAttr('disabled');
247 247 $(this).parents('span').first().show();
248 248 } else {
249 249 $(this).val('');
250 250 $(this).attr('disabled', true);
251 251 $(this).parents('span').first().hide();
252 252 }
253 253
254 254 if ($(this).hasClass('group')) {
255 255 $(this).addClass('open');
256 256 } else {
257 257 $(this).show();
258 258 }
259 259 });
260 260 }
261 261
262 262 function toggleOperator(field) {
263 263 var fieldId = field.replace('.', '_');
264 264 var operator = $("#operators_" + fieldId);
265 265 switch (operator.val()) {
266 266 case "!*":
267 267 case "*":
268 268 case "t":
269 269 case "ld":
270 270 case "w":
271 271 case "lw":
272 272 case "l2w":
273 273 case "m":
274 274 case "lm":
275 275 case "y":
276 276 case "o":
277 277 case "c":
278 278 case "*o":
279 279 case "!o":
280 280 enableValues(field, []);
281 281 break;
282 282 case "><":
283 283 enableValues(field, [0,1]);
284 284 break;
285 285 case "<t+":
286 286 case ">t+":
287 287 case "><t+":
288 288 case "t+":
289 289 case ">t-":
290 290 case "<t-":
291 291 case "><t-":
292 292 case "t-":
293 293 enableValues(field, [2]);
294 294 break;
295 295 case "=p":
296 296 case "=!p":
297 297 case "!p":
298 298 enableValues(field, [1]);
299 299 break;
300 300 default:
301 301 enableValues(field, [0]);
302 302 break;
303 303 }
304 304 }
305 305
306 306 function toggleMultiSelect(el) {
307 307 if (el.attr('multiple')) {
308 308 el.removeAttr('multiple');
309 309 el.attr('size', 1);
310 310 } else {
311 311 el.attr('multiple', true);
312 312 if (el.children().length > 10)
313 313 el.attr('size', 10);
314 314 else
315 315 el.attr('size', 4);
316 316 }
317 317 }
318 318
319 319 function showTab(name, url) {
320 320 $('#tab-content-' + name).parent().find('.tab-content').hide();
321 321 $('#tab-content-' + name).parent().find('div.tabs a').removeClass('selected');
322 322 $('#tab-content-' + name).show();
323 323 $('#tab-' + name).addClass('selected');
324 324 //replaces current URL with the "href" attribute of the current link
325 325 //(only triggered if supported by browser)
326 326 if ("replaceState" in window.history) {
327 327 window.history.replaceState(null, document.title, url);
328 328 }
329 329 return false;
330 330 }
331 331
332 332 function moveTabRight(el) {
333 333 var lis = $(el).parents('div.tabs').first().find('ul').children();
334 334 var tabsWidth = 0;
335 335 var i = 0;
336 336 lis.each(function() {
337 337 if ($(this).is(':visible')) {
338 338 tabsWidth += $(this).width() + 6;
339 339 }
340 340 });
341 341 if (tabsWidth < $(el).parents('div.tabs').first().width() - 60) { return; }
342 342 while (i<lis.length && !lis.eq(i).is(':visible')) { i++; }
343 343 lis.eq(i).hide();
344 344 }
345 345
346 346 function moveTabLeft(el) {
347 347 var lis = $(el).parents('div.tabs').first().find('ul').children();
348 348 var i = 0;
349 349 while (i < lis.length && !lis.eq(i).is(':visible')) { i++; }
350 350 if (i > 0) {
351 351 lis.eq(i-1).show();
352 352 }
353 353 }
354 354
355 355 function displayTabsButtons() {
356 356 var lis;
357 357 var tabsWidth;
358 358 var el;
359 359 $('div.tabs').each(function() {
360 360 el = $(this);
361 361 lis = el.find('ul').children();
362 362 tabsWidth = 0;
363 363 lis.each(function(){
364 364 if ($(this).is(':visible')) {
365 365 tabsWidth += $(this).width() + 6;
366 366 }
367 367 });
368 368 if ((tabsWidth < el.width() - 60) && (lis.first().is(':visible'))) {
369 369 el.find('div.tabs-buttons').hide();
370 370 } else {
371 371 el.find('div.tabs-buttons').show();
372 372 }
373 373 });
374 374 }
375 375
376 376 function setPredecessorFieldsVisibility() {
377 377 var relationType = $('#relation_relation_type');
378 378 if (relationType.val() == "precedes" || relationType.val() == "follows") {
379 379 $('#predecessor_fields').show();
380 380 } else {
381 381 $('#predecessor_fields').hide();
382 382 }
383 383 }
384 384
385 385 function showModal(id, width, title) {
386 386 var el = $('#'+id).first();
387 387 if (el.length === 0 || el.is(':visible')) {return;}
388 388 if (!title) title = el.find('h3.title').text();
389 389 // moves existing modals behind the transparent background
390 390 $(".modal").zIndex(99);
391 391 el.dialog({
392 392 width: width,
393 393 modal: true,
394 394 resizable: false,
395 395 dialogClass: 'modal',
396 396 title: title
397 397 }).on('dialogclose', function(){
398 398 $(".modal").zIndex(101);
399 399 });
400 400 el.find("input[type=text], input[type=submit]").first().focus();
401 401 }
402 402
403 403 function hideModal(el) {
404 404 var modal;
405 405 if (el) {
406 406 modal = $(el).parents('.ui-dialog-content');
407 407 } else {
408 408 modal = $('#ajax-modal');
409 409 }
410 410 modal.dialog("close");
411 411 }
412 412
413 413 function submitPreview(url, form, target) {
414 414 $.ajax({
415 415 url: url,
416 416 type: 'post',
417 417 data: $('#'+form).serialize(),
418 418 success: function(data){
419 419 $('#'+target).html(data);
420 420 }
421 421 });
422 422 }
423 423
424 424 function collapseScmEntry(id) {
425 425 $('.'+id).each(function() {
426 426 if ($(this).hasClass('open')) {
427 427 collapseScmEntry($(this).attr('id'));
428 428 }
429 429 $(this).hide();
430 430 });
431 431 $('#'+id).removeClass('open');
432 432 }
433 433
434 434 function expandScmEntry(id) {
435 435 $('.'+id).each(function() {
436 436 $(this).show();
437 437 if ($(this).hasClass('loaded') && !$(this).hasClass('collapsed')) {
438 438 expandScmEntry($(this).attr('id'));
439 439 }
440 440 });
441 441 $('#'+id).addClass('open');
442 442 }
443 443
444 444 function scmEntryClick(id, url) {
445 445 var el = $('#'+id);
446 446 if (el.hasClass('open')) {
447 447 collapseScmEntry(id);
448 448 el.addClass('collapsed');
449 449 return false;
450 450 } else if (el.hasClass('loaded')) {
451 451 expandScmEntry(id);
452 452 el.removeClass('collapsed');
453 453 return false;
454 454 }
455 455 if (el.hasClass('loading')) {
456 456 return false;
457 457 }
458 458 el.addClass('loading');
459 459 $.ajax({
460 460 url: url,
461 461 success: function(data) {
462 462 el.after(data);
463 463 el.addClass('open').addClass('loaded').removeClass('loading');
464 464 }
465 465 });
466 466 return true;
467 467 }
468 468
469 469 function randomKey(size) {
470 470 var chars = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz';
471 471 var key = '';
472 472 for (var i = 0; i < size; i++) {
473 473 key += chars.charAt(Math.floor(Math.random() * chars.length));
474 474 }
475 475 return key;
476 476 }
477 477
478 478 function updateIssueFrom(url, el) {
479 479 $('#all_attributes input, #all_attributes textarea, #all_attributes select').each(function(){
480 480 $(this).data('valuebeforeupdate', $(this).val());
481 481 });
482 482 if (el) {
483 483 $("#form_update_triggered_by").val($(el).attr('id'));
484 484 }
485 485 return $.ajax({
486 486 url: url,
487 487 type: 'post',
488 488 data: $('#issue-form').serialize()
489 489 });
490 490 }
491 491
492 492 function replaceIssueFormWith(html){
493 493 var replacement = $(html);
494 494 $('#all_attributes input, #all_attributes textarea, #all_attributes select').each(function(){
495 495 var object_id = $(this).attr('id');
496 496 if (object_id && $(this).data('valuebeforeupdate')!=$(this).val()) {
497 497 replacement.find('#'+object_id).val($(this).val());
498 498 }
499 499 });
500 500 $('#all_attributes').empty();
501 501 $('#all_attributes').prepend(replacement);
502 502 }
503 503
504 504 function updateBulkEditFrom(url) {
505 505 $.ajax({
506 506 url: url,
507 507 type: 'post',
508 508 data: $('#bulk_edit_form').serialize()
509 509 });
510 510 }
511 511
512 512 function observeAutocompleteField(fieldId, url, options) {
513 513 $(document).ready(function() {
514 514 $('#'+fieldId).autocomplete($.extend({
515 515 source: url,
516 516 minLength: 2,
517 517 search: function(){$('#'+fieldId).addClass('ajax-loading');},
518 518 response: function(){$('#'+fieldId).removeClass('ajax-loading');}
519 519 }, options));
520 520 $('#'+fieldId).addClass('autocomplete');
521 521 });
522 522 }
523 523
524 524 function observeSearchfield(fieldId, targetId, url) {
525 525 $('#'+fieldId).each(function() {
526 526 var $this = $(this);
527 527 $this.addClass('autocomplete');
528 528 $this.attr('data-value-was', $this.val());
529 529 var check = function() {
530 530 var val = $this.val();
531 531 if ($this.attr('data-value-was') != val){
532 532 $this.attr('data-value-was', val);
533 533 $.ajax({
534 534 url: url,
535 535 type: 'get',
536 536 data: {q: $this.val()},
537 537 success: function(data){ if(targetId) $('#'+targetId).html(data); },
538 538 beforeSend: function(){ $this.addClass('ajax-loading'); },
539 539 complete: function(){ $this.removeClass('ajax-loading'); }
540 540 });
541 541 }
542 542 };
543 543 var reset = function() {
544 544 if (timer) {
545 545 clearInterval(timer);
546 546 timer = setInterval(check, 300);
547 547 }
548 548 };
549 549 var timer = setInterval(check, 300);
550 550 $this.bind('keyup click mousemove', reset);
551 551 });
552 552 }
553 553
554 554 function beforeShowDatePicker(input, inst) {
555 555 var default_date = null;
556 556 switch ($(input).attr("id")) {
557 557 case "issue_start_date" :
558 558 if ($("#issue_due_date").size() > 0) {
559 559 default_date = $("#issue_due_date").val();
560 560 }
561 561 break;
562 562 case "issue_due_date" :
563 563 if ($("#issue_start_date").size() > 0) {
564 564 var start_date = $("#issue_start_date").val();
565 565 if (start_date != "") {
566 566 start_date = new Date(Date.parse(start_date));
567 567 if (start_date > new Date()) {
568 568 default_date = $("#issue_start_date").val();
569 569 }
570 570 }
571 571 }
572 572 break;
573 573 }
574 574 $(input).datepicker("option", "defaultDate", default_date);
575 575 }
576 576
577 577 function initMyPageSortable(list, url) {
578 578 $('#list-'+list).sortable({
579 579 connectWith: '.block-receiver',
580 580 tolerance: 'pointer',
581 581 update: function(){
582 582 $.ajax({
583 583 url: url,
584 584 type: 'post',
585 585 data: {'blocks': $.map($('#list-'+list).children(), function(el){return $(el).attr('id');})}
586 586 });
587 587 }
588 588 });
589 589 $("#list-top, #list-left, #list-right").disableSelection();
590 590 }
591 591
592 592 var warnLeavingUnsavedMessage;
593 593 function warnLeavingUnsaved(message) {
594 594 warnLeavingUnsavedMessage = message;
595 595 $(document).on('submit', 'form', function(){
596 596 $('textarea').removeData('changed');
597 597 });
598 598 $(document).on('change', 'textarea', function(){
599 599 $(this).data('changed', 'changed');
600 600 });
601 601 window.onbeforeunload = function(){
602 602 var warn = false;
603 603 $('textarea').blur().each(function(){
604 604 if ($(this).data('changed')) {
605 605 warn = true;
606 606 }
607 607 });
608 608 if (warn) {return warnLeavingUnsavedMessage;}
609 609 };
610 610 }
611 611
612 612 function setupAjaxIndicator() {
613 613 $(document).bind('ajaxSend', function(event, xhr, settings) {
614 614 if ($('.ajax-loading').length === 0 && settings.contentType != 'application/octet-stream') {
615 615 $('#ajax-indicator').show();
616 616 }
617 617 });
618 618 $(document).bind('ajaxStop', function() {
619 619 $('#ajax-indicator').hide();
620 620 });
621 621 }
622 622
623 function setupTabs() {
624 if($('.tabs').length > 0) {
625 displayTabsButtons();
626 $(window).resize(displayTabsButtons);
627 }
628 }
629
623 630 function hideOnLoad() {
624 631 $('.hol').hide();
625 632 }
626 633
627 634 function addFormObserversForDoubleSubmit() {
628 635 $('form[method=post]').each(function() {
629 636 if (!$(this).hasClass('multiple-submit')) {
630 637 $(this).submit(function(form_submission) {
631 638 if ($(form_submission.target).attr('data-submitted')) {
632 639 form_submission.preventDefault();
633 640 } else {
634 641 $(form_submission.target).attr('data-submitted', true);
635 642 }
636 643 });
637 644 }
638 645 });
639 646 }
640 647
641 648 function defaultFocus(){
642 649 if (($('#content :focus').length == 0) && (window.location.hash == '')) {
643 650 $('#content input[type=text], #content textarea').first().focus();
644 651 }
645 652 }
646 653
647 654 function blockEventPropagation(event) {
648 655 event.stopPropagation();
649 656 event.preventDefault();
650 657 }
651 658
652 659 function toggleDisabledOnChange() {
653 660 var checked = $(this).is(':checked');
654 661 $($(this).data('disables')).attr('disabled', checked);
655 662 $($(this).data('enables')).attr('disabled', !checked);
656 663 }
657 664 function toggleDisabledInit() {
658 665 $('input[data-disables], input[data-enables]').each(toggleDisabledOnChange);
659 666 }
660 667 $(document).ready(function(){
661 668 $('#content').on('change', 'input[data-disables], input[data-enables]', toggleDisabledOnChange);
662 669 toggleDisabledInit();
663 670 });
664 671
665 672 function keepAnchorOnSignIn(form){
666 673 var hash = decodeURIComponent(self.document.location.hash);
667 674 if (hash) {
668 675 if (hash.indexOf("#") === -1) {
669 676 hash = "#" + hash;
670 677 }
671 678 form.action = form.action + hash;
672 679 }
673 680 return true;
674 681 }
675 682
676 683 $(document).ready(setupAjaxIndicator);
677 684 $(document).ready(hideOnLoad);
678 685 $(document).ready(addFormObserversForDoubleSubmit);
679 686 $(document).ready(defaultFocus);
687 $(document).ready(setupTabs);
@@ -1,1312 +1,1318
1 1 html {overflow-y:scroll;}
2 2 body { font-family: Verdana, sans-serif; font-size: 12px; color:#333; margin: 0; padding: 0; min-width: 900px; }
3 3
4 4 h1, h2, h3, h4 {font-family: "Trebuchet MS", Verdana, sans-serif;padding: 2px 10px 1px 0px;margin: 0 0 10px 0;}
5 5 #content h1, h2, h3, h4 {color: #555;}
6 6 h2, .wiki h1 {font-size: 20px;}
7 7 h3, .wiki h2 {font-size: 16px;}
8 8 h4, .wiki h3 {font-size: 13px;}
9 9 h4 {border-bottom: 1px dotted #bbb;}
10 10 pre, code {font-family: Consolas, Menlo, "Liberation Mono", Courier, monospace;}
11 11
12 12 /***** Layout *****/
13 #wrapper {background: white;}
13 #wrapper {background: white;overflow: hidden;}
14 14
15 15 #top-menu {background: #3E5B76; color: #fff; height:1.8em; font-size: 0.8em; padding: 2px 2px 0px 6px;}
16 16 #top-menu ul {margin: 0; padding: 0;}
17 17 #top-menu li {
18 18 float:left;
19 19 list-style-type:none;
20 20 margin: 0px 0px 0px 0px;
21 21 padding: 0px 0px 0px 0px;
22 22 white-space:nowrap;
23 23 }
24 24 #top-menu a {color: #fff; margin-right: 8px; font-weight: bold;}
25 25 #top-menu #loggedas { float: right; margin-right: 0.5em; color: #fff; }
26 26
27 27 #account {float:right;}
28 28
29 29 #header {min-height:5.3em;margin:0;background-color:#628DB6;color:#f8f8f8; padding: 4px 8px 20px 6px; position:relative;}
30 30 #header a {color:#f8f8f8;}
31 31 #header h1 a.ancestor { font-size: 80%; }
32 32 #quick-search {float:right;}
33 33
34 #main-menu {position: absolute; bottom: 0px; left:6px; margin-right: -500px;}
35 #main-menu ul {margin: 0; padding: 0;}
34 #main-menu {position: absolute; bottom: 0px; left:6px; margin-right: -500px; width: 100%;}
35 #main-menu ul {margin: 0; padding: 0; width: 100%; white-space: nowrap;}
36 36 #main-menu li {
37 float:left;
37 float:none;
38 38 list-style-type:none;
39 39 margin: 0px 2px 0px 0px;
40 40 padding: 0px 0px 0px 0px;
41 41 white-space:nowrap;
42 display:inline-block;
42 43 }
43 44 #main-menu li a {
44 45 display: block;
45 46 color: #fff;
46 47 text-decoration: none;
47 48 font-weight: bold;
48 49 margin: 0;
49 50 padding: 4px 10px 4px 10px;
50 51 }
51 52 #main-menu li a:hover {background:#759FCF; color:#fff;}
52 53 #main-menu li a.selected, #main-menu li a.selected:hover {background:#fff; color:#555;}
54 #main-menu .tabs-buttons {
55 right: 6px;
56 background-color: transparent;
57 border-bottom-color: transparent;
58 }
53 59
54 60 #admin-menu ul {margin: 0; padding: 0;}
55 61 #admin-menu li {margin: 0; padding: 0 0 6px 0; list-style-type:none;}
56 62
57 63 #admin-menu a { background-position: 0% 40%; background-repeat: no-repeat; padding-left: 20px; padding-top: 2px; padding-bottom: 3px;}
58 64 #admin-menu a.projects { background-image: url(../images/projects.png); }
59 65 #admin-menu a.users { background-image: url(../images/user.png); }
60 66 #admin-menu a.groups { background-image: url(../images/group.png); }
61 67 #admin-menu a.roles { background-image: url(../images/database_key.png); }
62 68 #admin-menu a.trackers { background-image: url(../images/ticket.png); }
63 69 #admin-menu a.issue_statuses { background-image: url(../images/ticket_edit.png); }
64 70 #admin-menu a.workflows { background-image: url(../images/ticket_go.png); }
65 71 #admin-menu a.custom_fields { background-image: url(../images/textfield.png); }
66 72 #admin-menu a.enumerations { background-image: url(../images/text_list_bullets.png); }
67 73 #admin-menu a.settings { background-image: url(../images/changeset.png); }
68 74 #admin-menu a.plugins { background-image: url(../images/plugin.png); }
69 75 #admin-menu a.info { background-image: url(../images/help.png); }
70 76 #admin-menu a.server_authentication { background-image: url(../images/server_key.png); }
71 77
72 78 #main {background-color:#EEEEEE;}
73 79
74 80 #sidebar{ float: right; width: 22%; position: relative; z-index: 9; padding: 0; margin: 0;}
75 81 * html #sidebar{ width: 22%; }
76 82 #sidebar h3{ font-size: 14px; margin-top:14px; color: #666; }
77 83 #sidebar hr{ width: 100%; margin: 0 auto; height: 1px; background: #ccc; border: 0; }
78 84 * html #sidebar hr{ width: 95%; position: relative; left: -6px; color: #ccc; }
79 85 #sidebar .contextual { margin-right: 1em; }
80 86 #sidebar ul, ul.flat {margin: 0; padding: 0;}
81 87 #sidebar ul li, ul.flat li {list-style-type:none;margin: 0px 2px 0px 0px; padding: 0px 0px 0px 0px;}
82 88
83 89 #content { width: 75%; background-color: #fff; margin: 0px; border-right: 1px solid #ddd; padding: 6px 10px 10px 10px; z-index: 10; }
84 90 * html #content{ width: 75%; padding-left: 0; margin-top: 0px; padding: 6px 10px 10px 10px;}
85 91 html>body #content { min-height: 600px; }
86 92 * html body #content { height: 600px; } /* IE */
87 93
88 94 #main.nosidebar #sidebar{ display: none; }
89 95 #main.nosidebar #content{ width: auto; border-right: 0; }
90 96
91 97 #footer {clear: both; border-top: 1px solid #bbb; font-size: 0.9em; color: #aaa; padding: 5px; text-align:center; background:#fff;}
92 98
93 99 #login-form table {margin-top:5em; padding:1em; margin-left: auto; margin-right: auto; border: 2px solid #FDBF3B; background-color:#FFEBC1; }
94 100 #login-form table td {padding: 6px;}
95 101 #login-form label {font-weight: bold;}
96 102 #login-form input#username, #login-form input#password { width: 300px; }
97 103
98 104 div.modal { border-radius:5px; background:#fff; z-index:50; padding:4px;}
99 105 div.modal h3.title {display:none;}
100 106 div.modal p.buttons {text-align:right; margin-bottom:0;}
101 107 div.modal .box p {margin: 0.3em 0;}
102 108
103 109 input#openid_url { background: url(../images/openid-bg.gif) no-repeat; background-color: #fff; background-position: 0 50%; padding-left: 18px; }
104 110
105 111 .clear:after{ content: "."; display: block; height: 0; clear: both; visibility: hidden; }
106 112
107 113 .mobile-show {display: none;}
108 114
109 115 /***** Links *****/
110 116 a, a:link, a:visited{ color: #169; text-decoration: none; }
111 117 a:hover, a:active{ color: #c61a1a; text-decoration: underline;}
112 118 a img{ border: 0; }
113 119
114 120 a.issue.closed, a.issue.closed:link, a.issue.closed:visited { color: #999; text-decoration: line-through; }
115 121 a.project.closed, a.project.closed:link, a.project.closed:visited { color: #999; }
116 122 a.user.locked, a.user.locked:link, a.user.locked:visited {color: #999;}
117 123
118 124 #sidebar a.selected {line-height:1.7em; padding:1px 3px 2px 2px; margin-left:-2px; background-color:#9DB9D5; color:#fff; border-radius:2px;}
119 125 #sidebar a.selected:hover {text-decoration:none;}
120 126 #admin-menu a {line-height:1.7em;}
121 127 #admin-menu a.selected {padding-left: 20px !important; background-position: 2px 40%;}
122 128
123 129 a.collapsible {padding-left: 12px; background: url(../images/arrow_expanded.png) no-repeat -3px 40%;}
124 130 a.collapsible.collapsed {background: url(../images/arrow_collapsed.png) no-repeat -5px 40%;}
125 131
126 132 a#toggle-completed-versions {color:#999;}
127 133 /***** Tables *****/
128 134 table.list { border: 1px solid #e4e4e4; border-collapse: collapse; width: 100%; margin-bottom: 4px; }
129 135 table.list th { background-color:#EEEEEE; padding: 4px; white-space:nowrap; }
130 136 table.list td {text-align:center; vertical-align:top; padding-right:10px;}
131 137 table.list td.id { width: 2%; text-align: center;}
132 138 table.list td.name, table.list td.description, table.list td.subject, table.list td.comments, table.list td.roles {text-align: left;}
133 139 table.list td.tick {width:15%}
134 140 table.list td.checkbox { width: 15px; padding: 2px 0 0 0; }
135 141 table.list td.checkbox input {padding:0px;}
136 142 table.list td.buttons { width: 15%; white-space:nowrap; text-align: right; }
137 143 table.list td.buttons a { padding-right: 0.6em; }
138 144 table.list td.buttons img {vertical-align:middle;}
139 145 table.list td.reorder {width:15%; white-space:nowrap; text-align:center; }
140 146 table.list caption { text-align: left; padding: 0.5em 0.5em 0.5em 0; }
141 147
142 148 tr.project td.name a { white-space:nowrap; }
143 149 tr.project.closed, tr.project.archived { color: #aaa; }
144 150 tr.project.closed a, tr.project.archived a { color: #aaa; }
145 151
146 152 tr.project.idnt td.name span {background: url(../images/bullet_arrow_right.png) no-repeat 0 50%; padding-left: 16px;}
147 153 tr.project.idnt-1 td.name {padding-left: 0.5em;}
148 154 tr.project.idnt-2 td.name {padding-left: 2em;}
149 155 tr.project.idnt-3 td.name {padding-left: 3.5em;}
150 156 tr.project.idnt-4 td.name {padding-left: 5em;}
151 157 tr.project.idnt-5 td.name {padding-left: 6.5em;}
152 158 tr.project.idnt-6 td.name {padding-left: 8em;}
153 159 tr.project.idnt-7 td.name {padding-left: 9.5em;}
154 160 tr.project.idnt-8 td.name {padding-left: 11em;}
155 161 tr.project.idnt-9 td.name {padding-left: 12.5em;}
156 162
157 163 tr.issue { text-align: center; white-space: nowrap; }
158 164 tr.issue td.subject, tr.issue td.category, td.assigned_to, tr.issue td.string, tr.issue td.text, tr.issue td.relations, tr.issue td.parent { white-space: normal; }
159 165 tr.issue td.relations { text-align: left; }
160 166 tr.issue td.done_ratio table.progress { margin-left:auto; margin-right: auto;}
161 167 tr.issue td.relations span {white-space: nowrap;}
162 168 table.issues td.description {color:#777; font-size:90%; padding:4px 4px 4px 24px; text-align:left; white-space:normal;}
163 169 table.issues td.description pre {white-space:normal;}
164 170
165 171 tr.issue.idnt td.subject a {background: url(../images/bullet_arrow_right.png) no-repeat 0 50%; padding-left: 16px;}
166 172 tr.issue.idnt-1 td.subject {padding-left: 0.5em;}
167 173 tr.issue.idnt-2 td.subject {padding-left: 2em;}
168 174 tr.issue.idnt-3 td.subject {padding-left: 3.5em;}
169 175 tr.issue.idnt-4 td.subject {padding-left: 5em;}
170 176 tr.issue.idnt-5 td.subject {padding-left: 6.5em;}
171 177 tr.issue.idnt-6 td.subject {padding-left: 8em;}
172 178 tr.issue.idnt-7 td.subject {padding-left: 9.5em;}
173 179 tr.issue.idnt-8 td.subject {padding-left: 11em;}
174 180 tr.issue.idnt-9 td.subject {padding-left: 12.5em;}
175 181
176 182 table.issue-report {table-layout:fixed;}
177 183
178 184 tr.entry { border: 1px solid #f8f8f8; }
179 185 tr.entry td { white-space: nowrap; }
180 186 tr.entry td.filename {width:30%; text-align:left;}
181 187 tr.entry td.filename_no_report {width:70%; text-align:left;}
182 188 tr.entry td.size { text-align: right; font-size: 90%; }
183 189 tr.entry td.revision, tr.entry td.author { text-align: center; }
184 190 tr.entry td.age { text-align: right; }
185 191 tr.entry.file td.filename a { margin-left: 16px; }
186 192 tr.entry.file td.filename_no_report a { margin-left: 16px; }
187 193
188 194 tr span.expander {background-image: url(../images/bullet_toggle_plus.png); padding-left: 8px; margin-left: 0; cursor: pointer;}
189 195 tr.open span.expander {background-image: url(../images/bullet_toggle_minus.png);}
190 196
191 197 tr.changeset { height: 20px }
192 198 tr.changeset ul, ol { margin-top: 0px; margin-bottom: 0px; }
193 199 tr.changeset td.revision_graph { width: 15%; background-color: #fffffb; }
194 200 tr.changeset td.author { text-align: center; width: 15%; white-space:nowrap;}
195 201 tr.changeset td.committed_on { text-align: center; width: 15%; white-space:nowrap;}
196 202
197 203 table.files tbody th {text-align:left;}
198 204 table.files tr.file td.filename { text-align: left; padding-left: 24px; }
199 205 table.files tr.file td.digest { font-size: 80%; }
200 206
201 207 table.members td.roles, table.memberships td.roles { width: 45%; }
202 208
203 209 tr.message { height: 2.6em; }
204 210 tr.message td.subject { padding-left: 20px; }
205 211 tr.message td.created_on { white-space: nowrap; }
206 212 tr.message td.last_message { font-size: 80%; white-space: nowrap; }
207 213 tr.message.locked td.subject { background: url(../images/locked.png) no-repeat 0 1px; }
208 214 tr.message.sticky td.subject { background: url(../images/bullet_go.png) no-repeat 0 1px; font-weight: bold; }
209 215
210 216 tr.version.closed, tr.version.closed a { color: #999; }
211 217 tr.version td.name { padding-left: 20px; }
212 218 tr.version.shared td.name { background: url(../images/link.png) no-repeat 0% 70%; }
213 219 tr.version td.date, tr.version td.status, tr.version td.sharing { text-align: center; white-space:nowrap; }
214 220
215 221 tr.user td {width:13%;white-space: nowrap;}
216 222 td.username, td.firstname, td.lastname, td.email {text-align:left !important;}
217 223 tr.user td.email { width:18%; }
218 224 tr.user.locked, tr.user.registered { color: #aaa; }
219 225 tr.user.locked a, tr.user.registered a { color: #aaa; }
220 226
221 227 table.permissions td.role {color:#999;font-size:90%;font-weight:normal !important;text-align:center;vertical-align:bottom;}
222 228
223 229 tr.wiki-page-version td.updated_on, tr.wiki-page-version td.author {text-align:center;}
224 230
225 231 tr.time-entry { text-align: center; white-space: nowrap; }
226 232 tr.time-entry td.issue, tr.time-entry td.comments, tr.time-entry td.subject, tr.time-entry td.activity { text-align: left; white-space: normal; }
227 233 td.hours { text-align: right; font-weight: bold; padding-right: 0.5em; }
228 234 td.hours .hours-dec { font-size: 0.9em; }
229 235
230 236 table.plugins td { vertical-align: middle; }
231 237 table.plugins td.configure { text-align: right; padding-right: 1em; }
232 238 table.plugins span.name { font-weight: bold; display: block; margin-bottom: 6px; }
233 239 table.plugins span.description { display: block; font-size: 0.9em; }
234 240 table.plugins span.url { display: block; font-size: 0.9em; }
235 241
236 242 tr.group td { padding: 0.8em 0 0.5em 0.3em; border-bottom: 1px solid #ccc; text-align:left; }
237 243 tr.group span.name {font-weight:bold;}
238 244 tr.group span.count {font-weight:bold; position:relative; top:-1px; color:#fff; font-size:10px; background:#9DB9D5; padding:0px 6px 1px 6px; border-radius:3px; margin-left:4px;}
239 245 tr.group span.totals {color: #aaa; font-size: 80%;}
240 246 tr.group span.totals .value {font-weight:bold; color:#777;}
241 247 tr.group a.toggle-all { color: #aaa; font-size: 80%; display:none; float:right; margin-right:4px;}
242 248 tr.group:hover a.toggle-all { display:inline;}
243 249 a.toggle-all:hover {text-decoration:none;}
244 250
245 251 table.list tbody tr:hover { background-color:#ffffdd; }
246 252 table.list tbody tr.group:hover { background-color:inherit; }
247 253 table td {padding:2px;}
248 254 table p {margin:0;}
249 255 .odd {background-color:#f6f7f8;}
250 256 .even {background-color: #fff;}
251 257
252 258 tr.builtin td.name {font-style:italic;}
253 259
254 260 a.sort { padding-right: 16px; background-position: 100% 50%; background-repeat: no-repeat; }
255 261 a.sort.asc { background-image: url(../images/sort_asc.png); }
256 262 a.sort.desc { background-image: url(../images/sort_desc.png); }
257 263
258 264 table.boards a.board, h3.comments { background: url(../images/comment.png) no-repeat 0% 50%; padding-left: 20px; }
259 265 table.boards td.last-message {text-align:left;font-size:80%;}
260 266
261 267 table.messages td.last_message {text-align:left;}
262 268
263 269 #query_form_content {font-size:90%;}
264 270
265 271 .query_sort_criteria_count {
266 272 display: inline-block;
267 273 min-width: 1em;
268 274 }
269 275
270 276 table.query-columns {
271 277 border-collapse: collapse;
272 278 border: 0;
273 279 }
274 280
275 281 table.query-columns td.buttons {
276 282 vertical-align: middle;
277 283 text-align: center;
278 284 }
279 285 table.query-columns td.buttons input[type=button] {width:35px;}
280 286 .query-totals {text-align:right; margin-top:-2.3em;}
281 287 .query-totals>span {margin-left:0.6em;}
282 288 .query-totals .value {font-weight:bold;}
283 289
284 290 td.center {text-align:center;}
285 291
286 292 h3.version { background: url(../images/package.png) no-repeat 0% 50%; padding-left: 20px; }
287 293
288 294 div.issues h3 { background: url(../images/ticket.png) no-repeat 0% 50%; padding-left: 20px; }
289 295 div.members h3 { background: url(../images/group.png) no-repeat 0% 50%; padding-left: 20px; }
290 296 div.news h3 { background: url(../images/news.png) no-repeat 0% 50%; padding-left: 20px; }
291 297 div.projects h3 { background: url(../images/projects.png) no-repeat 0% 50%; padding-left: 20px; }
292 298
293 299 #watchers select {width: 95%; display: block;}
294 300 #watchers a.delete {opacity: 0.4; vertical-align: middle;}
295 301 #watchers a.delete:hover {opacity: 1;}
296 302 #watchers img.gravatar {margin: 0 4px 2px 0;}
297 303
298 304 span#watchers_inputs {overflow:auto; display:block;}
299 305 span.search_for_watchers {display:block;}
300 306 span.search_for_watchers, span.add_attachment {font-size:80%; line-height:2.5em;}
301 307 span.search_for_watchers a, span.add_attachment a {padding-left:16px; background: url(../images/bullet_add.png) no-repeat 0 50%; }
302 308
303 309
304 310 .highlight { background-color: #FCFD8D;}
305 311 .highlight.token-1 { background-color: #faa;}
306 312 .highlight.token-2 { background-color: #afa;}
307 313 .highlight.token-3 { background-color: #aaf;}
308 314
309 315 .box{
310 316 padding:6px;
311 317 margin-bottom: 10px;
312 318 background-color:#f6f6f6;
313 319 color:#505050;
314 320 line-height:1.5em;
315 321 border: 1px solid #e4e4e4;
316 322 word-wrap: break-word;
317 323 border-radius: 3px;
318 324 }
319 325 .pagination .per-page span.selected {
320 326 font-weight: bold;
321 327 }
322 328
323 329 div.square {
324 330 border: 1px solid #999;
325 331 float: left;
326 332 margin: .3em .4em 0 .4em;
327 333 overflow: hidden;
328 334 width: .6em; height: .6em;
329 335 }
330 336 .contextual {float:right; white-space: nowrap; line-height:1.4em;margin-top:5px; padding-left: 10px; font-size:0.9em;}
331 337 .contextual input, .contextual select {font-size:0.9em;}
332 338 .message .contextual { margin-top: 0; }
333 339
334 340 .splitcontent {overflow:auto;}
335 341 .splitcontentleft{float:left; width:49%;}
336 342 .splitcontentright{float:right; width:49%;}
337 343 form {display: inline;}
338 344 input, select {vertical-align: middle; margin-top: 1px; margin-bottom: 1px;}
339 345 fieldset {border: 1px solid #e4e4e4; margin:0;}
340 346 legend {color: #333;}
341 347 hr { width: 100%; height: 1px; background: #ccc; border: 0;}
342 348 blockquote { font-style: italic; border-left: 3px solid #e0e0e0; padding-left: 0.6em; margin-left: 2.4em;}
343 349 blockquote blockquote { margin-left: 0;}
344 350 abbr, span.field-description[title] { border-bottom: 1px dotted #aaa; cursor: help; }
345 351 textarea.wiki-edit {width:99%; resize:vertical;}
346 352 li p {margin-top: 0;}
347 353 div.issue {background:#ffffdd; padding:6px; margin-bottom:6px; border: 1px solid #d7d7d7; border-radius:3px;}
348 354 p.breadcrumb { font-size: 0.9em; margin: 4px 0 4px 0;}
349 355 p.subtitle { font-size: 0.9em; margin: -6px 0 12px 0; font-style: italic; }
350 356 p.footnote { font-size: 0.9em; margin-top: 0px; margin-bottom: 0px; }
351 357 .ltr {direction:ltr !important; unicode-bidi:bidi-override;}
352 358 .rtl {direction:rtl !important; unicode-bidi:bidi-override;}
353 359
354 360 div.issue div.subject div div { padding-left: 16px; }
355 361 div.issue div.subject p {margin: 0; margin-bottom: 0.1em; font-size: 90%; color: #999;}
356 362 div.issue div.subject>div>p { margin-top: 0.5em; }
357 363 div.issue div.subject h3 {margin: 0; margin-bottom: 0.1em;}
358 364 div.issue span.private, div.journal span.private { position:relative; bottom: 2px; text-transform: uppercase; background: #d22; color: #fff; font-weight:bold; padding: 0px 2px 0px 2px; font-size: 60%; margin-right: 2px; border-radius: 2px;}
359 365 div.issue .next-prev-links {color:#999;}
360 366 div.issue .attributes {margin-top: 2em;}
361 367 div.issue .attribute {padding-left:180px; clear:left; min-height: 1.8em;}
362 368 div.issue .attribute .label {width: 170px; margin-left:-180px; font-weight:bold; float:left;}
363 369 div.issue.overdue .due-date .value { color: #c22; }
364 370
365 371 #issue_tree table.issues, #relations table.issues { border: 0; }
366 372 #issue_tree td.checkbox, #relations td.checkbox {display:none;}
367 373 #relations td.buttons {padding:0;}
368 374
369 375 fieldset.collapsible {border-width: 1px 0 0 0;}
370 376 fieldset.collapsible>legend { padding-left: 16px; background: url(../images/arrow_expanded.png) no-repeat 0% 40%; cursor:pointer; }
371 377 fieldset.collapsible.collapsed>legend { background-image: url(../images/arrow_collapsed.png); }
372 378
373 379 fieldset#date-range p { margin: 2px 0 2px 0; }
374 380 fieldset#filters table { border-collapse: collapse; }
375 381 fieldset#filters table td { padding: 0; vertical-align: middle; }
376 382 fieldset#filters tr.filter { height: 2.1em; }
377 383 fieldset#filters td.field { width:230px; }
378 384 fieldset#filters td.operator { width:180px; }
379 385 fieldset#filters td.operator select {max-width:170px;}
380 386 fieldset#filters td.values { white-space:nowrap; }
381 387 fieldset#filters td.values select {min-width:130px;}
382 388 fieldset#filters td.values input {height:1em;}
383 389
384 390 #filters-table {width:60%; float:left;}
385 391 .add-filter {width:35%; float:right; text-align: right; vertical-align: top;}
386 392
387 393 #issue_is_private_wrap {float:right; margin-right:1em;}
388 394 .toggle-multiselect {background: url(../images/bullet_toggle_plus.png) no-repeat 0% 40%; padding-left:8px; margin-left:0; cursor:pointer;}
389 395 .buttons { font-size: 0.9em; margin-bottom: 1.4em; margin-top: 1em; }
390 396
391 397 div#issue-changesets {float:right; width:45%; margin-left: 1em; margin-bottom: 1em; background: #fff; padding-left: 1em; font-size: 90%;}
392 398 div#issue-changesets div.changeset { padding: 4px;}
393 399 div#issue-changesets div.changeset { border-bottom: 1px solid #ddd; }
394 400 div#issue-changesets p { margin-top: 0; margin-bottom: 1em;}
395 401
396 402 .journal ul.details img {margin:0 0 -3px 4px;}
397 403 div.journal {overflow:auto;}
398 404 div.journal.private-notes {border-left:2px solid #d22; padding-left:4px; margin-left:-6px;}
399 405 div.journal ul.details {color:#959595; margin-bottom: 1.5em;}
400 406 div.journal ul.details a {color:#70A7CD;}
401 407 div.journal ul.details a:hover {color:#D14848;}
402 408
403 409 div#activity dl, #search-results { margin-left: 2em; }
404 410 div#activity dd, #search-results dd { margin-bottom: 1em; padding-left: 18px; font-size: 0.9em; }
405 411 div#activity dt, #search-results dt { margin-bottom: 0px; padding-left: 20px; line-height: 18px; background-position: 0 50%; background-repeat: no-repeat; }
406 412 div#activity dt.me .time { border-bottom: 1px solid #999; }
407 413 div#activity dt .time { color: #777; font-size: 80%; }
408 414 div#activity dd .description, #search-results dd .description { font-style: italic; }
409 415 div#activity span.project:after, #search-results span.project:after { content: " -"; }
410 416 div#activity dd span.description, #search-results dd span.description { display:block; color: #808080; }
411 417 div#activity dt.grouped {margin-left:5em;}
412 418 div#activity dd.grouped {margin-left:9em;}
413 419
414 420 #search-results dd { margin-bottom: 1em; padding-left: 20px; margin-left:0px; }
415 421
416 422 div#search-results-counts {float:right;}
417 423 div#search-results-counts ul { margin-top: 0.5em; }
418 424 div#search-results-counts li { list-style-type:none; float: left; margin-left: 1em; }
419 425
420 426 dt.issue { background-image: url(../images/ticket.png); }
421 427 dt.issue-edit { background-image: url(../images/ticket_edit.png); }
422 428 dt.issue-closed { background-image: url(../images/ticket_checked.png); }
423 429 dt.issue-note { background-image: url(../images/ticket_note.png); }
424 430 dt.changeset { background-image: url(../images/changeset.png); }
425 431 dt.news { background-image: url(../images/news.png); }
426 432 dt.message { background-image: url(../images/message.png); }
427 433 dt.reply { background-image: url(../images/comments.png); }
428 434 dt.wiki-page { background-image: url(../images/wiki_edit.png); }
429 435 dt.attachment { background-image: url(../images/attachment.png); }
430 436 dt.document { background-image: url(../images/document.png); }
431 437 dt.project { background-image: url(../images/projects.png); }
432 438 dt.time-entry { background-image: url(../images/time.png); }
433 439
434 440 #search-results dt.issue.closed { background-image: url(../images/ticket_checked.png); }
435 441
436 442 div#roadmap .related-issues { margin-bottom: 1em; }
437 443 div#roadmap .related-issues td.checkbox { display: none; }
438 444 div#roadmap .wiki h1:first-child { display: none; }
439 445 div#roadmap .wiki h1 { font-size: 120%; }
440 446 div#roadmap .wiki h2 { font-size: 110%; }
441 447 body.controller-versions.action-show div#roadmap .related-issues {width:70%;}
442 448
443 449 div#version-summary { float:right; width:28%; margin-left: 16px; margin-bottom: 16px; background-color: #fff; }
444 450 div#version-summary fieldset { margin-bottom: 1em; }
445 451 div#version-summary fieldset.time-tracking table { width:100%; }
446 452 div#version-summary th, div#version-summary td.total-hours { text-align: right; }
447 453
448 454 table#time-report td.hours, table#time-report th.period, table#time-report th.total { text-align: right; padding-right: 0.5em; }
449 455 table#time-report tbody tr.subtotal { font-style: italic; color:#777;}
450 456 table#time-report tbody tr.subtotal td.hours { color:#b0b0b0; }
451 457 table#time-report tbody tr.total { font-weight: bold; background-color:#EEEEEE; border-top:1px solid #e4e4e4;}
452 458 table#time-report .hours-dec { font-size: 0.9em; }
453 459
454 460 div.wiki-page .contextual a {opacity: 0.4}
455 461 div.wiki-page .contextual a:hover {opacity: 1}
456 462
457 463 form .attributes select { width: 60%; }
458 464 input#issue_subject, input#document_title { width: 99%; }
459 465 select#issue_done_ratio { width: 95px; }
460 466
461 467 ul.projects {margin:0; padding-left:1em;}
462 468 ul.projects ul {padding-left:1.6em;}
463 469 ul.projects.root {margin:0; padding:0;}
464 470 ul.projects li {list-style-type:none;}
465 471
466 472 #projects-index ul.projects ul.projects { border-left: 3px solid #e0e0e0; padding-left:1em;}
467 473 #projects-index ul.projects li.root {margin-bottom: 1em;}
468 474 #projects-index ul.projects li.child {margin-top: 1em;}
469 475 #projects-index ul.projects div.root a.project { font-family: "Trebuchet MS", Verdana, sans-serif; font-weight: bold; font-size: 16px; margin: 0 0 10px 0; }
470 476 .my-project { padding-left: 18px; background: url(../images/fav.png) no-repeat 0 50%; }
471 477
472 478 #notified-projects>ul, #tracker_project_ids>ul, #custom_field_project_ids>ul {max-height:250px; overflow-y:auto;}
473 479
474 480 #related-issues li img {vertical-align:middle;}
475 481
476 482 ul.properties {padding:0; font-size: 0.9em; color: #777;}
477 483 ul.properties li {list-style-type:none;}
478 484 ul.properties li span {font-style:italic;}
479 485
480 486 .total-hours { font-size: 110%; font-weight: bold; }
481 487 .total-hours span.hours-int { font-size: 120%; }
482 488
483 489 .autoscroll {overflow-x: auto; padding:1px; margin-bottom: 1.2em;}
484 490 #user_login, #user_firstname, #user_lastname, #user_mail, #my_account_form select, #user_form select, #user_identity_url { width: 90%; }
485 491
486 492 #workflow_copy_form select { width: 200px; }
487 493 table.transitions td.enabled {background: #bfb;}
488 494 #workflow_form table select {font-size:90%; max-width:100px;}
489 495 table.fields_permissions td.readonly {background:#ddd;}
490 496 table.fields_permissions td.required {background:#d88;}
491 497
492 498 select.expandable {vertical-align:top;}
493 499
494 500 textarea#custom_field_possible_values {width: 95%; resize:vertical}
495 501 textarea#custom_field_default_value {width: 95%; resize:vertical}
496 502 .sort-handle {display:inline-block; vertical-align:middle;}
497 503
498 504 input#content_comments {width: 99%}
499 505
500 506 span.pagination {margin-left:3px; color:#888;}
501 507 .pagination ul.pages {
502 508 margin: 0 5px 0 0;
503 509 padding: 0;
504 510 display: inline;
505 511 }
506 512 .pagination ul.pages li {
507 513 display: inline-block;
508 514 padding: 0;
509 515 border: 1px solid #ccc;
510 516 margin-left: -1px;
511 517 line-height: 2em;
512 518 margin-bottom: 1em;
513 519 white-space: nowrap;
514 520 text-align: center;
515 521 }
516 522 .pagination ul.pages li a,
517 523 .pagination ul.pages li span {
518 524 padding: 3px 8px;
519 525 }
520 526 .pagination ul.pages li:first-child {
521 527 border-top-left-radius: 4px;
522 528 border-bottom-left-radius: 4px;
523 529 }
524 530 .pagination ul.pages li:last-child {
525 531 border-top-right-radius: 4px;
526 532 border-bottom-right-radius: 4px;
527 533 }
528 534 .pagination ul.pages li.current {
529 535 color: white;
530 536 background-color: #628DB6;
531 537 border-color: #628DB6;
532 538 }
533 539 .pagination ul.pages li.page:hover {
534 540 background-color: #EEE;
535 541 }
536 542 .pagination ul.pages li.page a:hover,
537 543 .pagination ul.pages li.page a:active {
538 544 color: inherit;
539 545 text-decoration: inherit;
540 546 }
541 547 span.pagination>span {white-space:nowrap;}
542 548
543 549 #search-form fieldset p {margin:0.2em 0;}
544 550
545 551 /***** Tabular forms ******/
546 552 .tabular p{
547 553 margin: 0;
548 554 padding: 3px 0 3px 0;
549 555 padding-left: 180px; /* width of left column containing the label elements */
550 556 min-height: 1.8em;
551 557 clear:left;
552 558 }
553 559
554 560 html>body .tabular p {overflow:hidden;}
555 561
556 562 .tabular input, .tabular select {max-width:95%}
557 563 .tabular textarea {width:95%; resize:vertical;}
558 564
559 565 .tabular label{
560 566 font-weight: bold;
561 567 float: left;
562 568 text-align: right;
563 569 /* width of left column */
564 570 margin-left: -180px;
565 571 /* width of labels. Should be smaller than left column to create some right margin */
566 572 width: 175px;
567 573 }
568 574
569 575 .tabular label.floating{
570 576 font-weight: normal;
571 577 margin-left: 0px;
572 578 text-align: left;
573 579 width: 270px;
574 580 }
575 581
576 582 .tabular label.block{
577 583 font-weight: normal;
578 584 margin-left: 0px !important;
579 585 text-align: left;
580 586 float: none;
581 587 display: block;
582 588 width: auto !important;
583 589 }
584 590
585 591 .tabular label.inline{
586 592 font-weight: normal;
587 593 float:none;
588 594 margin-left: 5px !important;
589 595 width: auto;
590 596 }
591 597
592 598 label.no-css {
593 599 font-weight: inherit;
594 600 float:none;
595 601 text-align:left;
596 602 margin-left:0px;
597 603 width:auto;
598 604 }
599 605 input#time_entry_comments { width: 90%;}
600 606
601 607 #preview fieldset {margin-top: 1em; background: url(../images/draft.png)}
602 608
603 609 .tabular.settings p{ padding-left: 300px; }
604 610 .tabular.settings label{ margin-left: -300px; width: 295px; }
605 611 .tabular.settings textarea { width: 99%; }
606 612
607 613 .settings.enabled_scm table {width:100%}
608 614 .settings.enabled_scm td.scm_name{ font-weight: bold; }
609 615
610 616 fieldset.settings label { display: block; }
611 617 fieldset#notified_events .parent { padding-left: 20px; }
612 618
613 619 span.required {color: #bb0000;}
614 620 .summary {font-style: italic;}
615 621
616 622 .check_box_group {
617 623 display:block;
618 624 width:95%;
619 625 max-height:300px;
620 626 overflow-y:auto;
621 627 padding:2px 4px 4px 2px;
622 628 background:#fff;
623 629 border:1px solid #9EB1C2;
624 630 border-radius:2px
625 631 }
626 632 .check_box_group label {
627 633 font-weight: normal;
628 634 margin-left: 0px !important;
629 635 text-align: left;
630 636 float: none;
631 637 display: block;
632 638 width: auto;
633 639 }
634 640 .check_box_group.bool_cf {border:0; background:inherit;}
635 641 .check_box_group.bool_cf label {display: inline;}
636 642
637 643 #attachments_fields input.description {margin-left:4px; width:340px;}
638 644 #attachments_fields span {display:block; white-space:nowrap;}
639 645 #attachments_fields input.filename {border:0; height:1.8em; width:250px; color:#555; background-color:inherit; background:url(../images/attachment.png) no-repeat 1px 50%; padding-left:18px;}
640 646 #attachments_fields .ajax-waiting input.filename {background:url(../images/hourglass.png) no-repeat 0px 50%;}
641 647 #attachments_fields .ajax-loading input.filename {background:url(../images/loading.gif) no-repeat 0px 50%;}
642 648 #attachments_fields div.ui-progressbar { width: 100px; height:14px; margin: 2px 0 -5px 8px; display: inline-block; }
643 649 a.remove-upload {background: url(../images/delete.png) no-repeat 1px 50%; width:1px; display:inline-block; padding-left:16px;}
644 650 a.remove-upload:hover {text-decoration:none !important;}
645 651
646 652 div.fileover { background-color: lavender; }
647 653
648 654 div.attachments { margin-top: 12px; }
649 655 div.attachments p { margin:4px 0 2px 0; }
650 656 div.attachments img { vertical-align: middle; }
651 657 div.attachments span.author { font-size: 0.9em; color: #888; }
652 658
653 659 div.thumbnails {margin-top:0.6em;}
654 660 div.thumbnails div {background:#fff;border:2px solid #ddd;display:inline-block;margin-right:2px;}
655 661 div.thumbnails img {margin: 3px; vertical-align: middle;}
656 662 #history div.thumbnails {margin-left: 2em;}
657 663
658 664 p.other-formats { text-align: right; font-size:0.9em; color: #666; }
659 665 .other-formats span + span:before { content: "| "; }
660 666
661 667 a.atom { background: url(../images/feed.png) no-repeat 1px 50%; padding: 2px 0px 3px 16px; }
662 668
663 669 em.info {font-style:normal;font-size:90%;color:#888;display:block;}
664 670 em.info.error {padding-left:20px; background:url(../images/exclamation.png) no-repeat 0 50%;}
665 671
666 672 textarea.text_cf {width:95%; resize:vertical;}
667 673 input.string_cf, input.link_cf {width:95%;}
668 674 select.bool_cf {width:auto !important;}
669 675
670 676 #tab-content-modules fieldset p {margin:3px 0 4px 0;}
671 677
672 678 #tab-content-users .splitcontentleft {width: 64%;}
673 679 #tab-content-users .splitcontentright {width: 34%;}
674 680 #tab-content-users fieldset {padding:1em; margin-bottom: 1em;}
675 681 #tab-content-users fieldset legend {font-weight: bold;}
676 682 #tab-content-users fieldset label {display: block;}
677 683 #tab-content-users #principals {max-height: 400px; overflow: auto;}
678 684
679 685 #users_for_watcher {height: 200px; overflow:auto;}
680 686 #users_for_watcher label {display: block;}
681 687
682 688 table.members td.name {padding-left: 20px;}
683 689 table.members td.group, table.members td.groupnonmember, table.members td.groupanonymous {background: url(../images/group.png) no-repeat 0% 1px;}
684 690
685 691 input#principal_search, input#user_search {width:90%}
686 692 .roles-selection label {display:inline-block; width:210px;}
687 693
688 694 input.autocomplete {
689 695 background: #fff url(../images/magnifier.png) no-repeat 2px 50%; padding-left:20px !important;
690 696 border:1px solid #9EB1C2; border-radius:2px; height:1.5em;
691 697 }
692 698 input.autocomplete.ajax-loading {
693 699 background-image: url(../images/loading.gif);
694 700 }
695 701
696 702 .role-visibility {padding-left:2em;}
697 703
698 704 .objects-selection {
699 705 height: 300px;
700 706 overflow: auto;
701 707 margin-bottom: 1em;
702 708 }
703 709
704 710 .objects-selection label {
705 711 display: block;
706 712 }
707 713
708 714 .objects-selection>div {
709 715 column-count: auto;
710 716 column-width: 200px;
711 717 -webkit-column-count: auto;
712 718 -webkit-column-width: 200px;
713 719 -webkit-column-gap : 0.5rem;
714 720 -webkit-column-rule: 1px solid #ccc;
715 721 -moz-column-count: auto;
716 722 -moz-column-width: 200px;
717 723 -moz-column-gap : 0.5rem;
718 724 -moz-column-rule: 1px solid #ccc;
719 725 }
720 726
721 727 /***** Flash & error messages ****/
722 728 #errorExplanation, div.flash, .nodata, .warning, .conflict {
723 729 padding: 4px 4px 4px 30px;
724 730 margin-bottom: 12px;
725 731 font-size: 1.1em;
726 732 border: 2px solid;
727 733 border-radius: 3px;
728 734 }
729 735
730 736 div.flash {margin-top: 8px;}
731 737
732 738 div.flash.error, #errorExplanation {
733 739 background: url(../images/exclamation.png) 8px 50% no-repeat;
734 740 background-color: #ffe3e3;
735 741 border-color: #dd0000;
736 742 color: #880000;
737 743 }
738 744
739 745 div.flash.notice {
740 746 background: url(../images/true.png) 8px 5px no-repeat;
741 747 background-color: #dfffdf;
742 748 border-color: #9fcf9f;
743 749 color: #005f00;
744 750 }
745 751
746 752 div.flash.warning, .conflict {
747 753 background: url(../images/warning.png) 8px 5px no-repeat;
748 754 background-color: #FFEBC1;
749 755 border-color: #FDBF3B;
750 756 color: #A6750C;
751 757 text-align: left;
752 758 }
753 759
754 760 .nodata, .warning {
755 761 text-align: center;
756 762 background-color: #FFEBC1;
757 763 border-color: #FDBF3B;
758 764 color: #A6750C;
759 765 }
760 766
761 767 #errorExplanation ul { font-size: 0.9em;}
762 768 #errorExplanation h2, #errorExplanation p { display: none; }
763 769
764 770 .conflict-details {font-size:80%;}
765 771
766 772 /***** Ajax indicator ******/
767 773 #ajax-indicator {
768 774 position: absolute; /* fixed not supported by IE */
769 775 background-color:#eee;
770 776 border: 1px solid #bbb;
771 777 top:35%;
772 778 left:40%;
773 779 width:20%;
774 780 font-weight:bold;
775 781 text-align:center;
776 782 padding:0.6em;
777 783 z-index:100;
778 784 opacity: 0.5;
779 785 }
780 786
781 787 html>body #ajax-indicator { position: fixed; }
782 788
783 789 #ajax-indicator span {
784 790 background-position: 0% 40%;
785 791 background-repeat: no-repeat;
786 792 background-image: url(../images/loading.gif);
787 793 padding-left: 26px;
788 794 vertical-align: bottom;
789 795 }
790 796
791 797 /***** Calendar *****/
792 798 table.cal {border-collapse: collapse; width: 100%; margin: 0px 0 6px 0;border: 1px solid #d7d7d7;}
793 799 table.cal thead th {width: 14%; background-color:#EEEEEE; padding: 4px; }
794 800 table.cal thead th.week-number {width: auto;}
795 801 table.cal tbody tr {height: 100px;}
796 802 table.cal td {border: 1px solid #d7d7d7; vertical-align: top; font-size: 0.9em;}
797 803 table.cal td.week-number { background-color:#EEEEEE; padding: 4px; border:none; font-size: 1em;}
798 804 table.cal td p.day-num {font-size: 1.1em; text-align:right;}
799 805 table.cal td.odd p.day-num {color: #bbb;}
800 806 table.cal td.today {background:#ffffdd;}
801 807 table.cal td.today p.day-num {font-weight: bold;}
802 808 table.cal .starting a, p.cal.legend .starting {background: url(../images/bullet_go.png) no-repeat -1px -2px; padding-left:16px;}
803 809 table.cal .ending a, p.cal.legend .ending {background: url(../images/bullet_end.png) no-repeat -1px -2px; padding-left:16px;}
804 810 table.cal .starting.ending a, p.cal.legend .starting.ending {background: url(../images/bullet_diamond.png) no-repeat -1px -2px; padding-left:16px;}
805 811 p.cal.legend span {display:block;}
806 812
807 813 /***** Tooltips ******/
808 814 .tooltip{position:relative;z-index:24;}
809 815 .tooltip:hover{z-index:25;color:#000;}
810 816 .tooltip span.tip{display: none; text-align:left;}
811 817
812 818 div.tooltip:hover span.tip{
813 819 display:block;
814 820 position:absolute;
815 821 top:12px; width:270px;
816 822 border:1px solid #555;
817 823 background-color:#fff;
818 824 padding: 4px;
819 825 font-size: 0.8em;
820 826 color:#505050;
821 827 }
822 828
823 829 img.ui-datepicker-trigger {
824 830 cursor: pointer;
825 831 vertical-align: middle;
826 832 margin-left: 4px;
827 833 }
828 834
829 835 /***** Progress bar *****/
830 836 table.progress {
831 837 border-collapse: collapse;
832 838 border-spacing: 0pt;
833 839 empty-cells: show;
834 840 text-align: center;
835 841 float:left;
836 842 margin: 1px 6px 1px 0px;
837 843 }
838 844
839 845 table.progress {width:80px;}
840 846 table.progress td { height: 1em; }
841 847 table.progress td.closed { background: #BAE0BA none repeat scroll 0%; }
842 848 table.progress td.done { background: #D3EDD3 none repeat scroll 0%; }
843 849 table.progress td.todo { background: #eee none repeat scroll 0%; }
844 850 p.percent {font-size: 80%; margin:0;}
845 851 p.progress-info {clear: left; font-size: 80%; margin-top:-4px; color:#777;}
846 852
847 853 .version-overview table.progress {width:40em;}
848 854 .version-overview table.progress td { height: 1.2em; }
849 855
850 856 /***** Tabs *****/
851 857 #content .tabs {height: 2.6em; margin-bottom:1.2em; position:relative; overflow:hidden;}
852 858 #content .tabs ul {margin:0; position:absolute; bottom:0; padding-left:0.5em; width: 2000px; border-bottom: 1px solid #bbbbbb;}
853 859 #content .tabs ul li {
854 860 float:left;
855 861 list-style-type:none;
856 862 white-space:nowrap;
857 863 margin-right:4px;
858 864 background:#fff;
859 865 position:relative;
860 866 margin-bottom:-1px;
861 867 }
862 868 #content .tabs ul li a{
863 869 display:block;
864 870 font-size: 0.9em;
865 871 text-decoration:none;
866 872 line-height:1.3em;
867 873 padding:4px 6px 4px 6px;
868 874 border: 1px solid #ccc;
869 875 border-bottom: 1px solid #bbbbbb;
870 876 background-color: #f6f6f6;
871 877 color:#999;
872 878 font-weight:bold;
873 879 border-top-left-radius:3px;
874 880 border-top-right-radius:3px;
875 881 }
876 882
877 883 #content .tabs ul li a:hover {
878 884 background-color: #ffffdd;
879 885 text-decoration:none;
880 886 }
881 887
882 888 #content .tabs ul li a.selected {
883 889 background-color: #fff;
884 890 border: 1px solid #bbbbbb;
885 891 border-bottom: 1px solid #fff;
886 892 color:#444;
887 893 }
888 894
889 895 #content .tabs ul li a.selected:hover {background-color: #fff;}
890 896
891 897 div.tabs-buttons { position:absolute; right: 0; width: 48px; height: 24px; background: white; bottom: 0; border-bottom: 1px solid #bbbbbb; }
892 898
893 899 button.tab-left, button.tab-right {
894 900 font-size: 0.9em;
895 901 cursor: pointer;
896 902 height:24px;
897 903 border: 1px solid #ccc;
898 904 border-bottom: 1px solid #bbbbbb;
899 905 position:absolute;
900 906 padding:4px;
901 907 width: 20px;
902 908 bottom: -1px;
903 909 }
904 910
905 911 button.tab-left {
906 912 right: 20px;
907 913 background: #eeeeee url(../images/bullet_arrow_left.png) no-repeat 50% 50%;
908 914 border-top-left-radius:3px;
909 915 }
910 916
911 917 button.tab-right {
912 918 right: 0;
913 919 background: #eeeeee url(../images/bullet_arrow_right.png) no-repeat 50% 50%;
914 920 border-top-right-radius:3px;
915 921 }
916 922
917 923 /***** Diff *****/
918 924 .diff_out { background: #fcc; }
919 925 .diff_out span { background: #faa; }
920 926 .diff_in { background: #cfc; }
921 927 .diff_in span { background: #afa; }
922 928
923 929 .text-diff {
924 930 padding: 1em;
925 931 background-color:#f6f6f6;
926 932 color:#505050;
927 933 border: 1px solid #e4e4e4;
928 934 }
929 935
930 936 /***** Wiki *****/
931 937 div.wiki table {
932 938 border-collapse: collapse;
933 939 margin-bottom: 1em;
934 940 }
935 941
936 942 div.wiki table, div.wiki td, div.wiki th {
937 943 border: 1px solid #bbb;
938 944 padding: 4px;
939 945 }
940 946
941 947 div.wiki .noborder, div.wiki .noborder td, div.wiki .noborder th {border:0;}
942 948
943 949 div.wiki .external {
944 950 background-position: 0% 60%;
945 951 background-repeat: no-repeat;
946 952 padding-left: 12px;
947 953 background-image: url(../images/external.png);
948 954 }
949 955
950 956 div.wiki a {word-wrap: break-word;}
951 957 div.wiki a.new {color: #b73535;}
952 958
953 959 div.wiki ul, div.wiki ol {margin-bottom:1em;}
954 960 div.wiki li>ul, div.wiki li>ol {margin-bottom: 0;}
955 961
956 962 div.wiki pre {
957 963 margin: 1em 1em 1em 1.6em;
958 964 padding: 8px;
959 965 background-color: #fafafa;
960 966 border: 1px solid #e2e2e2;
961 967 border-radius: 3px;
962 968 width:auto;
963 969 overflow-x: auto;
964 970 overflow-y: hidden;
965 971 }
966 972
967 973 div.wiki ul.toc {
968 974 background-color: #ffffdd;
969 975 border: 1px solid #e4e4e4;
970 976 padding: 4px;
971 977 line-height: 1.2em;
972 978 margin-bottom: 12px;
973 979 margin-right: 12px;
974 980 margin-left: 0;
975 981 display: table
976 982 }
977 983 * html div.wiki ul.toc { width: 50%; } /* IE6 doesn't autosize div */
978 984
979 985 div.wiki ul.toc.right { float: right; margin-left: 12px; margin-right: 0; width: auto; }
980 986 div.wiki ul.toc.left { float: left; margin-right: 12px; margin-left: 0; width: auto; }
981 987 div.wiki ul.toc ul { margin: 0; padding: 0; }
982 988 div.wiki ul.toc li {list-style-type:none; margin: 0; font-size:12px;}
983 989 div.wiki ul.toc li li {margin-left: 1.5em; font-size:10px;}
984 990 div.wiki ul.toc a {
985 991 font-size: 0.9em;
986 992 font-weight: normal;
987 993 text-decoration: none;
988 994 color: #606060;
989 995 }
990 996 div.wiki ul.toc a:hover { color: #c61a1a; text-decoration: underline;}
991 997
992 998 a.wiki-anchor { display: none; margin-left: 6px; text-decoration: none; }
993 999 a.wiki-anchor:hover { color: #aaa !important; text-decoration: none; }
994 1000 h1:hover a.wiki-anchor, h2:hover a.wiki-anchor, h3:hover a.wiki-anchor { display: inline; color: #ddd; }
995 1001
996 1002 div.wiki img {vertical-align:middle; max-width:100%;}
997 1003
998 1004 /***** My page layout *****/
999 1005 .block-receiver {
1000 1006 border:1px dashed #c0c0c0;
1001 1007 margin-bottom: 20px;
1002 1008 padding: 15px 0 15px 0;
1003 1009 }
1004 1010
1005 1011 .mypage-box {
1006 1012 margin:0 0 20px 0;
1007 1013 color:#505050;
1008 1014 line-height:1.5em;
1009 1015 }
1010 1016
1011 1017 .handle {cursor: move;}
1012 1018
1013 1019 a.close-icon {
1014 1020 display:block;
1015 1021 margin-top:3px;
1016 1022 overflow:hidden;
1017 1023 width:12px;
1018 1024 height:12px;
1019 1025 background-repeat: no-repeat;
1020 1026 cursor:pointer;
1021 1027 background-image:url('../images/close.png');
1022 1028 }
1023 1029 a.close-icon:hover {background-image:url('../images/close_hl.png');}
1024 1030
1025 1031 /***** Gantt chart *****/
1026 1032 .gantt_hdr {
1027 1033 position:absolute;
1028 1034 top:0;
1029 1035 height:16px;
1030 1036 border-top: 1px solid #c0c0c0;
1031 1037 border-bottom: 1px solid #c0c0c0;
1032 1038 border-right: 1px solid #c0c0c0;
1033 1039 text-align: center;
1034 1040 overflow: hidden;
1035 1041 }
1036 1042
1037 1043 .gantt_hdr.nwday {background-color:#f1f1f1; color:#999;}
1038 1044
1039 1045 .gantt_subjects { font-size: 0.8em; }
1040 1046 .gantt_subjects div { line-height:16px;height:16px;overflow:hidden;white-space:nowrap;text-overflow: ellipsis; }
1041 1047
1042 1048 .task {
1043 1049 position: absolute;
1044 1050 height:8px;
1045 1051 font-size:0.8em;
1046 1052 color:#888;
1047 1053 padding:0;
1048 1054 margin:0;
1049 1055 line-height:16px;
1050 1056 white-space:nowrap;
1051 1057 }
1052 1058
1053 1059 .task.label {width:100%;}
1054 1060 .task.label.project, .task.label.version { font-weight: bold; }
1055 1061
1056 1062 .task_late { background:#f66 url(../images/task_late.png); border: 1px solid #f66; }
1057 1063 .task_done { background:#00c600 url(../images/task_done.png); border: 1px solid #00c600; }
1058 1064 .task_todo { background:#aaa url(../images/task_todo.png); border: 1px solid #aaa; }
1059 1065
1060 1066 .task_todo.parent { background: #888; border: 1px solid #888; height: 3px;}
1061 1067 .task_late.parent, .task_done.parent { height: 3px;}
1062 1068 .task.parent.marker.starting { position: absolute; background: url(../images/task_parent_end.png) no-repeat 0 0; width: 8px; height: 16px; margin-left: -4px; left: 0px; top: -1px;}
1063 1069 .task.parent.marker.ending { position: absolute; background: url(../images/task_parent_end.png) no-repeat 0 0; width: 8px; height: 16px; margin-left: -4px; right: 0px; top: -1px;}
1064 1070
1065 1071 .version.task_late { background:#f66 url(../images/milestone_late.png); border: 1px solid #f66; height: 2px; margin-top: 3px;}
1066 1072 .version.task_done { background:#00c600 url(../images/milestone_done.png); border: 1px solid #00c600; height: 2px; margin-top: 3px;}
1067 1073 .version.task_todo { background:#fff url(../images/milestone_todo.png); border: 1px solid #fff; height: 2px; margin-top: 3px;}
1068 1074 .version.marker { background-image:url(../images/version_marker.png); background-repeat: no-repeat; border: 0; margin-left: -4px; margin-top: 1px; }
1069 1075
1070 1076 .project.task_late { background:#f66 url(../images/milestone_late.png); border: 1px solid #f66; height: 2px; margin-top: 3px;}
1071 1077 .project.task_done { background:#00c600 url(../images/milestone_done.png); border: 1px solid #00c600; height: 2px; margin-top: 3px;}
1072 1078 .project.task_todo { background:#fff url(../images/milestone_todo.png); border: 1px solid #fff; height: 2px; margin-top: 3px;}
1073 1079 .project.marker { background-image:url(../images/project_marker.png); background-repeat: no-repeat; border: 0; margin-left: -4px; margin-top: 1px; }
1074 1080
1075 1081 .version-behind-schedule a, .issue-behind-schedule a {color: #f66914;}
1076 1082 .version-overdue a, .issue-overdue a, .project-overdue a {color: #f00;}
1077 1083
1078 1084 /***** Icons *****/
1079 1085 .icon {
1080 1086 background-position: 0% 50%;
1081 1087 background-repeat: no-repeat;
1082 1088 padding-left: 20px;
1083 1089 padding-top: 2px;
1084 1090 padding-bottom: 3px;
1085 1091 }
1086 1092
1087 1093 .icon-add { background-image: url(../images/add.png); }
1088 1094 .icon-edit { background-image: url(../images/edit.png); }
1089 1095 .icon-copy { background-image: url(../images/copy.png); }
1090 1096 .icon-duplicate { background-image: url(../images/duplicate.png); }
1091 1097 .icon-del { background-image: url(../images/delete.png); }
1092 1098 .icon-move { background-image: url(../images/move.png); }
1093 1099 .icon-save { background-image: url(../images/save.png); }
1094 1100 .icon-cancel { background-image: url(../images/cancel.png); }
1095 1101 .icon-multiple { background-image: url(../images/table_multiple.png); }
1096 1102 .icon-folder { background-image: url(../images/folder.png); }
1097 1103 .open .icon-folder { background-image: url(../images/folder_open.png); }
1098 1104 .icon-package { background-image: url(../images/package.png); }
1099 1105 .icon-user { background-image: url(../images/user.png); }
1100 1106 .icon-projects { background-image: url(../images/projects.png); }
1101 1107 .icon-help { background-image: url(../images/help.png); }
1102 1108 .icon-attachment { background-image: url(../images/attachment.png); }
1103 1109 .icon-history { background-image: url(../images/history.png); }
1104 1110 .icon-time { background-image: url(../images/time.png); }
1105 1111 .icon-time-add { background-image: url(../images/time_add.png); }
1106 1112 .icon-stats { background-image: url(../images/stats.png); }
1107 1113 .icon-warning { background-image: url(../images/warning.png); }
1108 1114 .icon-fav { background-image: url(../images/fav.png); }
1109 1115 .icon-fav-off { background-image: url(../images/fav_off.png); }
1110 1116 .icon-reload { background-image: url(../images/reload.png); }
1111 1117 .icon-lock { background-image: url(../images/locked.png); }
1112 1118 .icon-unlock { background-image: url(../images/unlock.png); }
1113 1119 .icon-checked { background-image: url(../images/true.png); }
1114 1120 .icon-details { background-image: url(../images/zoom_in.png); }
1115 1121 .icon-report { background-image: url(../images/report.png); }
1116 1122 .icon-comment { background-image: url(../images/comment.png); }
1117 1123 .icon-summary { background-image: url(../images/lightning.png); }
1118 1124 .icon-server-authentication { background-image: url(../images/server_key.png); }
1119 1125 .icon-issue { background-image: url(../images/ticket.png); }
1120 1126 .icon-zoom-in { background-image: url(../images/zoom_in.png); }
1121 1127 .icon-zoom-out { background-image: url(../images/zoom_out.png); }
1122 1128 .icon-passwd { background-image: url(../images/textfield_key.png); }
1123 1129 .icon-test { background-image: url(../images/bullet_go.png); }
1124 1130 .icon-email-add { background-image: url(../images/email_add.png); }
1125 1131
1126 1132 .icon-file { background-image: url(../images/files/default.png); }
1127 1133 .icon-file.text-plain { background-image: url(../images/files/text.png); }
1128 1134 .icon-file.text-x-c { background-image: url(../images/files/c.png); }
1129 1135 .icon-file.text-x-csharp { background-image: url(../images/files/csharp.png); }
1130 1136 .icon-file.text-x-java { background-image: url(../images/files/java.png); }
1131 1137 .icon-file.text-x-javascript { background-image: url(../images/files/js.png); }
1132 1138 .icon-file.text-x-php { background-image: url(../images/files/php.png); }
1133 1139 .icon-file.text-x-ruby { background-image: url(../images/files/ruby.png); }
1134 1140 .icon-file.text-xml { background-image: url(../images/files/xml.png); }
1135 1141 .icon-file.text-css { background-image: url(../images/files/css.png); }
1136 1142 .icon-file.text-html { background-image: url(../images/files/html.png); }
1137 1143 .icon-file.image-gif { background-image: url(../images/files/image.png); }
1138 1144 .icon-file.image-jpeg { background-image: url(../images/files/image.png); }
1139 1145 .icon-file.image-png { background-image: url(../images/files/image.png); }
1140 1146 .icon-file.image-tiff { background-image: url(../images/files/image.png); }
1141 1147 .icon-file.application-pdf { background-image: url(../images/files/pdf.png); }
1142 1148 .icon-file.application-zip { background-image: url(../images/files/zip.png); }
1143 1149 .icon-file.application-x-gzip { background-image: url(../images/files/zip.png); }
1144 1150
1145 1151 img.gravatar {
1146 1152 padding: 2px;
1147 1153 border: solid 1px #d5d5d5;
1148 1154 background: #fff;
1149 1155 vertical-align: middle;
1150 1156 }
1151 1157
1152 1158 div.issue img.gravatar {
1153 1159 float: left;
1154 1160 margin: 0 6px 0 0;
1155 1161 padding: 5px;
1156 1162 }
1157 1163
1158 1164 div.issue .attributes img.gravatar {
1159 1165 height: 14px;
1160 1166 width: 14px;
1161 1167 padding: 2px;
1162 1168 float: left;
1163 1169 margin: 0 0.5em 0 0;
1164 1170 }
1165 1171
1166 1172 h2 img.gravatar {margin: -2px 4px -4px 0;}
1167 1173 h3 img.gravatar {margin: -4px 4px -4px 0;}
1168 1174 h4 img.gravatar {margin: -6px 4px -4px 0;}
1169 1175 td.username img.gravatar {margin: 0 0.5em 0 0; vertical-align: top;}
1170 1176 #activity dt img.gravatar {float: left; margin: 0 1em 1em 0;}
1171 1177 /* Used on 12px Gravatar img tags without the icon background */
1172 1178 .icon-gravatar {float: left; margin-right: 4px;}
1173 1179
1174 1180 #activity dt, .journal {clear: left;}
1175 1181
1176 1182 .journal-link {float: right;}
1177 1183
1178 1184 h2 img { vertical-align:middle; }
1179 1185
1180 1186 .hascontextmenu { cursor: context-menu; }
1181 1187
1182 1188 .sample-data {border:1px solid #ccc; border-collapse:collapse; background-color:#fff; margin:0.5em;}
1183 1189 .sample-data td {border:1px solid #ccc; padding: 2px 4px; font-family: Consolas, Menlo, "Liberation Mono", Courier, monospace;}
1184 1190 .sample-data tr:first-child td {font-weight:bold; text-align:center;}
1185 1191
1186 1192 .ui-progressbar {position: relative;}
1187 1193 #progress-label {
1188 1194 position: absolute; left: 50%; top: 4px;
1189 1195 font-weight: bold;
1190 1196 color: #555; text-shadow: 1px 1px 0 #fff;
1191 1197 }
1192 1198
1193 1199 /* Custom JQuery styles */
1194 1200 .ui-datepicker-title select {width:70px !important; margin-top:-2px !important; margin-right:4px !important;}
1195 1201
1196 1202
1197 1203 /************* CodeRay styles *************/
1198 1204 .syntaxhl div {display: inline;}
1199 1205 .syntaxhl .code pre { overflow: auto }
1200 1206
1201 1207 .syntaxhl .annotation { color:#007 }
1202 1208 .syntaxhl .attribute-name { color:#b48 }
1203 1209 .syntaxhl .attribute-value { color:#700 }
1204 1210 .syntaxhl .binary { color:#549 }
1205 1211 .syntaxhl .binary .char { color:#325 }
1206 1212 .syntaxhl .binary .delimiter { color:#325 }
1207 1213 .syntaxhl .char { color:#D20 }
1208 1214 .syntaxhl .char .content { color:#D20 }
1209 1215 .syntaxhl .char .delimiter { color:#710 }
1210 1216 .syntaxhl .class { color:#258; font-weight:bold }
1211 1217 .syntaxhl .class-variable { color:#369 }
1212 1218 .syntaxhl .color { color:#0A0 }
1213 1219 .syntaxhl .comment { color:#385 }
1214 1220 .syntaxhl .comment .char { color:#385 }
1215 1221 .syntaxhl .comment .delimiter { color:#385 }
1216 1222 .syntaxhl .constant { color:#258; font-weight:bold }
1217 1223 .syntaxhl .decorator { color:#B0B }
1218 1224 .syntaxhl .definition { color:#099; font-weight:bold }
1219 1225 .syntaxhl .delimiter { color:black }
1220 1226 .syntaxhl .directive { color:#088; font-weight:bold }
1221 1227 .syntaxhl .docstring { color:#D42; }
1222 1228 .syntaxhl .doctype { color:#34b }
1223 1229 .syntaxhl .done { text-decoration: line-through; color: gray }
1224 1230 .syntaxhl .entity { color:#800; font-weight:bold }
1225 1231 .syntaxhl .error { color:#F00; background-color:#FAA }
1226 1232 .syntaxhl .escape { color:#666 }
1227 1233 .syntaxhl .exception { color:#C00; font-weight:bold }
1228 1234 .syntaxhl .float { color:#06D }
1229 1235 .syntaxhl .function { color:#06B; font-weight:bold }
1230 1236 .syntaxhl .function .delimiter { color:#024; font-weight:bold }
1231 1237 .syntaxhl .global-variable { color:#d70 }
1232 1238 .syntaxhl .hex { color:#02b }
1233 1239 .syntaxhl .id { color:#33D; font-weight:bold }
1234 1240 .syntaxhl .include { color:#B44; font-weight:bold }
1235 1241 .syntaxhl .inline { background-color: hsla(0,0%,0%,0.07); color: black }
1236 1242 .syntaxhl .inline-delimiter { font-weight: bold; color: #666 }
1237 1243 .syntaxhl .instance-variable { color:#33B }
1238 1244 .syntaxhl .integer { color:#06D }
1239 1245 .syntaxhl .imaginary { color:#f00 }
1240 1246 .syntaxhl .important { color:#D00 }
1241 1247 .syntaxhl .key { color: #606 }
1242 1248 .syntaxhl .key .char { color: #60f }
1243 1249 .syntaxhl .key .delimiter { color: #404 }
1244 1250 .syntaxhl .keyword { color:#939; font-weight:bold }
1245 1251 .syntaxhl .label { color:#970; font-weight:bold }
1246 1252 .syntaxhl .local-variable { color:#950 }
1247 1253 .syntaxhl .map .content { color:#808 }
1248 1254 .syntaxhl .map .delimiter { color:#40A}
1249 1255 .syntaxhl .map { background-color:hsla(200,100%,50%,0.06); }
1250 1256 .syntaxhl .namespace { color:#707; font-weight:bold }
1251 1257 .syntaxhl .octal { color:#40E }
1252 1258 .syntaxhl .operator { }
1253 1259 .syntaxhl .predefined { color:#369; font-weight:bold }
1254 1260 .syntaxhl .predefined-constant { color:#069 }
1255 1261 .syntaxhl .predefined-type { color:#0a8; font-weight:bold }
1256 1262 .syntaxhl .preprocessor { color:#579 }
1257 1263 .syntaxhl .pseudo-class { color:#00C; font-weight:bold }
1258 1264 .syntaxhl .regexp { background-color:hsla(300,100%,50%,0.06); }
1259 1265 .syntaxhl .regexp .content { color:#808 }
1260 1266 .syntaxhl .regexp .delimiter { color:#404 }
1261 1267 .syntaxhl .regexp .modifier { color:#C2C }
1262 1268 .syntaxhl .reserved { color:#080; font-weight:bold }
1263 1269 .syntaxhl .shell { background-color:hsla(120,100%,50%,0.06); }
1264 1270 .syntaxhl .shell .content { color:#2B2 }
1265 1271 .syntaxhl .shell .delimiter { color:#161 }
1266 1272 .syntaxhl .string .char { color: #46a }
1267 1273 .syntaxhl .string .content { color: #46a }
1268 1274 .syntaxhl .string .delimiter { color: #46a }
1269 1275 .syntaxhl .string .modifier { color: #46a }
1270 1276 .syntaxhl .symbol { color:#d33 }
1271 1277 .syntaxhl .symbol .content { color:#d33 }
1272 1278 .syntaxhl .symbol .delimiter { color:#d33 }
1273 1279 .syntaxhl .tag { color:#070; font-weight:bold }
1274 1280 .syntaxhl .type { color:#339; font-weight:bold }
1275 1281 .syntaxhl .value { color: #088 }
1276 1282 .syntaxhl .variable { color:#037 }
1277 1283
1278 1284 .syntaxhl .insert { background: hsla(120,100%,50%,0.12) }
1279 1285 .syntaxhl .delete { background: hsla(0,100%,50%,0.12) }
1280 1286 .syntaxhl .change { color: #bbf; background: #007 }
1281 1287 .syntaxhl .head { color: #f8f; background: #505 }
1282 1288 .syntaxhl .head .filename { color: white; }
1283 1289
1284 1290 .syntaxhl .delete .eyecatcher { background-color: hsla(0,100%,50%,0.2); border: 1px solid hsla(0,100%,45%,0.5); margin: -1px; border-bottom: none; border-top-left-radius: 5px; border-top-right-radius: 5px; }
1285 1291 .syntaxhl .insert .eyecatcher { background-color: hsla(120,100%,50%,0.2); border: 1px solid hsla(120,100%,25%,0.5); margin: -1px; border-top: none; border-bottom-left-radius: 5px; border-bottom-right-radius: 5px; }
1286 1292
1287 1293 .syntaxhl .insert .insert { color: #0c0; background:transparent; font-weight:bold }
1288 1294 .syntaxhl .delete .delete { color: #c00; background:transparent; font-weight:bold }
1289 1295 .syntaxhl .change .change { color: #88f }
1290 1296 .syntaxhl .head .head { color: #f4f }
1291 1297
1292 1298 /***** Media print specific styles *****/
1293 1299 @media print {
1294 1300 #top-menu, #header, #main-menu, #sidebar, #footer, .contextual, .other-formats { display:none; }
1295 1301 #main { background: #fff; }
1296 1302 #content { width: 99%; margin: 0; padding: 0; border: 0; background: #fff; overflow: visible !important;}
1297 1303 #wiki_add_attachment { display:none; }
1298 1304 .hide-when-print { display: none; }
1299 1305 .autoscroll {overflow-x: visible;}
1300 1306 table.list {margin-top:0.5em;}
1301 1307 table.list th, table.list td {border: 1px solid #aaa;}
1302 1308 }
1303 1309
1304 1310 /* Accessibility specific styles */
1305 1311 .hidden-for-sighted {
1306 1312 position:absolute;
1307 1313 left:-10000px;
1308 1314 top:auto;
1309 1315 width:1px;
1310 1316 height:1px;
1311 1317 overflow:hidden;
1312 1318 }
General Comments 0
You need to be logged in to leave comments. Login now