diff --git a/backend/app/assets/javascripts/spree/backend/models/order.js b/backend/app/assets/javascripts/spree/backend/models/order.js
index d1faafc9e2e..c547a551649 100644
--- a/backend/app/assets/javascripts/spree/backend/models/order.js
+++ b/backend/app/assets/javascripts/spree/backend/models/order.js
@@ -21,6 +21,15 @@ Spree.Models.Order = Backbone.Model.extend({
};
_.extend(options, opts);
return this.fetch(options)
+ },
+
+ empty: function (opts) {
+ var options = {
+ url: Spree.routes.orders_api + "/" + this.id + "/empty",
+ type: 'PUT',
+ };
+ _.extend(options, opts);
+ return this.fetch(options)
}
});
diff --git a/backend/app/assets/javascripts/spree/backend/orders/cart.js b/backend/app/assets/javascripts/spree/backend/orders/cart.js
index 795bf894585..9748637288a 100644
--- a/backend/app/assets/javascripts/spree/backend/orders/cart.js
+++ b/backend/app/assets/javascripts/spree/backend/orders/cart.js
@@ -19,6 +19,12 @@ Spree.Order.initCartPage = function(order_number) {
collection: collection
});
+ new Spree.Views.Cart.EmptyCartButton({
+ el: $('.js-empty-cart'),
+ collection: collection,
+ model: order
+ });
+
new Spree.Views.Order.DetailsTotal({
el: $('#order-total'),
model: order
diff --git a/backend/app/assets/javascripts/spree/backend/views/cart/empty_cart_button.js b/backend/app/assets/javascripts/spree/backend/views/cart/empty_cart_button.js
new file mode 100644
index 00000000000..15562b4eb2f
--- /dev/null
+++ b/backend/app/assets/javascripts/spree/backend/views/cart/empty_cart_button.js
@@ -0,0 +1,29 @@
+Spree.Views.Cart.EmptyCartButton = Backbone.View.extend({
+ initialize: function() {
+ this.listenTo(this.collection, 'update', this.render);
+ this.render();
+ },
+
+ events: {
+ "click": "onClick"
+ },
+
+ onClick: function(e) {
+ e.preventDefault()
+ if (!confirm(Spree.translations.are_you_sure_delete)) {
+ return;
+ }
+
+ this.model.empty({
+ success: () => {
+ this.collection.reset()
+ this.collection.push({})
+ }
+ })
+ },
+
+ render: function() {
+ var isNew = function (item) { return item.isNew() };
+ this.$el.prop("disabled", !this.collection.length || this.collection.some(isNew));
+ }
+});
diff --git a/backend/app/assets/javascripts/spree/backend/views/cart/line_item_table.js b/backend/app/assets/javascripts/spree/backend/views/cart/line_item_table.js
index 82a20b619cd..f1cfbfd531b 100644
--- a/backend/app/assets/javascripts/spree/backend/views/cart/line_item_table.js
+++ b/backend/app/assets/javascripts/spree/backend/views/cart/line_item_table.js
@@ -1,11 +1,16 @@
Spree.Views.Cart.LineItemTable = Backbone.View.extend({
initialize: function() {
this.listenTo(this.collection, 'add', this.add);
+ this.listenTo(this.collection, 'reset', this.reset);
},
add: function(line_item) {
var view = new Spree.Views.Cart.LineItemRow({model: line_item});
view.render();
this.$el.append(view.el);
+ },
+
+ reset: function() {
+ this.$el.empty();
}
});
diff --git a/backend/app/assets/javascripts/spree/backend/views/index.js b/backend/app/assets/javascripts/spree/backend/views/index.js
index 4e7613c740c..48316b02e13 100644
--- a/backend/app/assets/javascripts/spree/backend/views/index.js
+++ b/backend/app/assets/javascripts/spree/backend/views/index.js
@@ -1,5 +1,6 @@
//= require 'spree/backend/views/calculators/tiered'
//= require 'spree/backend/views/cart/add_line_item_button'
+//= require 'spree/backend/views/cart/empty_cart_button'
//= require 'spree/backend/views/cart/line_item_row'
//= require 'spree/backend/views/cart/line_item_table'
//= require 'spree/backend/views/images/upload_zone'
diff --git a/backend/app/views/spree/admin/orders/_line_items_edit_form.html.erb b/backend/app/views/spree/admin/orders/_line_items_edit_form.html.erb
index 01b95a985f3..3cb848cd434 100644
--- a/backend/app/views/spree/admin/orders/_line_items_edit_form.html.erb
+++ b/backend/app/views/spree/admin/orders/_line_items_edit_form.html.erb
@@ -7,6 +7,7 @@
<% if can?(:update, @order) && can?(:create, Spree::LineItem) %>
+
<% end %>
<%= render "spree/admin/orders/order_details", { order: order } %>
diff --git a/backend/spec/features/admin/orders/order_details_spec.rb b/backend/spec/features/admin/orders/order_details_spec.rb
index 2da829aa335..93992b43fe1 100644
--- a/backend/spec/features/admin/orders/order_details_spec.rb
+++ b/backend/spec/features/admin/orders/order_details_spec.rb
@@ -76,6 +76,19 @@
expect(page).to have_field('quantity')
end
+ it "can remove all items with empty cart" do
+ expect(page).to have_content("spree t-shirt")
+
+ accept_confirm "Are you sure you want to delete this record?" do
+ click_on 'Empty Cart'
+ end
+
+ expect(page).not_to have_content("spree t-shirt")
+
+ # Should have a new item row
+ expect(page).to have_field('quantity')
+ end
+
# Regression test for https://github.com/spree/spree/issues/3862
it "can cancel removing an item from a shipment" do
expect(page).to have_content("spree t-shirt")