solidus_backend 2.7.4 → 2.8.0

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of solidus_backend might be problematic. Click here for more details.

Files changed (133) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +12 -8
  3. data/app/assets/images/favicon.ico +0 -0
  4. data/app/assets/javascripts/spree/backend.js +0 -2
  5. data/app/assets/javascripts/spree/backend/adjustments.js +1 -1
  6. data/app/assets/javascripts/spree/backend/components/tooltips.js +21 -17
  7. data/app/assets/javascripts/spree/backend/option_type_autocomplete.js +1 -1
  8. data/app/assets/javascripts/spree/backend/product_picker.js +1 -1
  9. data/app/assets/javascripts/spree/backend/shipments.js +6 -1
  10. data/app/assets/javascripts/spree/backend/stock_management.js +9 -0
  11. data/app/assets/javascripts/spree/backend/store_credits.js +18 -2
  12. data/app/assets/javascripts/spree/backend/taxons.js +1 -1
  13. data/app/assets/javascripts/spree/backend/templates/stock_items/stock_location_stock_item.hbs +24 -25
  14. data/app/assets/javascripts/spree/backend/user_picker.js +1 -1
  15. data/app/assets/javascripts/spree/backend/variant_autocomplete.js +1 -1
  16. data/app/assets/javascripts/spree/backend/views/order/customer_select.js +1 -1
  17. data/app/assets/javascripts/spree/backend/views/order/summary.js +2 -2
  18. data/app/assets/javascripts/spree/backend/views/stock/add_stock_item.js +15 -4
  19. data/app/assets/javascripts/spree/backend/views/stock/edit_stock_item_row.js +30 -10
  20. data/app/assets/stylesheets/spree/backend/globals/_functions.scss +1 -2
  21. data/app/assets/stylesheets/spree/backend/sections/_orders.scss +8 -0
  22. data/app/assets/stylesheets/spree/backend/sections/_stock_management.scss +77 -2
  23. data/app/assets/stylesheets/spree/backend/spree_admin.scss +0 -1
  24. data/app/controllers/spree/admin/cancellations_controller.rb +2 -2
  25. data/app/controllers/spree/admin/locale_controller.rb +1 -1
  26. data/app/controllers/spree/admin/orders/customer_details_controller.rb +8 -1
  27. data/app/controllers/spree/admin/orders_controller.rb +1 -11
  28. data/app/controllers/spree/admin/products_controller.rb +10 -6
  29. data/app/controllers/spree/admin/promotion_codes_controller.rb +19 -1
  30. data/app/controllers/spree/admin/promotions_controller.rb +1 -1
  31. data/app/controllers/spree/admin/reimbursements_controller.rb +7 -2
  32. data/app/controllers/spree/admin/resource_controller.rb +1 -0
  33. data/app/controllers/spree/admin/store_credit_reasons_controller.rb +8 -0
  34. data/app/controllers/spree/admin/store_credits_controller.rb +11 -11
  35. data/app/helpers/spree/admin/navigation_helper.rb +1 -1
  36. data/app/models/spree/backend_configuration.rb +38 -21
  37. data/app/views/spree/admin/cancellations/index.html.erb +3 -1
  38. data/app/views/spree/admin/images/_image_row.html.erb +1 -1
  39. data/app/views/spree/admin/images/edit.html.erb +3 -3
  40. data/app/views/spree/admin/images/index.html.erb +2 -2
  41. data/app/views/spree/admin/log_entries/index.html.erb +2 -2
  42. data/app/views/spree/admin/orders/_carton_manifest.html.erb +3 -1
  43. data/app/views/spree/admin/orders/_shipment_manifest.html.erb +3 -1
  44. data/app/views/spree/admin/orders/confirm/_line_items.html.erb +3 -2
  45. data/app/views/spree/admin/orders/confirm/_shipment_manifest.html.erb +3 -1
  46. data/app/views/spree/admin/orders/index.html.erb +1 -1
  47. data/app/views/spree/admin/products/_form.html.erb +7 -7
  48. data/app/views/spree/admin/products/edit.html.erb +5 -0
  49. data/app/views/spree/admin/products/index.html.erb +3 -1
  50. data/app/views/spree/admin/promotion_categories/index.html.erb +1 -1
  51. data/app/views/spree/admin/promotion_code_batches/index.html.erb +1 -1
  52. data/app/views/spree/admin/promotion_codes/index.html.erb +5 -1
  53. data/app/views/spree/admin/promotion_codes/new.html.erb +31 -0
  54. data/app/views/spree/admin/promotions/_actions.html.erb +1 -1
  55. data/app/views/spree/admin/promotions/_activations_edit.html.erb +1 -1
  56. data/app/views/spree/admin/promotions/_form.html.erb +4 -3
  57. data/app/views/spree/admin/promotions/_rules.html.erb +1 -1
  58. data/app/views/spree/admin/promotions/edit.html.erb +3 -1
  59. data/app/views/spree/admin/refunds/new.html.erb +1 -1
  60. data/app/views/spree/admin/shared/_address_form.html.erb +10 -3
  61. data/app/views/spree/admin/shared/_edit_resource_links.html.erb +1 -1
  62. data/app/views/spree/admin/shared/_head.html.erb +1 -0
  63. data/app/views/spree/admin/shared/_image.html.erb +2 -2
  64. data/app/views/spree/admin/shared/_product_sub_menu.html.erb +1 -1
  65. data/app/views/spree/admin/shared/_settings_checkout_tabs.html.erb +4 -0
  66. data/app/views/spree/admin/shared/_settings_sub_menu.html.erb +3 -3
  67. data/app/views/spree/admin/shared/_tabs.html.erb +3 -2
  68. data/app/views/spree/admin/shared/_variant_search.html.erb +1 -1
  69. data/app/views/spree/admin/stock_items/_stock_management.html.erb +56 -38
  70. data/app/views/spree/admin/stock_locations/_form.html.erb +133 -121
  71. data/app/views/spree/admin/stock_locations/edit.html.erb +4 -2
  72. data/app/views/spree/admin/store_credit_reasons/edit.html.erb +15 -0
  73. data/app/views/spree/admin/store_credit_reasons/index.html.erb +56 -0
  74. data/app/views/spree/admin/store_credit_reasons/new.html.erb +18 -0
  75. data/app/views/spree/admin/store_credit_reasons/shared/_form.html.erb +15 -0
  76. data/app/views/spree/admin/store_credits/_store_credit_reason_field.html.erb +7 -0
  77. data/app/views/spree/admin/store_credits/edit_amount.html.erb +1 -1
  78. data/app/views/spree/admin/store_credits/edit_validity.html.erb +1 -1
  79. data/app/views/spree/admin/store_credits/show.html.erb +2 -2
  80. data/app/views/spree/admin/users/items.html.erb +3 -1
  81. data/app/views/spree/admin/users/orders.html.erb +1 -1
  82. data/config/routes.rb +2 -8
  83. data/lib/spree/backend.rb +1 -1
  84. data/solidus_backend.gemspec +3 -4
  85. data/spec/controllers/spree/admin/base_controller_spec.rb +1 -1
  86. data/spec/controllers/spree/admin/cancellations_controller_spec.rb +7 -3
  87. data/spec/controllers/spree/admin/orders/customer_details_controller_spec.rb +50 -2
  88. data/spec/controllers/spree/admin/orders_controller_spec.rb +23 -11
  89. data/spec/controllers/spree/admin/payments_controller_spec.rb +1 -1
  90. data/spec/controllers/spree/admin/products_controller_spec.rb +72 -0
  91. data/spec/controllers/spree/admin/promotion_codes_controller_spec.rb +13 -1
  92. data/spec/controllers/spree/admin/reimbursements_controller_spec.rb +11 -0
  93. data/spec/controllers/spree/admin/resource_controller_spec.rb +22 -0
  94. data/spec/controllers/spree/admin/stock_items_controller_spec.rb +1 -1
  95. data/spec/controllers/spree/admin/store_credits_controller_spec.rb +7 -7
  96. data/spec/features/admin/configuration/payment_methods_spec.rb +2 -2
  97. data/spec/features/admin/configuration/shipping_methods_spec.rb +2 -2
  98. data/spec/features/admin/homepage_spec.rb +1 -6
  99. data/spec/features/admin/orders/listing_spec.rb +1 -1
  100. data/spec/features/admin/orders/new_order_spec.rb +117 -0
  101. data/spec/features/admin/orders/new_refund_spec.rb +35 -0
  102. data/spec/features/admin/orders/order_details_spec.rb +2 -2
  103. data/spec/features/admin/orders/payments_spec.rb +2 -2
  104. data/spec/features/admin/orders/return_payment_state_spec.rb +3 -0
  105. data/spec/features/admin/orders/shipments_spec.rb +28 -0
  106. data/spec/features/admin/products/products_spec.rb +1 -1
  107. data/spec/features/admin/products/stock_management_spec.rb +10 -13
  108. data/spec/features/admin/promotion_adjustments_spec.rb +12 -12
  109. data/spec/features/admin/promotions/option_value_rule_spec.rb +2 -2
  110. data/spec/features/admin/promotions/product_rule_spec.rb +1 -1
  111. data/spec/features/admin/promotions/tiered_calculator_spec.rb +1 -1
  112. data/spec/features/admin/promotions/user_rule_spec.rb +2 -2
  113. data/spec/features/admin/reimbursements_spec.rb +1 -1
  114. data/spec/features/admin/store_credits_spec.rb +51 -2
  115. data/spec/features/admin/taxons_spec.rb +35 -0
  116. data/spec/features/admin/users_spec.rb +22 -11
  117. data/spec/helpers/admin/navigation_helper_spec.rb +4 -2
  118. data/spec/helpers/admin/store_credit_events_helper_spec.rb +2 -2
  119. data/spec/javascripts/spec_helper.js +2 -0
  120. data/spec/models/spree/backend_configuration/menu_item_spec.rb +17 -0
  121. data/spec/models/spree/backend_configuration_spec.rb +22 -0
  122. data/spec/spec_helper.rb +1 -0
  123. data/spec/support/feature/order_feature_helper.rb +1 -1
  124. data/spec/views/spree/admin/shared/navigation_footer_spec.rb +1 -1
  125. data/vendor/assets/javascripts/solidus_admin/select2_locales/select2_locale_en-US.js +10 -0
  126. metadata +26 -34
  127. data/app/controllers/spree/admin/reports_controller.rb +0 -82
  128. data/app/views/spree/admin/reports/index.html.erb +0 -19
  129. data/app/views/spree/admin/reports/sales_total.html.erb +0 -35
  130. data/app/views/spree/admin/shared/_report_order_criteria.html.erb +0 -19
  131. data/app/views/spree/admin/store_credits/_update_reason_field.html.erb +0 -7
  132. data/spec/controllers/spree/admin/reports_controller_spec.rb +0 -133
  133. data/spec/features/admin/reports_spec.rb +0 -63
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: c9df78b7913dca36ad841e5e4365ebb2626b7e9f2ff34649a86312285d6cce16
4
- data.tar.gz: 14b34e0d7528a0f53d2655b86259f1bdfd07a20fb6474ef9b203526abc12744b
3
+ metadata.gz: 3dbcdf9e9703176fcce09d9a18c80c599bef4e00cad4596227147ecaf10e87d8
4
+ data.tar.gz: ea64fd9b016d984994fb3c5cf85a1c9686238e40e866a6dbdc1c78886330bdc6
5
5
  SHA512:
6
- metadata.gz: 8781ce3451099cfd24d0d58911d3b2351d3df5daeaf392b522398910c8ced82355a32ba7ed32b9230da84aafec4d5439d9f7aab6967ee9b2c7c8a3c2934f2a30
7
- data.tar.gz: 0b4e2af28213a51aced9d7eeab0ec26995953ab6dd941ccbaea54928d1d432c207be279d462e403fb67af4a87201ae6b5bb095f98c056a28e4669463338ad605
6
+ metadata.gz: 9c75cb7b2700aa34e75d7089661ee78f7dd0d242982bd8c8690d56b99a65ea2698ed4fe37f4343a3d64c16770295afc5e3e6a1d89af3df7256a37c36df900888
7
+ data.tar.gz: 248117bd08c0e93f947b3fb742a3184970454cd9b6ebe7589c91eacc9826fba287866756e9342f196e5cf7d0211e41608b6583676423ee82339c9ed3206abdfb
data/README.md CHANGED
@@ -1,25 +1,25 @@
1
1
  # solidus\_backend
2
2
 
3
- Backend contains the controllers, views, and assets making up the admin interface of solidus.
3
+ Backend contains the controllers, views, and assets making up the admin interface of Solidus.
4
4
 
5
5
  ## Assets
6
6
 
7
- ### Javascript
7
+ ### JavaScript
8
8
 
9
9
  Can be found in [app/assets/javascripts/spree/backend/](./app/assets/javascripts/spree/backend/)
10
10
 
11
- Our scripts are written in a mix of coffeescript and javascript (ES5). We can't
11
+ Our scripts are written in a mix of CoffeeScript and JavaScript (ES5). We can't
12
12
  easily use a transpiler for ECMAScript >= 6 without adding additional steps for
13
13
  applications using solidus\_admin.
14
14
 
15
15
  Though we have existing CoffeeScript files, any new files should be in
16
- javascript (ES5).
16
+ JavaScript (ES5).
17
17
 
18
18
  ### Stylesheets
19
19
 
20
20
  Can be found in [app/assets/stylesheets/spree/backend/](./app/assets/stylesheets/spree/backend/)
21
21
 
22
- The stylesheets are written in SCSS and include all of [bourbon](http://bourbon.io/docs/) and [bootstrap 4 alpha](http://v4-alpha.getbootstrap.com/).
22
+ The stylesheets are written in SCSS and include all of [Bourbon](http://bourbon.io/docs/) and [Bootstrap 4 alpha](http://v4-alpha.getbootstrap.com/).
23
23
 
24
24
  When running the application there is a styleguide available at:
25
25
 
@@ -31,8 +31,12 @@ When running the application there is a styleguide available at:
31
31
 
32
32
  Run the tests
33
33
 
34
- bundle exec rspec
34
+ ```bash
35
+ bundle exec rspec
36
+ ```
35
37
 
36
- Run the javascript tests (must have chromedriver installed)
38
+ Run the JavaScript tests (must have [ChromeDriver](https://sites.google.com/a/chromium.org/chromedriver/) installed)
37
39
 
38
- bundle exec teaspoon
40
+ ```bash
41
+ bundle exec teaspoon
42
+ ```
Binary file
@@ -1,7 +1,5 @@
1
1
  //= require solidus_admin/bind-polyfill
2
2
  //= require handlebars
3
- //= require jquery
4
- //= require jquery_ujs
5
3
  //= require jquery.sticky-kit.min
6
4
  //= require solidus_admin/select2
7
5
  //= require solidus_admin/underscore
@@ -5,7 +5,7 @@ Spree.ready(function() {
5
5
  }
6
6
 
7
7
  Spree.ajax({
8
- type: 'PUT',
8
+ type: 'POST',
9
9
  url: Spree.routes.apply_coupon_code(window.order_number),
10
10
  data: {
11
11
  coupon_code: $("#coupon_code").val(),
@@ -3,26 +3,30 @@ Spree.ready(function(){
3
3
 
4
4
  $('body').tooltip({selector: '.with-tip'});
5
5
 
6
+ /*
7
+ * Poll tooltips to hide them if they are no longer being hovered.
8
+ *
9
+ * This is necessary to fix tooltips hanging around after their attached
10
+ * element has been removed from the DOM (and will therefore receive no
11
+ * mouseleave event). This may be unnecessary in a future version of
12
+ * bootstrap, which intends to solve this using MutationObserver.
13
+ */
14
+ var removeDesyncedTooltip = function(tooltip) {
15
+ var interval = setInterval(function(){
16
+ if(!$(tooltip.element).is(":hover")) {
17
+ tooltip.dispose();
18
+ clearInterval(interval);
19
+ }
20
+ }, 200);
21
+ $(tooltip.element).on('hidden.bs.tooltip', function(){
22
+ clearInterval(interval);
23
+ });
24
+ };
25
+
6
26
  $('body').on('inserted.bs.tooltip', function(e){
7
27
  var $target = $(e.target);
8
28
  var tooltip = $target.data('bs.tooltip');
9
-
10
- /*
11
- * Observe target changes to understand if we need to remove tooltips.
12
- *
13
- * This is necessary to fix tooltips hanging around after their attached
14
- * element has been removed from the DOM (and will therefore receive no
15
- * mouseleave event).
16
- */
17
- var observer = new MutationObserver(function(mutations) {
18
- // disconnect itself when content is changed, a new observer will
19
- // be attached to this element when the new tooltip is created.
20
- this.disconnect();
21
-
22
- tooltip.hide();
23
- });
24
- observer.observe($target.get(0), { attributes: true });
25
-
29
+ removeDesyncedTooltip(tooltip);
26
30
  var $tooltip = $("#" + $target.attr("aria-describedby"));
27
31
  $tooltip.addClass("action-" + $target.data("action"));
28
32
  });
@@ -23,7 +23,7 @@ Spree.ready(function () {
23
23
  url: Spree.routes.option_type_search,
24
24
  quietMillis: 200,
25
25
  datatype: 'json',
26
- params: { "headers": { "X-Spree-Token": Spree.api_key } },
26
+ params: { "headers": { 'Authorization': 'Bearer ' + Spree.api_key } },
27
27
  data: function (term) {
28
28
  return {
29
29
  q: { name_cont: term }
@@ -23,7 +23,7 @@ $.fn.productAutocomplete = function (options) {
23
23
  ajax: {
24
24
  url: Spree.routes.admin_product_search,
25
25
  datatype: 'json',
26
- params: { "headers": { "X-Spree-Token": Spree.api_key } },
26
+ params: { "headers": { 'Authorization': 'Bearer ' + Spree.api_key } },
27
27
  data: function (term, page) {
28
28
  return {
29
29
  q: {
@@ -85,7 +85,12 @@ adjustShipmentItems = function(shipment_number, variant_id, quantity){
85
85
  window.location.reload();
86
86
  },
87
87
  error: function(response) {
88
- window.show_flash('error', response.responseJSON.message);
88
+ json = response.responseJSON;
89
+ message = json.error;
90
+ for (error in json.errors) {
91
+ message += '<br />' + json.errors[error].join();
92
+ }
93
+ window.show_flash('error', message);
89
94
  }
90
95
  });
91
96
  }
@@ -2,11 +2,20 @@ Spree.ready(function() {
2
2
  $('.js-edit-stock-item').each(function() {
3
3
  var $el = $(this);
4
4
  var model = new Spree.Models.StockItem($el.data('stock-item'));
5
+ var trackInventory = $el.data('track-inventory');
5
6
  new Spree.Views.Stock.EditStockItemRow({
6
7
  el: $el,
7
8
  stockLocationName: $el.data('stock-location-name'),
8
9
  model: model
9
10
  });
11
+
12
+ if (trackInventory === false) {
13
+ $('.js-edit-stock-item input').attr({
14
+ disabled: true,
15
+ class: 'with-tip',
16
+ title: '"Track inventory" option disabled for this variant'
17
+ });
18
+ }
10
19
  });
11
20
 
12
21
  $('.js-add-stock-item').each(function() {
@@ -9,9 +9,25 @@ Spree.ready(function() {
9
9
  field.defaultValue = field.value;
10
10
  textDisplay.textContent = field.value;
11
11
 
12
- show_flash('success', data.message);
12
+ if (typeof data !== "undefined") {
13
+ // we are using jquery_ujs
14
+ message = data.message
15
+ } else {
16
+ // we are using rails-ujs
17
+ message = event.detail[0].message
18
+ }
19
+
20
+ show_flash('success', message);
13
21
  }).on('ajax:error', function(event, xhr, status, error) {
14
- show_flash('error', xhr.responseJSON.message);
22
+ if (typeof xhr !== "undefined") {
23
+ // we are using jquery_ujs
24
+ message = xhr.responseJSON.message
25
+ } else {
26
+ // we are using rails-ujs
27
+ message = event.detail[0].message
28
+ }
29
+
30
+ show_flash('error', message);
15
31
  });
16
32
 
17
33
  row.querySelector('.edit-memo').addEventListener('click', function() {
@@ -30,7 +30,7 @@ Spree.ready(function() {
30
30
  url: Spree.routes.taxons_search,
31
31
  params: {
32
32
  "headers": {
33
- "X-Spree-Token": Spree.api_key
33
+ 'Authorization': 'Bearer ' + Spree.api_key
34
34
  }
35
35
  },
36
36
  data: function(term, page) {
@@ -1,36 +1,35 @@
1
- <td>{{stockLocationName}}</td>
2
- <td>
1
+ <td class="stock-location-name">{{stockLocationName}}</td>
2
+ <td class="align-center">
3
3
  <input id="backorderable-{{id}}"
4
4
  name="backorderable"
5
5
  type="checkbox"
6
6
  value="backorderable"
7
- {{#unless editing}} disabled="disabled" {{/unless}}
8
7
  {{#if backorderable}} checked="checked" {{/if}}
9
8
  >
10
9
  </td>
10
+ <td class="align-center">
11
+ <span
12
+ {{#if negative}}
13
+ class="negative count-on-hand-display"
14
+ {{else}}
15
+ class="count-on-hand-display"
16
+ {{/if}}
17
+ >{{count_on_hand}}</span>
18
+ </td>
11
19
  <td>
12
- {{#if editing}}
13
- <form>
14
- <input
15
- {{#if negative}}
16
- class="fullwidth negative"
17
- {{else}}
18
- class="fullwidth"
19
- {{/if}}
20
- name="count_on_hand"
21
- type="number"
22
- value="{{count_on_hand}}"
23
- >
24
- </form>
25
- {{else}}
26
- <span {{#if negative}}class="negative"{{/if}}>{{count_on_hand}}</span>
27
- {{/if}}
20
+ <form>
21
+ <input
22
+ {{#if negative}}
23
+ class="fullwidth negative"
24
+ {{else}}
25
+ class="fullwidth"
26
+ {{/if}}
27
+ name="count_on_hand"
28
+ type="number"
29
+ value="0">
30
+ </form>
28
31
  </td>
29
32
  <td class="actions">
30
- {{#if editing}}
31
- <a class="submit fa fa-check icon_link with-tip no-text" data-action="save" href="#"></a>
32
- <a class="cancel fa fa-cancel icon_link with-tip no-text" data-action="cancel" href="#"></a>
33
- {{else}}
34
- <a class="edit fa fa-edit icon_link with-tip no-text" data-action="edit" href="#"></a>
35
- {{/if}}
33
+ <a class="submit fa fa-check icon_link with-tip no-text" data-action="save" href="#"></a>
34
+ <a class="cancel fa fa-cancel icon_link with-tip no-text" data-action="cancel" href="#"></a>
36
35
  </td>
@@ -22,7 +22,7 @@ $.fn.userAutocomplete = function () {
22
22
  ajax: {
23
23
  url: Spree.routes.users_api,
24
24
  datatype: 'json',
25
- params: { "headers": { "X-Spree-Token": Spree.api_key } },
25
+ params: { "headers": { 'Authorization': 'Bearer ' + Spree.api_key } },
26
26
  data: function (term) {
27
27
  return {
28
28
  q: {
@@ -26,7 +26,7 @@
26
26
  quietMillis: 500,
27
27
  params: {
28
28
  "headers": {
29
- "X-Spree-Token": Spree.api_key
29
+ 'Authorization': 'Bearer ' + Spree.api_key
30
30
  }
31
31
  },
32
32
  data: function(term, page) {
@@ -27,7 +27,7 @@ Spree.Views.Order.CustomerSelect = Backbone.View.extend({
27
27
  placeholder: Spree.translations.choose_a_customer,
28
28
  ajax: {
29
29
  url: Spree.routes.users_api,
30
- params: { "headers": { "X-Spree-Token": Spree.api_key } },
30
+ params: { "headers": { 'Authorization': 'Bearer ' + Spree.api_key } },
31
31
  datatype: 'json',
32
32
  data: function(term, page) {
33
33
  return {
@@ -20,10 +20,10 @@ Spree.Views.Order.Summary = Backbone.View.extend({
20
20
  this.$('dd.order-additional_tax_total').text(this.model.get("display_additional_tax_total"))
21
21
 
22
22
  this.$('.order-shipment_state').toggleClass("hidden", !this.model.get("completed_at"))
23
- this.$('dd.order-shipment_state').html(this.renderState('shipment_state', this.model.get("shipment_state")))
23
+ this.$('dd.order-shipment_state').html(this.renderState('shipment_states', this.model.get("shipment_state")))
24
24
 
25
25
  this.$('.order-payment_state').toggleClass("hidden", !this.model.get("completed_at"))
26
- this.$('dd.order-payment_state').html(this.renderState('payment_state', this.model.get("payment_state")))
26
+ this.$('dd.order-payment_state').html(this.renderState('payment_states', this.model.get("payment_state")))
27
27
  },
28
28
 
29
29
  renderState: function(translation_key, value) {
@@ -6,14 +6,23 @@ Spree.Views.Stock.AddStockItem = Backbone.View.extend({
6
6
  },
7
7
 
8
8
  events: {
9
- "click .submit": "onSubmit"
9
+ "click .submit": "onSubmit",
10
+ "submit form": "onSubmit",
11
+ 'input [name="count_on_hand"]': "onChange",
12
+ 'change [name="stock_location_id"]': "onChange",
13
+ 'click [name="backorderable"]': "onChange"
10
14
  },
11
15
 
12
16
  validate: function() {
13
- var locationSelectContainer = this.$locationSelect.siblings('.select2-container');
14
- locationSelectContainer.toggleClass('error', !this.$locationSelect.val());
17
+ this.$locationSelect.toggleClass('error', !this.$locationSelect.val());
15
18
  this.$countInput.toggleClass('error', !this.$countInput.val());
16
- return locationSelectContainer.hasClass('error') || this.$countInput.hasClass('error');
19
+ return this.$locationSelect.hasClass('error') || this.$countInput.hasClass('error');
20
+ },
21
+
22
+ onChange: function (event) {
23
+ var $target = $(event.target)
24
+ if ($target.val() !== '') $target.removeClass('error');
25
+ this.$el.addClass('changed');
17
26
  },
18
27
 
19
28
  onSuccess: function() {
@@ -25,6 +34,7 @@ Spree.Views.Stock.AddStockItem = Backbone.View.extend({
25
34
  stockLocationName: stockLocationName
26
35
  });
27
36
  editView.$el.insertBefore(this.$el);
37
+ editView.$el.addClass('stock-item-edit-row');
28
38
  this.model = new Spree.Models.StockItem({
29
39
  variant_id: this.model.get('variant_id'),
30
40
  stock_location_id: this.model.get('stock_location_id')
@@ -58,6 +68,7 @@ Spree.Views.Stock.AddStockItem = Backbone.View.extend({
58
68
  success: this.onSuccess.bind(this),
59
69
  error: this.onError.bind(this)
60
70
  };
71
+ this.$el.removeClass('changed');
61
72
  this.model.save(null, options);
62
73
  }
63
74
  });
@@ -3,16 +3,17 @@ Spree.Views.Stock.EditStockItemRow = Backbone.View.extend({
3
3
 
4
4
  initialize: function(options) {
5
5
  this.stockLocationName = options.stockLocationName;
6
- this.editing = false;
7
6
  this.negative = this.model.attributes.count_on_hand < 0;
7
+ this.previousAttributes = _.clone(this.model.attributes);
8
+ this.listenTo(this.model, 'sync', this.onSuccess);
8
9
  this.render();
9
10
  },
10
11
 
11
12
  events: {
12
- "click .edit": "onEdit",
13
13
  "click .submit": "onSubmit",
14
14
  "submit form": "onSubmit",
15
- "click .cancel": "onCancel"
15
+ "click .cancel": "onCancel",
16
+ 'input [name="count_on_hand"]': "countOnHandChanged"
16
17
  },
17
18
 
18
19
  template: HandlebarsTemplates['stock_items/stock_location_stock_item'],
@@ -26,26 +27,43 @@ Spree.Views.Stock.EditStockItemRow = Backbone.View.extend({
26
27
  _.extend(renderAttr, this.model.attributes);
27
28
  this.$el.attr("data-variant-id", this.model.get('variant_id'));
28
29
  this.$el.html(this.template(renderAttr));
30
+ this.$count_on_hand_display = this.$('.count-on-hand-display');
29
31
  return this;
30
32
  },
31
33
 
32
34
  onEdit: function(ev) {
33
35
  ev.preventDefault();
34
- this.editing = true;
35
36
  this.render();
36
37
  },
37
38
 
38
39
  onCancel: function(ev) {
39
40
  ev.preventDefault();
40
- this.model.set(this.model.previousAttributes());
41
- this.editing = false;
41
+ this.model.set(this.previousAttributes);
42
+ this.$el.removeClass('changed');
42
43
  this.render();
43
44
  },
44
45
 
46
+ countOnHandChanged: function(ev) {
47
+ var diff = parseInt(ev.currentTarget.value), newCount;
48
+ if (isNaN(diff)) diff = 0;
49
+ newCount = this.previousAttributes.count_on_hand + diff;
50
+ ev.preventDefault();
51
+ // Do not allow negative stock values
52
+ if (newCount < 0) {
53
+ ev.currentTarget.value = -1 * this.previousAttributes.count_on_hand;
54
+ this.$count_on_hand_display.text(0);
55
+ } else {
56
+ this.model.set("count_on_hand", newCount);
57
+ this.$count_on_hand_display.text(newCount);
58
+ }
59
+ this.$el.toggleClass('changed', diff !== 0);
60
+ },
61
+
45
62
  onSuccess: function() {
46
- this.editing = false;
63
+ this.$el.removeClass('changed');
64
+ this.previousAttributes = _.clone(this.model.attributes);
47
65
  this.render();
48
- show_flash("success", Spree.translations.updated_successfully);
66
+ this.$('[name="count_on_hand"]').focus();
49
67
  },
50
68
 
51
69
  onError: function(model, response, options) {
@@ -62,9 +80,11 @@ Spree.Views.Stock.EditStockItemRow = Backbone.View.extend({
62
80
  backorderable: backorderable
63
81
  });
64
82
  var options = {
65
- success: this.onSuccess.bind(this),
83
+ success: function() {
84
+ show_flash("success", Spree.translations.updated_successfully);
85
+ },
66
86
  error: this.onError.bind(this)
67
87
  };
68
- this.model.save({ force: true }, options);
88
+ this.model.save({}, options);
69
89
  }
70
90
  });