diff --git a/app/models/filter.rb b/app/models/filter.rb index 9bfefe176a..1bd96470d1 100644 --- a/app/models/filter.rb +++ b/app/models/filter.rb @@ -28,6 +28,7 @@ def cards result = result.assigned_to(assignees.ids) if assignees.present? result = result.where(creator_id: creators.ids) if creators.present? result = result.where(board: boards.ids) if boards.present? + result = result.where(column: columns.ids) if columns.present? result = result.tagged_with(tags.ids) if tags.present? result = result.where(cards: { created_at: creation_window }) if creation_window result = result.closed_at_window(closure_window) if closure_window diff --git a/app/models/filter/params.rb b/app/models/filter/params.rb index 586a758855..5d5ebaaaaa 100644 --- a/app/models/filter/params.rb +++ b/app/models/filter/params.rb @@ -12,6 +12,7 @@ module Filter::Params creator_ids: [], closer_ids: [], board_ids: [], + column_ids: [], tag_ids: [], terms: [] ] @@ -57,7 +58,8 @@ def as_params params[:assignment_status] = assignment_status params[:terms] = terms params[:tag_ids] = tags.ids - params[:board_ids] = boards.ids + params[:board_ids] = boards.ids + params[:column_ids] = columns.ids params[:card_ids] = card_ids params[:assignee_ids] = assignees.ids params[:creator_ids] = creators.ids diff --git a/app/models/filter/resources.rb b/app/models/filter/resources.rb index 655746f492..1715a88667 100644 --- a/app/models/filter/resources.rb +++ b/app/models/filter/resources.rb @@ -4,6 +4,7 @@ module Filter::Resources included do has_and_belongs_to_many :tags has_and_belongs_to_many :boards + has_and_belongs_to_many :columns has_and_belongs_to_many :assignees, class_name: "User", join_table: "assignees_filters", association_foreign_key: "assignee_id" has_and_belongs_to_many :creators, class_name: "User", join_table: "creators_filters", association_foreign_key: "creator_id" has_and_belongs_to_many :closers, class_name: "User", join_table: "closers_filters", association_foreign_key: "closer_id" diff --git a/db/migrate/20251220080000_create_columns_filters.rb b/db/migrate/20251220080000_create_columns_filters.rb new file mode 100644 index 0000000000..5458c1bca4 --- /dev/null +++ b/db/migrate/20251220080000_create_columns_filters.rb @@ -0,0 +1,10 @@ +class CreateColumnsFilters < ActiveRecord::Migration[8.0] + def change + create_table :columns_filters, id: false do |t| + t.uuid :column_id, null: false + t.uuid :filter_id, null: false + t.index :column_id + t.index :filter_id + end + end +end diff --git a/docs/API.md b/docs/API.md index 3c1d91977b..fb922358a0 100644 --- a/docs/API.md +++ b/docs/API.md @@ -499,6 +499,7 @@ __Query Parameters:__ | Parameter | Description | |-----------|-------------| | `board_ids[]` | Filter by board ID(s) | +| `column_ids[]` | Filter by column ID(s) | | `tag_ids[]` | Filter by tag ID(s) | | `assignee_ids[]` | Filter by assignee user ID(s) | | `creator_ids[]` | Filter by card creator ID(s) | diff --git a/test/fixtures/columns_filters.yml b/test/fixtures/columns_filters.yml new file mode 100644 index 0000000000..f5f20e6222 --- /dev/null +++ b/test/fixtures/columns_filters.yml @@ -0,0 +1 @@ +# empty - populated dynamically in tests diff --git a/test/models/filter_test.rb b/test/models/filter_test.rb index bb41f3e418..3e6fa44267 100644 --- a/test/models/filter_test.rb +++ b/test/models/filter_test.rb @@ -45,6 +45,16 @@ class FilterTest < ActiveSupport::TestCase assert_empty users(:david).filters.new(board_ids: [ boards(:writebook).id ]).boards end + test "filter by column" do + filter = users(:david).filters.new column_ids: [ columns(:writebook_in_progress).id ] + assert_equal [ cards(:text) ], filter.cards + + filter = users(:david).filters.new column_ids: [ columns(:writebook_triage).id ] + assert_includes filter.cards, cards(:logo) + assert_includes filter.cards, cards(:layout) + assert_not_includes filter.cards, cards(:text) + end + test "remembering equivalent filters" do assert_difference "Filter.count", +1 do filter = users(:david).filters.remember(sorted_by: "latest", assignment_status: "unassigned", tag_ids: [ tags(:mobile).id ]) @@ -63,8 +73,8 @@ class FilterTest < ActiveSupport::TestCase end test "turning into params" do - filter = users(:david).filters.new sorted_by: "latest", tag_ids: "", assignee_ids: [ users(:jz).id ], board_ids: [ boards(:writebook).id ] - expected = { assignee_ids: [ users(:jz).id ], board_ids: [ boards(:writebook).id ] } + filter = users(:david).filters.new sorted_by: "latest", tag_ids: "", assignee_ids: [ users(:jz).id ], board_ids: [ boards(:writebook).id ], column_ids: [ columns(:writebook_in_progress).id ] + expected = { assignee_ids: [ users(:jz).id ], board_ids: [ boards(:writebook).id ], column_ids: [ columns(:writebook_in_progress).id ] } assert_equal expected, filter.as_params end