From bcad6b913ce965bd3ee4e91897f2841e110f07d8 Mon Sep 17 00:00:00 2001 From: Andy Smith Date: Thu, 4 Dec 2025 12:11:13 -0600 Subject: [PATCH 1/3] Update pinned cards when the title changes --- app/models/card/pinnable.rb | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/app/models/card/pinnable.rb b/app/models/card/pinnable.rb index ff3407ea0..2267a1388 100644 --- a/app/models/card/pinnable.rb +++ b/app/models/card/pinnable.rb @@ -3,6 +3,14 @@ module Card::Pinnable included do has_many :pins, dependent: :destroy + + after_update_commit :broadcast_pin_updates + end + + def broadcast_pin_updates + pins.each do |pin| + pin.broadcast_replace_to [ pin.user, :pins_tray ], partial: "my/pins/pin" + end end def pinned_by?(user) From c89db89f2a5739fbe36d52bd90ff6aa252e07ccc Mon Sep 17 00:00:00 2001 From: Jorge Manrubia Date: Fri, 5 Dec 2025 10:03:30 +0100 Subject: [PATCH 2/3] Only broadcast when the preview changes, use the _later variant for the broadcast, add tests --- app/models/card/broadcastable.rb | 11 +++++++++ app/models/card/pinnable.rb | 15 ++++++------ test/models/card/pinnable_test.rb | 40 +++++++++++++++++++++++++++++++ 3 files changed, 59 insertions(+), 7 deletions(-) create mode 100644 test/models/card/pinnable_test.rb diff --git a/app/models/card/broadcastable.rb b/app/models/card/broadcastable.rb index aa24b776c..9cf112200 100644 --- a/app/models/card/broadcastable.rb +++ b/app/models/card/broadcastable.rb @@ -3,5 +3,16 @@ module Card::Broadcastable included do broadcasts_refreshes + + before_update :remember_if_preview_changed end + + private + def remember_if_preview_changed + @preview_changed ||= title_changed? || column_id_changed? || board_id_changed? + end + + def preview_changed? + @preview_changed + end end diff --git a/app/models/card/pinnable.rb b/app/models/card/pinnable.rb index 2267a1388..9929a785d 100644 --- a/app/models/card/pinnable.rb +++ b/app/models/card/pinnable.rb @@ -4,13 +4,7 @@ module Card::Pinnable included do has_many :pins, dependent: :destroy - after_update_commit :broadcast_pin_updates - end - - def broadcast_pin_updates - pins.each do |pin| - pin.broadcast_replace_to [ pin.user, :pins_tray ], partial: "my/pins/pin" - end + after_update_commit :broadcast_pin_updates, if: :preview_changed? end def pinned_by?(user) @@ -28,4 +22,11 @@ module Card::Pinnable def unpin_by(user) pins.find_by(user: user).tap { it.destroy } end + + private + def broadcast_pin_updates + pins.find_each do |pin| + pin.broadcast_replace_later_to [ pin.user, :pins_tray ], partial: "my/pins/pin" + end + end end diff --git a/test/models/card/pinnable_test.rb b/test/models/card/pinnable_test.rb new file mode 100644 index 000000000..d19348afd --- /dev/null +++ b/test/models/card/pinnable_test.rb @@ -0,0 +1,40 @@ +require "test_helper" + +class Card::PinnableTest < ActiveSupport::TestCase + setup do + Current.session = sessions(:david) + end + + test "broadcasts pin update when title changes" do + assert_broadcasted_pin_update do + cards(:logo).update!(title: "New title") + end + end + + test "broadcasts pin update when column changes" do + assert_broadcasted_pin_update do + cards(:logo).update!(column: columns(:writebook_in_progress)) + end + end + + test "broadcasts pin update when board changes" do + assert_broadcasted_pin_update do + cards(:logo).update!(board: boards(:private), column: nil) + end + end + + test "does not broadcast pin update when other properties change" do + perform_enqueued_jobs do + assert_turbo_stream_broadcasts([ pins(:logo_kevin).user, :pins_tray ], count: 0) do + cards(:logo).update!(last_active_at: Time.current) + end + end + end + + private + def assert_broadcasted_pin_update(&block) + perform_enqueued_jobs do + assert_turbo_stream_broadcasts([ pins(:logo_kevin).user, :pins_tray ], &block) + end + end +end From 59ff50c1cb760d69eb5f4f5e47a6d6b717e467ad Mon Sep 17 00:00:00 2001 From: Jorge Manrubia Date: Fri, 5 Dec 2025 10:08:04 +0100 Subject: [PATCH 3/3] We can remove ad-hoc handling now that we rely on page refreshes in the card perma --- app/models/card/eventable.rb | 5 ----- app/views/card/display/_refresh_activity.turbo_stream.erb | 4 ---- 2 files changed, 9 deletions(-) delete mode 100644 app/views/card/display/_refresh_activity.turbo_stream.erb diff --git a/app/models/card/eventable.rb b/app/models/card/eventable.rb index c52fb7a29..520fd95d4 100644 --- a/app/models/card/eventable.rb +++ b/app/models/card/eventable.rb @@ -19,7 +19,6 @@ module Card::Eventable def touch_last_active_at # Not using touch so that we can detect attribute change on callbacks update!(last_active_at: Time.current) - broadcast_activity end private @@ -36,8 +35,4 @@ module Card::Eventable def create_system_comment_for(event) SystemCommenter.new(self, event).comment end - - def broadcast_activity - broadcast_render_later_to self, :activity, partial: "card/display/refresh_activity", locals: { card: self } - end end diff --git a/app/views/card/display/_refresh_activity.turbo_stream.erb b/app/views/card/display/_refresh_activity.turbo_stream.erb deleted file mode 100644 index a5a603252..000000000 --- a/app/views/card/display/_refresh_activity.turbo_stream.erb +++ /dev/null @@ -1,4 +0,0 @@ -<%= turbo_stream.remove dom_id(card, "bubble") %> -<%= turbo_stream.replace dom_id(card, :card_closure_toggle) do %> - <%= render "cards/container/closure", card: card %> -<% end %>