From 3d7a4ae677f16dd2a643d25cbaba7800e7b8870e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20B=C3=B6hm?= Date: Thu, 15 Aug 2024 15:50:41 +0200 Subject: [PATCH] Added broadcast feature to operator_jobs when job is canceled --- app/controllers/jobs_controller.rb | 41 +++++++++++++-- app/controllers/operator/jobs_controller.rb | 6 ++- .../operator/jobs/_job_status_card.html.erb | 9 ++++ app/views/operator/jobs/index.html.erb | 50 ++----------------- ...rbo_stream.erb => update.turbo_stream.erb} | 0 5 files changed, 55 insertions(+), 51 deletions(-) create mode 100644 app/views/operator/jobs/_job_status_card.html.erb rename app/views/operator/jobs/{cancel.turbo_stream.erb => update.turbo_stream.erb} (100%) diff --git a/app/controllers/jobs_controller.rb b/app/controllers/jobs_controller.rb index 28a4ebe..5c18f1e 100644 --- a/app/controllers/jobs_controller.rb +++ b/app/controllers/jobs_controller.rb @@ -16,8 +16,7 @@ class JobsController < ApplicationController respond_to do |format| if @job.save flash[:notice] = "Job was successfully created." - Turbo::StreamsChannel.broadcast_prepend_later_to "jobs", target: :jobs, partial: "jobs/job_tr", - locals: { job: @job } + broadcast_create_job job: @job format.html { redirect_to jobs_url } else format.html { render :new, status: :unprocessable_entity } @@ -34,7 +33,7 @@ class JobsController < ApplicationController end respond_to do |format| - broadcast_update_job + broadcast_update_job(job: @job, status_changed: true) format.turbo_stream format.html { redirect_to jobs_url } end @@ -42,8 +41,40 @@ class JobsController < ApplicationController private - def broadcast_update_job - Turbo::StreamsChannel.broadcast_replace_later_to "jobs", target: @job, partial: "jobs/job_tr", locals: { job: @job } + def broadcast_update_status_cards(job:) + # FIXME: Duplicate code, see operator/jobs_controller, move to the model + openjobs = Job.open.order(:created_at) + printingjobs = Job.printing.order(:status_changed_at) + pickupjobs = Job.pickup.order(:status_changed_at) + paidjobs = Job.paid.status_changed_today.order(:status_changed_at) + canceledjobs = Job.canceled.status_changed_today.order(:status_changed_at) + Turbo::StreamsChannel.broadcast_remove_to "operator_jobs", target: job + Turbo::StreamsChannel.broadcast_replace_to "operator_jobs", target: "openjobs_status_card", partial: "operator/jobs/job_status_card", locals: { jobs: openjobs, status: :open } + Turbo::StreamsChannel.broadcast_replace_to "operator_jobs", target: "printingjobs_status_card", partial: "operator/jobs/job_status_card", locals: { jobs: printingjobs, status: :printing } + Turbo::StreamsChannel.broadcast_replace_to "operator_jobs", target: "pickupjobs_status_card", partial: "operator/jobs/job_status_card", locals: { jobs: pickupjobs, status: :pickup } + Turbo::StreamsChannel.broadcast_replace_to "operator_jobs", target: "paidjobs_status_card", partial: "operator/jobs/job_status_card", locals: { jobs: paidjobs, status: :paid } + Turbo::StreamsChannel.broadcast_replace_to "operator_jobs", target: "canceledjobs_status_card", partial: "operator/jobs/job_status_card", locals: { jobs: canceledjobs, status: :canceled } + end + + def broadcast_create_job(job:) + Turbo::StreamsChannel.broadcast_prepend_later_to "jobs", target: :jobs, partial: "jobs/job_tr", locals: { job: job } + Turbo::StreamsChannel.broadcast_prepend_later_to "operator_jobs", target: :openjobs, partial: "operator/jobs/job_tr", locals: { job: job } + broadcast_update_status_cards job: job + end + + def broadcast_update_job(job:, status_changed: false) + Turbo::StreamsChannel.broadcast_replace_later_to "jobs", target: job, partial: "jobs/job_tr", locals: { job: } + if status_changed + broadcast_update_status_cards job: job + case job.status.to_sym + when :canceled, :paid then Turbo::StreamsChannel.broadcast_append_later_to "operator_jobs", target: :paidcanceledjobs, partial: "operator/jobs/job_tr", locals: { job: job } + when :open then Turbo::StreamsChannel.broadcast_append_later_to "operator_jobs", target: :openjobs, partial: "operator/jobs/job_tr", locals: { job: job } + when :printing then Turbo::StreamsChannel.broadcast_append_later_to "operator_jobs", target: :printingjobs, partial: "operator/jobs/job_tr", locals: { job: job } + when :pickup then Turbo::StreamsChannel.broadcast_append_later_to "operator_jobs", target: :pickupjobs, partial: "operator/jobs/job_tr", locals: { job: job } + end + else + Turbo::StreamsChannel.broadcast_replace_later_to "operator_jobs", target: job, partial: "operator/jobs/job_tr", locals: { job: job } + end end # Only allow a list of trusted parameters through. diff --git a/app/controllers/operator/jobs_controller.rb b/app/controllers/operator/jobs_controller.rb index 340ba23..6393734 100644 --- a/app/controllers/operator/jobs_controller.rb +++ b/app/controllers/operator/jobs_controller.rb @@ -1,8 +1,9 @@ class Operator::JobsController < ApplicationController - before_action :set_job, only: %i[show edit update destroy cancel increment_page decrement_page] + before_action :set_job, only: %i[show edit update destroy increment_page decrement_page] # GET /jobs or /jobs.json def index + # FIXME: Move to the model (orderstuff) @openjobs = Job.open.order(:created_at) @printingjobs = Job.printing.order(:status_changed_at) @pickupjobs = Job.pickup.order(:status_changed_at) @@ -43,6 +44,7 @@ class Operator::JobsController < ApplicationController respond_to do |format| if @job.update(job_params) broadcast_update_job + # format.turbo_stream format.html { redirect_to operator_jobs_url, notice: "Job was successfully updated." } else format.html { render :edit, status: :unprocessable_entity } @@ -69,6 +71,7 @@ class Operator::JobsController < ApplicationController respond_to do |format| broadcast_update_job + # format.turbo_stream format.html { redirect_to operator_jobs_url } end end @@ -82,6 +85,7 @@ class Operator::JobsController < ApplicationController respond_to do |format| broadcast_update_job + # format.turbo_stream format.html { redirect_to operator_jobs_url } end end diff --git a/app/views/operator/jobs/_job_status_card.html.erb b/app/views/operator/jobs/_job_status_card.html.erb new file mode 100644 index 0000000..ee33efc --- /dev/null +++ b/app/views/operator/jobs/_job_status_card.html.erb @@ -0,0 +1,9 @@ + <%= link_to "##{[:paid, :canceled].include?(status.to_sym) && "paidcanceled" || status}jobs-h", class: "flex-1", id: "#{status}jobs_status_card" do %> +
+

+ <%= icon("inbox-stack", class: "text-status-#{status} icon icon-nohover") %> + <%= status %> + <%= jobs.count %> +

+
+<% end %> diff --git a/app/views/operator/jobs/index.html.erb b/app/views/operator/jobs/index.html.erb index e99ffd7..fa49d2a 100644 --- a/app/views/operator/jobs/index.html.erb +++ b/app/views/operator/jobs/index.html.erb @@ -3,51 +3,11 @@
- <%= link_to "#openjobs-h", class: "flex-1" do %> -
-

- <%= icon("inbox-stack", class: "text-status-open icon icon-nohover") %> - Open - <%= @openjobs.count %> -

-
- <% end %> - <%= link_to "#printingjobs-h", class: "flex-1" do %> -
-

- <%= icon("printer", class: "text-status-printing icon icon-nohover") %> - Printing - <%= @printingjobs.count %> -

-
- <% end %> - <%= link_to "#pickupjobs-h", class: "flex-1" do %> -
-

- <%= icon("arrow-up-tray", class: "text-status-pickup icon icon-nohover") %> - Pickup - <%= @pickupjobs.count %> -

-
- <% end %> - <%= link_to "#paidcanceledjobs-h", class: "flex-1" do %> -
-

- <%= icon("banknotes", class: "text-status-paid icon icon-nohover") %> - Paid - <%= @paidjobs.count %> -

-
- <% end %> - <%= link_to "#paidcanceledjobs-h", class: "flex-1" do %> -
-

- <%= icon("x-circle", class: "text-status-canceled icon icon-nohover") %> - Canceled - <%= @canceledjobs.count %> -

-
- <% end %> + <%= render partial: "job_status_card", locals: { jobs: @openjobs, status: :open } %> + <%= render partial: "job_status_card", locals: { jobs: @printingjobs, status: :printing } %> + <%= render partial: "job_status_card", locals: { jobs: @pickupjobs, status: :pickup } %> + <%= render partial: "job_status_card", locals: { jobs: @paidjobs, status: :paid } %> + <%= render partial: "job_status_card", locals: { jobs: @canceledjobs, status: :canceled } %>
diff --git a/app/views/operator/jobs/cancel.turbo_stream.erb b/app/views/operator/jobs/update.turbo_stream.erb similarity index 100% rename from app/views/operator/jobs/cancel.turbo_stream.erb rename to app/views/operator/jobs/update.turbo_stream.erb