spree_backend 4.3.0.rc1 → 4.3.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (33) hide show
  1. checksums.yaml +4 -4
  2. data/app/assets/images/noimage/backend-missing-image.svg +4 -0
  3. data/app/assets/javascripts/spree/backend/global/select2_autocomplete.es6 +79 -90
  4. data/app/assets/javascripts/spree/backend/global/select2_populate.es6 +39 -13
  5. data/app/assets/javascripts/spree/backend/global/tinymce.es6 +1 -1
  6. data/app/assets/javascripts/spree/backend/menus/menu.es6 +1 -2
  7. data/app/assets/javascripts/spree/backend/option_type_autocomplete.js +6 -0
  8. data/app/assets/javascripts/spree/backend/taxon_autocomplete.js +7 -1
  9. data/app/assets/stylesheets/spree/backend/shared/_base.scss +52 -0
  10. data/app/controllers/spree/admin/images_controller.rb +25 -8
  11. data/app/controllers/spree/admin/orders_controller.rb +1 -1
  12. data/app/controllers/spree/admin/payment_methods_controller.rb +2 -2
  13. data/app/controllers/spree/admin/products_controller.rb +1 -1
  14. data/app/controllers/spree/admin/resource_controller.rb +8 -11
  15. data/app/views/spree/admin/cms_sections/types/_hero_image.html.erb +3 -4
  16. data/app/views/spree/admin/cms_sections/types/_image_gallery.html.erb +12 -15
  17. data/app/views/spree/admin/cms_sections/types/_side_by_side_images.html.erb +2 -2
  18. data/app/views/spree/admin/images/index.html.erb +3 -1
  19. data/app/views/spree/admin/orders/_line_items.html.erb +1 -1
  20. data/app/views/spree/admin/orders/_shipment_manifest.html.erb +1 -1
  21. data/app/views/spree/admin/products/_autocomplete.js.erb +6 -2
  22. data/app/views/spree/admin/products/_form.html.erb +13 -2
  23. data/app/views/spree/admin/products/index.html.erb +1 -1
  24. data/app/views/spree/admin/properties/index.html.erb +10 -0
  25. data/app/views/spree/admin/shared/_account_nav.html.erb +2 -2
  26. data/app/views/spree/admin/shared/cms/_spree_product.html.erb +23 -10
  27. data/app/views/spree/admin/shared/cms/_spree_taxon.html.erb +23 -10
  28. data/app/views/spree/admin/shared/linkables/_spree_cms_page.erb +1 -6
  29. data/app/views/spree/admin/users/_lifetime_stats.html.erb +16 -4
  30. data/app/views/spree/admin/users/items.html.erb +1 -1
  31. data/app/views/spree/admin/variants/_autocomplete.js.erb +6 -2
  32. data/spree_backend.gemspec +1 -1
  33. metadata +13 -12
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: f94292044f4437a2ef5bae417d2241dfcc073ecf4173af095e3485ad27dd5bd0
4
- data.tar.gz: 883ef408cd919ac8feb7fc23113c30125c56665643dcd582039dbe3cf6d52ff4
3
+ metadata.gz: f66f277592476e40c4b45e8a044aa4e88aad8d1c5bcaffb9be969e10f66bc9d1
4
+ data.tar.gz: 3ea8a5805c632a533e065f8a95079a1d3ab6fef5e22a6571aefac630de061bf4
5
5
  SHA512:
6
- metadata.gz: f4f80af095b6ab0bc6ce8353ac791d748a6caa2c623541617df89eb04949448437efe0a587ff63d408c24cd258f9085f0a787726d87e1524611fb2711b50449c
7
- data.tar.gz: dce1f89871390b8bf603874c2ddd9ef67007242e7f272c78f2f503047ce8e419270b0f4ef6ff9f90cddfc0e2b954bdef2d81c981f11ca1b3de25477b772d14cb
6
+ metadata.gz: 073e261756b177f6370036d7c51b695f68909cf26cd13e74eb58502c6b8bb0f6f226bfe2e80511a9bdb8ecedf0d509c9ceb3f04f5f9633914b22f55e36701271
7
+ data.tar.gz: de5654888dc5ed1519b8ec3207a9429bc7a259a0c8eea8c8b42ba661fb251b5e14e56407779df5e426cadd09fa0e6b339d6b1f590943b4fc526a3a8f3d1536c7
@@ -0,0 +1,4 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-image" viewBox="0 0 16 16">
2
+ <path d="M6.002 5.5a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0z"/>
3
+ <path d="M2.002 1a2 2 0 0 0-2 2v10a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V3a2 2 0 0 0-2-2h-12zm12 1a1 1 0 0 1 1 1v6.5l-3.777-1.947a.5.5 0 0 0-.577.093l-3.71 3.71-2.66-1.772a.5.5 0 0 0-.63.062L1.002 12V3a1 1 0 0 1 1-1h12z"/>
4
+ </svg>
@@ -1,49 +1,39 @@
1
1
  // SELECT2 AUTOCOMPLETE JS
2
- // This JavaScript file allows Spree developers to set up Select2 autocomplete search
3
- // using the API v2 by simply adding data attributes to a select element with the class: 'select2autocomplete'
4
- // as shown here: <select class="select2autocomplete"></select>.
2
+ // The JavaScript in this file allows Spree developers to set up Select2 autocomplete search
3
+ // using the API v2 by simply adding data attributes to a select element.
5
4
 
6
5
  // REQUIRED ATTRIBUTES
7
- // You must provide a URL for the API V2, use the format shown below.
8
- // See the backend.js file for other API V2 URL's.
9
- //
10
- // Example:
6
+ // You must provide a URL for the API V2, use the format shown below. See backend.js for other API V2 URL's.
7
+ // REQUIRED:
11
8
  // data-autocomplete-url-value="products_api_v2"
12
9
 
13
- // OPTIONAL ATTRIBUTES
14
- // These optional attributes have sensible defaults, you many not need to use them in many cases,
15
- // but they do provide a powerful toolkit to refine your autocomplete search as required.
16
- //
17
- // Examples:
18
- // data-autocomplete-placeholder-value="Seach Pages" <- Sets the placeholder | DEFAULT is: 'Search'
19
- // data-autocomplete-clear-value="boolean" <- Allow select2 to be cleared | DEFAULT is: false (no clear button)
20
- // data-autocomplete-multiple-value="boolean" <- Multiple or Single select | DEFAULT is: false (single)
21
- // data-autocomplete-return-attr-value="pretty_name" <- Return Attribute. | DEFAULT is: 'name'
22
- // data-autocomplete-min-input-value="4" <- Minimum input for search | DEFAULT is: 3
23
- // data-autocomplete-search-query-value="title_i_cont" <- Custom search query | DEFAULT is: 'name_i_cont'
24
- // data-autocomplete-custom-return-id-value="permalink" <- Return a custom attribute rather than the ID | DEFAULT: returns id
10
+ // OPTIONAL:
11
+ // data-autocomplete-placeholder-value="Seach Pages" <- Sets the placeholder | DEFAULT is: 'Search'.
12
+ // data-autocomplete-clear-value=boolean <- Allow select2 to be cleared | DEFAULT is: false (no clear button).
13
+ // data-autocomplete-multiple-value=boolean <- Multiple or Single select | DEFAULT is: false (single).
14
+ // data-autocomplete-return-attr-value="pretty_name" <- Return Attribute. | DEFAULT is: 'name'.
15
+ // data-autocomplete-min-input-value="4" <- Minimum input for search | DEFAULT is: 3.
16
+ // data-autocomplete-search-query-value="title_i_cont" <- Custom search query | DEFAULT is: 'name_i_cont'.
17
+ // data-autocomplete-custom-return-id-value="permalink" <- Return a custom attribute | DEFAULT: returns id.
18
+ // data-autocomplete-debug-mode-value=boolean <- Turn on console loggin of data returned by the request.
25
19
  //
26
- // SECOND HARD CODED FILTER - (OPTIONAL)
27
- // Use a second hard coded search filter param and term if you require a little more curation
28
- // than just all results returning, an example of this in use can be seen in the menu_item search for Pages,
29
- // here we only want to retuen Pages that have linkable slugs, not homepages, and so we filter those using the
30
- // data attributes shown below.
31
- //
32
- // Examples:
33
- // data-autocomplete-additional-query-value="type_not_eq" <- Additional hard coded query | DEFAULT: null (not used)
34
- // data-autocomplete-additional-term-value="Spree::Cms::Pages::Homepage" <- Additional hard coded term | DEFAULT: null (not used)
20
+ // Add your own custom URL params to the request as needed
21
+ // EXAMPLE:
22
+ // data-autocomplete-additional-url-params-value="filter[type_not_eq]=Spree::Cms::Pages::Homepage"
35
23
 
36
24
  document.addEventListener('DOMContentLoaded', function() {
37
- const select2Autocompletes = document.querySelectorAll('select.select2autocomplete')
38
- select2Autocompletes.forEach(element => buildParamsFromDataAttrs(element))
25
+ loadAutoCompleteParams()
39
26
  })
40
27
 
41
- function buildParamsFromDataAttrs (element) {
28
+ // eslint-disable-next-line no-unused-vars
29
+ function loadAutoCompleteParams() {
30
+ const select2Autocompletes = document.querySelectorAll('select[data-autocomplete-url-value]')
31
+ select2Autocompletes.forEach(element => buildParamsFromDataAttrs(element))
32
+ }
33
+
34
+ function buildParamsFromDataAttrs(element) {
42
35
  $(element).select2Autocomplete({
43
- // Required Attributes
44
36
  apiUrl: Spree.routes[element.dataset.autocompleteUrlValue],
45
-
46
- // Optional Attributes
47
37
  placeholder: element.dataset.autocompletePlaceholderValue,
48
38
  allow_clear: element.dataset.autocompleteClearValue,
49
39
  multiple: element.dataset.autocompleteMultipleValue,
@@ -51,19 +41,17 @@ function buildParamsFromDataAttrs (element) {
51
41
  minimum_input: element.dataset.autocompleteMinInputValue,
52
42
  search_query: element.dataset.autocompleteSearchQueryValue,
53
43
  custom_return_id: element.dataset.autocompleteCustomReturnIdValue,
54
-
55
- // Hard coded additional filter for those edge cases.
56
- additional_query: element.dataset.autocompleteAdditionalQueryValue,
57
- additional_term: element.dataset.autocompleteAdditionalTermValue
44
+ additional_url_params: element.dataset.autocompleteAdditionalUrlParamsValue,
45
+ debug_mode: element.dataset.autocompleteDebugModeValue
58
46
  })
59
47
  }
60
48
 
61
- // Can also be called directly as javastript.
62
49
  $.fn.select2Autocomplete = function(params) {
63
- // Required params
64
- const apiUrl = params.apiUrl || null
50
+ let apiUrl = null
51
+ let returnedFields
65
52
 
66
- // Optional Params
53
+ const resourcePlural = params.apiUrl.match(/([^/]*)\/*$/)[1]
54
+ const resourceSingular = resourcePlural.slice(0, -1)
67
55
  const select2placeHolder = params.placeholder || Spree.translations.search
68
56
  const select2Multiple = params.multiple || false
69
57
  const select2allowClear = params.allow_clear || false
@@ -71,19 +59,42 @@ $.fn.select2Autocomplete = function(params) {
71
59
  const minimumInput = params.minimum_input || 3
72
60
  const searchQuery = params.search_query || 'name_i_cont'
73
61
  const customReturnId = params.custom_return_id || null
74
- const additionalQuery = params.additional_query || null
75
- const additionalTerm = params.additional_term || null
62
+ const additionalUrlParams = params.additional_url_params || null
63
+ const DebugMode = params.debug_mode || null
76
64
 
65
+ //
66
+ // Set up a clean URL for sparseFields
67
+ if (customReturnId == null) {
68
+ returnedFields = returnAttribute
69
+ } else {
70
+ returnedFields = `${returnAttribute},${customReturnId}`
71
+ }
72
+ const sparseFields = `fields[${resourceSingular}]=${returnedFields}`
73
+
74
+ //
75
+ // Set up a clean URL for Additional URL Params
76
+ if (additionalUrlParams != null) {
77
+ // URL + Additional URL Params + Sparse Fields
78
+ apiUrl = `${params.apiUrl}?${additionalUrlParams}&${sparseFields}`
79
+ } else {
80
+ // URL + Sparse Fields (the default response for a noraml Select2)
81
+ apiUrl = `${params.apiUrl}?${sparseFields}`
82
+ }
83
+
84
+ if (DebugMode != null) console.log('Request URL:' + apiUrl)
85
+
86
+ //
87
+ // Format the returned values.
77
88
  function formatList(values) {
78
89
  if (customReturnId) {
79
- return values.map(function (obj) {
90
+ return values.map(function(obj) {
80
91
  return {
81
92
  id: obj.attributes[customReturnId],
82
93
  text: obj.attributes[returnAttribute]
83
94
  }
84
95
  })
85
96
  } else {
86
- return values.map(function (obj) {
97
+ return values.map(function(obj) {
87
98
  return {
88
99
  id: obj.id,
89
100
  text: obj.attributes[returnAttribute]
@@ -92,52 +103,30 @@ $.fn.select2Autocomplete = function(params) {
92
103
  }
93
104
  }
94
105
 
95
- if (additionalQuery == null && additionalTerm == null) {
96
- this.select2({
97
- multiple: select2Multiple,
98
- allowClear: select2allowClear,
99
- placeholder: select2placeHolder,
100
- minimumInputLength: minimumInput,
101
- ajax: {
102
- url: apiUrl,
103
- headers: Spree.apiV2Authentication(),
104
- data: function (params) {
105
- return {
106
- filter: {
107
- [searchQuery]: params.term
108
- }
109
- }
110
- },
111
- processResults: function(json) {
112
- return {
113
- results: formatList(json.data)
106
+ //
107
+ // Set-up Select2 and make AJAX request.
108
+ this.select2({
109
+ multiple: select2Multiple,
110
+ allowClear: select2allowClear,
111
+ placeholder: select2placeHolder,
112
+ minimumInputLength: minimumInput,
113
+ ajax: {
114
+ url: apiUrl,
115
+ headers: Spree.apiV2Authentication(),
116
+ data: function(params) {
117
+ return {
118
+ filter: {
119
+ [searchQuery]: params.term
114
120
  }
115
121
  }
116
- }
117
- })
118
- } else {
119
- this.select2({
120
- multiple: select2Multiple,
121
- allowClear: select2allowClear,
122
- placeholder: select2placeHolder,
123
- minimumInputLength: minimumInput,
124
- ajax: {
125
- url: apiUrl,
126
- headers: Spree.apiV2Authentication(),
127
- data: function (params) {
128
- return {
129
- filter: {
130
- [searchQuery]: params.term,
131
- [additionalQuery]: additionalTerm
132
- }
133
- }
134
- },
135
- processResults: function(json) {
136
- return {
137
- results: formatList(json.data)
138
- }
122
+ },
123
+ processResults: function(json) {
124
+ if (DebugMode != null) console.log(json)
125
+
126
+ return {
127
+ results: formatList(json.data)
139
128
  }
140
129
  }
141
- })
142
- }
130
+ }
131
+ })
143
132
  }
@@ -1,11 +1,9 @@
1
1
  /**
2
2
  populateSelectOptionsFromApi(params)
3
+ Allows you to easily fetch data from API (Platfrom v2) and populate an empty <select> with <option> tags, including a selected <option> tag.
3
4
 
4
- Allows you to easily fetch data from API (Platfrom v2)
5
- and populate an empty <select> with <option> tags,
6
- including a selected <option> tag.
7
-
8
- ## EXAMPLE USE CASE called from ERB view file:
5
+ ## EXAMPLE A
6
+ # Populating a list of all taxons including a selected item
9
7
 
10
8
  populateSelectOptionsFromApi({
11
9
  targetElement: '#mySelectElement',
@@ -16,6 +14,24 @@
16
14
  selectedOption: <%= @menu_item.linked_resource_id %>
17
15
  <% end %>
18
16
  })
17
+
18
+ ## EXAMPLE B
19
+ # Populating a single selected item using filter and returning an attribute other than the ID
20
+
21
+ <% if resource.link_one.present? %>
22
+ <script>
23
+ populateSelectOptionsFromApi({
24
+ targetElement: "#<%= save_to %>Select2",
25
+ apiUrl: Spree.routes.taxons_api_v2 + "?filter[permalink_matches]=<%= resource.send(save_to) %>",
26
+ returnValueFromAttributes: 'permalink',
27
+ returnOptionText: 'pretty_name',
28
+
29
+ <% if resource.send(save_to) %>
30
+ selectedOption: "<%= resource.send(save_to) %>"
31
+ <% end %>
32
+ })
33
+ </script>
34
+ <% end %>
19
35
  **/
20
36
 
21
37
  // eslint-disable-next-line no-unused-vars
@@ -32,30 +48,40 @@ const handleErrors = function(response) {
32
48
  const createRequest = function(params, succeed, fail) {
33
49
  const targetElement = params.targetElement
34
50
  const apiUrl = params.apiUrl
35
- const returnAttribute = params.returnAttribute
51
+ const returnOptionText = params.returnOptionText
52
+ const returnValueFromAttributes = params.returnValueFromAttributes || null
36
53
  const selectedOption = params.selectedOption
37
54
  const selectEl = document.querySelector(targetElement)
38
55
 
39
56
  fetch(apiUrl, { headers: Spree.apiV2Authentication() })
40
57
  .then((response) => handleErrors(response))
41
- .then((json) => succeed(json.data, returnAttribute, selectEl, selectedOption))
58
+ .then((json) => succeed(json.data, returnValueFromAttributes, returnOptionText, selectEl, selectedOption))
42
59
  .catch((error) => fail(error, selectEl))
43
60
  }
44
61
 
45
- const updateSelectSuccess = function(parsedData, returnAttribute, selectEl, selectedOption) {
62
+ const updateSelectSuccess = function(parsedData, returnValueFromAttributes, returnOptionText, selectEl, selectedOption) {
63
+ const selectedOpt = selectEl.querySelector('option[selected]')
64
+
46
65
  parsedData.forEach((object) => {
47
66
  const optionEl = document.createElement('option')
48
- optionEl.value = object.id
49
- optionEl.innerHTML = object.attributes[returnAttribute]
50
67
 
51
- if (parseInt(selectedOption, 10) === parseInt(object.id, 10)) optionEl.selected = true
68
+ if (returnValueFromAttributes == null) {
69
+ optionEl.value = object.id
70
+ if (parseInt(selectedOption, 10) === parseInt(object.id, 10)) optionEl.selected = true
71
+ } else {
72
+ optionEl.value = object.attributes[returnValueFromAttributes]
73
+ if (selectedOpt.value === object.attributes[returnValueFromAttributes]) {
74
+ selectedOpt.remove()
75
+
76
+ optionEl.setAttribute('selected', 'selected')
77
+ }
78
+ }
52
79
 
80
+ optionEl.innerHTML = object.attributes[returnOptionText]
53
81
  selectEl.appendChild(optionEl)
54
82
  })
55
83
  }
56
84
 
57
85
  const updateSelectError = function(error, selectEl) {
58
- selectEl.disabled = true
59
-
60
86
  console.log(error)
61
87
  }
@@ -6,6 +6,6 @@ document.addEventListener('DOMContentLoaded', function() {
6
6
  'image table paste code link table'
7
7
  ],
8
8
  menubar: false,
9
- toolbar: 'undo redo | styleselect | bold italic link | alignleft aligncenter alignright alignjustify | table | bullist numlist outdent indent | code '
9
+ toolbar: 'undo redo | styleselect | bold italic link forecolor backcolor | alignleft aligncenter alignright alignjustify | table | bullist numlist outdent indent | code '
10
10
  });
11
11
  })
@@ -29,12 +29,11 @@ document.addEventListener('DOMContentLoaded', function() {
29
29
 
30
30
  function handleMenuItemMove(evt) {
31
31
  const data = {
32
- moved_item_id: parseInt(evt.item.dataset.itemId, 10),
33
32
  new_parent_id: parseInt(evt.to.dataset.parentId, 10) || null,
34
33
  new_position_idx: parseInt(evt.newIndex, 10)
35
34
  }
36
35
 
37
- fetch(Spree.routes.menus_items_api_v2 + '/reposition', {
36
+ fetch(`${Spree.routes.menus_items_api_v2}/${evt.item.dataset.itemId}/reposition`, {
38
37
  method: 'PATCH',
39
38
  headers: {
40
39
  Authorization: 'Bearer ' + OAUTH_TOKEN,
@@ -1,6 +1,8 @@
1
1
  $.fn.optionTypeAutocomplete = function () {
2
2
  'use strict'
3
3
 
4
+ console.warn('optionTypeAutocomplete is deprecated and will be removed in Spree 5.0')
5
+
4
6
  this.select2({
5
7
  minimumInputLength: 2,
6
8
  multiple: true,
@@ -23,5 +25,9 @@ $.fn.optionTypeAutocomplete = function () {
23
25
  }
24
26
 
25
27
  $(document).ready(function () {
28
+ var productOptionTypeSelector = document.getElementById('product_option_type_ids')
29
+ if (productOptionTypeSelector == null) return
30
+ if (productOptionTypeSelector.hasAttribute('data-autocomplete-url-value')) return
31
+
26
32
  $('#product_option_type_ids').optionTypeAutocomplete()
27
33
  })
@@ -2,6 +2,8 @@ $.fn.taxonAutocomplete = function() {
2
2
  'use strict'
3
3
 
4
4
  function formatTaxonList(values) {
5
+ console.warn('taxonAutocomplete is deprecated and will be removed in Spree 5.0')
6
+
5
7
  return values.map(function (obj) {
6
8
  return {
7
9
  id: obj.id,
@@ -20,7 +22,7 @@ $.fn.taxonAutocomplete = function() {
20
22
  data: function (params) {
21
23
  return {
22
24
  q: {
23
- name_cont: params.term,
25
+ name_cont: params.term
24
26
  },
25
27
  token: Spree.api_key
26
28
  }
@@ -35,5 +37,9 @@ $.fn.taxonAutocomplete = function() {
35
37
  }
36
38
 
37
39
  $(document).ready(function () {
40
+ var productTaxonSelector = document.getElementById('product_taxon_ids')
41
+ if (productTaxonSelector == null) return
42
+ if (productTaxonSelector.hasAttribute('data-autocomplete-url-value')) return
43
+
38
44
  $('#product_taxon_ids').taxonAutocomplete()
39
45
  })
@@ -28,6 +28,58 @@ figure.admin-img-holder {
28
28
  }
29
29
  }
30
30
 
31
+ div.admin-product-image-container {
32
+ border: 1px solid $gray-500;
33
+ background-color: #fefefe;
34
+ border-radius: $border-radius;
35
+ overflow: hidden;
36
+ display: flex;
37
+ justify-content: center;
38
+ margin: auto;
39
+
40
+ a {
41
+ display: flex
42
+ }
43
+
44
+ img {
45
+ max-width: 100%;
46
+ height: auto;
47
+ align-self: center;
48
+ transform: scale(1.6);
49
+ }
50
+
51
+ svg {
52
+ color: $gray-600;
53
+ align-self: center;
54
+ }
55
+
56
+ &.mini-img {
57
+ border-radius: $border-radius / 2;
58
+ width: 24px;
59
+ height: 24px;
60
+ }
61
+
62
+ &.small-img {
63
+ border-radius: $border-radius;
64
+ width: 50px;
65
+ height: 50px;
66
+ }
67
+
68
+ &.product-img {
69
+ border-width: 2px;
70
+ border-radius: $border-radius * 2;
71
+ width: 100px;
72
+ height: 100px;
73
+ }
74
+
75
+ &.large-img {
76
+ border-width: 3px;
77
+ border-radius: $border-radius * 3;
78
+ width: 300px;
79
+ height: 300px;
80
+ }
81
+ }
82
+
31
83
  .js-remove-promo-rule-option-value {
32
84
  color: $primary !important;
33
85
  &:hover {
@@ -1,10 +1,7 @@
1
1
  module Spree
2
2
  module Admin
3
3
  class ImagesController < ResourceController
4
- include Spree::Admin::ProductConcern
5
-
6
- belongs_to 'spree/product', find_by: :slug
7
-
4
+ before_action :load_product
8
5
  before_action :load_edit_data, except: :index
9
6
 
10
7
  create.before :set_viewable
@@ -13,24 +10,44 @@ module Spree
13
10
  private
14
11
 
15
12
  def location_after_destroy
16
- spree.admin_product_images_url(@arent)
13
+ spree.admin_product_images_url(@product)
17
14
  end
18
15
 
19
16
  def location_after_save
20
- spree.admin_product_images_url(parent)
17
+ spree.admin_product_images_url(@product)
21
18
  end
22
19
 
23
20
  def load_edit_data
24
- @variants = parent.variants.map do |variant|
21
+ @variants = @product.variants.map do |variant|
25
22
  [variant.sku_and_options_text, variant.id]
26
23
  end
27
- @variants.insert(0, [Spree.t(:all), parent.master.id])
24
+ @variants.insert(0, [Spree.t(:all), @product.master_id])
28
25
  end
29
26
 
30
27
  def set_viewable
31
28
  @image.viewable_type = 'Spree::Variant'
32
29
  @image.viewable_id = params[:image][:viewable_id]
33
30
  end
31
+
32
+ def load_product
33
+ @product = scope.friendly.find(params[:product_id])
34
+ end
35
+
36
+ def scope
37
+ current_store.products
38
+ end
39
+
40
+ def collection_url
41
+ spree.admin_product_images_url
42
+ end
43
+
44
+ def modle_class
45
+ Spree::Image
46
+ end
47
+
48
+ def collection
49
+ @collection ||= load_product.variant_images
50
+ end
34
51
  end
35
52
  end
36
53
  end
@@ -113,7 +113,7 @@ module Spree
113
113
  end
114
114
 
115
115
  def resend
116
- OrderMailer.confirm_email(@order.id, true).deliver_later
116
+ @order.deliver_order_confirmation_email
117
117
  flash[:success] = Spree.t(:order_email_resent)
118
118
 
119
119
  redirect_back fallback_location: spree.edit_admin_order_url(@order)
@@ -10,7 +10,7 @@ module Spree
10
10
  def create
11
11
  @payment_method = params[:payment_method].delete(:type).constantize.new(payment_method_params)
12
12
  @object = @payment_method
13
- ensure_current_store
13
+ set_current_store
14
14
  invoke_callbacks(:create, :before)
15
15
  if @payment_method.save
16
16
  invoke_callbacks(:create, :after)
@@ -39,7 +39,7 @@ module Spree
39
39
  end
40
40
 
41
41
  if @payment_method.update(attributes)
42
- ensure_current_store
42
+ set_current_store
43
43
  invoke_callbacks(:update, :after)
44
44
  flash[:success] = Spree.t(:successfully_updated, resource: Spree.t(:payment_method))
45
45
  redirect_to spree.edit_admin_payment_method_path(@payment_method)
@@ -30,7 +30,7 @@ module Spree
30
30
  end
31
31
  invoke_callbacks(:update, :before)
32
32
  if @object.update(permitted_resource_params)
33
- ensure_current_store
33
+ set_current_store
34
34
  invoke_callbacks(:update, :after)
35
35
  flash[:success] = flash_message_for(@object, :successfully_updated)
36
36
  respond_with(@object) do |format|
@@ -3,7 +3,8 @@ class Spree::Admin::ResourceController < Spree::Admin::BaseController
3
3
 
4
4
  helper_method :new_object_url, :edit_object_url, :object_url, :collection_url
5
5
  before_action :load_resource, except: :update_positions
6
- before_action :set_currency, :ensure_current_store, only: [:new, :create]
6
+ before_action :set_currency, :set_current_store, only: [:new, :create]
7
+
7
8
  rescue_from ActiveRecord::RecordNotFound, with: :resource_not_found
8
9
 
9
10
  respond_to :html
@@ -26,7 +27,7 @@ class Spree::Admin::ResourceController < Spree::Admin::BaseController
26
27
  def update
27
28
  invoke_callbacks(:update, :before)
28
29
  if @object.update(permitted_resource_params)
29
- ensure_current_store
30
+ set_current_store
30
31
  invoke_callbacks(:update, :after)
31
32
  respond_with(@object) do |format|
32
33
  format.html do
@@ -207,21 +208,17 @@ class Spree::Admin::ResourceController < Spree::Admin::BaseController
207
208
  collection_url
208
209
  end
209
210
 
210
- def set_currency
211
+ def set_current_store
211
212
  return if @object.nil?
212
213
 
213
- @object.currency = current_currency if model_class.method_defined?(:currency=)
214
- @object.cost_currency = current_currency if model_class.method_defined?(:cost_currency=)
214
+ ensure_current_store(@object)
215
215
  end
216
216
 
217
- def ensure_current_store
217
+ def set_currency
218
218
  return if @object.nil?
219
219
 
220
- if @object.has_attribute?(:store_id)
221
- @object.store = current_store
222
- elsif model_class.method_defined?(:stores) && @object.stores.exclude?(current_store)
223
- @object.stores << current_store
224
- end
220
+ @object.currency = current_currency if model_class.method_defined?(:currency=)
221
+ @object.cost_currency = current_currency if model_class.method_defined?(:cost_currency=)
225
222
  end
226
223
 
227
224
  # URL helpers
@@ -37,10 +37,9 @@
37
37
  <%= image_tag main_app.url_for(@cms_section.image_one) %>
38
38
  </figure>
39
39
  <% end %>
40
- <%= f.field_container :image_one, class: ['form-group mb-0'] do %>
41
- <%= f.file_field :image_one %>
42
- <%= f.error_message_on :image_one %>
43
- <% end %>
40
+
41
+ <%= f.file_field :image_one %>
42
+ <%= f.error_message_on :image_one %>
44
43
  <% end %>
45
44
  <small class="form-text text-muted"><%= Spree.t('admin.cms.hero.aspect_ratio') %></small>
46
45
  </div>
@@ -22,7 +22,7 @@
22
22
 
23
23
  <div class="row">
24
24
  <div class="col-12 col-md-4 mb-3">
25
- <div class="card p-3">
25
+ <div id="image_a_details" class="card p-3">
26
26
  <div class="text-center">
27
27
  <h4 class="pb-2"><%= Spree.t('admin.cms.image_gallery.image_a') %></h4>
28
28
  <%= f.field_container :image_one, class: ['form-group'] do %>
@@ -35,10 +35,9 @@
35
35
  <%= image_tag main_app.url_for(@cms_section.image_one) %>
36
36
  </figure>
37
37
  <% end %>
38
- <%= f.field_container :image_one, class: ['form-group mb-0'] do %>
39
- <%= f.file_field :image_one %>
40
- <%= f.error_message_on :image_one %>
41
- <% end %>
38
+
39
+ <%= f.file_field :image_one %>
40
+ <%= f.error_message_on :image_one %>
42
41
  <% end %>
43
42
  </div>
44
43
  <small class="text-muted mb-4"><%= Spree.t('admin.cms.image_gallery.square_image') %></small>
@@ -67,7 +66,7 @@
67
66
  </div>
68
67
 
69
68
  <div class="col-12 col-md-4 mb-3">
70
- <div class="card p-3">
69
+ <div id="image_b_details" class="card p-3">
71
70
  <div class="text-center">
72
71
  <h4 class="pb-2"><%= Spree.t('admin.cms.image_gallery.image_b') %></h4>
73
72
  <%= f.field_container :image_two, class: ['form-group'] do %>
@@ -80,10 +79,9 @@
80
79
  <%= image_tag main_app.url_for(@cms_section.image_two) %>
81
80
  </figure>
82
81
  <% end %>
83
- <%= f.field_container :image_two, class: ['form-group mb-0'] do %>
84
- <%= f.file_field :image_two %>
85
- <%= f.error_message_on :image_two %>
86
- <% end %>
82
+
83
+ <%= f.file_field :image_two %>
84
+ <%= f.error_message_on :image_two %>
87
85
  <% end %>
88
86
  </div>
89
87
  <small class="text-muted mb-4"><%= Spree.t('admin.cms.image_gallery.tall_image') %></small>
@@ -112,7 +110,7 @@
112
110
  </div>
113
111
 
114
112
  <div class="col-12 col-md-4 mb-3">
115
- <div class="card p-3">
113
+ <div id="image_c_details" class="card p-3">
116
114
  <div class="text-center">
117
115
  <h4 class="pb-2"><%= Spree.t('admin.cms.image_gallery.image_c') %></h4>
118
116
  <%= f.field_container :image_three, class: ['form-group'] do %>
@@ -125,10 +123,9 @@
125
123
  <%= image_tag main_app.url_for(@cms_section.image_three) %>
126
124
  </figure>
127
125
  <% end %>
128
- <%= f.field_container :image_three, class: ['form-group mb-0'] do %>
129
- <%= f.file_field :image_three %>
130
- <%= f.error_message_on :image_three %>
131
- <% end %>
126
+
127
+ <%= f.file_field :image_three %>
128
+ <%= f.error_message_on :image_three %>
132
129
  <% end %>
133
130
  </div>
134
131
  <small class="text-muted mb-4"><%= Spree.t('admin.cms.image_gallery.square_image') %></small>
@@ -1,6 +1,6 @@
1
1
  <div class="row pb-0">
2
2
  <div class="col-12 col-md-6 mb-3">
3
- <div class="card p-3">
3
+ <div id="left_image_details" class="card p-3">
4
4
  <div class="text-center">
5
5
  <h4 class="pb-2"><%= Spree.t('admin.cms.side_by_side.left_image') %></h4>
6
6
  <%= f.field_container :image_one, class: ['form-group'] do %>
@@ -51,7 +51,7 @@
51
51
  </div>
52
52
 
53
53
  <div class="col-12 col-md-6 mb-3">
54
- <div class="card p-3">
54
+ <div id="right_image_details" class="card p-3">
55
55
  <div class="text-center">
56
56
  <h4 class="pb-2"><%= Spree.t('admin.cms.side_by_side.right_image') %></h4>
57
57
  <%= f.field_container :image_two, class: ['form-group'] do %>
@@ -41,7 +41,9 @@
41
41
  <% end %>
42
42
  </td>
43
43
  <td class="image">
44
- <%= link_to image_tag(main_app.url_for(image.url(:mini))), main_app.rails_blob_url(image.attachment) %>
44
+ <div class="admin-product-image-container small-img">
45
+ <%= link_to image_tag(main_app.url_for(image.url(:product))), main_app.rails_blob_url(image.attachment) %>
46
+ </div>
45
47
  </td>
46
48
  <% if has_variants %>
47
49
  <td><%= options_text_for(image) %></td>
@@ -20,7 +20,7 @@
20
20
  <% order.line_items.each do |item| %>
21
21
  <tr class="line-item" id="line-item-<%= item.id %>">
22
22
  <td class="line-item-image image text-center">
23
- <%= link_to mini_image(item.variant), edit_admin_product_path(item.variant.product) %>
23
+ <%= link_to small_image(item.variant), edit_admin_product_path(item.variant.product) %>
24
24
  </td>
25
25
  <td class="line-item-name text-center">
26
26
  <%= link_to item.name, edit_admin_product_path(item.variant.product) %>
@@ -1,7 +1,7 @@
1
1
  <% shipment.manifest.each do |item| %>
2
2
  <tr class="stock-item" data-item-quantity="<%= item.quantity %>">
3
3
  <td class="item-image image text-center">
4
- <%= link_to mini_image(item.variant), edit_admin_product_path(item.variant.product) %>
4
+ <%= link_to small_image(item.variant), edit_admin_product_path(item.variant.product) %>
5
5
  </td>
6
6
 
7
7
  <td class="item-name">
@@ -17,9 +17,13 @@
17
17
  </nav>
18
18
  <div class='image'>
19
19
  {{#if image }}
20
- <img src='{{image}}' alt='{{ product.attributes.name }}' class='thumbnail rounded border border' />
20
+ <div class="admin-product-image-container small-img">
21
+ <img src='{{image}}' alt='{{ product.attributes.name }}' class='thumbnail rounded border border' />
22
+ </div>
21
23
  {{ else }}
22
- <img src='<%= image_path("noimage/small.png") %>' alt='{{product.name }}' class='thumbnail' />
24
+ <div class="admin-product-image-container small-img">
25
+ <%= inline_svg_tag "noimage/backend-missing-image.svg", class: "noimage", size: "60%*60%" %>
26
+ </div>
23
27
  {{/if}}
24
28
  </div>
25
29
  <div class="p-0 pt-1 text-center product-info">
@@ -204,7 +204,12 @@
204
204
  <%= f.label :taxon_ids, Spree.t(:taxons) %>
205
205
 
206
206
  <% if can? :modify, Spree::Classification %>
207
- <%= f.select :taxon_ids, options_from_collection_for_select(@product.taxons, :id, :pretty_name, @product.taxon_ids), { include_hidden: true }, multiple: true, class: 'select2-hidden-accessible' %>
207
+ <%= f.select :taxon_ids, options_from_collection_for_select(@product.taxons, :id, :pretty_name, @product.taxon_ids),
208
+ { include_hidden: true },
209
+ multiple: true,
210
+ data: { autocomplete_url_value: 'taxons_api_v2',
211
+ autocomplete_return_attr_value: 'pretty_name',
212
+ autocomplete_multiple_value: true } %>
208
213
  <% elsif @product.taxons.any? %>
209
214
  <ul class="text_list">
210
215
  <% @product.taxons.each do |taxon| %>
@@ -223,7 +228,13 @@
223
228
  <%= f.label :option_type_ids, Spree.t(:option_types) %>
224
229
 
225
230
  <% if can? :modify, Spree::ProductOptionType %>
226
- <%= f.select :option_type_ids, options_from_collection_for_select(@product.option_types, :id, :name, @product.option_type_ids), { include_hidden: true }, multiple: true, class: 'select2-hidden-accessible' %>
231
+ <%= f.select :option_type_ids, options_from_collection_for_select(@product.option_types, :id, :name, @product.option_type_ids),
232
+ { include_hidden: true },
233
+ multiple: true,
234
+ class: 'select2-hidden-accessible',
235
+ data: { autocomplete_url_value: 'option_types_api_v2',
236
+ autocomplete_return_attr_value: 'name',
237
+ autocomplete_multiple_value: true } %>
227
238
  <% elsif @product.option_types.any? %>
228
239
  <ul class="text_list">
229
240
  <% @product.option_types.each do |type| %>
@@ -68,7 +68,7 @@
68
68
  <tr <%== "style='color: red;'" if product.deleted? %> id="<%= spree_dom_id product %>" data-hook="admin_products_index_rows" class="<%= cycle('odd', 'even') %>">
69
69
  <td scope="row" class="image">
70
70
  <%= link_to edit_admin_product_path(product) do %>
71
- <%= mini_image product %>
71
+ <%= small_image product %>
72
72
  <% end %>
73
73
  </td>
74
74
  <td><%= link_to product.try(:name), edit_admin_product_path(product) %></td>
@@ -28,6 +28,16 @@
28
28
  </div>
29
29
  </div>
30
30
 
31
+ <div class="row">
32
+ <div class="col-12 col-lg-6">
33
+ <div class="form-group">
34
+ <%= label_tag :q_filterable_eq, Spree.t(:filterable_status) %>
35
+ <%= f.select :filterable_eq, options_for_select([[Spree.t(:filterable), true], [Spree.t(:non_filterable), false]]), { include_blank: true }, class: 'select2-clear js-filterable' %>
36
+ </div>
37
+ </div>
38
+ </div>
39
+ </div>
40
+
31
41
  <div class="form-actions" data-hook="admin_pproperties_index_search_buttons">
32
42
  <%= button Spree.t(:search), 'search.svg' %>
33
43
  </div>
@@ -37,7 +37,7 @@
37
37
 
38
38
  <div class="dropdown-divider m-0"></div>
39
39
 
40
- <%= link_to 'http://guides.spreecommerce.org/support', target: :blank, class: 'd-block text-dark py-3 px-4 dropdown-item' do %>
40
+ <%= link_to 'http://spreecommerce.org/contact', target: :blank, class: 'd-block text-dark py-3 px-4 dropdown-item' do %>
41
41
  <%= svg_icon name: "info.svg", width: '18', height: '18' %>
42
42
  &nbsp;
43
43
  <%= Spree.t(:support) %>
@@ -49,7 +49,7 @@
49
49
  <%= Spree.t(:join_slack) %>
50
50
  <% end %>
51
51
 
52
- <%= link_to 'https://guides.spreecommerce.org/extensions', target: :blank, class: 'd-block text-dark py-3 px-4 dropdown-item' do %>
52
+ <%= link_to 'https://dev-docs.spreecommerce.org/extensions/extensions', target: :blank, class: 'd-block text-dark py-3 px-4 dropdown-item' do %>
53
53
  <%= svg_icon name: "extensions.svg", width: '18', height: '18' %>
54
54
  &nbsp;
55
55
  <%= Spree.t(:extensions_directory) %>
@@ -1,14 +1,27 @@
1
1
  <%= f.field_container save_to, class: ['form-group'] do %>
2
2
  <%= f.label save_to, Spree.t('admin.cms.link_to_product') %>
3
- <%= f.select save_to,
4
- options_from_collection_for_select([resource],
5
- save_to, save_to, resource.send(save_to) || nil),
6
- { include_blank: true },
7
- class: 'select2autocomplete',
8
- data: { autocomplete_placeholder_value: Spree.t('admin.navigation.seach_for_a_product'),
9
- autocomplete_clear_value: true,
10
- autocomplete_url_value: 'products_api_v2',
11
- autocomplete_return_attr_value: 'name',
12
- autocomplete_custom_return_id_value: 'slug' } %>
3
+ <%= f.select save_to, options_from_collection_for_select([resource], save_to, save_to, resource.send(save_to) || nil), { include_blank: true },
4
+ id: "cms_section_#{save_to}",
5
+ data: { autocomplete_placeholder_value: Spree.t('admin.navigation.seach_for_a_product'),
6
+ autocomplete_clear_value: true,
7
+ autocomplete_url_value: 'products_api_v2',
8
+ autocomplete_return_attr_value: 'name',
9
+ autocomplete_custom_return_id_value: 'slug' } %>
10
+
13
11
  <%= f.error_message_on :save_to %>
14
12
  <% end %>
13
+
14
+ <% if resource.link_one.present? %>
15
+ <script>
16
+ populateSelectOptionsFromApi({
17
+ targetElement: "#cms_section_<%= save_to %>",
18
+ apiUrl: Spree.routes.products_api_v2 + "?filter[slug_matches]=<%= resource.send(save_to) %>",
19
+ returnValueFromAttributes: 'slug',
20
+ returnOptionText: 'name',
21
+
22
+ <% if resource.send(save_to) %>
23
+ selectedOption: "<%= resource.send(save_to) %>"
24
+ <% end %>
25
+ })
26
+ </script>
27
+ <% end %>
@@ -1,14 +1,27 @@
1
1
  <%= f.field_container save_to, class: ['form-group'] do %>
2
2
  <%= f.label save_to, Spree.t('admin.cms.link_to_taxon') %>
3
- <%= f.select save_to,
4
- options_from_collection_for_select([resource],
5
- save_to, save_to, resource.send(save_to) || nil),
6
- { include_blank: true },
7
- class: 'select2autocomplete',
8
- data: { autocomplete_placeholder_value: Spree.t('admin.navigation.seach_for_a_taxon'),
9
- autocomplete_clear_value: true,
10
- autocomplete_url_value: 'taxons_api_v2',
11
- autocomplete_return_attr_value: 'permalink',
12
- autocomplete_custom_return_id_value: 'permalink' } %>
3
+ <%= f.select save_to, options_from_collection_for_select([resource], save_to, save_to, resource.send(save_to) || nil), { include_blank: true },
4
+ id: "cms_section_#{save_to}",
5
+ data: { autocomplete_placeholder_value: Spree.t('admin.navigation.seach_for_a_taxon'),
6
+ autocomplete_clear_value: true,
7
+ autocomplete_url_value: 'taxons_api_v2',
8
+ autocomplete_return_attr_value: 'pretty_name',
9
+ autocomplete_custom_return_id_value: 'permalink' } %>
10
+
13
11
  <%= f.error_message_on :save_to %>
14
12
  <% end %>
13
+
14
+ <% if resource.link_one.present? %>
15
+ <script>
16
+ populateSelectOptionsFromApi({
17
+ targetElement: "#cms_section_<%= save_to %>",
18
+ apiUrl: Spree.routes.taxons_api_v2 + "?filter[permalink_matches]=<%= resource.send(save_to) %>",
19
+ returnValueFromAttributes: 'permalink',
20
+ returnOptionText: 'pretty_name',
21
+
22
+ <% if resource.send(save_to) %>
23
+ selectedOption: "<%= resource.send(save_to) %>"
24
+ <% end %>
25
+ })
26
+ </script>
27
+ <% end %>
@@ -16,12 +16,7 @@
16
16
  autocomplete_url_value: 'pages_api_v2',
17
17
  autocomplete_return_attr_value: 'title',
18
18
  autocomplete_search_query_value: 'title_i_cont',
19
-
20
- # Hard coded additional filter to filter out homepages from
21
- # the results. Homepages don't have a slug, and we already have
22
- # a dedicated Home Page link_to type.
23
- autocomplete_additional_query_value: 'type_not_eq',
24
- autocomplete_additional_term_value: 'Spree::Cms::Pages::Homepage' } %>
19
+ autocomplete_additional_url_params_value: 'filter[type_not_eq]=Spree::Cms::Pages::Homepage' } %>
25
20
 
26
21
  <%= f.error_message_on :linked_resource_id %>
27
22
  <small class="form-text text-muted"><%= resource.link %></small>
@@ -8,19 +8,31 @@
8
8
  <table class="table" id="user-lifetime-stats" data-hook>
9
9
  <tr>
10
10
  <td width="30%"><%= Spree.t(:total_sales) %>:</td>
11
- <td><%= @user.display_lifetime_value.to_html %></td>
11
+ <td>
12
+ <% @user.report_values_for(:lifetime_value, current_store).each do |value| %>
13
+ <div><%= value %></div>
14
+ <% end %>
15
+ </td>
12
16
  </tr>
13
17
  <tr>
14
18
  <td><%= Spree.t(:num_orders) %>:</td>
15
- <td><%= @user.order_count %></td>
19
+ <td><%= @user.order_count(current_store) %></td>
16
20
  </tr>
17
21
  <tr>
18
22
  <td><%= Spree.t(:average_order_value) %>:</td>
19
- <td><%= @user.display_average_order_value.to_html %></td>
23
+ <td>
24
+ <% @user.report_values_for(:average_order_value, current_store).each do |value| %>
25
+ <div><%= value %></div>
26
+ <% end %>
27
+ </td>
20
28
  </tr>
21
29
  <tr>
22
30
  <td><%= Spree.t('admin.user.store_credits') %>:</td>
23
- <td id="store_credit"><%= Spree::Money.new(@user.total_available_store_credit) %></td>
31
+ <td id="store_credit">
32
+ <% @user.available_store_credits(current_store).each do |value| %>
33
+ <div><%= value %></div>
34
+ <% end %>
35
+ </td>
24
36
  </tr>
25
37
  <tr>
26
38
  <td><%= Spree.t(:member_since) %>:</td>
@@ -27,7 +27,7 @@
27
27
  <tr class="stock-item" data-item-quantity="<%= item.quantity %>">
28
28
  <td class="order-completed-at"><%= order_time(order.completed_at) if order.completed_at %></td>
29
29
  <td class="item-image">
30
- <%= mini_image(item.variant) %>
30
+ <%= small_image(item.variant) %>
31
31
  </td>
32
32
  <td class="item-name">
33
33
  <%= item.name %>
@@ -2,9 +2,13 @@
2
2
  <div class='variant-autocomplete-item media align-items-center'>
3
3
  <figure class='variant-image media-left mb-0 mr-3'>
4
4
  {{#if variant.image }}
5
- <img src='{{variant.image}}' class="thumbnail mb-0" />
5
+ <div class="admin-product-image-container small-img">
6
+ <img src='{{variant.image}}' class="thumbnail mb-0" />
7
+ </div>
6
8
  {{ else }}
7
- <img src='<%= image_path("noimage/mini.png") %>' class="thumbnail mb-0" />
9
+ <div class="admin-product-image-container small-img">
10
+ <%= inline_svg_tag "noimage/backend-missing-image.svg", class: "noimage", size: "60%*60%" %>
11
+ </div>
8
12
  {{/if}}
9
13
  </figure>
10
14
 
@@ -15,7 +15,7 @@ Gem::Specification.new do |s|
15
15
  s.metadata = {
16
16
  "bug_tracker_uri" => "https://github.com/spree/spree/issues",
17
17
  "changelog_uri" => "https://github.com/spree/spree/releases/tag/v#{s.version}",
18
- "documentation_uri" => "https://guides.spreecommerce.org/",
18
+ "documentation_uri" => "https://dev-docs.spreecommerce.org/",
19
19
  "source_code_uri" => "https://github.com/spree/spree/tree/v#{s.version}",
20
20
  }
21
21
 
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: spree_backend
3
3
  version: !ruby/object:Gem::Version
4
- version: 4.3.0.rc1
4
+ version: 4.3.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Sean Schofield
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2021-08-11 00:00:00.000000000 Z
12
+ date: 2022-01-09 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: spree_api
@@ -17,28 +17,28 @@ dependencies:
17
17
  requirements:
18
18
  - - ">="
19
19
  - !ruby/object:Gem::Version
20
- version: 4.3.0.rc1
20
+ version: 4.3.1
21
21
  type: :runtime
22
22
  prerelease: false
23
23
  version_requirements: !ruby/object:Gem::Requirement
24
24
  requirements:
25
25
  - - ">="
26
26
  - !ruby/object:Gem::Version
27
- version: 4.3.0.rc1
27
+ version: 4.3.1
28
28
  - !ruby/object:Gem::Dependency
29
29
  name: spree_core
30
30
  requirement: !ruby/object:Gem::Requirement
31
31
  requirements:
32
32
  - - ">="
33
33
  - !ruby/object:Gem::Version
34
- version: 4.3.0.rc1
34
+ version: 4.3.1
35
35
  type: :runtime
36
36
  prerelease: false
37
37
  version_requirements: !ruby/object:Gem::Requirement
38
38
  requirements:
39
39
  - - ">="
40
40
  - !ruby/object:Gem::Version
41
- version: 4.3.0.rc1
41
+ version: 4.3.1
42
42
  - !ruby/object:Gem::Dependency
43
43
  name: babel-transpiler
44
44
  requirement: !ruby/object:Gem::Requirement
@@ -298,6 +298,7 @@ files:
298
298
  - app/assets/images/backend-void.svg
299
299
  - app/assets/images/backend-window-sidebar.svg
300
300
  - app/assets/images/credit_cards/credit_card.gif
301
+ - app/assets/images/noimage/backend-missing-image.svg
301
302
  - app/assets/images/noimage/large.png
302
303
  - app/assets/images/noimage/mini.png
303
304
  - app/assets/images/noimage/product.png
@@ -817,9 +818,9 @@ licenses:
817
818
  - BSD-3-Clause
818
819
  metadata:
819
820
  bug_tracker_uri: https://github.com/spree/spree/issues
820
- changelog_uri: https://github.com/spree/spree/releases/tag/v4.3.0.rc1
821
- documentation_uri: https://guides.spreecommerce.org/
822
- source_code_uri: https://github.com/spree/spree/tree/v4.3.0.rc1
821
+ changelog_uri: https://github.com/spree/spree/releases/tag/v4.3.1
822
+ documentation_uri: https://dev-docs.spreecommerce.org/
823
+ source_code_uri: https://github.com/spree/spree/tree/v4.3.1
823
824
  post_install_message:
824
825
  rdoc_options: []
825
826
  require_paths:
@@ -831,12 +832,12 @@ required_ruby_version: !ruby/object:Gem::Requirement
831
832
  version: '2.5'
832
833
  required_rubygems_version: !ruby/object:Gem::Requirement
833
834
  requirements:
834
- - - ">"
835
+ - - ">="
835
836
  - !ruby/object:Gem::Version
836
- version: 1.3.1
837
+ version: '0'
837
838
  requirements:
838
839
  - none
839
- rubygems_version: 3.2.3
840
+ rubygems_version: 3.2.22
840
841
  signing_key:
841
842
  specification_version: 4
842
843
  summary: Admin Dashboard for Spree eCommerce platform