@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.
Files changed (23) hide show
  1. package/assets/js/api/index.js +2 -2
  2. package/assets/js/models/product-layers.js +1 -1
  3. package/assets/scss/_common.scss +5 -0
  4. package/assets/scss/variables/_theme.scss +3 -0
  5. package/components/checkout/cart/cart.vue +13 -3
  6. package/components/checkout/order/address-form/address-form.scss +0 -16
  7. package/components/checkout/order/address-form/address-form.vue +96 -213
  8. package/components/checkout/order/order-billing-information/order-billing-information.vue +1 -1
  9. package/components/checkout/order/order-shipping-information/order-shipping-information.vue +1 -1
  10. package/components/common/coupon_select/coupon-select.vue +27 -23
  11. package/components/common/postcode_select/postcode-select.vue +4 -5
  12. package/components/common/products_list_dropdown/products-list-dropdown.vue +2 -2
  13. package/components/editor/editor_layers/editor-layers.vue +1 -1
  14. package/components/editor/editor_layers/editor_layers_layer/editor-layers-layer.vue +3 -3
  15. package/components/editor/editor_product_details/editor-product-details.vue +5 -2
  16. package/components/editor/editor_workspace/editor_workspace_side/editor-workspace-side.vue +4 -3
  17. package/components/modals/editor_layers_templates/editor-layers-templates.vue +6 -7
  18. package/components/products/product_list_product/product-list-product.scss +28 -0
  19. package/components/products/product_list_product/product-list-product.vue +17 -0
  20. package/layouts/products.vue +1 -1
  21. package/mixins/product-view.js +2 -2
  22. package/package.json +1 -1
  23. package/store/product.js +9 -0
@@ -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`);
@@ -64,7 +64,7 @@ export class TextLayer extends Layer {
64
64
 
65
65
  export class ArtLayer extends Layer {
66
66
  url = null;
67
- fileName = 'default';
67
+ fileName = '';
68
68
  editableDetails = true;
69
69
  scaleX = 1;
70
70
  scaleY = 1;
@@ -4,6 +4,11 @@ body {
4
4
  overflow-x: hidden;
5
5
  }
6
6
 
7
+ .multiselect__spinner {
8
+ z-index: 2 !important;
9
+ top: 6px !important;
10
+ }
11
+
7
12
  .content {
8
13
  width: 100%;
9
14
  margin-top: $navbar_height;
@@ -8,6 +8,9 @@ $mobile_notification_bar_height: 40px !default;
8
8
  // Scrollbar
9
9
  $scrollbar_width: 6px;
10
10
 
11
+ $orange: #e76d00 !default;
12
+ $orange_light: #ff9940 !default;
13
+
11
14
  // Colors
12
15
  $black_high_emphasis: #000000;
13
16
  $black_medium_emphasis: rgba(0, 0, 0, .66);
@@ -26,15 +26,15 @@
26
26
  <postcode-select
27
27
  :suburb="suburb"
28
28
  :labelless="true"
29
- placeholder="Postcode"
30
- label-text="Enter postcode to calculate shipping"
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="Enter coupon code" />
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 CustomerAddressForm__section">
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
- </div>
128
- <div class="CustomerAddressForm__section">
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
- :placeholder="postcodeLabel"
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
- <div
156
- @click="visibleFullAddress = !visibleFullAddress"
157
- class="CustomerAddressForm__toggle-address">
158
- {{ visibleFullAddress ? 'Find a Different Address' : 'Enter Address Manually' }}
159
- </div>
160
- <div v-if="visibleFullAddress">
161
- <validation-provider
162
- v-slot="{ errors }"
163
- tag="div"
164
- name="Address line 1"
165
- rules="required"
166
- class="form-row">
167
- <label
168
- for="addressLine1"
169
- class="form-label">
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
- class="form-row">
228
- <label
229
- for="additionalInfo"
230
- class="form-label">
231
- Additional Info
232
- </label>
233
- <input
234
- id="additionalInfo"
235
- ref="additionalInfo"
236
- v-model="address.additionalInfo"
237
- name="additionalInfo"
238
- placeholder="Additional Info"
239
- type="text"
240
- class="form-field labelless"
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', 'currency', 'MESSAGES']),
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, currency: this.currency });
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 '@lancom/shared/components/checkout/order/address-form/address-form';
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 '@lancom/shared/components/checkout/order/address-form/address-form';
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 form-row">
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
- <input
15
- id="coupon"
16
- ref="coupon"
17
- v-model="code"
18
- placeholder="Coupon"
19
- name="coupon"
20
- type="text"
21
- class="form-field labelless"
22
- :class="{
23
- 'is-danger': code && notValidCoupon,
24
- filled: code
25
- }"
26
- @keydown.enter="validateCoupon" />
27
- <span
28
- v-if="value"
29
- class="CouponSelect__clear"
30
- @click="clearCoupon()">remove coupon</span>
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 || this.labelText;
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 > 2) {
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 < 100:
110
+ case this.layer.dpi < 75:
111
111
  quality = 'too small';
112
112
  break;
113
- case this.layer.dpi >= 100 && this.layer.dpi < 150:
113
+ case this.layer.dpi >= 75 && this.layer.dpi < 100:
114
114
  quality = 'low quality';
115
115
  break;
116
- case this.layer.dpi >= 150:
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 class="lc_regular16 lc_grey1 ml-6">
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('click', this.onDocumentClick);
233
+ document.addEventListener('mousedown', this.onDocumentStartClick);
234
234
  window.addEventListener('resize', this.onResize);
235
235
  },
236
236
  clearEventsListeners() {
237
- document.removeEventListener('click', this.onDocumentClick);
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 { createNamespacedHelpers } from 'vuex';
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(['printArea', 'editableLayers'])
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">
@@ -334,7 +334,7 @@
334
334
  }
335
335
  }
336
336
  &__aside {
337
- width: 230px;
337
+ width: 215px;
338
338
  flex-grow: 1;
339
339
  flex-shrink: 0;
340
340
  @media (max-width: $bp-small-max) {
@@ -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
- if (IS_PRODUCT_PRESET_PRINT_PRICING) {
34
- const product = store.getters['product/product'];
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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lancom/shared",
3
- "version": "0.0.284",
3
+ "version": "0.0.286",
4
4
  "description": "lancom common scripts",
5
5
  "author": "e.tokovenko <e.tokovenko@gmail.com>",
6
6
  "repository": {
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));