5560976091
* 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"
76 lines
2.4 KiB
Ruby
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
|