Feature #20458 » 20458.patch
| app/controllers/activities_controller.rb | ||
|---|---|---|
| 32 | 32 |
@date_to ||= User.current.today + 1 |
| 33 | 33 |
@date_from = @date_to - @days |
| 34 | 34 |
@with_subprojects = params[:with_subprojects].nil? ? Setting.display_subprojects_issues? : (params[:with_subprojects] == '1') |
| 35 |
if params[:user_id].present? |
|
| 36 |
@author = User.visible.active.find(params[:user_id]) |
|
| 35 |
@authors = [] |
|
| 36 |
if params[:user_ids].present? |
|
| 37 |
@authors = User.visible.active.where(:id => params[:user_ids]) |
|
| 38 |
raise ActiveRecord::RecordNotFound if @authors.empty? |
|
| 37 | 39 |
end |
| 38 | 40 | |
| 39 | 41 |
@activity = Redmine::Activity::Fetcher.new(User.current, :project => @project, |
| 40 | 42 |
:with_subprojects => @with_subprojects, |
| 41 |
:author => @author)
|
|
| 43 |
:authors => @authors)
|
|
| 42 | 44 |
pref = User.current.pref |
| 43 | 45 |
@activity.scope_select {|t| !params["show_#{t}"].nil?}
|
| 44 | 46 |
if @activity.scope.present? |
| ... | ... | |
| 47 | 49 |
pref.save |
| 48 | 50 |
end |
| 49 | 51 |
else |
| 50 |
if @author.nil?
|
|
| 52 |
if @authors.empty?
|
|
| 51 | 53 |
scope = pref.activity_scope & @activity.event_types |
| 52 | 54 |
@activity.scope = scope.present? ? scope : :default |
| 53 | 55 |
else |
| ... | ... | |
| 62 | 64 |
@activity.events(@date_from, @date_to) |
| 63 | 65 |
end |
| 64 | 66 | |
| 65 |
if events.empty? || stale?(:etag => [@activity.scope, @date_to, @date_from, @with_subprojects, @author, events.first, events.size, User.current, current_language]) |
|
| 67 |
if events.empty? || stale?(:etag => [@activity.scope, @date_to, @date_from, @with_subprojects, @authors.first, @authors.size, events.first, events.size, User.current, current_language])
|
|
| 66 | 68 |
respond_to do |format| |
| 67 | 69 |
format.html do |
| 68 | 70 |
@events_by_day = events.group_by {|event| User.current.time_to_date(event.event_datetime)}
|
| ... | ... | |
| 70 | 72 |
end |
| 71 | 73 |
format.atom do |
| 72 | 74 |
title = l(:label_activity) |
| 73 |
if @author |
|
| 74 |
title = @author.name
|
|
| 75 |
if @authors.any?
|
|
| 76 |
title = @authors.map(&:name).join(", ")
|
|
| 75 | 77 |
elsif @activity.scope.size == 1 |
| 76 | 78 |
title = l("label_#{@activity.scope.first.singularize}_plural")
|
| 77 | 79 |
end |
| app/views/activities/index.html.erb | ||
|---|---|---|
| 1 |
<h2><%= @author.nil? ? l(:label_activity) : l(:label_user_activity, link_to_user(@author)).html_safe %></h2>
|
|
| 1 |
<h2><%= @authors.empty? ? l(:label_activity) : l(:label_user_activity, @authors.map{|a| link_to_user(a)}.join(',')).html_safe %></h2>
|
|
| 2 | 2 | |
| 3 | 3 |
<p class="subtitle"><%= l(:label_date_from_to, :start => format_date(@date_to - @days), :end => format_date(@date_to-1)) %></p> |
| 4 | 4 | |
| ... | ... | |
| 38 | 38 |
</p> |
| 39 | 39 |
<p> |
| 40 | 40 |
<%= l(:label_user) %> |
| 41 |
<%= select_tag('user_id', activity_authors_options_for_select(@project, params[:user_id]), include_blank: true) %>
|
|
| 41 |
<%= select_tag('user_ids[]', activity_authors_options_for_select(@project, params[:user_ids]), include_blank: true, multiple: (params[:user_ids]&.count.to_i > 1)) %>
|
|
| 42 |
<span class="toggle-multiselect icon-only"></span> |
|
| 42 | 43 |
</p> |
| 43 | 44 |
<ul> |
| 44 | 45 |
<% @activity.event_types.each do |t| %> |
| ... | ... | |
| 46 | 47 |
<%= check_box_tag "show_#{t}", 1, @activity.scope.include?(t) %>
|
| 47 | 48 |
<label for="show_<%=t%>"> |
| 48 | 49 |
<%= link_to(l("label_#{t.singularize}_plural"),
|
| 49 |
{"show_#{t}" => 1, :user_id => params[:user_id], :from => params[:from]})%>
|
|
| 50 |
{"show_#{t}" => 1, :user_ids => params[:user_ids], :from => params[:from]})%>
|
|
| 50 | 51 |
</label> |
| 51 | 52 |
</li> |
| 52 | 53 |
<% end %> |
| ... | ... | |
| 59 | 60 |
<% end %> |
| 60 | 61 |
<% end %> |
| 61 | 62 | |
| 62 |
<% html_title(l(:label_activity), @author) -%> |
|
| 63 |
<% html_title(l(:label_activity), @authors) -%> |
|
| lib/redmine/activity/fetcher.rb | ||
|---|---|---|
| 24 | 24 |
attr_reader :user, :project, :scope |
| 25 | 25 | |
| 26 | 26 |
def initialize(user, options={})
|
| 27 |
options.assert_valid_keys(:project, :with_subprojects, :author) |
|
| 27 |
options.assert_valid_keys(:project, :with_subprojects, :author, :authors)
|
|
| 28 | 28 |
@user = user |
| 29 | 29 |
@project = options[:project] |
| 30 | 30 |
@options = options |
| ... | ... | |
| 87 | 87 |
def events(from = nil, to = nil, options={})
|
| 88 | 88 |
e = [] |
| 89 | 89 |
@options[:limit] = options[:limit] |
| 90 |
authors = [[@options[:author]], @options[:authors]].flatten.compact |
|
| 90 | 91 | |
| 91 | 92 |
@scope.each do |event_type| |
| 92 | 93 |
constantized_providers(event_type).each do |provider| |
| 93 |
e += provider.find_events(event_type, @user, from, to, @options) |
|
| 94 |
if authors.any? |
|
| 95 |
e += authors.map { |author| provider.find_events(event_type, @user, from, to, @options.merge(:author => author)) }.flatten
|
|
| 96 |
else |
|
| 97 |
e += provider.find_events(event_type, @user, from, to, @options) |
|
| 98 |
end |
|
| 94 | 99 |
end |
| 95 | 100 |
end |
| 96 | 101 | |
| public/javascripts/application.js | ||
|---|---|---|
| 1025 | 1025 |
$('#content').on('change', 'input[data-disables], input[data-enables], input[data-shows]', toggleDisabledOnChange);
|
| 1026 | 1026 |
toggleDisabledInit(); |
| 1027 | 1027 | |
| 1028 |
$('#content').on('click', '.toggle-multiselect', function() {
|
|
| 1028 |
$('#content, #sidebar').on('click', '.toggle-multiselect', function() {
|
|
| 1029 | 1029 |
toggleMultiSelect($(this).siblings('select'));
|
| 1030 | 1030 |
$(this).toggleClass('icon-toggle-plus icon-toggle-minus');
|
| 1031 | 1031 |
}); |
| test/functional/activities_controller_test.rb | ||
|---|---|---|
| 82 | 82 |
get( |
| 83 | 83 |
:index, |
| 84 | 84 |
:params => {
|
| 85 |
:user_id => 2
|
|
| 85 |
:user_ids => [2, 3]
|
|
| 86 | 86 |
} |
| 87 | 87 |
) |
| 88 | 88 |
assert_response :success |
| 89 | 89 | |
| 90 |
assert_select 'h2 a[href="/users/2"]', :text => 'John Smith' |
|
| 91 |
assert_select '#sidebar select#user_id option[value="2"][selected=selected]' |
|
| 90 |
{ 2 => 'John Smith', 3 => 'Dave Lopper' }.each do |user_id, user_name|
|
|
| 91 |
assert_select "h2 a[href='/users/#{user_id}']", :text => user_name
|
|
| 92 |
assert_select "#sidebar select#user_ids_ option[value='#{user_id}'][selected=selected]"
|
|
| 93 |
end |
|
| 92 | 94 | |
| 93 | 95 |
i1 = Issue.find(1) |
| 94 | 96 |
d1 = User.find(1).time_to_date(i1.created_on) |
| ... | ... | |
| 101 | 103 |
get( |
| 102 | 104 |
:index, |
| 103 | 105 |
:params => {
|
| 104 |
:user_id => 299
|
|
| 106 |
:user_ids => [299]
|
|
| 105 | 107 |
} |
| 106 | 108 |
) |
| 107 | 109 |
assert_response 404 |
| ... | ... | |
| 113 | 115 | |
| 114 | 116 |
@request.session[:user_id] = nil |
| 115 | 117 |
get :index, :params => {
|
| 116 |
:user_id => user.id
|
|
| 118 |
:user_ids => [user.id]
|
|
| 117 | 119 |
} |
| 118 | 120 | |
| 119 | 121 |
assert_response 404 |
| ... | ... | |
| 199 | 201 |
get( |
| 200 | 202 |
:index, |
| 201 | 203 |
:params => {
|
| 202 |
:user_id => 2,
|
|
| 204 |
:user_ids => [2, 3],
|
|
| 203 | 205 |
:format => 'atom' |
| 204 | 206 |
} |
| 205 | 207 |
) |
| 206 | 208 |
assert_response :success |
| 207 |
assert_select 'title', :text => "Redmine: #{User.find(2).name}"
|
|
| 209 |
assert_select 'title', :text => "Redmine: #{User.find(2).name}, #{User.find(3).name}"
|
|
| 208 | 210 |
end |
| 209 | 211 | |
| 210 | 212 |
def test_index_atom_feed_with_subprojects |
- « Previous
- 1
- 2
- 3
- Next »