Files
fizzy/app/models/card.rb
T
Jason Zimdars 5560976091 Merge branch 'main' into gold-cards
* main:
  Try a segmented toggle for engagement
  Fix tests
  Rework min card design and meta section for all cards
  Move `title` to the `img` element so we get hover in both cases
  Remove sorting filter UI
  Sort Considering and Doing by `updated_at`
  Restore comment action icon
  Fix dot escaping container
  Seen cards should be flat
  Ensure overflow cards are hidden
  Arrow needs to match derived color
  Dialog target needs to be present
  This isn't necessary in the mini card template
  Revert "The button and dialog need not render in previews"
2025-04-10 16:42:45 -05:00

76 lines
2.4 KiB
Ruby

class Card < ApplicationRecord
include Assignable, Boostable, Colored, Commentable, Engageable, Eventable, Golden,
Messages, Notifiable, Pinnable, Closeable, Scorable, Searchable, Staged,
Statuses, Taggable, Watchable
belongs_to :collection, touch: true
belongs_to :creator, class_name: "User", default: -> { Current.user }
has_many :notifications, dependent: :destroy
has_one_attached :image, dependent: :purge_later
after_save :track_due_date_change, if: :saved_change_to_due_on?
after_save :track_title_change, if: :saved_change_to_title?
after_create :assign_initial_stage
scope :reverse_chronologically, -> { order created_at: :desc, id: :desc }
scope :chronologically, -> { order created_at: :asc, id: :asc }
scope :latest, -> { order updated_at: :desc, id: :desc }
scope :in_collection, ->(collection) { where collection: collection }
scope :indexed_by, ->(index) do
case index
when "most_active" then ordered_by_activity
when "most_discussed" then ordered_by_comments
when "most_boosted" then ordered_by_boosts
when "newest" then reverse_chronologically
when "oldest" then chronologically
when "latest" then latest
when "stalled" then ordered_by_staleness
when "closed" then closed
end
end
scope :by_engagement_status, ->(status) do
case status.to_s
when "considering" then considering
when "doing" then doing.with_golden_first
end
end
def cache_key
[ super, collection&.name ].compact.join("/")
end
private
def track_due_date_change
if due_on.present?
if due_on_before_last_save.nil?
track_event("due_date_added", particulars: { due_date: due_on })
else
track_event("due_date_changed", particulars: { due_date: due_on })
end
elsif due_on_before_last_save.present?
track_event("due_date_removed")
end
end
def track_title_change
if title_before_last_save.present?
track_event("title_changed", particulars: {
old_title: title_before_last_save,
new_title: title
})
end
end
def assign_initial_stage
if workflow_stage = collection.workflow&.stages&.first
self.stage = workflow_stage
save! touch: false
track_event :staged, stage_id: workflow_stage.id, stage_name: workflow_stage.name
end
end
end