@lancom/shared 0.0.384 → 0.0.386
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/admin.js +12 -0
- package/assets/js/api/index.js +8 -1
- package/assets/js/utils/scroll.js +11 -0
- package/components/checkout/cart/cart.vue +26 -1
- package/components/checkout/cart/cart_entity/cart-entity.mixin.js +4 -0
- package/components/checkout/cart/cart_entity/cart-entity.vue +2 -0
- package/components/checkout/cart/cart_entity/cart_entity_color_simple_products/cart-entity-color-simple-products.vue +2 -0
- package/components/checkout/cart/cart_products_kit_entity/cart-products-kit-entity.scss +24 -0
- package/components/checkout/cart/cart_products_kit_entity/cart-products-kit-entity.vue +66 -0
- package/components/common/number_input/number-input.scss +69 -0
- package/components/common/number_input/number-input.vue +97 -0
- package/components/editor/editor.vue +4 -12
- package/components/editor/mobile_editor_product_details/mobile-editor-product-details.vue +2 -10
- package/components/products_kit/products_kit/products-kit.scss +54 -0
- package/components/products_kit/products_kit/products-kit.vue +47 -0
- package/components/products_kit/products_kit/products_kit_cart/products-kit-cart.scss +32 -0
- package/components/products_kit/products_kit/products_kit_cart/products-kit-cart.vue +132 -0
- package/components/products_kit/products_kit/products_kit_cart/products_kit_cart_options/products-kit-cart-options.scss +15 -0
- package/components/products_kit/products_kit/products_kit_cart/products_kit_cart_options/products-kit-cart-options.vue +31 -0
- package/components/products_kit/products_kit/products_kit_cart/products_kit_cart_options/products_kit_cart_option/products-kit-cart-option.scss +41 -0
- package/components/products_kit/products_kit/products_kit_cart/products_kit_cart_options/products_kit_cart_option/products-kit-cart-option.vue +89 -0
- package/components/products_kit/products_kit/products_kit_options/products-kit-options.scss +9 -0
- package/components/products_kit/products_kit/products_kit_options/products-kit-options.vue +32 -0
- package/components/products_kit/products_kit/products_kit_options/products_kit_option/products-kit-option.scss +1 -0
- package/components/products_kit/products_kit/products_kit_options/products_kit_option/products-kit-option.vue +36 -0
- package/components/products_kit/products_kit/products_kit_options/products_kit_option/products_kit_option_color/products-kit-option-color.scss +1 -0
- package/components/products_kit/products_kit/products_kit_options/products_kit_option/products_kit_option_color/products-kit-option-color.vue +88 -0
- package/components/products_kit/products_kit/products_kit_options/products_kit_option/products_kit_option_products/products-kit-option-products.scss +7 -0
- package/components/products_kit/products_kit/products_kit_options/products_kit_option/products_kit_option_products/products-kit-option-products.vue +36 -0
- 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
- 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
- package/components/products_kit/products_kit/products_kit_options/products_kit_option/products_kit_option_size/products-kit-option-size.scss +1 -0
- package/components/products_kit/products_kit/products_kit_options/products_kit_option/products_kit_option_size/products-kit-option-size.vue +87 -0
- package/components/products_kit/products_kits_list/products-kits-list.scss +68 -0
- package/components/products_kit/products_kits_list/products-kits-list.vue +50 -0
- package/components/products_kit/products_kits_list/products_kits_list_item/products-kits-list-item.scss +84 -0
- package/components/products_kit/products_kits_list/products_kits_list_item/products-kits-list-item.vue +52 -0
- package/mixins/product-preview.js +6 -0
- package/package.json +1 -1
- package/pages/contact.vue +54 -0
- package/pages/products-kit/_alias.vue +103 -0
- package/pages/products-kit/index.vue +59 -0
- package/routes/index.js +15 -0
- package/server-middleware/robots.js +2 -1
- package/store/cart.js +1 -1
- package/store/productsKit.js +175 -0
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
<template>
|
|
2
|
+
<div class="ProductsKitOptionSize__wrapper">
|
|
3
|
+
<multiselect
|
|
4
|
+
v-model="selectedSize"
|
|
5
|
+
value="_id"
|
|
6
|
+
label="shortName"
|
|
7
|
+
track-by="_id"
|
|
8
|
+
placeholder="Select size"
|
|
9
|
+
:options="availableSizes"
|
|
10
|
+
:allow-empty="false"
|
|
11
|
+
:searchable="false"
|
|
12
|
+
:option-height="60">
|
|
13
|
+
<template #option="{ option }">
|
|
14
|
+
<div class="ProductsKitOptionSize__option">
|
|
15
|
+
<span class="ProductsKitOptionSize__option-name">
|
|
16
|
+
{{ option.shortName }}
|
|
17
|
+
</span>
|
|
18
|
+
</div>
|
|
19
|
+
</template>
|
|
20
|
+
<template #singleLabel="{ option }">
|
|
21
|
+
<div class="ProductsKitOptionSize__option">
|
|
22
|
+
{{ option.shortName }}
|
|
23
|
+
</div>
|
|
24
|
+
</template>
|
|
25
|
+
</multiselect>
|
|
26
|
+
</div>
|
|
27
|
+
</template>
|
|
28
|
+
|
|
29
|
+
<script>
|
|
30
|
+
import { mapGetters, mapActions } from 'vuex';
|
|
31
|
+
import Multiselect from 'vue-multiselect';
|
|
32
|
+
|
|
33
|
+
export default {
|
|
34
|
+
name: 'ProductsKitOptionSize',
|
|
35
|
+
components: {
|
|
36
|
+
Multiselect
|
|
37
|
+
},
|
|
38
|
+
props: {
|
|
39
|
+
productsKit: {
|
|
40
|
+
type: Object,
|
|
41
|
+
required: true
|
|
42
|
+
},
|
|
43
|
+
option: {
|
|
44
|
+
type: Object,
|
|
45
|
+
required: true
|
|
46
|
+
}
|
|
47
|
+
},
|
|
48
|
+
computed: {
|
|
49
|
+
...mapGetters('productsKit', [
|
|
50
|
+
'selectedOptionsSimpleProducts',
|
|
51
|
+
'selectedOptionsColors',
|
|
52
|
+
'selectedOptionsSizes',
|
|
53
|
+
]),
|
|
54
|
+
selectedColor() {
|
|
55
|
+
return this.selectedOptionsColors[this.option._id];
|
|
56
|
+
},
|
|
57
|
+
selectedSize: {
|
|
58
|
+
get () {
|
|
59
|
+
return this.selectedOptionsSizes[this.option._id];
|
|
60
|
+
},
|
|
61
|
+
set(size) {
|
|
62
|
+
this.selectOptionSize({ option: this.option, size });
|
|
63
|
+
}
|
|
64
|
+
},
|
|
65
|
+
availableSizes() {
|
|
66
|
+
const simpleProducts = this.selectedOptionsSimpleProducts[this.option._id] || [];
|
|
67
|
+
const uniqueSizesMap = new Map();
|
|
68
|
+
simpleProducts
|
|
69
|
+
.filter(sp => sp.quantityStock > 0)
|
|
70
|
+
.forEach(({ size, color }) => {
|
|
71
|
+
const isSameColor = color?._id === this.selectedColor?._id;
|
|
72
|
+
if (size && isSameColor && !uniqueSizesMap.has(size._id)) {
|
|
73
|
+
uniqueSizesMap.set(size._id, size);
|
|
74
|
+
}
|
|
75
|
+
});
|
|
76
|
+
return Array.from(uniqueSizesMap.values());
|
|
77
|
+
}
|
|
78
|
+
},
|
|
79
|
+
methods: {
|
|
80
|
+
...mapActions('productsKit', ['selectOptionSize'])
|
|
81
|
+
}
|
|
82
|
+
};
|
|
83
|
+
</script>
|
|
84
|
+
|
|
85
|
+
<style lang="scss" scoped>
|
|
86
|
+
@import 'products-kit-option-size';
|
|
87
|
+
</style>
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
@import "@/assets/scss/variables";
|
|
2
|
+
|
|
3
|
+
.ProductKitsList {
|
|
4
|
+
&__wrapper {
|
|
5
|
+
display: flex;
|
|
6
|
+
flex-wrap: wrap;
|
|
7
|
+
margin-bottom: 20px;
|
|
8
|
+
}
|
|
9
|
+
&__item {
|
|
10
|
+
width: calc(50% - 30px);
|
|
11
|
+
@media (max-width: $bp-extra-small-max) {
|
|
12
|
+
width: 100%
|
|
13
|
+
}
|
|
14
|
+
margin: 15px;
|
|
15
|
+
height: 300px;
|
|
16
|
+
|
|
17
|
+
&--large {
|
|
18
|
+
width: 100%;
|
|
19
|
+
height: 500px;
|
|
20
|
+
@media (max-width: $bp-extra-small-max) {
|
|
21
|
+
height: 300px;
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
.VuePagination {
|
|
29
|
+
&__pagination {
|
|
30
|
+
display: flex;
|
|
31
|
+
justify-content: center;
|
|
32
|
+
&-item {
|
|
33
|
+
font-size: 16px;
|
|
34
|
+
line-height: 170%;
|
|
35
|
+
color: $black;
|
|
36
|
+
width: 50px;
|
|
37
|
+
height: 50px;
|
|
38
|
+
display: flex;
|
|
39
|
+
align-items: center;
|
|
40
|
+
justify-content: center;
|
|
41
|
+
border: 1px solid $grey_3;
|
|
42
|
+
border-radius: 4px;
|
|
43
|
+
margin: 0 3px;
|
|
44
|
+
a {
|
|
45
|
+
display: block;
|
|
46
|
+
width: 100%;
|
|
47
|
+
height: 100%;
|
|
48
|
+
text-align: center;
|
|
49
|
+
padding-top: 11px;
|
|
50
|
+
cursor: pointer;
|
|
51
|
+
&:hover {
|
|
52
|
+
background-color: $grey_3;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
&.active {
|
|
56
|
+
background-color: $black;
|
|
57
|
+
color: white;
|
|
58
|
+
}
|
|
59
|
+
&.disabled {
|
|
60
|
+
pointer-events: none;
|
|
61
|
+
opacity: .5;
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
&__count {
|
|
66
|
+
display: none;
|
|
67
|
+
}
|
|
68
|
+
}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
<template>
|
|
2
|
+
<div>
|
|
3
|
+
<div class="ProductKitsList__wrapper">
|
|
4
|
+
<div
|
|
5
|
+
v-for="(item) in productsKits"
|
|
6
|
+
:key="item._id"
|
|
7
|
+
class="ProductKitsList__item">
|
|
8
|
+
<transition appear>
|
|
9
|
+
<products-kits-list-item :item="item" class="elevation2" />
|
|
10
|
+
</transition>
|
|
11
|
+
</div>
|
|
12
|
+
</div>
|
|
13
|
+
<pagination
|
|
14
|
+
v-if="count > perPage"
|
|
15
|
+
:itemsCount="count"
|
|
16
|
+
:itemsPerPage="perPage" />
|
|
17
|
+
</div>
|
|
18
|
+
</template>
|
|
19
|
+
|
|
20
|
+
<script>
|
|
21
|
+
import Pagination from '@lancom/shared/components/common/pagination';
|
|
22
|
+
import ProductsKitsListItem from './products_kits_list_item/products-kits-list-item';
|
|
23
|
+
|
|
24
|
+
export default {
|
|
25
|
+
name: 'ProductKitsList',
|
|
26
|
+
components: {
|
|
27
|
+
ProductsKitsListItem,
|
|
28
|
+
Pagination
|
|
29
|
+
},
|
|
30
|
+
props: {
|
|
31
|
+
productsKits: {
|
|
32
|
+
type: Array,
|
|
33
|
+
required: true
|
|
34
|
+
},
|
|
35
|
+
count: {
|
|
36
|
+
type: Number
|
|
37
|
+
},
|
|
38
|
+
perPage: {
|
|
39
|
+
type: Number
|
|
40
|
+
},
|
|
41
|
+
page: {
|
|
42
|
+
type: Number
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
};
|
|
46
|
+
</script>
|
|
47
|
+
|
|
48
|
+
<style lang="scss">
|
|
49
|
+
@import 'products-kits-list';
|
|
50
|
+
</style>
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
@import "@/assets/scss/variables";
|
|
2
|
+
|
|
3
|
+
.ProductsKitsListItem {
|
|
4
|
+
&__wrapper {
|
|
5
|
+
background-repeat: no-repeat;
|
|
6
|
+
background-size: cover;
|
|
7
|
+
background-position: center;
|
|
8
|
+
background-color: $black_medium_emphasis;
|
|
9
|
+
position: relative;
|
|
10
|
+
height: 100%;
|
|
11
|
+
}
|
|
12
|
+
&__info {
|
|
13
|
+
position: absolute;
|
|
14
|
+
top: 30px;
|
|
15
|
+
left: 30px;
|
|
16
|
+
right: 30px;
|
|
17
|
+
}
|
|
18
|
+
&__link {
|
|
19
|
+
color: white;
|
|
20
|
+
font-size: 30px;
|
|
21
|
+
font-weight: 800;
|
|
22
|
+
@media (max-width: $bp-extra-small-max) {
|
|
23
|
+
font-size: 25px;
|
|
24
|
+
}
|
|
25
|
+
&:hover {
|
|
26
|
+
text-decoration: none;
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
&__text {
|
|
30
|
+
margin-top: 10px;
|
|
31
|
+
color: white;
|
|
32
|
+
line-height: 150%;;
|
|
33
|
+
}
|
|
34
|
+
&__date {
|
|
35
|
+
color: #e8e8e8;
|
|
36
|
+
margin-top: 7px;
|
|
37
|
+
font-size: 11px;
|
|
38
|
+
}
|
|
39
|
+
&__more {
|
|
40
|
+
position: absolute;
|
|
41
|
+
bottom: 30px;
|
|
42
|
+
left: 30px;
|
|
43
|
+
padding: 10px;
|
|
44
|
+
border-width: 1px;
|
|
45
|
+
border-style: solid;
|
|
46
|
+
border-color: white;
|
|
47
|
+
color: white;
|
|
48
|
+
text-decoration: none;
|
|
49
|
+
text-transform: uppercase;
|
|
50
|
+
transition: border-color 0.3s;
|
|
51
|
+
font-size: 13px;
|
|
52
|
+
font-weight: 800;
|
|
53
|
+
&>span {
|
|
54
|
+
position: relative;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
&::before {
|
|
58
|
+
content: ' ';
|
|
59
|
+
position: absolute;
|
|
60
|
+
top: 0;
|
|
61
|
+
right: 0;
|
|
62
|
+
bottom: 0;
|
|
63
|
+
left: 0;
|
|
64
|
+
opacity: 0;
|
|
65
|
+
background-color: $green;
|
|
66
|
+
transition: opacity 0.3s;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
&:hover {
|
|
70
|
+
border-color: $green;
|
|
71
|
+
&::before {
|
|
72
|
+
opacity: 1;
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
&__overlay {
|
|
77
|
+
position: absolute;
|
|
78
|
+
top: 0;
|
|
79
|
+
right: 0;
|
|
80
|
+
bottom: 0;
|
|
81
|
+
left: 0;
|
|
82
|
+
cursor: pointer;
|
|
83
|
+
}
|
|
84
|
+
}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
<template>
|
|
2
|
+
<article
|
|
3
|
+
class="ProductsKitsListItem__wrapper"
|
|
4
|
+
:style="{ backgroundImage }">
|
|
5
|
+
<a
|
|
6
|
+
class="ProductsKitsListItem__overlay"
|
|
7
|
+
:href="linkToProductsKit"
|
|
8
|
+
:title="item.name"></a>
|
|
9
|
+
<div class="ProductsKitsListItem__info">
|
|
10
|
+
<h3>
|
|
11
|
+
<a
|
|
12
|
+
:href="linkToProductsKit"
|
|
13
|
+
class="ProductsKitsListItem__link"
|
|
14
|
+
:title="item.name"
|
|
15
|
+
:style="{ color: item.color }">
|
|
16
|
+
{{ item.name }}
|
|
17
|
+
</a>
|
|
18
|
+
</h3>
|
|
19
|
+
</div>
|
|
20
|
+
</article>
|
|
21
|
+
</template>
|
|
22
|
+
|
|
23
|
+
<script>
|
|
24
|
+
import { staticLink } from '@lancom/shared/assets/js/utils/filters';
|
|
25
|
+
|
|
26
|
+
export default {
|
|
27
|
+
name: 'ProductsKitsListItem',
|
|
28
|
+
props: {
|
|
29
|
+
item: {
|
|
30
|
+
type: Object,
|
|
31
|
+
required: true
|
|
32
|
+
}
|
|
33
|
+
},
|
|
34
|
+
computed: {
|
|
35
|
+
linkToProductsKit() {
|
|
36
|
+
return `/products-kit/${this.item.alias}`;
|
|
37
|
+
},
|
|
38
|
+
backgroundImage() {
|
|
39
|
+
return this.item.image ? `url('${staticLink(this.item.image.medium)}')` : '';
|
|
40
|
+
}
|
|
41
|
+
},
|
|
42
|
+
methods: {
|
|
43
|
+
goToNews() {
|
|
44
|
+
this.$router.push(this.linkToNews);
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
};
|
|
48
|
+
</script>
|
|
49
|
+
|
|
50
|
+
<style lang="scss" scoped>
|
|
51
|
+
@import 'products-kits-list-item';
|
|
52
|
+
</style>
|
package/package.json
CHANGED
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
<template>
|
|
2
|
+
<div class="ContactPage__wrapper">
|
|
3
|
+
<div class="content-inner">
|
|
4
|
+
<breadcrumbs :items="breadcrumbs" />
|
|
5
|
+
<div class="row">
|
|
6
|
+
<div class="col-sm-5 col-12">
|
|
7
|
+
<contact-us />
|
|
8
|
+
</div>
|
|
9
|
+
<div class="col-sm-7 col-12">
|
|
10
|
+
<iframe
|
|
11
|
+
v-if="contacts.googleMapIframeSrc"
|
|
12
|
+
:src="contacts.googleMapIframeSrc"
|
|
13
|
+
width="100%"
|
|
14
|
+
height="100%"
|
|
15
|
+
style="border:0;"
|
|
16
|
+
loading="lazy">
|
|
17
|
+
</iframe>
|
|
18
|
+
</div>
|
|
19
|
+
</div>
|
|
20
|
+
</div>
|
|
21
|
+
</div>
|
|
22
|
+
</template>
|
|
23
|
+
|
|
24
|
+
<script>
|
|
25
|
+
import { mapGetters } from 'vuex';
|
|
26
|
+
import metaInfo from '@lancom/shared/mixins/meta-info';
|
|
27
|
+
|
|
28
|
+
export default {
|
|
29
|
+
name: 'ContactPage',
|
|
30
|
+
components: {
|
|
31
|
+
Breadcrumbs: () => import('@lancom/shared/components/common/breadcrumbs/breadcrumbs'),
|
|
32
|
+
ContactUs: () => import('@lancom/shared/components/asides/contact_us/contact-us')
|
|
33
|
+
},
|
|
34
|
+
mixins: [metaInfo],
|
|
35
|
+
data() {
|
|
36
|
+
return {
|
|
37
|
+
breadcrumbs: [{
|
|
38
|
+
text: 'Contact'
|
|
39
|
+
}]
|
|
40
|
+
};
|
|
41
|
+
},
|
|
42
|
+
computed: {
|
|
43
|
+
...mapGetters(['contacts'])
|
|
44
|
+
}
|
|
45
|
+
};
|
|
46
|
+
</script>
|
|
47
|
+
|
|
48
|
+
<style lang="scss" scoped>
|
|
49
|
+
.ContactPage{
|
|
50
|
+
&__wrapper {
|
|
51
|
+
padding: 30px 0;
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
</style>
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
<template>
|
|
2
|
+
<div class="ProductsKitPage__wrapper">
|
|
3
|
+
<breadcrumbs :items="breadcrumbs" />
|
|
4
|
+
<transition name="from-right-to-left" appear>
|
|
5
|
+
<products-kit :products-kit="productsKit" />
|
|
6
|
+
</transition>
|
|
7
|
+
<transition
|
|
8
|
+
v-if="hasProductsKitsList"
|
|
9
|
+
name="from-left-to-right"
|
|
10
|
+
appear>
|
|
11
|
+
<div class="content-inner">
|
|
12
|
+
<h2 class="lc_h2 lc_black ProductsKitPage__list-title">
|
|
13
|
+
You might also like
|
|
14
|
+
</h2>
|
|
15
|
+
<products-kits-list
|
|
16
|
+
class="ProductsKitPage__list"
|
|
17
|
+
:productsKits="productsKitsList" />
|
|
18
|
+
</div>
|
|
19
|
+
</transition>
|
|
20
|
+
</div>
|
|
21
|
+
</template>
|
|
22
|
+
<script>
|
|
23
|
+
import metaInfo from '@lancom/shared/mixins/meta-info';
|
|
24
|
+
|
|
25
|
+
export default {
|
|
26
|
+
name: 'ProductsKitPage',
|
|
27
|
+
components: {
|
|
28
|
+
Breadcrumbs: () => import('@lancom/shared/components/common/breadcrumbs/breadcrumbs'),
|
|
29
|
+
ProductsKit: () => import('@lancom/shared/components/products_kit/products_kit/products-kit'),
|
|
30
|
+
ProductsKitsList: () => import('@lancom/shared/components/products_kit/products_kits_list/products-kits-list')
|
|
31
|
+
},
|
|
32
|
+
mixins: [metaInfo],
|
|
33
|
+
async asyncData({ params, store, error, redirect }) {
|
|
34
|
+
console.log('asyncData: ', 1);
|
|
35
|
+
try {
|
|
36
|
+
const { shop, country, currency } = store.getters;
|
|
37
|
+
const data = {
|
|
38
|
+
shop: shop._id,
|
|
39
|
+
alias: params.alias,
|
|
40
|
+
country: country?._id,
|
|
41
|
+
currency: currency?._id
|
|
42
|
+
};
|
|
43
|
+
await store.dispatch('productsKit/fetchProductsKit', data);
|
|
44
|
+
} catch (e) {
|
|
45
|
+
console.log(e);
|
|
46
|
+
}
|
|
47
|
+
const productsKit = store.getters['productsKit/productsKit'];
|
|
48
|
+
const loadError = store.getters['productsKit/loadError'];
|
|
49
|
+
|
|
50
|
+
// console.log('loadError: ', loadError);
|
|
51
|
+
if (loadError?.redirectLink) {
|
|
52
|
+
return redirect(301, loadError?.redirectLink);
|
|
53
|
+
} else if (loadError) {
|
|
54
|
+
error(loadError);
|
|
55
|
+
}
|
|
56
|
+
return {
|
|
57
|
+
productsKit
|
|
58
|
+
};
|
|
59
|
+
},
|
|
60
|
+
data() {
|
|
61
|
+
return {
|
|
62
|
+
productsKit: null,
|
|
63
|
+
productsKits: []
|
|
64
|
+
};
|
|
65
|
+
},
|
|
66
|
+
computed: {
|
|
67
|
+
hasProductsKitsList() {
|
|
68
|
+
return this.productsKitsList.length > 0;
|
|
69
|
+
},
|
|
70
|
+
productsKitsList() {
|
|
71
|
+
return this.productsKits.filter(i => i.alias !== this.productsKit.alias).slice(0, 3);
|
|
72
|
+
},
|
|
73
|
+
breadcrumbs() {
|
|
74
|
+
const item = this.productsKit ? { text: this.productsKit.name } : null;
|
|
75
|
+
return [{
|
|
76
|
+
to: '/products-kits',
|
|
77
|
+
text: 'Products Kits'
|
|
78
|
+
}, item].filter(i => !!i);
|
|
79
|
+
},
|
|
80
|
+
pageItemType() {
|
|
81
|
+
return 'products-kits';
|
|
82
|
+
}
|
|
83
|
+
},
|
|
84
|
+
getRoute() {
|
|
85
|
+
return '/shop/:shop/products-kits/:alias';
|
|
86
|
+
}
|
|
87
|
+
};
|
|
88
|
+
</script>
|
|
89
|
+
|
|
90
|
+
<style lang="scss" scoped>
|
|
91
|
+
.ProductsKitPage{
|
|
92
|
+
&__wrapper {
|
|
93
|
+
margin-top: 30px;
|
|
94
|
+
}
|
|
95
|
+
&__list-title {
|
|
96
|
+
margin-top: 20px;
|
|
97
|
+
text-align: center;
|
|
98
|
+
}
|
|
99
|
+
&__list {
|
|
100
|
+
padding: 20px 0;
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
</style>
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
<template>
|
|
2
|
+
<div class="ProductsKitsPage__wrapper view-transition">
|
|
3
|
+
<div class="content-inner">
|
|
4
|
+
<breadcrumbs :items="breadcrumbs" />
|
|
5
|
+
<products-kits-list
|
|
6
|
+
class="ProductsKitsPage__list"
|
|
7
|
+
:products-kits="productsKits"
|
|
8
|
+
:count="count"
|
|
9
|
+
:page="page"
|
|
10
|
+
:per-page="perPage" />
|
|
11
|
+
</div>
|
|
12
|
+
</div>
|
|
13
|
+
</template>
|
|
14
|
+
|
|
15
|
+
<script>
|
|
16
|
+
import metaInfo from '@lancom/shared/mixins/meta-info';
|
|
17
|
+
import api from '@lancom/shared/assets/js/api';
|
|
18
|
+
|
|
19
|
+
const KITS_PER_PAGE = 18;
|
|
20
|
+
|
|
21
|
+
export default {
|
|
22
|
+
name: 'ProductPage',
|
|
23
|
+
components: {
|
|
24
|
+
Breadcrumbs: () => import('@lancom/shared/components/common/breadcrumbs/breadcrumbs'),
|
|
25
|
+
ProductsKitsList: () => import('@lancom/shared/components/products_kit/products_kits_list/products-kits-list')
|
|
26
|
+
},
|
|
27
|
+
mixins: [metaInfo],
|
|
28
|
+
async asyncData({ store, params, query }) {
|
|
29
|
+
const { _id } = store.getters.shop;
|
|
30
|
+
const kitsQuery = { ...params, ...query, limit: KITS_PER_PAGE };
|
|
31
|
+
const { productsKits, count, page, perPage } = await api.fetchProductsKits(_id, kitsQuery);
|
|
32
|
+
return { productsKits, count, page, perPage };
|
|
33
|
+
},
|
|
34
|
+
data() {
|
|
35
|
+
return {
|
|
36
|
+
productsKits: [],
|
|
37
|
+
count: null,
|
|
38
|
+
page: null,
|
|
39
|
+
perPage: null,
|
|
40
|
+
breadcrumbs: [{
|
|
41
|
+
text: 'Products Kits'
|
|
42
|
+
}]
|
|
43
|
+
};
|
|
44
|
+
},
|
|
45
|
+
computed: {
|
|
46
|
+
pageItemType() {
|
|
47
|
+
return 'products-kits';
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
};
|
|
51
|
+
</script>
|
|
52
|
+
|
|
53
|
+
<style lang="scss" scoped>
|
|
54
|
+
.ProductsKitsPage {
|
|
55
|
+
&__wrapper {
|
|
56
|
+
padding: 30px 0;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
</style>
|
package/routes/index.js
CHANGED
|
@@ -169,5 +169,20 @@ module.exports = function(routes, resolve) {
|
|
|
169
169
|
path: '/news/tag/:tag',
|
|
170
170
|
component: resolve('@lancom/shared/pages/news/tag/_tag.vue'),
|
|
171
171
|
chunkName: 'pages/news/tag'
|
|
172
|
+
}, {
|
|
173
|
+
name: 'products-kits',
|
|
174
|
+
path: '/products-kits',
|
|
175
|
+
component: resolve('@lancom/shared/pages/products-kit/index.vue'),
|
|
176
|
+
chunkName: 'pages/products-kits'
|
|
177
|
+
}, {
|
|
178
|
+
name: 'products-kit-view',
|
|
179
|
+
path: '/products-kit/:alias',
|
|
180
|
+
component: resolve('@lancom/shared/pages/products-kit/_alias.vue'),
|
|
181
|
+
chunkName: 'pages/products-kit/products-kit-view'
|
|
182
|
+
}, {
|
|
183
|
+
name: 'contact',
|
|
184
|
+
path: '/contact',
|
|
185
|
+
component: resolve('@lancom/shared/pages/contact.vue'),
|
|
186
|
+
chunkName: 'pages/contact'
|
|
172
187
|
}];
|
|
173
188
|
}
|
|
@@ -6,7 +6,8 @@ const robots = fs.readFileSync(filePath);
|
|
|
6
6
|
|
|
7
7
|
module.exports = function (req, res, next) {
|
|
8
8
|
if (req.url === '/robots.txt') {
|
|
9
|
-
|
|
9
|
+
const isDeny = ['www1', 'dev.', 'dev1.'].some(key => req.headers.host?.includes(key));
|
|
10
|
+
if (isDeny && !req.headers['X-PULL'] && !req.headers['x-pull']) {
|
|
10
11
|
res.setHeader('Content-Type', 'text/plain');
|
|
11
12
|
res.end('User-agent: *\nDisallow: /');
|
|
12
13
|
return;
|
package/store/cart.js
CHANGED
|
@@ -134,7 +134,7 @@ export const actions = {
|
|
|
134
134
|
const cartEntities = state.id ? (await api.fetchCartById(shop._id, state.id, params)).entities : state.entities;
|
|
135
135
|
entities = entities.map(e => {
|
|
136
136
|
const entitiy = cartEntities.find(e2 => isSamePrints(e, e2) && e2?.product?._id === e?.product?._id);
|
|
137
|
-
if (entitiy) {
|
|
137
|
+
if (!e.productsKit && entitiy) {
|
|
138
138
|
e.simpleProducts.forEach(sp => {
|
|
139
139
|
const simpleProduct = entitiy.simpleProducts.find(sp2 => sp2.SKU === sp.SKU);
|
|
140
140
|
if (!simpleProduct) {
|