@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.
- 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/store/cart.js +1 -1
- package/store/productsKit.js +175 -0
|
@@ -0,0 +1,175 @@
|
|
|
1
|
+
import api from '@lancom/shared/assets/js/api';
|
|
2
|
+
import { getProductsForCalculatePricing } from '@lancom/shared/assets/js/utils/product';
|
|
3
|
+
import { generateCartProducts } from '@lancom/shared/assets/js/utils/product';
|
|
4
|
+
import { generateGUID } from '@lancom/shared/assets/js/utils/guid';
|
|
5
|
+
import Vue from 'vue';
|
|
6
|
+
|
|
7
|
+
export const state = () => ({
|
|
8
|
+
amount: 1,
|
|
9
|
+
productsKit: null,
|
|
10
|
+
loadError: null,
|
|
11
|
+
selectedOptionsProducts: {},
|
|
12
|
+
selectedOptionsSimpleProducts: {},
|
|
13
|
+
selectedOptionsColors: {},
|
|
14
|
+
selectedOptionsSizes: {},
|
|
15
|
+
calculatingPrice: false,
|
|
16
|
+
productsKitPricing: null
|
|
17
|
+
});
|
|
18
|
+
|
|
19
|
+
function getSelectedSimpleProducts(selectedOptionsSimpleProducts, selectedOptionsColors, selectedOptionsSizes, optionId) {
|
|
20
|
+
const simpleProducts = Object
|
|
21
|
+
.keys(selectedOptionsSizes)
|
|
22
|
+
.filter(key => !optionId || key === optionId)
|
|
23
|
+
.map(key => {
|
|
24
|
+
const simpleProducts = selectedOptionsSimpleProducts[key] || [];
|
|
25
|
+
const color = selectedOptionsColors[key];
|
|
26
|
+
const size = selectedOptionsSizes[key];
|
|
27
|
+
return simpleProducts.find(sp => sp.color?._id === color?._id && sp.size?._id === size?._id)
|
|
28
|
+
})
|
|
29
|
+
.filter(sp => !!sp);
|
|
30
|
+
return simpleProducts;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
export const getters = {
|
|
34
|
+
productsKit: ({ productsKit }) => productsKit,
|
|
35
|
+
loadError: ({ loadError }) => loadError,
|
|
36
|
+
amount: ({ amount }) => amount,
|
|
37
|
+
productsKitPricing: ({ productsKitPricing }) => productsKitPricing,
|
|
38
|
+
selectedOptionsProducts: ({ selectedOptionsProducts }) => selectedOptionsProducts,
|
|
39
|
+
selectedOptionsSimpleProducts: ({ selectedOptionsSimpleProducts }) => selectedOptionsSimpleProducts,
|
|
40
|
+
selectedOptionsColors: ({ selectedOptionsColors }) => selectedOptionsColors,
|
|
41
|
+
selectedOptionsSizes: ({ selectedOptionsSizes }) => selectedOptionsSizes,
|
|
42
|
+
isAllOptionsSelected: ({ productsKit, selectedOptionsSimpleProducts, selectedOptionsColors, selectedOptionsSizes }) => {
|
|
43
|
+
const selectedSimpleProducts = getSelectedSimpleProducts(selectedOptionsSimpleProducts, selectedOptionsColors, selectedOptionsSizes);
|
|
44
|
+
return productsKit.options?.length === selectedSimpleProducts?.length;
|
|
45
|
+
},
|
|
46
|
+
selectedSimpleProducts: ({ selectedOptionsSimpleProducts, selectedOptionsColors, selectedOptionsSizes }) => getSelectedSimpleProducts(selectedOptionsSimpleProducts, selectedOptionsColors, selectedOptionsSizes),
|
|
47
|
+
maxOrderQty: ({ selectedOptionsSimpleProducts, selectedOptionsColors, selectedOptionsSizes }) => {
|
|
48
|
+
const selectedSimpleProducts = getSelectedSimpleProducts(selectedOptionsSimpleProducts, selectedOptionsColors, selectedOptionsSizes);
|
|
49
|
+
const qtyStocks = selectedSimpleProducts
|
|
50
|
+
.map(sp => sp.quantityStock || 0)
|
|
51
|
+
.filter(qty => !!qty);
|
|
52
|
+
return qtyStocks.length ? Math.min(...qtyStocks) : 0;
|
|
53
|
+
},
|
|
54
|
+
cartEntities: ({ amount, productsKit, selectedOptionsProducts, selectedOptionsSimpleProducts, selectedOptionsColors, selectedOptionsSizes }) => {
|
|
55
|
+
const productsKitGuid = generateGUID();
|
|
56
|
+
const entities = productsKit.options
|
|
57
|
+
.map(option => {
|
|
58
|
+
const product = selectedOptionsProducts[option._id];
|
|
59
|
+
if (product) {
|
|
60
|
+
const selectedSimpleProducts = getSelectedSimpleProducts(selectedOptionsSimpleProducts, selectedOptionsColors, selectedOptionsSizes, option._id);
|
|
61
|
+
const simpleProducts = selectedSimpleProducts.map(sp => ({ ...sp, amount }));
|
|
62
|
+
const [entity] = generateCartProducts(product, simpleProducts, [], false, {}, null, productsKit);
|
|
63
|
+
entity.productsKitGuid = productsKitGuid;
|
|
64
|
+
entity.productsKit = productsKit._id;
|
|
65
|
+
return entity;
|
|
66
|
+
}
|
|
67
|
+
})
|
|
68
|
+
.filter(entity => !!entity);
|
|
69
|
+
return entities;
|
|
70
|
+
}
|
|
71
|
+
};
|
|
72
|
+
|
|
73
|
+
export const actions = {
|
|
74
|
+
async fetchProductsKit({ commit }, { shop, alias, country, currency }) {
|
|
75
|
+
try {
|
|
76
|
+
commit('setLoadError', null);
|
|
77
|
+
const query = { country, currency };
|
|
78
|
+
const productsKit = await api.fetchProductsKit(shop, alias, query);
|
|
79
|
+
commit('setProductsKit', productsKit);
|
|
80
|
+
} catch (e) {
|
|
81
|
+
const { status, data } = e?.response || {};
|
|
82
|
+
const statusCode = status || 500;
|
|
83
|
+
commit('setLoadError', {
|
|
84
|
+
statusCode,
|
|
85
|
+
message: data?.error || 'Products Kit not found',
|
|
86
|
+
redirectLink: data?.redirectLink || null
|
|
87
|
+
});
|
|
88
|
+
}
|
|
89
|
+
},
|
|
90
|
+
async selectOptionProduct({ commit }, { option, product, country, currency, stockCountry }) {
|
|
91
|
+
const params = { country, currency, stockCountry };
|
|
92
|
+
const simpleProducts = await api.fetchProductDetails(null, product.alias, params);
|
|
93
|
+
|
|
94
|
+
commit('setSelectedOptionProduct', { option, product });
|
|
95
|
+
commit('setSelectedOptionSimpleProducts', { option, simpleProducts });
|
|
96
|
+
commit('setSelectedOptionColor', { option, color: null });
|
|
97
|
+
commit('setSelectedOptionSize', { option, size: null });
|
|
98
|
+
},
|
|
99
|
+
selectOptionColor({ commit }, { option, color }) {
|
|
100
|
+
commit('setSelectedOptionColor', { option, color });
|
|
101
|
+
},
|
|
102
|
+
selectOptionSize({ commit }, { option, size }) {
|
|
103
|
+
commit('setSelectedOptionSize', { option, size });
|
|
104
|
+
},
|
|
105
|
+
clearOptions({ commit, state }) {
|
|
106
|
+
const { productsKit } = state;
|
|
107
|
+
productsKit.options?.forEach(option => {
|
|
108
|
+
commit('clearOption', option);
|
|
109
|
+
});
|
|
110
|
+
},
|
|
111
|
+
clearOption({ commit }, { option }) {
|
|
112
|
+
commit('clearOption', option);
|
|
113
|
+
},
|
|
114
|
+
clearProductsKitPricing({ commit }) {
|
|
115
|
+
commit('setProductsKitPricing', null);
|
|
116
|
+
},
|
|
117
|
+
async calculateProductsKitPrice({ state, commit }, { shop, country, currency }) {
|
|
118
|
+
commit('setCalculatingPrice', true);
|
|
119
|
+
const { amount, selectedOptionsProducts, productsKit, selectedOptionsSimpleProducts, selectedOptionsColors, selectedOptionsSizes } = state;
|
|
120
|
+
const entities = productsKit.options
|
|
121
|
+
.map(option => {
|
|
122
|
+
const product = selectedOptionsProducts[option._id];
|
|
123
|
+
if (product) {
|
|
124
|
+
const selectedSimpleProducts = getSelectedSimpleProducts(selectedOptionsSimpleProducts, selectedOptionsColors, selectedOptionsSizes, option._id);
|
|
125
|
+
const simpleProducts = selectedSimpleProducts.map(sp => ({ ...sp, amount }));
|
|
126
|
+
const [entity] = getProductsForCalculatePricing(product, simpleProducts);
|
|
127
|
+
return entity;
|
|
128
|
+
}
|
|
129
|
+
})
|
|
130
|
+
.filter(entity => !!entity);
|
|
131
|
+
const response = await api.calculateProductPrice({ entities, country: country?._id, currency: currency?._id }, shop._id);
|
|
132
|
+
commit('setProductsKitPricing', response);
|
|
133
|
+
commit('setCalculatingPrice', false);
|
|
134
|
+
},
|
|
135
|
+
updateAmount({ getters, commit }, amount) {
|
|
136
|
+
const value = Math.min(getters.maxOrderQty, Math.max(amount, 1));
|
|
137
|
+
commit('setAmount', value);
|
|
138
|
+
}
|
|
139
|
+
};
|
|
140
|
+
|
|
141
|
+
export const mutations = {
|
|
142
|
+
setProductsKit(state, productsKit) {
|
|
143
|
+
state.productsKit = productsKit;
|
|
144
|
+
},
|
|
145
|
+
clearOption(state, option) {
|
|
146
|
+
Vue.set(state.selectedOptionsProducts, option._id, null);
|
|
147
|
+
Vue.set(state.selectedOptionsColors, option._id, null);
|
|
148
|
+
Vue.set(state.selectedOptionsSizes, option._id, null);
|
|
149
|
+
Vue.set(state.selectedOptionsSimpleProducts, option._id, []);
|
|
150
|
+
},
|
|
151
|
+
setSelectedOptionProduct(state, { option, product }) {
|
|
152
|
+
Vue.set(state.selectedOptionsProducts, option._id, product);
|
|
153
|
+
},
|
|
154
|
+
setSelectedOptionColor(state, { option, color }) {
|
|
155
|
+
Vue.set(state.selectedOptionsColors, option._id, color);
|
|
156
|
+
},
|
|
157
|
+
setSelectedOptionSize(state, { option, size }) {
|
|
158
|
+
Vue.set(state.selectedOptionsSizes, option._id, size);
|
|
159
|
+
},
|
|
160
|
+
setSelectedOptionSimpleProducts(state, { option, simpleProducts }) {
|
|
161
|
+
Vue.set(state.selectedOptionsSimpleProducts, option._id, simpleProducts);
|
|
162
|
+
},
|
|
163
|
+
setLoadError(state, error) {
|
|
164
|
+
state.loadError = error;
|
|
165
|
+
},
|
|
166
|
+
setProductsKitPricing(state, price) {
|
|
167
|
+
state.productsKitPricing = price;
|
|
168
|
+
},
|
|
169
|
+
setCalculatingPrice(state, calculatingPrice) {
|
|
170
|
+
state.calculatingPrice = calculatingPrice;
|
|
171
|
+
},
|
|
172
|
+
setAmount(state, amount) {
|
|
173
|
+
state.amount = amount;
|
|
174
|
+
}
|
|
175
|
+
};
|