Add a time tracking block for 'My page' (#615).
It lists current user's time entries for the last 7 days across all projects, grouped by day with subtotals for each day, and a grand total. git-svn-id: http://redmine.rubyforge.org/svn/trunk@1260 e93f8b46-1217-0410-a6f0-8f06a7374b81
This commit is contained in:
parent
5b6978a1f3
commit
a8fcf8487d
|
@ -26,7 +26,8 @@ class MyController < ApplicationController
|
||||||
'issueswatched' => :label_watched_issues,
|
'issueswatched' => :label_watched_issues,
|
||||||
'news' => :label_news_latest,
|
'news' => :label_news_latest,
|
||||||
'calendar' => :label_calendar,
|
'calendar' => :label_calendar,
|
||||||
'documents' => :label_document_plural
|
'documents' => :label_document_plural,
|
||||||
|
'timelog' => :label_spent_time
|
||||||
}.freeze
|
}.freeze
|
||||||
|
|
||||||
DEFAULT_LAYOUT = { 'left' => ['issuesassignedtome'],
|
DEFAULT_LAYOUT = { 'left' => ['issuesassignedtome'],
|
||||||
|
|
|
@ -216,6 +216,8 @@ class TimelogController < ApplicationController
|
||||||
render_403 and return unless @time_entry.editable_by?(User.current)
|
render_403 and return unless @time_entry.editable_by?(User.current)
|
||||||
@time_entry.destroy
|
@time_entry.destroy
|
||||||
flash[:notice] = l(:notice_successful_delete)
|
flash[:notice] = l(:notice_successful_delete)
|
||||||
|
redirect_to :back
|
||||||
|
rescue RedirectBackError
|
||||||
redirect_to :action => 'details', :project_id => @time_entry.project
|
redirect_to :action => 'details', :project_id => @time_entry.project
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
|
@ -37,8 +37,8 @@ module ApplicationHelper
|
||||||
user ? link_to(user, :controller => 'account', :action => 'show', :id => user) : 'Anonymous'
|
user ? link_to(user, :controller => 'account', :action => 'show', :id => user) : 'Anonymous'
|
||||||
end
|
end
|
||||||
|
|
||||||
def link_to_issue(issue)
|
def link_to_issue(issue, options={})
|
||||||
link_to "#{issue.tracker.name} ##{issue.id}", :controller => "issues", :action => "show", :id => issue
|
link_to "#{issue.tracker.name} ##{issue.id}", {:controller => "issues", :action => "show", :id => issue}, options
|
||||||
end
|
end
|
||||||
|
|
||||||
def toggle_link(name, id, options={})
|
def toggle_link(name, id, options={})
|
||||||
|
|
|
@ -0,0 +1,52 @@
|
||||||
|
<h3><%=l(:label_spent_time)%> (<%= l(:label_last_n_days, 7) %>)</h3>
|
||||||
|
<%
|
||||||
|
entries = TimeEntry.find(:all,
|
||||||
|
:conditions => ["#{TimeEntry.table_name}.user_id = ? AND #{TimeEntry.table_name}.spent_on BETWEEN ? AND ?", @user.id, Date.today - 6, Date.today],
|
||||||
|
:include => [:activity, :project, {:issue => [:tracker, :status]}],
|
||||||
|
:order => "#{TimeEntry.table_name}.spent_on DESC, #{Project.table_name}.name ASC, #{Tracker.table_name}.position ASC, #{Issue.table_name}.id ASC")
|
||||||
|
entries_by_day = entries.group_by(&:spent_on)
|
||||||
|
%>
|
||||||
|
|
||||||
|
<div class="total-hours">
|
||||||
|
<p><%= l(:label_total) %>: <%= html_hours("%.2f" % entries.sum(&:hours).to_f) %></p>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<% if entries.any? %>
|
||||||
|
<table class="list time-entries">
|
||||||
|
<thead>
|
||||||
|
<th><%= l(:label_activity) %></th>
|
||||||
|
<th><%= l(:label_project) %></th>
|
||||||
|
<th><%= l(:field_comments) %></th>
|
||||||
|
<th><%= l(:field_hours) %></th>
|
||||||
|
<th></th>
|
||||||
|
</thead>
|
||||||
|
<tbody>
|
||||||
|
<% entries_by_day.keys.sort.reverse.each do |day| %>
|
||||||
|
<tr class="odd">
|
||||||
|
<td><strong><%= day == Date.today ? l(:label_today).titleize : format_date(day) %></strong></td>
|
||||||
|
<td colspan="2"></td>
|
||||||
|
<td class="hours"><em><%= html_hours("%.2f" % entries_by_day[day].sum(&:hours).to_f) %></em></td>
|
||||||
|
<td></td>
|
||||||
|
</tr>
|
||||||
|
<% entries_by_day[day].each do |entry| -%>
|
||||||
|
<tr class="time-entry" style="border-bottom: 1px solid #f5f5f5;">
|
||||||
|
<td class="activity"><%=h entry.activity %></td>
|
||||||
|
<td class="subject"><%=h entry.project %> <%= ' - ' + link_to_issue(entry.issue, :title => h("#{entry.issue.subject} (#{entry.issue.status})")) if entry.issue %></td>
|
||||||
|
<td class="comments"><%=h entry.comments %></td>
|
||||||
|
<td class="hours"><%= html_hours("%.2f" % entry.hours) %></td>
|
||||||
|
<td align="center">
|
||||||
|
<% if entry.editable_by?(@user) -%>
|
||||||
|
<%= link_to image_tag('edit.png'), {:controller => 'timelog', :action => 'edit', :id => entry},
|
||||||
|
:title => l(:button_edit) %>
|
||||||
|
<%= link_to image_tag('delete.png'), {:controller => 'timelog', :action => 'destroy', :id => entry},
|
||||||
|
:confirm => l(:text_are_you_sure),
|
||||||
|
:method => :post,
|
||||||
|
:title => l(:button_delete) %>
|
||||||
|
<% end -%>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
<% end -%>
|
||||||
|
<% end -%>
|
||||||
|
</tbdoy>
|
||||||
|
</table>
|
||||||
|
<% end %>
|
|
@ -113,9 +113,9 @@ tr.user.locked, tr.user.registered { color: #aaa; }
|
||||||
tr.user.locked a, tr.user.registered a { color: #aaa; }
|
tr.user.locked a, tr.user.registered a { color: #aaa; }
|
||||||
|
|
||||||
tr.time-entry { text-align: center; white-space: nowrap; }
|
tr.time-entry { text-align: center; white-space: nowrap; }
|
||||||
tr.time-entry td.subject, tr.time-entry td.comments { text-align: left; }
|
tr.time-entry td.subject, tr.time-entry td.comments { text-align: left; white-space: normal; }
|
||||||
tr.time-entry td.hours { text-align: right; font-weight: bold; padding-right: 0.5em; }
|
td.hours { text-align: right; font-weight: bold; padding-right: 0.5em; }
|
||||||
tr.time-entry .hours-dec { font-size: 0.9em; }
|
td.hours .hours-dec { font-size: 0.9em; }
|
||||||
|
|
||||||
table.list tbody tr:hover { background-color:#ffffdd; }
|
table.list tbody tr:hover { background-color:#ffffdd; }
|
||||||
table td {padding:2px;}
|
table td {padding:2px;}
|
||||||
|
|
Loading…
Reference in New Issue