From 6a9121078e3ffa473d54f8060e8222e6f9d2dfc2 Mon Sep 17 00:00:00 2001 From: Mike Dalessio Date: Sat, 28 Feb 2026 10:06:55 -0500 Subject: [PATCH 1/5] dep: Fix up Gemfile.saas.lock --- Gemfile.saas.lock | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/Gemfile.saas.lock b/Gemfile.saas.lock index 9bf66cffe..a8f3594e8 100644 --- a/Gemfile.saas.lock +++ b/Gemfile.saas.lock @@ -164,7 +164,7 @@ GIT GIT remote: https://github.com/rails/web-console.git - revision: bdbb39114348b037a515b2ce75a47457b0e647d1 + revision: 90e3474306f2367cfeaf2875e91e2bc2d71b5f0f specs: web-console (4.3.0) actionview (>= 8.0.0) @@ -382,6 +382,7 @@ GEM logger mini_mime (1.1.5) minitest (6.0.2) + drb (~> 2.0) prism (~> 1.5) mission_control-jobs (1.1.0) actioncable (>= 7.1) @@ -509,7 +510,7 @@ GEM minitest nokogiri (>= 1.6) rails-html-sanitizer (1.7.0) - loofah (~> 2.21) + loofah (~> 2.25) nokogiri (>= 1.15.7, != 1.16.7, != 1.16.6, != 1.16.5, != 1.16.4, != 1.16.3, != 1.16.2, != 1.16.1, != 1.16.0.rc1, != 1.16.0) rainbow (3.1.1) rake (13.3.1) From cc6809cd1fa23a6a81ff4dee32b9c68c32741bd6 Mon Sep 17 00:00:00 2001 From: Adrien Maston Date: Mon, 2 Mar 2026 11:03:32 +0100 Subject: [PATCH 2/5] Bump z-index --- app/assets/stylesheets/card-columns.css | 1 + 1 file changed, 1 insertion(+) diff --git a/app/assets/stylesheets/card-columns.css b/app/assets/stylesheets/card-columns.css index 44800ecdf..871e61a59 100644 --- a/app/assets/stylesheets/card-columns.css +++ b/app/assets/stylesheets/card-columns.css @@ -286,6 +286,7 @@ inset-inline-end: 0; position: absolute; translate: 100%; + z-index: 2; } @media (min-width: 640px) { From 85ba8a63d5358dbf2b634813f075d46b3965bc62 Mon Sep 17 00:00:00 2001 From: Adrien Maston Date: Mon, 2 Mar 2026 15:07:26 +0100 Subject: [PATCH 3/5] Bump z-index --- app/assets/stylesheets/native.css | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/app/assets/stylesheets/native.css b/app/assets/stylesheets/native.css index 521ca00ff..92c2ef72d 100644 --- a/app/assets/stylesheets/native.css +++ b/app/assets/stylesheets/native.css @@ -91,6 +91,10 @@ .card__board { border-radius: 0 var(--border-radius) var(--border-radius) 0; } + + .card-perma__notch--bottom { + z-index: 1; + } } /* Search From 7e05794114b8e37cc6664ec402b90576e858962d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jirka=20Hut=C3=A1rek?= Date: Fri, 27 Feb 2026 20:14:43 +0100 Subject: [PATCH 4/5] Reapply "Push event payload body updates" This reverts commit 6e9de6a017de172f3398e7a0dda8637af9109a38. --- app/models/notification/event_payload.rb | 39 +++- .../notification/push_target/web_test.rb | 204 ++++++++++++++++++ 2 files changed, 242 insertions(+), 1 deletion(-) diff --git a/app/models/notification/event_payload.rb b/app/models/notification/event_payload.rb index fba3a6cb2..f760ba40c 100644 --- a/app/models/notification/event_payload.rb +++ b/app/models/notification/event_payload.rb @@ -22,8 +22,32 @@ class Notification::EventPayload < Notification::DefaultPayload card.closure ? "Moved to Done by #{event.creator.name}" : "Closed by #{event.creator.name}" when "card_reopened" "Reopened by #{event.creator.name}" + when "card_triaged" + if column_name.present? + "Moved to #{column_name} by #{event.creator.name}" + else + "Moved by #{event.creator.name}" + end + when "card_sent_back_to_triage" + "Moved back to Maybe? by #{event.creator.name}" + when "card_board_changed", "card_collection_changed" + if new_location_name.present? + "Moved to #{new_location_name} by #{event.creator.name}" + else + "Moved by #{event.creator.name}" + end + when "card_title_changed" + if new_title.present? + "Renamed to #{new_title} by #{event.creator.name}" + else + "Renamed by #{event.creator.name}" + end + when "card_postponed" + "Moved to Not Now by #{event.creator.name}" + when "card_auto_postponed" + "Moved to Not Now due to inactivity" else - event.creator.name + "Updated by #{event.creator.name}" end end @@ -57,6 +81,19 @@ class Notification::EventPayload < Notification::DefaultPayload card.title.presence || "Card #{card.number}" end + def column_name + event.particulars.dig("particulars", "column") + end + + def new_location_name + event.particulars.dig("particulars", "new_board") || + event.particulars.dig("particulars", "new_collection") + end + + def new_title + event.particulars.dig("particulars", "new_title") + end + def card_url_with_comment_anchor(comment) Rails.application.routes.url_helpers.card_url( comment.card, diff --git a/test/models/notification/push_target/web_test.rb b/test/models/notification/push_target/web_test.rb index 94628fb82..37f23b557 100644 --- a/test/models/notification/push_target/web_test.rb +++ b/test/models/notification/push_target/web_test.rb @@ -65,6 +65,210 @@ class Notification::PushTarget::WebTest < ActiveSupport::TestCase Notification::PushTarget::Web.new(@notification).process end + test "payload for triage includes column name" do + event = events(:logo_published) + event.update!(action: "card_triaged", particulars: { "particulars" => { "column" => "In Progress" } }) + @notification.update!(source: event) + + @web_push_pool.expects(:queue).once.with do |payload, _| + payload[:body] == "Moved to In Progress by #{event.creator.name}" + end + + Notification::PushTarget::Web.new(@notification).process + end + + test "payload for triage falls back when column name is missing" do + event = events(:logo_published) + event.update!(action: "card_triaged", particulars: {}) + @notification.update!(source: event) + + @web_push_pool.expects(:queue).once.with do |payload, _| + payload[:body] == "Moved by #{event.creator.name}" + end + + Notification::PushTarget::Web.new(@notification).process + end + + test "payload for triage falls back when column name is blank" do + event = events(:logo_published) + event.update!(action: "card_triaged", particulars: { "particulars" => { "column" => "" } }) + @notification.update!(source: event) + + @web_push_pool.expects(:queue).once.with do |payload, _| + payload[:body] == "Moved by #{event.creator.name}" + end + + Notification::PushTarget::Web.new(@notification).process + end + + test "payload for sent back to triage includes Maybe?" do + event = events(:logo_published) + event.update!(action: "card_sent_back_to_triage") + @notification.update!(source: event) + + @web_push_pool.expects(:queue).once.with do |payload, _| + payload[:body] == "Moved back to Maybe? by #{event.creator.name}" + end + + Notification::PushTarget::Web.new(@notification).process + end + + test "payload for board change includes new board name" do + event = events(:logo_published) + event.update!( + action: "card_board_changed", + particulars: { "particulars" => { "old_board" => "Old Board", "new_board" => "New Board" } } + ) + @notification.update!(source: event) + + @web_push_pool.expects(:queue).once.with do |payload, _| + payload[:body] == "Moved to New Board by #{event.creator.name}" + end + + Notification::PushTarget::Web.new(@notification).process + end + + test "payload for board change falls back when board name is missing" do + event = events(:logo_published) + event.update!(action: "card_board_changed", particulars: {}) + @notification.update!(source: event) + + @web_push_pool.expects(:queue).once.with do |payload, _| + payload[:body] == "Moved by #{event.creator.name}" + end + + Notification::PushTarget::Web.new(@notification).process + end + + test "payload for board change falls back when board name is blank" do + event = events(:logo_published) + event.update!( + action: "card_board_changed", + particulars: { "particulars" => { "new_board" => "" } } + ) + @notification.update!(source: event) + + @web_push_pool.expects(:queue).once.with do |payload, _| + payload[:body] == "Moved by #{event.creator.name}" + end + + Notification::PushTarget::Web.new(@notification).process + end + + test "payload for collection change includes new collection name" do + event = events(:logo_published) + event.update!( + action: "card_collection_changed", + particulars: { "particulars" => { "new_collection" => "New Collection" } } + ) + @notification.update!(source: event) + + @web_push_pool.expects(:queue).once.with do |payload, _| + payload[:body] == "Moved to New Collection by #{event.creator.name}" + end + + Notification::PushTarget::Web.new(@notification).process + end + + test "payload for collection change falls back when collection name is missing" do + event = events(:logo_published) + event.update!(action: "card_collection_changed", particulars: {}) + @notification.update!(source: event) + + @web_push_pool.expects(:queue).once.with do |payload, _| + payload[:body] == "Moved by #{event.creator.name}" + end + + Notification::PushTarget::Web.new(@notification).process + end + + test "payload for collection change falls back when collection name is blank" do + event = events(:logo_published) + event.update!(action: "card_collection_changed", particulars: { "particulars" => { "new_collection" => "" } }) + @notification.update!(source: event) + + @web_push_pool.expects(:queue).once.with do |payload, _| + payload[:body] == "Moved by #{event.creator.name}" + end + + Notification::PushTarget::Web.new(@notification).process + end + + test "payload for title change includes new title" do + event = events(:logo_published) + event.update!( + action: "card_title_changed", + particulars: { "particulars" => { "old_title" => "Old Title", "new_title" => "New Title" } } + ) + @notification.update!(source: event) + + @web_push_pool.expects(:queue).once.with do |payload, _| + payload[:body] == "Renamed to New Title by #{event.creator.name}" + end + + Notification::PushTarget::Web.new(@notification).process + end + + test "payload for title change falls back when title is missing" do + event = events(:logo_published) + event.update!(action: "card_title_changed", particulars: {}) + @notification.update!(source: event) + + @web_push_pool.expects(:queue).once.with do |payload, _| + payload[:body] == "Renamed by #{event.creator.name}" + end + + Notification::PushTarget::Web.new(@notification).process + end + + test "payload for title change falls back when title is blank" do + event = events(:logo_published) + event.update!(action: "card_title_changed", particulars: { "particulars" => { "new_title" => "" } }) + @notification.update!(source: event) + + @web_push_pool.expects(:queue).once.with do |payload, _| + payload[:body] == "Renamed by #{event.creator.name}" + end + + Notification::PushTarget::Web.new(@notification).process + end + + test "payload for postponed includes Not Now" do + event = events(:logo_published) + event.update!(action: "card_postponed") + @notification.update!(source: event) + + @web_push_pool.expects(:queue).once.with do |payload, _| + payload[:body] == "Moved to Not Now by #{event.creator.name}" + end + + Notification::PushTarget::Web.new(@notification).process + end + + test "payload for auto postponed includes inactivity message" do + event = events(:logo_published) + event.update!(action: "card_auto_postponed") + @notification.update!(source: event) + + @web_push_pool.expects(:queue).once.with do |payload, _| + payload[:body] == "Moved to Not Now due to inactivity" + end + + Notification::PushTarget::Web.new(@notification).process + end + + test "payload for unhandled action uses updated fallback message" do + event = events(:logo_published) + event.update!(action: "card_unassigned") + @notification.update!(source: event) + + @web_push_pool.expects(:queue).once.with do |payload, _| + payload[:body] == "Updated by #{event.creator.name}" + end + + Notification::PushTarget::Web.new(@notification).process + end + test "payload for mention includes mentioner name" do @web_push_pool.expects(:queue).once.with do |payload, _| payload[:title].include?("mentioned you") From f22afa7b5689bc739140dc371eaccfb9b9422f1c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jirka=20Hut=C3=A1rek?= Date: Mon, 2 Mar 2026 15:08:23 +0100 Subject: [PATCH 5/5] Extract event particulars helper method --- app/models/notification/event_payload.rb | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/app/models/notification/event_payload.rb b/app/models/notification/event_payload.rb index f760ba40c..0154625e5 100644 --- a/app/models/notification/event_payload.rb +++ b/app/models/notification/event_payload.rb @@ -81,17 +81,20 @@ class Notification::EventPayload < Notification::DefaultPayload card.title.presence || "Card #{card.number}" end + def event_particulars + event.particulars.dig("particulars") || {} + end + def column_name - event.particulars.dig("particulars", "column") + event_particulars["column"] end def new_location_name - event.particulars.dig("particulars", "new_board") || - event.particulars.dig("particulars", "new_collection") + event_particulars["new_board"] || event_particulars["new_collection"] end def new_title - event.particulars.dig("particulars", "new_title") + event_particulars["new_title"] end def card_url_with_comment_anchor(comment)