diff --git a/app/views/spree/admin/orders/bulk_management.html.haml b/app/views/spree/admin/orders/bulk_management.html.haml
index 0b0119181b..570500e68f 100644
--- a/app/views/spree/admin/orders/bulk_management.html.haml
+++ b/app/views/spree/admin/orders/bulk_management.html.haml
@@ -182,3 +182,5 @@
%a{ ng: { href: "/admin/orders/{{line_item.order.number}}/edit" }, :class => "edit-order icon-edit no-text", 'confirm-link-click' => 'confirmRefresh()' }
%td.actions
%a{ 'ng-click' => "deleteLineItem(line_item)", :class => "delete-line-item icon-trash no-text" }
+
+= render 'spree/admin/shared/custom-confirm'
diff --git a/spec/javascripts/unit/admin/line_items/controllers/line_items_controller_spec.js.coffee b/spec/javascripts/unit/admin/line_items/controllers/line_items_controller_spec.js.coffee
index 352002c83b..aec35f788b 100644
--- a/spec/javascripts/unit/admin/line_items/controllers/line_items_controller_spec.js.coffee
+++ b/spec/javascripts/unit/admin/line_items/controllers/line_items_controller_spec.js.coffee
@@ -119,24 +119,18 @@ describe "LineItemsCtrl", ->
}
scope.line_items = [ line_item1, line_item2 ]
- it "shows a different message if order will be canceled", ->
- spyOn(window, "confirm")
+ it "show popup about order cancellation only on last item deletion", ->
+ spyOn(window, "ofnCancelOrderAlert")
scope.deleteLineItem(line_item2)
- expect(confirm).not.toHaveBeenCalledWith("This operation will result in one or more empty orders, which will be cancelled. Do you wish to proceed?")
+ expect(ofnCancelOrderAlert).not.toHaveBeenCalled()
scope.deleteLineItem(line_item1)
- expect(confirm).toHaveBeenCalledWith("This operation will result in one or more empty orders, which will be cancelled. Do you wish to proceed?")
+ expect(ofnCancelOrderAlert).toHaveBeenCalled()
it "deletes the line item", ->
spyOn(window, "confirm").and.callFake(-> return true)
spyOn(LineItems, "delete")
scope.deleteLineItem(line_item2)
expect(LineItems.delete).toHaveBeenCalledWith(line_item2, jasmine.anything())
-
- it "cancels empty order", ->
- spyOn(window, "confirm").and.callFake(-> return true)
- spyOn(scope, "cancelOrder").and.callFake(-> return Promise.resolve())
- scope.deleteLineItem(line_item1)
- expect(scope.cancelOrder).toHaveBeenCalledWith(order1)
describe "deleting 'checked' line items", ->
line_item1 = line_item2 = line_item3 = line_item4 = null
@@ -169,34 +163,11 @@ describe "LineItemsCtrl", ->
scope.line_items = [ line_item1, line_item2, line_item3, line_item4 ]
it "asks for confirmation only if orders will be canceled", ->
- spyOn(window, "confirm")
+ spyOn(window, "ofnCancelOrderAlert")
line_item3.checked = true
scope.deleteLineItems(scope.line_items)
- expect(confirm).not.toHaveBeenCalled()
line_item1.checked = true
scope.deleteLineItems(scope.line_items)
- expect(confirm).toHaveBeenCalledWith("This operation will result in one or more empty orders, which will be cancelled. Do you wish to proceed?")
-
-
- it "deletes checked line items for non-empty orders", ->
- line_item1.checked = true
- line_item3.checked = true
- spyOn(window, "confirm").and.callFake(-> return true)
- spyOn(LineItems, "delete")
- scope.deleteLineItems(scope.line_items)
- expect(LineItems.delete).toHaveBeenCalledWith(line_item3)
- expect(LineItems.delete).not.toHaveBeenCalledWith(line_item1)
- expect(LineItems.delete).not.toHaveBeenCalledWith(line_item2)
- expect(LineItems.delete).not.toHaveBeenCalledWith(line_item4)
-
- it "cancels all empty orders", ->
- line_item1.checked = true
- line_item3.checked = true
- spyOn(window, "confirm").and.callFake(-> return true)
- spyOn(scope, "cancelOrder").and.callFake(-> return Promise.resolve())
- scope.deleteLineItems(scope.line_items)
- expect(scope.cancelOrder).toHaveBeenCalledWith(order1)
- expect(scope.cancelOrder).not.toHaveBeenCalledWith(order3)
describe "check boxes for line items", ->
line_item1 = line_item2 = null
diff --git a/spec/system/admin/bulk_order_management_spec.rb b/spec/system/admin/bulk_order_management_spec.rb
index 86332b06b0..5fe0e190b4 100644
--- a/spec/system/admin/bulk_order_management_spec.rb
+++ b/spec/system/admin/bulk_order_management_spec.rb
@@ -670,12 +670,21 @@ describe '
within("tr#li_#{li2.id} td.bulk") do
check "bulk"
end
- page.driver.accept_modal :confirm do
- find("div#bulk-actions-dropdown").click
- find("div#bulk-actions-dropdown div.menu_item", text: "Delete Selected" ).click
- end
- expect(page).to have_selector "tr#li_#{li1.id}"
- expect(page).to have_no_selector "tr#li_#{li2.id}"
+
+ find("div#bulk-actions-dropdown").click
+ find("div#bulk-actions-dropdown div.menu_item", text: "Delete Selected" ).click
+
+ expect(page).to have_content "This operation will result in one or more empty orders, which will be cancelled. Do you wish to proceed?"
+
+ expect do
+ within(".modal", visible: true) do
+ check("send_cancellation_email")
+ click_on("OK")
+ end
+ expect(page).to have_selector "tr#li_#{li1.id}"
+ expect(page).to have_no_selector "tr#li_#{li2.id}"
+ expect(o2.reload.state).to eq("canceled")
+ end.to have_enqueued_mail(Spree::OrderMailer, :cancel_email)
end
end
@@ -695,10 +704,14 @@ describe '
check "toggle_bulk"
fill_in "quick_search", with: o1.number
expect(page).to have_no_selector "tr#li_#{li2.id}"
- page.driver.accept_modal :confirm do
- find("div#bulk-actions-dropdown").click
- find("div#bulk-actions-dropdown div.menu_item", text: "Delete Selected" ).click
+
+ find("div#bulk-actions-dropdown").click
+ find("div#bulk-actions-dropdown div.menu_item", text: "Delete Selected" ).click
+
+ within ".modal", visible: true do
+ click_on("OK")
end
+
expect(page).to have_no_selector "tr#li_#{li1.id}"
expect(page).to have_selector "#quick_search"
fill_in "quick_search", with: ''
@@ -765,19 +778,57 @@ describe '
let!(:li1) { create(:line_item_with_shipment, order: o1 ) }
let!(:li2) { create(:line_item_with_shipment, order: o2 ) }
- before :each do
- visit_bulk_order_management
+ context "when deleting a line item of an order that have more than one line item" do
+ let!(:li12) { create(:line_item_with_shipment, order: o1 ) }
+
+ it "removes a line item when the relevant delete button is clicked" do
+ visit_bulk_order_management
+
+ expect(page).to have_selector "a.delete-line-item", count: 3
+ accept_alert do
+ find("tr#li_#{li1.id} a.delete-line-item").click
+ end
+ expect(page).to have_selector "a.delete-line-item", count: 2
+ end
end
- it "removes a line item when the relevant delete button is clicked" do
- expect(page).to have_selector "a.delete-line-item", count: 2
- accept_alert do
- find("tr#li_#{li1.id} a.delete-line-item").click
+ context "when deleting the last item of an order, it shows a modal about order cancellation" do
+ before :each do
+ visit_bulk_order_management
+ expect(page).to have_selector "a.delete-line-item", count: 2
+ find("tr#li_#{li2.id} a.delete-line-item").click
+ expect(page).to have_content "This operation will result in one or more empty orders, which will be cancelled. Do you wish to proceed?"
+ end
+
+ it "the user can cancel : no line item is deleted" do
+ within(".modal", visible: true) do
+ click_on("Cancel")
+ end
+ expect(o2.reload.line_items.length).to eq(1)
+ expect(page).to have_selector "a.delete-line-item", count: 2
+ end
+
+ it "the user can confirm : line item is then deleted and order is canceled" do
+ expect do
+ within(".modal", visible: true) do
+ uncheck("send_cancellation_email")
+ click_on("OK")
+ end
+ expect(page).to have_selector "a.delete-line-item", count: 1
+ expect(o2.reload.state).to eq("canceled")
+ end.to_not have_enqueued_mail(Spree::OrderMailer, :cancel_email)
+ end
+
+ it "the user can confirm + wants to send email confirmation : line item is then deleted, order is canceled and email is sent" do
+ expect do
+ within(".modal", visible: true) do
+ check("send_cancellation_email")
+ click_on("OK")
+ end
+ expect(page).to have_selector "a.delete-line-item", count: 1
+ expect(o2.reload.state).to eq("canceled")
+ end.to have_enqueued_mail(Spree::OrderMailer, :cancel_email)
end
- expect(page).to have_no_selector "a.delete-line-item", count: 2
- expect(page).to have_selector "a.delete-line-item", count: 1
- visit_bulk_order_management
- expect(page).to have_selector "a.delete-line-item", count: 1
end
end
end