@lancom/shared 0.0.284 → 0.0.286
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/assets/js/api/index.js +2 -2
- package/assets/js/models/product-layers.js +1 -1
- package/assets/scss/_common.scss +5 -0
- package/assets/scss/variables/_theme.scss +3 -0
- package/components/checkout/cart/cart.vue +13 -3
- package/components/checkout/order/address-form/address-form.scss +0 -16
- package/components/checkout/order/address-form/address-form.vue +96 -213
- package/components/checkout/order/order-billing-information/order-billing-information.vue +1 -1
- package/components/checkout/order/order-shipping-information/order-shipping-information.vue +1 -1
- package/components/common/coupon_select/coupon-select.vue +27 -23
- package/components/common/postcode_select/postcode-select.vue +4 -5
- package/components/common/products_list_dropdown/products-list-dropdown.vue +2 -2
- package/components/editor/editor_layers/editor-layers.vue +1 -1
- package/components/editor/editor_layers/editor_layers_layer/editor-layers-layer.vue +3 -3
- package/components/editor/editor_product_details/editor-product-details.vue +5 -2
- package/components/editor/editor_workspace/editor_workspace_side/editor-workspace-side.vue +4 -3
- package/components/modals/editor_layers_templates/editor-layers-templates.vue +6 -7
- package/components/products/product_list_product/product-list-product.scss +28 -0
- package/components/products/product_list_product/product-list-product.vue +17 -0
- package/layouts/products.vue +1 -1
- package/mixins/product-view.js +2 -2
- package/package.json +1 -1
- package/store/product.js +9 -0
package/assets/js/api/index.js
CHANGED
|
@@ -160,8 +160,8 @@ const api = {
|
|
|
160
160
|
fetchAddressInfo(id, shop) {
|
|
161
161
|
return _get(`shop/${shop || '-1'}/postcodes/address/${id}`);
|
|
162
162
|
},
|
|
163
|
-
fetchProductPrintTemplates() {
|
|
164
|
-
return _get('print-templates
|
|
163
|
+
fetchProductPrintTemplates(shop) {
|
|
164
|
+
return _get(`shop/${shop || '-1'}/print-templates`);
|
|
165
165
|
},
|
|
166
166
|
fetchPrintTypes(shop) {
|
|
167
167
|
return _get(`shop/${shop}/print-types`);
|
package/assets/scss/_common.scss
CHANGED
|
@@ -26,15 +26,15 @@
|
|
|
26
26
|
<postcode-select
|
|
27
27
|
:suburb="suburb"
|
|
28
28
|
:labelless="true"
|
|
29
|
-
placeholder="
|
|
30
|
-
label-text="
|
|
29
|
+
:placeholder="postcodeLabel"
|
|
30
|
+
:label-text="postcodeInfoLabel"
|
|
31
31
|
@select="handleSuburbChange" />
|
|
32
32
|
</div>
|
|
33
33
|
<div class="Cart__coupon-container">
|
|
34
34
|
<coupon-select
|
|
35
35
|
v-model="cartCoupon"
|
|
36
36
|
:pricing="cartPricingCalculating ? null : cartPricing"
|
|
37
|
-
label-text="
|
|
37
|
+
:label-text="couponLabel" />
|
|
38
38
|
</div>
|
|
39
39
|
<div class="Cart__quantity-errors">
|
|
40
40
|
<cart-quantity-errors />
|
|
@@ -91,7 +91,17 @@ export default {
|
|
|
91
91
|
filters: { price },
|
|
92
92
|
mixins: [CartMixin],
|
|
93
93
|
computed: {
|
|
94
|
+
...mapGetters(['MESSAGES']),
|
|
94
95
|
...mapGetters('cart', ['isEmpty', 'cartPricingError', 'cartPricing', 'cartPricingCalculating', 'entities']),
|
|
96
|
+
postcodeLabel() {
|
|
97
|
+
return this.MESSAGES.CART_POSTCODE || 'Postcode';
|
|
98
|
+
},
|
|
99
|
+
postcodeInfoLabel() {
|
|
100
|
+
return this.MESSAGES.CART_POSTCODE_INFO || 'Enter postcode to calculate shipping';
|
|
101
|
+
},
|
|
102
|
+
couponLabel() {
|
|
103
|
+
return (this.MESSAGES.CART_COUPON || 'Coupon code').trim();
|
|
104
|
+
},
|
|
95
105
|
cartCoupon: {
|
|
96
106
|
get() {
|
|
97
107
|
return this.coupon;
|
|
@@ -14,20 +14,4 @@
|
|
|
14
14
|
}
|
|
15
15
|
}
|
|
16
16
|
}
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
.CustomerAddressForm {
|
|
20
|
-
&__toggle-address {
|
|
21
|
-
margin-bottom: 10px;
|
|
22
|
-
cursor: pointer;
|
|
23
|
-
display: inline-block;
|
|
24
|
-
color: $green;
|
|
25
|
-
border-bottom: 1px dashed $green;
|
|
26
|
-
}
|
|
27
|
-
&__section {
|
|
28
|
-
padding: 15px;
|
|
29
|
-
border: 1px solid #d7d7d7;
|
|
30
|
-
margin-bottom: 10px;
|
|
31
|
-
border-radius: 4px;
|
|
32
|
-
}
|
|
33
17
|
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
<template>
|
|
2
2
|
<div class="CustomerAddressForm__wrapper">
|
|
3
|
-
<div class="CustomerAddressForm__form
|
|
3
|
+
<div class="CustomerAddressForm__form">
|
|
4
4
|
<div class="form-row--cols">
|
|
5
5
|
<validation-provider
|
|
6
6
|
v-slot="{ errors }"
|
|
@@ -124,16 +124,74 @@
|
|
|
124
124
|
</span>
|
|
125
125
|
</validation-provider>
|
|
126
126
|
</div>
|
|
127
|
-
|
|
128
|
-
|
|
127
|
+
<validation-provider
|
|
128
|
+
v-slot="{ errors }"
|
|
129
|
+
tag="div"
|
|
130
|
+
name="Address line 1"
|
|
131
|
+
rules="required"
|
|
132
|
+
class="form-row">
|
|
133
|
+
<label
|
|
134
|
+
for="addressLine1"
|
|
135
|
+
class="form-label">
|
|
136
|
+
Address line 1
|
|
137
|
+
</label>
|
|
138
|
+
<input
|
|
139
|
+
id="addressLine1"
|
|
140
|
+
ref="addressLine1"
|
|
141
|
+
v-model="address.addressLine1"
|
|
142
|
+
name="addressLine1"
|
|
143
|
+
type="text"
|
|
144
|
+
class="form-field labelless"
|
|
145
|
+
placeholder="Address line 1"
|
|
146
|
+
:class="{
|
|
147
|
+
'is-danger': errors.length,
|
|
148
|
+
filled: address.addressLine1
|
|
149
|
+
}"
|
|
150
|
+
@input="validateAddress"
|
|
151
|
+
@keyup.enter="$refs.addressLine1.focus()" />
|
|
152
|
+
<span
|
|
153
|
+
v-if="errors.length"
|
|
154
|
+
class="form-help is-danger">
|
|
155
|
+
{{ errors[0] }}
|
|
156
|
+
</span>
|
|
157
|
+
</validation-provider>
|
|
158
|
+
<validation-provider
|
|
159
|
+
v-slot="{ errors }"
|
|
160
|
+
tag="div"
|
|
161
|
+
name="Address line 2"
|
|
162
|
+
class="form-row">
|
|
163
|
+
<label
|
|
164
|
+
for="addressLine2"
|
|
165
|
+
class="form-label">
|
|
166
|
+
Address line 2
|
|
167
|
+
</label>
|
|
168
|
+
<input
|
|
169
|
+
id="addressLine2"
|
|
170
|
+
ref="addressLine2"
|
|
171
|
+
v-model="address.addressLine2"
|
|
172
|
+
name="addressLine2"
|
|
173
|
+
type="text"
|
|
174
|
+
class="form-field labelless"
|
|
175
|
+
placeholder="Address line 2"
|
|
176
|
+
:class="{
|
|
177
|
+
'is-danger': errors.length,
|
|
178
|
+
filled: address.addressLine2
|
|
179
|
+
}"
|
|
180
|
+
@input="validateAddress"
|
|
181
|
+
@keyup.enter="$refs.addressLine2.focus()" />
|
|
182
|
+
<span
|
|
183
|
+
v-if="errors.length"
|
|
184
|
+
class="form-help is-danger">
|
|
185
|
+
{{ errors[0] }}
|
|
186
|
+
</span>
|
|
187
|
+
</validation-provider>
|
|
129
188
|
<div class="form-row--cols">
|
|
130
189
|
<postcode-select
|
|
131
|
-
v-if="!visibleFullAddress"
|
|
132
190
|
class="form-col col-half"
|
|
133
191
|
:suburb="suburb"
|
|
134
192
|
:labelless="true"
|
|
135
193
|
:required="true"
|
|
136
|
-
|
|
194
|
+
placeholder="Suburb"
|
|
137
195
|
@select="handleSuburbChange">
|
|
138
196
|
</postcode-select>
|
|
139
197
|
<div class="form-col col-half">
|
|
@@ -152,190 +210,36 @@
|
|
|
152
210
|
disabled />
|
|
153
211
|
</div>
|
|
154
212
|
</div>
|
|
155
|
-
<
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
<
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
Address line 1
|
|
171
|
-
</label>
|
|
172
|
-
<input
|
|
173
|
-
id="addressLine1"
|
|
174
|
-
ref="addressLine1"
|
|
175
|
-
v-model="address.addressLine1"
|
|
176
|
-
name="addressLine1"
|
|
177
|
-
type="text"
|
|
178
|
-
class="form-field labelless"
|
|
179
|
-
placeholder="Address line 1"
|
|
180
|
-
:class="{
|
|
181
|
-
'is-danger': errors.length,
|
|
182
|
-
filled: address.addressLine1
|
|
183
|
-
}"
|
|
184
|
-
@input="validateAddress"
|
|
185
|
-
@keyup.enter="$refs.addressLine1.focus()" />
|
|
186
|
-
<span
|
|
187
|
-
v-if="errors.length"
|
|
188
|
-
class="form-help is-danger">
|
|
189
|
-
{{ errors[0] }}
|
|
190
|
-
</span>
|
|
191
|
-
</validation-provider>
|
|
192
|
-
<validation-provider
|
|
193
|
-
v-slot="{ errors }"
|
|
194
|
-
tag="div"
|
|
195
|
-
name="Address line 2"
|
|
196
|
-
class="form-row">
|
|
197
|
-
<label
|
|
198
|
-
for="addressLine2"
|
|
199
|
-
class="form-label">
|
|
200
|
-
Address line 2
|
|
201
|
-
</label>
|
|
202
|
-
<input
|
|
203
|
-
id="addressLine2"
|
|
204
|
-
ref="addressLine2"
|
|
205
|
-
v-model="address.addressLine2"
|
|
206
|
-
name="addressLine2"
|
|
207
|
-
type="text"
|
|
208
|
-
class="form-field labelless"
|
|
209
|
-
placeholder="Address line 2"
|
|
210
|
-
:class="{
|
|
211
|
-
'is-danger': errors.length,
|
|
212
|
-
filled: address.addressLine2
|
|
213
|
-
}"
|
|
214
|
-
@input="validateAddress"
|
|
215
|
-
@keyup.enter="$refs.addressLine2.focus()" />
|
|
216
|
-
<span
|
|
217
|
-
v-if="errors.length"
|
|
218
|
-
class="form-help is-danger">
|
|
219
|
-
{{ errors[0] }}
|
|
220
|
-
</span>
|
|
221
|
-
</validation-provider>
|
|
222
|
-
<validation-provider
|
|
223
|
-
v-if="!withoutAdditionalInfo"
|
|
224
|
-
v-slot="{ errors }"
|
|
225
|
-
tag="div"
|
|
213
|
+
<validation-provider
|
|
214
|
+
v-if="!withoutAdditionalInfo"
|
|
215
|
+
v-slot="{ errors }"
|
|
216
|
+
tag="div"
|
|
217
|
+
name="additionalInfo"
|
|
218
|
+
class="form-row">
|
|
219
|
+
<label
|
|
220
|
+
for="additionalInfo"
|
|
221
|
+
class="form-label">
|
|
222
|
+
Additional Info
|
|
223
|
+
</label>
|
|
224
|
+
<input
|
|
225
|
+
id="additionalInfo"
|
|
226
|
+
ref="additionalInfo"
|
|
227
|
+
v-model="address.additionalInfo"
|
|
226
228
|
name="additionalInfo"
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
:class="{
|
|
242
|
-
'is-danger': errors.length,
|
|
243
|
-
filled: address.additionalInfo
|
|
244
|
-
}"
|
|
245
|
-
@keyup.enter="$refs.additionalInfo.focus()" />
|
|
246
|
-
<span
|
|
247
|
-
v-if="errors.length"
|
|
248
|
-
class="form-help is-danger">
|
|
249
|
-
{{ errors[0] }}
|
|
250
|
-
</span>
|
|
251
|
-
</validation-provider>
|
|
252
|
-
<div class="form-row--cols">
|
|
253
|
-
<validation-provider
|
|
254
|
-
v-slot="{ errors }"
|
|
255
|
-
tag="div"
|
|
256
|
-
name="postcode"
|
|
257
|
-
class="form-col">
|
|
258
|
-
<label
|
|
259
|
-
for="postcode"
|
|
260
|
-
class="form-label">
|
|
261
|
-
Postcode
|
|
262
|
-
</label>
|
|
263
|
-
<input
|
|
264
|
-
id="postcode"
|
|
265
|
-
ref="postcode"
|
|
266
|
-
v-model="address.postcode"
|
|
267
|
-
name="postcode"
|
|
268
|
-
placeholder="Postcode"
|
|
269
|
-
type="text"
|
|
270
|
-
class="form-field labelless"
|
|
271
|
-
:class="{
|
|
272
|
-
'is-danger': errors.length,
|
|
273
|
-
filled: address.postcode
|
|
274
|
-
}" />
|
|
275
|
-
<span
|
|
276
|
-
v-if="errors.length"
|
|
277
|
-
class="form-help is-danger">
|
|
278
|
-
{{ errors[0] }}
|
|
279
|
-
</span>
|
|
280
|
-
</validation-provider>
|
|
281
|
-
<validation-provider
|
|
282
|
-
v-slot="{ errors }"
|
|
283
|
-
tag="div"
|
|
284
|
-
:name="localityLabel"
|
|
285
|
-
class="form-col">
|
|
286
|
-
<label
|
|
287
|
-
for="locality"
|
|
288
|
-
class="form-label">
|
|
289
|
-
{{ localityLabel }}
|
|
290
|
-
</label>
|
|
291
|
-
<input
|
|
292
|
-
id="locality"
|
|
293
|
-
ref="locality"
|
|
294
|
-
v-model="address.city"
|
|
295
|
-
name="locality"
|
|
296
|
-
:placeholder="localityLabel"
|
|
297
|
-
type="text"
|
|
298
|
-
class="form-field labelless"
|
|
299
|
-
:class="{
|
|
300
|
-
'is-danger': errors.length,
|
|
301
|
-
filled: address.city
|
|
302
|
-
}" />
|
|
303
|
-
<span
|
|
304
|
-
v-if="errors.length"
|
|
305
|
-
class="form-help is-danger">
|
|
306
|
-
{{ errors[0] }}
|
|
307
|
-
</span>
|
|
308
|
-
</validation-provider>
|
|
309
|
-
<validation-provider
|
|
310
|
-
v-slot="{ errors }"
|
|
311
|
-
tag="div"
|
|
312
|
-
:name="stateLabel"
|
|
313
|
-
class="form-col">
|
|
314
|
-
<label
|
|
315
|
-
for="state"
|
|
316
|
-
class="form-label">
|
|
317
|
-
{{ stateLabel }}
|
|
318
|
-
</label>
|
|
319
|
-
<input
|
|
320
|
-
id="state"
|
|
321
|
-
ref="state"
|
|
322
|
-
v-model="address.state"
|
|
323
|
-
name="state"
|
|
324
|
-
:placeholder="stateLabel"
|
|
325
|
-
type="text"
|
|
326
|
-
class="form-field labelless"
|
|
327
|
-
:class="{
|
|
328
|
-
'is-danger': errors.length,
|
|
329
|
-
filled: address.state
|
|
330
|
-
}" />
|
|
331
|
-
<span
|
|
332
|
-
v-if="errors.length"
|
|
333
|
-
class="form-help is-danger">
|
|
334
|
-
{{ errors[0] }}
|
|
335
|
-
</span>
|
|
336
|
-
</validation-provider>
|
|
337
|
-
</div>
|
|
338
|
-
</div>
|
|
229
|
+
placeholder="Additional Info"
|
|
230
|
+
type="text"
|
|
231
|
+
class="form-field labelless"
|
|
232
|
+
:class="{
|
|
233
|
+
'is-danger': errors.length,
|
|
234
|
+
filled: address.additionalInfo
|
|
235
|
+
}"
|
|
236
|
+
@keyup.enter="$refs.additionalInfo.focus()" />
|
|
237
|
+
<span
|
|
238
|
+
v-if="errors.length"
|
|
239
|
+
class="form-help is-danger">
|
|
240
|
+
{{ errors[0] }}
|
|
241
|
+
</span>
|
|
242
|
+
</validation-provider>
|
|
339
243
|
</div>
|
|
340
244
|
</div>
|
|
341
245
|
</template>
|
|
@@ -349,11 +253,6 @@ export default {
|
|
|
349
253
|
components: {
|
|
350
254
|
PostcodeSelect
|
|
351
255
|
},
|
|
352
|
-
data() {
|
|
353
|
-
return {
|
|
354
|
-
visibleFullAddress: false
|
|
355
|
-
};
|
|
356
|
-
},
|
|
357
256
|
props: {
|
|
358
257
|
address: {
|
|
359
258
|
type: Object,
|
|
@@ -365,22 +264,13 @@ export default {
|
|
|
365
264
|
}
|
|
366
265
|
},
|
|
367
266
|
computed: {
|
|
368
|
-
...mapGetters(['shop', 'country'
|
|
267
|
+
...mapGetters(['shop', 'country']),
|
|
369
268
|
...mapGetters('cart', [
|
|
370
269
|
'suburb'
|
|
371
270
|
]),
|
|
372
271
|
...mapGetters('auth', [
|
|
373
272
|
'user'
|
|
374
|
-
])
|
|
375
|
-
postcodeLabel() {
|
|
376
|
-
return this.MESSAGES?.POSTCODES_LABEL || 'Suburb';
|
|
377
|
-
},
|
|
378
|
-
localityLabel() {
|
|
379
|
-
return this.MESSAGES?.LOCALITY || 'Locality';
|
|
380
|
-
},
|
|
381
|
-
stateLabel() {
|
|
382
|
-
return this.MESSAGES?.STATE || 'State';
|
|
383
|
-
}
|
|
273
|
+
])
|
|
384
274
|
},
|
|
385
275
|
created() {
|
|
386
276
|
if (!this.address.suburb && !this.suburb && this.user?.suburb) {
|
|
@@ -407,19 +297,12 @@ export default {
|
|
|
407
297
|
this.$set(this.address, 'postcode', suburb.postcode);
|
|
408
298
|
this.$set(this.address, 'city', suburb.locality);
|
|
409
299
|
this.$set(this.address, 'country', suburb.country);
|
|
410
|
-
if (suburb.addressLine1) {
|
|
411
|
-
this.$set(this.address, 'addressLine1', suburb.addressLine1);
|
|
412
|
-
}
|
|
413
|
-
if (suburb.addressLine2) {
|
|
414
|
-
this.$set(this.address, 'addressLine2', suburb.addressLine2);
|
|
415
|
-
}
|
|
416
300
|
}
|
|
417
301
|
},
|
|
418
302
|
handleSuburbChange(suburb) {
|
|
419
|
-
this.visibleFullAddress = true;
|
|
420
303
|
this.setAddressSuburb(suburb);
|
|
421
304
|
this.setSuburb(suburb);
|
|
422
|
-
this.calculateCartPrice({ shop: this.shop, country: this.country
|
|
305
|
+
this.calculateCartPrice({ shop: this.shop, country: this.country });
|
|
423
306
|
}
|
|
424
307
|
}
|
|
425
308
|
};
|
|
@@ -427,4 +310,4 @@ export default {
|
|
|
427
310
|
|
|
428
311
|
<style lang="scss" scoped>
|
|
429
312
|
@import 'address-form.scss';
|
|
430
|
-
</style>
|
|
313
|
+
</style>
|
|
@@ -29,7 +29,7 @@ import gtm from '@lancom/shared/assets/js/utils/gtm';
|
|
|
29
29
|
import { generateOrderData } from '@lancom/shared/assets/js/utils/order';
|
|
30
30
|
import CartQuantityErrors from '@lancom/shared/components/checkout/cart/cart_quantity_errors/cart-quantity-errors';
|
|
31
31
|
import CartMixin from '@lancom/shared/components/checkout/cart/cart.mixin';
|
|
32
|
-
import AddressForm from '
|
|
32
|
+
import AddressForm from '@/components/checkout/order/address-form/address-form';
|
|
33
33
|
import ProgressStepsControls from '@lancom/shared/components/common/progress_steps/progress_steps_controls/progress-steps-controls';
|
|
34
34
|
|
|
35
35
|
export default {
|
|
@@ -19,7 +19,7 @@
|
|
|
19
19
|
|
|
20
20
|
<script>
|
|
21
21
|
import { mapMutations } from 'vuex';
|
|
22
|
-
import AddressForm from '
|
|
22
|
+
import AddressForm from '@/components/checkout/order/address-form/address-form';
|
|
23
23
|
import ProgressStepsControls from '@lancom/shared/components/common/progress_steps/progress_steps_controls/progress-steps-controls';
|
|
24
24
|
|
|
25
25
|
export default {
|
|
@@ -1,33 +1,37 @@
|
|
|
1
1
|
<template>
|
|
2
|
-
<div class="CouponSelect__wrapper
|
|
2
|
+
<div class="CouponSelect__wrapper">
|
|
3
3
|
<validation-provider
|
|
4
4
|
tag="div"
|
|
5
5
|
name="coupon"
|
|
6
6
|
class="form-col col-half">
|
|
7
|
-
<label
|
|
8
|
-
for="coupon"
|
|
9
|
-
class="form-label">
|
|
10
|
-
{{ labelText }}
|
|
11
|
-
</label>
|
|
12
7
|
<div class="row">
|
|
13
8
|
<div class="col-7">
|
|
14
|
-
<
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
9
|
+
<div class="form-row">
|
|
10
|
+
<input
|
|
11
|
+
id="coupon"
|
|
12
|
+
ref="coupon"
|
|
13
|
+
v-model="code"
|
|
14
|
+
placeholder="Coupon"
|
|
15
|
+
name="coupon"
|
|
16
|
+
type="text"
|
|
17
|
+
class="form-field"
|
|
18
|
+
:class="{
|
|
19
|
+
'is-danger': code && notValidCoupon,
|
|
20
|
+
filled: code
|
|
21
|
+
}"
|
|
22
|
+
@keydown.enter="validateCoupon" />
|
|
23
|
+
<label
|
|
24
|
+
v-if="labelText"
|
|
25
|
+
for="coupon"
|
|
26
|
+
class="form-label label-inner"
|
|
27
|
+
style="color: #999 !important;">
|
|
28
|
+
{{ labelText }}
|
|
29
|
+
</label>
|
|
30
|
+
<span
|
|
31
|
+
v-if="value"
|
|
32
|
+
class="CouponSelect__clear"
|
|
33
|
+
@click="clearCoupon()">remove coupon</span>
|
|
34
|
+
</div>
|
|
31
35
|
</div>
|
|
32
36
|
<div class="col-5">
|
|
33
37
|
<btn
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
<template>
|
|
2
|
-
<div class="PostcodeSelect">
|
|
2
|
+
<div class="PostcodeSelect form-row">
|
|
3
3
|
<validation-provider
|
|
4
4
|
v-slot="{ errors }"
|
|
5
5
|
tag="div"
|
|
@@ -96,8 +96,7 @@ export default {
|
|
|
96
96
|
type: String
|
|
97
97
|
},
|
|
98
98
|
labelText: {
|
|
99
|
-
type: String
|
|
100
|
-
default: 'Suburb'
|
|
99
|
+
type: String
|
|
101
100
|
},
|
|
102
101
|
placeholder: {
|
|
103
102
|
type: String,
|
|
@@ -131,7 +130,7 @@ export default {
|
|
|
131
130
|
computed: {
|
|
132
131
|
...mapGetters(['shop', 'MESSAGES']),
|
|
133
132
|
displayLabelText() {
|
|
134
|
-
return this.MESSAGES.POSTCODES_LABEL ||
|
|
133
|
+
return this.labelText || this.MESSAGES.POSTCODES_LABEL || 'Suburb';
|
|
135
134
|
},
|
|
136
135
|
model: {
|
|
137
136
|
get() {
|
|
@@ -151,7 +150,7 @@ export default {
|
|
|
151
150
|
},
|
|
152
151
|
methods: {
|
|
153
152
|
async handleSearch(query) {
|
|
154
|
-
if (query.trim().length >
|
|
153
|
+
if (query.trim().length > 1) {
|
|
155
154
|
this.isLoading = true;
|
|
156
155
|
const country = this.codeCountry || this.country;
|
|
157
156
|
const countryName = country ? (country.isoCode === 'GB' ? 'England' : (country.name || country)) : 'Australia';
|
|
@@ -48,7 +48,7 @@ export default {
|
|
|
48
48
|
};
|
|
49
49
|
},
|
|
50
50
|
computed: {
|
|
51
|
-
...mapGetters(['shop'])
|
|
51
|
+
...mapGetters(['shop', 'country'])
|
|
52
52
|
},
|
|
53
53
|
methods: {
|
|
54
54
|
select(product) {
|
|
@@ -58,7 +58,7 @@ export default {
|
|
|
58
58
|
async loadProducts(text) {
|
|
59
59
|
try {
|
|
60
60
|
this.loading = true;
|
|
61
|
-
this.products = (await api.fetchProducts(this.shop._id, { text })).products;
|
|
61
|
+
this.products = (await api.fetchProducts(this.shop._id, { text, country: this.country?._id })).products;
|
|
62
62
|
} catch (e) {
|
|
63
63
|
} finally {
|
|
64
64
|
this.loading = false;
|
|
@@ -121,7 +121,7 @@ export default {
|
|
|
121
121
|
const printAreas = getAllPrintAreas(this.product);
|
|
122
122
|
const groups = new Map();
|
|
123
123
|
this.editableLayers.forEach(layer => {
|
|
124
|
-
const printArea = printAreas.find(pa => pa._id === layer.printArea);
|
|
124
|
+
const printArea = printAreas.find(pa => pa._id === layer.printArea) || { _id: null, name: 'Layers'};
|
|
125
125
|
if (printArea) {
|
|
126
126
|
const defaultGroup = { layers: [], printArea };
|
|
127
127
|
const group = groups.get(printArea._id) || defaultGroup;
|
|
@@ -107,13 +107,13 @@ export default {
|
|
|
107
107
|
}
|
|
108
108
|
let quality;
|
|
109
109
|
switch (true) {
|
|
110
|
-
case this.layer.dpi <
|
|
110
|
+
case this.layer.dpi < 75:
|
|
111
111
|
quality = 'too small';
|
|
112
112
|
break;
|
|
113
|
-
case this.layer.dpi >=
|
|
113
|
+
case this.layer.dpi >= 75 && this.layer.dpi < 100:
|
|
114
114
|
quality = 'low quality';
|
|
115
115
|
break;
|
|
116
|
-
case this.layer.dpi >=
|
|
116
|
+
case this.layer.dpi >= 100:
|
|
117
117
|
quality = 'good quality';
|
|
118
118
|
break;
|
|
119
119
|
}
|
|
@@ -29,7 +29,9 @@
|
|
|
29
29
|
</template>
|
|
30
30
|
</v-popover>
|
|
31
31
|
</span>
|
|
32
|
-
<span
|
|
32
|
+
<span
|
|
33
|
+
v-if="isPrintPricing"
|
|
34
|
+
class="lc_regular16 lc_grey1 ml-6">
|
|
33
35
|
+
|
|
34
36
|
<v-popover
|
|
35
37
|
ref="popover"
|
|
@@ -108,7 +110,8 @@ export default {
|
|
|
108
110
|
'product',
|
|
109
111
|
'productDetailsLoaded',
|
|
110
112
|
'defaultSimpleProduct',
|
|
111
|
-
'selectedPrintType'
|
|
113
|
+
'selectedPrintType',
|
|
114
|
+
'isPrintPricing'
|
|
112
115
|
]),
|
|
113
116
|
...mapGetters('layers', [
|
|
114
117
|
'layerThumbnails'
|
|
@@ -122,7 +122,7 @@ export default {
|
|
|
122
122
|
'editModeSelectedLayer'
|
|
123
123
|
]),
|
|
124
124
|
printAreaLayers() {
|
|
125
|
-
return this.editableLayers.filter(l => l.printArea === this.printArea._id);
|
|
125
|
+
return this.editableLayers.filter(l => !this.printArea || l.printArea === this.printArea._id);
|
|
126
126
|
},
|
|
127
127
|
deleteButtonPosition() {
|
|
128
128
|
return this.deleteButtonPos ? {
|
|
@@ -230,15 +230,16 @@ export default {
|
|
|
230
230
|
this.fabricHelper.scaleWorkspace({ width: size, height: size });
|
|
231
231
|
},
|
|
232
232
|
initEventsListeners() {
|
|
233
|
-
document.addEventListener('
|
|
233
|
+
document.addEventListener('mousedown', this.onDocumentStartClick);
|
|
234
234
|
window.addEventListener('resize', this.onResize);
|
|
235
235
|
},
|
|
236
236
|
clearEventsListeners() {
|
|
237
|
-
document.removeEventListener('
|
|
237
|
+
document.removeEventListener('mousedown', this.onDocumentStartClick);
|
|
238
238
|
window.removeEventListener('resize', this.onResize);
|
|
239
239
|
},
|
|
240
240
|
onDocumentClick({ target }) {
|
|
241
241
|
// todo: replace by click outside plugin?
|
|
242
|
+
console.log('target: ', target);
|
|
242
243
|
const isCanvasElement = target.tagName === 'CANVAS';
|
|
243
244
|
const isIgnoreClick = !!findParentByPredicate(target, element => element.hasAttribute('ignore-document-click'));
|
|
244
245
|
if (!isCanvasElement && !isIgnoreClick) {
|
|
@@ -28,11 +28,9 @@
|
|
|
28
28
|
</template>
|
|
29
29
|
|
|
30
30
|
<script>
|
|
31
|
-
import {
|
|
31
|
+
import { mapMutations, mapActions, mapGetters } from 'vuex';
|
|
32
32
|
import api from '@lancom/shared/assets/js/api';
|
|
33
33
|
|
|
34
|
-
const { mapMutations, mapActions, mapGetters } = createNamespacedHelpers('product');
|
|
35
|
-
|
|
36
34
|
export default {
|
|
37
35
|
name: 'EditorLayersTemplates',
|
|
38
36
|
data() {
|
|
@@ -42,16 +40,17 @@ export default {
|
|
|
42
40
|
};
|
|
43
41
|
},
|
|
44
42
|
computed: {
|
|
45
|
-
...mapGetters(['
|
|
43
|
+
...mapGetters(['shop']),
|
|
44
|
+
...mapGetters('product', ['printArea', 'editableLayers'])
|
|
46
45
|
},
|
|
47
46
|
async mounted() {
|
|
48
47
|
this.loading = true;
|
|
49
|
-
this.layerTemplates = await api.fetchProductPrintTemplates();
|
|
48
|
+
this.layerTemplates = await api.fetchProductPrintTemplates(this.shop._id);
|
|
50
49
|
this.loading = false;
|
|
51
50
|
},
|
|
52
51
|
methods: {
|
|
53
|
-
...mapActions(['createLayer']),
|
|
54
|
-
...mapMutations(['updateTemplateLayer', 'setSelectedLayer']),
|
|
52
|
+
...mapActions('product', ['createLayer']),
|
|
53
|
+
...mapMutations('product', ['updateTemplateLayer', 'setSelectedLayer']),
|
|
55
54
|
async applyLayerTemplate(template) {
|
|
56
55
|
this.loading = true;
|
|
57
56
|
const printArea = this.printArea;
|
|
@@ -14,6 +14,34 @@
|
|
|
14
14
|
}
|
|
15
15
|
}
|
|
16
16
|
}
|
|
17
|
+
&__tag {
|
|
18
|
+
position: absolute;
|
|
19
|
+
top: 14px;
|
|
20
|
+
right: 14px;
|
|
21
|
+
display: flex;
|
|
22
|
+
flex-direction: column;
|
|
23
|
+
align-items: flex-end;
|
|
24
|
+
z-index: 3;
|
|
25
|
+
&-icon {
|
|
26
|
+
margin-bottom: 4px;
|
|
27
|
+
font-size: 12px;
|
|
28
|
+
color: $orange
|
|
29
|
+
}
|
|
30
|
+
&-item {
|
|
31
|
+
margin-bottom: 2px;
|
|
32
|
+
span {
|
|
33
|
+
display: inline-block;
|
|
34
|
+
padding: 4px 5px;
|
|
35
|
+
background: $orange_light;
|
|
36
|
+
font-weight: 800;
|
|
37
|
+
font-size: 10px;
|
|
38
|
+
line-height: 14px;
|
|
39
|
+
letter-spacing: -0.02em;
|
|
40
|
+
text-transform: uppercase;
|
|
41
|
+
color: $black;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
}
|
|
17
45
|
&__colors {
|
|
18
46
|
display: flex;
|
|
19
47
|
flex-wrap: wrap;
|
|
@@ -38,6 +38,23 @@
|
|
|
38
38
|
<!-- <div class="ProductListProduct__gender">
|
|
39
39
|
<span>{{ product.gender }}</span>
|
|
40
40
|
</div> -->
|
|
41
|
+
<div
|
|
42
|
+
v-if="hasTags"
|
|
43
|
+
class="ProductListProduct__tag">
|
|
44
|
+
<div
|
|
45
|
+
v-for="tag in tags"
|
|
46
|
+
:key="`${tag._id}-${product._id}`"
|
|
47
|
+
class="ProductListProduct__tag-item">
|
|
48
|
+
<span
|
|
49
|
+
:style="{
|
|
50
|
+
'background-color': tag.backgroundColor,
|
|
51
|
+
'color': tag.textColor,
|
|
52
|
+
'font-size': tag.fontSize
|
|
53
|
+
}">
|
|
54
|
+
{{ tag.name }}
|
|
55
|
+
</span>
|
|
56
|
+
</div>
|
|
57
|
+
</div>
|
|
41
58
|
</a>
|
|
42
59
|
<div class="ProductListProduct__info">
|
|
43
60
|
<div class="ProductListProduct__info-item">
|
package/layouts/products.vue
CHANGED
package/mixins/product-view.js
CHANGED
|
@@ -30,8 +30,8 @@ export default (IS_PRODUCT_PRESET_PRINT_PRICING) => ({
|
|
|
30
30
|
await store.dispatch('product/fetchProduct', data);
|
|
31
31
|
await store.dispatch('product/fetchProductDetails', data);
|
|
32
32
|
|
|
33
|
-
|
|
34
|
-
|
|
33
|
+
const product = store.getters['product/product'];
|
|
34
|
+
if (IS_PRODUCT_PRESET_PRINT_PRICING && product.printOnly) {
|
|
35
35
|
const printType = product.printTypes[0];
|
|
36
36
|
store.commit('product/setSelectedPrintType', printType);
|
|
37
37
|
store.commit('product/setIsPrintPricing', true);
|
package/package.json
CHANGED
package/store/product.js
CHANGED
|
@@ -363,6 +363,11 @@ export const mutations = {
|
|
|
363
363
|
layer
|
|
364
364
|
];
|
|
365
365
|
Vue.set(state.template, 'layers', layers);
|
|
366
|
+
if (layers.length === 1 && !state.product.printOnly) {
|
|
367
|
+
const printType = state.product.printTypes[0];
|
|
368
|
+
state.selectedPrintType = printType;
|
|
369
|
+
state.isPrintPricing = true;
|
|
370
|
+
}
|
|
366
371
|
},
|
|
367
372
|
removeTemplateLayer(state, layer) {
|
|
368
373
|
const index = state.template.layers.findIndex(({ createdAt }) => createdAt === layer.createdAt);
|
|
@@ -370,6 +375,10 @@ export const mutations = {
|
|
|
370
375
|
if (state.selectedLayer && state.selectedLayer.createdAt === layer.createdAt) {
|
|
371
376
|
state.selectedLayer = null;
|
|
372
377
|
}
|
|
378
|
+
if (state.template.layers.length === 0 && !state.product.printOnly) {
|
|
379
|
+
state.selectedPrintType = null;
|
|
380
|
+
state.isPrintPricing = false;
|
|
381
|
+
}
|
|
373
382
|
},
|
|
374
383
|
updateTemplateLayer(state, layer) {
|
|
375
384
|
const index = state.template.layers.findIndex(({ createdAt, _id }) => createdAt === layer.createdAt || (_id && _id === layer._id));
|