##// END OF EJS Templates
Gravatar support for issue detai, user grid, and activity stream...
Eric Davis -
r1960:ed314caf7d6e
parent child
Show More
@@ -0,0 +1,20
1 Copyright (c) 2007 West Arete Computing, Inc.
2
3 Permission is hereby granted, free of charge, to any person obtaining
4 a copy of this software and associated documentation files (the
5 "Software"), to deal in the Software without restriction, including
6 without limitation the rights to use, copy, modify, merge, publish,
7 distribute, sublicense, and/or sell copies of the Software, and to
8 permit persons to whom the Software is furnished to do so, subject to
9 the following conditions:
10
11 The above copyright notice and this permission notice shall be
12 included in all copies or substantial portions of the Software.
13
14 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15 EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16 MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17 NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18 LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19 OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20 WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. No newline at end of file
@@ -0,0 +1,52
1 == Gravatar Plugin
2
3 This plugin provides a handful of view helpers for displaying gravatars
4 (globally-recognized avatars).
5
6 Gravatars allow users to configure an avatar to go with their email address at
7 a central location: http://gravatar.com. Gravatar-aware websites (such
8 as yours) can then look up and display each user's preferred avatar, without
9 having to handle avatar management. The user gets the benefit of not having to
10 set up an avatar for each site that they post on.
11
12 == Installation
13
14 cd ~/myapp
15 ruby script/plugin install svn://rubyforge.org//var/svn/gravatarplugin/plugins/gravatar
16
17 or, if you're using piston[http://piston.rubyforge.org] (worth it!):
18
19 cd ~/myapp/vendor/plugins
20 piston import svn://rubyforge.org//var/svn/gravatarplugin/plugins/gravatar
21
22 == Example
23
24 If you represent your users with a model that has an +email+ method (typical
25 for most rails authentication setups), then you can simply use this method
26 in your views:
27
28 <%= gravatar_for @user %>
29
30 This will be replaced with the full HTML +img+ tag necessary for displaying
31 that user's gravatar.
32
33 Other helpers are documented under GravatarHelper::PublicMethods.
34
35 == Acknowledgments
36
37 The following people have also written gravatar-related Ruby libraries:
38 * Seth Rasmussen created the gravatar gem[http://gravatar.rubyforge.org]
39 * Matt McCray has also created a gravatar
40 plugin[http://mattmccray.com/svn/rails/plugins/gravatar_helper]
41
42 == Author
43
44 Scott A. Woods
45 West Arete Computing, Inc.
46 http://westarete.com
47 scott at westarete dot com
48
49 == TODO
50
51 * Get full spec coverage
52 * Finish rdoc documentation No newline at end of file
@@ -0,0 +1,33
1 require 'spec/rake/spectask'
2 require 'rake/rdoctask'
3
4 desc 'Default: run all specs'
5 task :default => :spec
6
7 desc 'Run all application-specific specs'
8 Spec::Rake::SpecTask.new(:spec) do |t|
9 t.warning = true
10 t.rcov = true
11 end
12
13 desc "Report code statistics (KLOCs, etc) from the application"
14 task :stats do
15 RAILS_ROOT = File.dirname(__FILE__)
16 STATS_DIRECTORIES = [
17 %w(Libraries lib/),
18 %w(Specs spec/),
19 ].collect { |name, dir| [ name, "#{RAILS_ROOT}/#{dir}" ] }.select { |name, dir| File.directory?(dir) }
20 require 'code_statistics'
21 CodeStatistics.new(*STATS_DIRECTORIES).to_s
22 end
23
24 namespace :doc do
25 desc 'Generate documentation for the assert_request plugin.'
26 Rake::RDocTask.new(:plugin) do |rdoc|
27 rdoc.rdoc_dir = 'rdoc'
28 rdoc.title = 'Gravatar Rails Plugin'
29 rdoc.options << '--line-numbers' << '--inline-source' << '--accessor' << 'cattr_accessor=rw'
30 rdoc.rdoc_files.include('README')
31 rdoc.rdoc_files.include('lib/**/*.rb')
32 end
33 end
@@ -0,0 +1,7
1 author: Scott Woods, West Arete Computing
2 summary: View helpers for displaying gravatars.
3 homepage: http://gravatarplugin.rubyforge.org/
4 plugin: svn://rubyforge.org//var/svn/gravatarplugin/plugins/gravatar
5 license: MIT
6 version: 0.1
7 rails_version: 1.0+
@@ -0,0 +1,2
1 require 'gravatar'
2 ActionView::Base.send :include, GravatarHelper::PublicMethods
@@ -0,0 +1,67
1 require 'digest/md5'
2 require 'cgi'
3
4 module GravatarHelper
5
6 # These are the options that control the default behavior of the public
7 # methods. They can be overridden during the actual call to the helper,
8 # or you can set them in your environment.rb as such:
9 #
10 # # Allow racier gravatars
11 # GravatarHelper::DEFAULT_OPTIONS[:rating] = 'R'
12 #
13 DEFAULT_OPTIONS = {
14 # The URL of a default image to display if the given email address does
15 # not have a gravatar.
16 :default => nil,
17
18 # The default size in pixels for the gravatar image (they're square).
19 :size => 50,
20
21 # The maximum allowed MPAA rating for gravatars. This allows you to
22 # exclude gravatars that may be out of character for your site.
23 :rating => 'PG',
24
25 # The alt text to use in the img tag for the gravatar.
26 :alt => 'avatar',
27
28 # The class to assign to the img tag for the gravatar.
29 :class => 'gravatar',
30 }
31
32 # The methods that will be made available to your views.
33 module PublicMethods
34
35 # Return the HTML img tag for the given user's gravatar. Presumes that
36 # the given user object will respond_to "email", and return the user's
37 # email address.
38 def gravatar_for(user, options={})
39 gravatar(user.email, options)
40 end
41
42 # Return the HTML img tag for the given email address's gravatar.
43 def gravatar(email, options={})
44 src = h(gravatar_url(email, options))
45 options = DEFAULT_OPTIONS.merge(options)
46 [:class, :alt, :size].each { |opt| options[opt] = h(options[opt]) }
47 "<img class=\"#{options[:class]}\" alt=\"#{options[:alt]}\" width=\"#{options[:size]}\" height=\"#{options[:size]}\" src=\"#{src}\" />"
48 end
49
50 # Return the gravatar URL for the given email address.
51 def gravatar_url(email, options={})
52 email_hash = Digest::MD5.hexdigest(email)
53 options = DEFAULT_OPTIONS.merge(options)
54 options[:default] = CGI::escape(options[:default]) unless options[:default].nil?
55 returning "http://www.gravatar.com/avatar.php?gravatar_id=#{email_hash}" do |url|
56 [:rating, :size, :default].each do |opt|
57 unless options[opt].nil?
58 value = h(options[opt])
59 url << "&#{opt}=#{value}"
60 end
61 end
62 end
63 end
64
65 end
66
67 end No newline at end of file
@@ -0,0 +1,37
1 require 'rubygems'
2 require 'erb' # to get "h"
3 require 'active_support' # to get "returning"
4 require File.dirname(__FILE__) + '/../lib/gravatar'
5 include GravatarHelper, GravatarHelper::PublicMethods, ERB::Util
6
7 context "gravatar_url with a custom default URL" do
8 setup do
9 @original_options = DEFAULT_OPTIONS.dup
10 DEFAULT_OPTIONS[:default] = "no_avatar.png"
11 @url = gravatar_url("somewhere")
12 end
13
14 specify "should include the \"default\" argument in the result" do
15 @url.should match(/&default=no_avatar.png/)
16 end
17
18 teardown do
19 DEFAULT_OPTIONS.merge!(@original_options)
20 end
21
22 end
23
24 context "gravatar_url with default settings" do
25 setup do
26 @url = gravatar_url("somewhere")
27 end
28
29 specify "should have a nil default URL" do
30 DEFAULT_OPTIONS[:default].should be_nil
31 end
32
33 specify "should not include the \"default\" argument in the result" do
34 @url.should_not match(/&default=/)
35 end
36
37 end No newline at end of file
@@ -1,14 +1,15
1 <% reply_links = authorize_for('issues', 'edit') -%>
1 <% reply_links = authorize_for('issues', 'edit') -%>
2 <% for journal in journals %>
2 <% for journal in journals %>
3 <div id="change-<%= journal.id %>" class="journal">
3 <div id="change-<%= journal.id %>" class="journal">
4 <%= gravatar(journal.user.mail.blank? ? "" : journal.user.mail, :size => "48") %>
4 <h4><div style="float:right;"><%= link_to "##{journal.indice}", :anchor => "note-#{journal.indice}" %></div>
5 <h4><div style="float:right;"><%= link_to "##{journal.indice}", :anchor => "note-#{journal.indice}" %></div>
5 <%= content_tag('a', '', :name => "note-#{journal.indice}")%>
6 <%= content_tag('a', '', :name => "note-#{journal.indice}")%>
6 <%= format_time(journal.created_on) %> - <%= journal.user.name %></h4>
7 <%= format_time(journal.created_on) %> - <%= journal.user.name %></h4>
7 <ul>
8 <ul>
8 <% for detail in journal.details %>
9 <% for detail in journal.details %>
9 <li><%= show_detail(detail) %></li>
10 <li><%= show_detail(detail) %></li>
10 <% end %>
11 <% end %>
11 </ul>
12 </ul>
12 <%= render_notes(journal, :reply_links => reply_links) unless journal.notes.blank? %>
13 <%= render_notes(journal, :reply_links => reply_links) unless journal.notes.blank? %>
13 </div>
14 </div>
14 <% end %>
15 <% end %>
@@ -1,127 +1,128
1 <div class="contextual">
1 <div class="contextual">
2 <%= link_to_if_authorized(l(:button_update), {:controller => 'issues', :action => 'edit', :id => @issue }, :onclick => 'showAndScrollTo("update", "notes"); return false;', :class => 'icon icon-edit', :accesskey => accesskey(:edit)) %>
2 <%= link_to_if_authorized(l(:button_update), {:controller => 'issues', :action => 'edit', :id => @issue }, :onclick => 'showAndScrollTo("update", "notes"); return false;', :class => 'icon icon-edit', :accesskey => accesskey(:edit)) %>
3 <%= link_to_if_authorized l(:button_log_time), {:controller => 'timelog', :action => 'edit', :issue_id => @issue}, :class => 'icon icon-time' %>
3 <%= link_to_if_authorized l(:button_log_time), {:controller => 'timelog', :action => 'edit', :issue_id => @issue}, :class => 'icon icon-time' %>
4 <%= watcher_tag(@issue, User.current) %>
4 <%= watcher_tag(@issue, User.current) %>
5 <%= link_to_if_authorized l(:button_copy), {:controller => 'issues', :action => 'new', :project_id => @project, :copy_from => @issue }, :class => 'icon icon-copy' %>
5 <%= link_to_if_authorized l(:button_copy), {:controller => 'issues', :action => 'new', :project_id => @project, :copy_from => @issue }, :class => 'icon icon-copy' %>
6 <%= link_to_if_authorized l(:button_move), {:controller => 'issues', :action => 'move', :id => @issue }, :class => 'icon icon-move' %>
6 <%= link_to_if_authorized l(:button_move), {:controller => 'issues', :action => 'move', :id => @issue }, :class => 'icon icon-move' %>
7 <%= link_to_if_authorized l(:button_delete), {:controller => 'issues', :action => 'destroy', :id => @issue}, :confirm => l(:text_are_you_sure), :method => :post, :class => 'icon icon-del' %>
7 <%= link_to_if_authorized l(:button_delete), {:controller => 'issues', :action => 'destroy', :id => @issue}, :confirm => l(:text_are_you_sure), :method => :post, :class => 'icon icon-del' %>
8 </div>
8 </div>
9
9
10 <h2><%= @issue.tracker.name %> #<%= @issue.id %></h2>
10 <h2><%= @issue.tracker.name %> #<%= @issue.id %></h2>
11
11
12 <div class="issue <%= "status-#{@issue.status.position} priority-#{@issue.priority.position}" %>">
12 <div class="issue <%= "status-#{@issue.status.position} priority-#{@issue.priority.position}" %>">
13 <%= gravatar(@issue.author.mail, :size => "64") %>
13 <h3><%=h @issue.subject %></h3>
14 <h3><%=h @issue.subject %></h3>
14 <p class="author">
15 <p class="author">
15 <%= authoring @issue.created_on, @issue.author %>.
16 <%= authoring @issue.created_on, @issue.author %>.
16 <%= l(:label_updated_time, distance_of_time_in_words(Time.now, @issue.updated_on)) + '.' if @issue.created_on != @issue.updated_on %>
17 <%= l(:label_updated_time, distance_of_time_in_words(Time.now, @issue.updated_on)) + '.' if @issue.created_on != @issue.updated_on %>
17 </p>
18 </p>
18
19
19 <table width="100%">
20 <table width="100%">
20 <tr>
21 <tr>
21 <td style="width:15%"><b><%=l(:field_status)%>:</b></td><td style="width:35%"><%= @issue.status.name %></td>
22 <td style="width:15%" class="status"><b><%=l(:field_status)%>:</b></td><td style="width:35%" class="status status-<%= @issue.status.name %>"><%= @issue.status.name %></td>
22 <td style="width:15%"><b><%=l(:field_start_date)%>:</b></td><td style="width:35%"><%= format_date(@issue.start_date) %></td>
23 <td style="width:15%" class="start-date"><b><%=l(:field_start_date)%>:</b></td><td style="width:35%"><%= format_date(@issue.start_date) %></td>
23 </tr>
24 </tr>
24 <tr>
25 <tr>
25 <td><b><%=l(:field_priority)%>:</b></td><td><%= @issue.priority.name %></td>
26 <td class="priority"><b><%=l(:field_priority)%>:</b></td><td class="priority priority-<%= @issue.priority.name %>"><%= @issue.priority.name %></td>
26 <td><b><%=l(:field_due_date)%>:</b></td><td><%= format_date(@issue.due_date) %></td>
27 <td class="due-date"><b><%=l(:field_due_date)%>:</b></td><td class="due-date"><%= format_date(@issue.due_date) %></td>
27 </tr>
28 </tr>
28 <tr>
29 <tr>
29 <td><b><%=l(:field_assigned_to)%>:</b></td><td><%= @issue.assigned_to ? link_to_user(@issue.assigned_to) : "-" %></td>
30 <td class="assigned-to"><b><%=l(:field_assigned_to)%>:</b></td><td><%= gravatar(@issue.assigned_to.mail, :size => "24") %><%= @issue.assigned_to ? link_to_user(@issue.assigned_to) : "-" %></td>
30 <td><b><%=l(:field_done_ratio)%>:</b></td><td><%= progress_bar @issue.done_ratio, :width => '80px', :legend => "#{@issue.done_ratio}%" %></td>
31 <td class="progress"><b><%=l(:field_done_ratio)%>:</b></td><td class="progress"><%= progress_bar @issue.done_ratio, :width => '80px', :legend => "#{@issue.done_ratio}%" %></td>
31 </tr>
32 </tr>
32 <tr>
33 <tr>
33 <td><b><%=l(:field_category)%>:</b></td><td><%=h @issue.category ? @issue.category.name : "-" %></td>
34 <td class="category"><b><%=l(:field_category)%>:</b></td><td><%=h @issue.category ? @issue.category.name : "-" %></td>
34 <% if User.current.allowed_to?(:view_time_entries, @project) %>
35 <% if User.current.allowed_to?(:view_time_entries, @project) %>
35 <td><b><%=l(:label_spent_time)%>:</b></td>
36 <td class="spent-time"><b><%=l(:label_spent_time)%>:</b></td>
36 <td><%= @issue.spent_hours > 0 ? (link_to lwr(:label_f_hour, @issue.spent_hours), {:controller => 'timelog', :action => 'details', :project_id => @project, :issue_id => @issue}, :class => 'icon icon-time') : "-" %></td>
37 <td class="spent-hours"><%= @issue.spent_hours > 0 ? (link_to lwr(:label_f_hour, @issue.spent_hours), {:controller => 'timelog', :action => 'details', :project_id => @project, :issue_id => @issue}, :class => 'icon icon-time') : "-" %></td>
37 <% end %>
38 <% end %>
38 </tr>
39 </tr>
39 <tr>
40 <tr>
40 <td><b><%=l(:field_fixed_version)%>:</b></td><td><%= @issue.fixed_version ? link_to_version(@issue.fixed_version) : "-" %></td>
41 <td class="fixed-version"><b><%=l(:field_fixed_version)%>:</b></td><td><%= @issue.fixed_version ? link_to_version(@issue.fixed_version) : "-" %></td>
41 <% if @issue.estimated_hours %>
42 <% if @issue.estimated_hours %>
42 <td><b><%=l(:field_estimated_hours)%>:</b></td><td><%= lwr(:label_f_hour, @issue.estimated_hours) %></td>
43 <td class="estimated-hours"><b><%=l(:field_estimated_hours)%>:</b></td><td><%= lwr(:label_f_hour, @issue.estimated_hours) %></td>
43 <% end %>
44 <% end %>
44 </tr>
45 </tr>
45 <tr>
46 <tr>
46 <% n = 0 -%>
47 <% n = 0 -%>
47 <% @issue.custom_values.each do |value| -%>
48 <% @issue.custom_values.each do |value| -%>
48 <td valign="top"><b><%=h value.custom_field.name %>:</b></td><td valign="top"><%= simple_format(h(show_value(value))) %></td>
49 <td valign="top"><b><%=h value.custom_field.name %>:</b></td><td valign="top"><%= simple_format(h(show_value(value))) %></td>
49 <% n = n + 1
50 <% n = n + 1
50 if (n > 1)
51 if (n > 1)
51 n = 0 %>
52 n = 0 %>
52 </tr><tr>
53 </tr><tr>
53 <%end
54 <%end
54 end %>
55 end %>
55 </tr>
56 </tr>
56 <%= call_hook(:view_issues_show_details_bottom, :issue => @issue) %>
57 <%= call_hook(:view_issues_show_details_bottom, :issue => @issue) %>
57 </table>
58 </table>
58 <hr />
59 <hr />
59
60
60 <div class="contextual">
61 <div class="contextual">
61 <%= link_to_remote_if_authorized l(:button_quote), { :url => {:action => 'reply', :id => @issue} }, :class => 'icon icon-comment' %>
62 <%= link_to_remote_if_authorized l(:button_quote), { :url => {:action => 'reply', :id => @issue} }, :class => 'icon icon-comment' %>
62 </div>
63 </div>
63
64
64 <p><strong><%=l(:field_description)%></strong></p>
65 <p><strong><%=l(:field_description)%></strong></p>
65 <div class="wiki">
66 <div class="wiki">
66 <%= textilizable @issue, :description, :attachments => @issue.attachments %>
67 <%= textilizable @issue, :description, :attachments => @issue.attachments %>
67 </div>
68 </div>
68
69
69 <% if @issue.attachments.any? %>
70 <% if @issue.attachments.any? %>
70 <%= link_to_attachments @issue.attachments, :delete_url => (authorize_for('issues', 'destroy_attachment') ? {:controller => 'issues', :action => 'destroy_attachment', :id => @issue} : nil) %>
71 <%= link_to_attachments @issue.attachments, :delete_url => (authorize_for('issues', 'destroy_attachment') ? {:controller => 'issues', :action => 'destroy_attachment', :id => @issue} : nil) %>
71 <% end %>
72 <% end %>
72
73
73 <% if authorize_for('issue_relations', 'new') || @issue.relations.any? %>
74 <% if authorize_for('issue_relations', 'new') || @issue.relations.any? %>
74 <hr />
75 <hr />
75 <div id="relations">
76 <div id="relations">
76 <%= render :partial => 'relations' %>
77 <%= render :partial => 'relations' %>
77 </div>
78 </div>
78 <% end %>
79 <% end %>
79
80
80 <% if User.current.allowed_to?(:add_issue_watchers, @project) ||
81 <% if User.current.allowed_to?(:add_issue_watchers, @project) ||
81 (@issue.watchers.any? && User.current.allowed_to?(:view_issue_watchers, @project)) %>
82 (@issue.watchers.any? && User.current.allowed_to?(:view_issue_watchers, @project)) %>
82 <hr />
83 <hr />
83 <div id="watchers">
84 <div id="watchers">
84 <%= render :partial => 'watchers/watchers', :locals => {:watched => @issue} %>
85 <%= render :partial => 'watchers/watchers', :locals => {:watched => @issue} %>
85 </div>
86 </div>
86 <% end %>
87 <% end %>
87
88
88 </div>
89 </div>
89
90
90 <% if @issue.changesets.any? && User.current.allowed_to?(:view_changesets, @project) %>
91 <% if @issue.changesets.any? && User.current.allowed_to?(:view_changesets, @project) %>
91 <div id="issue-changesets">
92 <div id="issue-changesets">
92 <h3><%=l(:label_associated_revisions)%></h3>
93 <h3><%=l(:label_associated_revisions)%></h3>
93 <%= render :partial => 'changesets', :locals => { :changesets => @issue.changesets} %>
94 <%= render :partial => 'changesets', :locals => { :changesets => @issue.changesets} %>
94 </div>
95 </div>
95 <% end %>
96 <% end %>
96
97
97 <% if @journals.any? %>
98 <% if @journals.any? %>
98 <div id="history">
99 <div id="history">
99 <h3><%=l(:label_history)%></h3>
100 <h3><%=l(:label_history)%></h3>
100 <%= render :partial => 'history', :locals => { :journals => @journals } %>
101 <%= render :partial => 'history', :locals => { :journals => @journals } %>
101 </div>
102 </div>
102 <% end %>
103 <% end %>
103 <div style="clear: both;"></div>
104 <div style="clear: both;"></div>
104
105
105 <% if authorize_for('issues', 'edit') %>
106 <% if authorize_for('issues', 'edit') %>
106 <div id="update" style="display:none;">
107 <div id="update" style="display:none;">
107 <h3><%= l(:button_update) %></h3>
108 <h3><%= l(:button_update) %></h3>
108 <%= render :partial => 'edit' %>
109 <%= render :partial => 'edit' %>
109 </div>
110 </div>
110 <% end %>
111 <% end %>
111
112
112 <p class="other-formats">
113 <p class="other-formats">
113 <%= l(:label_export_to) %>
114 <%= l(:label_export_to) %>
114 <span><%= link_to 'Atom', {:format => 'atom', :key => User.current.rss_key}, :class => 'feed' %></span>
115 <span><%= link_to 'Atom', {:format => 'atom', :key => User.current.rss_key}, :class => 'feed' %></span>
115 <span><%= link_to 'PDF', {:format => 'pdf'}, :class => 'pdf' %></span>
116 <span><%= link_to 'PDF', {:format => 'pdf'}, :class => 'pdf' %></span>
116 </p>
117 </p>
117
118
118 <% html_title "#{@issue.tracker.name} ##{@issue.id}: #{@issue.subject}" %>
119 <% html_title "#{@issue.tracker.name} ##{@issue.id}: #{@issue.subject}" %>
119
120
120 <% content_for :sidebar do %>
121 <% content_for :sidebar do %>
121 <%= render :partial => 'issues/sidebar' %>
122 <%= render :partial => 'issues/sidebar' %>
122 <% end %>
123 <% end %>
123
124
124 <% content_for :header_tags do %>
125 <% content_for :header_tags do %>
125 <%= auto_discovery_link_tag(:atom, {:format => 'atom', :key => User.current.rss_key}, :title => "#{@issue.project} - #{@issue.tracker} ##{@issue.id}: #{@issue.subject}") %>
126 <%= auto_discovery_link_tag(:atom, {:format => 'atom', :key => User.current.rss_key}, :title => "#{@issue.project} - #{@issue.tracker} ##{@issue.id}: #{@issue.subject}") %>
126 <%= stylesheet_link_tag 'scm' %>
127 <%= stylesheet_link_tag 'scm' %>
127 <% end %>
128 <% end %>
@@ -1,58 +1,61
1 <h2><%= l(:label_activity) %></h2>
1 <h2><%= l(:label_activity) %></h2>
2 <p class="subtitle"><%= "#{l(:label_date_from)} #{format_date(@date_to - @days)} #{l(:label_date_to).downcase} #{format_date(@date_to-1)}" %></p>
2 <p class="subtitle"><%= "#{l(:label_date_from)} #{format_date(@date_to - @days)} #{l(:label_date_to).downcase} #{format_date(@date_to-1)}" %></p>
3
3
4 <div id="activity">
4 <div id="activity">
5 <% @events_by_day.keys.sort.reverse.each do |day| %>
5 <% @events_by_day.keys.sort.reverse.each do |day| %>
6 <h3><%= format_activity_day(day) %></h3>
6 <h3><%= format_activity_day(day) %></h3>
7 <dl>
7 <dl>
8 <% @events_by_day[day].sort {|x,y| y.event_datetime <=> x.event_datetime }.each do |e| -%>
8 <% @events_by_day[day].sort {|x,y| y.event_datetime <=> x.event_datetime }.each do |e| -%>
9 <dt class="<%= e.event_type %> <%= User.current.logged? && e.respond_to?(:event_author) && User.current == e.event_author ? 'me' : nil %>">
9 <dt class="<%= e.event_type %> <%= User.current.logged? && e.respond_to?(:event_author) && User.current == e.event_author ? 'me' : nil %>">
10 <%= gravatar(e.user.mail, :size => "24") if e.respond_to?(:user) rescue nil%>
11 <%= gravatar(e.author.mail, :size => "24") if e.respond_to?(:author) rescue nil%>
12 <%= gravatar(e.committer.match('\\<.+?\\>')[0].gsub(/[<>]/, ''), :size => "24") if e.respond_to?(:committer) rescue nil%>
10 <span class="time"><%= format_time(e.event_datetime, false) %></span>
13 <span class="time"><%= format_time(e.event_datetime, false) %></span>
11 <%= content_tag('span', h(e.project), :class => 'project') if @project.nil? || @project != e.project %>
14 <%= content_tag('span', h(e.project), :class => 'project') if @project.nil? || @project != e.project %>
12 <%= link_to format_activity_title(e.event_title), e.event_url %></dt>
15 <%= link_to format_activity_title(e.event_title), e.event_url %></dt>
13 <dd><span class="description"><%= format_activity_description(e.event_description) %></span>
16 <dd><span class="description"><%= format_activity_description(e.event_description) %></span>
14 <span class="author"><%= e.event_author if e.respond_to?(:event_author) %></span></dd>
17 <span class="author"><%= e.event_author if e.respond_to?(:event_author) %></span></dd>
15 <% end -%>
18 <% end -%>
16 </dl>
19 </dl>
17 <% end -%>
20 <% end -%>
18 </div>
21 </div>
19
22
20 <%= content_tag('p', l(:label_no_data), :class => 'nodata') if @events_by_day.empty? %>
23 <%= content_tag('p', l(:label_no_data), :class => 'nodata') if @events_by_day.empty? %>
21
24
22 <div style="float:left;">
25 <div style="float:left;">
23 <%= link_to_remote(('&#171; ' + l(:label_previous)),
26 <%= link_to_remote(('&#171; ' + l(:label_previous)),
24 {:update => "content", :url => params.merge(:from => @date_to - @days), :complete => 'window.scrollTo(0,0)'},
27 {:update => "content", :url => params.merge(:from => @date_to - @days), :complete => 'window.scrollTo(0,0)'},
25 {:href => url_for(params.merge(:from => @date_to - @days)),
28 {:href => url_for(params.merge(:from => @date_to - @days)),
26 :title => "#{l(:label_date_from)} #{format_date(@date_to - 2*@days)} #{l(:label_date_to).downcase} #{format_date(@date_to - @days - 1)}"}) %>
29 :title => "#{l(:label_date_from)} #{format_date(@date_to - 2*@days)} #{l(:label_date_to).downcase} #{format_date(@date_to - @days - 1)}"}) %>
27 </div>
30 </div>
28 <div style="float:right;">
31 <div style="float:right;">
29 <%= link_to_remote((l(:label_next) + ' &#187;'),
32 <%= link_to_remote((l(:label_next) + ' &#187;'),
30 {:update => "content", :url => params.merge(:from => @date_to + @days), :complete => 'window.scrollTo(0,0)'},
33 {:update => "content", :url => params.merge(:from => @date_to + @days), :complete => 'window.scrollTo(0,0)'},
31 {:href => url_for(params.merge(:from => @date_to + @days)),
34 {:href => url_for(params.merge(:from => @date_to + @days)),
32 :title => "#{l(:label_date_from)} #{format_date(@date_to)} #{l(:label_date_to).downcase} #{format_date(@date_to + @days - 1)}"}) unless @date_to >= Date.today %>
35 :title => "#{l(:label_date_from)} #{format_date(@date_to)} #{l(:label_date_to).downcase} #{format_date(@date_to + @days - 1)}"}) unless @date_to >= Date.today %>
33 </div>
36 </div>
34 &nbsp;
37 &nbsp;
35 <p class="other-formats">
38 <p class="other-formats">
36 <%= l(:label_export_to) %>
39 <%= l(:label_export_to) %>
37 <%= link_to 'Atom', params.merge(:format => :atom, :key => User.current.rss_key).delete_if{|k,v|k=="commit"}, :class => 'feed' %>
40 <%= link_to 'Atom', params.merge(:format => :atom, :key => User.current.rss_key).delete_if{|k,v|k=="commit"}, :class => 'feed' %>
38 </p>
41 </p>
39
42
40 <% content_for :header_tags do %>
43 <% content_for :header_tags do %>
41 <%= auto_discovery_link_tag(:atom, params.merge(:format => 'atom', :year => nil, :month => nil, :key => User.current.rss_key)) %>
44 <%= auto_discovery_link_tag(:atom, params.merge(:format => 'atom', :year => nil, :month => nil, :key => User.current.rss_key)) %>
42 <% end %>
45 <% end %>
43
46
44 <% content_for :sidebar do %>
47 <% content_for :sidebar do %>
45 <% form_tag({}, :method => :get) do %>
48 <% form_tag({}, :method => :get) do %>
46 <h3><%= l(:label_activity) %></h3>
49 <h3><%= l(:label_activity) %></h3>
47 <p><% @activity.event_types.each do |t| %>
50 <p><% @activity.event_types.each do |t| %>
48 <label><%= check_box_tag "show_#{t}", 1, @activity.scope.include?(t) %> <%= l("label_#{t.singularize}_plural")%></label><br />
51 <label><%= check_box_tag "show_#{t}", 1, @activity.scope.include?(t) %> <%= l("label_#{t.singularize}_plural")%></label><br />
49 <% end %></p>
52 <% end %></p>
50 <% if @project && @project.active_children.any? %>
53 <% if @project && @project.active_children.any? %>
51 <p><label><%= check_box_tag 'with_subprojects', 1, @with_subprojects %> <%=l(:label_subproject_plural)%></label></p>
54 <p><label><%= check_box_tag 'with_subprojects', 1, @with_subprojects %> <%=l(:label_subproject_plural)%></label></p>
52 <%= hidden_field_tag 'with_subprojects', 0 %>
55 <%= hidden_field_tag 'with_subprojects', 0 %>
53 <% end %>
56 <% end %>
54 <p><%= submit_tag l(:button_apply), :class => 'button-small', :name => nil %></p>
57 <p><%= submit_tag l(:button_apply), :class => 'button-small', :name => nil %></p>
55 <% end %>
58 <% end %>
56 <% end %>
59 <% end %>
57
60
58 <% html_title(l(:label_activity)) -%>
61 <% html_title(l(:label_activity)) -%>
@@ -1,47 +1,47
1 <div class="contextual">
1 <div class="contextual">
2 <%= link_to l(:label_user_new), {:action => 'add'}, :class => 'icon icon-add' %>
2 <%= link_to l(:label_user_new), {:action => 'add'}, :class => 'icon icon-add' %>
3 </div>
3 </div>
4
4
5 <h2><%=l(:label_user_plural)%></h2>
5 <h2><%=l(:label_user_plural)%></h2>
6
6
7 <% form_tag({}, :method => :get) do %>
7 <% form_tag({}, :method => :get) do %>
8 <fieldset><legend><%= l(:label_filter_plural) %></legend>
8 <fieldset><legend><%= l(:label_filter_plural) %></legend>
9 <label><%= l(:field_status) %>:</label>
9 <label><%= l(:field_status) %>:</label>
10 <%= select_tag 'status', users_status_options_for_select(@status), :class => "small", :onchange => "this.form.submit(); return false;" %>
10 <%= select_tag 'status', users_status_options_for_select(@status), :class => "small", :onchange => "this.form.submit(); return false;" %>
11 <label><%= l(:label_user) %>:</label>
11 <label><%= l(:label_user) %>:</label>
12 <%= text_field_tag 'name', params[:name], :size => 30 %>
12 <%= text_field_tag 'name', params[:name], :size => 30 %>
13 <%= submit_tag l(:button_apply), :class => "small", :name => nil %>
13 <%= submit_tag l(:button_apply), :class => "small", :name => nil %>
14 </fieldset>
14 </fieldset>
15 <% end %>
15 <% end %>
16 &nbsp;
16 &nbsp;
17
17
18 <table class="list">
18 <table class="list">
19 <thead><tr>
19 <thead><tr>
20 <%= sort_header_tag('login', :caption => l(:field_login)) %>
20 <%= sort_header_tag('login', :caption => l(:field_login)) %>
21 <%= sort_header_tag('firstname', :caption => l(:field_firstname)) %>
21 <%= sort_header_tag('firstname', :caption => l(:field_firstname)) %>
22 <%= sort_header_tag('lastname', :caption => l(:field_lastname)) %>
22 <%= sort_header_tag('lastname', :caption => l(:field_lastname)) %>
23 <%= sort_header_tag('mail', :caption => l(:field_mail)) %>
23 <%= sort_header_tag('mail', :caption => l(:field_mail)) %>
24 <%= sort_header_tag('admin', :caption => l(:field_admin), :default_order => 'desc') %>
24 <%= sort_header_tag('admin', :caption => l(:field_admin), :default_order => 'desc') %>
25 <%= sort_header_tag('created_on', :caption => l(:field_created_on), :default_order => 'desc') %>
25 <%= sort_header_tag('created_on', :caption => l(:field_created_on), :default_order => 'desc') %>
26 <%= sort_header_tag('last_login_on', :caption => l(:field_last_login_on), :default_order => 'desc') %>
26 <%= sort_header_tag('last_login_on', :caption => l(:field_last_login_on), :default_order => 'desc') %>
27 <th></th>
27 <th></th>
28 </tr></thead>
28 </tr></thead>
29 <tbody>
29 <tbody>
30 <% for user in @users -%>
30 <% for user in @users -%>
31 <tr class="user <%= cycle("odd", "even") %> <%= %w(anon active registered locked)[user.status] %>">
31 <tr class="user <%= cycle("odd", "even") %> <%= %w(anon active registered locked)[user.status] %>">
32 <td class="username"><%= link_to h(user.login), :action => 'edit', :id => user %></td>
32 <td class="username"><%= gravatar(user.mail, :size => "24") %><%= link_to h(user.login), :action => 'edit', :id => user %></td>
33 <td class="firstname"><%= h(user.firstname) %></td>
33 <td class="firstname"><%= h(user.firstname) %></td>
34 <td class="lastname"><%= h(user.lastname) %></td>
34 <td class="lastname"><%= h(user.lastname) %></td>
35 <td class="email"><%= mail_to(h(user.mail)) %></td>
35 <td class="email"><%= mail_to(h(user.mail)) %></td>
36 <td align="center"><%= image_tag('true.png') if user.admin? %></td>
36 <td align="center"><%= image_tag('true.png') if user.admin? %></td>
37 <td class="created_on" align="center"><%= format_time(user.created_on) %></td>
37 <td class="created_on" align="center"><%= format_time(user.created_on) %></td>
38 <td class="last_login_on" align="center"><%= format_time(user.last_login_on) unless user.last_login_on.nil? %></td>
38 <td class="last_login_on" align="center"><%= format_time(user.last_login_on) unless user.last_login_on.nil? %></td>
39 <td><small><%= change_status_link(user) %></small></td>
39 <td><small><%= change_status_link(user) %></small></td>
40 </tr>
40 </tr>
41 <% end -%>
41 <% end -%>
42 </tbody>
42 </tbody>
43 </table>
43 </table>
44
44
45 <p class="pagination"><%= pagination_links_full @user_pages, @user_count %></p>
45 <p class="pagination"><%= pagination_links_full @user_pages, @user_count %></p>
46
46
47 <% html_title(l(:label_user_plural)) -%>
47 <% html_title(l(:label_user_plural)) -%>
@@ -1,623 +1,659
1 body { font-family: Verdana, sans-serif; font-size: 12px; color:#484848; margin: 0; padding: 0; min-width: 900px; }
1 body { font-family: Verdana, sans-serif; font-size: 12px; color:#484848; margin: 0; padding: 0; min-width: 900px; }
2
2
3 h1, h2, h3, h4 { font-family: "Trebuchet MS", Verdana, sans-serif;}
3 h1, h2, h3, h4 { font-family: "Trebuchet MS", Verdana, sans-serif;}
4 h1 {margin:0; padding:0; font-size: 24px;}
4 h1 {margin:0; padding:0; font-size: 24px;}
5 h2, .wiki h1 {font-size: 20px;padding: 2px 10px 1px 0px;margin: 0 0 10px 0; border-bottom: 1px solid #bbbbbb; color: #444;}
5 h2, .wiki h1 {font-size: 20px;padding: 2px 10px 1px 0px;margin: 0 0 10px 0; border-bottom: 1px solid #bbbbbb; color: #444;}
6 h3, .wiki h2 {font-size: 16px;padding: 2px 10px 1px 0px;margin: 0 0 10px 0; border-bottom: 1px solid #bbbbbb; color: #444;}
6 h3, .wiki h2 {font-size: 16px;padding: 2px 10px 1px 0px;margin: 0 0 10px 0; border-bottom: 1px solid #bbbbbb; color: #444;}
7 h4, .wiki h3 {font-size: 13px;padding: 2px 10px 1px 0px;margin-bottom: 5px; border-bottom: 1px dotted #bbbbbb; color: #444;}
7 h4, .wiki h3 {font-size: 13px;padding: 2px 10px 1px 0px;margin-bottom: 5px; border-bottom: 1px dotted #bbbbbb; color: #444;}
8
8
9 /***** Layout *****/
9 /***** Layout *****/
10 #wrapper {background: white;}
10 #wrapper {background: white;}
11
11
12 #top-menu {background: #2C4056; color: #fff; height:1.8em; font-size: 0.8em; padding: 2px 2px 0px 6px;}
12 #top-menu {background: #2C4056; color: #fff; height:1.8em; font-size: 0.8em; padding: 2px 2px 0px 6px;}
13 #top-menu ul {margin: 0; padding: 0;}
13 #top-menu ul {margin: 0; padding: 0;}
14 #top-menu li {
14 #top-menu li {
15 float:left;
15 float:left;
16 list-style-type:none;
16 list-style-type:none;
17 margin: 0px 0px 0px 0px;
17 margin: 0px 0px 0px 0px;
18 padding: 0px 0px 0px 0px;
18 padding: 0px 0px 0px 0px;
19 white-space:nowrap;
19 white-space:nowrap;
20 }
20 }
21 #top-menu a {color: #fff; padding-right: 8px; font-weight: bold;}
21 #top-menu a {color: #fff; padding-right: 8px; font-weight: bold;}
22 #top-menu #loggedas { float: right; margin-right: 0.5em; color: #fff; }
22 #top-menu #loggedas { float: right; margin-right: 0.5em; color: #fff; }
23
23
24 #account {float:right;}
24 #account {float:right;}
25
25
26 #header {height:5.3em;margin:0;background-color:#507AAA;color:#f8f8f8; padding: 4px 8px 0px 6px; position:relative;}
26 #header {height:5.3em;margin:0;background-color:#507AAA;color:#f8f8f8; padding: 4px 8px 0px 6px; position:relative;}
27 #header a {color:#f8f8f8;}
27 #header a {color:#f8f8f8;}
28 #quick-search {float:right;}
28 #quick-search {float:right;}
29
29
30 #main-menu {position: absolute; bottom: 0px; left:6px; margin-right: -500px;}
30 #main-menu {position: absolute; bottom: 0px; left:6px; margin-right: -500px;}
31 #main-menu ul {margin: 0; padding: 0;}
31 #main-menu ul {margin: 0; padding: 0;}
32 #main-menu li {
32 #main-menu li {
33 float:left;
33 float:left;
34 list-style-type:none;
34 list-style-type:none;
35 margin: 0px 2px 0px 0px;
35 margin: 0px 2px 0px 0px;
36 padding: 0px 0px 0px 0px;
36 padding: 0px 0px 0px 0px;
37 white-space:nowrap;
37 white-space:nowrap;
38 }
38 }
39 #main-menu li a {
39 #main-menu li a {
40 display: block;
40 display: block;
41 color: #fff;
41 color: #fff;
42 text-decoration: none;
42 text-decoration: none;
43 font-weight: bold;
43 font-weight: bold;
44 margin: 0;
44 margin: 0;
45 padding: 4px 10px 4px 10px;
45 padding: 4px 10px 4px 10px;
46 }
46 }
47 #main-menu li a:hover {background:#759FCF; color:#fff;}
47 #main-menu li a:hover {background:#759FCF; color:#fff;}
48 #main-menu li a.selected, #main-menu li a.selected:hover {background:#fff; color:#555;}
48 #main-menu li a.selected, #main-menu li a.selected:hover {background:#fff; color:#555;}
49
49
50 #main {background-color:#EEEEEE;}
50 #main {background-color:#EEEEEE;}
51
51
52 #sidebar{ float: right; width: 17%; position: relative; z-index: 9; min-height: 600px; padding: 0; margin: 0;}
52 #sidebar{ float: right; width: 17%; position: relative; z-index: 9; min-height: 600px; padding: 0; margin: 0;}
53 * html #sidebar{ width: 17%; }
53 * html #sidebar{ width: 17%; }
54 #sidebar h3{ font-size: 14px; margin-top:14px; color: #666; }
54 #sidebar h3{ font-size: 14px; margin-top:14px; color: #666; }
55 #sidebar hr{ width: 100%; margin: 0 auto; height: 1px; background: #ccc; border: 0; }
55 #sidebar hr{ width: 100%; margin: 0 auto; height: 1px; background: #ccc; border: 0; }
56 * html #sidebar hr{ width: 95%; position: relative; left: -6px; color: #ccc; }
56 * html #sidebar hr{ width: 95%; position: relative; left: -6px; color: #ccc; }
57
57
58 #content { width: 80%; background-color: #fff; margin: 0px; border-right: 1px solid #ddd; padding: 6px 10px 10px 10px; z-index: 10; height:600px; min-height: 600px;}
58 #content { width: 80%; background-color: #fff; margin: 0px; border-right: 1px solid #ddd; padding: 6px 10px 10px 10px; z-index: 10; height:600px; min-height: 600px;}
59 * html #content{ width: 80%; padding-left: 0; margin-top: 0px; padding: 6px 10px 10px 10px;}
59 * html #content{ width: 80%; padding-left: 0; margin-top: 0px; padding: 6px 10px 10px 10px;}
60 html>body #content { height: auto; min-height: 600px; overflow: auto; }
60 html>body #content { height: auto; min-height: 600px; overflow: auto; }
61
61
62 #main.nosidebar #sidebar{ display: none; }
62 #main.nosidebar #sidebar{ display: none; }
63 #main.nosidebar #content{ width: auto; border-right: 0; }
63 #main.nosidebar #content{ width: auto; border-right: 0; }
64
64
65 #footer {clear: both; border-top: 1px solid #bbb; font-size: 0.9em; color: #aaa; padding: 5px; text-align:center; background:#fff;}
65 #footer {clear: both; border-top: 1px solid #bbb; font-size: 0.9em; color: #aaa; padding: 5px; text-align:center; background:#fff;}
66
66
67 #login-form table {margin-top:5em; padding:1em; margin-left: auto; margin-right: auto; border: 2px solid #FDBF3B; background-color:#FFEBC1; }
67 #login-form table {margin-top:5em; padding:1em; margin-left: auto; margin-right: auto; border: 2px solid #FDBF3B; background-color:#FFEBC1; }
68 #login-form table td {padding: 6px;}
68 #login-form table td {padding: 6px;}
69 #login-form label {font-weight: bold;}
69 #login-form label {font-weight: bold;}
70
70
71 .clear:after{ content: "."; display: block; height: 0; clear: both; visibility: hidden; }
71 .clear:after{ content: "."; display: block; height: 0; clear: both; visibility: hidden; }
72
72
73 /***** Links *****/
73 /***** Links *****/
74 a, a:link, a:visited{ color: #2A5685; text-decoration: none; }
74 a, a:link, a:visited{ color: #2A5685; text-decoration: none; }
75 a:hover, a:active{ color: #c61a1a; text-decoration: underline;}
75 a:hover, a:active{ color: #c61a1a; text-decoration: underline;}
76 a img{ border: 0; }
76 a img{ border: 0; }
77
77
78 a.issue.closed { text-decoration: line-through; }
78 a.issue.closed { text-decoration: line-through; }
79
79
80 /***** Tables *****/
80 /***** Tables *****/
81 table.list { border: 1px solid #e4e4e4; border-collapse: collapse; width: 100%; margin-bottom: 4px; }
81 table.list { border: 1px solid #e4e4e4; border-collapse: collapse; width: 100%; margin-bottom: 4px; }
82 table.list th { background-color:#EEEEEE; padding: 4px; white-space:nowrap; }
82 table.list th { background-color:#EEEEEE; padding: 4px; white-space:nowrap; }
83 table.list td { vertical-align: top; }
83 table.list td { vertical-align: top; }
84 table.list td.id { width: 2%; text-align: center;}
84 table.list td.id { width: 2%; text-align: center;}
85 table.list td.checkbox { width: 15px; padding: 0px;}
85 table.list td.checkbox { width: 15px; padding: 0px;}
86
86
87 tr.issue { text-align: center; white-space: nowrap; }
87 tr.issue { text-align: center; white-space: nowrap; }
88 tr.issue td.subject, tr.issue td.category, td.assigned_to { white-space: normal; }
88 tr.issue td.subject, tr.issue td.category, td.assigned_to { white-space: normal; }
89 tr.issue td.subject { text-align: left; }
89 tr.issue td.subject { text-align: left; }
90 tr.issue td.done_ratio table.progress { margin-left:auto; margin-right: auto;}
90 tr.issue td.done_ratio table.progress { margin-left:auto; margin-right: auto;}
91
91
92 tr.entry { border: 1px solid #f8f8f8; }
92 tr.entry { border: 1px solid #f8f8f8; }
93 tr.entry td { white-space: nowrap; }
93 tr.entry td { white-space: nowrap; }
94 tr.entry td.filename { width: 30%; }
94 tr.entry td.filename { width: 30%; }
95 tr.entry td.size { text-align: right; font-size: 90%; }
95 tr.entry td.size { text-align: right; font-size: 90%; }
96 tr.entry td.revision, tr.entry td.author { text-align: center; }
96 tr.entry td.revision, tr.entry td.author { text-align: center; }
97 tr.entry td.age { text-align: right; }
97 tr.entry td.age { text-align: right; }
98
98
99 tr.entry span.expander {background-image: url(../images/bullet_toggle_plus.png); padding-left: 8px; margin-left: 0; cursor: pointer;}
99 tr.entry span.expander {background-image: url(../images/bullet_toggle_plus.png); padding-left: 8px; margin-left: 0; cursor: pointer;}
100 tr.entry.open span.expander {background-image: url(../images/bullet_toggle_minus.png);}
100 tr.entry.open span.expander {background-image: url(../images/bullet_toggle_minus.png);}
101 tr.entry.file td.filename a { margin-left: 16px; }
101 tr.entry.file td.filename a { margin-left: 16px; }
102
102
103 tr.changeset td.author { text-align: center; width: 15%; }
103 tr.changeset td.author { text-align: center; width: 15%; }
104 tr.changeset td.committed_on { text-align: center; width: 15%; }
104 tr.changeset td.committed_on { text-align: center; width: 15%; }
105
105
106 tr.message { height: 2.6em; }
106 tr.message { height: 2.6em; }
107 tr.message td.last_message { font-size: 80%; }
107 tr.message td.last_message { font-size: 80%; }
108 tr.message.locked td.subject a { background-image: url(../images/locked.png); }
108 tr.message.locked td.subject a { background-image: url(../images/locked.png); }
109 tr.message.sticky td.subject a { background-image: url(../images/sticky.png); font-weight: bold; }
109 tr.message.sticky td.subject a { background-image: url(../images/sticky.png); font-weight: bold; }
110
110
111 tr.user td { width:13%; }
111 tr.user td { width:13%; }
112 tr.user td.email { width:18%; }
112 tr.user td.email { width:18%; }
113 tr.user td { white-space: nowrap; }
113 tr.user td { white-space: nowrap; }
114 tr.user.locked, tr.user.registered { color: #aaa; }
114 tr.user.locked, tr.user.registered { color: #aaa; }
115 tr.user.locked a, tr.user.registered a { color: #aaa; }
115 tr.user.locked a, tr.user.registered a { color: #aaa; }
116
116
117 tr.time-entry { text-align: center; white-space: nowrap; }
117 tr.time-entry { text-align: center; white-space: nowrap; }
118 tr.time-entry td.subject, tr.time-entry td.comments { text-align: left; white-space: normal; }
118 tr.time-entry td.subject, tr.time-entry td.comments { text-align: left; white-space: normal; }
119 td.hours { text-align: right; font-weight: bold; padding-right: 0.5em; }
119 td.hours { text-align: right; font-weight: bold; padding-right: 0.5em; }
120 td.hours .hours-dec { font-size: 0.9em; }
120 td.hours .hours-dec { font-size: 0.9em; }
121
121
122 table.list tbody tr:hover { background-color:#ffffdd; }
122 table.list tbody tr:hover { background-color:#ffffdd; }
123 table td {padding:2px;}
123 table td {padding:2px;}
124 table p {margin:0;}
124 table p {margin:0;}
125 .odd {background-color:#f6f7f8;}
125 .odd {background-color:#f6f7f8;}
126 .even {background-color: #fff;}
126 .even {background-color: #fff;}
127
127
128 .highlight { background-color: #FCFD8D;}
128 .highlight { background-color: #FCFD8D;}
129 .highlight.token-1 { background-color: #faa;}
129 .highlight.token-1 { background-color: #faa;}
130 .highlight.token-2 { background-color: #afa;}
130 .highlight.token-2 { background-color: #afa;}
131 .highlight.token-3 { background-color: #aaf;}
131 .highlight.token-3 { background-color: #aaf;}
132
132
133 .box{
133 .box{
134 padding:6px;
134 padding:6px;
135 margin-bottom: 10px;
135 margin-bottom: 10px;
136 background-color:#f6f6f6;
136 background-color:#f6f6f6;
137 color:#505050;
137 color:#505050;
138 line-height:1.5em;
138 line-height:1.5em;
139 border: 1px solid #e4e4e4;
139 border: 1px solid #e4e4e4;
140 }
140 }
141
141
142 div.square {
142 div.square {
143 border: 1px solid #999;
143 border: 1px solid #999;
144 float: left;
144 float: left;
145 margin: .3em .4em 0 .4em;
145 margin: .3em .4em 0 .4em;
146 overflow: hidden;
146 overflow: hidden;
147 width: .6em; height: .6em;
147 width: .6em; height: .6em;
148 }
148 }
149 .contextual {float:right; white-space: nowrap; line-height:1.4em;margin-top:5px; padding-left: 10px; font-size:0.9em;}
149 .contextual {float:right; white-space: nowrap; line-height:1.4em;margin-top:5px; padding-left: 10px; font-size:0.9em;}
150 .contextual input {font-size:0.9em;}
150 .contextual input {font-size:0.9em;}
151
151
152 .splitcontentleft{float:left; width:49%;}
152 .splitcontentleft{float:left; width:49%;}
153 .splitcontentright{float:right; width:49%;}
153 .splitcontentright{float:right; width:49%;}
154 form {display: inline;}
154 form {display: inline;}
155 input, select {vertical-align: middle; margin-top: 1px; margin-bottom: 1px;}
155 input, select {vertical-align: middle; margin-top: 1px; margin-bottom: 1px;}
156 fieldset {border: 1px solid #e4e4e4; margin:0;}
156 fieldset {border: 1px solid #e4e4e4; margin:0;}
157 legend {color: #484848;}
157 legend {color: #484848;}
158 hr { width: 100%; height: 1px; background: #ccc; border: 0;}
158 hr { width: 100%; height: 1px; background: #ccc; border: 0;}
159 blockquote { font-style: italic; border-left: 3px solid #e0e0e0; padding-left: 0.6em; margin-left: 2.4em;}
159 blockquote { font-style: italic; border-left: 3px solid #e0e0e0; padding-left: 0.6em; margin-left: 2.4em;}
160 blockquote blockquote { margin-left: 0;}
160 blockquote blockquote { margin-left: 0;}
161 textarea.wiki-edit { width: 99%; }
161 textarea.wiki-edit { width: 99%; }
162 li p {margin-top: 0;}
162 li p {margin-top: 0;}
163 div.issue {background:#ffffdd; padding:6px; margin-bottom:6px;border: 1px solid #d7d7d7;}
163 div.issue {background:#ffffdd; padding:6px; margin-bottom:6px;border: 1px solid #d7d7d7;}
164 p.breadcrumb { font-size: 0.9em; margin: 4px 0 4px 0;}
164 p.breadcrumb { font-size: 0.9em; margin: 4px 0 4px 0;}
165 p.subtitle { font-size: 0.9em; margin: -6px 0 12px 0; font-style: italic; }
165 p.subtitle { font-size: 0.9em; margin: -6px 0 12px 0; font-style: italic; }
166 p.footnote { font-size: 0.9em; margin-top: 0px; margin-bottom: 0px; }
166 p.footnote { font-size: 0.9em; margin-top: 0px; margin-bottom: 0px; }
167
167
168 fieldset#filters, fieldset#date-range { padding: 0.7em; margin-bottom: 8px; }
168 fieldset#filters, fieldset#date-range { padding: 0.7em; margin-bottom: 8px; }
169 fieldset#filters p { margin: 1.2em 0 0.8em 2px; }
169 fieldset#filters p { margin: 1.2em 0 0.8em 2px; }
170 fieldset#filters table { border-collapse: collapse; }
170 fieldset#filters table { border-collapse: collapse; }
171 fieldset#filters table td { padding: 0; vertical-align: middle; }
171 fieldset#filters table td { padding: 0; vertical-align: middle; }
172 fieldset#filters tr.filter { height: 2em; }
172 fieldset#filters tr.filter { height: 2em; }
173 fieldset#filters td.add-filter { text-align: right; vertical-align: top; }
173 fieldset#filters td.add-filter { text-align: right; vertical-align: top; }
174 .buttons { font-size: 0.9em; }
174 .buttons { font-size: 0.9em; }
175
175
176 div#issue-changesets {float:right; width:45%; margin-left: 1em; margin-bottom: 1em; background: #fff; padding-left: 1em; font-size: 90%;}
176 div#issue-changesets {float:right; width:45%; margin-left: 1em; margin-bottom: 1em; background: #fff; padding-left: 1em; font-size: 90%;}
177 div#issue-changesets .changeset { padding: 4px;}
177 div#issue-changesets .changeset { padding: 4px;}
178 div#issue-changesets .changeset { border-bottom: 1px solid #ddd; }
178 div#issue-changesets .changeset { border-bottom: 1px solid #ddd; }
179 div#issue-changesets p { margin-top: 0; margin-bottom: 1em;}
179 div#issue-changesets p { margin-top: 0; margin-bottom: 1em;}
180
180
181 div#activity dl, #search-results { margin-left: 2em; }
181 div#activity dl, #search-results { margin-left: 2em; }
182 div#activity dd, #search-results dd { margin-bottom: 1em; padding-left: 18px; font-size: 0.9em; }
182 div#activity dd, #search-results dd { margin-bottom: 1em; padding-left: 18px; font-size: 0.9em; }
183 div#activity dt, #search-results dt { margin-bottom: 0px; padding-left: 20px; line-height: 18px; background-position: 0 50%; background-repeat: no-repeat; }
183 div#activity dt, #search-results dt { margin-bottom: 0px; padding-left: 20px; line-height: 18px; background-position: 0 50%; background-repeat: no-repeat; }
184 div#activity dt.me .time { border-bottom: 1px solid #999; }
184 div#activity dt.me .time { border-bottom: 1px solid #999; }
185 div#activity dt .time { color: #777; font-size: 80%; }
185 div#activity dt .time { color: #777; font-size: 80%; }
186 div#activity dd .description, #search-results dd .description { font-style: italic; }
186 div#activity dd .description, #search-results dd .description { font-style: italic; }
187 div#activity span.project:after, #search-results span.project:after { content: " -"; }
187 div#activity span.project:after, #search-results span.project:after { content: " -"; }
188 div#activity dd span.description, #search-results dd span.description { display:block; }
188 div#activity dd span.description, #search-results dd span.description { display:block; }
189
189
190 #search-results dd { margin-bottom: 1em; padding-left: 20px; margin-left:0px; }
190 #search-results dd { margin-bottom: 1em; padding-left: 20px; margin-left:0px; }
191 div#search-results-counts {float:right;}
191 div#search-results-counts {float:right;}
192 div#search-results-counts ul { margin-top: 0.5em; }
192 div#search-results-counts ul { margin-top: 0.5em; }
193 div#search-results-counts li { list-style-type:none; float: left; margin-left: 1em; }
193 div#search-results-counts li { list-style-type:none; float: left; margin-left: 1em; }
194
194
195 dt.issue { background-image: url(../images/ticket.png); }
195 dt.issue { background-image: url(../images/ticket.png); }
196 dt.issue-edit { background-image: url(../images/ticket_edit.png); }
196 dt.issue-edit { background-image: url(../images/ticket_edit.png); }
197 dt.issue-closed { background-image: url(../images/ticket_checked.png); }
197 dt.issue-closed { background-image: url(../images/ticket_checked.png); }
198 dt.issue-note { background-image: url(../images/ticket_note.png); }
198 dt.issue-note { background-image: url(../images/ticket_note.png); }
199 dt.changeset { background-image: url(../images/changeset.png); }
199 dt.changeset { background-image: url(../images/changeset.png); }
200 dt.news { background-image: url(../images/news.png); }
200 dt.news { background-image: url(../images/news.png); }
201 dt.message { background-image: url(../images/message.png); }
201 dt.message { background-image: url(../images/message.png); }
202 dt.reply { background-image: url(../images/comments.png); }
202 dt.reply { background-image: url(../images/comments.png); }
203 dt.wiki-page { background-image: url(../images/wiki_edit.png); }
203 dt.wiki-page { background-image: url(../images/wiki_edit.png); }
204 dt.attachment { background-image: url(../images/attachment.png); }
204 dt.attachment { background-image: url(../images/attachment.png); }
205 dt.document { background-image: url(../images/document.png); }
205 dt.document { background-image: url(../images/document.png); }
206 dt.project { background-image: url(../images/projects.png); }
206 dt.project { background-image: url(../images/projects.png); }
207
207
208 div#roadmap fieldset.related-issues { margin-bottom: 1em; }
208 div#roadmap fieldset.related-issues { margin-bottom: 1em; }
209 div#roadmap fieldset.related-issues ul { margin-top: 0.3em; margin-bottom: 0.3em; }
209 div#roadmap fieldset.related-issues ul { margin-top: 0.3em; margin-bottom: 0.3em; }
210 div#roadmap .wiki h1:first-child { display: none; }
210 div#roadmap .wiki h1:first-child { display: none; }
211 div#roadmap .wiki h1 { font-size: 120%; }
211 div#roadmap .wiki h1 { font-size: 120%; }
212 div#roadmap .wiki h2 { font-size: 110%; }
212 div#roadmap .wiki h2 { font-size: 110%; }
213
213
214 div#version-summary { float:right; width:380px; margin-left: 16px; margin-bottom: 16px; background-color: #fff; }
214 div#version-summary { float:right; width:380px; margin-left: 16px; margin-bottom: 16px; background-color: #fff; }
215 div#version-summary fieldset { margin-bottom: 1em; }
215 div#version-summary fieldset { margin-bottom: 1em; }
216 div#version-summary .total-hours { text-align: right; }
216 div#version-summary .total-hours { text-align: right; }
217
217
218 table#time-report td.hours, table#time-report th.period, table#time-report th.total { text-align: right; padding-right: 0.5em; }
218 table#time-report td.hours, table#time-report th.period, table#time-report th.total { text-align: right; padding-right: 0.5em; }
219 table#time-report tbody tr { font-style: italic; color: #777; }
219 table#time-report tbody tr { font-style: italic; color: #777; }
220 table#time-report tbody tr.last-level { font-style: normal; color: #555; }
220 table#time-report tbody tr.last-level { font-style: normal; color: #555; }
221 table#time-report tbody tr.total { font-style: normal; font-weight: bold; color: #555; background-color:#EEEEEE; }
221 table#time-report tbody tr.total { font-style: normal; font-weight: bold; color: #555; background-color:#EEEEEE; }
222 table#time-report .hours-dec { font-size: 0.9em; }
222 table#time-report .hours-dec { font-size: 0.9em; }
223
223
224 ul.properties {padding:0; font-size: 0.9em; color: #777;}
224 ul.properties {padding:0; font-size: 0.9em; color: #777;}
225 ul.properties li {list-style-type:none;}
225 ul.properties li {list-style-type:none;}
226 ul.properties li span {font-style:italic;}
226 ul.properties li span {font-style:italic;}
227
227
228 .total-hours { font-size: 110%; font-weight: bold; }
228 .total-hours { font-size: 110%; font-weight: bold; }
229 .total-hours span.hours-int { font-size: 120%; }
229 .total-hours span.hours-int { font-size: 120%; }
230
230
231 .autoscroll {overflow-x: auto; padding:1px; margin-bottom: 1.2em;}
231 .autoscroll {overflow-x: auto; padding:1px; margin-bottom: 1.2em;}
232 #user_firstname, #user_lastname, #user_mail, #my_account_form select { width: 90%; }
232 #user_firstname, #user_lastname, #user_mail, #my_account_form select { width: 90%; }
233
233
234 .pagination {font-size: 90%}
234 .pagination {font-size: 90%}
235 p.pagination {margin-top:8px;}
235 p.pagination {margin-top:8px;}
236
236
237 /***** Tabular forms ******/
237 /***** Tabular forms ******/
238 .tabular p{
238 .tabular p{
239 margin: 0;
239 margin: 0;
240 padding: 5px 0 8px 0;
240 padding: 5px 0 8px 0;
241 padding-left: 180px; /*width of left column containing the label elements*/
241 padding-left: 180px; /*width of left column containing the label elements*/
242 height: 1%;
242 height: 1%;
243 clear:left;
243 clear:left;
244 }
244 }
245
245
246 html>body .tabular p {overflow:hidden;}
246 html>body .tabular p {overflow:hidden;}
247
247
248 .tabular label{
248 .tabular label{
249 font-weight: bold;
249 font-weight: bold;
250 float: left;
250 float: left;
251 text-align: right;
251 text-align: right;
252 margin-left: -180px; /*width of left column*/
252 margin-left: -180px; /*width of left column*/
253 width: 175px; /*width of labels. Should be smaller than left column to create some right
253 width: 175px; /*width of labels. Should be smaller than left column to create some right
254 margin*/
254 margin*/
255 }
255 }
256
256
257 .tabular label.floating{
257 .tabular label.floating{
258 font-weight: normal;
258 font-weight: normal;
259 margin-left: 0px;
259 margin-left: 0px;
260 text-align: left;
260 text-align: left;
261 width: 270px;
261 width: 270px;
262 }
262 }
263
263
264 input#time_entry_comments { width: 90%;}
264 input#time_entry_comments { width: 90%;}
265
265
266 #preview fieldset {margin-top: 1em; background: url(../images/draft.png)}
266 #preview fieldset {margin-top: 1em; background: url(../images/draft.png)}
267
267
268 .tabular.settings p{ padding-left: 300px; }
268 .tabular.settings p{ padding-left: 300px; }
269 .tabular.settings label{ margin-left: -300px; width: 295px; }
269 .tabular.settings label{ margin-left: -300px; width: 295px; }
270
270
271 .required {color: #bb0000;}
271 .required {color: #bb0000;}
272 .summary {font-style: italic;}
272 .summary {font-style: italic;}
273
273
274 #attachments_fields input[type=text] {margin-left: 8px; }
274 #attachments_fields input[type=text] {margin-left: 8px; }
275
275
276 div.attachments { margin-top: 12px; }
276 div.attachments { margin-top: 12px; }
277 div.attachments p { margin:4px 0 2px 0; }
277 div.attachments p { margin:4px 0 2px 0; }
278 div.attachments img { vertical-align: middle; }
278 div.attachments img { vertical-align: middle; }
279 div.attachments span.author { font-size: 0.9em; color: #888; }
279 div.attachments span.author { font-size: 0.9em; color: #888; }
280
280
281 p.other-formats { text-align: right; font-size:0.9em; color: #666; }
281 p.other-formats { text-align: right; font-size:0.9em; color: #666; }
282 .other-formats span + span:before { content: "| "; }
282 .other-formats span + span:before { content: "| "; }
283
283
284 a.feed { background: url(../images/feed.png) no-repeat 1px 50%; padding: 2px 0px 3px 16px; }
284 a.feed { background: url(../images/feed.png) no-repeat 1px 50%; padding: 2px 0px 3px 16px; }
285
285
286 /***** Flash & error messages ****/
286 /***** Flash & error messages ****/
287 #errorExplanation, div.flash, .nodata, .warning {
287 #errorExplanation, div.flash, .nodata, .warning {
288 padding: 4px 4px 4px 30px;
288 padding: 4px 4px 4px 30px;
289 margin-bottom: 12px;
289 margin-bottom: 12px;
290 font-size: 1.1em;
290 font-size: 1.1em;
291 border: 2px solid;
291 border: 2px solid;
292 }
292 }
293
293
294 div.flash {margin-top: 8px;}
294 div.flash {margin-top: 8px;}
295
295
296 div.flash.error, #errorExplanation {
296 div.flash.error, #errorExplanation {
297 background: url(../images/false.png) 8px 5px no-repeat;
297 background: url(../images/false.png) 8px 5px no-repeat;
298 background-color: #ffe3e3;
298 background-color: #ffe3e3;
299 border-color: #dd0000;
299 border-color: #dd0000;
300 color: #550000;
300 color: #550000;
301 }
301 }
302
302
303 div.flash.notice {
303 div.flash.notice {
304 background: url(../images/true.png) 8px 5px no-repeat;
304 background: url(../images/true.png) 8px 5px no-repeat;
305 background-color: #dfffdf;
305 background-color: #dfffdf;
306 border-color: #9fcf9f;
306 border-color: #9fcf9f;
307 color: #005f00;
307 color: #005f00;
308 }
308 }
309
309
310 .nodata, .warning {
310 .nodata, .warning {
311 text-align: center;
311 text-align: center;
312 background-color: #FFEBC1;
312 background-color: #FFEBC1;
313 border-color: #FDBF3B;
313 border-color: #FDBF3B;
314 color: #A6750C;
314 color: #A6750C;
315 }
315 }
316
316
317 #errorExplanation ul { font-size: 0.9em;}
317 #errorExplanation ul { font-size: 0.9em;}
318
318
319 /***** Ajax indicator ******/
319 /***** Ajax indicator ******/
320 #ajax-indicator {
320 #ajax-indicator {
321 position: absolute; /* fixed not supported by IE */
321 position: absolute; /* fixed not supported by IE */
322 background-color:#eee;
322 background-color:#eee;
323 border: 1px solid #bbb;
323 border: 1px solid #bbb;
324 top:35%;
324 top:35%;
325 left:40%;
325 left:40%;
326 width:20%;
326 width:20%;
327 font-weight:bold;
327 font-weight:bold;
328 text-align:center;
328 text-align:center;
329 padding:0.6em;
329 padding:0.6em;
330 z-index:100;
330 z-index:100;
331 filter:alpha(opacity=50);
331 filter:alpha(opacity=50);
332 opacity: 0.5;
332 opacity: 0.5;
333 }
333 }
334
334
335 html>body #ajax-indicator { position: fixed; }
335 html>body #ajax-indicator { position: fixed; }
336
336
337 #ajax-indicator span {
337 #ajax-indicator span {
338 background-position: 0% 40%;
338 background-position: 0% 40%;
339 background-repeat: no-repeat;
339 background-repeat: no-repeat;
340 background-image: url(../images/loading.gif);
340 background-image: url(../images/loading.gif);
341 padding-left: 26px;
341 padding-left: 26px;
342 vertical-align: bottom;
342 vertical-align: bottom;
343 }
343 }
344
344
345 /***** Calendar *****/
345 /***** Calendar *****/
346 table.cal {border-collapse: collapse; width: 100%; margin: 0px 0 6px 0;border: 1px solid #d7d7d7;}
346 table.cal {border-collapse: collapse; width: 100%; margin: 0px 0 6px 0;border: 1px solid #d7d7d7;}
347 table.cal thead th {width: 14%;}
347 table.cal thead th {width: 14%;}
348 table.cal tbody tr {height: 100px;}
348 table.cal tbody tr {height: 100px;}
349 table.cal th { background-color:#EEEEEE; padding: 4px; }
349 table.cal th { background-color:#EEEEEE; padding: 4px; }
350 table.cal td {border: 1px solid #d7d7d7; vertical-align: top; font-size: 0.9em;}
350 table.cal td {border: 1px solid #d7d7d7; vertical-align: top; font-size: 0.9em;}
351 table.cal td p.day-num {font-size: 1.1em; text-align:right;}
351 table.cal td p.day-num {font-size: 1.1em; text-align:right;}
352 table.cal td.odd p.day-num {color: #bbb;}
352 table.cal td.odd p.day-num {color: #bbb;}
353 table.cal td.today {background:#ffffdd;}
353 table.cal td.today {background:#ffffdd;}
354 table.cal td.today p.day-num {font-weight: bold;}
354 table.cal td.today p.day-num {font-weight: bold;}
355
355
356 /***** Tooltips ******/
356 /***** Tooltips ******/
357 .tooltip{position:relative;z-index:24;}
357 .tooltip{position:relative;z-index:24;}
358 .tooltip:hover{z-index:25;color:#000;}
358 .tooltip:hover{z-index:25;color:#000;}
359 .tooltip span.tip{display: none; text-align:left;}
359 .tooltip span.tip{display: none; text-align:left;}
360
360
361 div.tooltip:hover span.tip{
361 div.tooltip:hover span.tip{
362 display:block;
362 display:block;
363 position:absolute;
363 position:absolute;
364 top:12px; left:24px; width:270px;
364 top:12px; left:24px; width:270px;
365 border:1px solid #555;
365 border:1px solid #555;
366 background-color:#fff;
366 background-color:#fff;
367 padding: 4px;
367 padding: 4px;
368 font-size: 0.8em;
368 font-size: 0.8em;
369 color:#505050;
369 color:#505050;
370 }
370 }
371
371
372 /***** Progress bar *****/
372 /***** Progress bar *****/
373 table.progress {
373 table.progress {
374 border: 1px solid #D7D7D7;
374 border: 1px solid #D7D7D7;
375 border-collapse: collapse;
375 border-collapse: collapse;
376 border-spacing: 0pt;
376 border-spacing: 0pt;
377 empty-cells: show;
377 empty-cells: show;
378 text-align: center;
378 text-align: center;
379 float:left;
379 float:left;
380 margin: 1px 6px 1px 0px;
380 margin: 1px 6px 1px 0px;
381 }
381 }
382
382
383 table.progress td { height: 0.9em; }
383 table.progress td { height: 0.9em; }
384 table.progress td.closed { background: #BAE0BA none repeat scroll 0%; }
384 table.progress td.closed { background: #BAE0BA none repeat scroll 0%; }
385 table.progress td.done { background: #DEF0DE none repeat scroll 0%; }
385 table.progress td.done { background: #DEF0DE none repeat scroll 0%; }
386 table.progress td.open { background: #FFF none repeat scroll 0%; }
386 table.progress td.open { background: #FFF none repeat scroll 0%; }
387 p.pourcent {font-size: 80%;}
387 p.pourcent {font-size: 80%;}
388 p.progress-info {clear: left; font-style: italic; font-size: 80%;}
388 p.progress-info {clear: left; font-style: italic; font-size: 80%;}
389
389
390 /***** Tabs *****/
390 /***** Tabs *****/
391 #content .tabs {height: 2.6em; border-bottom: 1px solid #bbbbbb; margin-bottom:1.2em; position:relative;}
391 #content .tabs {height: 2.6em; border-bottom: 1px solid #bbbbbb; margin-bottom:1.2em; position:relative;}
392 #content .tabs ul {margin:0; position:absolute; bottom:-2px; padding-left:1em;}
392 #content .tabs ul {margin:0; position:absolute; bottom:-2px; padding-left:1em;}
393 #content .tabs>ul { bottom:-1px; } /* others */
393 #content .tabs>ul { bottom:-1px; } /* others */
394 #content .tabs ul li {
394 #content .tabs ul li {
395 float:left;
395 float:left;
396 list-style-type:none;
396 list-style-type:none;
397 white-space:nowrap;
397 white-space:nowrap;
398 margin-right:8px;
398 margin-right:8px;
399 background:#fff;
399 background:#fff;
400 }
400 }
401 #content .tabs ul li a{
401 #content .tabs ul li a{
402 display:block;
402 display:block;
403 font-size: 0.9em;
403 font-size: 0.9em;
404 text-decoration:none;
404 text-decoration:none;
405 line-height:1.3em;
405 line-height:1.3em;
406 padding:4px 6px 4px 6px;
406 padding:4px 6px 4px 6px;
407 border: 1px solid #ccc;
407 border: 1px solid #ccc;
408 border-bottom: 1px solid #bbbbbb;
408 border-bottom: 1px solid #bbbbbb;
409 background-color: #eeeeee;
409 background-color: #eeeeee;
410 color:#777;
410 color:#777;
411 font-weight:bold;
411 font-weight:bold;
412 }
412 }
413
413
414 #content .tabs ul li a:hover {
414 #content .tabs ul li a:hover {
415 background-color: #ffffdd;
415 background-color: #ffffdd;
416 text-decoration:none;
416 text-decoration:none;
417 }
417 }
418
418
419 #content .tabs ul li a.selected {
419 #content .tabs ul li a.selected {
420 background-color: #fff;
420 background-color: #fff;
421 border: 1px solid #bbbbbb;
421 border: 1px solid #bbbbbb;
422 border-bottom: 1px solid #fff;
422 border-bottom: 1px solid #fff;
423 }
423 }
424
424
425 #content .tabs ul li a.selected:hover {
425 #content .tabs ul li a.selected:hover {
426 background-color: #fff;
426 background-color: #fff;
427 }
427 }
428
428
429 /***** Diff *****/
429 /***** Diff *****/
430 .diff_out { background: #fcc; }
430 .diff_out { background: #fcc; }
431 .diff_in { background: #cfc; }
431 .diff_in { background: #cfc; }
432
432
433 /***** Wiki *****/
433 /***** Wiki *****/
434 div.wiki table {
434 div.wiki table {
435 border: 1px solid #505050;
435 border: 1px solid #505050;
436 border-collapse: collapse;
436 border-collapse: collapse;
437 margin-bottom: 1em;
437 margin-bottom: 1em;
438 }
438 }
439
439
440 div.wiki table, div.wiki td, div.wiki th {
440 div.wiki table, div.wiki td, div.wiki th {
441 border: 1px solid #bbb;
441 border: 1px solid #bbb;
442 padding: 4px;
442 padding: 4px;
443 }
443 }
444
444
445 div.wiki .external {
445 div.wiki .external {
446 background-position: 0% 60%;
446 background-position: 0% 60%;
447 background-repeat: no-repeat;
447 background-repeat: no-repeat;
448 padding-left: 12px;
448 padding-left: 12px;
449 background-image: url(../images/external.png);
449 background-image: url(../images/external.png);
450 }
450 }
451
451
452 div.wiki a.new {
452 div.wiki a.new {
453 color: #b73535;
453 color: #b73535;
454 }
454 }
455
455
456 div.wiki pre {
456 div.wiki pre {
457 margin: 1em 1em 1em 1.6em;
457 margin: 1em 1em 1em 1.6em;
458 padding: 2px;
458 padding: 2px;
459 background-color: #fafafa;
459 background-color: #fafafa;
460 border: 1px solid #dadada;
460 border: 1px solid #dadada;
461 width:95%;
461 width:95%;
462 overflow-x: auto;
462 overflow-x: auto;
463 }
463 }
464
464
465 div.wiki ul.toc {
465 div.wiki ul.toc {
466 background-color: #ffffdd;
466 background-color: #ffffdd;
467 border: 1px solid #e4e4e4;
467 border: 1px solid #e4e4e4;
468 padding: 4px;
468 padding: 4px;
469 line-height: 1.2em;
469 line-height: 1.2em;
470 margin-bottom: 12px;
470 margin-bottom: 12px;
471 margin-right: 12px;
471 margin-right: 12px;
472 margin-left: 0;
472 margin-left: 0;
473 display: table
473 display: table
474 }
474 }
475 * html div.wiki ul.toc { width: 50%; } /* IE6 doesn't autosize div */
475 * html div.wiki ul.toc { width: 50%; } /* IE6 doesn't autosize div */
476
476
477 div.wiki ul.toc.right { float: right; margin-left: 12px; margin-right: 0; width: auto; }
477 div.wiki ul.toc.right { float: right; margin-left: 12px; margin-right: 0; width: auto; }
478 div.wiki ul.toc.left { float: left; margin-right: 12px; margin-left: 0; width: auto; }
478 div.wiki ul.toc.left { float: left; margin-right: 12px; margin-left: 0; width: auto; }
479 div.wiki ul.toc li { list-style-type:none;}
479 div.wiki ul.toc li { list-style-type:none;}
480 div.wiki ul.toc li.heading2 { margin-left: 6px; }
480 div.wiki ul.toc li.heading2 { margin-left: 6px; }
481 div.wiki ul.toc li.heading3 { margin-left: 12px; font-size: 0.8em; }
481 div.wiki ul.toc li.heading3 { margin-left: 12px; font-size: 0.8em; }
482
482
483 div.wiki ul.toc a {
483 div.wiki ul.toc a {
484 font-size: 0.9em;
484 font-size: 0.9em;
485 font-weight: normal;
485 font-weight: normal;
486 text-decoration: none;
486 text-decoration: none;
487 color: #606060;
487 color: #606060;
488 }
488 }
489 div.wiki ul.toc a:hover { color: #c61a1a; text-decoration: underline;}
489 div.wiki ul.toc a:hover { color: #c61a1a; text-decoration: underline;}
490
490
491 a.wiki-anchor { display: none; margin-left: 6px; text-decoration: none; }
491 a.wiki-anchor { display: none; margin-left: 6px; text-decoration: none; }
492 a.wiki-anchor:hover { color: #aaa !important; text-decoration: none; }
492 a.wiki-anchor:hover { color: #aaa !important; text-decoration: none; }
493 h1:hover a.wiki-anchor, h2:hover a.wiki-anchor, h3:hover a.wiki-anchor { display: inline; color: #ddd; }
493 h1:hover a.wiki-anchor, h2:hover a.wiki-anchor, h3:hover a.wiki-anchor { display: inline; color: #ddd; }
494
494
495 /***** My page layout *****/
495 /***** My page layout *****/
496 .block-receiver {
496 .block-receiver {
497 border:1px dashed #c0c0c0;
497 border:1px dashed #c0c0c0;
498 margin-bottom: 20px;
498 margin-bottom: 20px;
499 padding: 15px 0 15px 0;
499 padding: 15px 0 15px 0;
500 }
500 }
501
501
502 .mypage-box {
502 .mypage-box {
503 margin:0 0 20px 0;
503 margin:0 0 20px 0;
504 color:#505050;
504 color:#505050;
505 line-height:1.5em;
505 line-height:1.5em;
506 }
506 }
507
507
508 .handle {
508 .handle {
509 cursor: move;
509 cursor: move;
510 }
510 }
511
511
512 a.close-icon {
512 a.close-icon {
513 display:block;
513 display:block;
514 margin-top:3px;
514 margin-top:3px;
515 overflow:hidden;
515 overflow:hidden;
516 width:12px;
516 width:12px;
517 height:12px;
517 height:12px;
518 background-repeat: no-repeat;
518 background-repeat: no-repeat;
519 cursor:pointer;
519 cursor:pointer;
520 background-image:url('../images/close.png');
520 background-image:url('../images/close.png');
521 }
521 }
522
522
523 a.close-icon:hover {
523 a.close-icon:hover {
524 background-image:url('../images/close_hl.png');
524 background-image:url('../images/close_hl.png');
525 }
525 }
526
526
527 /***** Gantt chart *****/
527 /***** Gantt chart *****/
528 .gantt_hdr {
528 .gantt_hdr {
529 position:absolute;
529 position:absolute;
530 top:0;
530 top:0;
531 height:16px;
531 height:16px;
532 border-top: 1px solid #c0c0c0;
532 border-top: 1px solid #c0c0c0;
533 border-bottom: 1px solid #c0c0c0;
533 border-bottom: 1px solid #c0c0c0;
534 border-right: 1px solid #c0c0c0;
534 border-right: 1px solid #c0c0c0;
535 text-align: center;
535 text-align: center;
536 overflow: hidden;
536 overflow: hidden;
537 }
537 }
538
538
539 .task {
539 .task {
540 position: absolute;
540 position: absolute;
541 height:8px;
541 height:8px;
542 font-size:0.8em;
542 font-size:0.8em;
543 color:#888;
543 color:#888;
544 padding:0;
544 padding:0;
545 margin:0;
545 margin:0;
546 line-height:0.8em;
546 line-height:0.8em;
547 }
547 }
548
548
549 .task_late { background:#f66 url(../images/task_late.png); border: 1px solid #f66; }
549 .task_late { background:#f66 url(../images/task_late.png); border: 1px solid #f66; }
550 .task_done { background:#66f url(../images/task_done.png); border: 1px solid #66f; }
550 .task_done { background:#66f url(../images/task_done.png); border: 1px solid #66f; }
551 .task_todo { background:#aaa url(../images/task_todo.png); border: 1px solid #aaa; }
551 .task_todo { background:#aaa url(../images/task_todo.png); border: 1px solid #aaa; }
552 .milestone { background-image:url(../images/milestone.png); background-repeat: no-repeat; border: 0; }
552 .milestone { background-image:url(../images/milestone.png); background-repeat: no-repeat; border: 0; }
553
553
554 /***** Icons *****/
554 /***** Icons *****/
555 .icon {
555 .icon {
556 background-position: 0% 40%;
556 background-position: 0% 40%;
557 background-repeat: no-repeat;
557 background-repeat: no-repeat;
558 padding-left: 20px;
558 padding-left: 20px;
559 padding-top: 2px;
559 padding-top: 2px;
560 padding-bottom: 3px;
560 padding-bottom: 3px;
561 }
561 }
562
562
563 .icon22 {
563 .icon22 {
564 background-position: 0% 40%;
564 background-position: 0% 40%;
565 background-repeat: no-repeat;
565 background-repeat: no-repeat;
566 padding-left: 26px;
566 padding-left: 26px;
567 line-height: 22px;
567 line-height: 22px;
568 vertical-align: middle;
568 vertical-align: middle;
569 }
569 }
570
570
571 .icon-add { background-image: url(../images/add.png); }
571 .icon-add { background-image: url(../images/add.png); }
572 .icon-edit { background-image: url(../images/edit.png); }
572 .icon-edit { background-image: url(../images/edit.png); }
573 .icon-copy { background-image: url(../images/copy.png); }
573 .icon-copy { background-image: url(../images/copy.png); }
574 .icon-del { background-image: url(../images/delete.png); }
574 .icon-del { background-image: url(../images/delete.png); }
575 .icon-move { background-image: url(../images/move.png); }
575 .icon-move { background-image: url(../images/move.png); }
576 .icon-save { background-image: url(../images/save.png); }
576 .icon-save { background-image: url(../images/save.png); }
577 .icon-cancel { background-image: url(../images/cancel.png); }
577 .icon-cancel { background-image: url(../images/cancel.png); }
578 .icon-file { background-image: url(../images/file.png); }
578 .icon-file { background-image: url(../images/file.png); }
579 .icon-folder { background-image: url(../images/folder.png); }
579 .icon-folder { background-image: url(../images/folder.png); }
580 .open .icon-folder { background-image: url(../images/folder_open.png); }
580 .open .icon-folder { background-image: url(../images/folder_open.png); }
581 .icon-package { background-image: url(../images/package.png); }
581 .icon-package { background-image: url(../images/package.png); }
582 .icon-home { background-image: url(../images/home.png); }
582 .icon-home { background-image: url(../images/home.png); }
583 .icon-user { background-image: url(../images/user.png); }
583 .icon-user { background-image: url(../images/user.png); }
584 .icon-mypage { background-image: url(../images/user_page.png); }
584 .icon-mypage { background-image: url(../images/user_page.png); }
585 .icon-admin { background-image: url(../images/admin.png); }
585 .icon-admin { background-image: url(../images/admin.png); }
586 .icon-projects { background-image: url(../images/projects.png); }
586 .icon-projects { background-image: url(../images/projects.png); }
587 .icon-help { background-image: url(../images/help.png); }
587 .icon-help { background-image: url(../images/help.png); }
588 .icon-attachment { background-image: url(../images/attachment.png); }
588 .icon-attachment { background-image: url(../images/attachment.png); }
589 .icon-index { background-image: url(../images/index.png); }
589 .icon-index { background-image: url(../images/index.png); }
590 .icon-history { background-image: url(../images/history.png); }
590 .icon-history { background-image: url(../images/history.png); }
591 .icon-time { background-image: url(../images/time.png); }
591 .icon-time { background-image: url(../images/time.png); }
592 .icon-stats { background-image: url(../images/stats.png); }
592 .icon-stats { background-image: url(../images/stats.png); }
593 .icon-warning { background-image: url(../images/warning.png); }
593 .icon-warning { background-image: url(../images/warning.png); }
594 .icon-fav { background-image: url(../images/fav.png); }
594 .icon-fav { background-image: url(../images/fav.png); }
595 .icon-fav-off { background-image: url(../images/fav_off.png); }
595 .icon-fav-off { background-image: url(../images/fav_off.png); }
596 .icon-reload { background-image: url(../images/reload.png); }
596 .icon-reload { background-image: url(../images/reload.png); }
597 .icon-lock { background-image: url(../images/locked.png); }
597 .icon-lock { background-image: url(../images/locked.png); }
598 .icon-unlock { background-image: url(../images/unlock.png); }
598 .icon-unlock { background-image: url(../images/unlock.png); }
599 .icon-checked { background-image: url(../images/true.png); }
599 .icon-checked { background-image: url(../images/true.png); }
600 .icon-details { background-image: url(../images/zoom_in.png); }
600 .icon-details { background-image: url(../images/zoom_in.png); }
601 .icon-report { background-image: url(../images/report.png); }
601 .icon-report { background-image: url(../images/report.png); }
602 .icon-comment { background-image: url(../images/comment.png); }
602 .icon-comment { background-image: url(../images/comment.png); }
603
603
604 .icon22-projects { background-image: url(../images/22x22/projects.png); }
604 .icon22-projects { background-image: url(../images/22x22/projects.png); }
605 .icon22-users { background-image: url(../images/22x22/users.png); }
605 .icon22-users { background-image: url(../images/22x22/users.png); }
606 .icon22-tracker { background-image: url(../images/22x22/tracker.png); }
606 .icon22-tracker { background-image: url(../images/22x22/tracker.png); }
607 .icon22-role { background-image: url(../images/22x22/role.png); }
607 .icon22-role { background-image: url(../images/22x22/role.png); }
608 .icon22-workflow { background-image: url(../images/22x22/workflow.png); }
608 .icon22-workflow { background-image: url(../images/22x22/workflow.png); }
609 .icon22-options { background-image: url(../images/22x22/options.png); }
609 .icon22-options { background-image: url(../images/22x22/options.png); }
610 .icon22-notifications { background-image: url(../images/22x22/notifications.png); }
610 .icon22-notifications { background-image: url(../images/22x22/notifications.png); }
611 .icon22-authent { background-image: url(../images/22x22/authent.png); }
611 .icon22-authent { background-image: url(../images/22x22/authent.png); }
612 .icon22-info { background-image: url(../images/22x22/info.png); }
612 .icon22-info { background-image: url(../images/22x22/info.png); }
613 .icon22-comment { background-image: url(../images/22x22/comment.png); }
613 .icon22-comment { background-image: url(../images/22x22/comment.png); }
614 .icon22-package { background-image: url(../images/22x22/package.png); }
614 .icon22-package { background-image: url(../images/22x22/package.png); }
615 .icon22-settings { background-image: url(../images/22x22/settings.png); }
615 .icon22-settings { background-image: url(../images/22x22/settings.png); }
616 .icon22-plugin { background-image: url(../images/22x22/plugin.png); }
616 .icon22-plugin { background-image: url(../images/22x22/plugin.png); }
617
617
618 img.gravatar {
619 padding: 2px;
620 border: solid 1px #d5d5d5;
621 background: #fff;
622 }
623
624 div.issue img.gravatar {
625 float: right;
626 margin: 0 0 1em 1em;
627 padding: 5px;
628 }
629
630 div.issue table img.gravatar {
631 height: 24px;
632 width: 24px;
633 padding: 2px;
634 float: left;
635 margin: 0 1em 0 0;
636 }
637
638 #history img.gravatar {
639 padding: 3px;
640 margin: 0 2em 1em 0;
641 float: left;
642 }
643
644 td.username img.gravatar {
645 float: left;
646 margin: 0 1em 0 0;
647 }
648
649 #activity dt img.gravatar {
650 float: left;
651 margin: 0 1em 1em 0;
652 }
653
618 /***** Media print specific styles *****/
654 /***** Media print specific styles *****/
619 @media print {
655 @media print {
620 #top-menu, #header, #main-menu, #sidebar, #footer, .contextual, .other-formats { display:none; }
656 #top-menu, #header, #main-menu, #sidebar, #footer, .contextual, .other-formats { display:none; }
621 #main { background: #fff; }
657 #main { background: #fff; }
622 #content { width: 99%; margin: 0; padding: 0; border: 0; background: #fff; }
658 #content { width: 99%; margin: 0; padding: 0; border: 0; background: #fff; }
623 }
659 }
General Comments 0
You need to be logged in to leave comments. Login now