Files

92 lines
2.2 KiB
Ruby

# frozen_string_literal: true
class TasksController < ApplicationController
before_action :fetch_task, only: %w[show edit update delete change_status]
helper_method :workflows_for_tasks
def index
self.current_project = fetch_project
@tasks = if current_project
current_project.tasks
else
Task.all
end
@tasks = @tasks.includes(:project, workflow: %i[task_statuses default_status], status: :next_statuses)
end
def show; end
def new
@project = self.current_project = fetch_project || Project.order(:name).first
@workflow = fetch_workflow || @project.workflows.first
@form = Tasks::Create.new(project_id: @project.id, workflow_id: @workflow.id,
status_id: @workflow.default_status&.id)
end
def create
@form = Tasks::Create.new(params.expect(task: %i[project_id title description status_id workflow_id]))
if @form.perform
redirect_to tasks_path(project: @form.project)
else
render :new, status: :unprocessable_entity
end
end
def edit
@form = Tasks::Update.new(@task.attributes.slice(*Tasks::Update.attribute_names))
end
def update
@form = Tasks::Update.new(params.expect(task: %i[title description status_id]))
if @form.perform(@task)
redirect_to task_path(@task)
else
render :edit, status: :unprocessable_entity
end
end
def delete
@task.destroy!
redirect_to tasks_path(project: @task.project)
end
def change_status
@form = Tasks::ChangeStatus.new(params.expect(task: :status_id))
if @form.perform(@task)
respond_to do |format|
format.html { redirect_to task_path(@task) }
format.turbo_stream
end
else
head :unprocessable_entity
end
end
private
def fetch_project
return nil if params[:project].blank?
Project.find_by!(code: params[:project])
end
def fetch_workflow
return nil if params[:workflow_id].blank?
@project.workflows.find(params[:workflow_id])
end
def fetch_task
@task = Task.includes(:project).find_by_full_number_or_id!(params[:id])
self.current_project = @task.project
end
def workflows_for_tasks
@project.workflows.joins(:task_statuses).distinct
end
end