Patch #38792 » enable_removing_watchers_in_bulk_context_menu.patch
app/controllers/context_menus_controller.rb (revision 41653:c704208ed465fcb5f84cbfa7b6d4050e229d081b) → app/controllers/context_menus_controller.rb (revision 41653+:c704208ed465+) | ||
---|---|---|
36 | 36 |
:log_time => (@project && User.current.allowed_to?(:log_time, @project)), |
37 | 37 |
:copy => User.current.allowed_to?(:copy_issues, @projects) && Issue.allowed_target_projects.any?, |
38 | 38 |
:add_watchers => User.current.allowed_to?(:add_issue_watchers, @projects), |
39 |
:delete_watchers => User.current.allowed_to?(:delete_issue_watchers, @projects), |
|
39 | 40 |
:delete => @issues.all?(&:deletable?), |
40 | 41 |
:add_subtask => @issue && !@issue.closed? && User.current.allowed_to?(:manage_subtasks, @project) |
41 | 42 |
} |
app/controllers/watchers_controller.rb (revision 41653:c704208ed465fcb5f84cbfa7b6d4050e229d081b) → app/controllers/watchers_controller.rb (revision 41653+:c704208ed465+) | ||
---|---|---|
18 | 18 |
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. |
19 | 19 | |
20 | 20 |
class WatchersController < ApplicationController |
21 |
before_action :require_login, :find_watchables, :only => [:watch, :unwatch] |
|
21 |
before_action :require_login, :find_watchables, :only => [:watch, :unwatch, :bulk_delete]
|
|
22 | 22 | |
23 | 23 |
def watch |
24 | 24 |
set_watcher(@watchables, User.current, true) |
... | ... | |
70 | 70 |
end |
71 | 71 |
end |
72 | 72 | |
73 |
def bulk_delete |
|
74 |
if request.method == "POST" |
|
75 |
return unless params[:watcher].present? |
|
76 | ||
77 |
user_ids = params[:watcher][:user_ids] || [params[:watcher][:user_id]] |
|
78 |
@users = Principal.where(:id => user_ids).to_a |
|
79 |
@users.each do |user| |
|
80 |
@watchables.each do |watchable| |
|
81 |
watchable.set_watcher(user, false) |
|
82 |
end |
|
83 |
end |
|
84 |
respond_to do |format| |
|
85 |
format.js |
|
86 |
format.api {render_api_ok} |
|
87 |
end |
|
88 |
elsif request.method == "GET" |
|
89 |
if params["object_id"].present? |
|
90 |
@users = Watcher.where(watchable_id: params["object_id"]).all.map { |w| w.user }.uniq |
|
91 |
else |
|
92 |
@users = Principal.assignable_watchers |
|
93 |
end |
|
94 |
end |
|
95 |
end |
|
96 | ||
73 | 97 |
def destroy |
74 | 98 |
user = Principal.find(params[:user_id]) |
75 | 99 |
@watchables.each do |watchable| |
app/views/context_menus/issues.html.erb (revision 41653:c704208ed465fcb5f84cbfa7b6d4050e229d081b) → app/views/context_menus/issues.html.erb (revision 41653+:c704208ed465+) | ||
---|---|---|
133 | 133 |
new_watchers_path(:object_type => 'issue', :object_id => @issue_ids), |
134 | 134 |
:remote => true, |
135 | 135 |
:class => 'icon icon-add' %></li> |
136 |
<li><%= context_menu_link l(:button_delete), |
|
137 |
bulk_delete_watchers_dialog_path(:object_type => 'issue', :object_id => @issue_ids), |
|
138 |
:remote => true, |
|
139 |
:class => 'icon icon-del' %></li> |
|
136 | 140 |
</ul> |
137 | 141 |
</li> |
138 | 142 |
<% end %> |
/dev/null (revision 41653+:c704208ed465+) → app/views/watchers/_bulk_delete.html.erb (revision 41653+:c704208ed465+) | ||
---|---|---|
1 |
<% |
|
2 |
title = |
|
3 |
if watchables.present? |
|
4 |
l(:"permission_delete_#{watchables.first.class.name.underscore}_watchers") |
|
5 |
else |
|
6 |
l(:permission_delete_issue_watchers) |
|
7 |
end |
|
8 |
-%> |
|
9 |
<h3 class="title"><%= title %></h3> |
|
10 | ||
11 |
<%= form_tag(bulk_delete_watchers_path, |
|
12 |
:remote => true, |
|
13 |
:method => :post, |
|
14 |
:id => 'new-watcher-form') do %> |
|
15 | ||
16 |
<% if watchables.present? %> |
|
17 |
<%= hidden_field_tag 'object_type', watchables.first.class.name.underscore %> |
|
18 |
<% watchables.each do |watchable| %> |
|
19 |
<%= hidden_field_tag 'object_id[]', watchable.id %> |
|
20 |
<% end %> |
|
21 |
<% end %> |
|
22 |
<%= hidden_field_tag 'project_id', @project.id if @project %> |
|
23 | ||
24 |
<p><%= label_tag 'user_search', l(:label_user_search) %><%= text_field_tag 'user_search', nil %></p> |
|
25 |
<%= javascript_tag( |
|
26 |
"observeSearchfield( |
|
27 |
'user_search', |
|
28 |
'users_for_watcher', |
|
29 |
'#{escape_javascript( |
|
30 |
url_for( |
|
31 |
:controller => 'watchers', |
|
32 |
:action => 'autocomplete_for_user', |
|
33 |
:object_type => (watchables.present? ? watchables.first.class.name.underscore : nil), |
|
34 |
:object_id => (watchables.present? ? watchables.map(&:id) : nil), |
|
35 |
:project_id => @project |
|
36 |
) |
|
37 |
)}' |
|
38 |
)" |
|
39 |
) %> |
|
40 |
<div id="users_for_watcher"> |
|
41 |
<%= principals_check_box_tags('watcher[user_ids][]', users) %> |
|
42 |
</div> |
|
43 | ||
44 |
<p class="buttons"> |
|
45 |
<%= submit_tag l(:button_delete), :name => nil, :onclick => "hideModal(this);" %> |
|
46 |
<%= link_to_function l(:button_cancel), "hideModal(this);" %> |
|
47 |
</p> |
|
48 |
<% end %> |
/dev/null (revision 41653+:c704208ed465+) → app/views/watchers/bulk_delete.js.erb (revision 41653+:c704208ed465+) | ||
---|---|---|
1 |
<% if request.method == "GET" %> |
|
2 |
$('#ajax-modal').html( |
|
3 |
'<%= escape_javascript( |
|
4 |
render(:partial => 'watchers/bulk_delete', |
|
5 |
:locals => { :watchables => @watchables, :users => @users }) |
|
6 |
) %>'); |
|
7 |
showModal('ajax-modal', '400px'); |
|
8 |
$('#ajax-modal').addClass('delete-watchers'); |
|
9 |
<% end %> |
config/routes.rb (revision 41653:c704208ed465fcb5f84cbfa7b6d4050e229d081b) → config/routes.rb (revision 41653+:c704208ed465+) | ||
---|---|---|
116 | 116 |
post 'watchers/watch', :to => 'watchers#watch', :as => 'watch' |
117 | 117 |
delete 'watchers/watch', :to => 'watchers#unwatch' |
118 | 118 |
get 'watchers/new', :to => 'watchers#new', :as => 'new_watchers' |
119 |
get 'watchers/delete', :to => 'watchers#bulk_delete', :as => 'bulk_delete_watchers_dialog' |
|
120 |
post 'watchers/bulk_delete', :to => 'watchers#bulk_delete', :as => 'bulk_delete_watchers' |
|
119 | 121 |
post 'watchers', :to => 'watchers#create' |
120 | 122 |
post 'watchers/append', :to => 'watchers#append' |
121 | 123 |
delete 'watchers', :to => 'watchers#destroy' |