@lancom/shared 0.0.442 → 0.0.444
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/components/checkout/cart/cart.mixin.js +3 -0
- package/components/checkout/cart/cart.scss +10 -1
- package/components/checkout/cart/cart.vue +26 -5
- package/components/checkout/cart/cart_entity/cart-entity.mixin.js +4 -0
- package/components/checkout/cart/cart_entity/cart-entity.scss +5 -1
- package/components/checkout/cart/cart_entity/cart-entity.vue +8 -1
- package/components/checkout/cart/cart_shipping/cart-shipping.vue +3 -0
- package/components/common/number_input/number-input.vue +5 -5
- package/components/order/order_view/order-view.mixin.js +2 -2
- package/components/product/editor_pricing/editor-pricing.scss +7 -0
- package/components/product/editor_pricing/editor-pricing.vue +25 -2
- package/components/product/layouts/product_colors_selector/product_colors_selector_options/product-colors-selector-options.vue +2 -3
- package/components/product/product_check_delivery/product-check-delivery.vue +31 -8
- package/components/product/products_size_selector_color/product_size_selector_color/product-size-selector-color.vue +2 -2
- package/components/products/children_categories/children-categories.scss +7 -1
- package/components/products/children_categories/children-categories.vue +12 -9
- package/components/products/products_autocomplete/products-autocomplete.scss +2 -5
- package/components/products/products_autocomplete/products_autocomplete-item/products-autocomplete-item.scss +57 -2
- package/components/products/products_autocomplete/products_autocomplete-item/products-autocomplete-item.vue +13 -3
- package/feeds/google-shopping.js +8 -3
- package/mixins/layouts/products.js +0 -1
- package/package.json +1 -1
- package/plugins/save-state.js +1 -1
|
@@ -49,6 +49,9 @@ export default {
|
|
|
49
49
|
},
|
|
50
50
|
isNotValidPrintsBigSizeQuantity() {
|
|
51
51
|
return this.simpleProductsQuantity ? ((this.bigSizeSimpleProductsQuantity / this.simpleProductsQuantity * 100) > 50) : false;
|
|
52
|
+
},
|
|
53
|
+
hasClearanceProduct() {
|
|
54
|
+
return this.entities.some(entity => entity.product?.isClearance || entity.simpleProducts?.some(sp => sp.pricing?.some(p => p?.clearance)));
|
|
52
55
|
}
|
|
53
56
|
},
|
|
54
57
|
watch: {
|
|
@@ -18,8 +18,17 @@
|
|
|
18
18
|
color: $error;
|
|
19
19
|
font-size: 13px;
|
|
20
20
|
}
|
|
21
|
+
&__clearance-checkbox {
|
|
22
|
+
padding-bottom: 10px;
|
|
23
|
+
}
|
|
24
|
+
&__clearance-text {
|
|
25
|
+
font-size: 14px;
|
|
26
|
+
font-weight: 500;
|
|
27
|
+
line-height: 20px;
|
|
28
|
+
margin-left: 10px;
|
|
29
|
+
}
|
|
21
30
|
// &__total-info {
|
|
22
31
|
// position: sticky;
|
|
23
32
|
// top: 130px;
|
|
24
33
|
// }
|
|
25
|
-
}
|
|
34
|
+
}
|
|
@@ -41,9 +41,20 @@
|
|
|
41
41
|
<div class="Cart__quantity-errors">
|
|
42
42
|
<cart-quantity-errors />
|
|
43
43
|
</div>
|
|
44
|
-
|
|
44
|
+
|
|
45
|
+
<div
|
|
46
|
+
v-if="hasClearanceProduct"
|
|
47
|
+
class="Cart__clearance-checkbox mt-10">
|
|
48
|
+
<checkbox v-model="clearanceAccepted">
|
|
49
|
+
<span class="Cart__clearance-text">Confirm clearance products are non-returnable.</span>
|
|
50
|
+
</checkbox>
|
|
51
|
+
</div>
|
|
52
|
+
|
|
53
|
+
<div
|
|
54
|
+
v-tooltip="isNotValidShipping ? 'To proceed, enter your postcode to calculate shipping' : ''"
|
|
55
|
+
class="mt-10">
|
|
45
56
|
<btn
|
|
46
|
-
:btn-disabled="
|
|
57
|
+
:btn-disabled="isCheckoutDisabled"
|
|
47
58
|
:btn-block="true"
|
|
48
59
|
:to="'/checkout/order'"
|
|
49
60
|
btn-class="green"
|
|
@@ -82,6 +93,7 @@ import { price } from '@lancom/shared/assets/js/utils/filters';
|
|
|
82
93
|
import CartMixin from '@lancom/shared/components/checkout/cart/cart.mixin';
|
|
83
94
|
import CartPriceInfo from '@lancom/shared/components/checkout/cart/cart_price_info/cart-price-info';
|
|
84
95
|
import CartShipping from '@lancom/shared/components/checkout/cart/cart_shipping/cart-shipping';
|
|
96
|
+
import Checkbox from '@lancom/shared/components/common/checkbox';
|
|
85
97
|
|
|
86
98
|
export default {
|
|
87
99
|
name: 'CheckoutCart',
|
|
@@ -91,15 +103,21 @@ export default {
|
|
|
91
103
|
CartPriceInfo,
|
|
92
104
|
CartQuantityErrors,
|
|
93
105
|
CouponSelect,
|
|
94
|
-
CartShipping
|
|
106
|
+
CartShipping,
|
|
107
|
+
Checkbox
|
|
95
108
|
},
|
|
96
109
|
filters: { price },
|
|
97
110
|
mixins: [CartMixin],
|
|
111
|
+
data() {
|
|
112
|
+
return {
|
|
113
|
+
clearanceAccepted: false
|
|
114
|
+
};
|
|
115
|
+
},
|
|
98
116
|
computed: {
|
|
99
117
|
...mapGetters(['MESSAGES', 'SETTINGS', 'currency', 'country']),
|
|
100
|
-
...mapGetters('cart', ['isEmpty','cartPricingError', 'cartPricing', 'cartPricingCalculating', 'entities', 'entitiesWithoutFreeProducts']),
|
|
118
|
+
...mapGetters('cart', ['isEmpty', 'cartPricingError', 'cartPricing', 'cartPricingCalculating', 'entities', 'entitiesWithoutFreeProducts']),
|
|
101
119
|
productsEntities() {
|
|
102
|
-
return this.entitiesWithoutFreeProducts.filter(e => !e.productsKit)
|
|
120
|
+
return this.entitiesWithoutFreeProducts.filter(e => !e.productsKit);
|
|
103
121
|
},
|
|
104
122
|
productsKitsEntities() {
|
|
105
123
|
const entities = this.entitiesWithoutFreeProducts.filter(e => !!e.productsKit);
|
|
@@ -126,6 +144,9 @@ export default {
|
|
|
126
144
|
this.setCoupon(coupon);
|
|
127
145
|
this.calculateCartPrice({ shop: this.shop, country: this.country, currency: this.currency });
|
|
128
146
|
}
|
|
147
|
+
},
|
|
148
|
+
isCheckoutDisabled() {
|
|
149
|
+
return this.isNotValidShipping || this.isNotValidQuantity || this.cartPricingError || this.cartPricingCalculating || (this.hasClearanceProduct && !this.clearanceAccepted);
|
|
129
150
|
}
|
|
130
151
|
},
|
|
131
152
|
methods: {
|
|
@@ -54,6 +54,10 @@ export default {
|
|
|
54
54
|
const { totalPriceWithoutTax = 0 } = this.cartEntityPricing;
|
|
55
55
|
return totalPriceWithoutTax;
|
|
56
56
|
},
|
|
57
|
+
totalPriceWithTax() {
|
|
58
|
+
const { totalPrice = 0 } = this.cartEntityPricing;
|
|
59
|
+
return totalPrice;
|
|
60
|
+
},
|
|
57
61
|
printsTotalPrice() {
|
|
58
62
|
const { prints = {} } = this.cartEntityPricing;
|
|
59
63
|
return prints.totalPriceWithoutTax || 0;
|
|
@@ -57,6 +57,10 @@
|
|
|
57
57
|
text-align: right;
|
|
58
58
|
margin-top: 24px;
|
|
59
59
|
}
|
|
60
|
+
&__subtotal2 {
|
|
61
|
+
text-align: right;
|
|
62
|
+
margin-top: 5px;
|
|
63
|
+
}
|
|
60
64
|
&__item {
|
|
61
65
|
border-bottom: 1px solid #F4F4F4;
|
|
62
66
|
&:first-child {
|
|
@@ -71,4 +75,4 @@
|
|
|
71
75
|
padding: 16px;
|
|
72
76
|
margin-top: 16px;
|
|
73
77
|
}
|
|
74
|
-
}
|
|
78
|
+
}
|
|
@@ -83,6 +83,9 @@
|
|
|
83
83
|
<div class="CartEntity__subtotal lc_title">
|
|
84
84
|
Subtotal: {{ totalPrice | price(currency) }}
|
|
85
85
|
</div>
|
|
86
|
+
<div class="CartEntity__subtotal2 lc_title">
|
|
87
|
+
Subtotal inc. {{ taxName }}: {{ totalPriceWithTax | price(currency) }}
|
|
88
|
+
</div>
|
|
86
89
|
<i
|
|
87
90
|
v-if="editable"
|
|
88
91
|
class="icon-delete CartEntity__remove"
|
|
@@ -92,6 +95,7 @@
|
|
|
92
95
|
</template>
|
|
93
96
|
|
|
94
97
|
<script>
|
|
98
|
+
import { mapGetters } from 'vuex';
|
|
95
99
|
import { price } from '@lancom/shared/assets/js/utils/filters';
|
|
96
100
|
import CartEntityPrints from './cart_entity_prints/cart-entity-prints';
|
|
97
101
|
import CartCouponFreeProducts from './cart_coupon_free_products/cart-coupon-free-products';
|
|
@@ -110,7 +114,10 @@ export default {
|
|
|
110
114
|
},
|
|
111
115
|
mixins: [
|
|
112
116
|
CartEntity
|
|
113
|
-
]
|
|
117
|
+
],
|
|
118
|
+
computed: {
|
|
119
|
+
...mapGetters(['taxName'])
|
|
120
|
+
}
|
|
114
121
|
};
|
|
115
122
|
</script>
|
|
116
123
|
|
|
@@ -129,6 +129,9 @@ export default {
|
|
|
129
129
|
if (this.wantsToPickup && this.hasNotValidProductsPickup) {
|
|
130
130
|
this.visiblePickupError = true;
|
|
131
131
|
}
|
|
132
|
+
if (!this.suburb && this.SETTINGS.DEFAULT_POSTCODE) {
|
|
133
|
+
this.setSuburb({ postcode: this.SETTINGS.DEFAULT_POSTCODE });
|
|
134
|
+
}
|
|
132
135
|
},
|
|
133
136
|
methods: {
|
|
134
137
|
...mapActions([
|
|
@@ -39,11 +39,6 @@ import { generateGUID } from '@lancom/shared/assets/js/utils/guid';
|
|
|
39
39
|
|
|
40
40
|
export default {
|
|
41
41
|
name: 'NumberInput',
|
|
42
|
-
data() {
|
|
43
|
-
return {
|
|
44
|
-
uniqueCode: generateGUID()
|
|
45
|
-
};
|
|
46
|
-
},
|
|
47
42
|
props: {
|
|
48
43
|
id: {
|
|
49
44
|
type: String
|
|
@@ -77,6 +72,11 @@ export default {
|
|
|
77
72
|
default: false
|
|
78
73
|
}
|
|
79
74
|
},
|
|
75
|
+
data() {
|
|
76
|
+
return {
|
|
77
|
+
uniqueCode: generateGUID()
|
|
78
|
+
};
|
|
79
|
+
},
|
|
80
80
|
computed: {
|
|
81
81
|
model: {
|
|
82
82
|
get() {
|
|
@@ -67,7 +67,7 @@ export default {
|
|
|
67
67
|
},
|
|
68
68
|
additionalInfo() {
|
|
69
69
|
return this.displayAddress.additionalInfo;
|
|
70
|
-
},
|
|
70
|
+
},
|
|
71
71
|
purchaseOrderNumber() {
|
|
72
72
|
return this.invoice?.purchaseOrderNumber || this.order.purchaseOrderNumber;
|
|
73
73
|
},
|
|
@@ -98,7 +98,7 @@ export default {
|
|
|
98
98
|
return tax(this.model.total, this.gstTax) - this.model.total;
|
|
99
99
|
},
|
|
100
100
|
taxName() {
|
|
101
|
-
return this.settings?.pricing?.taxName || 'GST'
|
|
101
|
+
return this.settings?.pricing?.taxName || 'GST';
|
|
102
102
|
},
|
|
103
103
|
paymentCard() {
|
|
104
104
|
if (this.model.charge?.card) {
|
|
@@ -69,7 +69,16 @@
|
|
|
69
69
|
{{ hasPrintIssues ? 'Proceed with order, Will be in touch regarding print issue' : 'All good to go!' }}
|
|
70
70
|
</div>
|
|
71
71
|
</div>
|
|
72
|
-
|
|
72
|
+
<div
|
|
73
|
+
v-if="product.isClearance"
|
|
74
|
+
class="EditorPricing__clearance-message">
|
|
75
|
+
Product is non-returnable clearance product
|
|
76
|
+
</div>
|
|
77
|
+
<div
|
|
78
|
+
v-if="clearanceColorsWithQty.length"
|
|
79
|
+
class="EditorPricing__clearance-message">
|
|
80
|
+
{{ clearanceColorsWithQty.length > 1 ? 'Colours' : 'Colour' }}: {{ clearanceColorsText }} {{ clearanceColorsWithQty.length > 1 ? 'are' : 'is' }} non-returnable clearance {{ clearanceColorsWithQty.length > 1 ? 'colours' : 'colour' }}
|
|
81
|
+
</div>
|
|
73
82
|
<div
|
|
74
83
|
v-if="hasPricing"
|
|
75
84
|
class="EditorPricing__footer">
|
|
@@ -162,7 +171,8 @@ export default {
|
|
|
162
171
|
'multipack',
|
|
163
172
|
'offsetWarningVisible',
|
|
164
173
|
'showRecommendationToUseLargerImage',
|
|
165
|
-
'showErrorAboutSmallImage'
|
|
174
|
+
'showErrorAboutSmallImage',
|
|
175
|
+
'availableColors'
|
|
166
176
|
]),
|
|
167
177
|
hasPrintIssues() {
|
|
168
178
|
return this.offsetWarningVisible || this.showRecommendationToUseLargerImage || this.showErrorAboutSmallImage;
|
|
@@ -173,6 +183,19 @@ export default {
|
|
|
173
183
|
totalPrice() {
|
|
174
184
|
const { totalPriceWithoutTax, totalPrice } = this.productPricing;
|
|
175
185
|
return this.priceIncludeGST ? totalPrice : totalPriceWithoutTax;
|
|
186
|
+
},
|
|
187
|
+
clearanceColors() {
|
|
188
|
+
return this.availableColors?.filter(color => this.product.colorsPricing?.some(c => c.colors?.includes(color._id) && c.clearance)) || [];
|
|
189
|
+
},
|
|
190
|
+
clearanceColorsWithQty() {
|
|
191
|
+
console.log('clearanceColors: ', this.clearanceColors);
|
|
192
|
+
return this.clearanceColors.map(color => {
|
|
193
|
+
const qty = this.usedSimpleProducts.reduce((sum, sp) => sp.color._id === color._id ? sum + (sp.amount || 0) : sum, 0);
|
|
194
|
+
return qty > 0 ? { ...color, qty } : null;
|
|
195
|
+
}).filter(c => c);
|
|
196
|
+
},
|
|
197
|
+
clearanceColorsText() {
|
|
198
|
+
return this.clearanceColorsWithQty.map(c => `${c.name}`).join(', ');
|
|
176
199
|
}
|
|
177
200
|
},
|
|
178
201
|
watch: {
|
|
@@ -3,13 +3,12 @@
|
|
|
3
3
|
<div
|
|
4
4
|
v-for="color in availableColors"
|
|
5
5
|
:key="color._id"
|
|
6
|
-
v-tooltip="color.name"
|
|
6
|
+
v-tooltip="(product.isClearance || isClearanceColor(color)) ? `${color.name}. Clearance - non returnable` : color.name"
|
|
7
7
|
class="ProductColorsSelectorOptions__color"
|
|
8
8
|
:class="{ selected: editableColor === color }"
|
|
9
9
|
@click="toggleSelection(color)">
|
|
10
10
|
<i
|
|
11
|
-
v-if="isClearanceColor(color)"
|
|
12
|
-
v-tooltip="'Clearance'"
|
|
11
|
+
v-if="product.isClearance || isClearanceColor(color)"
|
|
13
12
|
class="icon-percent"></i>
|
|
14
13
|
<product-color-image
|
|
15
14
|
:color="color"
|
|
@@ -16,7 +16,7 @@
|
|
|
16
16
|
<postcode-select
|
|
17
17
|
v-model="suburb.postcode"
|
|
18
18
|
:suburb="suburb"
|
|
19
|
-
:only-postcode="
|
|
19
|
+
:only-postcode="false"
|
|
20
20
|
label-text="Postcode"
|
|
21
21
|
@select="onSelectSuburb" />
|
|
22
22
|
</div>
|
|
@@ -94,10 +94,14 @@ export default {
|
|
|
94
94
|
return totalPriceWithoutTax;
|
|
95
95
|
}
|
|
96
96
|
},
|
|
97
|
+
props: {
|
|
98
|
+
value: {
|
|
99
|
+
type: Object
|
|
100
|
+
}
|
|
101
|
+
},
|
|
97
102
|
data() {
|
|
98
|
-
const postcode = 'SW1A 1AA';
|
|
99
103
|
return {
|
|
100
|
-
suburb:
|
|
104
|
+
suburb: null,
|
|
101
105
|
pricing: null,
|
|
102
106
|
calculating: false,
|
|
103
107
|
recalcNeeded: false,
|
|
@@ -105,10 +109,10 @@ export default {
|
|
|
105
109
|
};
|
|
106
110
|
},
|
|
107
111
|
computed: {
|
|
108
|
-
...mapGetters(['shop', 'country', 'currency']),
|
|
112
|
+
...mapGetters(['shop', 'country', 'currency', 'SETTINGS']),
|
|
109
113
|
...mapGetters('product', ['product', 'usedSimpleProducts', 'template']),
|
|
110
114
|
hasSelection() {
|
|
111
|
-
return (this.usedSimpleProducts || []).length > 0;
|
|
115
|
+
return (this.usedSimpleProducts || []).length > 0 || this.value;
|
|
112
116
|
},
|
|
113
117
|
hasSuppliersWithRates() {
|
|
114
118
|
return this.suppliersWithRates.length > 0;
|
|
@@ -128,13 +132,21 @@ export default {
|
|
|
128
132
|
this.calculateShipping();
|
|
129
133
|
}
|
|
130
134
|
}
|
|
135
|
+
this.$emit('input', null);
|
|
131
136
|
},
|
|
132
137
|
deep: true
|
|
138
|
+
},
|
|
139
|
+
value() {
|
|
140
|
+
if (this.pricing) {
|
|
141
|
+
this.recalcNeeded = true;
|
|
142
|
+
} else {
|
|
143
|
+
this.calculateShipping();
|
|
144
|
+
}
|
|
133
145
|
}
|
|
134
146
|
},
|
|
135
|
-
|
|
136
|
-
if (this.
|
|
137
|
-
this.
|
|
147
|
+
created() {
|
|
148
|
+
if (this.SETTINGS.DEFAULT_POSTCODE) {
|
|
149
|
+
this.suburb = { postcode: this.SETTINGS.DEFAULT_POSTCODE };
|
|
138
150
|
}
|
|
139
151
|
},
|
|
140
152
|
methods: {
|
|
@@ -154,6 +166,17 @@ export default {
|
|
|
154
166
|
this.calculating = true;
|
|
155
167
|
this.recalcNeeded = false;
|
|
156
168
|
try {
|
|
169
|
+
let usedSimpleProducts = this.usedSimpleProducts;
|
|
170
|
+
if (this.value) {
|
|
171
|
+
if (this.value?.color) {
|
|
172
|
+
usedSimpleProducts = usedSimpleProducts.filter(c => c.color._id === this.value?.color?._id);
|
|
173
|
+
}
|
|
174
|
+
if (this.value?.size) {
|
|
175
|
+
usedSimpleProducts = usedSimpleProducts.filter(c => c.size._id === this.value?.size?._id);
|
|
176
|
+
}
|
|
177
|
+
const simpleProduct = usedSimpleProducts[0] || this.usedSimpleProducts[0];
|
|
178
|
+
usedSimpleProducts = simpleProduct ? [simpleProduct] : [];
|
|
179
|
+
}
|
|
157
180
|
const entities = getProductsForCalculatePricing(this.product, this.usedSimpleProducts);
|
|
158
181
|
const payload = {
|
|
159
182
|
entities: entities.map(e => ({ ...e, brand: this.product.brand })),
|
|
@@ -169,10 +169,10 @@ export default {
|
|
|
169
169
|
const amount = this.usedSimpleProductsQuantity;
|
|
170
170
|
const pricing = this.pricing;
|
|
171
171
|
const price = (pricing.find(({ min, max }) => (!min || min <= amount) && (!max || max >= amount)) || pricing[0] || {}).price || 0;
|
|
172
|
-
return this.withGst ? tax(price, this.gstTax) : price;
|
|
172
|
+
return +(this.withGst ? tax(price, this.gstTax) : price);
|
|
173
173
|
},
|
|
174
174
|
productPrintsPrice() {
|
|
175
|
-
return this.withGst ? tax(this.printsPrice, this.gstTax) : this.printsPrice;
|
|
175
|
+
return +(this.withGst ? tax(this.printsPrice, this.gstTax) : this.printsPrice);
|
|
176
176
|
},
|
|
177
177
|
disabled() {
|
|
178
178
|
return !this.product.quantityStock || !this.productPrice;
|
|
@@ -56,7 +56,13 @@
|
|
|
56
56
|
font-weight: 600;
|
|
57
57
|
color: $grey_1;
|
|
58
58
|
text-align: center;
|
|
59
|
-
|
|
59
|
+
}
|
|
60
|
+
&--selected {
|
|
61
|
+
color: white !important;
|
|
62
|
+
background-color: $green !important;
|
|
63
|
+
.CategoryCard__name {
|
|
64
|
+
color: white !important;
|
|
65
|
+
}
|
|
60
66
|
}
|
|
61
67
|
|
|
62
68
|
@media (max-width: $bp-extra-small-max) {
|
|
@@ -1,23 +1,26 @@
|
|
|
1
1
|
<template>
|
|
2
2
|
<div class="ChildrenCategories__wrapper">
|
|
3
3
|
<div
|
|
4
|
-
v-for="
|
|
5
|
-
:key="
|
|
6
|
-
class="CategoryCard"
|
|
4
|
+
v-for="cat in childrenCategories"
|
|
5
|
+
:key="cat._id"
|
|
6
|
+
class="CategoryCard"
|
|
7
|
+
:class="{
|
|
8
|
+
'CategoryCard--selected': category && category._id === cat._id
|
|
9
|
+
}">
|
|
7
10
|
<a
|
|
8
|
-
:href="generateProductsLink($route, { category }, true)"
|
|
11
|
+
:href="generateProductsLink($route, { category: cat }, true)"
|
|
9
12
|
class="CategoryCard__link">
|
|
10
13
|
<span
|
|
11
14
|
v-if="visibleImages"
|
|
12
15
|
class="CategoryCard__image-wrapper">
|
|
13
16
|
<img
|
|
14
|
-
v-if="
|
|
15
|
-
:src="
|
|
16
|
-
:alt="
|
|
17
|
+
v-if="cat.image"
|
|
18
|
+
:src="cat.image.medium"
|
|
19
|
+
:alt="cat.name"
|
|
17
20
|
class="CategoryCard__image" />
|
|
18
21
|
</span>
|
|
19
22
|
<span class="CategoryCard__name">
|
|
20
|
-
{{
|
|
23
|
+
{{ cat.name }}
|
|
21
24
|
</span>
|
|
22
25
|
</a>
|
|
23
26
|
</div>
|
|
@@ -37,7 +40,7 @@ export default {
|
|
|
37
40
|
}
|
|
38
41
|
},
|
|
39
42
|
computed: {
|
|
40
|
-
...mapGetters('products', ['childrenCategories'])
|
|
43
|
+
...mapGetters('products', ['childrenCategories', 'category'])
|
|
41
44
|
},
|
|
42
45
|
methods: {
|
|
43
46
|
generateProductsLink
|
|
@@ -21,16 +21,13 @@
|
|
|
21
21
|
&:last-child {
|
|
22
22
|
border-bottom: none;
|
|
23
23
|
margin-bottom: 0px;
|
|
24
|
+
padding-bottom: 0px;
|
|
24
25
|
}
|
|
25
26
|
::v-deep {
|
|
26
27
|
a {
|
|
27
28
|
color: $gray_main;
|
|
28
|
-
font-size: 13px;
|
|
29
29
|
text-decoration: none;
|
|
30
30
|
}
|
|
31
|
-
a:hover {
|
|
32
|
-
font-weight: bold;
|
|
33
|
-
}
|
|
34
31
|
}
|
|
35
32
|
&-all {
|
|
36
33
|
border-top: 1px solid $gray_main;
|
|
@@ -70,4 +67,4 @@
|
|
|
70
67
|
}
|
|
71
68
|
}
|
|
72
69
|
}
|
|
73
|
-
}
|
|
70
|
+
}
|
|
@@ -1,3 +1,58 @@
|
|
|
1
|
-
|
|
1
|
+
@import "@/assets/scss/variables";
|
|
2
|
+
|
|
3
|
+
.ProductsAutocompleteItem {
|
|
4
|
+
&__wrapper {
|
|
2
5
|
display: block;
|
|
3
|
-
}
|
|
6
|
+
}
|
|
7
|
+
&__link {
|
|
8
|
+
display: flex;
|
|
9
|
+
align-items: center;
|
|
10
|
+
gap: 12px;
|
|
11
|
+
text-decoration: none;
|
|
12
|
+
color: $gray_main;
|
|
13
|
+
&:hover {
|
|
14
|
+
.ProductsAutocompleteItem__name {
|
|
15
|
+
font-weight: 600;
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
&__image {
|
|
20
|
+
flex-shrink: 0;
|
|
21
|
+
width: 50px;
|
|
22
|
+
height: 50px;
|
|
23
|
+
display: flex;
|
|
24
|
+
align-items: center;
|
|
25
|
+
justify-content: center;
|
|
26
|
+
background-color: $white;
|
|
27
|
+
border: 1px solid $medium_gray;
|
|
28
|
+
border-radius: 4px;
|
|
29
|
+
overflow: hidden;
|
|
30
|
+
img {
|
|
31
|
+
max-width: 100%;
|
|
32
|
+
max-height: 100%;
|
|
33
|
+
object-fit: contain;
|
|
34
|
+
display: block;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
&__info {
|
|
38
|
+
flex: 1;
|
|
39
|
+
min-width: 0;
|
|
40
|
+
display: flex;
|
|
41
|
+
flex-direction: column;
|
|
42
|
+
gap: 4px;
|
|
43
|
+
}
|
|
44
|
+
&__sku {
|
|
45
|
+
font-size: 11px;
|
|
46
|
+
color: $grey_1;
|
|
47
|
+
font-weight: 500;
|
|
48
|
+
text-transform: uppercase;
|
|
49
|
+
margin-top: 3px;
|
|
50
|
+
}
|
|
51
|
+
&__name {
|
|
52
|
+
font-size: 17px;
|
|
53
|
+
color: $gray_main;
|
|
54
|
+
overflow: hidden;
|
|
55
|
+
text-overflow: ellipsis;
|
|
56
|
+
white-space: nowrap;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
@@ -1,9 +1,19 @@
|
|
|
1
1
|
<template>
|
|
2
|
-
<div @click="$emit('select', product)">
|
|
2
|
+
<div class="ProductsAutocompleteItem__wrapper" @click="$emit('select', product)">
|
|
3
3
|
<a
|
|
4
4
|
:href="productLink"
|
|
5
|
-
class="
|
|
6
|
-
|
|
5
|
+
class="ProductsAutocompleteItem__link">
|
|
6
|
+
<div
|
|
7
|
+
v-if="productСover"
|
|
8
|
+
class="ProductsAutocompleteItem__image">
|
|
9
|
+
<img
|
|
10
|
+
:src="productСover"
|
|
11
|
+
:alt="product.name" />
|
|
12
|
+
</div>
|
|
13
|
+
<div class="ProductsAutocompleteItem__info">
|
|
14
|
+
<div class="ProductsAutocompleteItem__name">{{ product.name }}</div>
|
|
15
|
+
<div class="ProductsAutocompleteItem__sku">{{ product.SKU }}</div>
|
|
16
|
+
</div>
|
|
7
17
|
</a>
|
|
8
18
|
</div>
|
|
9
19
|
</template>
|
package/feeds/google-shopping.js
CHANGED
|
@@ -102,10 +102,14 @@ async function googleShoppingFeed(axios, config, availableStores, country, isEdi
|
|
|
102
102
|
info['g:gtin'] = { _text: sp.gtin || '' };
|
|
103
103
|
}
|
|
104
104
|
|
|
105
|
-
|
|
105
|
+
const isClearance = sp.clearancePrice > 0 || product.isClearance;
|
|
106
|
+
|
|
107
|
+
if (isClearance && sp.clearancePrice !== sp.price) {
|
|
106
108
|
info['g:sale_price'] = { _text: `${(sp.clearancePrice)} ${sp.currencyCode || 'AUD'}` };
|
|
107
109
|
}
|
|
108
110
|
|
|
111
|
+
info['g:return_policy_label'] = { _text: isClearance ? 'clearance' : '' };
|
|
112
|
+
|
|
109
113
|
if (!config.IGNORE_STORE_CODE) {
|
|
110
114
|
if (sp.storeCode) {
|
|
111
115
|
info['g:store_code'] = { _text: sp.storeCode };
|
|
@@ -179,8 +183,9 @@ async function googleShoppingFeed(axios, config, availableStores, country, isEdi
|
|
|
179
183
|
}
|
|
180
184
|
}
|
|
181
185
|
|
|
182
|
-
|
|
183
|
-
|
|
186
|
+
const feedLifestyleImage = product.feedLifestyleImage || filterImagesByType('model')[0];
|
|
187
|
+
if (feedLifestyleImage) {
|
|
188
|
+
info['g:lifestyle_image_link'] = { _text: staticLink(feedLifestyleImage, config) };
|
|
184
189
|
}
|
|
185
190
|
|
|
186
191
|
if (product.feedAgeGroup) {
|
package/package.json
CHANGED
package/plugins/save-state.js
CHANGED