From ad0ffd2a64f75e22f8ac374b924dbaec67c43b36 Mon Sep 17 00:00:00 2001 From: cyrillefr Date: Thu, 19 Jan 2023 16:32:21 +0100 Subject: [PATCH 1/8] Create a new service for orders bulk cancelling --- app/services/orders_bulk_cancel_service.rb | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) create mode 100644 app/services/orders_bulk_cancel_service.rb diff --git a/app/services/orders_bulk_cancel_service.rb b/app/services/orders_bulk_cancel_service.rb new file mode 100644 index 0000000000..75641bd932 --- /dev/null +++ b/app/services/orders_bulk_cancel_service.rb @@ -0,0 +1,17 @@ +# frozen_string_literal: true + +class OrdersBulkCancelService + def initialize(params) + @order_ids = params[:order_ids] + @send_cancellation_email = params[:send_cancellation_email] + @restock_items = params[:restock_items] + end + + def call + Spree::Order.where(id: @order_ids).find_each do |order| + order.send_cancellation_email = @send_cancellation_email + order.restock_items = @restock_items + order.cancel + end + end +end From c3026406445faa3f6d50b27eb2b17905d8091a73 Mon Sep 17 00:00:00 2001 From: cyrillefr Date: Thu, 19 Jan 2023 16:38:23 +0100 Subject: [PATCH 2/8] Create a reflex that handles bulk orders cancelling --- app/reflexes/cancel_orders_reflex.rb | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 app/reflexes/cancel_orders_reflex.rb diff --git a/app/reflexes/cancel_orders_reflex.rb b/app/reflexes/cancel_orders_reflex.rb new file mode 100644 index 0000000000..dd7e3a35d3 --- /dev/null +++ b/app/reflexes/cancel_orders_reflex.rb @@ -0,0 +1,9 @@ +# frozen_string_literal: true + +class CancelOrdersReflex < ApplicationReflex + def confirm(params) + OrdersBulkCancelService.new(params).call + cable_ready.dispatch_event(name: "modal:close") + # flash[:success] = Spree.t(:order_updated) + end +end From 7a967715aa7cb8f4de6012bbdd0dce0ac409c65d Mon Sep 17 00:00:00 2001 From: cyrillefr Date: Thu, 19 Jan 2023 16:39:01 +0100 Subject: [PATCH 3/8] Create Stimulus CancelOrder controller --- .../controllers/cancel_orders_controller.js | 30 +++++++++++++++++++ 1 file changed, 30 insertions(+) create mode 100644 app/webpacker/controllers/cancel_orders_controller.js diff --git a/app/webpacker/controllers/cancel_orders_controller.js b/app/webpacker/controllers/cancel_orders_controller.js new file mode 100644 index 0000000000..d1872feb07 --- /dev/null +++ b/app/webpacker/controllers/cancel_orders_controller.js @@ -0,0 +1,30 @@ +import ApplicationController from "./application_controller"; + +export default class extends ApplicationController { + connect() { + super.connect(); + } + + confirm() { + const send_cancellation_email = document.querySelector( + "#send_cancellation_email" + ).checked; + const restock_items = document.querySelector("#restock_items").checked; + const order_ids = []; + + document + .querySelectorAll("#listing_orders input[name='order_ids[]']:checked") + .forEach((checkbox) => { + order_ids.push(checkbox.value); + }); + + const params = { + order_ids: order_ids, + send_cancellation_email: send_cancellation_email, + restock_items: restock_items, + }; + this.stimulate("CancelOrdersReflex#confirm", params).then(() => + window.location.reload() + ); + } +} From 332c95dec50ac90949dc8189070832d42915def3 Mon Sep 17 00:00:00 2001 From: cyrillefr Date: Thu, 19 Jan 2023 16:39:48 +0100 Subject: [PATCH 4/8] Modify actual modal confirm component - Need to take into account some additional customn message --- app/components/confirm_modal_component.rb | 3 ++- .../confirm_modal_component/confirm_modal_component.html.haml | 2 ++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/app/components/confirm_modal_component.rb b/app/components/confirm_modal_component.rb index 5df7d9ba54..d942ed5551 100644 --- a/app/components/confirm_modal_component.rb +++ b/app/components/confirm_modal_component.rb @@ -1,10 +1,11 @@ # frozen_string_literal: true class ConfirmModalComponent < ModalComponent - def initialize(id:, confirm_actions: nil, controllers: nil) + def initialize(id:, confirm_actions: nil, controllers: nil, message: nil) super(id: id, close_button: true) @confirm_actions = confirm_actions @controllers = controllers + @message = message end private diff --git a/app/components/confirm_modal_component/confirm_modal_component.html.haml b/app/components/confirm_modal_component/confirm_modal_component.html.haml index 58feccb1ec..7da8ccebc6 100644 --- a/app/components/confirm_modal_component/confirm_modal_component.html.haml +++ b/app/components/confirm_modal_component/confirm_modal_component.html.haml @@ -3,6 +3,8 @@ .reveal-modal.fade.tiny.help-modal{ "data-modal-target": "modal" } = content + = render @message if @message + .modal-actions %input{ class: "button icon-plus #{close_button_class}", type: 'button', value: t('js.admin.modals.cancel'), "data-action": "click->modal#close" } %input{ class: "button icon-plus primary", type: 'button', value: t('js.admin.modals.confirm'), "data-action": @confirm_actions } From 597e9eae2b7e74b007619425ee1126b748d346f8 Mon Sep 17 00:00:00 2001 From: cyrillefr Date: Thu, 19 Jan 2023 16:40:57 +0100 Subject: [PATCH 5/8] Modify view to call Stimulus controller - Also add call to a new Modal confirm component for handling of bulk orders cancellings --- app/views/spree/admin/orders/index.html.haml | 5 ++++- .../admin/orders/messages/_cancel_orders.html.haml | 11 +++++++++++ 2 files changed, 15 insertions(+), 1 deletion(-) create mode 100644 app/views/spree/admin/orders/messages/_cancel_orders.html.haml diff --git a/app/views/spree/admin/orders/index.html.haml b/app/views/spree/admin/orders/index.html.haml index d744498fd8..c8c0c8755e 100644 --- a/app/views/spree/admin/orders/index.html.haml +++ b/app/views/spree/admin/orders/index.html.haml @@ -37,7 +37,7 @@ %span.name.invoices-modal{'ng-controller' => 'bulkInvoiceCtrl', 'ng-click' => 'createBulkInvoice()' } = t('.print_invoices') %div.menu_item - %span.name{'ng-controller' => 'bulkCancelCtrl', 'ng-click' => 'cancelSelectedOrders()' } + %span.name{ "data-controller": "modal-link", "data-action": "click->modal-link#open", "data-modal-link-target-value": "cancel_orders" } = t('.cancel_orders') = render partial: 'admin/shared/angular_per_page_controls', locals: { position: "right" } @@ -124,3 +124,6 @@ = render ConfirmModalComponent.new(id: "resend_confirmation", confirm_actions: "click->resend-confirmation-email#confirm", controllers: "resend-confirmation-email") do .margin-bottom-30 = t('.resend_confirmation_confirm_html') += render ConfirmModalComponent.new(id: "cancel_orders", confirm_actions: "click->cancel-orders#confirm", controllers: "cancel-orders", message: "spree/admin/orders/messages/cancel_orders") do + .margin-bottom-30 + = t("js.admin.orders.cancel_the_order_html") diff --git a/app/views/spree/admin/orders/messages/_cancel_orders.html.haml b/app/views/spree/admin/orders/messages/_cancel_orders.html.haml new file mode 100644 index 0000000000..00d30d1eed --- /dev/null +++ b/app/views/spree/admin/orders/messages/_cancel_orders.html.haml @@ -0,0 +1,11 @@ +.modal-message + .form + %input{ type: "checkbox", name: "send_cancellation_email", value: "1", id: "send_cancellation_email", checked: "true" } + %label{ for: "send_cancellation_email" } + = t("js.admin.orders.cancel_the_order_send_cancelation_email") + %br + %input{ type: "checkbox", name: "restock_items", id: "restock_items", checked: "true" } + %label{ for: "restock_items" } + = t("js.admin.orders.restock_items") + .margin-bottom-30 + From 1682f6788d8bd4323997527ecb10655a6ffa3311 Mon Sep 17 00:00:00 2001 From: cyrillefr Date: Thu, 19 Jan 2023 16:45:33 +0100 Subject: [PATCH 6/8] Delete unused code Delete now unused code for Angular style bulk orders cancelling - the Angular controller file - the bulk_cancel method from controller - the corresponding entry in route --- .../controllers/bulk_cancel_controller.js.coffee | 14 -------------- app/controllers/spree/admin/orders_controller.rb | 12 ------------ config/routes/spree.rb | 1 - 3 files changed, 27 deletions(-) delete mode 100644 app/assets/javascripts/admin/orders/controllers/bulk_cancel_controller.js.coffee diff --git a/app/assets/javascripts/admin/orders/controllers/bulk_cancel_controller.js.coffee b/app/assets/javascripts/admin/orders/controllers/bulk_cancel_controller.js.coffee deleted file mode 100644 index 059f378e5d..0000000000 --- a/app/assets/javascripts/admin/orders/controllers/bulk_cancel_controller.js.coffee +++ /dev/null @@ -1,14 +0,0 @@ -angular.module("admin.orders").controller "bulkCancelCtrl", ($scope, $http, $timeout) -> - - $scope.cancelOrder = (orderIds, sendEmailCancellation, restock_items) -> - $http( - method: 'post' - url: "/admin/orders/bulk_cancel?order_ids=#{orderIds}&send_cancellation_email=#{sendEmailCancellation}&restock_items=#{restock_items}" ).then(-> - window.location.reload() - ) - - $scope.cancelSelectedOrders = -> - ofnCancelOrderAlert((confirm, sendEmailCancellation, restock_items) -> - if confirm - $scope.cancelOrder $scope.selected_orders, sendEmailCancellation, restock_items - ) diff --git a/app/controllers/spree/admin/orders_controller.rb b/app/controllers/spree/admin/orders_controller.rb index 2b686763be..c7bd070146 100644 --- a/app/controllers/spree/admin/orders_controller.rb +++ b/app/controllers/spree/admin/orders_controller.rb @@ -67,18 +67,6 @@ module Spree load_spree_api_key end - def bulk_cancel - order_ids = params[:order_ids].split(',') - - Spree::Order.where(id: order_ids).find_each do |order| - order.send_cancellation_email = params[:send_cancellation_email] != "false" - order.restock_items = params.fetch(:restock_items, "true") == "true" - order.cancel - end - - flash[:success] = Spree.t(:order_updated) - end - def fire event = params[:e] @order.send_cancellation_email = params[:send_cancellation_email] != "false" diff --git a/config/routes/spree.rb b/config/routes/spree.rb index 48e8f99c43..637c1019f6 100644 --- a/config/routes/spree.rb +++ b/config/routes/spree.rb @@ -33,7 +33,6 @@ Spree::Core::Engine.routes.draw do end resource :account, :controller => 'users' - match '/admin/orders/bulk_cancel' => 'admin/orders#bulk_cancel', :as => "admin_bulk_cancel", via: :post match '/admin/orders/bulk_management' => 'admin/orders#bulk_management', :as => "admin_bulk_order_management", via: :get match '/admin/payment_methods/show_provider_preferences' => 'admin/payment_methods#show_provider_preferences', :via => :get From abf90b8437d13223034d4bb9705c4d89178cd654 Mon Sep 17 00:00:00 2001 From: cyrillefr Date: Tue, 7 Feb 2023 15:37:52 +0100 Subject: [PATCH 7/8] Modify spec for orders --- spec/system/admin/orders_spec.rb | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/spec/system/admin/orders_spec.rb b/spec/system/admin/orders_spec.rb index cb271921f2..cc9a766a61 100644 --- a/spec/system/admin/orders_spec.rb +++ b/spec/system/admin/orders_spec.rb @@ -432,7 +432,7 @@ describe ' expect(page).to have_content "Are you sure you want to proceed?" expect(page).to have_content "This will cancel the current order." - within "#custom-confirm.modal" do + within ".reveal-modal" do expect { find_button("Cancel").click # Cancels the cancel action }.to_not enqueue_job(ActionMailer::MailDeliveryJob).exactly(:twice) @@ -443,9 +443,9 @@ describe ' page.find("span", text: "Cancel Orders").click end - within "#custom-confirm.modal" do + within ".reveal-modal" do expect { - find_button("OK").click # Confirms the cancel action + find_button("Confirm").click # Confirms the cancel action }.to_not enqueue_job(ActionMailer::MailDeliveryJob).exactly(:twice) end From c37564eea7982755c0176b827fe3f4e477aa830c Mon Sep 17 00:00:00 2001 From: cyrillefr Date: Tue, 7 Feb 2023 15:49:56 +0100 Subject: [PATCH 8/8] Modify spec for orders bulk cancelling --- spec/system/admin/bulk_order_cancellation_spec.rb | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/spec/system/admin/bulk_order_cancellation_spec.rb b/spec/system/admin/bulk_order_cancellation_spec.rb index de9489b72b..6867bf7ba5 100644 --- a/spec/system/admin/bulk_order_cancellation_spec.rb +++ b/spec/system/admin/bulk_order_cancellation_spec.rb @@ -29,15 +29,20 @@ describe ' expect(page).to have_selector('span', text: 'COMPLETE', count: 2) page.check('selectAll') - page.find('.ofn-drop-down').click - page.find('.menu').find('span', text: 'Cancel Orders').click + page.find("span.icon-reorder", text: "ACTIONS").click + within ".ofn-drop-down-with-prepend .menu" do + page.find("span", text: "Cancel Orders").click + end - within '.modal' do - click_on "OK" + within '.reveal-modal' do + expect { + find_button("Confirm").click + }.to change { o1.reload.state }.from('complete').to('canceled') + .and change { o2.reload.state }.from('complete').to('canceled') end # Verify that the orders have a STATE of CANCELLED - expect(page).to have_selector('span', text: 'CANCELLED', count: 2) + expect(page).to have_selector('span.canceled', text: 'CANCELLED', count: 2) end end end