Workflow default status and computing positions

This commit is contained in:
2026-04-25 16:17:14 +03:00
parent 2a0a70c290
commit debff6dc22
10 changed files with 71 additions and 15 deletions
@@ -40,7 +40,7 @@ module ProjectAdmin
@task_statuses = Array(attributes).map { |e| TaskStatus.new(e) }
end
def call(workflow)
def perform(workflow)
@workflow = workflow
@workflow.assign_attributes(task_statuses_attributes: task_statuses.map(&:to_model_attributes))
@@ -12,20 +12,50 @@ module ProjectAdmin
attribute :next_status_ids
end
attr_accessor :task_statuses
attr_accessor :workflow, :task_statuses
attribute :default_status_id, :integer
def self.from_model(workflow)
new(task_statuses_attributes: workflow.task_statuses
.includes(:next_statuses)
.map { |ts| { id: ts.id, next_status_ids: ts.next_status_ids } })
new(
workflow:,
task_statuses_attributes: workflow.task_statuses
.includes(:next_statuses)
.map { |ts| { id: ts.id, next_status_ids: ts.next_status_ids } },
default_status_id: workflow.default_status_id
)
end
def task_statuses_attributes=(attributes)
@task_statuses = Array(attributes).map { |e| TaskStatus.new(e) }
end
def call(workflow)
workflow.update(task_statuses_attributes: task_statuses.map(&:attributes))
def perform(workflow)
@workflow = workflow
workflow.assign_attributes(default_status_id:, task_statuses_attributes: task_statuses.map(&:attributes))
save workflow
end
after_success do
if @workflow.default_status.nil?
@workflow.task_statuses.update!(position: 0)
return
end
@workflow.transaction do
@workflow.default_status.update!(position: 0)
seen_status_ids = Set[@workflow.default_status.id]
statuses_to_process = [@workflow.default_status]
until statuses_to_process.empty?
status = statuses_to_process.pop
next_statuses = status.next_statuses.where.not(id: seen_status_ids)
next_statuses.update(position: status.position + 1)
statuses_to_process.concat(next_statuses.to_a)
seen_status_ids.merge(next_statuses.map(&:id))
end
end
end
end
end