Merge pull request #9037 from jibees/9028-last-item-of-order-cancellation

BOM: show custom modal on last item deletion of an order
This commit is contained in:
Filipe
2022-04-15 18:47:51 +01:00
committed by GitHub
5 changed files with 100 additions and 66 deletions

View File

@@ -104,15 +104,21 @@ angular.module("admin.lineItems").controller 'LineItemsCtrl', ($scope, $timeout,
else
StatusMessage.display 'failure', t "unsaved_changes_error"
$scope.cancelOrder = (order) ->
$scope.cancelOrder = (order, sendEmailCancellation) ->
return $http(
method: 'GET'
url: "/admin/orders/#{order.number}/fire?e=cancel")
url: "/admin/orders/#{order.number}/fire?e=cancel&send_cancellation_email=#{sendEmailCancellation}")
$scope.deleteLineItem = (lineItem) ->
if lineItem.order.item_count == 1
if confirm(t('js.admin.deleting_item_will_cancel_order'))
$scope.cancelOrder(lineItem.order).then(-> $scope.refreshData())
ofnCancelOrderAlert((confirm, sendEmailCancellation) ->
if confirm
$scope.cancelOrder(lineItem.order, sendEmailCancellation).then(->
$scope.refreshData()
)
else
$scope.refreshData()
, "js.admin.deleting_item_will_cancel_order")
else if ($scope.confirmDelete && confirm(t "are_you_sure")) || !$scope.confirmDelete
LineItems.delete(lineItem, () -> $scope.refreshData())
@@ -129,13 +135,14 @@ angular.module("admin.lineItems").controller 'LineItemsCtrl', ($scope, $timeout,
willCancelOrders = true if (order.item_count == itemsPerOrder.get(order).length)
if willCancelOrders
return unless confirm(t("js.admin.deleting_item_will_cancel_order"))
itemsPerOrder.forEach (items, order) =>
if order.item_count == items.length
$scope.cancelOrder(order).then(-> $scope.refreshData())
else
Promise.all(LineItems.delete(item) for item in items).then(-> $scope.refreshData())
ofnCancelOrderAlert((confirm, sendEmailCancellation) ->
if confirm
itemsPerOrder.forEach (items, order) =>
if order.item_count == items.length
$scope.cancelOrder(order, sendEmailCancellation).then(-> $scope.refreshData())
else
Promise.all(LineItems.delete(item) for item in items).then(-> $scope.refreshData())
, "js.admin.deleting_item_will_cancel_order")
$scope.allBoxesChecked = ->
checkedCount = $scope.filteredLineItems.reduce (count,lineItem) ->

View File

@@ -194,9 +194,12 @@ ofnAlert = function(message) {
$('#custom-alert').show();
}
ofnCancelOrderAlert = function(callback) {
ofnCancelOrderAlert = function(callback, i18nKey) {
if (i18nKey == undefined) {
i18nKey = "js.admin.orders.cancel_the_order_html";
}
$('#custom-confirm .message').html(
` ${t("js.admin.orders.cancel_the_order_html")}
` ${t(i18nKey)}
<div class="form">
<input type="checkbox" name="send_cancellation_email" value="1" id="send_cancellation_email" />
<label for="send_cancellation_email">${t("js.admin.orders.cancel_the_order_send_cancelation_email")}</label>

View File

@@ -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'

View File

@@ -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

View File

@@ -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