@lancom/shared 0.0.383 → 0.0.385

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 (94) hide show
  1. package/assets/js/api/admin.js +12 -0
  2. package/assets/js/api/index.js +11 -1
  3. package/assets/js/utils/scroll.js +11 -0
  4. package/components/checkout/cart/cart.mixin.js +5 -1
  5. package/components/checkout/cart/cart.vue +32 -19
  6. package/components/checkout/cart/cart_entity/cart-entity.mixin.js +4 -0
  7. package/components/checkout/cart/cart_entity/cart-entity.vue +2 -0
  8. package/components/checkout/cart/cart_entity/cart_entity_color_simple_products/cart-entity-color-simple-products.vue +2 -0
  9. package/components/checkout/cart/cart_price_info/cart-price-info.vue +8 -53
  10. package/components/checkout/cart/cart_pricing/cart-pricing.scss +11 -3
  11. package/components/checkout/cart/cart_pricing/cart-pricing.vue +6 -2
  12. package/components/checkout/cart/cart_products_kit_entity/cart-products-kit-entity.scss +24 -0
  13. package/components/checkout/cart/cart_products_kit_entity/cart-products-kit-entity.vue +66 -0
  14. package/components/checkout/cart/cart_shipments_pricing/cart-shipments-pricing.scss +3 -0
  15. package/components/checkout/cart/cart_shipments_pricing/cart-shipments-pricing.vue +12 -2
  16. package/components/checkout/cart/cart_shipping/cart-shipping.scss +43 -0
  17. package/components/checkout/cart/cart_shipping/cart-shipping.vue +126 -0
  18. package/components/checkout/order/address-form/address-form.vue +5 -0
  19. package/components/checkout/order/order-billing-information/order-billing-information.vue +1 -0
  20. package/components/checkout/order/order-payment-information/order-payment-information.vue +9 -0
  21. package/components/common/number_input/number-input.scss +69 -0
  22. package/components/common/number_input/number-input.vue +97 -0
  23. package/components/common/payment/payment_card/applepay/applepay.scss +8 -0
  24. package/components/common/payment/payment_card/applepay/applepay.vue +16 -0
  25. package/components/common/payment/payment_card/payment-card.vue +7 -0
  26. package/components/common/postcode_select/postcode-select.scss +6 -0
  27. package/components/common/postcode_select/postcode-select.vue +16 -6
  28. package/components/common/pricing_discounts_table/pricing-discounts-table.vue +12 -2
  29. package/components/customer/customer_coupons/customer-coupons.scss +33 -0
  30. package/components/customer/customer_coupons/customer-coupons.vue +103 -0
  31. package/components/customer/customer_coupons/customer_coupon_apply/customer-coupon-apply.scss +1 -0
  32. package/components/customer/customer_coupons/customer_coupon_apply/customer-coupon-apply.vue +51 -0
  33. package/components/customer/customer_coupons/customer_coupon_prints/customer-coupon-prints.scss +1 -0
  34. package/components/customer/customer_coupons/customer_coupon_prints/customer-coupon-prints.vue +33 -0
  35. package/components/customer/customer_coupons/customer_coupon_prints/customer_coupon_print/customer-coupon-print.scss +19 -0
  36. package/components/customer/customer_coupons/customer_coupon_prints/customer_coupon_print/customer-coupon-print.vue +82 -0
  37. package/components/customer/customer_coupons/customer_coupon_products/customer-coupon-products.scss +1 -0
  38. package/components/customer/customer_coupons/customer_coupon_products/customer-coupon-products.vue +33 -0
  39. package/components/customer/customer_coupons/customer_coupon_products/customer_coupon_product/customer-coupon-product.scss +17 -0
  40. package/components/customer/customer_coupons/customer_coupon_products/customer_coupon_product/customer-coupon-product.vue +52 -0
  41. package/components/customer/customer_navigation_menu/customer-navigation-menu.vue +72 -0
  42. package/components/customer/customer_orders/customer-orders.scss +26 -12
  43. package/components/customer/customer_orders/customer-orders.vue +64 -33
  44. package/components/customer/customer_orders/customer_order_reorder/customer-order-reorder.scss +1 -0
  45. package/components/customer/customer_orders/customer_order_reorder/customer-order-reorder.vue +55 -0
  46. package/components/customer/customer_orders/customer_order_trackings/customer-order-trackings.scss +8 -0
  47. package/components/customer/customer_orders/customer_order_trackings/customer-order-trackings.vue +38 -0
  48. package/components/editor/editor.vue +4 -12
  49. package/components/editor/mobile_editor_product_details/mobile-editor-product-details.vue +2 -10
  50. package/components/products_kit/products_kit/products-kit.scss +54 -0
  51. package/components/products_kit/products_kit/products-kit.vue +47 -0
  52. package/components/products_kit/products_kit/products_kit_cart/products-kit-cart.scss +32 -0
  53. package/components/products_kit/products_kit/products_kit_cart/products-kit-cart.vue +132 -0
  54. package/components/products_kit/products_kit/products_kit_cart/products_kit_cart_options/products-kit-cart-options.scss +15 -0
  55. package/components/products_kit/products_kit/products_kit_cart/products_kit_cart_options/products-kit-cart-options.vue +31 -0
  56. package/components/products_kit/products_kit/products_kit_cart/products_kit_cart_options/products_kit_cart_option/products-kit-cart-option.scss +41 -0
  57. package/components/products_kit/products_kit/products_kit_cart/products_kit_cart_options/products_kit_cart_option/products-kit-cart-option.vue +89 -0
  58. package/components/products_kit/products_kit/products_kit_options/products-kit-options.scss +9 -0
  59. package/components/products_kit/products_kit/products_kit_options/products-kit-options.vue +32 -0
  60. package/components/products_kit/products_kit/products_kit_options/products_kit_option/products-kit-option.scss +1 -0
  61. package/components/products_kit/products_kit/products_kit_options/products_kit_option/products-kit-option.vue +36 -0
  62. package/components/products_kit/products_kit/products_kit_options/products_kit_option/products_kit_option_color/products-kit-option-color.scss +1 -0
  63. package/components/products_kit/products_kit/products_kit_options/products_kit_option/products_kit_option_color/products-kit-option-color.vue +88 -0
  64. package/components/products_kit/products_kit/products_kit_options/products_kit_option/products_kit_option_products/products-kit-option-products.scss +7 -0
  65. package/components/products_kit/products_kit/products_kit_options/products_kit_option/products_kit_option_products/products-kit-option-products.vue +36 -0
  66. package/components/products_kit/products_kit/products_kit_options/products_kit_option/products_kit_option_products/products_kit_option_product/products-kit-option-product.scss +20 -0
  67. package/components/products_kit/products_kit/products_kit_options/products_kit_option/products_kit_option_products/products_kit_option_product/products-kit-option-product.vue +127 -0
  68. package/components/products_kit/products_kit/products_kit_options/products_kit_option/products_kit_option_size/products-kit-option-size.scss +1 -0
  69. package/components/products_kit/products_kit/products_kit_options/products_kit_option/products_kit_option_size/products-kit-option-size.vue +87 -0
  70. package/components/products_kit/products_kits_list/products-kits-list.scss +68 -0
  71. package/components/products_kit/products_kits_list/products-kits-list.vue +50 -0
  72. package/components/products_kit/products_kits_list/products_kits_list_item/products-kits-list-item.scss +84 -0
  73. package/components/products_kit/products_kits_list/products_kits_list_item/products-kits-list-item.vue +52 -0
  74. package/components/quotes/quote_view/quote-view.vue +1 -0
  75. package/components/quotes/quote_view/quote_option_view/quote-option-view.vue +4 -0
  76. package/components/quotes/quote_view/quote_product_color_simple_products/quote-product-color-simple-products.vue +9 -2
  77. package/components/quotes/quote_view/quote_product_color_simple_products/quote_product_color_simple_product/quote-product-color-simple-product.scss +54 -1
  78. package/components/quotes/quote_view/quote_product_color_simple_products/quote_product_color_simple_product/quote-product-color-simple-product.vue +83 -5
  79. package/components/quotes/quote_view/quote_view_product/quote-view-product.scss +7 -0
  80. package/components/quotes/quote_view/quote_view_product/quote-view-product.vue +33 -11
  81. package/feeds/google-shopping.js +10 -4
  82. package/mixins/product-preview.js +6 -0
  83. package/package.json +1 -1
  84. package/pages/checkout/order.vue +13 -4
  85. package/pages/contact.vue +54 -0
  86. package/pages/customer/coupons.vue +39 -0
  87. package/pages/customer/orders.vue +39 -0
  88. package/pages/customer/settings.vue +4 -2
  89. package/pages/products-kit/_alias.vue +103 -0
  90. package/pages/products-kit/index.vue +59 -0
  91. package/routes/index.js +21 -1
  92. package/store/cart.js +2 -2
  93. package/store/productsKit.js +175 -0
  94. package/pages/customer/orders/index.vue +0 -29
@@ -0,0 +1,54 @@
1
+ @import "@/assets/scss/variables";
2
+
3
+ .ProductsKit {
4
+ &__wrapper {
5
+ .post-full-content {
6
+ position: relative;
7
+ font-size: 1.3rem;
8
+ line-height: 1.6em;
9
+ background: #fff;
10
+ margin-bottom: 20px;
11
+ @media (max-width: $bp-extra-small-max) {
12
+ margin: 0;
13
+ padding: 15px;
14
+ }
15
+ @import "@lancom/shared/assets/scss/normalize";
16
+ img {
17
+ max-width: none;
18
+ @media (max-width: $bp-small-max) {
19
+ width: 100%;
20
+ height: auto;
21
+ }
22
+ }
23
+ p {
24
+ margin-bottom: 0.6rem !important;
25
+ }
26
+ }
27
+ }
28
+
29
+ &__header {
30
+ position: relative;
31
+ display: flex;
32
+ align-items: center;
33
+ justify-content: center;
34
+ flex-direction: column;
35
+ }
36
+ &__header-info {
37
+ padding-top: 10px !important;
38
+ padding-bottom: 0px !important;
39
+ h1 {
40
+ margin-bottom: 10px;
41
+ }
42
+ }
43
+ &__options {
44
+ position: relative;
45
+ }
46
+ &__cart {
47
+ position: sticky;
48
+ z-index: 2;
49
+ bottom: 0;
50
+ margin: 50px 0;
51
+ background-color: $gray;
52
+ padding: 15px;
53
+ }
54
+ }
@@ -0,0 +1,47 @@
1
+ <template>
2
+ <div>
3
+ <article class="ProductsKit__wrapper">
4
+ <div class="ProductsKit__header-info post-full-content">
5
+ <div class="post-content">
6
+ <h1 class="lc_h1">
7
+ {{ productsKit.name }}
8
+ </h1>
9
+ </div>
10
+ </div>
11
+ <div class="ProductsKit__post post-full-content">
12
+ <div
13
+ class="lc_regular14"
14
+ v-html="productsKit.description"></div>
15
+ </div>
16
+ </article>
17
+ <products-kit-options
18
+ class="ProductsKit__options"
19
+ :products-kit="productsKit" />
20
+ <products-kit-cart
21
+ class="ProductsKit__cart"
22
+ :products-kit="productsKit" />
23
+ </div>
24
+ </template>
25
+
26
+ <script>
27
+ import ProductsKitOptions from './products_kit_options/products-kit-options';
28
+ import ProductsKitCart from './products_kit_cart/products-kit-cart';
29
+
30
+ export default {
31
+ name: 'ProductsKit',
32
+ components: {
33
+ ProductsKitOptions,
34
+ ProductsKitCart
35
+ },
36
+ props: {
37
+ productsKit: {
38
+ type: Object,
39
+ required: true
40
+ }
41
+ }
42
+ };
43
+ </script>
44
+
45
+ <style lang="scss">
46
+ @import 'products-kit';
47
+ </style>
@@ -0,0 +1,32 @@
1
+ @import "@/assets/scss/variables";
2
+
3
+ .ProductsKitCart {
4
+ &__wrapper {
5
+ display: flex;
6
+ align-items: center;
7
+ justify-content: space-between;
8
+ }
9
+ &__info,
10
+ &__products {
11
+ display: flex;
12
+ align-items: center;
13
+ }
14
+ &__price {
15
+ font-size: 22px;
16
+ font-weight: bold;
17
+ margin: 0 20px;
18
+ }
19
+ &__qty {
20
+ margin-left: 10px;
21
+ ::v-deep {
22
+ input {
23
+ padding: 14px;
24
+ font-size: 20px;
25
+ width: 150px;
26
+ }
27
+ .NumberInput__side-control {
28
+ width: 30px !important;
29
+ }
30
+ }
31
+ }
32
+ }
@@ -0,0 +1,132 @@
1
+ <template>
2
+ <div class="ProductsKitCart__wrapper">
3
+ <div class="ProductsKitCart__products">
4
+ <products-kit-cart-options :productsKit="productsKit" />
5
+ <div class="ProductsKitCart__qty">
6
+ <number-input
7
+ v-model="kitQty"
8
+ :disabled="addingToCart || !isAllOptionsSelected" />
9
+ </div>
10
+ </div>
11
+ <div class="ProductsKitCart__info">
12
+ <div class="ProductsKitCart__price">
13
+ {{ totalPrice | price }}
14
+ </div>
15
+ <div>
16
+ <btn
17
+ :btn-disabled="addingToCart || !isAllOptionsSelected"
18
+ btn-class="green"
19
+ btn-label="ADD TO CART"
20
+ @onclick="proceedToCard()"/>
21
+ </div>
22
+ </div>
23
+ </div>
24
+ </template>
25
+
26
+ <script>
27
+ import { mapGetters, mapActions } from 'vuex';
28
+ import debounce from 'lodash.debounce';
29
+ import { price } from '@lancom/shared/assets/js/utils/filters';
30
+ import NumberInput from '@lancom/shared/components/common/number_input/number-input';
31
+ import ProductsKitCartOptions from './products_kit_cart_options/products-kit-cart-options';
32
+
33
+
34
+ export default {
35
+ name: 'ProductsKitCart',
36
+ filters: {
37
+ price
38
+ },
39
+ components: {
40
+ ProductsKitCartOptions,
41
+ NumberInput
42
+ },
43
+ data() {
44
+ return {
45
+ addingToCart: false,
46
+ calculateCartPriceWithDebounce: debounce(this.recalculatePricing, 300)
47
+ };
48
+ },
49
+ props: {
50
+ productsKit: {
51
+ type: Object,
52
+ required: true
53
+ }
54
+ },
55
+ computed: {
56
+ ...mapGetters(['shop', 'country', 'currency', 'googleClickId']),
57
+ ...mapGetters('productsKit', [
58
+ 'amount',
59
+ 'isAllOptionsSelected',
60
+ 'maxOrderQty',
61
+ 'selectedOptionsProducts',
62
+ 'selectedSimpleProducts',
63
+ 'productsKitPricing',
64
+ 'cartEntities'
65
+ ]),
66
+ kitQty: {
67
+ get() {
68
+ return this.amount
69
+ },
70
+ set(qty) {
71
+ this.updateAmount(qty);
72
+ }
73
+ },
74
+ totalPrice() {
75
+ return this.productsKitPricing?.totalPrice || 0;
76
+ }
77
+ },
78
+ watch: {
79
+ selectedSimpleProducts() {
80
+ this.calculateCartPriceWithDebounce();
81
+ },
82
+ amount() {
83
+ this.calculateCartPriceWithDebounce();
84
+ }
85
+ },
86
+ methods: {
87
+ ...mapActions('productsKit', [
88
+ 'calculateProductsKitPrice',
89
+ 'clearOptions',
90
+ 'clearProductsKitPricing',
91
+ 'updateAmount'
92
+ ]),
93
+ ...mapActions('cart', ['addToCart']),
94
+ async proceedToCard() {
95
+ if (this.addingToCart || !this.isAllOptionsSelected) {
96
+ return;
97
+ }
98
+ try {
99
+ this.addingToCart = true;
100
+ const data = {
101
+ entities: this.cartEntities,
102
+ shop: this.shop,
103
+ pricing: this.productsKitPricing,
104
+ country: this.country,
105
+ currency: this.currency,
106
+ googleClickId: this.googleClickId
107
+ };
108
+ await this.addToCart(data);
109
+ this.$toastr.s('Products Kit successfully added to cart');
110
+ this.clearOptions();
111
+ this.clearProductsKitPricing();
112
+ } catch (e) {
113
+ console.log(e);
114
+ } finally {
115
+ this.addingToCart = false;
116
+ }
117
+ },
118
+ recalculatePricing() {
119
+ const params = {
120
+ country: this.country,
121
+ currency: this.currency,
122
+ shop: this.shop
123
+ };
124
+ this.calculateProductsKitPrice(params);
125
+ }
126
+ }
127
+ };
128
+ </script>
129
+
130
+ <style lang="scss" scoped>
131
+ @import 'products-kit-cart';
132
+ </style>
@@ -0,0 +1,15 @@
1
+ @import "@/assets/scss/variables";
2
+
3
+ .ProductsKitCartOptions {
4
+ &__wrapper {
5
+ display: flex;
6
+ }
7
+ &__option {
8
+ width: 50px;
9
+ height: 50px;
10
+ margin: 5px;
11
+ border: 1px solid #c1c1c1;
12
+ box-shadow: $elevation1;
13
+ cursor: pointer;
14
+ }
15
+ }
@@ -0,0 +1,31 @@
1
+ <template>
2
+ <div class="ProductsKitCartOptions__wrapper">
3
+ <products-kit-cart-option
4
+ v-for="option in productsKit.options"
5
+ :key="option._id"
6
+ :products-kit="productsKit"
7
+ :option="option"
8
+ class="ProductsKitCartOptions__option" />
9
+ </div>
10
+ </template>
11
+
12
+ <script>
13
+ import ProductsKitCartOption from './products_kit_cart_option/products-kit-cart-option';
14
+
15
+ export default {
16
+ name: 'ProductsKitCartOptions',
17
+ components: {
18
+ ProductsKitCartOption
19
+ },
20
+ props: {
21
+ productsKit: {
22
+ type: Object,
23
+ required: true
24
+ }
25
+ }
26
+ };
27
+ </script>
28
+
29
+ <style lang="scss" scoped>
30
+ @import 'products-kit-cart-options';
31
+ </style>
@@ -0,0 +1,41 @@
1
+ @import "@/assets/scss/variables";
2
+
3
+ .ProductsKitCartOption {
4
+ &__wrapper {
5
+ position: relative;
6
+ margin: 4px;
7
+ }
8
+ &__placeholder,
9
+ &__product {
10
+ position: absolute;
11
+ top: 0;
12
+ right: 0;
13
+ bottom: 0;
14
+ left: 0;
15
+ background-color: white;
16
+ background-size: contain;
17
+ background-repeat: no-repeat;
18
+ background-position: center center;
19
+ }
20
+ &__clear {
21
+ cursor: pointer;
22
+ font-size: 10px;
23
+ padding: 5px 7px;
24
+ border-radius: 50%;
25
+ background-color: rgb(205, 205, 205);
26
+ color: black;
27
+ position: absolute;
28
+ top: -5px;
29
+ right: -5px;
30
+ }
31
+ &__placeholder {
32
+ display: flex;
33
+ align-items: center;
34
+ justify-content: center;
35
+ span {
36
+ font-size: 24px;
37
+ font-weight: bold;
38
+ color: grey;
39
+ }
40
+ }
41
+ }
@@ -0,0 +1,89 @@
1
+ <template>
2
+ <div class="ProductsKitCartOption__wrapper">
3
+ <div
4
+ v-if="selectedSimpleProduct"
5
+ class="ProductsKitCartOption__product"
6
+ :style="productСoverBg"
7
+ @click="scrollToOption()">
8
+ <div
9
+ class="ProductsKitCartOption__clear"
10
+ @click.stop.prevent="unselectOption()">
11
+ x
12
+ </div>
13
+ </div>
14
+ <div
15
+ v-else
16
+ class="ProductsKitCartOption__placeholder"
17
+ @click="scrollToOption()">
18
+ <span>+</span>
19
+ </div>
20
+ </div>
21
+ </template>
22
+
23
+ <script>
24
+ import { getProductMediumCover, getBgStyle } from '@lancom/shared/assets/js/utils/colors';
25
+ import { scrollToElement } from '@lancom/shared/assets/js/utils/scroll';
26
+ import { mapGetters, mapActions } from 'vuex';
27
+
28
+ export default {
29
+ name: 'ProductsKitCartOption',
30
+ props: {
31
+ productsKit: {
32
+ type: Object,
33
+ required: true
34
+ },
35
+ option: {
36
+ type: Object,
37
+ required: true
38
+ }
39
+ },
40
+ computed: {
41
+ ...mapGetters('productsKit', [
42
+ 'selectedOptionsProducts',
43
+ 'selectedOptionsSimpleProducts',
44
+ 'selectedOptionsColors',
45
+ 'selectedOptionsSizes'
46
+ ]),
47
+ selectedColor() {
48
+ return this.selectedOptionsColors[this.option._id];
49
+ },
50
+ selectedSize() {
51
+ return this.selectedOptionsSizes[this.option._id];
52
+ },
53
+ selectedProduct() {
54
+ const selectedProductId = this.selectedOptionsProducts[this.option._id]?._id;
55
+ const product = this.option.products.find(p => p._id === selectedProductId);
56
+ return product;
57
+ },
58
+ selectedSimpleProduct() {
59
+ const simpleProducts = this.selectedOptionsSimpleProducts[this.option._id] || [];
60
+ return simpleProducts.find(sp => {
61
+ const isSameSize = sp.size?._id === this.selectedSize?._id;
62
+ const isSameColor = sp.color?._id === this.selectedColor?._id;
63
+ return isSameSize && isSameColor;
64
+ });
65
+ },
66
+ productСover() {
67
+ return getProductMediumCover(this.selectedProduct, 'front', this.selectedColor);
68
+ },
69
+ productСoverBg() {
70
+ return getBgStyle(this.productСover);
71
+ },
72
+ },
73
+ methods: {
74
+ ...mapActions('productsKit', ['clearOption']),
75
+ unselectOption() {
76
+ const params = { option: this.option };
77
+ this.clearOption(params);
78
+ },
79
+ scrollToOption() {
80
+ console.log('option: ', this.option);
81
+ scrollToElement(`option_${this.option._id}`, 200);
82
+ }
83
+ }
84
+ };
85
+ </script>
86
+
87
+ <style lang="scss" scoped>
88
+ @import 'products-kit-cart-option';
89
+ </style>
@@ -0,0 +1,9 @@
1
+ @import "@/assets/scss/variables";
2
+
3
+ .ProductsKitOptions {
4
+ &__option {
5
+ padding-left: 15px;
6
+ border-left: 3px solid $gray;
7
+ margin-bottom: 20px;
8
+ }
9
+ }
@@ -0,0 +1,32 @@
1
+ <template>
2
+ <div class="ProductsKitOptions__wrapper">
3
+ <products-kit-option
4
+ v-for="option in productsKit.options"
5
+ :key="option._id"
6
+ :products-kit="productsKit"
7
+ :option="option"
8
+ :id="`option_${option._id}`"
9
+ class="ProductsKitOptions__option" />
10
+ </div>
11
+ </template>
12
+
13
+ <script>
14
+ import ProductsKitOption from './products_kit_option/products-kit-option';
15
+
16
+ export default {
17
+ name: 'ProductsKitOptions',
18
+ components: {
19
+ ProductsKitOption
20
+ },
21
+ props: {
22
+ productsKit: {
23
+ type: Object,
24
+ required: true
25
+ }
26
+ }
27
+ };
28
+ </script>
29
+
30
+ <style lang="scss" scoped>
31
+ @import 'products-kit-options';
32
+ </style>
@@ -0,0 +1,36 @@
1
+ <template>
2
+ <div class="ProductsKitOption__wrapper">
3
+ <div class="mb-6">
4
+ <div class="lc_h3">{{ option.name }}</div>
5
+ <div v-html="option.description"></div>
6
+ </div>
7
+ <products-kit-option-products
8
+ :products-kit="productsKit"
9
+ :option="option" />
10
+ </div>
11
+ </template>
12
+
13
+ <script>
14
+ import ProductsKitOptionProducts from './products_kit_option_products/products-kit-option-products';
15
+
16
+ export default {
17
+ name: 'ProductsKitOption',
18
+ components: {
19
+ ProductsKitOptionProducts
20
+ },
21
+ props: {
22
+ productsKit: {
23
+ type: Object,
24
+ required: true
25
+ },
26
+ option: {
27
+ type: Object,
28
+ required: true
29
+ }
30
+ }
31
+ };
32
+ </script>
33
+
34
+ <style lang="scss" scoped>
35
+ @import 'products-kit-option';
36
+ </style>
@@ -0,0 +1,88 @@
1
+ <template>
2
+ <div class="ProductsKitOptionColor__wrapper">
3
+ <multiselect
4
+ v-model="selectedColor"
5
+ value="_id"
6
+ label="name"
7
+ track-by="_id"
8
+ placeholder="Select colour"
9
+ :options="availableColors"
10
+ :allow-empty="false"
11
+ :searchable="false"
12
+ :option-height="60">
13
+ <template #option="{ option }">
14
+ <div class="ProductsKitOptionColor__option">
15
+ <span
16
+ class="ProductsKitOptionColor__option-name">
17
+ {{ option.name }}
18
+ </span>
19
+ <product-color-image
20
+ class="ProductsKitOptionColor__option-preview"
21
+ :color="option" />
22
+ </div>
23
+ </template>
24
+ <template #singleLabel="{ option }">
25
+ <div class="ProductsKitOptionColor__option">
26
+ {{ option.name }}
27
+ </div>
28
+ </template>
29
+ </multiselect>
30
+ </div>
31
+ </template>
32
+
33
+ <script>
34
+ import { mapGetters, mapActions } from 'vuex';
35
+ import Multiselect from 'vue-multiselect';
36
+ import ProductColorImage from '@lancom/shared/components/product/product_color_image/product-color-image';
37
+
38
+ export default {
39
+ name: 'ProductsKitOptionColor',
40
+ components: {
41
+ Multiselect,
42
+ ProductColorImage
43
+ },
44
+ props: {
45
+ productsKit: {
46
+ type: Object,
47
+ required: true
48
+ },
49
+ option: {
50
+ type: Object,
51
+ required: true
52
+ }
53
+ },
54
+ computed: {
55
+ ...mapGetters('productsKit', [
56
+ 'selectedOptionsSimpleProducts',
57
+ 'selectedOptionsColors',
58
+ ]),
59
+ selectedColor: {
60
+ get () {
61
+ return this.selectedOptionsColors[this.option._id];
62
+ },
63
+ set(color) {
64
+ this.selectOptionColor({ option: this.option, color });
65
+ }
66
+ },
67
+ availableColors() {
68
+ const simpleProducts = this.selectedOptionsSimpleProducts[this.option._id] || [];
69
+ const uniqueColorsMap = new Map();
70
+ simpleProducts
71
+ .filter(sp => sp.quantityStock > 0)
72
+ .forEach(sp => {
73
+ if (sp.color && !uniqueColorsMap.has(sp.color._id)) {
74
+ uniqueColorsMap.set(sp.color._id, sp.color);
75
+ }
76
+ });
77
+ return Array.from(uniqueColorsMap.values());
78
+ }
79
+ },
80
+ methods: {
81
+ ...mapActions('productsKit', ['selectOptionColor'])
82
+ }
83
+ };
84
+ </script>
85
+
86
+ <style lang="scss" scoped>
87
+ @import 'products-kit-option-color';
88
+ </style>
@@ -0,0 +1,7 @@
1
+ @import "@/assets/scss/variables";
2
+
3
+ .ProductsKitOptionProducts {
4
+ &__wrapper {
5
+ display: flex;
6
+ }
7
+ }
@@ -0,0 +1,36 @@
1
+ <template>
2
+ <div class="ProductsKitOptionProducts__wrapper">
3
+ <products-kit-option-product
4
+ v-for="product in option.products"
5
+ :key="product._id"
6
+ :products-kit="productsKit"
7
+ :option="option"
8
+ :product="product"
9
+ class="ProductsKitOptionProducts__product" />
10
+ </div>
11
+ </template>
12
+
13
+ <script>
14
+ import ProductsKitOptionProduct from './products_kit_option_product/products-kit-option-product';
15
+
16
+ export default {
17
+ name: 'ProductsKitOptionProducts',
18
+ components: {
19
+ ProductsKitOptionProduct
20
+ },
21
+ props: {
22
+ productsKit: {
23
+ type: Object,
24
+ required: true
25
+ },
26
+ option: {
27
+ type: Object,
28
+ required: true
29
+ }
30
+ }
31
+ };
32
+ </script>
33
+
34
+ <style lang="scss" scoped>
35
+ @import 'products-kit-option-products';
36
+ </style>
@@ -0,0 +1,20 @@
1
+ @import "@/assets/scss/variables";
2
+
3
+ .ProductsKitOptionProduct {
4
+ &__wrapper {
5
+ border: 1px solid $gray;
6
+ &--active {
7
+ border: 1px solid $green;
8
+ }
9
+ }
10
+ &__preview {
11
+ width: 250px;
12
+ height: 490px;
13
+ margin: 0 0 15px 15px;
14
+ position: relative;
15
+ z-index: 1;
16
+ }
17
+ &__select {
18
+ padding: 0 20px 10px 20px;
19
+ }
20
+ }