@lancom/shared 0.0.384 → 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 (45) hide show
  1. package/assets/js/api/admin.js +12 -0
  2. package/assets/js/api/index.js +8 -1
  3. package/assets/js/utils/scroll.js +11 -0
  4. package/components/checkout/cart/cart.vue +26 -1
  5. package/components/checkout/cart/cart_entity/cart-entity.mixin.js +4 -0
  6. package/components/checkout/cart/cart_entity/cart-entity.vue +2 -0
  7. package/components/checkout/cart/cart_entity/cart_entity_color_simple_products/cart-entity-color-simple-products.vue +2 -0
  8. package/components/checkout/cart/cart_products_kit_entity/cart-products-kit-entity.scss +24 -0
  9. package/components/checkout/cart/cart_products_kit_entity/cart-products-kit-entity.vue +66 -0
  10. package/components/common/number_input/number-input.scss +69 -0
  11. package/components/common/number_input/number-input.vue +97 -0
  12. package/components/editor/editor.vue +4 -12
  13. package/components/editor/mobile_editor_product_details/mobile-editor-product-details.vue +2 -10
  14. package/components/products_kit/products_kit/products-kit.scss +54 -0
  15. package/components/products_kit/products_kit/products-kit.vue +47 -0
  16. package/components/products_kit/products_kit/products_kit_cart/products-kit-cart.scss +32 -0
  17. package/components/products_kit/products_kit/products_kit_cart/products-kit-cart.vue +132 -0
  18. package/components/products_kit/products_kit/products_kit_cart/products_kit_cart_options/products-kit-cart-options.scss +15 -0
  19. package/components/products_kit/products_kit/products_kit_cart/products_kit_cart_options/products-kit-cart-options.vue +31 -0
  20. package/components/products_kit/products_kit/products_kit_cart/products_kit_cart_options/products_kit_cart_option/products-kit-cart-option.scss +41 -0
  21. package/components/products_kit/products_kit/products_kit_cart/products_kit_cart_options/products_kit_cart_option/products-kit-cart-option.vue +89 -0
  22. package/components/products_kit/products_kit/products_kit_options/products-kit-options.scss +9 -0
  23. package/components/products_kit/products_kit/products_kit_options/products-kit-options.vue +32 -0
  24. package/components/products_kit/products_kit/products_kit_options/products_kit_option/products-kit-option.scss +1 -0
  25. package/components/products_kit/products_kit/products_kit_options/products_kit_option/products-kit-option.vue +36 -0
  26. package/components/products_kit/products_kit/products_kit_options/products_kit_option/products_kit_option_color/products-kit-option-color.scss +1 -0
  27. package/components/products_kit/products_kit/products_kit_options/products_kit_option/products_kit_option_color/products-kit-option-color.vue +88 -0
  28. package/components/products_kit/products_kit/products_kit_options/products_kit_option/products_kit_option_products/products-kit-option-products.scss +7 -0
  29. package/components/products_kit/products_kit/products_kit_options/products_kit_option/products_kit_option_products/products-kit-option-products.vue +36 -0
  30. 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
  31. 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
  32. package/components/products_kit/products_kit/products_kit_options/products_kit_option/products_kit_option_size/products-kit-option-size.scss +1 -0
  33. package/components/products_kit/products_kit/products_kit_options/products_kit_option/products_kit_option_size/products-kit-option-size.vue +87 -0
  34. package/components/products_kit/products_kits_list/products-kits-list.scss +68 -0
  35. package/components/products_kit/products_kits_list/products-kits-list.vue +50 -0
  36. package/components/products_kit/products_kits_list/products_kits_list_item/products-kits-list-item.scss +84 -0
  37. package/components/products_kit/products_kits_list/products_kits_list_item/products-kits-list-item.vue +52 -0
  38. package/mixins/product-preview.js +6 -0
  39. package/package.json +1 -1
  40. package/pages/contact.vue +54 -0
  41. package/pages/products-kit/_alias.vue +103 -0
  42. package/pages/products-kit/index.vue +59 -0
  43. package/routes/index.js +15 -0
  44. package/store/cart.js +1 -1
  45. 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>
@@ -105,6 +105,12 @@ const productPreview = {
105
105
  this.loadHolder.canLoadColorImages = true;
106
106
  }, 3000);
107
107
  }
108
+ },
109
+ methods: {
110
+ updateCurrentColor(color) {
111
+ this.currentColor = color;
112
+ this.$emit('color', color);
113
+ }
108
114
  }
109
115
  };
110
116
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lancom/shared",
3
- "version": "0.0.384",
3
+ "version": "0.0.385",
4
4
  "description": "lancom common scripts",
5
5
  "author": "e.tokovenko <e.tokovenko@gmail.com>",
6
6
  "repository": {
@@ -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
  }
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) {