diff --git a/app/models/card.rb b/app/models/card.rb index 83a96dd6a..7893db85a 100644 --- a/app/models/card.rb +++ b/app/models/card.rb @@ -24,6 +24,7 @@ class Card < ApplicationRecord when "stalled" then stalled when "postponing_soon" then postponing_soon when "closed" then closed.recently_closed_first + when "not_now" then postponed.latest when "golden" then golden when "draft" then drafted else all diff --git a/app/models/card/not_now.rb b/app/models/card/not_now.rb index 456ff2751..dcd16a86d 100644 --- a/app/models/card/not_now.rb +++ b/app/models/card/not_now.rb @@ -1,3 +1,4 @@ class Card::NotNow < ApplicationRecord belongs_to :card, class_name: "::Card", touch: true + belongs_to :user, optional: true end diff --git a/app/models/card/postponable.rb b/app/models/card/postponable.rb index 82e30a7bc..2ad6b1b14 100644 --- a/app/models/card/postponable.rb +++ b/app/models/card/postponable.rb @@ -12,16 +12,24 @@ module Card::Postponable open? && published? && not_now.present? end + def postponed_at + not_now&.created_at + end + + def postponed_by + not_now&.user + end + def active? open? && published? && !postponed? end - def postpone + def postpone(user: Current.user) transaction do send_back_to_triage reopen activity_spike&.destroy - create_not_now! unless postponed? + create_not_now!(user: user) unless postponed? end end diff --git a/app/models/filter/fields.rb b/app/models/filter/fields.rb index 027ae8ac6..b9021149c 100644 --- a/app/models/filter/fields.rb +++ b/app/models/filter/fields.rb @@ -1,7 +1,7 @@ module Filter::Fields extend ActiveSupport::Concern - INDEXES = %w[ all stalled postponing_soon golden draft ] + INDEXES = %w[ all closed not_now stalled postponing_soon golden draft ] SORTED_BY = %w[ newest oldest latest ] delegate :default_value?, to: :class diff --git a/app/views/cards/display/common/_background.html.erb b/app/views/cards/display/common/_background.html.erb index fbe28da85..e2531886c 100644 --- a/app/views/cards/display/common/_background.html.erb +++ b/app/views/cards/display/common/_background.html.erb @@ -6,6 +6,14 @@ <%= yield %> <% end %> +<% if card.postponed? %> +
+ Not Now + <%= card.postponed_at.strftime("%b %d, %Y") %> + by <%= card.postponed_by.familiar_name %> +
+<% end %> + <% if card.closed? %>
<%= card.closure.reason %> diff --git a/db/migrate/20251015112653_add_creator_to_card_not_nows.rb b/db/migrate/20251015112653_add_creator_to_card_not_nows.rb new file mode 100644 index 000000000..747a347b9 --- /dev/null +++ b/db/migrate/20251015112653_add_creator_to_card_not_nows.rb @@ -0,0 +1,5 @@ +class AddCreatorToCardNotNows < ActiveRecord::Migration[8.1] + def change + add_reference :card_not_nows, :creator, null: false, foreign_key: { to_table: :users } + end +end diff --git a/db/migrate/20251015114014_rename_creator_to_user_in_card_not_nows.rb b/db/migrate/20251015114014_rename_creator_to_user_in_card_not_nows.rb new file mode 100644 index 000000000..5092aae67 --- /dev/null +++ b/db/migrate/20251015114014_rename_creator_to_user_in_card_not_nows.rb @@ -0,0 +1,5 @@ +class RenameCreatorToUserInCardNotNows < ActiveRecord::Migration[8.1] + def change + rename_column :card_not_nows, :creator_id, :user_id + end +end diff --git a/db/schema.rb b/db/schema.rb index c8f46b23f..828c2614a 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -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_10_14_204033) do +ActiveRecord::Schema[8.1].define(version: 2025_10_15_114014) do create_table "accesses", force: :cascade do |t| t.datetime "accessed_at" t.integer "collection_id", null: false @@ -135,7 +135,9 @@ ActiveRecord::Schema[8.1].define(version: 2025_10_14_204033) do t.integer "card_id", null: false t.datetime "created_at", null: false t.datetime "updated_at", null: false + t.integer "user_id", null: false t.index ["card_id"], name: "index_card_not_nows_on_card_id", unique: true + t.index ["user_id"], name: "index_card_not_nows_on_user_id" end create_table "cards", force: :cascade do |t| @@ -510,6 +512,7 @@ ActiveRecord::Schema[8.1].define(version: 2025_10_14_204033) do add_foreign_key "card_activity_spikes", "cards" add_foreign_key "card_goldnesses", "cards" add_foreign_key "card_not_nows", "cards" + add_foreign_key "card_not_nows", "users" add_foreign_key "cards", "columns" add_foreign_key "closures", "cards" add_foreign_key "closures", "users" diff --git a/db/schema_cache.yml b/db/schema_cache.yml index 081d6f88b..875b55cde 100644 --- a/db/schema_cache.yml +++ b/db/schema_cache.yml @@ -438,6 +438,7 @@ columns: - *5 - *6 - *9 + - *18 cards: - *24 - !ruby/object:ActiveRecord::ConnectionAdapters::SQLite3::Column @@ -1963,6 +1964,22 @@ indexes: nulls_not_distinct: comment: valid: true + - !ruby/object:ActiveRecord::ConnectionAdapters::IndexDefinition + table: card_not_nows + name: index_card_not_nows_on_user_id + unique: false + columns: + - user_id + lengths: {} + orders: {} + opclasses: {} + where: + type: + using: + include: + nulls_not_distinct: + comment: + valid: true cards: - !ruby/object:ActiveRecord::ConnectionAdapters::IndexDefinition table: cards @@ -3180,4 +3197,4 @@ indexes: nulls_not_distinct: comment: valid: true -version: 20251014204033 +version: 20251015114014 diff --git a/test/models/card/postponable_test.rb b/test/models/card/postponable_test.rb index b4a183437..89f3179ae 100644 --- a/test/models/card/postponable_test.rb +++ b/test/models/card/postponable_test.rb @@ -22,6 +22,8 @@ class Card::PostponableTest < ActiveSupport::TestCase assert_changes -> { card.reload.postponed? }, to: true do card.postpone end + + assert_equal users(:david), card.not_now.user end test "scopes" do diff --git a/test/models/filter_test.rb b/test/models/filter_test.rb index 46e796609..56a627883 100644 --- a/test/models/filter_test.rb +++ b/test/models/filter_test.rb @@ -1,6 +1,10 @@ require "test_helper" class FilterTest < ActiveSupport::TestCase + setup do + Current.session = sessions(:david) + end + test "cards" do Current.set session: sessions(:david) do @new_collection = Collection.create! name: "Inaccessible Collection" @@ -21,6 +25,10 @@ class FilterTest < ActiveSupport::TestCase filter = users(:david).filters.new indexed_by: "closed" assert_equal [ cards(:shipping) ], filter.cards + cards(:shipping).postpone + filter = users(:david).filters.new indexed_by: "now_now" + assert_includes filter.cards, cards(:shipping) + filter = users(:david).filters.new card_ids: [ cards(:logo, :layout).collect(&:id) ] assert_equal [ cards(:logo), cards(:layout) ], filter.cards