diff --git a/app/controllers/tasks_controller.rb b/app/controllers/tasks_controller.rb index 9776ea1..39597ff 100644 --- a/app/controllers/tasks_controller.rb +++ b/app/controllers/tasks_controller.rb @@ -18,7 +18,8 @@ class TasksController < ApplicationController def new @project = fetch_project || Project.order(:name).first - @form = Tasks::Create.new(project_id: @project.id) + @workflow = fetch_workflow || @project.workflows.first + @form = Tasks::Create.new(project_id: @project.id, workflow_id: @workflow.id) end def create @@ -70,6 +71,12 @@ class TasksController < ApplicationController 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 diff --git a/app/javascript/controllers/form_projects_selector_controller.js b/app/javascript/controllers/dependent_frames_selector_controller.js similarity index 50% rename from app/javascript/controllers/form_projects_selector_controller.js rename to app/javascript/controllers/dependent_frames_selector_controller.js index f89d0c1..108ba90 100644 --- a/app/javascript/controllers/form_projects_selector_controller.js +++ b/app/javascript/controllers/dependent_frames_selector_controller.js @@ -1,16 +1,18 @@ import { Controller } from '@hotwired/stimulus' // TODO: unite with ProjectsSelectorController? -class FormProjectsSelectorController extends Controller { +class DependentFramesSelectorController extends Controller { + static values = {'param': String} + static targets = ['frame'] - changeProject(event) { + refresh(event) { const loc = new URL(location) const selected = event.target.selectedOptions[0] - const code = selected.dataset.code - loc.searchParams.set('project', code) + const value = selected.dataset.code || selected.value + loc.searchParams.set(this.paramValue, value) Turbo.visit(loc.toString(), {frame: this.frameTarget}) } } -export default FormProjectsSelectorController +export default DependentFramesSelectorController diff --git a/app/models/workflow.rb b/app/models/workflow.rb index a39f941..28d75ff 100644 --- a/app/models/workflow.rb +++ b/app/models/workflow.rb @@ -4,7 +4,7 @@ class Workflow < ApplicationRecord belongs_to :project has_many :tasks, dependent: :restrict_with_exception - has_many :statuses, dependent: :restrict_with_error + has_many :statuses, class_name: 'TaskStatus', dependent: :restrict_with_error enum :icon, { task: 'task', warning: 'warning' }, default: 'task', scopes: false enum :color, { blue: 'blue', gray: 'gray', yellow: 'yellow', red: 'red' }, default: 'gray', scopes: false diff --git a/app/views/tasks/_table_row.html.slim b/app/views/tasks/_table_row.html.slim index e359c9b..562e0af 100644 --- a/app/views/tasks/_table_row.html.slim +++ b/app/views/tasks/_table_row.html.slim @@ -2,7 +2,10 @@ tr id="task_#{task.id}" td / TODO: extract into a presenter (and especially add color) - = image_tag('mingcute/task_line.svg', title: task.workflow.name) + - wf_icon = 'task_line' + - if task.workflow.icon == 'warning' + - wf_icon = 'warning_line' + = image_tag("mingcute/#{wf_icon}.svg", title: task.workflow.name) td= link_to task.full_number, task_path(task) td = task_status_selector task, with_form: true diff --git a/app/views/tasks/new.html.slim b/app/views/tasks/new.html.slim index df2dbcf..e40c8c3 100644 --- a/app/views/tasks/new.html.slim +++ b/app/views/tasks/new.html.slim @@ -1,17 +1,19 @@ h1 New task -= form_with model: @form, data: {controller: 'form-projects-selector'} do |form| += form_with model: @form, data: {controller: 'dependent-frames-selector', 'dependent-frames-selector-param-value': 'project'} do |form| .field = form.label :project_id - = form.select :project_id, Project.order(:name).map { |p| [p.name, p.id, {'data-code': p.code}] }, {}, data: {action: 'form-projects-selector#changeProject'} - = turbo_frame_tag :project_field_selects, data: {'form-projects-selector-target': 'frame'} do - .field - = form.label :workflow - = form.select :workflow_id, Workflow.where(project: @form.project).map { |w| [w.name, w.id] } + = form.select :project_id, Project.order(:name).map { |p| [p.name, p.id, {'data-code': p.code}] }, {}, data: {action: 'dependent-frames-selector#refresh'} + = turbo_frame_tag :project_field_selects, data: {'dependent-frames-selector-target': 'frame'} do + fieldset data={controller: 'dependent-frames-selector', 'dependent-frames-selector-param-value': 'workflow_id'} + .field + = form.label :workflow + = form.select :workflow_id, Workflow.where(project: @form.project).map { |w| [w.name, w.id] }, {}, data: {action: 'dependent-frames-selector#refresh'} - .field - = form.label :status_id - = form.select :status_id, TaskStatus.where(project: @form.project).default_order.map { |ts| [ts.name, ts.id] } + = turbo_frame_tag :status_select, data: {'dependent-frames-selector-target': 'frame'} + .field + = form.label :status_id + = form.select :status_id, TaskStatus.where(workflow: @workflow).default_order.map { |ts| [ts.name, ts.id] } .field = form.label :title = form.text_field :title