2018-11-03 15:57:14 -05:00
|
|
|
class Context < ApplicationRecord
|
2007-03-30 04:36:52 +00:00
|
|
|
|
2018-11-20 19:57:02 -06:00
|
|
|
has_many :todos, -> { order(Arel.sql("todos.due IS NULL, todos.due ASC, todos.created_at ASC")).includes(:project) }, :dependent => :delete_all
|
2010-04-04 18:20:07 +02:00
|
|
|
has_many :recurring_todos, :dependent => :delete_all
|
2007-03-30 04:36:52 +00:00
|
|
|
belongs_to :user
|
2008-11-29 15:35:17 +01:00
|
|
|
|
2013-05-11 23:13:32 +02:00
|
|
|
scope :active, -> { where state: :active }
|
|
|
|
|
scope :hidden, -> { where state: :hidden }
|
|
|
|
|
scope :closed, -> { where state: :closed }
|
2013-03-12 19:49:19 -05:00
|
|
|
scope :with_name, lambda { |name| where("name LIKE ?", name) }
|
2008-11-29 15:35:17 +01:00
|
|
|
|
2011-09-13 11:15:14 +02:00
|
|
|
acts_as_list :scope => :user, :top_of_list => 0
|
2007-03-30 04:36:52 +00:00
|
|
|
|
2013-02-27 22:35:49 +01:00
|
|
|
# state machine
|
|
|
|
|
include AASM
|
|
|
|
|
|
2013-04-29 11:53:32 +02:00
|
|
|
aasm :column => :state do
|
2014-08-14 21:05:05 -05:00
|
|
|
|
2013-04-29 11:53:32 +02:00
|
|
|
state :active, :initial => true
|
|
|
|
|
state :closed
|
|
|
|
|
state :hidden
|
2013-02-27 22:35:49 +01:00
|
|
|
|
2013-04-29 11:53:32 +02:00
|
|
|
event :close do
|
|
|
|
|
transitions :to => :closed, :from => [:active, :hidden], :guard => :no_active_todos?
|
|
|
|
|
end
|
2013-02-27 22:35:49 +01:00
|
|
|
|
2013-04-29 11:53:32 +02:00
|
|
|
event :hide do
|
|
|
|
|
transitions :to => :hidden, :from => [:active, :closed]
|
|
|
|
|
end
|
2013-02-27 22:35:49 +01:00
|
|
|
|
2013-04-29 11:53:32 +02:00
|
|
|
event :activate do
|
|
|
|
|
transitions :to => :active, :from => [:closed, :hidden]
|
|
|
|
|
end
|
2013-02-27 22:35:49 +01:00
|
|
|
end
|
|
|
|
|
|
2007-03-30 04:36:52 +00:00
|
|
|
validates_presence_of :name, :message => "context must have a name"
|
|
|
|
|
validates_length_of :name, :maximum => 255, :message => "context name must be less than 256 characters"
|
2020-08-20 18:33:36 +03:00
|
|
|
validates_uniqueness_of :name, :message => "already exists", :scope => "user_id", :case_sensitive => false
|
2007-03-30 04:36:52 +00:00
|
|
|
|
|
|
|
|
def self.null_object
|
|
|
|
|
NullContext.new
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
def title
|
|
|
|
|
name
|
|
|
|
|
end
|
2011-09-13 11:15:14 +02:00
|
|
|
|
2013-02-27 22:35:49 +01:00
|
|
|
def no_active_todos?
|
|
|
|
|
return todos.active.count == 0
|
|
|
|
|
end
|
|
|
|
|
|
2007-03-30 04:36:52 +00:00
|
|
|
end
|
|
|
|
|
|
|
|
|
|
class NullContext
|
2011-09-13 11:15:14 +02:00
|
|
|
|
2007-03-30 04:36:52 +00:00
|
|
|
def nil?
|
|
|
|
|
true
|
|
|
|
|
end
|
2011-09-13 11:15:14 +02:00
|
|
|
|
2007-03-30 04:36:52 +00:00
|
|
|
def id
|
|
|
|
|
nil
|
|
|
|
|
end
|
2011-09-13 11:15:14 +02:00
|
|
|
|
2007-03-30 04:36:52 +00:00
|
|
|
def name
|
|
|
|
|
''
|
|
|
|
|
end
|
2011-09-13 11:15:14 +02:00
|
|
|
|
2013-03-12 19:49:19 -05:00
|
|
|
end
|