Don't update order when not enough stock

There's a user-facing change here. When you tried to update the quantity
of a line item beyond available stock, two things used to happen:

1. A warning was displayed.
2. The item's quantity was updated to the highest possible.

Unfortunately, the logic to update the line item was also reloading the
page and the warning message disappeared before it could be
acknowledged. The easiest fix was to skip the update request. And in my
opinion, it's even better to let the user decide if they still want to
update or cancel the update.

Eventually, we want to replace all this custom Javascript logic with
StimulusJS anyway. So let's not put too much effort into this. It was
important though to resolve the flaky spec which made many builds fail.
This commit is contained in:
Maikel Linke
2023-11-03 14:15:16 +11:00
parent d5dca97438
commit efc338aeeb
2 changed files with 8 additions and 15 deletions

View File

@@ -51,10 +51,10 @@ $(document).ready(function() {
quantity = maxQuantity;
save.parents('tr').find('input.line_item_quantity').val(maxQuantity);
ofnAlert(t("js.admin.orders.quantity_adjusted"));
} else {
adjustItems(shipment_number, variant_id, quantity, true);
}
toggleItemEdit();
adjustItems(shipment_number, variant_id, quantity, true);
return false;
}
$('a.save-item').click(handle_save_click);

View File

@@ -339,34 +339,27 @@ describe '
login_as_admin
visit spree.edit_admin_order_path(order)
quantity = order.line_items.first.quantity
max_quantity = 0
item = order.line_items.first
quantity = item.quantity
max_quantity = quantity + item.variant.on_hand
total = order.display_total
within("tr.stock-item", text: order.products.first.name) do
find("a.edit-item").click
expect(page).to have_input(:quantity)
max_quantity = find("input[name='quantity']")["max"].to_i
fill_in(:quantity, with: max_quantity + 1)
find("a.save-item").click
end
pending "Reload bug"
# The following modal is displayed but disappears straight away because the
# page is reloaded after the click on the save button. Somehow this happens
# only the first time the page is loaded and after that this logic seems to
# work fine.
sleep 1
within(".modal") do
expect(page).to have_content "Quantity unchanged from previous amount"
expect(page).to have_content "Insufficient stock available"
click_on "OK"
end
expect(page).to_not have_content "Loading..."
within("tr.stock-item", text: order.products.first.name) do
expect(page).to have_text(max_quantity.to_s)
expect(page).to have_field :quantity, with: max_quantity.to_s
end
expect(order.reload.line_items.first.quantity).to eq(max_quantity)
expect { item.reload }.to_not change { item.quantity }
end
it "there are infinite items available (variant is on demand)" do