From f8fe5c619646ef622c3c6653bc1f4d5e00c9f9cb Mon Sep 17 00:00:00 2001 From: John Hawthorn Date: Wed, 8 Feb 2017 10:44:06 -0800 Subject: [PATCH 01/16] Deprecate fill_in_quantity This is an unnecessary shorthand which just obfuscates what it does. It also has nothing to do with quantities specifically. --- core/lib/spree/testing_support/capybara_ext.rb | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/core/lib/spree/testing_support/capybara_ext.rb b/core/lib/spree/testing_support/capybara_ext.rb index 641fb45102e..543033bd721 100644 --- a/core/lib/spree/testing_support/capybara_ext.rb +++ b/core/lib/spree/testing_support/capybara_ext.rb @@ -20,6 +20,12 @@ def column_text(num) end def fill_in_quantity(table_column, selector, quantity) + Spree::Deprecation.warn <<-WARN.strip_heredoc + fill_in_quantity is deprecated. Instead use: + within(#{table_column.inspect}) do + fill_in #{selector.inspect}, with: #{quantity.inspect} + end + WARN within(table_column) do fill_in selector, with: quantity end From fa75ba26ca6eda735a5be1a522acfe28da649aa9 Mon Sep 17 00:00:00 2001 From: John Hawthorn Date: Wed, 8 Feb 2017 13:19:21 -0800 Subject: [PATCH 02/16] Improve column spacing on cart page --- backend/app/views/spree/admin/orders/_line_items.html.erb | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/backend/app/views/spree/admin/orders/_line_items.html.erb b/backend/app/views/spree/admin/orders/_line_items.html.erb index 1b8f0a9dc87..3d1d41280ee 100644 --- a/backend/app/views/spree/admin/orders/_line_items.html.erb +++ b/backend/app/views/spree/admin/orders/_line_items.html.erb @@ -2,8 +2,10 @@ - - + + + + From 88fe43e778058a1bdedd259d8b8b3ff5d7afe3e2 Mon Sep 17 00:00:00 2001 From: John Hawthorn Date: Mon, 27 Feb 2017 16:46:45 -0800 Subject: [PATCH 03/16] Render cart page line_items using handlebars --- .../spree/backend/line_items.js.coffee | 22 +++++++++----- .../spree/backend/templates/index.js | 1 + .../backend/templates/orders/line_item.hbs | 30 +++++++++++++++++++ .../spree/admin/orders/_line_items.html.erb | 27 ----------------- 4 files changed, 46 insertions(+), 34 deletions(-) create mode 100644 backend/app/assets/javascripts/spree/backend/templates/orders/line_item.hbs diff --git a/backend/app/assets/javascripts/spree/backend/line_items.js.coffee b/backend/app/assets/javascripts/spree/backend/line_items.js.coffee index f310c66d012..ef68e791471 100644 --- a/backend/app/assets/javascripts/spree/backend/line_items.js.coffee +++ b/backend/app/assets/javascripts/spree/backend/line_items.js.coffee @@ -22,13 +22,6 @@ onDeleteLineItem = (e) -> deleteLineItem(line_item_id) editingDone(e) -$(document).ready -> - $('.line-item') - .on('click', '.edit-line-item', editing) - .on('click', '.cancel-line-item', editingDone) - .on('click', '.save-line-item', onSaveLineItem) - .on('click', '.delete-line-item', onDeleteLineItem) - lineItemURL = (id) -> "#{Spree.routes.line_items_api(order_number)}/#{id}.json" @@ -53,3 +46,18 @@ deleteLineItem = (line_item_id) -> if $('.line-items tr.line-item').length == 0 $('.line-items').remove() window.Spree.advanceOrder() + +$ -> + url = Spree.routes.orders_api + "/" + order_number + Spree.ajax(url: url).done (result) -> + for line_item in result.line_items + image = line_item.variant.images[0] + html = HandlebarsTemplates['orders/line_item'](line_item: line_item, image: image) + $("table.line-items > tbody").append(html) + + $('.line-item') + .on('click', '.edit-line-item', editing) + .on('click', '.cancel-line-item', editingDone) + .on('click', '.save-line-item', onSaveLineItem) + .on('click', '.delete-line-item', onDeleteLineItem) + diff --git a/backend/app/assets/javascripts/spree/backend/templates/index.js b/backend/app/assets/javascripts/spree/backend/templates/index.js index dd0a69c4574..9f4487c0b27 100644 --- a/backend/app/assets/javascripts/spree/backend/templates/index.js +++ b/backend/app/assets/javascripts/spree/backend/templates/index.js @@ -1,4 +1,5 @@ //= require spree/backend/templates/orders/customer_details/autocomplete +//= require spree/backend/templates/orders/line_item //= require spree/backend/templates/products/sortable //= require spree/backend/templates/products/upload_progress //= require spree/backend/templates/promotions/calculators/fields/tiered_flat_rate diff --git a/backend/app/assets/javascripts/spree/backend/templates/orders/line_item.hbs b/backend/app/assets/javascripts/spree/backend/templates/orders/line_item.hbs new file mode 100644 index 00000000000..3ad4a61cdd5 --- /dev/null +++ b/backend/app/assets/javascripts/spree/backend/templates/orders/line_item.hbs @@ -0,0 +1,30 @@ + + + + + + + + + diff --git a/backend/app/views/spree/admin/orders/_line_items.html.erb b/backend/app/views/spree/admin/orders/_line_items.html.erb index 3d1d41280ee..7ea7424cf21 100644 --- a/backend/app/views/spree/admin/orders/_line_items.html.erb +++ b/backend/app/views/spree/admin/orders/_line_items.html.erb @@ -20,33 +20,6 @@ - <% order.line_items.each do |item| %> - <%= content_tag :tr, class: 'line-item', id: "line-item-#{item.id}", data: { line_item_id: item.id } do %> - - - - - - - - <% end %> - <% end %>
+ + + {{ line_item.variant.name }}
+ {{#if line_item.variant.options_text }} + {{ line_item.variant.options_text }}
+ {{/if}} + {{ t "sku" }}: {{ line_item.variant.sku }} +
+ {{ line_item.single_display_amount }} + + {{ line_item.quantity }} + + + + {{ line_item.display_amount }} + + + + + +
<%= image_tag item.variant.display_image.attachment(:mini) %> - <%= item.variant.product.name %>
<%= "(" + variant_options(item.variant) + ")" unless item.variant.option_values.empty? %> - <% if item.variant.sku.present? %> - <%= Spree::Variant.human_attribute_name(:sku) %>: <%= item.variant.sku %> - <% end %> -
<%= item.single_money.to_html %> - <%= item.quantity %> - - <%= number_field_tag :quantity, item.quantity, min: 0, class: "line_item_quantity", size: 5 %> - <%= line_item_shipment_price(item, item.quantity) %> - <% if can? :update, item %> - <%= link_to '', '#', class: 'save-line-item fa fa-ok no-text with-tip', title: Spree.t('actions.save') %> - <%= link_to '', '#', class: 'cancel-line-item fa fa-cancel no-text with-tip', title: Spree.t('actions.cancel') %> - <%= link_to '', '#', class: 'edit-line-item fa fa-edit no-text with-tip', title: Spree.t('actions.edit') %> - <%= link_to '', '#', class: 'delete-line-item fa fa-trash no-text with-tip', title: Spree.t('actions.delete') %> - <% end %> -
<% end %> From 95637737e80592bfbda87af85720c5567ed78256 Mon Sep 17 00:00:00 2001 From: John Hawthorn Date: Mon, 27 Feb 2017 16:46:51 -0800 Subject: [PATCH 04/16] Convert line item edit to Backbone.js --- .../spree/backend/line_items.js.coffee | 68 +++++++++++-------- 1 file changed, 40 insertions(+), 28 deletions(-) diff --git a/backend/app/assets/javascripts/spree/backend/line_items.js.coffee b/backend/app/assets/javascripts/spree/backend/line_items.js.coffee index ef68e791471..4b08fa469ff 100644 --- a/backend/app/assets/javascripts/spree/backend/line_items.js.coffee +++ b/backend/app/assets/javascripts/spree/backend/line_items.js.coffee @@ -1,26 +1,3 @@ -editing = (e) -> - e.preventDefault() - $(e.delegateTarget).addClass('editing') - -editingDone = (e) -> - e.preventDefault() - $(e.delegateTarget).removeClass('editing') - -onSaveLineItem = (e) -> - e.preventDefault() - line_item = $(this).closest('.line-item') - line_item_id = line_item.data('line-item-id') - quantity = parseInt(line_item.find('input.line_item_quantity').val()) - adjustLineItem(line_item_id, quantity) - editingDone(e) - -onDeleteLineItem = (e) -> - e.preventDefault() - return unless confirm(Spree.translations.are_you_sure_delete) - line_item = $(this).closest('.line-item') - line_item_id = line_item.data('line-item-id') - deleteLineItem(line_item_id) - editingDone(e) lineItemURL = (id) -> "#{Spree.routes.line_items_api(order_number)}/#{id}.json" @@ -47,6 +24,42 @@ deleteLineItem = (line_item_id) -> $('.line-items').remove() window.Spree.advanceOrder() +Spree.CartLineItemView = Backbone.View.extend + tagName: 'tr' + + initialize: (options) -> + console.log(options) + + events: + 'click .edit-line-item': 'onEdit' + 'click .cancel-line-item': 'onCancel' + 'click .save-line-item': 'onSave' + 'click .delete-line-item': 'onDelete' + + onEdit: (e) -> + e.preventDefault() + @$el.addClass('editing') + + onCancel: (e) -> + e.preventDefault() + @$el.removeClass('editing') + + onSave: (e) -> + e.preventDefault() + line_item = @$el + line_item_id = line_item.data('line-item-id') + quantity = parseInt(line_item.find('input.line_item_quantity').val()) + adjustLineItem(line_item_id, quantity) + @$el.removeClass('editing') + + onDelete: (e) -> + e.preventDefault() + return unless confirm(Spree.translations.are_you_sure_delete) + line_item = @$el + line_item_id = line_item.data('line-item-id') + deleteLineItem(line_item_id) + @$el.removeClass('editing') + $ -> url = Spree.routes.orders_api + "/" + order_number Spree.ajax(url: url).done (result) -> @@ -55,9 +68,8 @@ $ -> html = HandlebarsTemplates['orders/line_item'](line_item: line_item, image: image) $("table.line-items > tbody").append(html) - $('.line-item') - .on('click', '.edit-line-item', editing) - .on('click', '.cancel-line-item', editingDone) - .on('click', '.save-line-item', onSaveLineItem) - .on('click', '.delete-line-item', onDeleteLineItem) + $('.line-item').each -> + view = new Spree.CartLineItemView( + el: $(@) + ) From b75d78f78a00f7c9ba90acb5943fbb822784cc53 Mon Sep 17 00:00:00 2001 From: John Hawthorn Date: Wed, 8 Feb 2017 16:30:28 -0800 Subject: [PATCH 05/16] Use on Spree.CartLineItemView for rendering --- .../spree/backend/line_items.js.coffee | 31 +++++----- .../backend/templates/orders/line_item.hbs | 58 +++++++++---------- 2 files changed, 45 insertions(+), 44 deletions(-) diff --git a/backend/app/assets/javascripts/spree/backend/line_items.js.coffee b/backend/app/assets/javascripts/spree/backend/line_items.js.coffee index 4b08fa469ff..930c6ec11bd 100644 --- a/backend/app/assets/javascripts/spree/backend/line_items.js.coffee +++ b/backend/app/assets/javascripts/spree/backend/line_items.js.coffee @@ -26,9 +26,7 @@ deleteLineItem = (line_item_id) -> Spree.CartLineItemView = Backbone.View.extend tagName: 'tr' - - initialize: (options) -> - console.log(options) + className: 'line-item' events: 'click .edit-line-item': 'onEdit' @@ -46,30 +44,35 @@ Spree.CartLineItemView = Backbone.View.extend onSave: (e) -> e.preventDefault() - line_item = @$el - line_item_id = line_item.data('line-item-id') - quantity = parseInt(line_item.find('input.line_item_quantity').val()) + line_item_id = @model.id + quantity = parseInt(@$('input.line_item_quantity').val()) adjustLineItem(line_item_id, quantity) @$el.removeClass('editing') onDelete: (e) -> e.preventDefault() return unless confirm(Spree.translations.are_you_sure_delete) - line_item = @$el - line_item_id = line_item.data('line-item-id') + line_item_id = @model.id deleteLineItem(line_item_id) @$el.removeClass('editing') + render: -> + line_item = @model.attributes + image = line_item.variant.images[0] + html = HandlebarsTemplates['orders/line_item'](line_item: line_item, image: image) + el = @$el.html(html) + $ -> url = Spree.routes.orders_api + "/" + order_number Spree.ajax(url: url).done (result) -> - for line_item in result.line_items - image = line_item.variant.images[0] - html = HandlebarsTemplates['orders/line_item'](line_item: line_item, image: image) - $("table.line-items > tbody").append(html) + lineItemModel = Backbone.Model.extend + urlRoot: Spree.routes.line_items_api(order_number) - $('.line-item').each -> + for line_item in result.line_items + model = new lineItemModel(line_item) view = new Spree.CartLineItemView( - el: $(@) + model: model ) + view.render() + $("table.line-items > tbody").append(view.el) diff --git a/backend/app/assets/javascripts/spree/backend/templates/orders/line_item.hbs b/backend/app/assets/javascripts/spree/backend/templates/orders/line_item.hbs index 3ad4a61cdd5..9343033e912 100644 --- a/backend/app/assets/javascripts/spree/backend/templates/orders/line_item.hbs +++ b/backend/app/assets/javascripts/spree/backend/templates/orders/line_item.hbs @@ -1,30 +1,28 @@ - - - - - - {{ line_item.variant.name }}
- {{#if line_item.variant.options_text }} - {{ line_item.variant.options_text }}
- {{/if}} - {{ t "sku" }}: {{ line_item.variant.sku }} - - - {{ line_item.single_display_amount }} - - - {{ line_item.quantity }} - - - - - - {{ line_item.display_amount }} - - - - - - - - + + + + + {{ line_item.variant.name }}
+ {{#if line_item.variant.options_text }} + {{ line_item.variant.options_text }}
+ {{/if}} + {{ t "sku" }}: {{ line_item.variant.sku }} + + + {{ line_item.single_display_amount }} + + + {{ line_item.quantity }} + + + + + + {{ line_item.display_amount }} + + + + + + + From 78bc407f06bc763de2e6633408197bd889c3bb73 Mon Sep 17 00:00:00 2001 From: John Hawthorn Date: Wed, 8 Feb 2017 16:57:23 -0800 Subject: [PATCH 06/16] Perform save and destroy through backbone model --- .../spree/backend/line_items.js.coffee | 38 ++++--------------- 1 file changed, 8 insertions(+), 30 deletions(-) diff --git a/backend/app/assets/javascripts/spree/backend/line_items.js.coffee b/backend/app/assets/javascripts/spree/backend/line_items.js.coffee index 930c6ec11bd..b42a330b9ff 100644 --- a/backend/app/assets/javascripts/spree/backend/line_items.js.coffee +++ b/backend/app/assets/javascripts/spree/backend/line_items.js.coffee @@ -1,29 +1,4 @@ -lineItemURL = (id) -> - "#{Spree.routes.line_items_api(order_number)}/#{id}.json" - -adjustLineItem = (line_item_id, quantity) -> - url = lineItemURL(line_item_id) - Spree.ajax( - type: "PUT", - url: url, - data: - line_item: - quantity: quantity - ).done (msg) -> - window.Spree.advanceOrder() - -deleteLineItem = (line_item_id) -> - url = lineItemURL(line_item_id) - Spree.ajax( - type: "DELETE" - url: url - ).done (msg) -> - $('#line-item-' + line_item_id).remove() - if $('.line-items tr.line-item').length == 0 - $('.line-items').remove() - window.Spree.advanceOrder() - Spree.CartLineItemView = Backbone.View.extend tagName: 'tr' className: 'line-item' @@ -44,17 +19,20 @@ Spree.CartLineItemView = Backbone.View.extend onSave: (e) -> e.preventDefault() - line_item_id = @model.id quantity = parseInt(@$('input.line_item_quantity').val()) - adjustLineItem(line_item_id, quantity) + @model.save {quantity: quantity}, + patch: true, + success: => + window.Spree.advanceOrder() @$el.removeClass('editing') onDelete: (e) -> e.preventDefault() return unless confirm(Spree.translations.are_you_sure_delete) - line_item_id = @model.id - deleteLineItem(line_item_id) - @$el.removeClass('editing') + @remove() + @model.destroy + success: => + window.Spree.advanceOrder() render: -> line_item = @model.attributes From 4dab19d749f10f6666f3e5f0ed1e4316221c311f Mon Sep 17 00:00:00 2001 From: John Hawthorn Date: Thu, 9 Feb 2017 10:53:37 -0800 Subject: [PATCH 07/16] Only run JS for line_items on cart page --- .../spree/backend/line_items.js.coffee | 26 +++++++++---------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/backend/app/assets/javascripts/spree/backend/line_items.js.coffee b/backend/app/assets/javascripts/spree/backend/line_items.js.coffee index b42a330b9ff..d0d26f17b9f 100644 --- a/backend/app/assets/javascripts/spree/backend/line_items.js.coffee +++ b/backend/app/assets/javascripts/spree/backend/line_items.js.coffee @@ -41,16 +41,16 @@ Spree.CartLineItemView = Backbone.View.extend el = @$el.html(html) $ -> - url = Spree.routes.orders_api + "/" + order_number - Spree.ajax(url: url).done (result) -> - lineItemModel = Backbone.Model.extend - urlRoot: Spree.routes.line_items_api(order_number) - - for line_item in result.line_items - model = new lineItemModel(line_item) - view = new Spree.CartLineItemView( - model: model - ) - view.render() - $("table.line-items > tbody").append(view.el) - + if $("table.line-items").length + url = Spree.routes.orders_api + "/" + order_number + Spree.ajax(url: url).done (result) -> + lineItemModel = Backbone.Model.extend + urlRoot: Spree.routes.line_items_api(order_number) + + for line_item in result.line_items + model = new lineItemModel(line_item) + view = new Spree.CartLineItemView( + model: model + ) + view.render() + $("table.line-items > tbody").append(view.el) From 2de9d0556608a8f2715a71aafcda4bac2a120516 Mon Sep 17 00:00:00 2001 From: John Hawthorn Date: Thu, 9 Feb 2017 11:06:22 -0800 Subject: [PATCH 08/16] Control editing state with variable --- .../javascripts/spree/backend/line_items.js.coffee | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/backend/app/assets/javascripts/spree/backend/line_items.js.coffee b/backend/app/assets/javascripts/spree/backend/line_items.js.coffee index d0d26f17b9f..1e311eb42f5 100644 --- a/backend/app/assets/javascripts/spree/backend/line_items.js.coffee +++ b/backend/app/assets/javascripts/spree/backend/line_items.js.coffee @@ -3,6 +3,9 @@ Spree.CartLineItemView = Backbone.View.extend tagName: 'tr' className: 'line-item' + initialize: (options) -> + @editing = options.editing || false + events: 'click .edit-line-item': 'onEdit' 'click .cancel-line-item': 'onCancel' @@ -11,11 +14,13 @@ Spree.CartLineItemView = Backbone.View.extend onEdit: (e) -> e.preventDefault() - @$el.addClass('editing') + @editing = true + @render() onCancel: (e) -> e.preventDefault() - @$el.removeClass('editing') + @editing = false + @render() onSave: (e) -> e.preventDefault() @@ -24,7 +29,8 @@ Spree.CartLineItemView = Backbone.View.extend patch: true, success: => window.Spree.advanceOrder() - @$el.removeClass('editing') + @editing = false + @render() onDelete: (e) -> e.preventDefault() @@ -39,6 +45,7 @@ Spree.CartLineItemView = Backbone.View.extend image = line_item.variant.images[0] html = HandlebarsTemplates['orders/line_item'](line_item: line_item, image: image) el = @$el.html(html) + @$el.toggleClass('editing', @editing) $ -> if $("table.line-items").length From 6e82dc5937a5178176b98fcadf714c639cd9128f Mon Sep 17 00:00:00 2001 From: John Hawthorn Date: Thu, 9 Feb 2017 11:11:11 -0800 Subject: [PATCH 09/16] Use templtaes to control editing instead of CSS --- .../spree/backend/line_items.js.coffee | 3 +-- .../backend/templates/orders/line_item.hbs | 26 ++++++++++++------- .../spree/backend/sections/_orders.scss | 15 ----------- 3 files changed, 17 insertions(+), 27 deletions(-) diff --git a/backend/app/assets/javascripts/spree/backend/line_items.js.coffee b/backend/app/assets/javascripts/spree/backend/line_items.js.coffee index 1e311eb42f5..2a9ddd88e2f 100644 --- a/backend/app/assets/javascripts/spree/backend/line_items.js.coffee +++ b/backend/app/assets/javascripts/spree/backend/line_items.js.coffee @@ -43,9 +43,8 @@ Spree.CartLineItemView = Backbone.View.extend render: -> line_item = @model.attributes image = line_item.variant.images[0] - html = HandlebarsTemplates['orders/line_item'](line_item: line_item, image: image) + html = HandlebarsTemplates['orders/line_item'](line_item: line_item, image: image, editing: @editing) el = @$el.html(html) - @$el.toggleClass('editing', @editing) $ -> if $("table.line-items").length diff --git a/backend/app/assets/javascripts/spree/backend/templates/orders/line_item.hbs b/backend/app/assets/javascripts/spree/backend/templates/orders/line_item.hbs index 9343033e912..cafc0d58320 100644 --- a/backend/app/assets/javascripts/spree/backend/templates/orders/line_item.hbs +++ b/backend/app/assets/javascripts/spree/backend/templates/orders/line_item.hbs @@ -11,18 +11,24 @@ {{ line_item.single_display_amount }} - - {{ line_item.quantity }} - - - - +{{#if editing}} + + + +{{else}} + + {{ line_item.quantity }} + +{{/if}} {{ line_item.display_amount }} - - - - + {{#if editing}} + + + {{else}} + + + {{/if}} diff --git a/backend/app/assets/stylesheets/spree/backend/sections/_orders.scss b/backend/app/assets/stylesheets/spree/backend/sections/_orders.scss index 59b969481a5..1271be5e472 100644 --- a/backend/app/assets/stylesheets/spree/backend/sections/_orders.scss +++ b/backend/app/assets/stylesheets/spree/backend/sections/_orders.scss @@ -1,18 +1,3 @@ -.line-item.editing { - .edit-line-item, - .delete-line-item, - .line-item-qty-show { - display: none !important; - } -} - -.line-item:not(.editing) { - .save-line-item, - .cancel-line-item, - .line-item-qty-edit { - display: none !important; - } -} // Customize orders filter [data-hook="admin_orders_index_search"] { From 9ed8b34e556f75c3487eea5373b0e26835e7d203 Mon Sep 17 00:00:00 2001 From: John Hawthorn Date: Mon, 27 Feb 2017 16:47:12 -0800 Subject: [PATCH 10/16] Add new line items inline on table --- .../spree/backend/line_items.js.coffee | 43 ++++++++++++------ .../backend/templates/orders/line_item.hbs | 28 +++++++----- .../spree/admin/orders/_line_items.html.erb | 44 +++++++++---------- .../orders/_line_items_edit_form.html.erb | 5 +++ .../views/spree/admin/orders/cart.html.erb | 10 ----- .../admin/orders/customer_details_spec.rb | 10 ++--- .../features/admin/orders/new_order_spec.rb | 30 +++---------- .../admin/orders/order_details_spec.rb | 20 +++------ .../support/feature/order_feature_helper.rb | 8 ++++ core/config/locales/en.yml | 1 + 10 files changed, 99 insertions(+), 100 deletions(-) diff --git a/backend/app/assets/javascripts/spree/backend/line_items.js.coffee b/backend/app/assets/javascripts/spree/backend/line_items.js.coffee index 2a9ddd88e2f..f515e940506 100644 --- a/backend/app/assets/javascripts/spree/backend/line_items.js.coffee +++ b/backend/app/assets/javascripts/spree/backend/line_items.js.coffee @@ -4,13 +4,14 @@ Spree.CartLineItemView = Backbone.View.extend className: 'line-item' initialize: (options) -> - @editing = options.editing || false + @editing = options.editing || @model.isNew() events: 'click .edit-line-item': 'onEdit' 'click .cancel-line-item': 'onCancel' 'click .save-line-item': 'onSave' 'click .delete-line-item': 'onDelete' + 'change .js-select-variant': 'onChangeVariant' onEdit: (e) -> e.preventDefault() @@ -19,13 +20,20 @@ Spree.CartLineItemView = Backbone.View.extend onCancel: (e) -> e.preventDefault() - @editing = false - @render() + if @model.isNew() + @remove() + else + @editing = false + @render() onSave: (e) -> e.preventDefault() - quantity = parseInt(@$('input.line_item_quantity').val()) - @model.save {quantity: quantity}, + attrs = { + quantity: parseInt(@$('input.line_item_quantity').val()) + } + if @model.isNew() + attrs['variant_id'] = @$("[name=variant_id]").val() + @model.save attrs, patch: true, success: => window.Spree.advanceOrder() @@ -42,21 +50,30 @@ Spree.CartLineItemView = Backbone.View.extend render: -> line_item = @model.attributes - image = line_item.variant.images[0] - html = HandlebarsTemplates['orders/line_item'](line_item: line_item, image: image, editing: @editing) + image = line_item.variant && line_item.variant.images[0] + html = HandlebarsTemplates['orders/line_item']( + line_item: line_item, + image: image, + editing: @editing, + isNew: @model.isNew() + ) el = @$el.html(html) + @$("[name=variant_id]").variantAutocomplete({ in_stock_only: true }) $ -> if $("table.line-items").length url = Spree.routes.orders_api + "/" + order_number - Spree.ajax(url: url).done (result) -> - lineItemModel = Backbone.Model.extend - urlRoot: Spree.routes.line_items_api(order_number) + lineItemModel = Backbone.Model.extend + urlRoot: Spree.routes.line_items_api(order_number) + Spree.ajax(url: url).done (result) -> for line_item in result.line_items model = new lineItemModel(line_item) - view = new Spree.CartLineItemView( - model: model - ) + view = new Spree.CartLineItemView(model: model) view.render() $("table.line-items > tbody").append(view.el) + + $('.js-add-line-item').click -> + view = new Spree.CartLineItemView(model: new lineItemModel()) + view.render() + $("table.line-items > tbody").append(view.el) diff --git a/backend/app/assets/javascripts/spree/backend/templates/orders/line_item.hbs b/backend/app/assets/javascripts/spree/backend/templates/orders/line_item.hbs index cafc0d58320..600a99efb36 100644 --- a/backend/app/assets/javascripts/spree/backend/templates/orders/line_item.hbs +++ b/backend/app/assets/javascripts/spree/backend/templates/orders/line_item.hbs @@ -1,19 +1,25 @@ - - - - - {{ line_item.variant.name }}
- {{#if line_item.variant.options_text }} - {{ line_item.variant.options_text }}
- {{/if}} - {{ t "sku" }}: {{ line_item.variant.sku }} - +{{#if isNew}} + + + +{{else}} + + + + + {{ line_item.variant.name }}
+ {{#if line_item.variant.options_text }} + {{ line_item.variant.options_text }}
+ {{/if}} + {{ t "sku" }}: {{ line_item.variant.sku }} + +{{/if}} {{ line_item.single_display_amount }} {{#if editing}} - + {{else}} diff --git a/backend/app/views/spree/admin/orders/_line_items.html.erb b/backend/app/views/spree/admin/orders/_line_items.html.erb index 7ea7424cf21..d613c2724a4 100644 --- a/backend/app/views/spree/admin/orders/_line_items.html.erb +++ b/backend/app/views/spree/admin/orders/_line_items.html.erb @@ -1,25 +1,23 @@ -<% if order.line_items.exists? %> - - - - - - - - - +
+ + + + + + + + - - - - - - - - - + + + + + + + + + - - -
<%= Spree::Product.human_attribute_name(:name) %><%= Spree::LineItem.human_attribute_name(:price) %><%= Spree::LineItem.human_attribute_name(:quantity) %><%= Spree::LineItem.human_attribute_name(:total) %> 
<%= Spree::Product.human_attribute_name(:name) %><%= Spree::LineItem.human_attribute_name(:price) %><%= Spree::LineItem.human_attribute_name(:quantity) %><%= Spree::LineItem.human_attribute_name(:total) %> 
-<% end %> + + + 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 718b0d0581c..8ec9570b12c 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 @@ -4,6 +4,11 @@ <% end %> <%= render partial: "spree/admin/orders/line_items", locals: { order: order } %> + + <% if can?(:update, @order) && can?(:create, Spree::LineItem) %> + + <% end %> + <%= render partial: "spree/admin/orders/adjustments", locals: { adjustments: @order.line_item_adjustments, order: order, diff --git a/backend/app/views/spree/admin/orders/cart.html.erb b/backend/app/views/spree/admin/orders/cart.html.erb index 9f79cd2f556..5a2b8147560 100644 --- a/backend/app/views/spree/admin/orders/cart.html.erb +++ b/backend/app/views/spree/admin/orders/cart.html.erb @@ -20,16 +20,6 @@ <%= render 'spree/admin/orders/risk_analysis', latest_payment: @order.payments.reorder("created_at DESC").first %> <% end %> -<% if can?(:update, @order) && can?(:create, Spree::LineItem) %> - <%= render partial: 'add_line_item' %> -<% end %> - -<% if @order.line_items.empty? %> -
- <%= Spree.t(:your_order_is_empty_add_product)%> -
-<% end %> -
<%= render partial: 'line_items_edit_form', locals: { order: @order } %> diff --git a/backend/spec/features/admin/orders/customer_details_spec.rb b/backend/spec/features/admin/orders/customer_details_spec.rb index 7af11cbcd3b..a840ef0333c 100644 --- a/backend/spec/features/admin/orders/customer_details_spec.rb +++ b/backend/spec/features/admin/orders/customer_details_spec.rb @@ -1,6 +1,8 @@ require 'spec_helper' describe "Customer Details", type: :feature, js: true do + include OrderFeatureHelper + stub_authorization! let(:country) { create(:country, name: "Kangaland") } @@ -23,11 +25,9 @@ click_link "Orders" click_link "New Order" click_on 'Cart' - select2_search product.name, from: Spree.t(:name_or_sku) - within("table.stock-levels") do - find('.variant_quantity').set(quantity) - end - click_button 'Add' + + add_line_item product.name, quantity: quantity + expect(page).to have_css('.line-item') click_link "Customer" targetted_select2 "foobar@example.com", from: "#s2id_customer_search" diff --git a/backend/spec/features/admin/orders/new_order_spec.rb b/backend/spec/features/admin/orders/new_order_spec.rb index e993d55b23c..212483c1da5 100644 --- a/backend/spec/features/admin/orders/new_order_spec.rb +++ b/backend/spec/features/admin/orders/new_order_spec.rb @@ -1,6 +1,8 @@ require 'spec_helper' describe "New Order", type: :feature do + include OrderFeatureHelper + let!(:product) { create(:product_in_stock) } let!(:state) { create(:state) } let!(:store) { create(:store) } @@ -24,11 +26,8 @@ it "completes new order succesfully without using the cart", js: true do click_on 'Cart' - select2_search product.name, from: Spree.t(:name_or_sku) - - fill_in "variant_quantity", with: 2 + add_line_item product.name - click_button 'Add' click_on "Customer" within "#select-customer" do @@ -62,11 +61,8 @@ it 'can create split payments', js: true do click_on 'Cart' - select2_search product.name, from: Spree.t(:name_or_sku) - - fill_in "variant_quantity", with: 2 + add_line_item product.name - click_button 'Add' click_on "Customer" within "#select-customer" do @@ -92,11 +88,7 @@ context "adding new item to the order", js: true do it "inventory items show up just fine and are also registered as shipments" do click_on 'Cart' - select2_search product.name, from: Spree.t(:name_or_sku) - - fill_in "variant_quantity", with: 2 - - click_button 'Add' + add_line_item product.name within(".line-items") do expect(page).to have_content(product.name) @@ -128,11 +120,7 @@ it "can still see line items" do click_on 'Cart' - select2_search product.name, from: Spree.t(:name_or_sku) - - fill_in "variant_quantity", with: 1 - - click_button 'Add' + add_line_item product.name within(".line-items") do within(".line-item-name") do @@ -185,12 +173,8 @@ end it "transitions to delivery not to complete" do click_on 'Cart' - select2_search product.name, from: Spree.t(:name_or_sku) - within("table.stock-levels") do - find('.variant_quantity').set(1) - end - click_button 'Add' + add_line_item product.name expect(page).to have_css('.line-item') diff --git a/backend/spec/features/admin/orders/order_details_spec.rb b/backend/spec/features/admin/orders/order_details_spec.rb index e1d26e765e3..86ef97bcfe3 100644 --- a/backend/spec/features/admin/orders/order_details_spec.rb +++ b/backend/spec/features/admin/orders/order_details_spec.rb @@ -45,13 +45,8 @@ end end - it "can add an item to a shipment" do - select2_search "spree t-shirt", from: Spree.t(:name_or_sku) - within("table.stock-levels") do - fill_in "variant_quantity", with: 2 - end - - click_button "Add" + it "can add an item" do + add_line_item "spree t-shirt", quantity: 2 within("#order_total") do expect(page).to have_content("$80.00") @@ -67,7 +62,6 @@ end end - expect(page).to have_content("Your order is empty") # wait for page refresh expect(page).not_to have_content("spree t-shirt") end @@ -134,12 +128,7 @@ end it "adds variant to order just fine" do - select2_search tote.name, from: Spree.t(:name_or_sku) - within("table.stock-levels") do - fill_in "variant_quantity", with: 1 - end - - click_button 'Add' + add_line_item tote.name within(".line-items") do expect(page).to have_content(tote.name) @@ -154,7 +143,8 @@ end it "doesn't display the out of stock variant in the search results" do - select2_search_without_selection product.name, from: ".variant_autocomplete" + click_on 'Add Item' + select2_search_without_selection product.name, from: ".select-variant" expect(page).to have_selector('.select2-no-results') within(".select2-no-results") do diff --git a/backend/spec/support/feature/order_feature_helper.rb b/backend/spec/support/feature/order_feature_helper.rb index 22337ff11a6..a17cc53158f 100644 --- a/backend/spec/support/feature/order_feature_helper.rb +++ b/backend/spec/support/feature/order_feature_helper.rb @@ -1,4 +1,12 @@ module OrderFeatureHelper + def add_line_item(product_name, quantity: 1) + find(".js-add-line-item:not([disabled]), .line-item [name=quantity]").click + + targetted_select2_search product_name, from: ".select-variant" + fill_in "quantity", with: quantity + click_icon 'ok' + end + def complete_split_to(destination, quantity: nil) if destination.is_a?(Spree::Shipment) destination = destination.number diff --git a/core/config/locales/en.yml b/core/config/locales/en.yml index 38add6f76dc..7865f975616 100644 --- a/core/config/locales/en.yml +++ b/core/config/locales/en.yml @@ -711,6 +711,7 @@ en: add_action_of_type: Add action of type add_country: Add Country add_coupon_code: Add Coupon Code + add_line_item: Add Item add_new_header: Add New Header add_new_style: Add New Style add_one: Add One From 12ea6587161f2673ab2bb076b3d77087c8cec8ba Mon Sep 17 00:00:00 2001 From: John Hawthorn Date: Mon, 27 Feb 2017 16:48:03 -0800 Subject: [PATCH 11/16] Remove old line item add JS --- .../app/assets/javascripts/spree/backend.js | 1 - .../spree/backend/line_items_on_order_edit.js | 48 ------------------- 2 files changed, 49 deletions(-) delete mode 100644 backend/app/assets/javascripts/spree/backend/line_items_on_order_edit.js diff --git a/backend/app/assets/javascripts/spree/backend.js b/backend/app/assets/javascripts/spree/backend.js index 5f29d353258..8306911fca0 100644 --- a/backend/app/assets/javascripts/spree/backend.js +++ b/backend/app/assets/javascripts/spree/backend.js @@ -32,7 +32,6 @@ //= require spree/backend/images/new //= require spree/backend/images/upload //= require spree/backend/line_items -//= require spree/backend/line_items_on_order_edit //= require spree/backend/navigation //= require spree/backend/number_field_updater //= require spree/backend/option_type_autocomplete diff --git a/backend/app/assets/javascripts/spree/backend/line_items_on_order_edit.js b/backend/app/assets/javascripts/spree/backend/line_items_on_order_edit.js deleted file mode 100644 index 9ad19e18e6d..00000000000 --- a/backend/app/assets/javascripts/spree/backend/line_items_on_order_edit.js +++ /dev/null @@ -1,48 +0,0 @@ -// This file contains the code for interacting with line items in the manual cart -$(document).ready(function () { - 'use strict'; - - // handle variant selection, show stock level. - $('#add_line_item_variant_id').change(function(){ - var variant_id = $(this).val(); - - var variant = _.find(window.variants, function(variant){ - return variant.id == variant_id - }) - - var variantLineItemTemplate = HandlebarsTemplates["variants/line_items_autocomplete_stock"]; - $('#stock_details').html(variantLineItemTemplate({variant: variant})); - $('#stock_details').show(); - - $('button.add_variant').click(addVariant); - }); -}); - -addVariant = function() { - $('#stock_details').hide(); - - var variant_id = $('input.variant_autocomplete').val(); - var total_quantity = $("input#variant_quantity").val(); - - adjustLineItems(window.order_number, variant_id, total_quantity); - return 1 -} - -adjustLineItems = function(order_number, variant_id, quantity){ - var url = Spree.routes.orders_api + "/" + order_number + '/line_items'; - - Spree.ajax({ - type: "POST", - url: url, - data: { - line_item: { - variant_id: variant_id, - quantity: quantity - }, - } - }).done(function( msg ) { - window.Spree.advanceOrder(); - window.location.reload(); - }); - -} From ee7d883fc97dfa8c37d1f4fd2803dba18f203333 Mon Sep 17 00:00:00 2001 From: John Hawthorn Date: Thu, 9 Feb 2017 15:55:53 -0800 Subject: [PATCH 12/16] Show add line item row if order is empty --- .../spree/backend/line_items.js.coffee | 22 ++++++++++++++----- .../backend/templates/orders/line_item.hbs | 4 +++- 2 files changed, 20 insertions(+), 6 deletions(-) diff --git a/backend/app/assets/javascripts/spree/backend/line_items.js.coffee b/backend/app/assets/javascripts/spree/backend/line_items.js.coffee index f515e940506..d4b1d9a82c6 100644 --- a/backend/app/assets/javascripts/spree/backend/line_items.js.coffee +++ b/backend/app/assets/javascripts/spree/backend/line_items.js.coffee @@ -5,6 +5,7 @@ Spree.CartLineItemView = Backbone.View.extend initialize: (options) -> @editing = options.editing || @model.isNew() + @noCancel = options.noCancel events: 'click .edit-line-item': 'onEdit' @@ -20,6 +21,7 @@ Spree.CartLineItemView = Backbone.View.extend onCancel: (e) -> e.preventDefault() + @trigger('cancel') if @model.isNew() @remove() else @@ -55,7 +57,8 @@ Spree.CartLineItemView = Backbone.View.extend line_item: line_item, image: image, editing: @editing, - isNew: @model.isNew() + isNew: @model.isNew(), + noCancel: @noCancel ) el = @$el.html(html) @$("[name=variant_id]").variantAutocomplete({ in_stock_only: true }) @@ -66,6 +69,14 @@ $ -> lineItemModel = Backbone.Model.extend urlRoot: Spree.routes.line_items_api(order_number) + add_button = $('.js-add-line-item') + add_button.click -> + add_button.prop("disabled", true) + view = new Spree.CartLineItemView(model: new lineItemModel()) + view.render() + view.on('cancel', (event) -> add_button.prop("disabled", false)) + $("table.line-items > tbody").append(view.el) + Spree.ajax(url: url).done (result) -> for line_item in result.line_items model = new lineItemModel(line_item) @@ -73,7 +84,8 @@ $ -> view.render() $("table.line-items > tbody").append(view.el) - $('.js-add-line-item').click -> - view = new Spree.CartLineItemView(model: new lineItemModel()) - view.render() - $("table.line-items > tbody").append(view.el) + if !result.line_items.length + add_button.prop("disabled", true) + view = new Spree.CartLineItemView(model: new lineItemModel(), noCancel: true) + view.render() + $("table.line-items > tbody").append(view.el) diff --git a/backend/app/assets/javascripts/spree/backend/templates/orders/line_item.hbs b/backend/app/assets/javascripts/spree/backend/templates/orders/line_item.hbs index 600a99efb36..1da9c59aa5b 100644 --- a/backend/app/assets/javascripts/spree/backend/templates/orders/line_item.hbs +++ b/backend/app/assets/javascripts/spree/backend/templates/orders/line_item.hbs @@ -32,7 +32,9 @@ {{#if editing}} - + {{#unless noCancel}} + + {{/unless}} {{else}} From d98b61786b89fbaeb3dacc809ddab9a111d7640e Mon Sep 17 00:00:00 2001 From: John Hawthorn Date: Thu, 9 Feb 2017 16:32:40 -0800 Subject: [PATCH 13/16] Add validations to line item creation --- .../javascripts/spree/backend/line_items.js.coffee | 7 +++++++ .../stylesheets/spree/backend/sections/_orders.scss | 11 +++++++++++ 2 files changed, 18 insertions(+) diff --git a/backend/app/assets/javascripts/spree/backend/line_items.js.coffee b/backend/app/assets/javascripts/spree/backend/line_items.js.coffee index d4b1d9a82c6..d69427a233a 100644 --- a/backend/app/assets/javascripts/spree/backend/line_items.js.coffee +++ b/backend/app/assets/javascripts/spree/backend/line_items.js.coffee @@ -28,8 +28,15 @@ Spree.CartLineItemView = Backbone.View.extend @editing = false @render() + validate: () -> + @$('[name=quantity]').toggleClass 'error', !@$('[name=quantity]').val() + @$('.select2-container').toggleClass 'error', !@$('[name=variant_id]').val() + + !@$('.select2-container').hasClass('error') && !@$('[name=quantity]').hasClass('error') + onSave: (e) -> e.preventDefault() + return unless @validate() attrs = { quantity: parseInt(@$('input.line_item_quantity').val()) } diff --git a/backend/app/assets/stylesheets/spree/backend/sections/_orders.scss b/backend/app/assets/stylesheets/spree/backend/sections/_orders.scss index 1271be5e472..45b62f5bf17 100644 --- a/backend/app/assets/stylesheets/spree/backend/sections/_orders.scss +++ b/backend/app/assets/stylesheets/spree/backend/sections/_orders.scss @@ -80,3 +80,14 @@ form.admin-ship-shipment { text-align: center; input[type='submit'] { margin-left: 5px; } } + +table.line-items { + input.error { + border-color: $color-error; + } + + .select2-container.error { + border-radius: 4px; + border: 1px solid $color-error; + } +} From e4b0af9581cee92abb98b58949b02ec5207467d2 Mon Sep 17 00:00:00 2001 From: John Hawthorn Date: Fri, 10 Feb 2017 10:54:13 -0800 Subject: [PATCH 14/16] Add styling for disabled buttons --- .../app/assets/stylesheets/spree/backend/shared/_forms.scss | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/backend/app/assets/stylesheets/spree/backend/shared/_forms.scss b/backend/app/assets/stylesheets/spree/backend/shared/_forms.scss index 1740192c7e6..a0be7060e31 100644 --- a/backend/app/assets/stylesheets/spree/backend/shared/_forms.scss +++ b/backend/app/assets/stylesheets/spree/backend/shared/_forms.scss @@ -124,6 +124,11 @@ button, .button { width: 100%; text-align: center; } + + &[disabled], &.disabled { + background-color: #c2c4c7; + cursor: default; + } } span.info { From 7c5fd3b4550b8308d9ae03222a37d8a24c3d41f2 Mon Sep 17 00:00:00 2001 From: John Hawthorn Date: Fri, 10 Feb 2017 11:44:11 -0800 Subject: [PATCH 15/16] Disable button until json is fetched --- .../app/assets/javascripts/spree/backend/line_items.js.coffee | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backend/app/assets/javascripts/spree/backend/line_items.js.coffee b/backend/app/assets/javascripts/spree/backend/line_items.js.coffee index d69427a233a..ca26a96e408 100644 --- a/backend/app/assets/javascripts/spree/backend/line_items.js.coffee +++ b/backend/app/assets/javascripts/spree/backend/line_items.js.coffee @@ -91,8 +91,8 @@ $ -> view.render() $("table.line-items > tbody").append(view.el) + add_button.prop("disabled", !result.line_items.length) if !result.line_items.length - add_button.prop("disabled", true) view = new Spree.CartLineItemView(model: new lineItemModel(), noCancel: true) view.render() $("table.line-items > tbody").append(view.el) From bb6093fa4d7db5fb5110f3e6934130d3d05924b5 Mon Sep 17 00:00:00 2001 From: John Hawthorn Date: Tue, 28 Feb 2017 12:16:18 -0800 Subject: [PATCH 16/16] Add note to section rendered by JS --- backend/app/views/spree/admin/orders/_line_items.html.erb | 1 + 1 file changed, 1 insertion(+) diff --git a/backend/app/views/spree/admin/orders/_line_items.html.erb b/backend/app/views/spree/admin/orders/_line_items.html.erb index d613c2724a4..6ed30cca0e7 100644 --- a/backend/app/views/spree/admin/orders/_line_items.html.erb +++ b/backend/app/views/spree/admin/orders/_line_items.html.erb @@ -19,5 +19,6 @@ + <%# Rendered by JS %>