From 18b4cc865f4c6c9b7da05b8b044aeb562e097ecb Mon Sep 17 00:00:00 2001
From: ishikawa999 <14245262+ishikawa999@users.noreply.github.com>
Date: Mon, 11 May 2026 16:22:05 +0900
Subject: [PATCH] Fix watchers section in sidebar incorrectly updated when
watching a different issue via context menu.
---
app/views/issues/show.html.erb | 2 +-
app/views/watchers/_set_watcher.js.erb | 4 ++++
test/functional/watchers_controller_test.rb | 15 +++++++++++++++
3 files changed, 20 insertions(+), 1 deletion(-)
diff --git a/app/views/issues/show.html.erb b/app/views/issues/show.html.erb
index d9524fbc1b..13d35cc82a 100644
--- a/app/views/issues/show.html.erb
+++ b/app/views/issues/show.html.erb
@@ -166,7 +166,7 @@ end %>
<% if User.current.allowed_to?(:add_issue_watchers, @project) ||
(@issue.watchers.present? && User.current.allowed_to?(:view_issue_watchers, @project)) %>
-
+
<%= render :partial => 'watchers/watchers', :locals => {:watched => @issue} %>
<% end %>
diff --git a/app/views/watchers/_set_watcher.js.erb b/app/views/watchers/_set_watcher.js.erb
index 4090ef6ce4..e57670d7f8 100644
--- a/app/views/watchers/_set_watcher.js.erb
+++ b/app/views/watchers/_set_watcher.js.erb
@@ -1,3 +1,7 @@
<% selector = ".#{watcher_css(watched)}" %>
$("<%= selector %>").each(function(){$(this).replaceWith("<%= escape_javascript watcher_link(watched, user) %>")});
+<% if watched.first.is_a?(Issue) %>
+$('#watchers[data-watchable-id="<%= watched.first.id %>"]').html('<%= escape_javascript(render(:partial => 'watchers/watchers', :locals => {:watched => watched.first})) %>');
+<% else %>
$('#watchers').html('<%= escape_javascript(render(:partial => 'watchers/watchers', :locals => {:watched => watched.first})) %>');
+<% end %>
diff --git a/test/functional/watchers_controller_test.rb b/test/functional/watchers_controller_test.rb
index c73b847022..78983f63be 100644
--- a/test/functional/watchers_controller_test.rb
+++ b/test/functional/watchers_controller_test.rb
@@ -65,6 +65,21 @@ class WatchersControllerTest < Redmine::ControllerTest
assert Issue.find(3).watched_by?(User.find(3))
end
+ def test_watch_an_issue_should_use_data_attribute_selector_for_watchers_sidebar
+ @request.session[:user_id] = 2
+ post :watch, :params => {:object_type => 'issue', :object_id => '1'}, :xhr => true
+ assert_response :success
+ assert_include "$('#watchers[data-watchable-id=\"1\"]')", response.body
+ assert_not_include "$('#watchers').html(", response.body
+ end
+
+ def test_watch_a_message_should_not_use_data_attribute_selector_for_watchers_sidebar
+ @request.session[:user_id] = 2
+ post :watch, :params => {:object_type => 'message', :object_id => '1'}, :xhr => true
+ assert_response :success
+ assert_include "$('#watchers').html(", response.body
+ end
+
def test_watch_a_news_module_should_add_watcher
@request.session[:user_id] = 7
assert_not_nil m = Project.find(1).enabled_module('news')
--
2.50.1 (Apple Git-155)