##// 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 1 <% reply_links = authorize_for('issues', 'edit') -%>
2 2 <% for journal in journals %>
3 <div id="change-<%= journal.id %>" class="journal">
4 <h4><div style="float:right;"><%= link_to "##{journal.indice}", :anchor => "note-#{journal.indice}" %></div>
5 <%= content_tag('a', '', :name => "note-#{journal.indice}")%>
6 <%= format_time(journal.created_on) %> - <%= journal.user.name %></h4>
7 <ul>
8 <% for detail in journal.details %>
9 <li><%= show_detail(detail) %></li>
10 <% end %>
11 </ul>
12 <%= render_notes(journal, :reply_links => reply_links) unless journal.notes.blank? %>
13 </div>
3 <div id="change-<%= journal.id %>" class="journal">
4 <%= gravatar(journal.user.mail.blank? ? "" : journal.user.mail, :size => "48") %>
5 <h4><div style="float:right;"><%= link_to "##{journal.indice}", :anchor => "note-#{journal.indice}" %></div>
6 <%= content_tag('a', '', :name => "note-#{journal.indice}")%>
7 <%= format_time(journal.created_on) %> - <%= journal.user.name %></h4>
8 <ul>
9 <% for detail in journal.details %>
10 <li><%= show_detail(detail) %></li>
11 <% end %>
12 </ul>
13 <%= render_notes(journal, :reply_links => reply_links) unless journal.notes.blank? %>
14 </div>
14 15 <% end %>
@@ -1,127 +1,128
1 1 <div class="contextual">
2 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 3 <%= link_to_if_authorized l(:button_log_time), {:controller => 'timelog', :action => 'edit', :issue_id => @issue}, :class => 'icon icon-time' %>
4 4 <%= watcher_tag(@issue, User.current) %>
5 5 <%= link_to_if_authorized l(:button_copy), {:controller => 'issues', :action => 'new', :project_id => @project, :copy_from => @issue }, :class => 'icon icon-copy' %>
6 6 <%= link_to_if_authorized l(:button_move), {:controller => 'issues', :action => 'move', :id => @issue }, :class => 'icon icon-move' %>
7 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 8 </div>
9 9
10 10 <h2><%= @issue.tracker.name %> #<%= @issue.id %></h2>
11 11
12 12 <div class="issue <%= "status-#{@issue.status.position} priority-#{@issue.priority.position}" %>">
13 <%= gravatar(@issue.author.mail, :size => "64") %>
13 14 <h3><%=h @issue.subject %></h3>
14 15 <p class="author">
15 16 <%= authoring @issue.created_on, @issue.author %>.
16 17 <%= l(:label_updated_time, distance_of_time_in_words(Time.now, @issue.updated_on)) + '.' if @issue.created_on != @issue.updated_on %>
17 18 </p>
18 19
19 20 <table width="100%">
20 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%"><b><%=l(:field_start_date)%>:</b></td><td style="width:35%"><%= format_date(@issue.start_date) %></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>
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 24 </tr>
24 25 <tr>
25 <td><b><%=l(:field_priority)%>:</b></td><td><%= @issue.priority.name %></td>
26 <td><b><%=l(:field_due_date)%>:</b></td><td><%= format_date(@issue.due_date) %></td>
26 <td class="priority"><b><%=l(:field_priority)%>:</b></td><td class="priority priority-<%= @issue.priority.name %>"><%= @issue.priority.name %></td>
27 <td class="due-date"><b><%=l(:field_due_date)%>:</b></td><td class="due-date"><%= format_date(@issue.due_date) %></td>
27 28 </tr>
28 29 <tr>
29 <td><b><%=l(:field_assigned_to)%>:</b></td><td><%= @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>
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>
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 32 </tr>
32 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 35 <% if User.current.allowed_to?(:view_time_entries, @project) %>
35 <td><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>
36 <td class="spent-time"><b><%=l(:label_spent_time)%>:</b></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 38 <% end %>
38 39 </tr>
39 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 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 44 <% end %>
44 45 </tr>
45 46 <tr>
46 47 <% n = 0 -%>
47 48 <% @issue.custom_values.each do |value| -%>
48 49 <td valign="top"><b><%=h value.custom_field.name %>:</b></td><td valign="top"><%= simple_format(h(show_value(value))) %></td>
49 50 <% n = n + 1
50 51 if (n > 1)
51 52 n = 0 %>
52 53 </tr><tr>
53 54 <%end
54 55 end %>
55 56 </tr>
56 57 <%= call_hook(:view_issues_show_details_bottom, :issue => @issue) %>
57 58 </table>
58 59 <hr />
59 60
60 61 <div class="contextual">
61 62 <%= link_to_remote_if_authorized l(:button_quote), { :url => {:action => 'reply', :id => @issue} }, :class => 'icon icon-comment' %>
62 63 </div>
63 64
64 65 <p><strong><%=l(:field_description)%></strong></p>
65 66 <div class="wiki">
66 67 <%= textilizable @issue, :description, :attachments => @issue.attachments %>
67 68 </div>
68 69
69 70 <% if @issue.attachments.any? %>
70 71 <%= link_to_attachments @issue.attachments, :delete_url => (authorize_for('issues', 'destroy_attachment') ? {:controller => 'issues', :action => 'destroy_attachment', :id => @issue} : nil) %>
71 72 <% end %>
72 73
73 74 <% if authorize_for('issue_relations', 'new') || @issue.relations.any? %>
74 75 <hr />
75 76 <div id="relations">
76 77 <%= render :partial => 'relations' %>
77 78 </div>
78 79 <% end %>
79 80
80 81 <% if User.current.allowed_to?(:add_issue_watchers, @project) ||
81 82 (@issue.watchers.any? && User.current.allowed_to?(:view_issue_watchers, @project)) %>
82 83 <hr />
83 84 <div id="watchers">
84 85 <%= render :partial => 'watchers/watchers', :locals => {:watched => @issue} %>
85 86 </div>
86 87 <% end %>
87 88
88 89 </div>
89 90
90 91 <% if @issue.changesets.any? && User.current.allowed_to?(:view_changesets, @project) %>
91 92 <div id="issue-changesets">
92 93 <h3><%=l(:label_associated_revisions)%></h3>
93 94 <%= render :partial => 'changesets', :locals => { :changesets => @issue.changesets} %>
94 95 </div>
95 96 <% end %>
96 97
97 98 <% if @journals.any? %>
98 99 <div id="history">
99 100 <h3><%=l(:label_history)%></h3>
100 101 <%= render :partial => 'history', :locals => { :journals => @journals } %>
101 102 </div>
102 103 <% end %>
103 104 <div style="clear: both;"></div>
104 105
105 106 <% if authorize_for('issues', 'edit') %>
106 107 <div id="update" style="display:none;">
107 108 <h3><%= l(:button_update) %></h3>
108 109 <%= render :partial => 'edit' %>
109 110 </div>
110 111 <% end %>
111 112
112 113 <p class="other-formats">
113 114 <%= l(:label_export_to) %>
114 115 <span><%= link_to 'Atom', {:format => 'atom', :key => User.current.rss_key}, :class => 'feed' %></span>
115 116 <span><%= link_to 'PDF', {:format => 'pdf'}, :class => 'pdf' %></span>
116 117 </p>
117 118
118 119 <% html_title "#{@issue.tracker.name} ##{@issue.id}: #{@issue.subject}" %>
119 120
120 121 <% content_for :sidebar do %>
121 122 <%= render :partial => 'issues/sidebar' %>
122 123 <% end %>
123 124
124 125 <% content_for :header_tags do %>
125 126 <%= auto_discovery_link_tag(:atom, {:format => 'atom', :key => User.current.rss_key}, :title => "#{@issue.project} - #{@issue.tracker} ##{@issue.id}: #{@issue.subject}") %>
126 127 <%= stylesheet_link_tag 'scm' %>
127 128 <% end %>
@@ -1,58 +1,61
1 1 <h2><%= l(:label_activity) %></h2>
2 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 4 <div id="activity">
5 5 <% @events_by_day.keys.sort.reverse.each do |day| %>
6 6 <h3><%= format_activity_day(day) %></h3>
7 7 <dl>
8 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 13 <span class="time"><%= format_time(e.event_datetime, false) %></span>
11 14 <%= content_tag('span', h(e.project), :class => 'project') if @project.nil? || @project != e.project %>
12 15 <%= link_to format_activity_title(e.event_title), e.event_url %></dt>
13 16 <dd><span class="description"><%= format_activity_description(e.event_description) %></span>
14 17 <span class="author"><%= e.event_author if e.respond_to?(:event_author) %></span></dd>
15 18 <% end -%>
16 19 </dl>
17 20 <% end -%>
18 21 </div>
19 22
20 23 <%= content_tag('p', l(:label_no_data), :class => 'nodata') if @events_by_day.empty? %>
21 24
22 25 <div style="float:left;">
23 26 <%= link_to_remote(('&#171; ' + l(:label_previous)),
24 27 {:update => "content", :url => params.merge(:from => @date_to - @days), :complete => 'window.scrollTo(0,0)'},
25 28 {:href => url_for(params.merge(:from => @date_to - @days)),
26 29 :title => "#{l(:label_date_from)} #{format_date(@date_to - 2*@days)} #{l(:label_date_to).downcase} #{format_date(@date_to - @days - 1)}"}) %>
27 30 </div>
28 31 <div style="float:right;">
29 32 <%= link_to_remote((l(:label_next) + ' &#187;'),
30 33 {:update => "content", :url => params.merge(:from => @date_to + @days), :complete => 'window.scrollTo(0,0)'},
31 34 {:href => url_for(params.merge(:from => @date_to + @days)),
32 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 36 </div>
34 37 &nbsp;
35 38 <p class="other-formats">
36 39 <%= l(:label_export_to) %>
37 40 <%= link_to 'Atom', params.merge(:format => :atom, :key => User.current.rss_key).delete_if{|k,v|k=="commit"}, :class => 'feed' %>
38 41 </p>
39 42
40 43 <% content_for :header_tags do %>
41 44 <%= auto_discovery_link_tag(:atom, params.merge(:format => 'atom', :year => nil, :month => nil, :key => User.current.rss_key)) %>
42 45 <% end %>
43 46
44 47 <% content_for :sidebar do %>
45 48 <% form_tag({}, :method => :get) do %>
46 49 <h3><%= l(:label_activity) %></h3>
47 50 <p><% @activity.event_types.each do |t| %>
48 51 <label><%= check_box_tag "show_#{t}", 1, @activity.scope.include?(t) %> <%= l("label_#{t.singularize}_plural")%></label><br />
49 52 <% end %></p>
50 53 <% if @project && @project.active_children.any? %>
51 54 <p><label><%= check_box_tag 'with_subprojects', 1, @with_subprojects %> <%=l(:label_subproject_plural)%></label></p>
52 55 <%= hidden_field_tag 'with_subprojects', 0 %>
53 56 <% end %>
54 57 <p><%= submit_tag l(:button_apply), :class => 'button-small', :name => nil %></p>
55 58 <% end %>
56 59 <% end %>
57 60
58 61 <% html_title(l(:label_activity)) -%>
@@ -1,47 +1,47
1 1 <div class="contextual">
2 2 <%= link_to l(:label_user_new), {:action => 'add'}, :class => 'icon icon-add' %>
3 3 </div>
4 4
5 5 <h2><%=l(:label_user_plural)%></h2>
6 6
7 7 <% form_tag({}, :method => :get) do %>
8 8 <fieldset><legend><%= l(:label_filter_plural) %></legend>
9 9 <label><%= l(:field_status) %>:</label>
10 10 <%= select_tag 'status', users_status_options_for_select(@status), :class => "small", :onchange => "this.form.submit(); return false;" %>
11 11 <label><%= l(:label_user) %>:</label>
12 12 <%= text_field_tag 'name', params[:name], :size => 30 %>
13 13 <%= submit_tag l(:button_apply), :class => "small", :name => nil %>
14 14 </fieldset>
15 15 <% end %>
16 16 &nbsp;
17 17
18 18 <table class="list">
19 19 <thead><tr>
20 20 <%= sort_header_tag('login', :caption => l(:field_login)) %>
21 21 <%= sort_header_tag('firstname', :caption => l(:field_firstname)) %>
22 22 <%= sort_header_tag('lastname', :caption => l(:field_lastname)) %>
23 23 <%= sort_header_tag('mail', :caption => l(:field_mail)) %>
24 24 <%= sort_header_tag('admin', :caption => l(:field_admin), :default_order => 'desc') %>
25 25 <%= sort_header_tag('created_on', :caption => l(:field_created_on), :default_order => 'desc') %>
26 26 <%= sort_header_tag('last_login_on', :caption => l(:field_last_login_on), :default_order => 'desc') %>
27 27 <th></th>
28 28 </tr></thead>
29 29 <tbody>
30 30 <% for user in @users -%>
31 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 33 <td class="firstname"><%= h(user.firstname) %></td>
34 34 <td class="lastname"><%= h(user.lastname) %></td>
35 35 <td class="email"><%= mail_to(h(user.mail)) %></td>
36 36 <td align="center"><%= image_tag('true.png') if user.admin? %></td>
37 37 <td class="created_on" align="center"><%= format_time(user.created_on) %></td>
38 38 <td class="last_login_on" align="center"><%= format_time(user.last_login_on) unless user.last_login_on.nil? %></td>
39 39 <td><small><%= change_status_link(user) %></small></td>
40 40 </tr>
41 41 <% end -%>
42 42 </tbody>
43 43 </table>
44 44
45 45 <p class="pagination"><%= pagination_links_full @user_pages, @user_count %></p>
46 46
47 47 <% html_title(l(:label_user_plural)) -%>
@@ -1,623 +1,659
1 1 body { font-family: Verdana, sans-serif; font-size: 12px; color:#484848; margin: 0; padding: 0; min-width: 900px; }
2 2
3 3 h1, h2, h3, h4 { font-family: "Trebuchet MS", Verdana, sans-serif;}
4 4 h1 {margin:0; padding:0; font-size: 24px;}
5 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 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 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 9 /***** Layout *****/
10 10 #wrapper {background: white;}
11 11
12 12 #top-menu {background: #2C4056; color: #fff; height:1.8em; font-size: 0.8em; padding: 2px 2px 0px 6px;}
13 13 #top-menu ul {margin: 0; padding: 0;}
14 14 #top-menu li {
15 15 float:left;
16 16 list-style-type:none;
17 17 margin: 0px 0px 0px 0px;
18 18 padding: 0px 0px 0px 0px;
19 19 white-space:nowrap;
20 20 }
21 21 #top-menu a {color: #fff; padding-right: 8px; font-weight: bold;}
22 22 #top-menu #loggedas { float: right; margin-right: 0.5em; color: #fff; }
23 23
24 24 #account {float:right;}
25 25
26 26 #header {height:5.3em;margin:0;background-color:#507AAA;color:#f8f8f8; padding: 4px 8px 0px 6px; position:relative;}
27 27 #header a {color:#f8f8f8;}
28 28 #quick-search {float:right;}
29 29
30 30 #main-menu {position: absolute; bottom: 0px; left:6px; margin-right: -500px;}
31 31 #main-menu ul {margin: 0; padding: 0;}
32 32 #main-menu li {
33 33 float:left;
34 34 list-style-type:none;
35 35 margin: 0px 2px 0px 0px;
36 36 padding: 0px 0px 0px 0px;
37 37 white-space:nowrap;
38 38 }
39 39 #main-menu li a {
40 40 display: block;
41 41 color: #fff;
42 42 text-decoration: none;
43 43 font-weight: bold;
44 44 margin: 0;
45 45 padding: 4px 10px 4px 10px;
46 46 }
47 47 #main-menu li a:hover {background:#759FCF; color:#fff;}
48 48 #main-menu li a.selected, #main-menu li a.selected:hover {background:#fff; color:#555;}
49 49
50 50 #main {background-color:#EEEEEE;}
51 51
52 52 #sidebar{ float: right; width: 17%; position: relative; z-index: 9; min-height: 600px; padding: 0; margin: 0;}
53 53 * html #sidebar{ width: 17%; }
54 54 #sidebar h3{ font-size: 14px; margin-top:14px; color: #666; }
55 55 #sidebar hr{ width: 100%; margin: 0 auto; height: 1px; background: #ccc; border: 0; }
56 56 * html #sidebar hr{ width: 95%; position: relative; left: -6px; color: #ccc; }
57 57
58 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 59 * html #content{ width: 80%; padding-left: 0; margin-top: 0px; padding: 6px 10px 10px 10px;}
60 60 html>body #content { height: auto; min-height: 600px; overflow: auto; }
61 61
62 62 #main.nosidebar #sidebar{ display: none; }
63 63 #main.nosidebar #content{ width: auto; border-right: 0; }
64 64
65 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 67 #login-form table {margin-top:5em; padding:1em; margin-left: auto; margin-right: auto; border: 2px solid #FDBF3B; background-color:#FFEBC1; }
68 68 #login-form table td {padding: 6px;}
69 69 #login-form label {font-weight: bold;}
70 70
71 71 .clear:after{ content: "."; display: block; height: 0; clear: both; visibility: hidden; }
72 72
73 73 /***** Links *****/
74 74 a, a:link, a:visited{ color: #2A5685; text-decoration: none; }
75 75 a:hover, a:active{ color: #c61a1a; text-decoration: underline;}
76 76 a img{ border: 0; }
77 77
78 78 a.issue.closed { text-decoration: line-through; }
79 79
80 80 /***** Tables *****/
81 81 table.list { border: 1px solid #e4e4e4; border-collapse: collapse; width: 100%; margin-bottom: 4px; }
82 82 table.list th { background-color:#EEEEEE; padding: 4px; white-space:nowrap; }
83 83 table.list td { vertical-align: top; }
84 84 table.list td.id { width: 2%; text-align: center;}
85 85 table.list td.checkbox { width: 15px; padding: 0px;}
86 86
87 87 tr.issue { text-align: center; white-space: nowrap; }
88 88 tr.issue td.subject, tr.issue td.category, td.assigned_to { white-space: normal; }
89 89 tr.issue td.subject { text-align: left; }
90 90 tr.issue td.done_ratio table.progress { margin-left:auto; margin-right: auto;}
91 91
92 92 tr.entry { border: 1px solid #f8f8f8; }
93 93 tr.entry td { white-space: nowrap; }
94 94 tr.entry td.filename { width: 30%; }
95 95 tr.entry td.size { text-align: right; font-size: 90%; }
96 96 tr.entry td.revision, tr.entry td.author { text-align: center; }
97 97 tr.entry td.age { text-align: right; }
98 98
99 99 tr.entry span.expander {background-image: url(../images/bullet_toggle_plus.png); padding-left: 8px; margin-left: 0; cursor: pointer;}
100 100 tr.entry.open span.expander {background-image: url(../images/bullet_toggle_minus.png);}
101 101 tr.entry.file td.filename a { margin-left: 16px; }
102 102
103 103 tr.changeset td.author { text-align: center; width: 15%; }
104 104 tr.changeset td.committed_on { text-align: center; width: 15%; }
105 105
106 106 tr.message { height: 2.6em; }
107 107 tr.message td.last_message { font-size: 80%; }
108 108 tr.message.locked td.subject a { background-image: url(../images/locked.png); }
109 109 tr.message.sticky td.subject a { background-image: url(../images/sticky.png); font-weight: bold; }
110 110
111 111 tr.user td { width:13%; }
112 112 tr.user td.email { width:18%; }
113 113 tr.user td { white-space: nowrap; }
114 114 tr.user.locked, tr.user.registered { color: #aaa; }
115 115 tr.user.locked a, tr.user.registered a { color: #aaa; }
116 116
117 117 tr.time-entry { text-align: center; white-space: nowrap; }
118 118 tr.time-entry td.subject, tr.time-entry td.comments { text-align: left; white-space: normal; }
119 119 td.hours { text-align: right; font-weight: bold; padding-right: 0.5em; }
120 120 td.hours .hours-dec { font-size: 0.9em; }
121 121
122 122 table.list tbody tr:hover { background-color:#ffffdd; }
123 123 table td {padding:2px;}
124 124 table p {margin:0;}
125 125 .odd {background-color:#f6f7f8;}
126 126 .even {background-color: #fff;}
127 127
128 128 .highlight { background-color: #FCFD8D;}
129 129 .highlight.token-1 { background-color: #faa;}
130 130 .highlight.token-2 { background-color: #afa;}
131 131 .highlight.token-3 { background-color: #aaf;}
132 132
133 133 .box{
134 134 padding:6px;
135 135 margin-bottom: 10px;
136 136 background-color:#f6f6f6;
137 137 color:#505050;
138 138 line-height:1.5em;
139 139 border: 1px solid #e4e4e4;
140 140 }
141 141
142 142 div.square {
143 143 border: 1px solid #999;
144 144 float: left;
145 145 margin: .3em .4em 0 .4em;
146 146 overflow: hidden;
147 147 width: .6em; height: .6em;
148 148 }
149 149 .contextual {float:right; white-space: nowrap; line-height:1.4em;margin-top:5px; padding-left: 10px; font-size:0.9em;}
150 150 .contextual input {font-size:0.9em;}
151 151
152 152 .splitcontentleft{float:left; width:49%;}
153 153 .splitcontentright{float:right; width:49%;}
154 154 form {display: inline;}
155 155 input, select {vertical-align: middle; margin-top: 1px; margin-bottom: 1px;}
156 156 fieldset {border: 1px solid #e4e4e4; margin:0;}
157 157 legend {color: #484848;}
158 158 hr { width: 100%; height: 1px; background: #ccc; border: 0;}
159 159 blockquote { font-style: italic; border-left: 3px solid #e0e0e0; padding-left: 0.6em; margin-left: 2.4em;}
160 160 blockquote blockquote { margin-left: 0;}
161 161 textarea.wiki-edit { width: 99%; }
162 162 li p {margin-top: 0;}
163 163 div.issue {background:#ffffdd; padding:6px; margin-bottom:6px;border: 1px solid #d7d7d7;}
164 164 p.breadcrumb { font-size: 0.9em; margin: 4px 0 4px 0;}
165 165 p.subtitle { font-size: 0.9em; margin: -6px 0 12px 0; font-style: italic; }
166 166 p.footnote { font-size: 0.9em; margin-top: 0px; margin-bottom: 0px; }
167 167
168 168 fieldset#filters, fieldset#date-range { padding: 0.7em; margin-bottom: 8px; }
169 169 fieldset#filters p { margin: 1.2em 0 0.8em 2px; }
170 170 fieldset#filters table { border-collapse: collapse; }
171 171 fieldset#filters table td { padding: 0; vertical-align: middle; }
172 172 fieldset#filters tr.filter { height: 2em; }
173 173 fieldset#filters td.add-filter { text-align: right; vertical-align: top; }
174 174 .buttons { font-size: 0.9em; }
175 175
176 176 div#issue-changesets {float:right; width:45%; margin-left: 1em; margin-bottom: 1em; background: #fff; padding-left: 1em; font-size: 90%;}
177 177 div#issue-changesets .changeset { padding: 4px;}
178 178 div#issue-changesets .changeset { border-bottom: 1px solid #ddd; }
179 179 div#issue-changesets p { margin-top: 0; margin-bottom: 1em;}
180 180
181 181 div#activity dl, #search-results { margin-left: 2em; }
182 182 div#activity dd, #search-results dd { margin-bottom: 1em; padding-left: 18px; font-size: 0.9em; }
183 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 184 div#activity dt.me .time { border-bottom: 1px solid #999; }
185 185 div#activity dt .time { color: #777; font-size: 80%; }
186 186 div#activity dd .description, #search-results dd .description { font-style: italic; }
187 187 div#activity span.project:after, #search-results span.project:after { content: " -"; }
188 188 div#activity dd span.description, #search-results dd span.description { display:block; }
189 189
190 190 #search-results dd { margin-bottom: 1em; padding-left: 20px; margin-left:0px; }
191 191 div#search-results-counts {float:right;}
192 192 div#search-results-counts ul { margin-top: 0.5em; }
193 193 div#search-results-counts li { list-style-type:none; float: left; margin-left: 1em; }
194 194
195 195 dt.issue { background-image: url(../images/ticket.png); }
196 196 dt.issue-edit { background-image: url(../images/ticket_edit.png); }
197 197 dt.issue-closed { background-image: url(../images/ticket_checked.png); }
198 198 dt.issue-note { background-image: url(../images/ticket_note.png); }
199 199 dt.changeset { background-image: url(../images/changeset.png); }
200 200 dt.news { background-image: url(../images/news.png); }
201 201 dt.message { background-image: url(../images/message.png); }
202 202 dt.reply { background-image: url(../images/comments.png); }
203 203 dt.wiki-page { background-image: url(../images/wiki_edit.png); }
204 204 dt.attachment { background-image: url(../images/attachment.png); }
205 205 dt.document { background-image: url(../images/document.png); }
206 206 dt.project { background-image: url(../images/projects.png); }
207 207
208 208 div#roadmap fieldset.related-issues { margin-bottom: 1em; }
209 209 div#roadmap fieldset.related-issues ul { margin-top: 0.3em; margin-bottom: 0.3em; }
210 210 div#roadmap .wiki h1:first-child { display: none; }
211 211 div#roadmap .wiki h1 { font-size: 120%; }
212 212 div#roadmap .wiki h2 { font-size: 110%; }
213 213
214 214 div#version-summary { float:right; width:380px; margin-left: 16px; margin-bottom: 16px; background-color: #fff; }
215 215 div#version-summary fieldset { margin-bottom: 1em; }
216 216 div#version-summary .total-hours { text-align: right; }
217 217
218 218 table#time-report td.hours, table#time-report th.period, table#time-report th.total { text-align: right; padding-right: 0.5em; }
219 219 table#time-report tbody tr { font-style: italic; color: #777; }
220 220 table#time-report tbody tr.last-level { font-style: normal; color: #555; }
221 221 table#time-report tbody tr.total { font-style: normal; font-weight: bold; color: #555; background-color:#EEEEEE; }
222 222 table#time-report .hours-dec { font-size: 0.9em; }
223 223
224 224 ul.properties {padding:0; font-size: 0.9em; color: #777;}
225 225 ul.properties li {list-style-type:none;}
226 226 ul.properties li span {font-style:italic;}
227 227
228 228 .total-hours { font-size: 110%; font-weight: bold; }
229 229 .total-hours span.hours-int { font-size: 120%; }
230 230
231 231 .autoscroll {overflow-x: auto; padding:1px; margin-bottom: 1.2em;}
232 232 #user_firstname, #user_lastname, #user_mail, #my_account_form select { width: 90%; }
233 233
234 234 .pagination {font-size: 90%}
235 235 p.pagination {margin-top:8px;}
236 236
237 237 /***** Tabular forms ******/
238 238 .tabular p{
239 239 margin: 0;
240 240 padding: 5px 0 8px 0;
241 241 padding-left: 180px; /*width of left column containing the label elements*/
242 242 height: 1%;
243 243 clear:left;
244 244 }
245 245
246 246 html>body .tabular p {overflow:hidden;}
247 247
248 248 .tabular label{
249 249 font-weight: bold;
250 250 float: left;
251 251 text-align: right;
252 252 margin-left: -180px; /*width of left column*/
253 253 width: 175px; /*width of labels. Should be smaller than left column to create some right
254 254 margin*/
255 255 }
256 256
257 257 .tabular label.floating{
258 258 font-weight: normal;
259 259 margin-left: 0px;
260 260 text-align: left;
261 261 width: 270px;
262 262 }
263 263
264 264 input#time_entry_comments { width: 90%;}
265 265
266 266 #preview fieldset {margin-top: 1em; background: url(../images/draft.png)}
267 267
268 268 .tabular.settings p{ padding-left: 300px; }
269 269 .tabular.settings label{ margin-left: -300px; width: 295px; }
270 270
271 271 .required {color: #bb0000;}
272 272 .summary {font-style: italic;}
273 273
274 274 #attachments_fields input[type=text] {margin-left: 8px; }
275 275
276 276 div.attachments { margin-top: 12px; }
277 277 div.attachments p { margin:4px 0 2px 0; }
278 278 div.attachments img { vertical-align: middle; }
279 279 div.attachments span.author { font-size: 0.9em; color: #888; }
280 280
281 281 p.other-formats { text-align: right; font-size:0.9em; color: #666; }
282 282 .other-formats span + span:before { content: "| "; }
283 283
284 284 a.feed { background: url(../images/feed.png) no-repeat 1px 50%; padding: 2px 0px 3px 16px; }
285 285
286 286 /***** Flash & error messages ****/
287 287 #errorExplanation, div.flash, .nodata, .warning {
288 288 padding: 4px 4px 4px 30px;
289 289 margin-bottom: 12px;
290 290 font-size: 1.1em;
291 291 border: 2px solid;
292 292 }
293 293
294 294 div.flash {margin-top: 8px;}
295 295
296 296 div.flash.error, #errorExplanation {
297 297 background: url(../images/false.png) 8px 5px no-repeat;
298 298 background-color: #ffe3e3;
299 299 border-color: #dd0000;
300 300 color: #550000;
301 301 }
302 302
303 303 div.flash.notice {
304 304 background: url(../images/true.png) 8px 5px no-repeat;
305 305 background-color: #dfffdf;
306 306 border-color: #9fcf9f;
307 307 color: #005f00;
308 308 }
309 309
310 310 .nodata, .warning {
311 311 text-align: center;
312 312 background-color: #FFEBC1;
313 313 border-color: #FDBF3B;
314 314 color: #A6750C;
315 315 }
316 316
317 317 #errorExplanation ul { font-size: 0.9em;}
318 318
319 319 /***** Ajax indicator ******/
320 320 #ajax-indicator {
321 321 position: absolute; /* fixed not supported by IE */
322 322 background-color:#eee;
323 323 border: 1px solid #bbb;
324 324 top:35%;
325 325 left:40%;
326 326 width:20%;
327 327 font-weight:bold;
328 328 text-align:center;
329 329 padding:0.6em;
330 330 z-index:100;
331 331 filter:alpha(opacity=50);
332 332 opacity: 0.5;
333 333 }
334 334
335 335 html>body #ajax-indicator { position: fixed; }
336 336
337 337 #ajax-indicator span {
338 338 background-position: 0% 40%;
339 339 background-repeat: no-repeat;
340 340 background-image: url(../images/loading.gif);
341 341 padding-left: 26px;
342 342 vertical-align: bottom;
343 343 }
344 344
345 345 /***** Calendar *****/
346 346 table.cal {border-collapse: collapse; width: 100%; margin: 0px 0 6px 0;border: 1px solid #d7d7d7;}
347 347 table.cal thead th {width: 14%;}
348 348 table.cal tbody tr {height: 100px;}
349 349 table.cal th { background-color:#EEEEEE; padding: 4px; }
350 350 table.cal td {border: 1px solid #d7d7d7; vertical-align: top; font-size: 0.9em;}
351 351 table.cal td p.day-num {font-size: 1.1em; text-align:right;}
352 352 table.cal td.odd p.day-num {color: #bbb;}
353 353 table.cal td.today {background:#ffffdd;}
354 354 table.cal td.today p.day-num {font-weight: bold;}
355 355
356 356 /***** Tooltips ******/
357 357 .tooltip{position:relative;z-index:24;}
358 358 .tooltip:hover{z-index:25;color:#000;}
359 359 .tooltip span.tip{display: none; text-align:left;}
360 360
361 361 div.tooltip:hover span.tip{
362 362 display:block;
363 363 position:absolute;
364 364 top:12px; left:24px; width:270px;
365 365 border:1px solid #555;
366 366 background-color:#fff;
367 367 padding: 4px;
368 368 font-size: 0.8em;
369 369 color:#505050;
370 370 }
371 371
372 372 /***** Progress bar *****/
373 373 table.progress {
374 374 border: 1px solid #D7D7D7;
375 375 border-collapse: collapse;
376 376 border-spacing: 0pt;
377 377 empty-cells: show;
378 378 text-align: center;
379 379 float:left;
380 380 margin: 1px 6px 1px 0px;
381 381 }
382 382
383 383 table.progress td { height: 0.9em; }
384 384 table.progress td.closed { background: #BAE0BA none repeat scroll 0%; }
385 385 table.progress td.done { background: #DEF0DE none repeat scroll 0%; }
386 386 table.progress td.open { background: #FFF none repeat scroll 0%; }
387 387 p.pourcent {font-size: 80%;}
388 388 p.progress-info {clear: left; font-style: italic; font-size: 80%;}
389 389
390 390 /***** Tabs *****/
391 391 #content .tabs {height: 2.6em; border-bottom: 1px solid #bbbbbb; margin-bottom:1.2em; position:relative;}
392 392 #content .tabs ul {margin:0; position:absolute; bottom:-2px; padding-left:1em;}
393 393 #content .tabs>ul { bottom:-1px; } /* others */
394 394 #content .tabs ul li {
395 395 float:left;
396 396 list-style-type:none;
397 397 white-space:nowrap;
398 398 margin-right:8px;
399 399 background:#fff;
400 400 }
401 401 #content .tabs ul li a{
402 402 display:block;
403 403 font-size: 0.9em;
404 404 text-decoration:none;
405 405 line-height:1.3em;
406 406 padding:4px 6px 4px 6px;
407 407 border: 1px solid #ccc;
408 408 border-bottom: 1px solid #bbbbbb;
409 409 background-color: #eeeeee;
410 410 color:#777;
411 411 font-weight:bold;
412 412 }
413 413
414 414 #content .tabs ul li a:hover {
415 415 background-color: #ffffdd;
416 416 text-decoration:none;
417 417 }
418 418
419 419 #content .tabs ul li a.selected {
420 420 background-color: #fff;
421 421 border: 1px solid #bbbbbb;
422 422 border-bottom: 1px solid #fff;
423 423 }
424 424
425 425 #content .tabs ul li a.selected:hover {
426 426 background-color: #fff;
427 427 }
428 428
429 429 /***** Diff *****/
430 430 .diff_out { background: #fcc; }
431 431 .diff_in { background: #cfc; }
432 432
433 433 /***** Wiki *****/
434 434 div.wiki table {
435 435 border: 1px solid #505050;
436 436 border-collapse: collapse;
437 437 margin-bottom: 1em;
438 438 }
439 439
440 440 div.wiki table, div.wiki td, div.wiki th {
441 441 border: 1px solid #bbb;
442 442 padding: 4px;
443 443 }
444 444
445 445 div.wiki .external {
446 446 background-position: 0% 60%;
447 447 background-repeat: no-repeat;
448 448 padding-left: 12px;
449 449 background-image: url(../images/external.png);
450 450 }
451 451
452 452 div.wiki a.new {
453 453 color: #b73535;
454 454 }
455 455
456 456 div.wiki pre {
457 457 margin: 1em 1em 1em 1.6em;
458 458 padding: 2px;
459 459 background-color: #fafafa;
460 460 border: 1px solid #dadada;
461 461 width:95%;
462 462 overflow-x: auto;
463 463 }
464 464
465 465 div.wiki ul.toc {
466 466 background-color: #ffffdd;
467 467 border: 1px solid #e4e4e4;
468 468 padding: 4px;
469 469 line-height: 1.2em;
470 470 margin-bottom: 12px;
471 471 margin-right: 12px;
472 472 margin-left: 0;
473 473 display: table
474 474 }
475 475 * html div.wiki ul.toc { width: 50%; } /* IE6 doesn't autosize div */
476 476
477 477 div.wiki ul.toc.right { float: right; margin-left: 12px; margin-right: 0; width: auto; }
478 478 div.wiki ul.toc.left { float: left; margin-right: 12px; margin-left: 0; width: auto; }
479 479 div.wiki ul.toc li { list-style-type:none;}
480 480 div.wiki ul.toc li.heading2 { margin-left: 6px; }
481 481 div.wiki ul.toc li.heading3 { margin-left: 12px; font-size: 0.8em; }
482 482
483 483 div.wiki ul.toc a {
484 484 font-size: 0.9em;
485 485 font-weight: normal;
486 486 text-decoration: none;
487 487 color: #606060;
488 488 }
489 489 div.wiki ul.toc a:hover { color: #c61a1a; text-decoration: underline;}
490 490
491 491 a.wiki-anchor { display: none; margin-left: 6px; text-decoration: none; }
492 492 a.wiki-anchor:hover { color: #aaa !important; text-decoration: none; }
493 493 h1:hover a.wiki-anchor, h2:hover a.wiki-anchor, h3:hover a.wiki-anchor { display: inline; color: #ddd; }
494 494
495 495 /***** My page layout *****/
496 496 .block-receiver {
497 497 border:1px dashed #c0c0c0;
498 498 margin-bottom: 20px;
499 499 padding: 15px 0 15px 0;
500 500 }
501 501
502 502 .mypage-box {
503 503 margin:0 0 20px 0;
504 504 color:#505050;
505 505 line-height:1.5em;
506 506 }
507 507
508 508 .handle {
509 509 cursor: move;
510 510 }
511 511
512 512 a.close-icon {
513 513 display:block;
514 514 margin-top:3px;
515 515 overflow:hidden;
516 516 width:12px;
517 517 height:12px;
518 518 background-repeat: no-repeat;
519 519 cursor:pointer;
520 520 background-image:url('../images/close.png');
521 521 }
522 522
523 523 a.close-icon:hover {
524 524 background-image:url('../images/close_hl.png');
525 525 }
526 526
527 527 /***** Gantt chart *****/
528 528 .gantt_hdr {
529 529 position:absolute;
530 530 top:0;
531 531 height:16px;
532 532 border-top: 1px solid #c0c0c0;
533 533 border-bottom: 1px solid #c0c0c0;
534 534 border-right: 1px solid #c0c0c0;
535 535 text-align: center;
536 536 overflow: hidden;
537 537 }
538 538
539 539 .task {
540 540 position: absolute;
541 541 height:8px;
542 542 font-size:0.8em;
543 543 color:#888;
544 544 padding:0;
545 545 margin:0;
546 546 line-height:0.8em;
547 547 }
548 548
549 549 .task_late { background:#f66 url(../images/task_late.png); border: 1px solid #f66; }
550 550 .task_done { background:#66f url(../images/task_done.png); border: 1px solid #66f; }
551 551 .task_todo { background:#aaa url(../images/task_todo.png); border: 1px solid #aaa; }
552 552 .milestone { background-image:url(../images/milestone.png); background-repeat: no-repeat; border: 0; }
553 553
554 554 /***** Icons *****/
555 555 .icon {
556 556 background-position: 0% 40%;
557 557 background-repeat: no-repeat;
558 558 padding-left: 20px;
559 559 padding-top: 2px;
560 560 padding-bottom: 3px;
561 561 }
562 562
563 563 .icon22 {
564 564 background-position: 0% 40%;
565 565 background-repeat: no-repeat;
566 566 padding-left: 26px;
567 567 line-height: 22px;
568 568 vertical-align: middle;
569 569 }
570 570
571 571 .icon-add { background-image: url(../images/add.png); }
572 572 .icon-edit { background-image: url(../images/edit.png); }
573 573 .icon-copy { background-image: url(../images/copy.png); }
574 574 .icon-del { background-image: url(../images/delete.png); }
575 575 .icon-move { background-image: url(../images/move.png); }
576 576 .icon-save { background-image: url(../images/save.png); }
577 577 .icon-cancel { background-image: url(../images/cancel.png); }
578 578 .icon-file { background-image: url(../images/file.png); }
579 579 .icon-folder { background-image: url(../images/folder.png); }
580 580 .open .icon-folder { background-image: url(../images/folder_open.png); }
581 581 .icon-package { background-image: url(../images/package.png); }
582 582 .icon-home { background-image: url(../images/home.png); }
583 583 .icon-user { background-image: url(../images/user.png); }
584 584 .icon-mypage { background-image: url(../images/user_page.png); }
585 585 .icon-admin { background-image: url(../images/admin.png); }
586 586 .icon-projects { background-image: url(../images/projects.png); }
587 587 .icon-help { background-image: url(../images/help.png); }
588 588 .icon-attachment { background-image: url(../images/attachment.png); }
589 589 .icon-index { background-image: url(../images/index.png); }
590 590 .icon-history { background-image: url(../images/history.png); }
591 591 .icon-time { background-image: url(../images/time.png); }
592 592 .icon-stats { background-image: url(../images/stats.png); }
593 593 .icon-warning { background-image: url(../images/warning.png); }
594 594 .icon-fav { background-image: url(../images/fav.png); }
595 595 .icon-fav-off { background-image: url(../images/fav_off.png); }
596 596 .icon-reload { background-image: url(../images/reload.png); }
597 597 .icon-lock { background-image: url(../images/locked.png); }
598 598 .icon-unlock { background-image: url(../images/unlock.png); }
599 599 .icon-checked { background-image: url(../images/true.png); }
600 600 .icon-details { background-image: url(../images/zoom_in.png); }
601 601 .icon-report { background-image: url(../images/report.png); }
602 602 .icon-comment { background-image: url(../images/comment.png); }
603 603
604 604 .icon22-projects { background-image: url(../images/22x22/projects.png); }
605 605 .icon22-users { background-image: url(../images/22x22/users.png); }
606 606 .icon22-tracker { background-image: url(../images/22x22/tracker.png); }
607 607 .icon22-role { background-image: url(../images/22x22/role.png); }
608 608 .icon22-workflow { background-image: url(../images/22x22/workflow.png); }
609 609 .icon22-options { background-image: url(../images/22x22/options.png); }
610 610 .icon22-notifications { background-image: url(../images/22x22/notifications.png); }
611 611 .icon22-authent { background-image: url(../images/22x22/authent.png); }
612 612 .icon22-info { background-image: url(../images/22x22/info.png); }
613 613 .icon22-comment { background-image: url(../images/22x22/comment.png); }
614 614 .icon22-package { background-image: url(../images/22x22/package.png); }
615 615 .icon22-settings { background-image: url(../images/22x22/settings.png); }
616 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 654 /***** Media print specific styles *****/
619 655 @media print {
620 656 #top-menu, #header, #main-menu, #sidebar, #footer, .contextual, .other-formats { display:none; }
621 657 #main { background: #fff; }
622 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