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")