From f0a28b15a98d99a2f3450d2059dc8c68224dbf34 Mon Sep 17 00:00:00 2001 From: Tomas Costantino Date: Tue, 9 Dec 2025 10:09:21 +0100 Subject: [PATCH 01/19] retrieve sibling columns --- app/models/column.rb | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/app/models/column.rb b/app/models/column.rb index 4c8358871..252ca6638 100644 --- a/app/models/column.rb +++ b/app/models/column.rb @@ -7,4 +7,8 @@ class Column < ApplicationRecord after_save_commit -> { cards.touch_all }, if: -> { saved_change_to_name? || saved_change_to_color? } after_destroy_commit -> { board.cards.touch_all } + + def sibling_columns + board.columns.where.not(id:).sorted + end end From eb7ef201ba851275dd38f10f8f50f77c4a3acca3 Mon Sep 17 00:00:00 2001 From: Tomas Costantino Date: Tue, 9 Dec 2025 10:09:48 +0100 Subject: [PATCH 02/19] touch siblings after create and destroy commits --- app/models/column.rb | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/app/models/column.rb b/app/models/column.rb index 252ca6638..0ff36a3b6 100644 --- a/app/models/column.rb +++ b/app/models/column.rb @@ -6,7 +6,8 @@ class Column < ApplicationRecord has_many :cards, dependent: :nullify after_save_commit -> { cards.touch_all }, if: -> { saved_change_to_name? || saved_change_to_color? } - after_destroy_commit -> { board.cards.touch_all } + after_create_commit -> { sibling_columns.touch_all } + after_destroy_commit -> { board.cards.touch_all; sibling_columns.touch_all } def sibling_columns board.columns.where.not(id:).sorted From b7042cfbd2a29d08640df7e6e26e50607cd957cf Mon Sep 17 00:00:00 2001 From: Tomas Costantino Date: Tue, 9 Dec 2025 10:11:25 +0100 Subject: [PATCH 03/19] create refresh sibling columns turbo stream partial --- app/views/columns/_refresh_siblings.turbo_stream.erb | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 app/views/columns/_refresh_siblings.turbo_stream.erb diff --git a/app/views/columns/_refresh_siblings.turbo_stream.erb b/app/views/columns/_refresh_siblings.turbo_stream.erb new file mode 100644 index 000000000..b1b9d1b52 --- /dev/null +++ b/app/views/columns/_refresh_siblings.turbo_stream.erb @@ -0,0 +1,4 @@ +<% column.sibling_columns.each do |sibling_column| %> + <%= turbo_stream.replace(dom_id(sibling_column), partial: "boards/show/column", method: :morph, locals: { column: sibling_column }) %> +<% end %> + From b06b8135d4fd1cd1a9f0f423a59c823eda7d8876 Mon Sep 17 00:00:00 2001 From: Tomas Costantino Date: Tue, 9 Dec 2025 10:13:29 +0100 Subject: [PATCH 04/19] refresh sibling columns when moving column --- app/views/columns/left_positions/create.turbo_stream.erb | 1 + app/views/columns/right_positions/create.turbo_stream.erb | 1 + 2 files changed, 2 insertions(+) diff --git a/app/views/columns/left_positions/create.turbo_stream.erb b/app/views/columns/left_positions/create.turbo_stream.erb index 70729cf1b..f7e4cf56d 100644 --- a/app/views/columns/left_positions/create.turbo_stream.erb +++ b/app/views/columns/left_positions/create.turbo_stream.erb @@ -1,4 +1,5 @@ <% if @left_column %> <%= turbo_stream.remove(dom_id(@column)) %> <%= turbo_stream.before(@left_column, partial: "boards/show/column", locals: { column: @column }) %> + <%= render "columns/refresh_siblings", column: @column %> <% end %> diff --git a/app/views/columns/right_positions/create.turbo_stream.erb b/app/views/columns/right_positions/create.turbo_stream.erb index a01ac7ce2..4ee425976 100644 --- a/app/views/columns/right_positions/create.turbo_stream.erb +++ b/app/views/columns/right_positions/create.turbo_stream.erb @@ -1,4 +1,5 @@ <% if @right_column %> <%= turbo_stream.remove(dom_id(@column)) %> <%= turbo_stream.after(@right_column, partial: "boards/show/column", locals: { column: @column }) %> + <%= render "columns/refresh_siblings", column: @column %> <% end %> From 8a7abc37969c68be399fb7d553c38388d3c166c2 Mon Sep 17 00:00:00 2001 From: Tomas Costantino Date: Tue, 9 Dec 2025 10:13:46 +0100 Subject: [PATCH 05/19] refresh sibling columns on column creation and deletion --- app/views/boards/columns/create.turbo_stream.erb | 1 + app/views/boards/columns/destroy.turbo_stream.erb | 3 ++- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/app/views/boards/columns/create.turbo_stream.erb b/app/views/boards/columns/create.turbo_stream.erb index 957547c09..6bb358856 100644 --- a/app/views/boards/columns/create.turbo_stream.erb +++ b/app/views/boards/columns/create.turbo_stream.erb @@ -1 +1,2 @@ <%= turbo_stream.before("closed-cards", partial: "boards/show/column", method: :morph, locals: { column: @column }) %> +<%= render "columns/refresh_siblings", column: @column %> diff --git a/app/views/boards/columns/destroy.turbo_stream.erb b/app/views/boards/columns/destroy.turbo_stream.erb index 7b6613a95..46b308037 100644 --- a/app/views/boards/columns/destroy.turbo_stream.erb +++ b/app/views/boards/columns/destroy.turbo_stream.erb @@ -1 +1,2 @@ -<%= turbo_stream.remove(dom_id(@column)) %> \ No newline at end of file +<%= turbo_stream.remove(dom_id(@column)) %> +<%= render "columns/refresh_siblings", column: @column %> \ No newline at end of file From 845d4a1a86370d1db9a763df690d41a2cdd6cb52 Mon Sep 17 00:00:00 2001 From: Tomas Costantino Date: Tue, 9 Dec 2025 10:19:53 +0100 Subject: [PATCH 06/19] test left and right position controller updates --- .../columns/left_positions_controller_test.rb | 11 +++++++++++ .../columns/right_positions_controller_test.rb | 11 +++++++++++ 2 files changed, 22 insertions(+) diff --git a/test/controllers/columns/left_positions_controller_test.rb b/test/controllers/columns/left_positions_controller_test.rb index 57810ca70..2f31decd9 100644 --- a/test/controllers/columns/left_positions_controller_test.rb +++ b/test/controllers/columns/left_positions_controller_test.rb @@ -21,6 +21,17 @@ class Columns::LeftPositionsControllerTest < ActionDispatch::IntegrationTest assert_equal original_position_a, column_b.reload.position end + test "move left refreshes sibling columns" do + column = columns(:writebook_in_progress) + sibling_columns = column.sibling_columns.to_a + + post column_left_position_path(column), as: :turbo_stream + + sibling_columns.each do |sibling_column| + assert_turbo_stream action: :replace, target: dom_id(sibling_column) + end + end + test "users can only reorder columns in boards they have access to" do column = columns(:writebook_in_progress) diff --git a/test/controllers/columns/right_positions_controller_test.rb b/test/controllers/columns/right_positions_controller_test.rb index 8226950ea..9bdf3099c 100644 --- a/test/controllers/columns/right_positions_controller_test.rb +++ b/test/controllers/columns/right_positions_controller_test.rb @@ -21,6 +21,17 @@ class Columns::RightPositionsControllerTest < ActionDispatch::IntegrationTest assert_equal original_position_a, column_b.reload.position end + test "move right refreshes sibling columns" do + column = columns(:writebook_in_progress) + sibling_columns = column.sibling_columns.to_a + + post column_right_position_path(column), as: :turbo_stream + + sibling_columns.each do |sibling_column| + assert_turbo_stream action: :replace, target: dom_id(sibling_column) + end + end + test "users can only reorder columns in boards they have access to" do column = columns(:writebook_triage) From 392c3680d2bcbf12f8f4a85dd0c886a07d2b689e Mon Sep 17 00:00:00 2001 From: Tomas Costantino Date: Tue, 9 Dec 2025 10:24:14 +0100 Subject: [PATCH 07/19] test board columns controller refreshes sibling columns --- .../boards/columns_controller_test.rb | 23 +++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/test/controllers/boards/columns_controller_test.rb b/test/controllers/boards/columns_controller_test.rb index 7c6e7f525..c24cd1cb3 100644 --- a/test/controllers/boards/columns_controller_test.rb +++ b/test/controllers/boards/columns_controller_test.rb @@ -19,6 +19,17 @@ class Boards::ColumnsControllerTest < ActionDispatch::IntegrationTest assert_equal "New Column", boards(:writebook).columns.last.name end + test "create refreshes sibling columns" do + board = boards(:writebook) + existing_columns = board.columns.to_a + + post board_columns_path(board), params: { column: { name: "New Column" } }, as: :turbo_stream + + existing_columns.each do |column| + assert_turbo_stream action: :replace, target: dom_id(column) + end + end + test "update" do column = columns(:writebook_in_progress) @@ -36,4 +47,16 @@ class Boards::ColumnsControllerTest < ActionDispatch::IntegrationTest assert_response :success end end + + test "destroy refreshes sibling columns" do + board = boards(:writebook) + column = columns(:writebook_on_hold) + sibling_columns = column.sibling_columns.to_a + + delete board_column_path(board, column), as: :turbo_stream + + sibling_columns.each do |sibling_column| + assert_turbo_stream action: :replace, target: dom_id(sibling_column) + end + end end From 820e8ef5e4516e466f30ca881180f00a278b98c9 Mon Sep 17 00:00:00 2001 From: Tomas Costantino Date: Tue, 9 Dec 2025 10:30:01 +0100 Subject: [PATCH 08/19] test creating/destroying columns touches siblings --- test/models/column/positioned_test.rb | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/test/models/column/positioned_test.rb b/test/models/column/positioned_test.rb index 3cd66e314..216fc9c68 100644 --- a/test/models/column/positioned_test.rb +++ b/test/models/column/positioned_test.rb @@ -59,4 +59,30 @@ class Column::PositionedTest < ActiveSupport::TestCase assert_equal original_position, rightmost_column.reload.position end + + test "creating a column touches sibling columns" do + board = boards(:writebook) + column = board.columns.first + original_updated_at = column.updated_at + + travel 1.second do + board.columns.create!(name: "New Column") + end + + assert_operator column.reload.updated_at, :>, original_updated_at + end + + test "destroying a column touches sibling columns" do + board = boards(:writebook) + columns = board.columns.sorted.to_a + column_to_keep = columns.first + column_to_destroy = columns.last + original_updated_at = column_to_keep.updated_at + + travel 1.second do + column_to_destroy.destroy + end + + assert_operator column_to_keep.reload.updated_at, :>, original_updated_at + end end From 5d1ce5a656bf72d3acb35c13d7b4fcfb25801ad6 Mon Sep 17 00:00:00 2001 From: Tomas Costantino Date: Tue, 9 Dec 2025 11:07:22 +0100 Subject: [PATCH 09/19] rename from sibling_columns to surroundings --- app/models/column.rb | 7 +------ app/models/column/positioned.rb | 6 ++++++ 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/app/models/column.rb b/app/models/column.rb index 0ff36a3b6..4c8358871 100644 --- a/app/models/column.rb +++ b/app/models/column.rb @@ -6,10 +6,5 @@ class Column < ApplicationRecord has_many :cards, dependent: :nullify after_save_commit -> { cards.touch_all }, if: -> { saved_change_to_name? || saved_change_to_color? } - after_create_commit -> { sibling_columns.touch_all } - after_destroy_commit -> { board.cards.touch_all; sibling_columns.touch_all } - - def sibling_columns - board.columns.where.not(id:).sorted - end + after_destroy_commit -> { board.cards.touch_all } end diff --git a/app/models/column/positioned.rb b/app/models/column/positioned.rb index 8518172de..ede57d139 100644 --- a/app/models/column/positioned.rb +++ b/app/models/column/positioned.rb @@ -5,6 +5,8 @@ module Column::Positioned scope :sorted, -> { order(position: :asc) } before_create :set_position + after_create_commit -> { surroundings.touch_all } + after_destroy_commit -> { surroundings.touch_all } end def move_left @@ -31,6 +33,10 @@ module Column::Positioned right_column.nil? end + def surroundings + board.columns.where(id: [ left_column&.id, right_column&.id ].compact) + end + private def set_position max_position = board.columns.maximum(:position) || 0 From fc02b664dbece7db29afed3ec5dcb6177c08651e Mon Sep 17 00:00:00 2001 From: Tomas Costantino Date: Tue, 9 Dec 2025 11:08:37 +0100 Subject: [PATCH 10/19] update refresh logic to target surroundings only --- app/views/columns/_refresh_siblings.turbo_stream.erb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/views/columns/_refresh_siblings.turbo_stream.erb b/app/views/columns/_refresh_siblings.turbo_stream.erb index b1b9d1b52..605107788 100644 --- a/app/views/columns/_refresh_siblings.turbo_stream.erb +++ b/app/views/columns/_refresh_siblings.turbo_stream.erb @@ -1,4 +1,4 @@ -<% column.sibling_columns.each do |sibling_column| %> - <%= turbo_stream.replace(dom_id(sibling_column), partial: "boards/show/column", method: :morph, locals: { column: sibling_column }) %> +<% column.surroundings.each do |surrounding| %> + <%= turbo_stream.replace(dom_id(surrounding), partial: "boards/show/column", method: :morph, locals: { column: surrounding }) %> <% end %> From 8e6e761798319aa4ab0a0d6e5870cfae216ed9fa Mon Sep 17 00:00:00 2001 From: Tomas Costantino Date: Tue, 9 Dec 2025 11:18:27 +0100 Subject: [PATCH 11/19] update views to use refresh_surroundings stream --- app/views/boards/columns/create.turbo_stream.erb | 2 +- app/views/boards/columns/destroy.turbo_stream.erb | 2 +- ....turbo_stream.erb => _refresh_surroundings.turbo_stream.erb} | 0 app/views/columns/left_positions/create.turbo_stream.erb | 2 +- app/views/columns/right_positions/create.turbo_stream.erb | 2 +- 5 files changed, 4 insertions(+), 4 deletions(-) rename app/views/columns/{_refresh_siblings.turbo_stream.erb => _refresh_surroundings.turbo_stream.erb} (100%) diff --git a/app/views/boards/columns/create.turbo_stream.erb b/app/views/boards/columns/create.turbo_stream.erb index 6bb358856..fad58eea1 100644 --- a/app/views/boards/columns/create.turbo_stream.erb +++ b/app/views/boards/columns/create.turbo_stream.erb @@ -1,2 +1,2 @@ <%= turbo_stream.before("closed-cards", partial: "boards/show/column", method: :morph, locals: { column: @column }) %> -<%= render "columns/refresh_siblings", column: @column %> +<%= render "columns/refresh_surroundings", column: @column %> diff --git a/app/views/boards/columns/destroy.turbo_stream.erb b/app/views/boards/columns/destroy.turbo_stream.erb index 46b308037..cf3f5c3db 100644 --- a/app/views/boards/columns/destroy.turbo_stream.erb +++ b/app/views/boards/columns/destroy.turbo_stream.erb @@ -1,2 +1,2 @@ <%= turbo_stream.remove(dom_id(@column)) %> -<%= render "columns/refresh_siblings", column: @column %> \ No newline at end of file +<%= render "columns/refresh_surroundings", column: @column %> diff --git a/app/views/columns/_refresh_siblings.turbo_stream.erb b/app/views/columns/_refresh_surroundings.turbo_stream.erb similarity index 100% rename from app/views/columns/_refresh_siblings.turbo_stream.erb rename to app/views/columns/_refresh_surroundings.turbo_stream.erb diff --git a/app/views/columns/left_positions/create.turbo_stream.erb b/app/views/columns/left_positions/create.turbo_stream.erb index f7e4cf56d..d973730f0 100644 --- a/app/views/columns/left_positions/create.turbo_stream.erb +++ b/app/views/columns/left_positions/create.turbo_stream.erb @@ -1,5 +1,5 @@ <% if @left_column %> <%= turbo_stream.remove(dom_id(@column)) %> <%= turbo_stream.before(@left_column, partial: "boards/show/column", locals: { column: @column }) %> - <%= render "columns/refresh_siblings", column: @column %> + <%= render "columns/refresh_surroundings", column: @column %> <% end %> diff --git a/app/views/columns/right_positions/create.turbo_stream.erb b/app/views/columns/right_positions/create.turbo_stream.erb index 4ee425976..ced53c410 100644 --- a/app/views/columns/right_positions/create.turbo_stream.erb +++ b/app/views/columns/right_positions/create.turbo_stream.erb @@ -1,5 +1,5 @@ <% if @right_column %> <%= turbo_stream.remove(dom_id(@column)) %> <%= turbo_stream.after(@right_column, partial: "boards/show/column", locals: { column: @column }) %> - <%= render "columns/refresh_siblings", column: @column %> + <%= render "columns/refresh_surroundings", column: @column %> <% end %> From 1f8c9aebfd73e7cd9213f850963b2e3d4a162d75 Mon Sep 17 00:00:00 2001 From: Tomas Costantino Date: Tue, 9 Dec 2025 11:22:51 +0100 Subject: [PATCH 12/19] update tests --- .../boards/columns_controller_test.rb | 19 +++++++++---------- .../columns/left_positions_controller_test.rb | 7 +++---- .../right_positions_controller_test.rb | 7 +++---- test/models/column/positioned_test.rb | 18 +++++++++++------- 4 files changed, 26 insertions(+), 25 deletions(-) diff --git a/test/controllers/boards/columns_controller_test.rb b/test/controllers/boards/columns_controller_test.rb index c24cd1cb3..dab8ae5bd 100644 --- a/test/controllers/boards/columns_controller_test.rb +++ b/test/controllers/boards/columns_controller_test.rb @@ -19,13 +19,13 @@ class Boards::ColumnsControllerTest < ActionDispatch::IntegrationTest assert_equal "New Column", boards(:writebook).columns.last.name end - test "create refreshes sibling columns" do + test "create refreshes surrounding columns" do board = boards(:writebook) - existing_columns = board.columns.to_a post board_columns_path(board), params: { column: { name: "New Column" } }, as: :turbo_stream - existing_columns.each do |column| + new_column = board.columns.find_by!(name: "New Column") + new_column.surroundings.each do |column| assert_turbo_stream action: :replace, target: dom_id(column) end end @@ -48,15 +48,14 @@ class Boards::ColumnsControllerTest < ActionDispatch::IntegrationTest end end - test "destroy refreshes sibling columns" do - board = boards(:writebook) - column = columns(:writebook_on_hold) - sibling_columns = column.sibling_columns.to_a + test "destroy refreshes surrounding columns" do + column = columns(:writebook_in_progress) + surroundings = column.surroundings.to_a - delete board_column_path(board, column), as: :turbo_stream + delete board_column_path(column.board, column), as: :turbo_stream - sibling_columns.each do |sibling_column| - assert_turbo_stream action: :replace, target: dom_id(sibling_column) + surroundings.each do |surrounding| + assert_turbo_stream action: :replace, target: dom_id(surrounding) end end end diff --git a/test/controllers/columns/left_positions_controller_test.rb b/test/controllers/columns/left_positions_controller_test.rb index 2f31decd9..cce5b67ef 100644 --- a/test/controllers/columns/left_positions_controller_test.rb +++ b/test/controllers/columns/left_positions_controller_test.rb @@ -21,14 +21,13 @@ class Columns::LeftPositionsControllerTest < ActionDispatch::IntegrationTest assert_equal original_position_a, column_b.reload.position end - test "move left refreshes sibling columns" do + test "move left refreshes surrounding columns" do column = columns(:writebook_in_progress) - sibling_columns = column.sibling_columns.to_a post column_left_position_path(column), as: :turbo_stream - sibling_columns.each do |sibling_column| - assert_turbo_stream action: :replace, target: dom_id(sibling_column) + column.reload.surroundings.each do |surrounding| + assert_turbo_stream action: :replace, target: dom_id(surrounding) end end diff --git a/test/controllers/columns/right_positions_controller_test.rb b/test/controllers/columns/right_positions_controller_test.rb index 9bdf3099c..16c3ebba9 100644 --- a/test/controllers/columns/right_positions_controller_test.rb +++ b/test/controllers/columns/right_positions_controller_test.rb @@ -21,14 +21,13 @@ class Columns::RightPositionsControllerTest < ActionDispatch::IntegrationTest assert_equal original_position_a, column_b.reload.position end - test "move right refreshes sibling columns" do + test "move right refreshes surrounding columns" do column = columns(:writebook_in_progress) - sibling_columns = column.sibling_columns.to_a post column_right_position_path(column), as: :turbo_stream - sibling_columns.each do |sibling_column| - assert_turbo_stream action: :replace, target: dom_id(sibling_column) + column.reload.surroundings.each do |surrounding| + assert_turbo_stream action: :replace, target: dom_id(surrounding) end end diff --git a/test/models/column/positioned_test.rb b/test/models/column/positioned_test.rb index 216fc9c68..4ef910977 100644 --- a/test/models/column/positioned_test.rb +++ b/test/models/column/positioned_test.rb @@ -60,9 +60,9 @@ class Column::PositionedTest < ActiveSupport::TestCase assert_equal original_position, rightmost_column.reload.position end - test "creating a column touches sibling columns" do + test "creating a column touches surrounding columns" do board = boards(:writebook) - column = board.columns.first + column = board.columns.sorted.last original_updated_at = column.updated_at travel 1.second do @@ -72,17 +72,21 @@ class Column::PositionedTest < ActiveSupport::TestCase assert_operator column.reload.updated_at, :>, original_updated_at end - test "destroying a column touches sibling columns" do + test "destroying a column touches surrounding columns" do board = boards(:writebook) columns = board.columns.sorted.to_a - column_to_keep = columns.first - column_to_destroy = columns.last - original_updated_at = column_to_keep.updated_at + column_to_destroy = columns[1] + left_neighbor = columns[0] + right_neighbor = columns[2] + + original_left_updated_at = left_neighbor.updated_at + original_right_updated_at = right_neighbor.updated_at travel 1.second do column_to_destroy.destroy end - assert_operator column_to_keep.reload.updated_at, :>, original_updated_at + assert_operator left_neighbor.reload.updated_at, :>, original_left_updated_at + assert_operator right_neighbor.reload.updated_at, :>, original_right_updated_at end end From fb0b787f10c667aa21b6ff0295cd2fd2f223c02e Mon Sep 17 00:00:00 2001 From: Tomas Costantino Date: Thu, 11 Dec 2025 10:25:17 +0100 Subject: [PATCH 13/19] rename surroundings to adjacent columns --- app/models/column/positioned.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/models/column/positioned.rb b/app/models/column/positioned.rb index ede57d139..d0862d1cf 100644 --- a/app/models/column/positioned.rb +++ b/app/models/column/positioned.rb @@ -33,7 +33,7 @@ module Column::Positioned right_column.nil? end - def surroundings + def adjacent_columns board.columns.where(id: [ left_column&.id, right_column&.id ].compact) end From 52fcca9438d5ddce30e4aa482dfa2e1bd75d99e8 Mon Sep 17 00:00:00 2001 From: Tomas Costantino Date: Thu, 11 Dec 2025 10:25:34 +0100 Subject: [PATCH 14/19] remove unnecessary callback --- app/models/column/positioned.rb | 2 -- 1 file changed, 2 deletions(-) diff --git a/app/models/column/positioned.rb b/app/models/column/positioned.rb index d0862d1cf..c6ef105da 100644 --- a/app/models/column/positioned.rb +++ b/app/models/column/positioned.rb @@ -5,8 +5,6 @@ module Column::Positioned scope :sorted, -> { order(position: :asc) } before_create :set_position - after_create_commit -> { surroundings.touch_all } - after_destroy_commit -> { surroundings.touch_all } end def move_left From 383c5181a9184e8f8e85c941fc02a717ef495b2e Mon Sep 17 00:00:00 2001 From: Tomas Costantino Date: Thu, 11 Dec 2025 10:28:29 +0100 Subject: [PATCH 15/19] rename file from refresh surroundings to refresh adjacent columns --- app/views/columns/_refresh_adjacent_columns.turbo_stream.erb | 3 +++ app/views/columns/_refresh_surroundings.turbo_stream.erb | 4 ---- 2 files changed, 3 insertions(+), 4 deletions(-) create mode 100644 app/views/columns/_refresh_adjacent_columns.turbo_stream.erb delete mode 100644 app/views/columns/_refresh_surroundings.turbo_stream.erb diff --git a/app/views/columns/_refresh_adjacent_columns.turbo_stream.erb b/app/views/columns/_refresh_adjacent_columns.turbo_stream.erb new file mode 100644 index 000000000..958902608 --- /dev/null +++ b/app/views/columns/_refresh_adjacent_columns.turbo_stream.erb @@ -0,0 +1,3 @@ +<% column.adjacent_columns.each do |adjacent_column| %> + <%= turbo_stream.replace(dom_id(adjacent_column), partial: "boards/show/column", method: :morph, locals: { column: adjacent_column }) %> +<% end %> diff --git a/app/views/columns/_refresh_surroundings.turbo_stream.erb b/app/views/columns/_refresh_surroundings.turbo_stream.erb deleted file mode 100644 index 605107788..000000000 --- a/app/views/columns/_refresh_surroundings.turbo_stream.erb +++ /dev/null @@ -1,4 +0,0 @@ -<% column.surroundings.each do |surrounding| %> - <%= turbo_stream.replace(dom_id(surrounding), partial: "boards/show/column", method: :morph, locals: { column: surrounding }) %> -<% end %> - From 2e629db9d6dc77c1ea3b805d0ccbe831f58765f0 Mon Sep 17 00:00:00 2001 From: Tomas Costantino Date: Thu, 11 Dec 2025 10:29:25 +0100 Subject: [PATCH 16/19] rename to use refresh adjacent columns turbo stream --- app/views/boards/columns/create.turbo_stream.erb | 2 +- app/views/boards/columns/destroy.turbo_stream.erb | 2 +- app/views/columns/left_positions/create.turbo_stream.erb | 2 +- app/views/columns/right_positions/create.turbo_stream.erb | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/app/views/boards/columns/create.turbo_stream.erb b/app/views/boards/columns/create.turbo_stream.erb index fad58eea1..10ce7df7a 100644 --- a/app/views/boards/columns/create.turbo_stream.erb +++ b/app/views/boards/columns/create.turbo_stream.erb @@ -1,2 +1,2 @@ <%= turbo_stream.before("closed-cards", partial: "boards/show/column", method: :morph, locals: { column: @column }) %> -<%= render "columns/refresh_surroundings", column: @column %> +<%= render "columns/refresh_adjacent_columns", column: @column %> diff --git a/app/views/boards/columns/destroy.turbo_stream.erb b/app/views/boards/columns/destroy.turbo_stream.erb index cf3f5c3db..8181798cc 100644 --- a/app/views/boards/columns/destroy.turbo_stream.erb +++ b/app/views/boards/columns/destroy.turbo_stream.erb @@ -1,2 +1,2 @@ <%= turbo_stream.remove(dom_id(@column)) %> -<%= render "columns/refresh_surroundings", column: @column %> +<%= render "columns/refresh_adjacent_columns", column: @column %> diff --git a/app/views/columns/left_positions/create.turbo_stream.erb b/app/views/columns/left_positions/create.turbo_stream.erb index d973730f0..75938e3ff 100644 --- a/app/views/columns/left_positions/create.turbo_stream.erb +++ b/app/views/columns/left_positions/create.turbo_stream.erb @@ -1,5 +1,5 @@ <% if @left_column %> <%= turbo_stream.remove(dom_id(@column)) %> <%= turbo_stream.before(@left_column, partial: "boards/show/column", locals: { column: @column }) %> - <%= render "columns/refresh_surroundings", column: @column %> + <%= render "columns/refresh_adjacent_columns", column: @column %> <% end %> diff --git a/app/views/columns/right_positions/create.turbo_stream.erb b/app/views/columns/right_positions/create.turbo_stream.erb index ced53c410..cabe87fc0 100644 --- a/app/views/columns/right_positions/create.turbo_stream.erb +++ b/app/views/columns/right_positions/create.turbo_stream.erb @@ -1,5 +1,5 @@ <% if @right_column %> <%= turbo_stream.remove(dom_id(@column)) %> <%= turbo_stream.after(@right_column, partial: "boards/show/column", locals: { column: @column }) %> - <%= render "columns/refresh_surroundings", column: @column %> + <%= render "columns/refresh_adjacent_columns", column: @column %> <% end %> From 51d61b5cf88cd82c3df69573b4c111612d41afc1 Mon Sep 17 00:00:00 2001 From: Tomas Costantino Date: Thu, 11 Dec 2025 10:36:56 +0100 Subject: [PATCH 17/19] update tests --- .../boards/columns_controller_test.rb | 15 +++++----- .../columns/left_positions_controller_test.rb | 6 ++-- .../right_positions_controller_test.rb | 6 ++-- test/models/column/positioned_test.rb | 30 ------------------- 4 files changed, 14 insertions(+), 43 deletions(-) diff --git a/test/controllers/boards/columns_controller_test.rb b/test/controllers/boards/columns_controller_test.rb index 5fa4cebaf..afce7d5dc 100644 --- a/test/controllers/boards/columns_controller_test.rb +++ b/test/controllers/boards/columns_controller_test.rb @@ -19,14 +19,14 @@ class Boards::ColumnsControllerTest < ActionDispatch::IntegrationTest assert_equal "New Column", boards(:writebook).columns.last.name end - test "create refreshes surrounding columns" do + test "create refreshes adjacent columns" do board = boards(:writebook) post board_columns_path(board), params: { column: { name: "New Column" } }, as: :turbo_stream new_column = board.columns.find_by!(name: "New Column") - new_column.surroundings.each do |column| - assert_turbo_stream action: :replace, target: dom_id(column) + new_column.adjacent_columns.each do |adjacent_column| + assert_turbo_stream action: :replace, target: dom_id(adjacent_column) end end @@ -49,15 +49,16 @@ class Boards::ColumnsControllerTest < ActionDispatch::IntegrationTest end - test "destroy refreshes surrounding columns" do + test "destroy refreshes adjacent columns" do column = columns(:writebook_in_progress) - surroundings = column.surroundings.to_a + adjacent_columns = column.adjacent_columns.to_a delete board_column_path(column.board, column), as: :turbo_stream - surroundings.each do |surrounding| - assert_turbo_stream action: :replace, target: dom_id(surrounding) + adjacent_columns.each do |adjacent_column| + assert_turbo_stream action: :replace, target: dom_id(adjacent_column) end + end test "index as JSON" do board = boards(:writebook) diff --git a/test/controllers/columns/left_positions_controller_test.rb b/test/controllers/columns/left_positions_controller_test.rb index cce5b67ef..6c807b0e5 100644 --- a/test/controllers/columns/left_positions_controller_test.rb +++ b/test/controllers/columns/left_positions_controller_test.rb @@ -21,13 +21,13 @@ class Columns::LeftPositionsControllerTest < ActionDispatch::IntegrationTest assert_equal original_position_a, column_b.reload.position end - test "move left refreshes surrounding columns" do + test "move left refreshes adjacent columns" do column = columns(:writebook_in_progress) post column_left_position_path(column), as: :turbo_stream - column.reload.surroundings.each do |surrounding| - assert_turbo_stream action: :replace, target: dom_id(surrounding) + column.reload.adjacent_columns.each do |adjacent_column| + assert_turbo_stream action: :replace, target: dom_id(adjacent_column) end end diff --git a/test/controllers/columns/right_positions_controller_test.rb b/test/controllers/columns/right_positions_controller_test.rb index 16c3ebba9..c927531be 100644 --- a/test/controllers/columns/right_positions_controller_test.rb +++ b/test/controllers/columns/right_positions_controller_test.rb @@ -21,13 +21,13 @@ class Columns::RightPositionsControllerTest < ActionDispatch::IntegrationTest assert_equal original_position_a, column_b.reload.position end - test "move right refreshes surrounding columns" do + test "move right refreshes adjacent columns" do column = columns(:writebook_in_progress) post column_right_position_path(column), as: :turbo_stream - column.reload.surroundings.each do |surrounding| - assert_turbo_stream action: :replace, target: dom_id(surrounding) + column.reload.adjacent_columns.each do |adjacent_column| + assert_turbo_stream action: :replace, target: dom_id(adjacent_column) end end diff --git a/test/models/column/positioned_test.rb b/test/models/column/positioned_test.rb index 4ef910977..3cd66e314 100644 --- a/test/models/column/positioned_test.rb +++ b/test/models/column/positioned_test.rb @@ -59,34 +59,4 @@ class Column::PositionedTest < ActiveSupport::TestCase assert_equal original_position, rightmost_column.reload.position end - - test "creating a column touches surrounding columns" do - board = boards(:writebook) - column = board.columns.sorted.last - original_updated_at = column.updated_at - - travel 1.second do - board.columns.create!(name: "New Column") - end - - assert_operator column.reload.updated_at, :>, original_updated_at - end - - test "destroying a column touches surrounding columns" do - board = boards(:writebook) - columns = board.columns.sorted.to_a - column_to_destroy = columns[1] - left_neighbor = columns[0] - right_neighbor = columns[2] - - original_left_updated_at = left_neighbor.updated_at - original_right_updated_at = right_neighbor.updated_at - - travel 1.second do - column_to_destroy.destroy - end - - assert_operator left_neighbor.reload.updated_at, :>, original_left_updated_at - assert_operator right_neighbor.reload.updated_at, :>, original_right_updated_at - end end From 5ece8f7c33b1a57d41fc75298afce153a86f9f14 Mon Sep 17 00:00:00 2001 From: Tomas Costantino Date: Thu, 11 Dec 2025 10:42:44 +0100 Subject: [PATCH 18/19] replace destroy column turbo stream for redirect_back_or_to --- app/controllers/boards/columns_controller.rb | 2 +- app/views/boards/columns/destroy.turbo_stream.erb | 2 -- 2 files changed, 1 insertion(+), 3 deletions(-) delete mode 100644 app/views/boards/columns/destroy.turbo_stream.erb diff --git a/app/controllers/boards/columns_controller.rb b/app/controllers/boards/columns_controller.rb index 9e14eb937..4b71e7f3e 100644 --- a/app/controllers/boards/columns_controller.rb +++ b/app/controllers/boards/columns_controller.rb @@ -35,7 +35,7 @@ class Boards::ColumnsController < ApplicationController @column.destroy respond_to do |format| - format.turbo_stream + format.html { redirect_back_or_to @board } format.json { head :no_content } end end diff --git a/app/views/boards/columns/destroy.turbo_stream.erb b/app/views/boards/columns/destroy.turbo_stream.erb deleted file mode 100644 index 8181798cc..000000000 --- a/app/views/boards/columns/destroy.turbo_stream.erb +++ /dev/null @@ -1,2 +0,0 @@ -<%= turbo_stream.remove(dom_id(@column)) %> -<%= render "columns/refresh_adjacent_columns", column: @column %> From 5eda42f2dd8ffcfc6057d8eae9b1bb115c5dd833 Mon Sep 17 00:00:00 2001 From: Tomas Costantino Date: Thu, 11 Dec 2025 10:49:05 +0100 Subject: [PATCH 19/19] update columns controller destroy test --- test/controllers/boards/columns_controller_test.rb | 14 +------------- 1 file changed, 1 insertion(+), 13 deletions(-) diff --git a/test/controllers/boards/columns_controller_test.rb b/test/controllers/boards/columns_controller_test.rb index afce7d5dc..b9c974321 100644 --- a/test/controllers/boards/columns_controller_test.rb +++ b/test/controllers/boards/columns_controller_test.rb @@ -40,24 +40,12 @@ class Boards::ColumnsControllerTest < ActionDispatch::IntegrationTest end test "destroy" do - column = columns(:writebook_on_hold) - - assert_difference -> { boards(:writebook).columns.count }, -1 do - delete board_column_path(boards(:writebook), column), as: :turbo_stream - assert_response :success - end - end - - - test "destroy refreshes adjacent columns" do column = columns(:writebook_in_progress) adjacent_columns = column.adjacent_columns.to_a delete board_column_path(column.board, column), as: :turbo_stream - adjacent_columns.each do |adjacent_column| - assert_turbo_stream action: :replace, target: dom_id(adjacent_column) - end + assert_redirected_to board_path(column.board) end test "index as JSON" do