Add "close by" filter

This commit is contained in:
Jorge Manrubia
2025-07-03 14:28:33 +02:00
parent ac2400a657
commit cd9955d938
8 changed files with 93 additions and 3 deletions
+1
View File
@@ -9,6 +9,7 @@ module Card::Closeable
scope :recently_closed_first, -> { closed.order("closures.created_at": :desc) }
scope :closed_at_window, ->(window) { closed.where("closures.created_at": window) }
scope :closed_by, ->(users) { closed.where("closures.user_id": Array(users)) }
end
def closed?
+7 -1
View File
@@ -20,7 +20,7 @@ class Filter < ApplicationRecord
@cards ||= begin
result = creator.accessible_cards.indexed_by(indexed_by)
result = result.where(id: card_ids) if card_ids.present?
result = result.open unless indexed_by.closed? || closure_window || card_ids.present?
result = result.open unless include_closed_cards?
result = result.by_engagement_status(engagement_status) if engagement_status.present?
result = result.unassigned if assignment_status.unassigned?
result = result.assigned_to(assignees.ids) if assignees.present?
@@ -30,6 +30,7 @@ class Filter < ApplicationRecord
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
result = result.closed_by(closers) if closers.present?
result = terms.reduce(result) do |result, term|
result.mentioning(term)
end
@@ -57,4 +58,9 @@ class Filter < ApplicationRecord
def cache_key
ActiveSupport::Cache.expand_cache_key collections.cache_key_with_version, super
end
private
def include_closed_cards?
indexed_by.closed? || closure_window || closers.present? || card_ids.present?
end
end
+2
View File
@@ -10,6 +10,7 @@ module Filter::Params
card_ids: [],
assignee_ids: [],
creator_ids: [],
closer_ids: [],
collection_ids: [],
stage_ids: [],
tag_ids: [],
@@ -50,6 +51,7 @@ module Filter::Params
params[:card_ids] = card_ids
params[:assignee_ids] = assignees.ids
params[:creator_ids] = creators.ids
params[:closer_ids] = closers.ids
end.compact_blank.reject(&method(:default_value?))
end
+1
View File
@@ -7,6 +7,7 @@ module Filter::Resources
has_and_belongs_to_many :stages, class_name: "Workflow::Stage", join_table: "filters_stages"
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"
end
def resource_removed(resource)
@@ -0,0 +1,11 @@
class CreateClosersFiltersJoinTable < ActiveRecord::Migration[8.1]
def change
create_table :closers_filters, id: false do |t|
t.integer :filter_id, null: false
t.integer :closer_id, null: false
end
add_index :closers_filters, :filter_id
add_index :closers_filters, :closer_id
end
end
Generated
+8 -1
View File
@@ -10,7 +10,7 @@
#
# It's strongly recommended that you check this file into your version control system.
ActiveRecord::Schema[8.1].define(version: 2025_06_25_111932) do
ActiveRecord::Schema[8.1].define(version: 2025_06_26_000000) do
create_table "accesses", force: :cascade do |t|
t.datetime "accessed_at"
t.integer "collection_id", null: false
@@ -133,6 +133,13 @@ ActiveRecord::Schema[8.1].define(version: 2025_06_25_111932) do
t.index ["stage_id"], name: "index_cards_on_stage_id"
end
create_table "closers_filters", id: false, force: :cascade do |t|
t.integer "closer_id", null: false
t.integer "filter_id", null: false
t.index ["closer_id"], name: "index_closers_filters_on_closer_id"
t.index ["filter_id"], name: "index_closers_filters_on_filter_id"
end
create_table "closure_reasons", force: :cascade do |t|
t.datetime "created_at", null: false
t.string "label"
+48 -1
View File
@@ -462,6 +462,18 @@ columns:
collation:
comment:
- *9
closers_filters:
- !ruby/object:ActiveRecord::ConnectionAdapters::SQLite3::Column
auto_increment:
name: closer_id
cast_type: *3
sql_type_metadata: *4
'null': false
default:
default_function:
collation:
comment:
- *19
closure_reasons:
- *5
- *6
@@ -1067,6 +1079,7 @@ primary_keys:
card_engagements: id
card_goldnesses: id
cards: id
closers_filters:
closure_reasons: id
closures: id
collection_publications: id
@@ -1109,6 +1122,7 @@ data_sources:
card_engagements: true
card_goldnesses: true
cards: true
closers_filters: true
closure_reasons: true
closures: true
collection_publications: true
@@ -1528,6 +1542,39 @@ indexes:
nulls_not_distinct:
comment:
valid: true
closers_filters:
- !ruby/object:ActiveRecord::ConnectionAdapters::IndexDefinition
table: closers_filters
name: index_closers_filters_on_closer_id
unique: false
columns:
- closer_id
lengths: {}
orders: {}
opclasses: {}
where:
type:
using:
include:
nulls_not_distinct:
comment:
valid: true
- !ruby/object:ActiveRecord::ConnectionAdapters::IndexDefinition
table: closers_filters
name: index_closers_filters_on_filter_id
unique: false
columns:
- filter_id
lengths: {}
orders: {}
opclasses: {}
where:
type:
using:
include:
nulls_not_distinct:
comment:
valid: true
closure_reasons: []
closures:
- !ruby/object:ActiveRecord::ConnectionAdapters::IndexDefinition
@@ -2391,4 +2438,4 @@ indexes:
comment:
valid: true
workflows: []
version: 20250625111932
version: 20250626000000
+15
View File
@@ -153,4 +153,19 @@ class FilterTest < ActiveSupport::TestCase
cards(:shipping).closure.update_columns created_at: Time.current
assert_includes filter.cards, cards(:shipping)
end
test "completed by" do
cards(:shipping).closure.update_columns user_id: users(:david).id
filter = users(:david).filters.new closer_ids: [ users(:david).id ]
assert_includes filter.cards, cards(:shipping)
filter = users(:david).filters.new closer_ids: [ users(:jz).id ]
assert_not_includes filter.cards, cards(:shipping)
cards(:shipping).closure.update_columns user_id: users(:jz).id
filter = users(:david).filters.new closer_ids: [ users(:jz).id ]
assert_includes filter.cards, cards(:shipping)
end
end