@lancom/shared 0.0.105 → 0.0.108

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 (123) hide show
  1. package/assets/js/models/print-area.js +17 -13
  2. package/assets/js/models/product-layers.js +6 -5
  3. package/assets/js/utils/cart.js +1 -0
  4. package/assets/js/utils/custom-validation-rules.js +7 -0
  5. package/assets/js/utils/fabric/wireframe.js +4 -4
  6. package/assets/js/utils/fabric-helper.js +7 -7
  7. package/assets/js/utils/filters.js +7 -1
  8. package/assets/js/utils/order.js +3 -3
  9. package/assets/js/utils/prints.js +15 -4
  10. package/assets/js/utils/product.js +7 -6
  11. package/assets/js/utils/products-grouping/by-colors.js +22 -18
  12. package/assets/scss/ui_kit/_table.scss +3 -0
  13. package/assets/scss/ui_kit/_typography.scss +6 -0
  14. package/components/asides/contact_us/contact-us.vue +3 -0
  15. package/components/asides/offer_screen_printing/offer-screen-printing.vue +22 -12
  16. package/components/checkout/cart/cart_entity/cart_entity_color_simple_products/cart-entity-color-simple-products.mixin.js +5 -3
  17. package/components/checkout/cart/cart_entity/cart_entity_prints/cart-entity-prints.vue +3 -0
  18. package/components/checkout/payment/payment-cart/payment-cart.scss +2 -2
  19. package/components/common/btn.vue +8 -1
  20. package/components/common/color-picker.vue +6 -1
  21. package/components/common/coupon_select/coupon-select.vue +41 -17
  22. package/components/common/file_uploader.vue +1 -1
  23. package/components/common/postcode_select/postcode-select.vue +6 -4
  24. package/components/common/pricing_discounts_table/pricing-discounts-table.vue +14 -5
  25. package/components/common/pricing_table/pricing-table.scss +1 -3
  26. package/components/common/pricing_table/pricing-table.vue +13 -4
  27. package/components/common/product_side_with_print/product-side-with-print.vue +2 -2
  28. package/components/common/products_list_dropdown/products-list-dropdown.vue +3 -1
  29. package/components/common/range/range.scss +23 -0
  30. package/components/common/range/range.vue +19 -0
  31. package/components/customer/signin_form/signin-form.vue +5 -2
  32. package/components/design/approve_design_tables/approve-design-tables.scss +3 -3
  33. package/components/design/approve_design_tables/approve-design-tables.vue +24 -13
  34. package/components/design/approve_design_tees/approve-design-tees.vue +18 -4
  35. package/components/editor/editor.vue +3 -2
  36. package/components/editor/editor_layers/editor_layer_forms/editor_layer_form_text/editor-layer-form-text.vue +3 -1
  37. package/components/editor/editor_pricing/editor-pricing.vue +3 -123
  38. package/components/editor/editor_pricing/editor_pricing_details/editor-pricing-details.scss +0 -0
  39. package/components/editor/editor_pricing/editor_pricing_details/editor-pricing-details.vue +29 -0
  40. package/components/editor/editor_pricing/editor_pricing_details/editor_pricing_details_prints/editor-pricing-details-prints.scss +41 -0
  41. package/components/editor/editor_pricing/editor_pricing_details/editor_pricing_details_prints/editor-pricing-details-prints.vue +119 -0
  42. package/components/editor/editor_pricing/editor_pricing_details/editor_pricing_details_products/editor-pricing-details-products.scss +41 -0
  43. package/components/editor/editor_pricing/editor_pricing_details/editor_pricing_details_products/editor-pricing-details-products.vue +101 -0
  44. package/components/editor/editor_print_area_options/editor-print-area-options.vue +16 -15
  45. package/components/editor/editor_print_area_options/editor_print_area_option/editor-print-area-option.vue +12 -12
  46. package/components/editor/editor_product_details/editor-product-details.scss +1 -1
  47. package/components/editor/editor_product_details/editor-product-details.vue +22 -10
  48. package/components/editor/editor_workspace/editor-workspace.vue +10 -5
  49. package/components/editor/editor_workspace/editor_workspace_side/editor-workspace-side.vue +9 -5
  50. package/components/modals/cart_modal/cart-modal.vue +1 -1
  51. package/components/modals/order_modal/order-modal.vue +5 -7
  52. package/components/modals/payment_modal/payment-modal.vue +1 -1
  53. package/components/pricing/pricing_digital_printing/pricing-digital-printing.vue +1 -4
  54. package/components/pricing/pricing_example/pricing-example.scss +4 -1
  55. package/components/pricing/pricing_example/pricing-example.vue +106 -26
  56. package/components/pricing/pricing_garment/pricing-garment.scss +44 -31
  57. package/components/pricing/pricing_garment/pricing-garment.vue +24 -10
  58. package/components/pricing/pricing_main_section/pricing-main-section.scss +0 -1
  59. package/components/pricing/pricing_main_section/pricing-main-section.vue +6 -17
  60. package/components/pricing/pricing_print/pricing-print.scss +1 -1
  61. package/components/pricing/pricing_print/pricing-print.vue +19 -7
  62. package/components/pricing/pricing_products_calculator/pricing-products-calculator.scss +64 -0
  63. package/components/pricing/pricing_products_calculator/pricing-products-calculator.vue +86 -0
  64. package/components/pricing/pricing_products_calculator/pricing_product_calculator/pricing-product-calculator.scss +58 -0
  65. package/components/pricing/pricing_products_calculator/pricing_product_calculator/pricing-product-calculator.vue +296 -0
  66. package/components/pricing/pricing_products_calculator/pricing_product_calculator/pricing_product_print_calculator/pricing-product-print-calculator.scss +1 -0
  67. package/components/pricing/pricing_products_calculator/pricing_product_calculator/pricing_product_print_calculator/pricing-product-print-calculator.vue +26 -0
  68. package/components/pricing/pricing_products_calculator/pricing_product_calculator/print_size_icon/print-size-icon.scss +34 -0
  69. package/components/pricing/pricing_products_calculator/pricing_product_calculator/print_size_icon/print-size-icon.vue +55 -0
  70. package/components/pricing/pricing_screen_print/pricing-screen-print.vue +6 -3
  71. package/components/pricing/pricing_screen_printing/pricing-screen-printing.vue +1 -2
  72. package/components/product/gallery/gallery.scss +168 -0
  73. package/components/product/gallery/gallery.vue +252 -0
  74. package/components/product/layouts/product_fabric_and_size_info/product-fabric-and-size-info.vue +8 -6
  75. package/components/product/layouts/product_gallery/product-gallery.vue +10 -3
  76. package/components/product/layouts/product_size_table/product-size-table.vue +16 -39
  77. package/components/product/layouts/product_tier_prices/product-tier-prices.vue +3 -2
  78. package/components/product/product.vue +16 -5
  79. package/components/product/product_price_range/product-price-range.vue +20 -4
  80. package/components/product/product_prints_price_info/product_print_price_info/product_print_price_info_item/product-print-price-info-item.vue +14 -2
  81. package/components/product/product_prints_price_info/product_screen_print_price_info/product-screen-print-price-info.scss +5 -0
  82. package/components/product/product_prints_price_info/product_screen_print_price_info/product-screen-print-price-info.vue +53 -12
  83. package/components/product/product_sizes_info/product-sizes-info.vue +13 -2
  84. package/components/product/related_products/related-products.scss +34 -0
  85. package/components/product/related_products/related-products.vue +52 -0
  86. package/components/products/product_list/product-list.scss +2 -1
  87. package/components/products/product_list_product/product-list-product.scss +44 -20
  88. package/components/products/product_list_product/product-list-product.vue +6 -4
  89. package/components/products/products_aside/products-aside.vue +29 -4
  90. package/components/products/products_autocomplete/products-autocomplete.vue +4 -0
  91. package/components/products/products_brands/products-brands.vue +9 -2
  92. package/components/products/products_filters/products-filters.vue +12 -5
  93. package/components/products/products_tags/products-tags.vue +7 -0
  94. package/components/products/products_types/products-types.vue +6 -1
  95. package/components/subscribe/subscribe.vue +3 -0
  96. package/mixins/product-preview.js +7 -1
  97. package/package.json +1 -1
  98. package/plugins/vee-validate.js +2 -1
  99. package/plugins/vue-recaptcha.js +4 -1
  100. package/static/icons/{back_hoodie_a4_v.svg → back_hoodie_a4.svg} +0 -0
  101. package/static/icons/{back_hoodie_half_a4_h.svg → back_hoodie_half_a4.svg} +0 -0
  102. package/static/icons/{back_hoodie_rect10_l.svg → back_hoodie_rect10.svg} +0 -0
  103. package/static/icons/{back_polo_a4_v.svg → back_polo_a4.svg} +0 -0
  104. package/static/icons/{back_polo_half_a4_h.svg → back_polo_half_a4.svg} +0 -0
  105. package/static/icons/{back_polo_rect10_l.svg → back_polo_rect10.svg} +0 -0
  106. package/static/icons/{back_tee_a4_v.svg → back_tee_a4.svg} +0 -0
  107. package/static/icons/{back_tee_half_a4_h.svg → back_tee_half_a4.svg} +0 -0
  108. package/static/icons/{back_tee_rect10_l.svg → back_tee_rect10.svg} +0 -0
  109. package/static/icons/{front_hoodie_a4_v.svg → front_hoodie_a4.svg} +0 -0
  110. package/static/icons/{front_hoodie_half_a4_h.svg → front_hoodie_half_a4.svg} +0 -0
  111. package/static/icons/{front_hoodie_rect10_l.svg → front_hoodie_rect10.svg} +0 -0
  112. package/static/icons/{front_polo_a4_v.svg → front_polo_a4.svg} +0 -0
  113. package/static/icons/{front_polo_half_a4_h.svg → front_polo_half_a4.svg} +0 -0
  114. package/static/icons/{front_polo_rect10_l.svg → front_polo_rect10.svg} +0 -0
  115. package/static/icons/{front_tee_a4_v.svg → front_tee_a4.svg} +0 -0
  116. package/static/icons/{front_tee_half_a4_h.svg → front_tee_half_a4.svg} +0 -0
  117. package/static/icons/{front_tee_rect10_l.svg → front_tee_rect10.svg} +0 -0
  118. package/store/index.js +3 -1
  119. package/store/product.js +26 -15
  120. package/components/pricing/pricing_print/discounts_table/discounts-table.scss +0 -8
  121. package/components/pricing/pricing_print/discounts_table/discounts-table.vue +0 -91
  122. package/components/pricing/pricing_screen_print/discounts_table/discounts-table.scss +0 -14
  123. package/components/pricing/pricing_screen_print/discounts_table/discounts-table.vue +0 -78
@@ -0,0 +1,296 @@
1
+ <template>
2
+ <section class="PricingProductCalculator__wrapper">
3
+ <div class="lc_h3">
4
+ Print Details - {{ screenPrintMinQuantity }}
5
+ </div>
6
+ <div class="row">
7
+ <div
8
+ v-for="side in sides"
9
+ :key="side.type"
10
+ class="PricingProductCalculator__prints col-sm-6 col-12">
11
+ <div class="row">
12
+ <div class="col-4">
13
+ <PrintSizeIcon
14
+ class="PricingProductCalculator__icon"
15
+ :product="product"
16
+ :side="side" />
17
+ </div>
18
+ <div class="col-8">
19
+ <div class="PricingProductCalculator__print-sizes">
20
+ <div
21
+ v-for="size in side.printSizes"
22
+ :key="size._id"
23
+ class="PricingProductCalculator__print-size"
24
+ :class="{
25
+ 'PricingProductCalculator__print-size--active': side.printSize === size.alias
26
+ }"
27
+ @click="side.printSize = size.alias">
28
+ {{ size.name }}
29
+ </div>
30
+ <div
31
+ class="PricingProductCalculator__print-size PricingProductCalculator__print-size--full"
32
+ :class="{
33
+ 'PricingProductCalculator__print-size--active': !side.printSize
34
+ }"
35
+ @click="side.printSize = null">
36
+ no print
37
+ </div>
38
+ </div>
39
+ </div>
40
+ </div>
41
+ </div>
42
+ </div>
43
+ <div class="lc_h3">
44
+ Print Colours
45
+ </div>
46
+ <div class="row">
47
+ <div
48
+ v-for="side in sides"
49
+ :key="side.type"
50
+ class="PricingProductCalculator__prints col-sm-6 col-12">
51
+ <div style="padding: 0px 30px">
52
+ <range
53
+ v-model="side.colorsQuantity"
54
+ :min="1"
55
+ :max="maxScreenPrintColors"
56
+ :visible-steps="true" />
57
+ <div class="row">
58
+ <div class="col-6">
59
+ <label class="form-label PaymentModal__label-with-checkbox">
60
+ <checkbox
61
+ v-model="side.fullColor"
62
+ @change="onChangeFullColor(side)" />
63
+ <span class="lc_regular14 lc__grey1">
64
+ Full colour
65
+ </span>
66
+ </label>
67
+ </div>
68
+ <div class="col-6">
69
+ <label class="form-label PaymentModal__label-with-checkbox">
70
+ <checkbox v-model="side.hasUnderbase" />
71
+ <span class="lc_regular14 lc__grey1">
72
+ With Underbase
73
+ </span>
74
+ </label>
75
+ </div>
76
+ </div>
77
+ </div>
78
+ </div>
79
+ </div>
80
+ <div class="lc_h3">
81
+ Products Quantity
82
+ </div>
83
+ <div style="padding: 30px">
84
+ <range
85
+ v-model="quantity"
86
+ :min="1"
87
+ :max="999"
88
+ :visible-steps="true" />
89
+ </div>
90
+ <div class="PricingProductCalculator__delivery">
91
+ <div class="lc_h5 mr-10">
92
+ Delivery
93
+ </div>
94
+ <div class="PricingProductCalculator__delivery-postcode">
95
+ <postcode-select v-model="postcode" />
96
+ </div>
97
+ </div>
98
+ <div class="row">
99
+ <div
100
+ v-for="(printTypePricing, index) in printTypesPricing"
101
+ :key="index"
102
+ class="PricingProductCalculator__prints col-6">
103
+ <div class="row">
104
+ <div class="col-6">
105
+ <div
106
+ v-if="printTypePricing.prints[0]"
107
+ class="mb-10">
108
+ <div class="lc_h4">
109
+ {{ labels[printTypePricing.type] }}
110
+ </div>
111
+ <div class="lc_regular13">
112
+ Minimum: {{ printTypePricing.prints[0].printType.minQuantity > 1 ? printTypePricing.prints[0].printType.minQuantity : 'No minimum' }}
113
+ </div>
114
+ </div>
115
+ <div class="PricingProductCalculator__cost">
116
+ Cost Per Unit: <b>{{ printTypePricing.pricing.products.price | price }}</b>
117
+ </div>
118
+ <div>
119
+ <v-popover
120
+ trigger="hover"
121
+ :delay="{ hide: 400 }"
122
+ popover-class="tooltip popover white">
123
+ <span class="PricingProductCalculator__breakdown">
124
+ breakdown
125
+ </span>
126
+ <template
127
+ slot="popover">
128
+ <product-total-pricing :pricing="printTypePricing.pricing" />
129
+ </template>
130
+ </v-popover>
131
+ </div>
132
+ </div>
133
+ <div class="col-6">
134
+ <btn
135
+ btn-class="green"
136
+ btn-label="Edit"
137
+ @onclick="goToEditor()">
138
+ </btn>
139
+ </div>
140
+ </div>
141
+ <div class="PricingProductCalculator__reprint">
142
+ <div v-if="printTypePricing.type === 'full colour print'">
143
+ Repeat Print same cost
144
+ </div>
145
+ <div v-else>
146
+ Repeat Print: {{ (printTypePricing.pricing.products.price - printTypePricing.pricing.products.prints.totalSetupPrice) | price }}
147
+ </div>
148
+ </div>
149
+ </div>
150
+ </div>
151
+ </section>
152
+ </template>
153
+
154
+ <script>
155
+ import { getPrintAreasSizes, getPrintAreaSizes } from '@lancom/shared/assets/js/utils/prints';
156
+ import PostcodeSelect from '@lancom/shared/components/common/postcode_select/postcode-select';
157
+ import { getProductsForCalculatePricing, generateProductLink } from '@lancom/shared/assets/js/utils/product';
158
+ import Range from '@lancom/shared/components/common/range/range';
159
+ import api from '@lancom/shared/assets/js/api';
160
+ import { price } from '@lancom/shared/assets/js/utils/filters';
161
+ import ProductTotalPricing from '@lancom/shared/components/common/products_total_pricing/products-total-pricing';
162
+ import debounce from 'lodash.debounce';
163
+ import { mapGetters } from 'vuex';
164
+ import PrintSizeIcon from './print_size_icon/print-size-icon';
165
+
166
+ export default {
167
+ name: 'PricingProductCalculator',
168
+ filters: {
169
+ price
170
+ },
171
+ components: {
172
+ PrintSizeIcon,
173
+ PostcodeSelect,
174
+ Range,
175
+ ProductTotalPricing
176
+ },
177
+ props: {
178
+ product: {
179
+ type: Object,
180
+ required: true
181
+ }
182
+ },
183
+ data() {
184
+ const simpleProduct = [...this.product.simpleProducts].sort((a, b) => a.maxPrice - b.maxPrice)[0];
185
+ const frontPrintSize = getPrintAreasSizes(this.product.printAreas, 'front');
186
+ const backPrintSize = getPrintAreasSizes(this.product.printAreas, 'back');
187
+
188
+ const printTypes = this.product.printTypes.filter(printType => printType.type === 'screen print');
189
+ const screenPrintMinQuantity = Math.min(...printTypes.map(printType => printType.minQuantity));
190
+
191
+ return {
192
+ simpleProduct: { ...simpleProduct, amount: screenPrintMinQuantity || this.product.minimumOrderQuantity },
193
+ labels: {
194
+ 'screen print': 'Screen Print',
195
+ 'full colour print': 'Digital Print'
196
+ },
197
+ printTypesPricing: [],
198
+ availablePrintTypes: ['full colour print', 'screen print'],
199
+ postcode: null,
200
+ sides: [{
201
+ type: 'front',
202
+ printSize: frontPrintSize[0].alias,
203
+ printSizes: frontPrintSize,
204
+ colorsQuantity: 1,
205
+ hasUnderbase: false,
206
+ fullColor: false
207
+ }, {
208
+ type: 'back',
209
+ printSize: backPrintSize[0].alias,
210
+ printSizes: backPrintSize,
211
+ colorsQuantity: 1,
212
+ hasUnderbase: false,
213
+ fullColor: false
214
+ }],
215
+ calculatePricingWithDebounce: debounce(this.calculatePricing.bind(this), 500)
216
+ };
217
+ },
218
+ computed: {
219
+ ...mapGetters(['shop']),
220
+ maxScreenPrintColors() {
221
+ const printTypes = this.product.printTypes.filter(printType => printType.type === 'screen print');
222
+ return Math.max(...printTypes.map(printType => printType.colorsQuantity));
223
+ },
224
+ screenPrintMinQuantity() {
225
+ const printTypes = this.product.printTypes.filter(printType => printType.type === 'screen print');
226
+ return Math.min(...printTypes.map(printType => printType.minQuantity));
227
+ },
228
+ pricingPayload() {
229
+ return [
230
+ this.simpleProduct.amount,
231
+ this.sides.map(({ colorsQuantity, hasUnderbase, printSize }) => ({ colorsQuantity, hasUnderbase, printSize })),
232
+ this.postcode
233
+ ];
234
+ },
235
+ quantity: {
236
+ get() {
237
+ return this.simpleProduct.amount;
238
+ },
239
+ set(amount) {
240
+ if (amount < this.screenPrintMinQuantity) {
241
+ this.sides.forEach(side => {
242
+ side.fullColor = true;
243
+ this.onChangeFullColor(side);
244
+ });
245
+ }
246
+ this.simpleProduct.amount = amount;
247
+ }
248
+ }
249
+ },
250
+ watch: {
251
+ pricingPayload() {
252
+ this.calculatePricingWithDebounce();
253
+ }
254
+ },
255
+ mounted() {
256
+ this.calculatePricingWithDebounce();
257
+ },
258
+ methods: {
259
+ async calculatePricing() {
260
+ this.printTypesPricing = await Promise.all(
261
+ this.availablePrintTypes.map(async type => {
262
+ const prints = this.generateSidesPrints(type);
263
+ const layers = prints.map(({ printType, printSize, printArea }) => ({ printType: printType?._id, printSize: printSize?._id, printArea: printArea?._id }));
264
+ const entities = getProductsForCalculatePricing(this.product, [this.simpleProduct], layers, true, true);
265
+ const pricing = await api.calculateProductPrice({ entities, postcode: this.postcode }, this.shop._id);
266
+ return { pricing, prints, type };
267
+ })
268
+ );
269
+ },
270
+ generateSidesPrints(type) {
271
+ return this.sides
272
+ .filter(({ printSize }) => printSize)
273
+ .map(side => {
274
+ const printType = this.getSidePrintType(side, type) || {};
275
+ const printSize = side.printSizes.find(({ alias }) => alias === side.printSize);
276
+ const printArea = this.product.printAreas.find(printArea => getPrintAreaSizes(printArea).some(({ _id }) => _id === printSize?._id));
277
+ return { printType, printSize, printArea };
278
+ });
279
+ },
280
+ getSidePrintType(side, type) {
281
+ return this.product.printTypes.find(printType => type === printType.type && (type === 'full colour print' || (printType.colorsQuantity === side.colorsQuantity && !!printType.hasUnderbase === !!side.hasUnderbase)));
282
+ },
283
+ goToEditor() {
284
+ const link = generateProductLink(this.product, null, true);
285
+ this.$router.push(link);
286
+ },
287
+ onChangeFullColor(side) {
288
+ side.colorsQuantity = side.fullColor ? this.maxScreenPrintColors : 1;
289
+ }
290
+ }
291
+ };
292
+ </script>
293
+
294
+ <style lang="scss" scoped>
295
+ @import 'pricing-product-calculator';
296
+ </style>
@@ -0,0 +1,26 @@
1
+ <template>
2
+ <section class="PricingProductPrintCalculator__wrapper">
3
+ <div>{{ print.type }}</div>
4
+ </section>
5
+ </template>
6
+
7
+ <script>
8
+
9
+ export default {
10
+ name: 'PricingProductPrintCalculator',
11
+ props: {
12
+ product: {
13
+ type: Object,
14
+ required: true
15
+ },
16
+ side: {
17
+ type: Object,
18
+ required: true
19
+ }
20
+ }
21
+ };
22
+ </script>
23
+
24
+ <style lang="scss" scoped>
25
+ @import 'pricing-product-print-calculator';
26
+ </style>
@@ -0,0 +1,34 @@
1
+ @import "@/assets/scss/variables";
2
+ $product_types: tee, hoodie, polo;
3
+ $product_sides: front, back;
4
+ $print_areas: a3, a4, half_a4, rect10;
5
+
6
+ .PrintSizeIcon {
7
+ &__icon {
8
+ width: 100%;
9
+ height: 100%;
10
+ position: absolute;
11
+ background-repeat: no-repeat;
12
+ background-size: contain;
13
+ background-position: center;
14
+ &-container {
15
+ position: relative;
16
+ width: 150px;
17
+ height: 150px;
18
+ overflow: hidden;
19
+ }
20
+
21
+ @each $side in $product_sides {
22
+ @each $type in $product_types {
23
+ &.#{$side}.#{$type} {
24
+ background-image: url(../../../../../static/icons/#{$side}_#{$type}.svg);
25
+ }
26
+ @each $print_area in $print_areas {
27
+ &.#{$side}.#{$type}.#{$print_area} {
28
+ background-image: url(../../../../../static/icons/#{$side}_#{$type}_#{$print_area}.svg);
29
+ }
30
+ }
31
+ }
32
+ }
33
+ }
34
+ }
@@ -0,0 +1,55 @@
1
+ <template>
2
+ <div class="PrintSizeIcon__wrapper">
3
+ <div class="PrintSizeIcon__icon-container">
4
+ <transition
5
+ name="appear-from-top"
6
+ appear>
7
+ <div
8
+ :key="side.printSize"
9
+ class="PrintSizeIcon__icon view-transition"
10
+ :class="{
11
+ [side.type]: true,
12
+ [printSizeClassname]: true,
13
+ [productType]: true
14
+ }">
15
+ </div>
16
+ </transition>
17
+ </div>
18
+ </div>
19
+ </template>
20
+
21
+ <script>
22
+ const MAP_SIZE_ALIASES = {
23
+ a4_h: 'a4',
24
+ a4_v: 'a4',
25
+ rect10_l: 'rect10',
26
+ rect10_r: 'rect10'
27
+ };
28
+
29
+ export default {
30
+ name: 'PrintSizeIcon',
31
+ props: {
32
+ product: {
33
+ type: Object,
34
+ required: true
35
+ },
36
+ side: {
37
+ type: Object,
38
+ required: true
39
+ }
40
+ },
41
+ computed: {
42
+ productType() {
43
+ const { productType } = this.product || {};
44
+ return productType?.alias;
45
+ },
46
+ printSizeClassname() {
47
+ return MAP_SIZE_ALIASES[this.side.printSize] || this.side.printSize;
48
+ }
49
+ }
50
+ };
51
+ </script>
52
+
53
+ <style lang="scss" scoped>
54
+ @import 'print-size-icon';
55
+ </style>
@@ -9,7 +9,10 @@
9
9
  <div
10
10
  data-aos="aosFadeLeft"
11
11
  class="col-12 PricingPrint__col">
12
- <discounts-table :product="product" />
12
+ <product-screen-print-price-info
13
+ :product="product"
14
+ :bordered="true"
15
+ :tabs="true" />
13
16
  </div>
14
17
  </div>
15
18
  </div>
@@ -18,12 +21,12 @@
18
21
  </template>
19
22
 
20
23
  <script>
21
- import DiscountsTable from './discounts_table/discounts-table';
24
+ import ProductScreenPrintPriceInfo from '@lancom/shared/components/product/product_prints_price_info/product_screen_print_price_info/product-screen-print-price-info';
22
25
 
23
26
  export default {
24
27
  name: 'PricingScreenPrint',
25
28
  components: {
26
- DiscountsTable
29
+ ProductScreenPrintPriceInfo
27
30
  },
28
31
  props: {
29
32
  product: {
@@ -248,7 +248,7 @@ export default {
248
248
  },
249
249
  data() {
250
250
  return {
251
- product: null,
251
+ product: this.findProductByType(PRODUCT_TYPES.TEE),
252
252
  colorOptions: [{
253
253
  value: 0,
254
254
  label: 'Unprinted'
@@ -318,7 +318,6 @@ export default {
318
318
  },
319
319
  created() {
320
320
  this.screenPrint = true;
321
- this.product = this.findProductByType(PRODUCT_TYPES.TEE);
322
321
  },
323
322
  methods: {
324
323
  contactUs() {
@@ -0,0 +1,168 @@
1
+ @import "@/assets/scss/variables";
2
+
3
+ ::v-deep .slick-dots {
4
+ display: none !important;
5
+ }
6
+ ::v-deep .slick-arrow {
7
+ position: absolute;
8
+ top: 50%;
9
+ background-color: $black;
10
+ background-image: url(../../../static/icons/arrow-left.svg);
11
+ background-position: center;
12
+ background-repeat: no-repeat;
13
+ background-size: 25px 25px;
14
+ width: 51px;
15
+ height: 90px;
16
+ margin-top: -45px;
17
+ text-indent: -9999px;
18
+ border: none;
19
+ cursor: pointer;
20
+ z-index: 2;
21
+ @media (max-width: $bp-medium-max) {
22
+ width: 41px;
23
+ height: 67px;
24
+ }
25
+
26
+ &.slick-prev {
27
+ left: 0;
28
+ transform: rotate(180deg);
29
+ }
30
+ &.slick-next {
31
+ right: 0;
32
+ }
33
+ &:hover {
34
+ box-shadow: 0 0 3px $grey_2;
35
+ }
36
+ &:focus {
37
+ outline: none;
38
+ }
39
+ }
40
+ ::v-deep .slick-slider,
41
+ ::v-deep .slick-slide {
42
+ touch-action: auto;
43
+ -ms-touch-action: auto;
44
+ }
45
+ ::v-deep .Gallery__small .slick-arrow {
46
+ width: 31px;
47
+ height: 50px;
48
+ margin-top: -25px;
49
+ }
50
+
51
+ .Gallery {
52
+ &__big,
53
+ &__small {
54
+ overflow: hidden;
55
+ position: relative;
56
+ }
57
+ &__zoom {
58
+ position: absolute;
59
+ right: 20px;
60
+ bottom: 20px;
61
+ width: 30px;
62
+ height: 30px;
63
+ border-radius: 8px;
64
+ background: white;
65
+ opacity: 0.6;
66
+ align-items: center;
67
+ justify-content: center;
68
+ cursor: pointer;
69
+ display: flex;
70
+ border: 1px solid grey;
71
+ }
72
+ &__big-image,
73
+ &__small-image {
74
+ width: 100%;
75
+ position: relative;
76
+ background-repeat: no-repeat;
77
+ background-position: center center;
78
+ background-size: contain;
79
+ touch-action: auto !important;
80
+ -ms-touch-action: auto !important;
81
+ &::after {
82
+ content: ' ';
83
+ display: block;
84
+ padding-top: 100%;
85
+ }
86
+ }
87
+ &__big {
88
+ &-image {
89
+ max-height: 600px;
90
+ }
91
+ &-print {
92
+ background-color: $gray;
93
+ padding: 16px 20px;
94
+ position: absolute;
95
+ bottom: 60px;
96
+ left: 0px;
97
+ pointer-events: none;
98
+ &-name {
99
+ font-weight: 800;
100
+ font-size: 18px;
101
+ color: $black;
102
+ }
103
+ &-price {
104
+ font-weight: 600;
105
+ font-size: 18px;
106
+ color: $gray_main;
107
+ margin-top: 4px;
108
+ }
109
+ }
110
+ }
111
+ &__small {
112
+ &-image {
113
+ cursor: pointer;
114
+ margin-top: 30px;
115
+ border-bottom: 2px solid $white;
116
+ &--active {
117
+ border-bottom: 2px solid $black;
118
+ }
119
+ }
120
+ &-printed {
121
+ font-weight: bold;
122
+ font-size: 10px;
123
+ color: $black;
124
+ background: $gray;
125
+ padding: 6px;
126
+ text-align: center;
127
+ position: absolute;
128
+ bottom: 12px;
129
+ right: 20px;
130
+ left: 20px;
131
+ text-transform: uppercase;
132
+ @media (max-width: $bp-medium-max) {
133
+ bottom: 6px;
134
+ right: 3px;
135
+ left: 3px;
136
+ opacity: 0.7;
137
+ }
138
+ }
139
+ }
140
+ &__filters {
141
+ margin-top: 28px;
142
+ display: flex;
143
+ }
144
+ &__filter {
145
+ flex-grow: 1;
146
+ font-weight: 800;
147
+ font-size: 16px;
148
+ text-align: center;
149
+ color: $black;
150
+ padding: 19px 0;
151
+ background-color: $gray;
152
+ cursor: pointer;
153
+ margin-left: 7px;
154
+ &:first-child {
155
+ margin-left: 0;
156
+ }
157
+ &--active {
158
+ background-color: $black;
159
+ color: $gray;
160
+ }
161
+ }
162
+ &__divider {
163
+ height: 1px;
164
+ width: 100%;
165
+ background-color: $gray;
166
+ margin-top: 20px;
167
+ }
168
+ }