@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.
Files changed (46) 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/server-middleware/robots.js +2 -1
  45. package/store/cart.js +1 -1
  46. 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
+ };