diff --git a/app/assets/stylesheets/tasks.scss b/app/assets/stylesheets/tasks.scss index 73efd615..165d744e 100644 --- a/app/assets/stylesheets/tasks.scss +++ b/app/assets/stylesheets/tasks.scss @@ -40,6 +40,7 @@ .task-card { margin: 0; + transition: opacity 0.3s ease; } .task-state-btn i { diff --git a/app/controllers/tasks_controller.rb b/app/controllers/tasks_controller.rb index cc71570e..68cc1243 100644 --- a/app/controllers/tasks_controller.rb +++ b/app/controllers/tasks_controller.rb @@ -75,6 +75,13 @@ def update end respond_to do |format| + format.turbo_stream do + if turbo_frame_request? + render :update + else + redirect_to @task, notice: "タスクを更新しました." + end + end format.html { redirect_to @task, notice: "タスクを更新しました." } format.json { render :show, status: :ok, location: @task } end @@ -82,15 +89,29 @@ def update flash.now[:danger] = 'このタスクは他のユーザーによって更新されました.' get_form_data respond_to do |format| + format.turbo_stream do + if turbo_frame_request? + render turbo_stream: turbo_stream.replace("task_card_#{@task.id}", partial: "tasks/task", locals: { task: @task }), status: :conflict + else + render :edit, status: :conflict + end + end format.html { render :edit, status: :conflict } - format.json { render json: { error: flash[:error] }, status: :conflict } + format.json { render json: { error: flash.now[:danger] }, status: :conflict } end rescue flash.now[:danger] = 'タスクの更新に失敗しました.' get_form_data respond_to do |format| + format.turbo_stream do + if turbo_frame_request? + render turbo_stream: turbo_stream.replace("task_card_#{@task.id}", partial: "tasks/task", locals: { task: @task }), status: :unprocessable_entity + else + render :edit, status: :unprocessable_entity + end + end format.html { render :edit, status: :unprocessable_entity } - format.json { render json: @document.errors, status: :unprocessable_entity } + format.json { render json: @task.errors, status: :unprocessable_entity } end end diff --git a/app/views/tasks/_task.html.erb b/app/views/tasks/_task.html.erb index 1b8fb68a..3755230b 100644 --- a/app/views/tasks/_task.html.erb +++ b/app/views/tasks/_task.html.erb @@ -1,24 +1,24 @@ -
+
- <%= turbo_frame_tag "task_#{task.id}" do %> + <%= turbo_frame_tag "task_state_btn_#{task.id}" do %> <% if task.completed? %> <%= button_to task, method: :patch, params: { task: { task_state_id: TaskState.todo.id } }, class: "btn btn-link p-0 border-0 task-state-btn" do %> <% end %> <% else %> - <%= button_to task, method: :patch, params: { task: { task_state_id: TaskState.todo.id } }, class: "btn btn-link p-0 border-0 task-state-btn" do %> + <%= button_to task, method: :patch, params: { task: { task_state_id: TaskState.done.id } }, class: "btn btn-link p-0 border-0 task-state-btn" do %> <% end %> <% end %> <% end %> - <% unless task.completed? %> - <% if task.overdue? %> -

期限切れです!

- <% else %> -

<%= days_to_deadline_as_string task %>

- <% end %> + <% unless task.completed? %> + <% if task.overdue? %> +

期限切れです!

+ <% else %> +

<%= days_to_deadline_as_string task %>

<% end %> + <% end %> <%= link_to task.assigner.name, task.assigner, class: "text-muted text-decoration-none" %> diff --git a/app/views/tasks/update.turbo_stream.erb b/app/views/tasks/update.turbo_stream.erb new file mode 100644 index 00000000..248990bb --- /dev/null +++ b/app/views/tasks/update.turbo_stream.erb @@ -0,0 +1,3 @@ +<%= turbo_stream.replace "task_card_#{@task.id}" do %> + <%= render partial: "task", locals: { task: @task } %> +<% end %>