Revision 1962
Added by Eric Davis over 16 years ago
trunk/app/views/issues/_history.rhtml | ||
---|---|---|
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 %> |
trunk/app/views/issues/show.rhtml | ||
---|---|---|
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 %>. |
... | ... | |
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> |
trunk/app/views/projects/activity.rhtml | ||
---|---|---|
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> |
trunk/app/views/users/list.rhtml | ||
---|---|---|
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> |
trunk/public/stylesheets/application.css | ||
---|---|---|
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; } |
trunk/vendor/plugins/gravatar/MIT-LICENSE | ||
---|---|---|
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. |
trunk/vendor/plugins/gravatar/README | ||
---|---|---|
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 |
trunk/vendor/plugins/gravatar/Rakefile | ||
---|---|---|
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 |
trunk/vendor/plugins/gravatar/about.yml | ||
---|---|---|
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+ |
trunk/vendor/plugins/gravatar/init.rb | ||
---|---|---|
1 |
require 'gravatar' |
|
2 |
ActionView::Base.send :include, GravatarHelper::PublicMethods |
trunk/vendor/plugins/gravatar/lib/gravatar.rb | ||
---|---|---|
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 |
trunk/vendor/plugins/gravatar/spec/gravatar_spec.rb | ||
---|---|---|
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 |
Also available in: Unified diff
Gravatar support for issue detai, user grid, and activity stream