# 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