Patch #31224 » my_page_time_entry_queries.diff
| app/views/my/blocks/_timelog_query_selection.html.erb | ||
|---|---|---|
| 1 |
<h3> |
|
| 2 |
<%= l(:label_time_entry_plural) %> |
|
| 3 |
</h3> |
|
| 4 | ||
| 5 |
<div id="<%= block %>-settings"> |
|
| 6 |
<%= form_tag(my_page_path, :remote => true) do %> |
|
| 7 |
<div class="box"> |
|
| 8 |
<p> |
|
| 9 |
<label> |
|
| 10 |
<%= l(:label_query) %> |
|
| 11 |
<%= select_tag "settings[#{block}][query_id]", content_tag("option") + options_from_collection_for_select(queries, :id, :name, settings[:query_id]) %>
|
|
| 12 |
</label> |
|
| 13 |
</p> |
|
| 14 |
</div> |
|
| 15 |
<p> |
|
| 16 |
<%= submit_tag l(:button_save) %> |
|
| 17 |
</p> |
|
| 18 |
<% end %> |
|
| 19 |
</div> |
|
| app/views/my/blocks/_timelogs.erb | ||
|---|---|---|
| 1 |
<div class="contextual"> |
|
| 2 |
<%= link_to_function l(:label_options), "$('##{block}-settings').toggle();", :class => 'icon-only icon-settings', :title => l(:label_options) %>
|
|
| 3 |
</div> |
|
| 4 | ||
| 5 |
<h3> |
|
| 6 |
<%= "#{query.project} |" if query.project %>
|
|
| 7 |
<%= link_to query.name, _time_entries_path(query.project, query.as_params) %> |
|
| 8 |
(<%= scope.count %>) |
|
| 9 |
</h3> |
|
| 10 | ||
| 11 |
<div id="<%= block %>-settings" style="display:none;"> |
|
| 12 |
<%= form_tag(my_page_path, :remote => true) do %> |
|
| 13 |
<div class="box"> |
|
| 14 |
<%= render_query_columns_selection(query, :name => "settings[#{block}][columns]") %>
|
|
| 15 |
</div> |
|
| 16 |
<p> |
|
| 17 |
<%= submit_tag l(:button_save) %> |
|
| 18 |
<%= link_to_function l(:button_cancel), "$('##{block}-settings').toggle();" %>
|
|
| 19 |
</p> |
|
| 20 |
<% end %> |
|
| 21 |
</div> |
|
| 22 | ||
| 23 |
<% if entries.any? %> |
|
| 24 |
<%= render :partial => 'timelog/list', |
|
| 25 |
:locals => {
|
|
| 26 |
:entries => entries, |
|
| 27 |
:query => query, |
|
| 28 |
:query_options => {
|
|
| 29 |
:sort_param => "settings[#{block}][sort]",
|
|
| 30 |
:sort_link_options => {:method => :post, :remote => true}
|
|
| 31 |
} |
|
| 32 |
} %> |
|
| 33 |
<% else %> |
|
| 34 |
<p class="nodata"><%= l(:label_no_data) %></p> |
|
| 35 |
<% end %> |
|
| 36 | ||
| 37 |
<% content_for :header_tags do %> |
|
| 38 |
<%= auto_discovery_link_tag(:atom, |
|
| 39 |
_time_entries_path(query.project, query.as_params.merge(:format => 'atom', :key => User.current.rss_key)), |
|
| 40 |
{:title => query.name}) %>
|
|
| 41 |
<% end %> |
|
| app/helpers/my_helper.rb | ||
|---|---|---|
| 140 | 140 |
end |
| 141 | 141 |
end |
| 142 | 142 | |
| 143 |
def render_timelogquery_block(block, settings) |
|
| 144 |
query = TimeEntryQuery.visible.find_by_id(settings[:query_id]) |
|
| 145 | ||
| 146 |
if query |
|
| 147 |
query.column_names = settings[:columns] if settings[:columns].present? |
|
| 148 |
query.sort_criteria = settings[:sort] if settings[:sort].present? |
|
| 149 | ||
| 150 |
scope = query.results_scope |
|
| 151 |
scope = scope. |
|
| 152 |
preload(:issue => [:project, :tracker, :status, :assigned_to, :priority]). |
|
| 153 |
preload(:project, :user) |
|
| 154 | ||
| 155 |
entries = scope.limit(10).to_a |
|
| 156 | ||
| 157 |
render :partial => 'my/blocks/timelogs', :locals => {:query => query, :scope => scope, :entries => entries, :block => block, :settings => settings}
|
|
| 158 |
else |
|
| 159 |
queries = TimeEntryQuery.visible.sorted |
|
| 160 |
render :partial => 'my/blocks/timelog_query_selection', :locals => {:queries => queries, :block => block, :settings => settings}
|
|
| 161 |
end |
|
| 162 |
end |
|
| 163 | ||
| 143 | 164 |
def render_news_block(block, settings) |
| 144 | 165 |
news = News.visible. |
| 145 | 166 |
where(:project_id => User.current.projects.pluck(:id)). |
| app/views/my/blocks/_timelog_query_selection.html.erb | ||
|---|---|---|
| 1 |
<h3> |
|
| 2 |
<%= l(:label_time_entry_plural) %> |
|
| 3 |
</h3> |
|
| 4 | ||
| 5 |
<div id="<%= block %>-settings"> |
|
| 6 |
<%= form_tag(my_page_path, :remote => true) do %> |
|
| 7 |
<div class="box"> |
|
| 8 |
<p> |
|
| 9 |
<label> |
|
| 10 |
<%= l(:label_query) %> |
|
| 11 |
<%= select_tag "settings[#{block}][query_id]", content_tag("option") + options_from_collection_for_select(queries, :id, :name, settings[:query_id]) %>
|
|
| 12 |
</label> |
|
| 13 |
</p> |
|
| 14 |
</div> |
|
| 15 |
<p> |
|
| 16 |
<%= submit_tag l(:button_save) %> |
|
| 17 |
</p> |
|
| 18 |
<% end %> |
|
| 19 |
</div> |
|
| app/views/my/blocks/_timelogs.erb | ||
|---|---|---|
| 1 |
<div class="contextual"> |
|
| 2 |
<%= link_to_function l(:label_options), "$('##{block}-settings').toggle();", :class => 'icon-only icon-settings', :title => l(:label_options) %>
|
|
| 3 |
</div> |
|
| 4 | ||
| 5 |
<h3> |
|
| 6 |
<%= "#{query.project} |" if query.project %>
|
|
| 7 |
<%= link_to query.name, _project_issues_path(query.project, query.as_params) %> |
|
| 8 |
(<%= scope.count %>) |
|
| 9 |
</h3> |
|
| 10 | ||
| 11 |
<div id="<%= block %>-settings" style="display:none;"> |
|
| 12 |
<%= form_tag(my_page_path, :remote => true) do %> |
|
| 13 |
<div class="box"> |
|
| 14 |
<%= render_query_columns_selection(query, :name => "settings[#{block}][columns]") %>
|
|
| 15 |
</div> |
|
| 16 |
<p> |
|
| 17 |
<%= submit_tag l(:button_save) %> |
|
| 18 |
<%= link_to_function l(:button_cancel), "$('##{block}-settings').toggle();" %>
|
|
| 19 |
</p> |
|
| 20 |
<% end %> |
|
| 21 |
</div> |
|
| 22 | ||
| 23 |
<% if entries.any? %> |
|
| 24 |
<%= render :partial => 'timelog/list', |
|
| 25 |
:locals => {
|
|
| 26 |
:entries => entries, |
|
| 27 |
:query => query, |
|
| 28 |
:query_options => {
|
|
| 29 |
:sort_param => "settings[#{block}][sort]",
|
|
| 30 |
:sort_link_options => {:method => :post, :remote => true}
|
|
| 31 |
} |
|
| 32 |
} %> |
|
| 33 |
<% else %> |
|
| 34 |
<p class="nodata"><%= l(:label_no_data) %></p> |
|
| 35 |
<% end %> |
|
| 36 | ||
| 37 |
<% content_for :header_tags do %> |
|
| 38 |
<%= auto_discovery_link_tag(:atom, |
|
| 39 |
_project_issues_path(query.project, query.as_params.merge(:format => 'atom', :key => User.current.rss_key)), |
|
| 40 |
{:title => query.name}) %>
|
|
| 41 |
<% end %> |
|
| app/views/timelog/_list.html.erb | ||
|---|---|---|
| 8 | 8 |
<%= check_box_tag 'check_all', '', false, :class => 'toggle-selection', |
| 9 | 9 |
:title => "#{l(:button_check_all)}/#{l(:button_uncheck_all)}" %>
|
| 10 | 10 |
</th> |
| 11 |
<% @query.inline_columns.each do |column| %>
|
|
| 12 |
<%= column_header(@query, column) %>
|
|
| 11 |
<% query.inline_columns.each do |column| %> |
|
| 12 |
<%= column_header(query, column) %> |
|
| 13 | 13 |
<% end %> |
| 14 | 14 |
<th></th> |
| 15 | 15 |
</tr> |
| 16 | 16 |
</thead> |
| 17 | 17 |
<tbody> |
| 18 |
<% grouped_query_results(entries, @query) do |entry, group_name, group_count, group_totals| -%>
|
|
| 18 |
<% grouped_query_results(entries, query) do |entry, group_name, group_count, group_totals| -%> |
|
| 19 | 19 |
<% if group_name %> |
| 20 | 20 |
<% reset_cycle %> |
| 21 | 21 |
<tr class="group open"> |
| 22 |
<td colspan="<%= @query.inline_columns.size + 2 %>">
|
|
| 22 |
<td colspan="<%= query.inline_columns.size + 2 %>"> |
|
| 23 | 23 |
<span class="expander" onclick="toggleRowGroup(this);"> </span> |
| 24 | 24 |
<span class="name"><%= group_name %></span> |
| 25 | 25 |
<% if group_count %> |
| ... | ... | |
| 33 | 33 |
<% end %> |
| 34 | 34 |
<tr id="time-entry-<%= entry.id %>" class="time-entry <%= cycle("odd", "even") %> hascontextmenu">
|
| 35 | 35 |
<td class="checkbox hide-when-print"><%= check_box_tag("ids[]", entry.id, false, :id => nil) %></td>
|
| 36 |
<% @query.inline_columns.each do |column| %>
|
|
| 36 |
<% query.inline_columns.each do |column| %> |
|
| 37 | 37 |
<%= content_tag('td', column_content(column, entry), :class => column.css_classes) %>
|
| 38 | 38 |
<% end %> |
| 39 | 39 |
<td class="buttons"> |
| ... | ... | |
| 50 | 50 |
<%= link_to_context_menu %> |
| 51 | 51 |
</td> |
| 52 | 52 |
</tr> |
| 53 |
<% @query.block_columns.each do |column|
|
|
| 53 |
<% query.block_columns.each do |column| |
|
| 54 | 54 |
if (text = column_content(column, issue)) && text.present? -%> |
| 55 | 55 |
<tr class="<%= current_cycle %>"> |
| 56 |
<td colspan="<%= @query.inline_columns.size + 1 %>" class="<%= column.css_classes %>">
|
|
| 56 |
<td colspan="<%= query.inline_columns.size + 1 %>" class="<%= column.css_classes %>"> |
|
| 57 | 57 |
<% if query.block_columns.count > 1 %> |
| 58 | 58 |
<span><%= column.caption %></span> |
| 59 | 59 |
<% end %> |
| app/views/timelog/index.html.erb | ||
|---|---|---|
| 15 | 15 |
<p class="nodata"><%= l(:label_no_data) %></p> |
| 16 | 16 |
<% else %> |
| 17 | 17 |
<%= render_query_totals(@query) %> |
| 18 |
<%= render :partial => 'list', :locals => { :entries => @entries }%>
|
|
| 18 |
<%= render :partial => 'list', :locals => { :entries => @entries, :query => @query }%>
|
|
| 19 | 19 |
<span class="pagination"><%= pagination_links_full @entry_pages, @entry_count %></span> |
| 20 | 20 | |
| 21 | 21 |
<% other_formats_links do |f| %> |
| lib/redmine/my_page.rb | ||
|---|---|---|
| 26 | 26 |
'issuesreportedbyme' => {:label => :label_reported_issues},
|
| 27 | 27 |
'issueswatched' => {:label => :label_watched_issues},
|
| 28 | 28 |
'issuequery' => {:label => :label_issue_plural, :max_occurs => 3},
|
| 29 |
'timelogquery' => {:label => :label_time_entry_plural, :max_occurs => 3},
|
|
| 29 | 30 |
'news' => {:label => :label_news_latest},
|
| 30 | 31 |
'calendar' => {:label => :label_calendar},
|
| 31 | 32 |
'documents' => {:label => :label_document_plural},
|
| 32 |
'timelog' => {:label => :label_spent_time},
|
|
| 33 |
'timelog' => {:label => :label_time_by_activity},
|
|
| 33 | 34 |
'activity' => {:label => :label_activity}
|
| 34 | 35 |
} |
| 35 | 36 | |